From: Roy Marples Date: Tue, 4 Jun 2013 14:53:03 +0000 (+0000) Subject: As DHCPv6 can remove addresses with vltime 0 as well as a RA, X-Git-Tag: v6.0.0~56 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=78ae729605bca66ca35530dc5a9f4949f29e435e;p=thirdparty%2Fdhcpcd.git As DHCPv6 can remove addresses with vltime 0 as well as a RA, move the check into probeaddresses to save on duplication. --- diff --git a/ipv6ns.c b/ipv6ns.c index aba742a6..d75a09d0 100644 --- a/ipv6ns.c +++ b/ipv6ns.c @@ -388,9 +388,11 @@ ipv6ns_probeaddrs(struct ipv6_addrhead *addrs) 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"); @@ -495,6 +497,14 @@ ipv6ns_proberouter(void *arg) 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) diff --git a/ipv6ns.h b/ipv6ns.h index 54ee87f1..eca6108d 100644 --- a/ipv6ns.h +++ b/ipv6ns.h @@ -39,6 +39,7 @@ void ipv6ns_probeaddr(void *); ssize_t ipv6ns_probeaddrs(struct ipv6_addrhead *); void ipv6ns_proberouter(void *); +void ipv6ns_cancelproberouter(struct ra *); #ifdef LISTEN_DAD void ipv6ns_cancelprobeaddr(struct ipv6_addr *); diff --git a/ipv6rs.c b/ipv6rs.c index 5a4f293b..0f443573 100644 --- a/ipv6rs.c +++ b/ipv6rs.c @@ -1110,22 +1110,6 @@ ipv6rs_findprefix(const struct ipv6_addr *a) 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) @@ -1144,7 +1128,6 @@ ipv6rs_expire(void *arg) { 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; @@ -1167,6 +1150,7 @@ ipv6rs_expire(void *arg) "%s: %s: expired default Router", ifp->name, rap->sfrom); rap->expired = expired = 1; + ipv6ns_cancelproberouter(rap); } } else { valid = 1; @@ -1175,25 +1159,8 @@ ipv6rs_expire(void *arg) 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) {