Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 24 Aug 2015 05:21:50 +0000 (UTC)
From:      Hiroki Sato <hrs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r287094 - head/sys/netinet6
Message-ID:  <201508240521.t7O5Lot8027387@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201508240521.t7O5Lot8027387>