- 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.
This commit is contained in:
Hiroki Sato 2015-08-24 05:21:49 +00:00
parent 34103b3cac
commit fb583bd228
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=287094
4 changed files with 17 additions and 20 deletions

View File

@ -1243,13 +1243,8 @@ in6_broadcast_ifa(struct ifnet *ifp, struct in6_aliasreq *ifra,
}
}
/*
* 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, struct ifnet *ifp)
}
/*
* 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);
}

View File

@ -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;

View File

@ -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. */

View File

@ -574,7 +574,7 @@ nd6_ns_output_fib(struct ifnet *ifp, const struct in6_addr *daddr6,
/*
* 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 delay)
}
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);