summaryrefslogtreecommitdiff
path: root/src/libsystemd-network/sd-radv.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-radv.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-radv.c')
-rw-r--r--src/libsystemd-network/sd-radv.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/libsystemd-network/sd-radv.c b/src/libsystemd-network/sd-radv.c
index 4f5dbf0090..f8ffb6358f 100644
--- a/src/libsystemd-network/sd-radv.c
+++ b/src/libsystemd-network/sd-radv.c
@@ -258,8 +258,13 @@ static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdat
assert(ra->event);
buflen = next_datagram_size_fd(fd);
- if (buflen < 0)
- return (int) buflen;
+ if (buflen < 0) {
+ if (ERRNO_IS_TRANSIENT(buflen) || ERRNO_IS_DISCONNECT(buflen))
+ return 0;
+
+ log_radv_errno(ra, buflen, "Failed to determine datagram size to read, ignoring: %m");
+ return 0;
+ }
buf = new0(char, buflen);
if (!buf)
@@ -267,6 +272,9 @@ static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdat
r = icmp6_receive(fd, buf, buflen, &src, &timestamp);
if (r < 0) {
+ if (ERRNO_IS_TRANSIENT(r) || ERRNO_IS_DISCONNECT(r))
+ return 0;
+
switch (r) {
case -EADDRNOTAVAIL:
(void) in_addr_to_string(AF_INET6, (const union in_addr_union*) &src, &addr);
@@ -281,11 +289,8 @@ static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdat
log_radv(ra, "Received invalid source address from ICMPv6 socket. Ignoring.");
break;
- case -EAGAIN: /* ignore spurious wakeups */
- break;
-
default:
- log_radv_errno(ra, r, "Unexpected error receiving from ICMPv6 socket, Ignoring: %m");
+ log_radv_errno(ra, r, "Unexpected error receiving from ICMPv6 socket, ignoring: %m");
break;
}