{
#ifndef SMALL
- if (dhcp6_hasprefixdelegation(ifp) == 0)
+ if (dhcp6_hasprefixdelegation(ifp))
+ return;
#endif
- dhcp6_drop(ifp, "EXPIRE6");
+ if (D6_CSTATE(ifp) == NULL)
+ return;
+
+ loginfox("%s: dropping DHCPv6 due to no valid routers", ifp->name);
+ dhcp6_drop(ifp, "EXPIRE6");
}
void
struct interface *ifp;
struct ra *rap, *ran;
struct timespec now, lt, expire, next;
- uint8_t expired, valid, validone;
+ uint8_t expired, anyvalid, valid, validone;
struct ipv6_addr *ia;
ifp = arg;
expired = 0;
timespecclear(&next);
- validone = 0;
+ anyvalid = 0;
TAILQ_FOREACH_SAFE(rap, ifp->ctx->ra_routers, next, ran) {
if (rap->iface != ifp)
continue;
- valid = 0;
+ valid = validone = 0;
if (rap->lifetime) {
lt.tv_sec = (time_t)rap->lifetime;
lt.tv_nsec = 0;
* the kernel can expire, so we need to handle it ourself.
* Also, some OS don't support address lifetimes (Solaris). */
TAILQ_FOREACH(ia, &rap->addrs, next) {
- if (ia->prefix_vltime == ND6_INFINITE_LIFETIME ||
- ia->prefix_vltime == 0)
+ if (ia->prefix_vltime == 0)
continue;
+ if (ia->prefix_vltime == ND6_INFINITE_LIFETIME) {
+ validone = 1;
+ continue;
+ }
lt.tv_sec = (time_t)ia->prefix_vltime;
lt.tv_nsec = 0;
timespecadd(&ia->acquired, <, &expire);
if (!timespecisset(&next) ||
timespeccmp(&next, <, >))
next = lt;
+ validone = 1;
}
}
/* No valid lifetimes are left on the RA, so we might
* as well punt it. */
- if (!valid && TAILQ_FIRST(&rap->addrs) == NULL)
+ if (!valid && !validone)
ipv6nd_free_ra(rap);
else
- validone = 1;
+ anyvalid = 1;
}
if (timespecisset(&next))
}
/* No valid routers? Kill any DHCPv6. */
- if (!validone)
+ if (!anyvalid)
dhcp6_dropnondelegates(ifp);
}