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);
}
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)
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) {}
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)
{
logger(ifp->ctx, LOG_WARNING,
"%s: no IPv6 Routers available", ifp->name);
ipv6nd_drop(ifp);
- ipv6nd_dropdhcp6(ifp);
+ dhcp6_dropnondelegates(ifp);
}
}
/* No valid routers? Kill any DHCPv6. */
if (!validone)
- ipv6nd_dropdhcp6(ifp);
+ dhcp6_dropnondelegates(ifp);
}
void