TAILQ_REMOVE(&state->addrs, ap, next);
if (ap->dadcallback)
eloop_q_timeout_delete(ap->iface->ctx->eloop,
- 0, NULL, ap->dadcallback);
+ 0, NULL, ap);
free(ap);
}
}
dhcp6_startexpire, ifp);
if (ifp->options->ia_type == D6_OPTION_IA_PD)
dhcp6_delegate_prefix(ifp);
+
ipv6nd_probeaddrs(&state->addrs);
if (state->state == DH6S_INFORMED)
syslog(has_new ? LOG_INFO : LOG_DEBUG,
/* If all addresses have completed DAD run the script */
TAILQ_FOREACH(ap, &state->addrs, next) {
if (ap->flags & IPV6_AF_ONLINK) {
-// if (!(ap->flags & IPV6_AF_DADCOMPLETED) &&
-// ipv6_findaddr(ap->iface, &ap->addr))
-// ap->flags |= IPV6_AF_DADCOMPLETED;
+ if (!(ap->flags & IPV6_AF_DADCOMPLETED) &&
+ ipv6_findaddr(ap->iface, &ap->addr))
+ ap->flags |= IPV6_AF_DADCOMPLETED;
if ((ap->flags & IPV6_AF_DADCOMPLETED) == 0) {
len = 0;
break;
const struct interface *ifd)
{
struct ipv6_addr *ap, *apn;
+ struct ipv6_state *state;
+ struct ipv6_addr_l *lap;
TAILQ_FOREACH_SAFE(ap, addrs, next, apn) {
if (ifd && ap->delegating_iface != ifd)
if (del_address6(ap) == -1 &&
errno != EADDRNOTAVAIL && errno != ENXIO)
syslog(LOG_ERR, "del_address6 %m");
+
+ /* Remove it from our internal state */
+ state = IPV6_STATE(ap->iface);
+ if (state) {
+ TAILQ_FOREACH(lap, &state->addrs, next) {
+ if (IN6_ARE_ADDR_EQUAL(&lap->addr,
+ &ap->addr))
+ {
+ TAILQ_REMOVE(&state->addrs,
+ lap, next);
+ free(lap);
+ break;
+ }
+ }
+ }
}
free(ap);
}