inet6: Accept non-neighbor NA if nd6_onlink_ns_rfc4861 is off.
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 10 Aug 2015 13:34:20 +0000 (21:34 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Wed, 12 Aug 2015 01:48:06 +0000 (09:48 +0800)
Reported-by: Markus Pfeiffer
sys/netinet6/in6_proto.c
sys/netinet6/nd6_nbr.c

index 531d407..608e869 100644 (file)
@@ -412,7 +412,8 @@ DOMAIN_SET(inet6);
 #ifndef        IPV6_SENDREDIRECTS
 #define        IPV6_SENDREDIRECTS      1
 #endif
-int    nd6_onlink_ns_rfc4861 = 0; /* allow 'on-link' nd6 NS (as in RFC 4861) */
+
+int    nd6_onlink_ns_rfc4861 = 0; /* allow 'on-link' NS/NA (as in RFC 4861) */
 
 int    ip6_forwarding = IPV6FORWARDING;        /* act as router? */
 int    ip6_sendredirects = IPV6_SENDREDIRECTS;
@@ -596,4 +597,4 @@ SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_MAXNUDHINT, nd6_maxnudhint, CTLFLAG_R
 SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_DEBUG, nd6_debug, CTLFLAG_RW,
     &nd6_debug, 0, "Enable debug output");
 SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_ONLINKNSRFC4861, nd6_onlink_ns_rfc4861, CTLFLAG_RW,
-    &nd6_onlink_ns_rfc4861, 0, "Accept 'on-link' nd6 NS in compliance with RFC 4861.");
+    &nd6_onlink_ns_rfc4861, 0, "Accept 'on-link' NS/NA in compliance with RFC 4861.");
index 09c0211..78aaaee 100644 (file)
@@ -679,13 +679,15 @@ nd6_na_input(struct mbuf *m, int off, int icmp6len)
                goto freeit;
        }
 
-       /*
-        * Make sure the source address is from a neighbor's address.
-        */
-       if (in6ifa_ifplocaladdr(ifp, &saddr6) == NULL) {
-               nd6log((LOG_INFO, "nd6_na_input: "
-                   "NA packet from non-neighbor\n"));
-               goto bad;
+       if (!nd6_onlink_ns_rfc4861) {
+               /*
+                * Make sure the source address is from a neighbor's address.
+                */
+               if (in6ifa_ifplocaladdr(ifp, &saddr6) == NULL) {
+                       nd6log((LOG_INFO, "nd6_na_input: "
+                           "NA packet from non-neighbor\n"));
+                       goto bad;
+               }
        }
 
        if (lladdr && ((ifp->if_addrlen + 2 + 7) & ~7) != lladdrlen) {