From: Roy Marples Date: Tue, 31 Mar 2020 21:00:52 +0000 (+0100) Subject: ND: Only deprecate prefixes when all stale X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=93df4147ea44a8b6adb439dff48c5647e5ffb9d0;p=thirdparty%2Fdhcpcd.git ND: Only deprecate prefixes when all stale --- diff --git a/src/ipv6nd.c b/src/ipv6nd.c index 21a35889..ca5f4335 100644 --- a/src/ipv6nd.c +++ b/src/ipv6nd.c @@ -1010,9 +1010,9 @@ ipv6nd_handlera(struct dhcpcd_ctx *ctx, struct nd_opt_mtu mtu; struct nd_opt_rdnss rdnss; uint8_t *p; - struct ra *rap; + struct ra *rap, *rap2; struct in6_addr pi_prefix; - struct ipv6_addr *ia; + struct ipv6_addr *ia, *ia2; struct dhcp_opt *dho; bool new_rap, new_data, has_address; uint32_t old_lifetime; @@ -1362,6 +1362,21 @@ ipv6nd_handlera(struct dhcpcd_ctx *ctx, TAILQ_FOREACH(ia, &rap->addrs, next) { if (!(ia->flags & IPV6_AF_STALE) || ia->prefix_pltime == 0) continue; + TAILQ_FOREACH(rap2, ctx->ra_routers, next) { + if (rap2->expired) + continue; + TAILQ_FOREACH(ia2, &rap2->addrs, next) { + if (IN6_ARE_ADDR_EQUAL(&ia->prefix, + &ia2->prefix) && + ia->prefix_pltime != 0 && + ia->prefix_vltime != 0) + break; + } + if (ia2 != NULL) + break; + } + if (rap2 != NULL && ia2 != NULL) + continue; logdebugx("%s: %s: became stale", ifp->name, ia->saddr); ia->prefix_pltime = 0; }