dhcpv6: retry failed PD assignments on addrlist change
authorTian Hao <haotia@gmail.com>
Thu, 29 Aug 2019 17:08:17 +0000 (01:08 +0800)
committerHans Dedecker <dedeckeh@gmail.com>
Sat, 14 Sep 2019 18:58:33 +0000 (20:58 +0200)
Currently only assignments with prefixes larger than the largest
available one will be re-assigned on addrlist change events.
Previously failed PD assignments are not taken into account, and these
assignments will never have a chance to recover even if the address just
added to the interface could satisfy them.

Failed PD assignments could be very common when upstream prefix is obtained
from a PPPoE WAN, as ISPs tend to terminate the PPPoE session after a fixed
time period. Addresses on LAN could disappear and re-appear during WAN redial,
and all existing PD assignments to clients in LAN will become failed when the
addresses disappear. These assignments will not be recovered after WAN has been
brought back up, and clients in LAN could no longer receive any PD prefix.

This commit fixes the issue by including failed PD assignments in the
re-assign list on addrlist change event, so that newly added prefixes can be
put into use right after they are added to the interface.

Signed-off-by: Tian Hao <haotia@gmail.com>
src/dhcpv6-ia.c

index 0adc57f79c7dc714814847dc633e97e24c98881b..da2501f40672e8ea35945db767b9e9b26e9ef715 100644 (file)
@@ -700,7 +700,7 @@ static void handle_addrlist_change(struct netevent_handler_info *info)
                                c->managed_size)
                        continue;
 
-               if (c->length < 128 && c->assigned >= border->assigned && c != border)
+               if (c->length < 128 && (c->assigned == 0 || c->assigned >= border->assigned) && c != border)
                        list_move(&c->head, &reassign);
                else if (c != border && (c->flags & OAF_BOUND))
                        apply_lease(iface, c, true);