]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
As DHCPv6 can remove addresses with vltime 0 as well as a RA,
authorRoy Marples <roy@marples.name>
Tue, 4 Jun 2013 14:53:03 +0000 (14:53 +0000)
committerRoy Marples <roy@marples.name>
Tue, 4 Jun 2013 14:53:03 +0000 (14:53 +0000)
move the check into probeaddresses to save on duplication.

ipv6ns.c
ipv6ns.h
ipv6rs.c

index aba742a67aa02d234f95c6d5f15c62c52f26a76e..d75a09d07ccd569c644b7453a183fddf0cdff99e 100644 (file)
--- 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)
index 54ee87f1da25d4093d5e128ce2884d4c4594673f..eca6108d981af7f7e669ac1ba32e3c0859e97d25 100644 (file)
--- 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 *);
index 5a4f293bff9e36d6c5cb6d1dc48f88286a06e7b2..0f443573b37069f9b1024a05bf94689ce2eb67cc 100644 (file)
--- 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, &lt, &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) {