summaryrefslogtreecommitdiff
path: root/src/network
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2023-01-17 13:20:13 +0900
committerLuca Boccassi <luca.boccassi@gmail.com>2023-01-19 12:36:26 +0000
commit5908d864250c7456de4bab169fbcb6cbf85888de (patch)
treec90937c085bfa78a8fc99577d1a454ee7e511875 /src/network
parentd7efb170688f7704f4406ad6c0ca4cda675bad6a (diff)
downloadsystemd-5908d864250c7456de4bab169fbcb6cbf85888de.tar.gz
network: do not enter failed state when received an invalid RA
Fixes the issue reported at https://github.com/systemd/systemd/issues/25891#issuecomment-1368509262.
Diffstat (limited to 'src/network')
-rw-r--r--src/network/networkd-ndisc.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c
index ed9bb18599..99a07e16fc 100644
--- a/src/network/networkd-ndisc.c
+++ b/src/network/networkd-ndisc.c
@@ -817,31 +817,24 @@ static int ndisc_router_process_options(Link *link, sd_ndisc_router *rt) {
return log_link_error_errno(link, r, "Failed to get RA option type: %m");
switch (type) {
-
case SD_NDISC_OPTION_PREFIX_INFORMATION:
r = ndisc_router_process_prefix(link, rt);
- if (r < 0)
- return r;
break;
case SD_NDISC_OPTION_ROUTE_INFORMATION:
r = ndisc_router_process_route(link, rt);
- if (r < 0)
- return r;
break;
case SD_NDISC_OPTION_RDNSS:
r = ndisc_router_process_rdnss(link, rt);
- if (r < 0)
- return r;
break;
case SD_NDISC_OPTION_DNSSL:
r = ndisc_router_process_dnssl(link, rt);
- if (r < 0)
- return r;
break;
}
+ if (r < 0 && r != -EBADMSG)
+ return r;
}
}
@@ -1024,6 +1017,10 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
assert(rt);
r = sd_ndisc_router_get_address(rt, &router);
+ if (r == -ENODATA) {
+ log_link_debug(link, "Received RA without router address, ignoring.");
+ return 0;
+ }
if (r < 0)
return log_link_error_errno(link, r, "Failed to get router address from RA: %m");
@@ -1038,6 +1035,10 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
}
r = sd_ndisc_router_get_timestamp(rt, CLOCK_BOOTTIME, &timestamp_usec);
+ if (r == -ENODATA) {
+ log_link_debug(link, "Received RA without timestamp, ignoring.");
+ return 0;
+ }
if (r < 0)
return r;
@@ -1084,7 +1085,7 @@ static void ndisc_handler(sd_ndisc *nd, sd_ndisc_event_t event, sd_ndisc_router
case SD_NDISC_EVENT_ROUTER:
r = ndisc_router_handler(link, rt);
- if (r < 0) {
+ if (r < 0 && r != -EBADMSG) {
link_enter_failed(link);
return;
}