From 1ce7fded6141a366cfa7b1967c70baf1ac8e0eb4 Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Wed, 16 Mar 2016 08:13:25 +0000 Subject: [PATCH] - Fix ip-transparent for tcp on freebsd. git-svn-id: file:///svn/unbound/trunk@3676 be551aaa-1e26-0410-a405-d3ace91eadb9 --- doc/Changelog | 1 + services/listen_dnsport.c | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/doc/Changelog b/doc/Changelog index 83401e3fa..a1a5aef9c 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,5 +1,6 @@ 16 March 2016: Wouter - Fix ip-transparent for ipv6 on FreeBSD. + - Fix ip-transparent for tcp on freebsd. 15 March 2016: Wouter - ip_freebind: yesno option in unbound.conf sets IP_FREEBIND for diff --git a/services/listen_dnsport.c b/services/listen_dnsport.c index 0aa3a3c98..d5e2e748b 100644 --- a/services/listen_dnsport.c +++ b/services/listen_dnsport.c @@ -506,10 +506,10 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto, int* reuseport, int transparent, int mss, int freebind) { int s; -#if defined(SO_REUSEADDR) || defined(SO_REUSEPORT) || defined(IPV6_V6ONLY) || defined(IP_TRANSPARENT) || defined(IP_FREEBIND) +#if defined(SO_REUSEADDR) || defined(SO_REUSEPORT) || defined(IPV6_V6ONLY) || defined(IP_TRANSPARENT) || defined(IP_BINDANY) || defined(IP_FREEBIND) int on = 1; #endif -#ifndef IP_TRANSPARENT +#if !defined(IP_TRANSPARENT) && !defined(IP_BINDANY) (void)transparent; #endif #if !defined(IP_FREEBIND) @@ -622,7 +622,15 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto, log_warn("setsockopt(.. IP_TRANSPARENT ..) failed: %s", strerror(errno)); } -#endif /* IP_TRANSPARENT */ +#elif defined(IP_BINDANY) + if (transparent && + setsockopt(s, (family==AF_INET6? IPPROTO_IPV6:IPPROTO_IP), + (family == AF_INET6? IPV6_BINDANY:IP_BINDANY), + (void*)&on, (socklen_t)sizeof(on)) < 0) { + log_warn("setsockopt(.. IP%s_BINDANY ..) failed: %s", + (family==AF_INET6?"V6":""), strerror(errno)); + } +#endif /* IP_TRANSPARENT || IP_BINDANY */ if(bind(s, addr->ai_addr, addr->ai_addrlen) != 0) { #ifndef USE_WINSOCK /* detect freebsd jail with no ipv6 permission */