summaryrefslogtreecommitdiff
path: root/src/libsystemd-network/sd-dhcp-client.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-12-09 04:30:54 +0900
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2021-12-09 09:10:51 +0100
commitab8a8a4e7721270196f9c7984223fcff41754780 (patch)
tree884302f6abe08f4dc6fab178bc0e6ed10e73602f /src/libsystemd-network/sd-dhcp-client.c
parentd2d602f4b4c1614c35000dd6a5c351c482902ee4 (diff)
downloadsystemd-ab8a8a4e7721270196f9c7984223fcff41754780.tar.gz
libsystemd-network: ignore -ENETDOWN or friends in recv()
And this makes most errors in io events ignored.
Diffstat (limited to 'src/libsystemd-network/sd-dhcp-client.c')
-rw-r--r--src/libsystemd-network/sd-dhcp-client.c41
1 files changed, 23 insertions, 18 deletions
diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c
index 14cbde133f..16574d28c7 100644
--- a/src/libsystemd-network/sd-dhcp-client.c
+++ b/src/libsystemd-network/sd-dhcp-client.c
@@ -1930,13 +1930,13 @@ static int client_receive_message_udp(
assert(client);
buflen = next_datagram_size_fd(fd);
- if (buflen == -ENETDOWN)
- /* the link is down. Don't return an error or the I/O event
- source will be disconnected and we won't be able to receive
- packets again when the link comes back. */
+ if (buflen < 0) {
+ if (ERRNO_IS_TRANSIENT(buflen) || ERRNO_IS_DISCONNECT(buflen))
+ return 0;
+
+ log_dhcp_client_errno(client, buflen, "Failed to determine datagram size to read, ignoring: %m");
return 0;
- if (buflen < 0)
- return buflen;
+ }
message = malloc0(buflen);
if (!message)
@@ -1944,12 +1944,11 @@ static int client_receive_message_udp(
len = recv(fd, message, buflen, 0);
if (len < 0) {
- /* see comment above for why we shouldn't error out on ENETDOWN. */
- if (ERRNO_IS_TRANSIENT(errno) || errno == ENETDOWN)
+ if (ERRNO_IS_TRANSIENT(errno) || ERRNO_IS_DISCONNECT(errno))
return 0;
- return log_dhcp_client_errno(client, errno,
- "Could not receive message from UDP socket: %m");
+ log_dhcp_client_errno(client, errno, "Could not receive message from UDP socket, ignoring: %m");
+ return 0;
}
if ((size_t) len < sizeof(DHCPMessage)) {
log_dhcp_client(client, "Too small to be a DHCP message: ignoring");
@@ -1995,7 +1994,8 @@ static int client_receive_message_udp(
return 0;
}
- return client_handle_message(client, message, len);
+ (void) client_handle_message(client, message, len);
+ return 0;
}
static int client_receive_message_raw(
@@ -2023,10 +2023,13 @@ static int client_receive_message_raw(
assert(client);
buflen = next_datagram_size_fd(fd);
- if (buflen == -ENETDOWN)
+ if (buflen < 0) {
+ if (ERRNO_IS_TRANSIENT(buflen) || ERRNO_IS_DISCONNECT(buflen))
+ return 0;
+
+ log_dhcp_client_errno(client, buflen, "Failed to determine datagram size to read, ignoring: %m");
return 0;
- if (buflen < 0)
- return buflen;
+ }
packet = malloc0(buflen);
if (!packet)
@@ -2036,10 +2039,11 @@ static int client_receive_message_raw(
len = recvmsg_safe(fd, &msg, 0);
if (len < 0) {
- if (ERRNO_IS_TRANSIENT(len) || len == -ENETDOWN)
+ if (ERRNO_IS_TRANSIENT(len) || ERRNO_IS_DISCONNECT(len))
return 0;
- return log_dhcp_client_errno(client, len,
- "Could not receive message from raw socket: %m");
+
+ log_dhcp_client_errno(client, len, "Could not receive message from raw socket, ignoring: %m");
+ return 0;
}
if ((size_t) len < sizeof(DHCPPacket))
return 0;
@@ -2056,7 +2060,8 @@ static int client_receive_message_raw(
len -= DHCP_IP_UDP_SIZE;
- return client_handle_message(client, &packet->dhcp, len);
+ (void) client_handle_message(client, &packet->dhcp, len);
+ return 0;
}
int sd_dhcp_client_send_renew(sd_dhcp_client *client) {