TAILQ_FOREACH_SAFE(ap, addrs, next, apn) {
if (ap->prefix_vltime == 0) {
TAILQ_REMOVE(addrs, ap, next);
- if (ap->flags & IPV6_AF_ADDED)
+ if (ap->flags & IPV6_AF_ADDED) {
syslog(LOG_INFO, "%s: deleting address %s",
ap->iface->name, ap->saddr);
+ i++;
+ }
if (del_address6(ap) == -1 &&
errno != EADDRNOTAVAIL)
syslog(LOG_ERR, "del_address6 %m");
ipv6ns_unreachable, rap);
}
+void
+ipv6ns_cancelproberouter(struct ra *rap)
+{
+
+ eloop_timeout_delete(ipv6ns_proberouter, rap);
+ eloop_timeout_delete(ipv6ns_unreachable, rap);
+}
+
/* ARGSUSED */
static void
ipv6ns_handledata(__unused void *arg)
return NULL;
}
-static const struct ipv6_addr *
-ipv6rs_findsameaddr(const struct ipv6_addr *ap)
-{
- const struct ra *rap;
- const struct ipv6_addr *a;
-
- TAILQ_FOREACH(rap, &ipv6_routers, next) {
- TAILQ_FOREACH(a, &rap->addrs, next) {
- if (ap != a &&
- memcmp(&a->addr, &ap->addr, sizeof(ap->addr) == 0))
- return a;
- }
- }
- return NULL;
-}
-
void
ipv6rs_handleifa(int cmd, const char *ifname,
const struct in6_addr *addr, int flags)
{
struct interface *ifp;
struct ra *rap, *ran;
- struct ipv6_addr *ap, *apn;
struct ra_opt *rao, *raon;
struct timeval now, lt, expire, next;
int expired, valid;
"%s: %s: expired default Router",
ifp->name, rap->sfrom);
rap->expired = expired = 1;
+ ipv6ns_cancelproberouter(rap);
}
} else {
valid = 1;
next = lt;
}
- if (options & DHCPCD_IPV6RA_OWN) {
- TAILQ_FOREACH_SAFE(ap, &rap->addrs, next, apn) {
- lt.tv_sec = ap->prefix_vltime;
- lt.tv_usec = 0;
- timeradd(&rap->received, <, &expire);
- if (timercmp(&now, &expire, >) &&
- ipv6rs_findsameaddr(ap) == NULL)
- {
- syslog(LOG_WARNING,
- "%s: %s: expired address",
- ifp->name, ap->saddr);
- eloop_timeout_delete(NULL, ap);
- TAILQ_REMOVE(&rap->addrs, ap, next);
- free(ap);
- /* No need to delete it as the kernel
- * should have done this. */
- }
- }
- }
+ /* Addresses are expired in ipv6ns_probeaddrs
+ * so that DHCPv6 addresses can be removed also. */
TAILQ_FOREACH_SAFE(rao, &rap->options, next, raon) {
if (rap->expired) {