Mercurial > hg > dhcpcd
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)
