]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
[master] dhclient (-6) skips confirm (INIT REBOOT) is all leases are expired
authorThomas Markwalder <tmark@isc.org>
Mon, 11 Dec 2017 15:43:04 +0000 (10:43 -0500)
committerThomas Markwalder <tmark@isc.org>
Mon, 11 Dec 2017 15:43:04 +0000 (10:43 -0500)
    Merges in rt22675.

RELNOTES
client/dhc6.c

index 8862573be6265ccbae68332b825ae4e08fd154cf..4fe8a26b778431aca66b6068e3d99e096b0bc65f 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -313,6 +313,11 @@ dhcp-users@lists.isc.org.
   [ISC-Bugs #23252]
   [ISC-Bugs #37221]
 
+- Modified dhclient (-6) to bypass sending a confirm (INIT REBOOT) when it has
+  only expired address assocations.  Thanks to Jiri Popelka at Red Hat for
+  raising the issue and submitting the patch.
+  [ISC-Bugs #22675]
+
                        Changes since 4.3.0 (bug fixes)
 
 - Tidy up several small tickets.
index e0d052e572dee0fbf2d25187788f1ee9dcb9178a..b5a35f4be7fcc9a53a81f06ab2ad0a8e51d3805f 100644 (file)
@@ -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 */