}
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 {
a->flags |= ap->flags;
a->flags &= ~IPV6_AF_NEW;
a->created = ap->created;
- free(ap);
+ ipv6_freeaddr(ap);
}
}
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;
}
}
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))
return i;
}
+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)
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)) !=
ipv6_addaddr(apf, &now);
}
if (drop == 2)
- free(ap);
+ ipv6_freeaddr(ap);
}
if (drop != 2)
- free(ap);
+ ipv6_freeaddr(ap);
}
}
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:
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)