created in the RA, remove the stale marking.
Addresses marked stale won't be re-added so will naturally expire.
TAILQ_REMOVE(addrs, ap, next);
free(ap);
}
- } else if (!IN6_IS_ADDR_UNSPECIFIED(&ap->addr)) {
+ } else if (!(ap->flags & IPV6_AF_STALE) &&
+ !IN6_IS_ADDR_UNSPECIFIED(&ap->addr))
+ {
apf = ipv6_findaddr(ap->iface->ctx,
&ap->addr, IPV6_AF_ADDED);
if (apf && apf->iface != ap->iface) {
if (rap->lifetime)
rap->expired = 0;
+ TAILQ_FOREACH(ap, &rap->addrs, next) {
+ ap->flags |= IPV6_AF_STALE;
+ }
+
len -= sizeof(struct nd_router_advert);
p = ((uint8_t *)icp) + sizeof(struct nd_router_advert);
lifetime = ~0U;
}
ap->dadcallback = ipv6nd_dadcallback;
TAILQ_INSERT_TAIL(&rap->addrs, ap, next);
- }
+ } else
+ ap->flags &= ~IPV6_AF_STALE;
if (pi->nd_opt_pi_flags_reserved &
ND_OPT_PI_FLAG_ONLINK)
ap->flags |= IPV6_AF_ONLINK;