]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
ND: Only deprecate prefixes when all stale
authorRoy Marples <roy@marples.name>
Tue, 31 Mar 2020 21:00:52 +0000 (22:00 +0100)
committerRoy Marples <roy@marples.name>
Tue, 31 Mar 2020 21:00:52 +0000 (22:00 +0100)
src/ipv6nd.c

index 21a35889e52b3d6b2ce85afb5ed6027747008f0e..ca5f4335636911b530cfd33ff2c3ac8e0e113487 100644 (file)
@@ -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;
        }