]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
BSD fix for ip4.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 18 Jan 2008 09:09:55 +0000 (09:09 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 18 Jan 2008 09:09:55 +0000 (09:09 +0000)
git-svn-id: file:///svn/unbound/trunk@875 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
services/listen_dnsport.c
util/netevent.c

index 8a338e5067ea94688b0235a5684d927eaa403214..290eb49785a8daab651a1bf32492e14a8bc798a3 100644 (file)
@@ -1,6 +1,8 @@
 18 January 2008: Wouter
        - touch up of manpage for libunbound.
        - support for IP_RECVDSTADDR (for *BSD ip4).
+       - fix for BSD, do not use ip4to6 mapping, make two sockets, once
+         ip6 and once ip4, uses socket options.
 
 17 January 2008: Wouter
        - fixup configure in case -lldns is installed.
index 22e3dad8f692a86a99b441678b63f5957822b168..6eb8eb8d6cb26d6d8417691d0f6ffd372578bb87 100644 (file)
@@ -239,48 +239,54 @@ port_insert(struct listen_port** list, int s, enum listen_type ftype)
        return 1;
 }
 
-/** set IPV6_RECVPKTINFO on fd */
+/** set fd to receive source address packet info */
 static int
-set_ip6_recvpktinfo(int s
+set_recvpktinfo(int s, int family
 {
        int on = 1;
-#ifdef IPV6_RECVPKTINFO
-       if(setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO,
-               &on, (socklen_t)sizeof(on)) < 0) {
-               log_err("setsockopt(..., IPV6_RECVPKTINFO, ...) failed: %s",
-                       strerror(errno));
+       if(family == AF_INET6) {
+#           ifdef IPV6_RECVPKTINFO
+               if(setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO,
+                       &on, (socklen_t)sizeof(on)) < 0) {
+                       log_err("setsockopt(..., IPV6_RECVPKTINFO, ...) failed: %s",
+                               strerror(errno));
+                       return 0;
+               }
+#           elif defined(IPV6_PKTINFO)
+               if(setsockopt(s, IPPROTO_IPV6, IPV6_PKTINFO,
+                       &on, (socklen_t)sizeof(on)) < 0) {
+                       log_err("setsockopt(..., IPV6_PKTINFO, ...) failed: %s",
+                               strerror(errno));
+                       return 0;
+               }
+#           else
+               log_err("no IPV6_RECVPKTINFO and no IPV6_PKTINFO option, please "
+                       "disable interface-automatic in config");
                return 0;
-       }
-#elif defined(IPV6_PKTINFO)
-       if(setsockopt(s, IPPROTO_IPV6, IPV6_PKTINFO,
-               &on, (socklen_t)sizeof(on)) < 0) {
-               log_err("setsockopt(..., IPV6_PKTINFO, ...) failed: %s",
-                       strerror(errno));
+#           endif /* defined IPV6_RECVPKTINFO */
+
+       } else if(family == AF_INET) {
+#           ifdef IP_RECVDSTADDR
+               if(setsockopt(s, IPPROTO_IP, IP_RECVDSTADDR,
+                       &on, (socklen_t)sizeof(on)) < 0) {
+                       log_err("setsockopt(..., IP_RECVDSTADDR, ...) failed: %s",
+                               strerror(errno));
+                       return 0;
+               }
+#           elif defined(IP_PKTINFO)
+               if(setsockopt(s, IPPROTO_IP, IP_PKTINFO,
+                       &on, (socklen_t)sizeof(on)) < 0) {
+                       log_err("setsockopt(..., IP_PKTINFO, ...) failed: %s",
+                               strerror(errno));
+                       return 0;
+               }
+#           else
+               log_err("no IP_RECVDSTADDR or IP_PKTINFO option, please disable "
+                       "interface-automatic in config");
                return 0;
-       }
-#else
-       log_err("no IPV6_RECVPKTINFO and no IPV6_PKTINFO option, please "
-               "disable interface-automatic in config");
-       return 0;
-#endif /* defined IPV6_RECVPKTINFO */
+#           endif /* IP_PKTINFO */
 
-#ifdef IP_RECVDSTADDR
-       if(setsockopt(s, IPPROTO_IP, IP_RECVDSTADDR,
-               &on, (socklen_t)sizeof(on)) < 0) {
-               log_err("setsockopt(..., IP_RECVDSTADDR, ...) failed: %s",
-                       strerror(errno));
-       }
-#elif defined(IP_PKTINFO)
-       if(setsockopt(s, IPPROTO_IP, IP_PKTINFO,
-               &on, (socklen_t)sizeof(on)) < 0) {
-               log_err("setsockopt(..., IP_PKTINFO, ...) failed: %s",
-                       strerror(errno));
        }
-#else
-       log_err("no IP_RECVDSTADDR or IP_PKTINFO option, please disable "
-               "interface-automatic in config");
-       return 0;
-#endif /* IP_PKTINFO */
        return 1;
 }
 
@@ -305,16 +311,14 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
                return 0;
        if(do_auto) {
                /* skip ip4 sockets, ip4 udp gets mapped to v6 */
-               if(hints->ai_family == AF_INET6) {
-                       if((s = make_sock(SOCK_DGRAM, ifname, port, hints, 2))
-                               == -1)
-                               return 0;
-                       if(!set_ip6_recvpktinfo(s))
-                               return 0;
-                       if(!port_insert(list, s, listen_type_udpancil)) {
-                               close(s);
-                               return 0;
-                       }
+               /* TODO no mapping! */
+               if((s = make_sock(SOCK_DGRAM, ifname, port, hints, 1)) == -1)
+                       return 0;
+               if(!set_recvpktinfo(s, hints->ai_family))
+                       return 0;
+               if(!port_insert(list, s, listen_type_udpancil)) {
+                       close(s);
+                       return 0;
                }
        } else if(do_udp) {
                /* regular udp socket */
index 7f43b7715905f3203b91b7defc88e1371e4722c7..15924fc600d16ff26034921792f6823e759a4f60 100644 (file)
@@ -369,7 +369,7 @@ comm_point_udp_ancil_callback(int fd, short event, void* arg)
                } else if( cmsg->cmsg_level == IPPROTO_IP &&
                        cmsg->cmsg_type == IP_RECVDSTADDR) {
                        rep.srctype = 4;
-                       memmove(&rep.v4addr, CMSG_DATA(cmsg),
+                       memmove(&rep.pktinfo.v4addr, CMSG_DATA(cmsg),
                                sizeof(struct in_addr));
                        break;
 #elif defined(IP_PKTINFO)