about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--debian/patches/dhcp-nettools-handle-retracted-event-as-expired.patch36
-rw-r--r--debian/patches/n-dhcp4-allow-calling-listen-on-already-listening-connect.patch29
-rw-r--r--debian/patches/n-dhcp4-restart-the-transaction-after-a-NAK.patch70
-rw-r--r--debian/patches/series3
4 files changed, 138 insertions, 0 deletions
diff --git a/debian/patches/dhcp-nettools-handle-retracted-event-as-expired.patch b/debian/patches/dhcp-nettools-handle-retracted-event-as-expired.patch
new file mode 100644
index 00000000..23378ce5
--- /dev/null
+++ b/debian/patches/dhcp-nettools-handle-retracted-event-as-expired.patch
@@ -0,0 +1,36 @@
+From: Beniamino Galvani <bgalvani@redhat.com>
+Date: Tue, 7 Jan 2020 12:03:21 +0100
+Subject: dhcp: nettools: handle 'retracted' event as 'expired'
+
+The 'retracted' event is emitted when the client receives a NAK in the
+rebooting, requesting, renewing or rebinding state, while 'expired'
+means that the client wasn't able to renew the lease before expiry.
+
+In both cases the old lease is no longer valid and n-dhcp4 keep trying
+to get a lease, so the two events should be handlded in the same way.
+
+Note that the systemd client doesn't have a 'retracted' event and
+considers all NAKs as 'expired' events.
+
+(cherry picked from commit 2523000b36b113fd7b94ae6b7178f6fd33908ef9)
+(cherry picked from commit 92b382e2f85b0870b553358cec0209a0a0e3ce31)
+---
+ src/dhcp/nm-dhcp-nettools.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/dhcp/nm-dhcp-nettools.c b/src/dhcp/nm-dhcp-nettools.c
+index 1f76c64..b4c0a45 100644
+--- a/src/dhcp/nm-dhcp-nettools.c
++++ b/src/dhcp/nm-dhcp-nettools.c
+@@ -1028,10 +1028,10 @@ dhcp4_event_handle (NMDhcpNettools *self,
+ 			_LOGW ("selecting lease failed: %d", r);
+ 		}
+ 		break;
++	case N_DHCP4_CLIENT_EVENT_RETRACTED:
+ 	case N_DHCP4_CLIENT_EVENT_EXPIRED:
+ 		nm_dhcp_client_set_state (NM_DHCP_CLIENT (self), NM_DHCP_STATE_EXPIRE, NULL, NULL);
+ 		break;
+-	case N_DHCP4_CLIENT_EVENT_RETRACTED:
+ 	case N_DHCP4_CLIENT_EVENT_CANCELLED:
+ 		nm_dhcp_client_set_state (NM_DHCP_CLIENT (self), NM_DHCP_STATE_FAIL, NULL, NULL);
+ 		break;
diff --git a/debian/patches/n-dhcp4-allow-calling-listen-on-already-listening-connect.patch b/debian/patches/n-dhcp4-allow-calling-listen-on-already-listening-connect.patch
new file mode 100644
index 00000000..d682210b
--- /dev/null
+++ b/debian/patches/n-dhcp4-allow-calling-listen-on-already-listening-connect.patch
@@ -0,0 +1,29 @@
+From: Beniamino Galvani <bgalvani@redhat.com>
+Date: Tue, 7 Jan 2020 12:01:39 +0100
+Subject: n-dhcp4: allow calling listen() on already listening connection
+
+When the client enters the INIT state, it calls listen() on the
+connection connection to create the packet socket. However, if the
+client is coming from the REBOOTING state after a NAK, the connection
+is already in the listening state; do nothing in such case.
+
+(cherry picked from commit 4bcdc3c1ebe3e2e8a967ff067ecb2a8cbfc2f6ab)
+(cherry picked from commit 2e1d3ae572a753f0181760d9fa41558d33849b09)
+---
+ shared/n-dhcp4/src/n-dhcp4-c-connection.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/shared/n-dhcp4/src/n-dhcp4-c-connection.c b/shared/n-dhcp4/src/n-dhcp4-c-connection.c
+index e51a3e3..f3ae44e 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/debian/patches/n-dhcp4-restart-the-transaction-after-a-NAK.patch b/debian/patches/n-dhcp4-restart-the-transaction-after-a-NAK.patch
new file mode 100644
index 00000000..d245597f
--- /dev/null
+++ b/debian/patches/n-dhcp4-restart-the-transaction-after-a-NAK.patch
@@ -0,0 +1,70 @@
+From: Beniamino Galvani <bgalvani@redhat.com>
+Date: Tue, 7 Jan 2020 12:02:55 +0100
+Subject: n-dhcp4: restart the transaction after a NAK
+
+It is not enough to set the INIT state after a NAK; a timeout
+(ns_deferred) must be set so that it is added to the event fd. The
+client retries immediately the first time, so that in the successful
+case it gets an address quickly. To avoid flooding the network in case
+of servers always replying with NAKs, next attempts are done with
+intervals from 2 seconds to 5 minutes using exponential backoff. See
+also systemd commit [1].
+
+[1] https://github.com/systemd/systemd/commit/1d1a3e0afb85478cda43670b8ed92a6db6c83f3e
+
+https://gitlab.freedesktop.org/NetworkManager/NetworkManager/issues/325
+(cherry picked from commit 218782a9a3c326f5c8cc3ea40dc0cd039060b188)
+(cherry picked from commit ae5b9343d2e52917546f228b7a4d3c7fc4fa98ec)
+---
+ shared/n-dhcp4/src/n-dhcp4-c-probe.c | 10 ++++++----
+ shared/n-dhcp4/src/n-dhcp4-private.h |  1 +
+ 2 files changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/shared/n-dhcp4/src/n-dhcp4-c-probe.c b/shared/n-dhcp4/src/n-dhcp4-c-probe.c
+index 4fb7d38..82a089e 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 fcfb0f3..c092ae8 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 */
diff --git a/debian/patches/series b/debian/patches/series
index 9a20acf2..1db304db 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,2 +1,5 @@
 Force-online-state-with-unmanaged-devices.patch
 Don-t-setup-Sleep-Monitor-if-not-booted-with-systemd.patch
+n-dhcp4-allow-calling-listen-on-already-listening-connect.patch
+n-dhcp4-restart-the-transaction-after-a-NAK.patch
+dhcp-nettools-handle-retracted-event-as-expired.patch