summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorTian Hao <haotia@gmail.com>2019-08-30 01:08:17 +0800
committerHans Dedecker <dedeckeh@gmail.com>2019-09-14 20:58:33 +0200
commitfd93e36727bc605f6f860759d7710a43bee5215d (patch)
treebdc359a7308e8f8b06749f354d45e73c13ef8d05 /src
parente73bf11dee1073aaaddc0dc67ca8c7d75ae3c6ad (diff)
dhcpv6: retry failed PD assignments on addrlist change
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>
Diffstat (limited to 'src')
-rw-r--r--src/dhcpv6-ia.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c
index 0adc57f..da2501f 100644
--- a/src/dhcpv6-ia.c
+++ b/src/dhcpv6-ia.c
@@ -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);