diff options
author | Thomas Markwalder <tmark@isc.org> | 2017-12-11 10:43:04 -0500 |
---|---|---|
committer | Thomas Markwalder <tmark@isc.org> | 2017-12-11 10:43:04 -0500 |
commit | f1fc5ede225a74f61ad994334c2dbdc6cfdd306f (patch) | |
tree | 46bcce4887f2faec8d0fd8cda6b12034eeca2862 /client | |
parent | fa6c4c081fe58ddebd8af2ee8309cc1b92403ced (diff) | |
download | isc-dhcp-f1fc5ede225a74f61ad994334c2dbdc6cfdd306f.tar.gz |
[master] dhclient (-6) skips confirm (INIT REBOOT) is all leases are expired
Merges in rt22675.
Diffstat (limited to 'client')
-rw-r--r-- | client/dhc6.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/client/dhc6.c b/client/dhc6.c index e0d052e5..b5a35f4b 100644 --- a/client/dhc6.c +++ b/client/dhc6.c @@ -145,11 +145,11 @@ static isc_result_t dhc6_check_status(isc_result_t rval, unsigned *code); static int dhc6_score_lease(struct client_state *client, struct dhc6_lease *lease); - static isc_result_t dhc6_add_ia_na_decline(struct client_state *client, struct data_string *packet, struct dhc6_lease *lease); static int drop_declined_addrs(struct dhc6_lease *lease); +static isc_boolean_t unexpired_address_in_lease(struct dhc6_lease *lease); extern int onetry; extern int stateless; @@ -1571,7 +1571,9 @@ start_confirm6(struct client_state *client) /* If there is no active lease, there is nothing to check. */ if ((client->active_lease == NULL) || !active_prefix(client) || - client->active_lease->released) { + client->active_lease->released || + !unexpired_address_in_lease(client->active_lease)) { + dhc6_lease_destroy(&client->active_lease, MDL); start_init6(client); return; } @@ -6109,5 +6111,29 @@ int drop_declined_addrs(struct dhc6_lease *lease) { return (live_cnt); } +/* Run through the addresses in lease and return true if there's any unexpired. + * Return false otherwise. + */ +static isc_boolean_t +unexpired_address_in_lease(struct dhc6_lease *lease) +{ + struct dhc6_ia *ia; + struct dhc6_addr *addr; + if (lease == NULL) { + return ISC_FALSE; + } + + for (ia = lease->bindings ; ia != NULL ; ia = ia->next) { + for (addr = ia->addrs ; addr != NULL ; addr = addr->next) { + if (!(addr->flags & DHC6_ADDR_EXPIRED) && + (addr->starts + addr->max_life > cur_time)) { + return ISC_TRUE; + } + } + } + + log_debug("PRC: Previous lease is devoid of active addresses."); + return ISC_FALSE; +} #endif /* DHCPv6 */ |