Author: hrs
Date: Mon Aug 24 05:21:49 2015
New Revision: 287094
URL: https://svnweb.freebsd.org/changeset/base/287094

Log:
  - Deprecate IN6_IFF_NODAD.  It was used to prevent DAD on a loopback
    interface but in6if_do_dad() already had a check for IFF_LOOPBACK.
  
  - Remove in6if_do_dad() check in in6_broadcast_ifa().  An address
    which needs DAD always has IN6_IFF_TENTATIVE there.
  
  - in6if_do_dad() now returns EAGAIN when the interface is not ready
    since DAD callout handler ignores such an interface.
  
  - In DAD callout handler, mark an address as IN6_IFF_TENTATIVE
    when the interface has ND6_IFF_IFDISABLED.  And Do IFF_UP and
    IFF_DRV_RUNNING check consistently when DAD is required.
  
  - draft-ietf-6man-enhanced-dad is now published as RFC 7527.
  
  - Fix some typos.

Modified:
  head/sys/netinet6/in6.c
  head/sys/netinet6/in6_ifattach.c
  head/sys/netinet6/in6_var.h
  head/sys/netinet6/nd6_nbr.c

Modified: head/sys/netinet6/in6.c
==============================================================================
--- head/sys/netinet6/in6.c     Mon Aug 24 04:49:20 2015        (r287093)
+++ head/sys/netinet6/in6.c     Mon Aug 24 05:21:49 2015        (r287094)
@@ -1243,13 +1243,8 @@ in6_broadcast_ifa(struct ifnet *ifp, str
                }
        }
 
-       /*
-        * Perform DAD, if needed.
-        * XXX It may be of use, if we can administratively disable DAD.
-        */
-       if (in6if_do_dad(ifp) && ((ifra->ifra_flags & IN6_IFF_NODAD) == 0) &&
-           (ia->ia6_flags & IN6_IFF_TENTATIVE))
-       {
+       /* Perform DAD, if the address is TENTATIVE. */
+       if ((ia->ia6_flags & IN6_IFF_TENTATIVE)) {
                int delay, mindelay, maxdelay;
 
                delay = 0;
@@ -1379,8 +1374,8 @@ in6_unlink_ifa(struct in6_ifaddr *ia, st
 }
 
 /*
- * Notifies other other subsystems about address change/arrival:
- * 1) Notifies device handler on first IPv6 address assignment
+ * Notifies other subsystems about address change/arrival:
+ * 1) Notifies device handler on the first IPv6 address assignment
  * 2) Handle routing table changes for P2P links and route
  * 3) Handle routing table changes for address host route
  */
@@ -1957,13 +1952,13 @@ in6if_do_dad(struct ifnet *ifp)
         * However, some interfaces can be up before the RUNNING
         * status.  Additionaly, users may try to assign addresses
         * before the interface becomes up (or running).
-        * We simply skip DAD in such a case as a work around.
-        * XXX: we should rather mark "tentative" on such addresses,
-        * and do DAD after the interface becomes ready.
+        * This function returns EAGAIN in that case.
+        * The caller should mark "tentative" on the address instead of
+        * performing DAD immediately.
         */
        if (!((ifp->if_flags & IFF_UP) &&
            (ifp->if_drv_flags & IFF_DRV_RUNNING)))
-               return (0);
+               return (EAGAIN);
 
        return (1);
 }

Modified: head/sys/netinet6/in6_ifattach.c
==============================================================================
--- head/sys/netinet6/in6_ifattach.c    Mon Aug 24 04:49:20 2015        
(r287093)
+++ head/sys/netinet6/in6_ifattach.c    Mon Aug 24 05:21:49 2015        
(r287094)
@@ -566,9 +566,6 @@ in6_ifattach_loopback(struct ifnet *ifp)
        ifra.ifra_lifetime.ia6t_vltime = ND6_INFINITE_LIFETIME;
        ifra.ifra_lifetime.ia6t_pltime = ND6_INFINITE_LIFETIME;
 
-       /* we don't need to perform DAD on loopback interfaces. */
-       ifra.ifra_flags |= IN6_IFF_NODAD;
-
        /* skip registration to the prefix list. XXX should be temporary. */
        ifra.ifra_flags |= IN6_IFF_NOPFX;
 

Modified: head/sys/netinet6/in6_var.h
==============================================================================
--- head/sys/netinet6/in6_var.h Mon Aug 24 04:49:20 2015        (r287093)
+++ head/sys/netinet6/in6_var.h Mon Aug 24 05:21:49 2015        (r287094)
@@ -494,7 +494,7 @@ struct      in6_rrenumreq {
 #define IN6_IFF_DETACHED       0x08    /* may be detached from the link */
 #define IN6_IFF_DEPRECATED     0x10    /* deprecated address */
 #define IN6_IFF_NODAD          0x20    /* don't perform DAD on this address
-                                        * (used only at first SIOC* call)
+                                        * (obsolete)
                                         */
 #define IN6_IFF_AUTOCONF       0x40    /* autoconfigurable address. */
 #define IN6_IFF_TEMPORARY      0x80    /* temporary (anonymous) address. */

Modified: head/sys/netinet6/nd6_nbr.c
==============================================================================
--- head/sys/netinet6/nd6_nbr.c Mon Aug 24 04:49:20 2015        (r287093)
+++ head/sys/netinet6/nd6_nbr.c Mon Aug 24 05:21:49 2015        (r287094)
@@ -574,7 +574,7 @@ nd6_ns_output_fib(struct ifnet *ifp, con
        /*
         * Add a Nonce option (RFC 3971) to detect looped back NS messages.
         * This behavior is documented as Enhanced Duplicate Address
-        * Detection in draft-ietf-6man-enhanced-dad-13.
+        * Detection in RFC 7527.
         * net.inet6.ip6.dad_enhanced=0 disables this.
         */
        if (V_dad_enhanced != 0 && nonce != NULL) {
@@ -1302,11 +1302,16 @@ nd6_dad_start(struct ifaddr *ifa, int de
        }
        if (ifa->ifa_ifp == NULL)
                panic("nd6_dad_start: ifa->ifa_ifp == NULL");
-       if (!(ifa->ifa_ifp->if_flags & IFF_UP)) {
+       if (ND_IFINFO(ifa->ifa_ifp)->flags & ND6_IFF_NO_DAD) {
+               ia->ia6_flags &= ~IN6_IFF_TENTATIVE;
                return;
        }
-       if (ND_IFINFO(ifa->ifa_ifp)->flags & ND6_IFF_IFDISABLED)
+       if (!(ifa->ifa_ifp->if_flags & IFF_UP) ||
+           !(ifa->ifa_ifp->if_drv_flags & IFF_DRV_RUNNING) ||
+           (ND_IFINFO(ifa->ifa_ifp)->flags & ND6_IFF_IFDISABLED)) {
+               ia->ia6_flags |= IN6_IFF_TENTATIVE;
                return;
+       }
        if ((dp = nd6_dad_find(ifa, NULL)) != NULL) {
                /* DAD already in progress */
                nd6_dad_rele(dp);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to