]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-radv: reset timer on sending unsolicited RA 32345/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 16 Apr 2024 10:00:15 +0000 (19:00 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 19 Apr 2024 03:05:41 +0000 (12:05 +0900)
Addresses https://github.com/systemd/systemd/pull/32267#discussion_r1567078807.

src/libsystemd-network/sd-radv.c

index 4fae865e95dbab2f0c53f2cfd0670849aa591ab7..cc8d144e6dd4189b81a71268e15ffce915b15db9 100644 (file)
@@ -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.");