changeset 2966:3166c9323fc3 draft

Add a helper function to free IPv6 addresses to ensure all timeouts are cleared.
author Roy Marples <roy@marples.name>
date Fri, 27 Feb 2015 20:40:17 +0000
parents dc9f43c964a3
children bde943da371e
files dhcp6.c ipv6.c ipv6.h
diffstat 3 files changed, 16 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/dhcp6.c	Fri Feb 27 19:53:03 2015 +0000
+++ b/dhcp6.c	Fri Feb 27 20:40:17 2015 +0000
@@ -2034,9 +2034,7 @@
 	}
 	TAILQ_FOREACH_SAFE(ap, &state->addrs, next, nap) {
 		if (ap->flags & IPV6_AF_STALE) {
-			if (ap->dadcallback)
-				eloop_q_timeout_delete(ap->iface->ctx->eloop,
-				    0, NULL, ap);
+			eloop_q_timeout_delete(ifp->ctx->eloop, 0, NULL, ap);
 			if (ap->flags & IPV6_AF_REQUEST) {
 				ap->prefix_vltime = ap->prefix_pltime = 0;
 			} else {
@@ -2308,7 +2306,7 @@
 			a->flags |= ap->flags;
 			a->flags &= ~IPV6_AF_NEW;
 			a->created = ap->created;
-			free(ap);
+			ipv6_freeaddr(ap);
 		}
 	}
 
--- a/ipv6.c	Fri Feb 27 19:53:03 2015 +0000
+++ b/ipv6.c	Fri Feb 27 20:40:17 2015 +0000
@@ -620,9 +620,7 @@
 	TAILQ_FOREACH(ap, &state->addrs, next) {
 		if (IN6_ARE_ADDR_EQUAL(&ap->addr, &addr->addr)) {
 			TAILQ_REMOVE(&state->addrs, ap, next);
-			eloop_q_timeout_delete(addr->iface->ctx->eloop, 0,
-			    NULL, ap);
-			free(ap);
+			ipv6_freeaddr(ap);
 			break;
 		}
 	}
@@ -784,7 +782,7 @@
 				ap->flags &= ~IPV6_AF_ADDED;
 			} else {
 				TAILQ_REMOVE(addrs, ap, next);
-				free(ap);
+				ipv6_freeaddr(ap);
 			}
 		} else if (!(ap->flags & IPV6_AF_STALE) &&
 		    !IN6_IS_ADDR_UNSPECIFIED(&ap->addr))
@@ -826,6 +824,14 @@
 }
 
 void
+ipv6_freeaddr(struct ipv6_addr *ap)
+{
+
+	eloop_q_timeout_delete(ap->iface->ctx->eloop, 0, NULL, ap);
+	free(ap);
+}
+
+void
 ipv6_freedrop_addrs(struct ipv6_addrhead *addrs, int drop,
     const struct interface *ifd)
 {
@@ -838,7 +844,6 @@
 			continue;
 		if (drop != 2)
 			TAILQ_REMOVE(addrs, ap, next);
-		eloop_q_timeout_delete(ap->iface->ctx->eloop, 0, NULL, ap);
 		if (drop && ap->flags & IPV6_AF_ADDED &&
 		    (ap->iface->options->options &
 		    (DHCPCD_EXITING | DHCPCD_PERSISTENT)) !=
@@ -860,10 +865,10 @@
 				ipv6_addaddr(apf, &now);
 			}
 			if (drop == 2)
-				free(ap);
+				ipv6_freeaddr(ap);
 		}
 		if (drop != 2)
-			free(ap);
+			ipv6_freeaddr(ap);
 	}
 }
 
@@ -938,8 +943,7 @@
 		case RTM_DELADDR:
 			if (ap) {
 				TAILQ_REMOVE(&state->addrs, ap, next);
-				eloop_q_timeout_delete(ctx->eloop, 0, NULL, ap);
-				free(ap);
+				ipv6_freeaddr(ap);
 			}
 			break;
 		case RTM_NEWADDR:
--- a/ipv6.h	Fri Feb 27 19:53:03 2015 +0000
+++ b/ipv6.h	Fri Feb 27 20:40:17 2015 +0000
@@ -252,6 +252,7 @@
     const struct in6_addr *, short);
 #define ipv6_linklocal(ifp) ipv6_iffindaddr((ifp), NULL)
 int ipv6_addlinklocalcallback(struct interface *, void (*)(void *), void *);
+void ipv6_freeaddr(struct ipv6_addr *);
 void ipv6_freedrop(struct interface *, int);
 #define ipv6_free(ifp) ipv6_freedrop((ifp), 0)
 #define ipv6_drop(ifp) ipv6_freedrop((ifp), 2)