diff options
| author | Roy Marples <roy@marples.name> | 2016-05-26 08:54:45 +0000 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2016-05-26 08:54:45 +0000 |
| commit | a2af95d72dea4ee7d5369c210247efae98aca05f (patch) | |
| tree | 53cba6265404c51c529179c4174968e5d0e5da6d | |
| parent | 494b6a5321e9389d80c7f46bf10ae6b5bc3e95b3 (diff) | |
| download | dhcpcd-a2af95d72dea4ee7d5369c210247efae98aca05f.tar.xz | |
Don't drop DHCPv6 if we have a delegated address on router expiry.
| -rw-r--r-- | dhcp6.c | 16 | ||||
| -rw-r--r-- | dhcp6.h | 1 | ||||
| -rw-r--r-- | ipv6nd.c | 13 |
3 files changed, 18 insertions, 12 deletions
@@ -2520,7 +2520,7 @@ dhcp6_delegate_prefix(struct interface *ifp) if (k && !carrier_warned) { ifd_state = D6_STATE(ifd); ipv6_addaddrs(&ifd_state->addrs); - if_initrt(ifd->ctx); + if_initrt6(ifd->ctx); ipv6_buildroutes(ifd->ctx); dhcp6_script_try_run(ifd, 1); } @@ -3424,6 +3424,20 @@ dhcp6_free(struct interface *ifp) dhcp6_freedrop(ifp, 0, NULL); } +void dhcp6_dropnondelegates(struct interface *ifp) +{ + struct dhcp6_state *state; + struct ipv6_addr *ia; + + if ((state = D6_STATE(ifp)) == NULL) + return; + TAILQ_FOREACH(ia, &state->addrs, next) { + if (ia->flags & (IPV6_AF_DELEGATED | IPV6_AF_DELEGATEDPFX)) + return; + } + dhcp6_drop(ifp, "EXPIRE6"); +} + void dhcp6_handleifa(struct dhcpcd_ctx *ctx, int cmd, const char *ifname, const struct in6_addr *addr, int flags) @@ -248,6 +248,7 @@ void dhcp6_handleifa(struct dhcpcd_ctx *, int, const char *, const struct in6_addr *addr, int); int dhcp6_dadcompleted(const struct interface *); void dhcp6_drop(struct interface *, const char *); +void dhcp6_dropnondelegates(struct interface *ifp); int dhcp6_dump(struct interface *); #else #define dhcp6_find_delegates(a) {} @@ -255,15 +255,6 @@ ipv6nd_makersprobe(struct interface *ifp) return 0; } -static void ipv6nd_dropdhcp6(struct interface *ifp) -{ - const struct dhcp6_state *d6; - - /* Don't drop DHCP6 if the interface is delegated to. */ - if ((d6 = D6_CSTATE(ifp)) != NULL && d6->state != DH6S_DELEGATED) - dhcp6_drop(ifp, "EXPIRE6"); -} - static void ipv6nd_sendrsprobe(void *arg) { @@ -327,7 +318,7 @@ ipv6nd_sendrsprobe(void *arg) logger(ifp->ctx, LOG_WARNING, "%s: no IPv6 Routers available", ifp->name); ipv6nd_drop(ifp); - ipv6nd_dropdhcp6(ifp); + dhcp6_dropnondelegates(ifp); } } @@ -1392,7 +1383,7 @@ ipv6nd_expirera(void *arg) /* No valid routers? Kill any DHCPv6. */ if (!validone) - ipv6nd_dropdhcp6(ifp); + dhcp6_dropnondelegates(ifp); } void |
