]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network/radv: introduce ReachableTimeSec= setting
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 21 Feb 2024 05:08:57 +0000 (14:08 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 22 Apr 2024 09:41:37 +0000 (18:41 +0900)
To make the reachable time in the RA header sent by networkd
configurable.

man/systemd.network.xml
src/libsystemd-network/radv-internal.h
src/network/networkd-network-gperf.gperf
src/network/networkd-network.h
src/network/networkd-radv.c
src/network/networkd-radv.h

index 916eb5bffe7233fc55c0352615facb73e6c28ee6..8d7aa2127a9a0e5a19614f5cf6fb053579bb363f 100644 (file)
@@ -4017,6 +4017,19 @@ ServerAddress=192.168.0.1/24</programlisting>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>ReachableTimeSec=</varname></term>
+
+        <listitem>
+          <para>Configures the time, used in the Neighbor Unreachability Detection algorithm, for which
+          clients can assume a neighbor is reachable after having received a reachability confirmation. Takes
+          a time span in the range 0…4294967295 ms. When 0, clients will handle it as if the value wasn't
+          specified. Defaults to 0.</para>
+
+          <xi:include href="version-info.xml" xpointer="v256"/>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>RetransmitSec=</varname></term>
 
index cc64630d2e72c945e14dca6611376e4cabb4a7e5..0a535ddf4bd41e10101132dfe198f06594dd31f1 100644 (file)
 #define RADV_MAX_ROUTER_LIFETIME_USEC             (9000 * USEC_PER_SEC)
 #define RADV_DEFAULT_ROUTER_LIFETIME_USEC         (3 * RADV_DEFAULT_MAX_TIMEOUT_USEC)
 /* RFC 4861 section 4.2.
- * Retrans Timer
+ * Reachable Time and Retrans Timer
  * 32-bit unsigned integer. The time, in milliseconds. */
-#define RADV_MAX_RETRANSMIT_USEC                  (UINT32_MAX * USEC_PER_MSEC)
+#define RADV_MAX_UINT32_MSEC_USEC                 (UINT32_MAX * USEC_PER_MSEC)
+#define RADV_MAX_REACHABLE_TIME_USEC              RADV_MAX_UINT32_MSEC_USEC
+#define RADV_MAX_RETRANSMIT_USEC                  RADV_MAX_UINT32_MSEC_USEC
 /* draft-ietf-6man-slaac-renum-02 section 4.1.1.
  * AdvPreferredLifetime: max(AdvDefaultLifetime, 3 * MaxRtrAdvInterval)
  * AdvValidLifetime: 2 * AdvPreferredLifetime */
index 62f11c5c5c91823dec1f2c900e3bf37e8bed3e4a..4124b3270fe2b49f991a03bbc076b1769d4853c3 100644 (file)
@@ -393,7 +393,8 @@ DHCPPrefixDelegation.RouteMetric,            config_parse_uint32,
 DHCPPrefixDelegation.NetLabel,               config_parse_string,                                      CONFIG_PARSE_STRING_SAFE,      offsetof(Network, dhcp_pd_netlabel)
 DHCPPrefixDelegation.NFTSet,                 config_parse_nft_set,                                     NFT_SET_PARSE_NETWORK,         offsetof(Network, dhcp_pd_nft_set_context)
 IPv6SendRA.RouterLifetimeSec,                config_parse_router_lifetime,                             0,                             offsetof(Network, router_lifetime_usec)
-IPv6SendRA.RetransmitSec,                    config_parse_router_retransmit,                           0,                             offsetof(Network, router_retransmit_usec)
+IPv6SendRA.ReachableTimeSec,                 config_parse_router_uint32_msec_usec,                     0,                             offsetof(Network, router_reachable_usec)
+IPv6SendRA.RetransmitSec,                    config_parse_router_uint32_msec_usec,                     0,                             offsetof(Network, router_retransmit_usec)
 IPv6SendRA.Managed,                          config_parse_bool,                                        0,                             offsetof(Network, router_managed)
 IPv6SendRA.OtherInformation,                 config_parse_bool,                                        0,                             offsetof(Network, router_other_information)
 IPv6SendRA.RouterPreference,                 config_parse_router_preference,                           0,                             0
index c8573e097342d75fac3db7dc6013bf3db6ea1bc0..92d367eccf8eab983484dc6028f5367196a6f36b 100644 (file)
@@ -246,6 +246,7 @@ struct Network {
         RADVPrefixDelegation router_prefix_delegation;
         usec_t router_lifetime_usec;
         uint8_t router_preference;
+        usec_t router_reachable_usec;
         usec_t router_retransmit_usec;
         uint8_t router_hop_limit;
         bool router_managed;
index fa5884a6c354db1b4d35733e4c3c29e862365319..0f0f3a34ce9a65dfdc1aecfa0edb2cae0dc13f5b 100644 (file)
@@ -577,6 +577,10 @@ static int radv_configure(Link *link) {
                         return r;
         }
 
+        r = sd_radv_set_reachable_time(link->radv, link->network->router_reachable_usec);
+        if (r < 0)
+                return r;
+
         if (link->network->router_retransmit_usec > 0) {
                 r = sd_radv_set_retransmit(link->radv, link->network->router_retransmit_usec);
                 if (r < 0)
@@ -1496,7 +1500,7 @@ int config_parse_router_lifetime(
         return 0;
 }
 
-int config_parse_router_retransmit(
+int config_parse_router_uint32_msec_usec(
                 const char *unit,
                 const char *filename,
                 unsigned line,
@@ -1508,7 +1512,7 @@ int config_parse_router_retransmit(
                 void *data,
                 void *userdata) {
 
-        usec_t usec, *router_retransmit_usec = ASSERT_PTR(data);
+        usec_t usec, *router_usec = ASSERT_PTR(data);
         int r;
 
         assert(filename);
@@ -1517,7 +1521,7 @@ int config_parse_router_retransmit(
         assert(rvalue);
 
         if (isempty(rvalue)) {
-                *router_retransmit_usec = 0;
+                *router_usec = 0;
                 return 0;
         }
 
@@ -1529,13 +1533,13 @@ int config_parse_router_retransmit(
         }
 
         if (usec != USEC_INFINITY &&
-            usec > RADV_MAX_RETRANSMIT_USEC) {
+            usec > RADV_MAX_UINT32_MSEC_USEC) {
                 log_syntax(unit, LOG_WARNING, filename, line, 0,
                            "Invalid [%s] %s=, ignoring assignment: %s", section, lvalue, rvalue);
                 return 0;
         }
 
-        *router_retransmit_usec = usec;
+        *router_usec = usec;
         return 0;
 }
 
index 94834e77a8e0d10a91335ba3f4dc262f31b09233..dcb8cfb304e550e3cfe07868bc20b6aa9ac02508 100644 (file)
@@ -86,7 +86,7 @@ RADVPrefixDelegation radv_prefix_delegation_from_string(const char *s) _pure_;
 
 CONFIG_PARSER_PROTOTYPE(config_parse_router_prefix_delegation);
 CONFIG_PARSER_PROTOTYPE(config_parse_router_lifetime);
-CONFIG_PARSER_PROTOTYPE(config_parse_router_retransmit);
+CONFIG_PARSER_PROTOTYPE(config_parse_router_uint32_msec_usec);
 CONFIG_PARSER_PROTOTYPE(config_parse_router_preference);
 CONFIG_PARSER_PROTOTYPE(config_parse_prefix);
 CONFIG_PARSER_PROTOTYPE(config_parse_prefix_boolean);