From 2a1e890943a19c21d60f6c0e7efbca8a93db8ff3 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 16 Apr 2024 19:00:15 +0900 Subject: [PATCH] sd-radv: reset timer on sending unsolicited RA Addresses https://github.com/systemd/systemd/pull/32267#discussion_r1567078807. --- src/libsystemd-network/sd-radv.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libsystemd-network/sd-radv.c b/src/libsystemd-network/sd-radv.c index 4fae865e95d..cc8d144e6dd 100644 --- a/src/libsystemd-network/sd-radv.c +++ b/src/libsystemd-network/sd-radv.c @@ -279,11 +279,13 @@ static int radv_process_packet(sd_radv *ra, ICMP6Packet *packet) { if (r < 0) return r; - struct in6_addr src = {}; + struct in6_addr src; r = sd_ndisc_router_solicit_get_sender_address(rs, &src); - if (r < 0 && r != -ENODATA) /* null address is allowed */ + if (r == -ENODATA) /* null address is allowed */ + return sd_radv_send(ra); /* When an unsolicited RA, we need to also update timer. */ + if (r < 0) return log_radv_errno(ra, r, "Failed to get sender address of RS, ignoring: %m"); - if (r >= 0 && in6_addr_equal(&src, &ra->ipv6ll)) + if (in6_addr_equal(&src, &ra->ipv6ll)) /* This should be definitely caused by a misconfiguration. If we send RA to ourself, the * kernel complains about that. Let's ignore the packet. */ return log_radv_errno(ra, SYNTHETIC_ERRNO(EADDRINUSE), "Received RS from the same interface, ignoring.");