a->dadcallback = dhcp6_dadcallback;
a->ia_type = D6_OPTION_IA_PD;
memcpy(a->iaid, iaid, sizeof(a->iaid));
- TAILQ_INIT(&a->pd_pfxs);
TAILQ_INSERT_TAIL(&state->addrs, a, next);
} else {
- if (!(a->flags & IPV6_AF_DELEGATEDPFX)) {
+ if (!(a->flags & IPV6_AF_DELEGATEDPFX))
a->flags |= IPV6_AF_NEW | IPV6_AF_DELEGATEDPFX;
- TAILQ_INIT(&a->pd_pfxs);
- }
a->flags &= ~(IPV6_AF_STALE |
IPV6_AF_EXTENDED |
IPV6_AF_REQUEST);
if (ap->flags & IPV6_AF_REQUEST) {
ap->flags &= ~IPV6_AF_ADDED;
} else {
- TAILQ_REMOVE(addrs, ap, next);
- ipv6_freeaddr(ap);
+#ifndef SMALL
+ if (ap->delegating_prefix != NULL &&
+ addrs == &ap->delegating_prefix->pd_pfxs) {
+ TAILQ_REMOVE(addrs, ap, pd_next);
+ ap->delegating_prefix = NULL;
+ } else
+#endif
+ {
+ TAILQ_REMOVE(addrs, ap, next);
+ ipv6_freeaddr(ap);
+ }
}
} else if (!(ap->flags & IPV6_AF_STALE) &&
!IN6_IS_ADDR_UNSPECIFIED(&ap->addr))
ia->prefix_len = prefix_len;
ia->dhcp6_fd = -1;
+#ifndef SMALL
+ TAILQ_INIT(&ia->pd_pfxs);
+#endif
+
#ifdef IPV6_AF_TEMPORARY
tempaddr = ia->flags & IPV6_AF_TEMPORARY;
#else