summary refs log tree commit diff
path: root/shared/n-dhcp4
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2020-01-15 02:57:26 +0100
committerMichael Biebl <biebl@debian.org>2020-01-15 02:57:26 +0100
commit90c93214efba0966274224a93a77d235d4f8c034 (patch)
tree0ccdd9703068070bb0d940588cc4e21317d30a74 /shared/n-dhcp4
parent724bcc5c7be3aed3646ed2b2989c34d438217176 (diff)
New upstream version 1.22.4 upstream/1.22.4
Diffstat (limited to 'shared/n-dhcp4')
-rw-r--r--shared/n-dhcp4/src/n-dhcp4-c-connection.c3
-rw-r--r--shared/n-dhcp4/src/n-dhcp4-c-probe.c10
-rw-r--r--shared/n-dhcp4/src/n-dhcp4-private.h1
3 files changed, 10 insertions, 4 deletions
diff --git a/shared/n-dhcp4/src/n-dhcp4-c-connection.c b/shared/n-dhcp4/src/n-dhcp4-c-connection.c
index e51a3e32..f3ae44e2 100644
--- a/shared/n-dhcp4/src/n-dhcp4-c-connection.c
+++ b/shared/n-dhcp4/src/n-dhcp4-c-connection.c
@@ -139,6 +139,9 @@ int n_dhcp4_c_connection_listen(NDhcp4CConnection *connection) {
         _c_cleanup_(c_closep) int fd_packet = -1;
         int r;
 
+        if (connection->state == N_DHCP4_C_CONNECTION_STATE_PACKET)
+                return 0;
+
         c_assert(connection->state == N_DHCP4_C_CONNECTION_STATE_INIT ||
                  connection->state == N_DHCP4_C_CONNECTION_STATE_DRAINING ||
                  connection->state == N_DHCP4_C_CONNECTION_STATE_UDP);
diff --git a/shared/n-dhcp4/src/n-dhcp4-c-probe.c b/shared/n-dhcp4/src/n-dhcp4-c-probe.c
index 4fb7d389..5bed15b8 100644
--- a/shared/n-dhcp4/src/n-dhcp4-c-probe.c
+++ b/shared/n-dhcp4/src/n-dhcp4-c-probe.c
@@ -946,7 +946,7 @@ static int n_dhcp4_client_probe_transition_ack(NDhcp4ClientProbe *probe, NDhcp4I
                 n_dhcp4_client_lease_unref(probe->current_lease);
                 probe->current_lease = n_dhcp4_client_lease_ref(lease);
                 probe->state = N_DHCP4_CLIENT_PROBE_STATE_BOUND;
-
+                probe->ns_nak_restart_delay = 0;
                 break;
 
         case N_DHCP4_CLIENT_PROBE_STATE_REQUESTING:
@@ -969,7 +969,7 @@ static int n_dhcp4_client_probe_transition_ack(NDhcp4ClientProbe *probe, NDhcp4I
                 node->event.granted.lease = n_dhcp4_client_lease_ref(lease);
                 probe->current_lease = n_dhcp4_client_lease_ref(lease);
                 probe->state = N_DHCP4_CLIENT_PROBE_STATE_GRANTED;
-
+                probe->ns_nak_restart_delay = 0;
                 break;
 
         case N_DHCP4_CLIENT_PROBE_STATE_INIT:
@@ -1004,9 +1004,11 @@ static int n_dhcp4_client_probe_transition_nak(NDhcp4ClientProbe *probe) {
                         return r;
 
                 probe->state = N_DHCP4_CLIENT_PROBE_STATE_INIT;
-
+                probe->ns_deferred = n_dhcp4_gettime(CLOCK_BOOTTIME) + probe->ns_nak_restart_delay;
+                probe->ns_nak_restart_delay = C_CLAMP(probe->ns_nak_restart_delay * 2,
+                                                      UINT64_C(1000000000 * 2),
+                                                      UINT64_C(1000000000 * 300));
                 break;
-
         case N_DHCP4_CLIENT_PROBE_STATE_SELECTING:
         case N_DHCP4_CLIENT_PROBE_STATE_INIT_REBOOT:
         case N_DHCP4_CLIENT_PROBE_STATE_INIT:
diff --git a/shared/n-dhcp4/src/n-dhcp4-private.h b/shared/n-dhcp4/src/n-dhcp4-private.h
index fcfb0f35..c092ae8f 100644
--- a/shared/n-dhcp4/src/n-dhcp4-private.h
+++ b/shared/n-dhcp4/src/n-dhcp4-private.h
@@ -352,6 +352,7 @@ struct NDhcp4ClientProbe {
         unsigned int state;                     /* current probe state */
         uint64_t ns_deferred;                   /* timeout for deferred action */
         uint64_t ns_reinit;
+        uint64_t ns_nak_restart_delay;          /* restart delay after a nak */
         NDhcp4ClientLease *current_lease;       /* current lease */
 
         NDhcp4CConnection connection;           /* client connection wrapper */