]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- make ip-transparent option work on OpenBSD.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 2 Nov 2017 09:34:19 +0000 (09:34 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 2 Nov 2017 09:34:19 +0000 (09:34 +0000)
git-svn-id: file:///svn/unbound/trunk@4393 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
doc/unbound.conf.5.in
services/listen_dnsport.c

index bf880705a4cbaf334359b87e2d4fe7785278282c..14f535804724442c5f8c5ddafb8a944e2e052397 100644 (file)
@@ -1,5 +1,6 @@
 2 November 2017: Wouter 
        - Fix #1913: ub_ctx_config is under circumstances thread-safe.
+       - make ip-transparent option work on OpenBSD.
 
 31 October 2017: Wouter 
        - Document that errno is left informative on libunbound config read
index 36f60ad18f826cd5931e41107e1e12567fb55767..4088c77e547399b1dc4aaa4896e0ceb38dac5308 100644 (file)
@@ -293,7 +293,8 @@ are going to exist later on, with host failover configuration.  This is
 a lot like interface\-automatic, but that one services all interfaces
 and with this option you can select which (future) interfaces unbound
 provides service on.  This option needs unbound to be started with root
-permissions on some systems.  The option uses IP_BINDANY on FreeBSD systems.
+permissions on some systems.  The option uses IP_BINDANY on FreeBSD systems
+and SO_BINDANY on OpenBSD systems.
 .TP
 .B ip\-freebind: \fI<yes or no>
 If yes, then use IP_FREEBIND socket option on sockets where unbound
index 3b53676d0e06eaddb1421b4fa7ef97aa5a687e17..d099ca9449b74a09e34a212ebbbc375867159e6d 100644 (file)
@@ -167,7 +167,7 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
        int freebind, int use_systemd)
 {
        int s;
-#if defined(SO_REUSEADDR) || defined(SO_REUSEPORT) || defined(IPV6_USE_MIN_MTU)  || defined(IP_TRANSPARENT) || defined(IP_BINDANY) || defined(IP_FREEBIND)
+#if defined(SO_REUSEADDR) || defined(SO_REUSEPORT) || defined(IPV6_USE_MIN_MTU)  || defined(IP_TRANSPARENT) || defined(IP_BINDANY) || defined(IP_FREEBIND) || defined (SO_BINDANY)
        int on=1;
 #endif
 #ifdef IPV6_MTU
@@ -182,7 +182,7 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
 #ifndef IPV6_V6ONLY
        (void)v6only;
 #endif
-#if !defined(IP_TRANSPARENT) && !defined(IP_BINDANY)
+#if !defined(IP_TRANSPARENT) && !defined(IP_BINDANY) && !defined(SO_BINDANY)
        (void)transparent;
 #endif
 #if !defined(IP_FREEBIND)
@@ -281,7 +281,14 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
                        log_warn("setsockopt(.. IP%s_BINDANY ..) failed: %s",
                        (family==AF_INET6?"V6":""), strerror(errno));
                }
-#endif /* IP_TRANSPARENT || IP_BINDANY */
+#elif defined(SO_BINDANY)
+               if (transparent &&
+                   setsockopt(s, SOL_SOCKET, SO_BINDANY, (void*)&on,
+                   (socklen_t)sizeof(on)) < 0) {
+                       log_warn("setsockopt(.. SO_BINDANY ..) failed: %s",
+                       strerror(errno));
+               }
+#endif /* IP_TRANSPARENT || IP_BINDANY || SO_BINDANY */
        }
 #ifdef IP_FREEBIND
        if(freebind &&
@@ -592,7 +599,7 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
        int* reuseport, int transparent, int mss, int freebind, int use_systemd)
 {
        int s;
-#if defined(SO_REUSEADDR) || defined(SO_REUSEPORT) || defined(IPV6_V6ONLY) || defined(IP_TRANSPARENT) || defined(IP_BINDANY) || defined(IP_FREEBIND)
+#if defined(SO_REUSEADDR) || defined(SO_REUSEPORT) || defined(IPV6_V6ONLY) || defined(IP_TRANSPARENT) || defined(IP_BINDANY) || defined(IP_FREEBIND) || defined(SO_BINDANY)
        int on = 1;
 #endif
 #ifdef HAVE_SYSTEMD
@@ -601,7 +608,7 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
 #ifdef USE_TCP_FASTOPEN
        int qlen;
 #endif
-#if !defined(IP_TRANSPARENT) && !defined(IP_BINDANY)
+#if !defined(IP_TRANSPARENT) && !defined(IP_BINDANY) && !defined(SO_BINDANY)
        (void)transparent;
 #endif
 #if !defined(IP_FREEBIND)
@@ -736,7 +743,14 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
                log_warn("setsockopt(.. IP%s_BINDANY ..) failed: %s",
                (addr->ai_family==AF_INET6?"V6":""), strerror(errno));
        }
-#endif /* IP_TRANSPARENT || IP_BINDANY */
+#elif defined(SO_BINDANY)
+       if (transparent &&
+           setsockopt(s, SOL_SOCKET, SO_BINDANY, (void*)&on, (socklen_t)
+           sizeof(on)) < 0) {
+               log_warn("setsockopt(.. SO_BINDANY ..) failed: %s",
+               strerror(errno));
+       }
+#endif /* IP_TRANSPARENT || IP_BINDANY || SO_BINDANY */
        if(
 #ifdef HAVE_SYSTEMD
                !got_fd_from_systemd &&