]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network/ndisc: split out ndisc_router_process_icmp6_ratelimit()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 5 Sep 2023 12:41:57 +0000 (21:41 +0900)
committerLuca Boccassi <luca.boccassi@gmail.com>
Tue, 5 Sep 2023 21:03:34 +0000 (22:03 +0100)
Otherwise, if ndisc_router_process_default() return earlier, e.g.
when Network.ipv6_accept_ra_use_gateway is false, then the
ratelimit is not applied.

src/network/networkd-ndisc.c

index f24f1f30fc054e919d2bfb2cb47595c5c2450ee9..00eac3477d86bdfa848f5fd0095d385a69fe6fda 100644 (file)
@@ -279,7 +279,6 @@ static int ndisc_request_address(Address *in, Link *link, sd_ndisc_router *rt) {
 
 static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
         usec_t lifetime_usec, timestamp_usec;
-        uint32_t icmp6_ratelimit = 0;
         struct in6_addr gateway;
         uint16_t lifetime_sec;
         unsigned preference;
@@ -360,20 +359,36 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
                         return log_link_warning_errno(link, r, "Could not request gateway: %m");
         }
 
-        r = sd_ndisc_router_get_icmp6_ratelimit(rt, &icmp6_ratelimit);
-        if (r < 0)
-                log_link_debug(link, "Failed to get default router preference from RA: %m");
+        return 0;
+}
 
-        if (icmp6_ratelimit > 0 && link->network->ipv6_accept_ra_use_icmp6_ratelimit) {
-                char buf[DECIMAL_STR_MAX(unsigned)];
+static int ndisc_router_process_icmp6_ratelimit(Link *link, sd_ndisc_router *rt) {
+        char buf[DECIMAL_STR_MAX(unsigned)];
+        uint32_t icmp6_ratelimit;
+        int r;
 
-                xsprintf(buf, "%u", icmp6_ratelimit);
+        assert(link);
+        assert(link->network);
+        assert(rt);
 
-                r = sysctl_write("net/ipv6/icmp/ratelimit", buf);
-                if (r < 0)
-                        log_link_warning_errno(link, r, "Could not configure icmp6 rate limit: %m");
+        if (!link->network->ipv6_accept_ra_use_icmp6_ratelimit)
+                return 0;
+
+        r = sd_ndisc_router_get_icmp6_ratelimit(rt, &icmp6_ratelimit);
+        if (r < 0) {
+                log_link_debug(link, "Failed to get ICMP6 ratelimit from RA, ignoring: %m");
+                return 0;
         }
 
+        if (icmp6_ratelimit == 0)
+                return 0;
+
+        xsprintf(buf, "%u", icmp6_ratelimit);
+
+        r = sysctl_write_ip_property(AF_INET6, NULL, "icmp/ratelimit", buf);
+        if (r < 0)
+                log_link_warning_errno(link, r, "Failed to apply ICMP6 ratelimit, ignoring: %m");
+
         return 0;
 }
 
@@ -1380,6 +1395,10 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
         if (r < 0)
                 return r;
 
+        r = ndisc_router_process_icmp6_ratelimit(link, rt);
+        if (r < 0)
+                return r;
+
         r = ndisc_router_process_options(link, rt);
         if (r < 0)
                 return r;