]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Check for SENDSRCADDR socket option.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 16 Mar 2010 15:11:58 +0000 (15:11 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 16 Mar 2010 15:11:58 +0000 (15:11 +0000)
git-svn-id: file:///svn/unbound/trunk@2041 be551aaa-1e26-0410-a405-d3ace91eadb9

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

index a8722124f8718d8feb7a4ed0d27caeaa10a0e691..99e31d8f35fd28b2e5a3711dedceaef677ea0f79 100644 (file)
@@ -1,6 +1,7 @@
 16 March 2010: Wouter
        - Fix interface-automatic for OpenBSD: msg.controllen was too small,
          also assertions on ancillary data buffer.
+       - check for IP_SENDSRCADDR for interface-automatic or IP_PKTINFO.
 
 15 March 2010: Wouter
        - unit test for util/regional.c.
index 54be19d7433d881c7089c1ad3205ad832aeb9fcb..adc1c63595baae95abbf714a1b3bdc1309f7452a 100644 (file)
@@ -490,7 +490,7 @@ port_insert(struct listen_port** list, int s, enum listen_type ftype)
 static int
 set_recvpktinfo(int s, int family) 
 {
-#if defined(IPV6_RECVPKTINFO) || defined(IPV6_PKTINFO) || defined(IP_RECVDSTADDR) || defined(IP_PKTINFO)
+#if defined(IPV6_RECVPKTINFO) || defined(IPV6_PKTINFO) || (defined(IP_RECVDSTADDR) && defined(IP_SENDSRCADDR)) || defined(IP_PKTINFO)
        int on = 1;
 #else
        (void)s;
@@ -517,22 +517,22 @@ set_recvpktinfo(int s, int family)
 #           endif /* defined IPV6_RECVPKTINFO */
 
        } else if(family == AF_INET) {
-#           ifdef IP_RECVDSTADDR
-               if(setsockopt(s, IPPROTO_IP, IP_RECVDSTADDR,
+#           ifdef IP_PKTINFO
+               if(setsockopt(s, IPPROTO_IP, IP_PKTINFO,
                        (void*)&on, (socklen_t)sizeof(on)) < 0) {
-                       log_err("setsockopt(..., IP_RECVDSTADDR, ...) failed: %s",
+                       log_err("setsockopt(..., IP_PKTINFO, ...) failed: %s",
                                strerror(errno));
                        return 0;
                }
-#           elif defined(IP_PKTINFO)
-               if(setsockopt(s, IPPROTO_IP, IP_PKTINFO,
+#           elif defined(IP_RECVDSTADDR) && defined(IP_SENDSRCADDR)
+               if(setsockopt(s, IPPROTO_IP, IP_RECVDSTADDR,
                        (void*)&on, (socklen_t)sizeof(on)) < 0) {
-                       log_err("setsockopt(..., IP_PKTINFO, ...) failed: %s",
+                       log_err("setsockopt(..., IP_RECVDSTADDR, ...) failed: %s",
                                strerror(errno));
                        return 0;
                }
 #           else
-               log_err("no IP_RECVDSTADDR or IP_PKTINFO option, please disable "
+               log_err("no IP_SENDSRCADDR or IP_PKTINFO option, please disable "
                        "interface-automatic in config");
                return 0;
 #           endif /* IP_PKTINFO */
index fcc83b62a643fb32a3a85a10f05bb6a11ac442ed..abdd07ee204589922729e0b0f02e4f6176454921 100644 (file)
@@ -380,15 +380,7 @@ comm_point_send_udp_msg_if(struct comm_point *c, ldns_buffer* packet,
 #ifndef S_SPLINT_S
        cmsg = CMSG_FIRSTHDR(&msg);
        if(r->srctype == 4) {
-#ifdef IP_RECVDSTADDR
-               msg.msg_controllen = CMSG_SPACE(sizeof(struct in_addr));
-               log_assert(msg.msg_controllen <= sizeof(control));
-               cmsg->cmsg_level = IPPROTO_IP;
-               cmsg->cmsg_type = IP_RECVDSTADDR;
-               memmove(CMSG_DATA(cmsg), &r->pktinfo.v4addr,
-                       sizeof(struct in_addr));
-               cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
-#elif defined(IP_PKTINFO)
+#ifdef IP_PKTINFO
                msg.msg_controllen = CMSG_SPACE(sizeof(struct in_pktinfo));
                log_assert(msg.msg_controllen <= sizeof(control));
                cmsg->cmsg_level = IPPROTO_IP;
@@ -396,6 +388,17 @@ comm_point_send_udp_msg_if(struct comm_point *c, ldns_buffer* packet,
                memmove(CMSG_DATA(cmsg), &r->pktinfo.v4info,
                        sizeof(struct in_pktinfo));
                cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
+#elif defined(IP_SENDSRCADDR)
+               msg.msg_controllen = CMSG_SPACE(sizeof(struct in_addr));
+               log_assert(msg.msg_controllen <= sizeof(control));
+               cmsg->cmsg_level = IPPROTO_IP;
+               cmsg->cmsg_type = IP_SENDSRCADDR;
+               memmove(CMSG_DATA(cmsg), &r->pktinfo.v4addr,
+                       sizeof(struct in_addr));
+               cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
+#else
+               verbose(VERB_ALGO, "no IP_PKTINFO or IP_SENDSRCADDR");
+               msg.msg_control = NULL;
 #endif
        } else if(r->srctype == 6) {
                msg.msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo));
@@ -497,20 +500,20 @@ comm_point_udp_ancil_callback(int fd, short event, void* arg)
                                memmove(&rep.pktinfo.v6info, CMSG_DATA(cmsg),
                                        sizeof(struct in6_pktinfo));
                                break;
-#ifdef IP_RECVDSTADDR
-                       } else if( cmsg->cmsg_level == IPPROTO_IP &&
-                               cmsg->cmsg_type == IP_RECVDSTADDR) {
-                               rep.srctype = 4;
-                               memmove(&rep.pktinfo.v4addr, CMSG_DATA(cmsg),
-                                       sizeof(struct in_addr));
-                               break;
-#elif defined(IP_PKTINFO)
+#ifdef IP_PKTINFO
                        } else if( cmsg->cmsg_level == IPPROTO_IP &&
                                cmsg->cmsg_type == IP_PKTINFO) {
                                rep.srctype = 4;
                                memmove(&rep.pktinfo.v4info, CMSG_DATA(cmsg),
                                        sizeof(struct in_pktinfo));
                                break;
+#elif defined(IP_RECVDSTADDR)
+                       } else if( cmsg->cmsg_level == IPPROTO_IP &&
+                               cmsg->cmsg_type == IP_RECVDSTADDR) {
+                               rep.srctype = 4;
+                               memmove(&rep.pktinfo.v4addr, CMSG_DATA(cmsg),
+                                       sizeof(struct in_addr));
+                               break;
 #endif
                        }
                }