}
static void
-dhcp6_freedrop_addrs(struct interface *ifp, int drop,
+dhcp6_freedrop_addrs(struct interface *ifp, int drop, unsigned int notflags,
const struct interface *ifd)
{
struct dhcp6_state *state;
state = D6_STATE(ifp);
if (state) {
- ipv6_freedrop_addrs(&state->addrs, drop, ifd);
+ ipv6_freedrop_addrs(&state->addrs, drop, notflags, ifd);
if (drop)
rt_build(ifp->ctx, AF_INET6);
}
if (ifp->ctx->ifaces) {
TAILQ_FOREACH(ifp0, ifp->ctx->ifaces, next) {
if (ifp0 != ifp)
- dhcp6_freedrop_addrs(ifp0, 1, ifp);
+ dhcp6_freedrop_addrs(ifp0, 1, 0, ifp);
}
}
}
dhcp6_leaseextend(ifp);
dhcp6_bind(ifp, NULL, NULL);
} else {
- dhcp6_freedrop_addrs(ifp, 1, NULL);
+ dhcp6_freedrop_addrs(ifp, 1, IPV6_AF_ANYDELEGATED, NULL);
#ifndef SMALL
dhcp6_delete_delegates(ifp);
#endif
return bytes;
ex:
- dhcp6_freedrop_addrs(ifp, 0, NULL);
+ dhcp6_freedrop_addrs(ifp, 0, IPV6_AF_ANYDELEGATED, NULL);
dhcp_unlink(ifp->ctx, state->leasefile);
free(state->new);
state->new = NULL;
if (k) {
loginfox("%s: adding delegated prefixes", ifp->name);
state = D6_STATE(ifp);
- state->state = DH6S_DELEGATED;
ipv6_addaddrs(&state->addrs);
rt_build(ifp->ctx, AF_INET6);
dhcp6_script_try_run(ifp, 1);
}
#endif
- dhcp6_freedrop_addrs(ifp, drop, NULL);
+ dhcp6_freedrop_addrs(ifp, drop, 0, NULL);
free(state->old);
state->old = state->new;
state->old_len = state->new_len;
#ifdef PRIVSEP
if (!(ia->iface->ctx->options & DHCPCD_MANAGER))
ps_inet_closedhcp6(ia);
-#elif defined(SMALL)
- UNUSED(ia);
-#else
+#endif
+#ifndef SMALL
/* NOREJECT is set if we delegated exactly the prefix to another
* address.
* This can only be one address, so just clear the flag.
if (ia->delegating_prefix != NULL)
ia->delegating_prefix->flags &= ~IPV6_AF_NOREJECT;
#endif
-#else
- UNUSED(ia);
+#endif
+
+#if !defined(DHCP6) || (!defined(PRIVSEP) && defined(SMALL))
+ UNUSED(ia)
#endif
}
void
ipv6_freedrop_addrs(struct ipv6_addrhead *addrs, int drop,
- const struct interface *ifd)
+ unsigned int notflags, const struct interface *ifd)
{
struct ipv6_addr *ap, *apn, *apf;
struct timespec now;
#endif
timespecclear(&now);
TAILQ_FOREACH_SAFE(ap, addrs, next, apn) {
+ if (ap->flags & notflags)
+ continue;
#ifndef SMALL
if (ifd != NULL &&
(ap->delegating_prefix == NULL ||
free(cb);
}
- ipv6_freedrop_addrs(&state->addrs, drop ? 2 : 0, NULL);
+ ipv6_freedrop_addrs(&state->addrs, drop ? 2 : 0, 0, NULL);
if (drop) {
if (ifp->ctx->ra_routers != NULL)
rt_build(ifp->ctx, AF_INET6);
#define IPV6_AF_ADDED (1U << 3)
#define IPV6_AF_AUTOCONF (1U << 4)
#define IPV6_AF_DADCOMPLETED (1U << 5)
-#define IPV6_AF_DELEGATED (1U << 6)
-#define IPV6_AF_DELEGATEDPFX (1U << 7)
+#define IPV6_AF_DELEGATED (1U << 6) // Delegated from prefix
+#define IPV6_AF_DELEGATEDPFX (1U << 7) // Delegated prefix
#define IPV6_AF_NOREJECT (1U << 8)
#define IPV6_AF_REQUEST (1U << 9)
#define IPV6_AF_STATIC (1U << 10)
#define IPV6_AF_TEMPORARY (1U << 16)
#endif
+#define IPV6_AF_ANYDELEGATED (IPV6_AF_DELEGATED | IPV6_AF_DELEGATEDPFX)
+
struct ll_callback {
TAILQ_ENTRY(ll_callback) next;
void (*callback)(void *);
int ipv6_doaddr(struct ipv6_addr *, struct timespec *);
ssize_t ipv6_addaddrs(struct ipv6_addrhead *addrs);
void ipv6_deleteaddr(struct ipv6_addr *);
-void ipv6_freedrop_addrs(struct ipv6_addrhead *, int,
+void ipv6_freedrop_addrs(struct ipv6_addrhead *, int, unsigned int,
const struct interface *);
void ipv6_handleifa(struct dhcpcd_ctx *ctx, int, struct if_head *,
const char *, const struct in6_addr *, uint8_t, int, pid_t);
eloop_timeout_delete(rap->iface->ctx->eloop, NULL, rap);
if (remove_ra)
TAILQ_REMOVE(rap->iface->ctx->ra_routers, rap, next);
- ipv6_freedrop_addrs(&rap->addrs, drop_ra, NULL);
+ ipv6_freedrop_addrs(&rap->addrs, drop_ra, 0, NULL);
routeinfohead_free(&rap->rinfos);
free(rap->data);
free(rap);