- 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:
parent
34103b3cac
commit
fb583bd228
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=287094
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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. */
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user