Blob Blame History Raw
From 95c67b5117499c3a31cdb52b81f1cc9bdb091d88 Mon Sep 17 00:00:00 2001
From: Beniamino Galvani <bgalvani@redhat.com>
Date: Tue, 18 Feb 2020 17:04:37 +0100
Subject: [PATCH 1/2] n-dhcp4: fix logging macro

The level can be a complex expression, don't use it directly in the
macro.

(cherry picked from commit 910267cf5f0f163a038ec983bec237c8a8cb1abf)
(cherry picked from commit 84c4920f5d97cc79ca349d035c719ffac3dd5fc3)
---
 shared/n-dhcp4/src/n-dhcp4-private.h | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/shared/n-dhcp4/src/n-dhcp4-private.h b/shared/n-dhcp4/src/n-dhcp4-private.h
index 436ee8065..f647cb5e2 100644
--- a/shared/n-dhcp4/src/n-dhcp4-private.h
+++ b/shared/n-dhcp4/src/n-dhcp4-private.h
@@ -702,10 +702,11 @@ static inline uint64_t n_dhcp4_gettime(clockid_t clock) {
 #define n_dhcp4_c_log(_config, _level, ...)                                    \
         do {                                                                   \
                 const NDhcp4ClientConfig *__config = _config;                  \
+                int __level = _level;                                          \
                                                                                \
-                if (_level <= __config->log.level && __config->log.func) {     \
+                if (__level <= __config->log.level && __config->log.func) {    \
                         if (1) {                                               \
-                                _config->log.func(_level,                      \
+                                _config->log.func(__level,                     \
                                                   __config->log.data,          \
                                                   __VA_ARGS__);                \
                         } else {                                               \
-- 
2.24.1

From 539bb87ca200faaba7d1ccb96aae5eaf15349173 Mon Sep 17 00:00:00 2001
From: Beniamino Galvani <bgalvani@redhat.com>
Date: Mon, 24 Feb 2020 09:55:13 +0100
Subject: [PATCH 2/2] n-dhcp4: keep trying after a failure in send()

Currently if an error is encountered during a send() of a message, the
client fails and there is no possibility of recover, since no timers
are armed after a failed event dispatch. An easy way to reproduce a
failure is to add a firewall rule like:

  iptables -A OUTPUT -p udp --dport 67 -j REJECT

which makes the send() fail with EPERM during the renew. In such case,
the client should continue (failing) until it reaches the rebind phase
at T2, when it will be able to renew the lease using the packet
socket.

In general, a failure to send a packet should not cause the failure of
the client.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/419
https://bugzilla.redhat.com/show_bug.cgi?id=1806516
(cherry picked from commit 5a7b83ea0a2eb3cb0bb39c8219490c704024b5f5)
(cherry picked from commit 932b4538aee7da9a1fe75d115358bb943872e3fd)
---
 shared/n-dhcp4/src/n-dhcp4-c-connection.c | 25 ++++++++++++-----------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/shared/n-dhcp4/src/n-dhcp4-c-connection.c b/shared/n-dhcp4/src/n-dhcp4-c-connection.c
index d4354467d..a5c8ea66f 100644
--- a/shared/n-dhcp4/src/n-dhcp4-c-connection.c
+++ b/shared/n-dhcp4/src/n-dhcp4-c-connection.c
@@ -1006,6 +1006,7 @@ static int n_dhcp4_c_connection_send_request(NDhcp4CConnection *connection,
                                              uint64_t timestamp) {
         char server_addr[INET_ADDRSTRLEN];
         char client_addr[INET_ADDRSTRLEN];
+        char error_msg[128];
         int r;
         bool broadcast = false;
 
@@ -1045,45 +1046,45 @@ static int n_dhcp4_c_connection_send_request(NDhcp4CConnection *connection,
         case N_DHCP4_C_MESSAGE_REBIND:
                 broadcast = true;
                 r = n_dhcp4_c_connection_packet_broadcast(connection, request);
-                if (r)
-                        return r;
                 break;
         case N_DHCP4_C_MESSAGE_INFORM:
                 broadcast = true;
                 r = n_dhcp4_c_connection_udp_broadcast(connection, request);
-                if (r)
-                        return r;
-
                 break;
         case N_DHCP4_C_MESSAGE_RENEW:
         case N_DHCP4_C_MESSAGE_RELEASE:
                 r = n_dhcp4_c_connection_udp_send(connection, request);
-                if (r)
-                        return r;
-
                 break;
         default:
                 c_assert(0);
         }
 
+        if (r) {
+                snprintf(error_msg, sizeof(error_msg), ": error %d", r);
+        } else {
+                error_msg[0] = '\0';
+        }
+
         if (request->userdata.client_addr == INADDR_ANY) {
                 n_dhcp4_c_log(connection->client_config, LOG_INFO,
-                              "sent %s to %s",
+                              "send %s to %s%s",
                               message_type_to_str(request->userdata.message_type),
                               broadcast ?
                               "255.255.255.255" :
                               inet_ntop(AF_INET, &connection->server_ip,
-                                        server_addr, sizeof(server_addr)));
+                                        server_addr, sizeof(server_addr)),
+                              error_msg);
         } else {
                 n_dhcp4_c_log(connection->client_config, LOG_INFO,
-                              "sent %s of %s to %s",
+                              "send %s of %s to %s%s",
                               message_type_to_str(request->userdata.message_type),
                               inet_ntop(AF_INET, &request->userdata.client_addr,
                                         client_addr, sizeof(client_addr)),
                               broadcast ?
                               "255.255.255.255" :
                               inet_ntop(AF_INET, &connection->server_ip,
-                                        server_addr, sizeof(server_addr)));
+                                        server_addr, sizeof(server_addr)),
+                              error_msg);
         }
 
         ++request->userdata.n_send;
-- 
2.24.1