summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2016-05-26 08:54:45 +0000
committerRoy Marples <roy@marples.name>2016-05-26 08:54:45 +0000
commita2af95d72dea4ee7d5369c210247efae98aca05f (patch)
tree53cba6265404c51c529179c4174968e5d0e5da6d
parent494b6a5321e9389d80c7f46bf10ae6b5bc3e95b3 (diff)
downloaddhcpcd-a2af95d72dea4ee7d5369c210247efae98aca05f.tar.xz
Don't drop DHCPv6 if we have a delegated address on router expiry.
-rw-r--r--dhcp6.c16
-rw-r--r--dhcp6.h1
-rw-r--r--ipv6nd.c13
3 files changed, 18 insertions, 12 deletions
diff --git a/dhcp6.c b/dhcp6.c
index 6beb7d86..aa6d3ce4 100644
--- a/dhcp6.c
+++ b/dhcp6.c
@@ -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)
diff --git a/dhcp6.h b/dhcp6.h
index 3d4b8b7b..3287bbaf 100644
--- a/dhcp6.h
+++ b/dhcp6.h
@@ -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) {}
diff --git a/ipv6nd.c b/ipv6nd.c
index 597be951..b0b65629 100644
--- a/ipv6nd.c
+++ b/ipv6nd.c
@@ -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