Forget addresses set up by SLAAC when prefix expires.

This commit is contained in:
Stian Sebastian Skjelstad 2015-09-02 13:12:52 -06:00 committed by Ivan Delamer
parent aa0e41c389
commit aea87a9a2f

View File

@ -743,41 +743,65 @@ nd6_tmr(void)
/* Process prefix entries. */ /* Process prefix entries. */
for (i = 0; i < LWIP_ND6_NUM_PREFIXES; i++) { for (i = 0; i < LWIP_ND6_NUM_PREFIXES; i++) {
if (prefix_list[i].invalidation_timer < ND6_TMR_INTERVAL / 1000) { if (prefix_list[i].netif != NULL) {
prefix_list[i].invalidation_timer = 0; if (prefix_list[i].invalidation_timer < ND6_TMR_INTERVAL / 1000) {
} /* Entry timed out, remove it */
if ((prefix_list[i].invalidation_timer > 0) && prefix_list[i].invalidation_timer = 0;
(prefix_list[i].netif != NULL)) {
prefix_list[i].invalidation_timer -= ND6_TMR_INTERVAL / 1000;
#if LWIP_IPV6_AUTOCONFIG #if LWIP_IPV6_AUTOCONFIG
/* Initiate address autoconfiguration for this prefix, if conditions are met. */ /* If any addresses were configured with this prefix, remove them */
if (prefix_list[i].netif->ip6_autoconfig_enabled && if (prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED)
(prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_AUTONOMOUS) && {
!(prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED)) { s8_t j;
s8_t j;
/* Try to get an address on this netif that is invalid.
* Skip 0 index (link-local address) */
for (j = 1; j < LWIP_IPV6_NUM_ADDRESSES; j++) {
if (netif_ip6_addr_state(prefix_list[i].netif, j) == IP6_ADDR_INVALID) {
/* Generate an address using this prefix and interface ID from link-local address. */
IP6_ADDR(&prefix_list[i].netif->ip6_addr[j],
prefix_list[i].prefix.addr[0], prefix_list[i].prefix.addr[1],
netif_ip6_addr(prefix_list[i].netif, 0)->addr[2], netif_ip6_addr(prefix_list[i].netif, 0)->addr[3]);
/* Mark it as tentative (DAD will be performed if configured). */ for (j = 1; j < LWIP_IPV6_NUM_ADDRESSES; j++) {
netif_ip6_addr_set_state(prefix_list[i].netif, j, IP6_ADDR_TENTATIVE); if ((netif_ip6_addr_state(prefix_list[i].netif, j) != IP6_ADDR_INVALID) &&
ip6_addr_netcmp(&prefix_list[i].prefix, netif_ip6_addr(prefix_list[i].netif, j))) {
netif_ip6_addr_set_state(prefix_list[i].netif, j, IP6_ADDR_INVALID);
prefix_list[i].flags = 0;
/* Mark this prefix with ADDRESS_GENERATED, so that we don't try again. */ /* Exit loop. */
prefix_list[i].flags |= ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED; break;
}
/* Exit loop. */
break;
} }
} }
}
#endif /* LWIP_IPV6_AUTOCONFIG */ #endif /* LWIP_IPV6_AUTOCONFIG */
}
prefix_list[i].netif = NULL;
prefix_list[i].flags = 0;
}
else {
prefix_list[i].invalidation_timer -= ND6_TMR_INTERVAL / 1000;
#if LWIP_IPV6_AUTOCONFIG
/* Initiate address autoconfiguration for this prefix, if conditions are met. */
if (prefix_list[i].netif->ip6_autoconfig_enabled &&
(prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_AUTONOMOUS) &&
!(prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED)) {
s8_t j;
/* Try to get an address on this netif that is invalid.
* Skip 0 index (link-local address) */
for (j = 1; j < LWIP_IPV6_NUM_ADDRESSES; j++) {
if (netif_ip6_addr_state(prefix_list[i].netif, j) == IP6_ADDR_INVALID) {
/* Generate an address using this prefix and interface ID from link-local address. */
IP6_ADDR(&prefix_list[i].netif->ip6_addr[j],
prefix_list[i].prefix.addr[0], prefix_list[i].prefix.addr[1],
netif_ip6_addr(prefix_list[i].netif, 0)->addr[2], netif_ip6_addr(prefix_list[i].netif, 0)->addr[3]);
/* Mark it as tentative (DAD will be performed if configured). */
netif_ip6_addr_set_state(prefix_list[i].netif, j, IP6_ADDR_TENTATIVE);
/* Mark this prefix with ADDRESS_GENERATED, so that we don't try again. */
prefix_list[i].flags |= ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED;
/* Exit loop. */
break;
}
}
}
#endif /* LWIP_IPV6_AUTOCONFIG */
}
}
} }