]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Fix ip-transparent for tcp on freebsd.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 16 Mar 2016 08:13:25 +0000 (08:13 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 16 Mar 2016 08:13:25 +0000 (08:13 +0000)
git-svn-id: file:///svn/unbound/trunk@3676 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
services/listen_dnsport.c

index 83401e3fab5d2be7d11d8af65dfac2701455dda9..a1a5aef9ccedceb8e52b82a3e1d40904da2a5946 100644 (file)
@@ -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
index 0aa3a3c982a572a9c481829a1edaef04c9a10805..d5e2e748b4a5abd124d87d6960b6b5d74c079985 100644 (file)
@@ -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 */