summaryrefslogtreecommitdiffstats
path: root/ipv6.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2015-02-27 20:40:17 +0000
committerRoy Marples <roy@marples.name>2015-02-27 20:40:17 +0000
commit134277d5e42727bdcd83405e5c2dfaa972870b9e (patch)
tree5c8b89f0d590cc372184796abc7299b8e8096d42 /ipv6.c
parent5e6f739282de3a63df974b84ff567d4692f004e2 (diff)
downloaddhcpcd-134277d5e42727bdcd83405e5c2dfaa972870b9e.tar.xz
Add a helper function to free IPv6 addresses to ensure all
timeouts are cleared.
Diffstat (limited to 'ipv6.c')
-rw-r--r--ipv6.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/ipv6.c b/ipv6.c
index ed18626b..261097ba 100644
--- a/ipv6.c
+++ b/ipv6.c
@@ -620,9 +620,7 @@ ipv6_deleteaddr(struct ipv6_addr *addr)
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 @@ ipv6_addaddrs(struct ipv6_addrhead *addrs)
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 @@ ipv6_addaddrs(struct ipv6_addrhead *addrs)
}
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 @@ ipv6_freedrop_addrs(struct ipv6_addrhead *addrs, int drop,
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_freedrop_addrs(struct ipv6_addrhead *addrs, int drop,
ipv6_addaddr(apf, &now);
}
if (drop == 2)
- free(ap);
+ ipv6_freeaddr(ap);
}
if (drop != 2)
- free(ap);
+ ipv6_freeaddr(ap);
}
}
@@ -938,8 +943,7 @@ ipv6_handleifa(struct dhcpcd_ctx *ctx,
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: