]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: Route - allow to set TCP RTO
authorSusant Sahani <ssahani@gmail.com>
Thu, 17 Aug 2023 12:07:14 +0000 (17:37 +0530)
committerSusant Sahani <ssahani@gmail.com>
Thu, 17 Aug 2023 18:17:13 +0000 (23:47 +0530)
man/systemd.network.xml
src/network/networkd-network-gperf.gperf
src/network/networkd-route.c
src/network/networkd-route.h

index b4fb051be3482e59eddb9a4ee81d010de2272469..2d9596dfe46fcaa6973889b1c3ae7e2bca6edd0e 100644 (file)
@@ -1719,6 +1719,15 @@ allow my_server_t localnet_peer_t:peer recv;</programlisting>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>TCPRetransmissionTimeOutSec=</varname></term>
+        <listitem>
+          <para>Specifies the TCP Retransmission Time Out for the route. Takes time values in seconds.
+            This value specifies the timeout of an alive TCP connection, when RTO retransmissions remain unacknowledged.
+            When unset, the kernel's default will be used.</para>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>MultiPathRoute=<replaceable>address</replaceable>[@<replaceable>name</replaceable>] [<replaceable>weight</replaceable>]</varname></term>
         <listitem>
index 0f87ce24bb46ffb465605654d1e5b22430f32a36..d0214d131a19c19e0bdca000c305ef43c285ac9c 100644 (file)
@@ -196,6 +196,7 @@ Route.GatewayOnlink,                         config_parse_route_boolean,
 Route.IPv6Preference,                        config_parse_ipv6_route_preference,                       0,                             0
 Route.Protocol,                              config_parse_route_protocol,                              0,                             0
 Route.Type,                                  config_parse_route_type,                                  0,                             0
+Route.TCPRetransmissionTimeOutSec,           config_parse_route_tcp_rto,                               0,                             0
 Route.InitialCongestionWindow,               config_parse_route_tcp_window,                            0,                             0
 Route.InitialAdvertisedReceiveWindow,        config_parse_route_tcp_window,                            0,                             0
 Route.TCPAdvertisedMaximumSegmentSize,       config_parse_tcp_advmss,                                  0,                             0
index 5bb2388b410c74157d23bce59afab392700bd5a5..a13ec8180699a0f787c1c7f14804988f663be2b5 100644 (file)
@@ -1247,6 +1247,12 @@ static int route_configure(const Route *route, uint32_t lifetime_sec, Link *link
                         return r;
         }
 
+        if (route->tcp_rto_usec > 0) {
+                r = sd_netlink_message_append_u32(m, RTAX_RTO_MIN, route->tcp_rto_usec / USEC_PER_MSEC);
+                if (r < 0)
+                        return r;
+        }
+
         r = sd_netlink_message_close_container(m);
         if (r < 0)
                 return r;
@@ -2752,6 +2758,58 @@ int config_parse_route_mtu(
         return 0;
 }
 
+int config_parse_route_tcp_rto(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        Network *network = userdata;
+        _cleanup_(route_free_or_set_invalidp) Route *n = NULL;
+        usec_t usec;
+        int r;
+
+        assert(filename);
+        assert(section);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = route_new_static(network, filename, section_line, &n);
+        if (r == -ENOMEM)
+                return log_oom();
+        if (r < 0) {
+                log_syntax(unit, LOG_WARNING, filename, line, r,
+                           "Failed to allocate route, ignoring assignment: %m");
+                return 0;
+        }
+
+        r = parse_sec(rvalue, &usec);
+        if (r < 0) {
+                log_syntax(unit, LOG_WARNING, filename, line, r,
+                           "Failed to parse route TCP retransmission time out (RTO) sec '%s', ignoring: %m", rvalue);
+                return 0;
+        }
+
+        if (usec != USEC_INFINITY &&
+            DIV_ROUND_UP(usec, USEC_PER_SEC) > UINT32_MAX) {
+                log_syntax(unit, LOG_WARNING, filename, line, 0,
+                           "Route TCP retransmission time out (RTO) = must be in the range 0...%"PRIu32"ms, ignoring: %s", UINT32_MAX, rvalue);
+                return 0;
+        }
+
+        n->tcp_rto_usec = usec;
+
+        TAKE_PTR(n);
+        return 0;
+}
+
 int config_parse_multipath_route(
                 const char *unit,
                 const char *filename,
index 0ecabc26477bdb28686fbb458d28ea0f4e310a8c..f64d081fe26db1187d924f30e0c77279d3810bfa 100644 (file)
@@ -56,6 +56,7 @@ struct Route {
         unsigned flags;
         int gateway_onlink; /* Only used in conf parser and route_section_verify(). */
         uint32_t nexthop_id;
+        usec_t tcp_rto_usec;
 
         bool scope_set:1;
         bool table_set:1;
@@ -125,6 +126,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_route_protocol);
 CONFIG_PARSER_PROTOTYPE(config_parse_route_type);
 CONFIG_PARSER_PROTOTYPE(config_parse_route_tcp_window);
 CONFIG_PARSER_PROTOTYPE(config_parse_tcp_window);
+CONFIG_PARSER_PROTOTYPE(config_parse_route_tcp_rto);
 CONFIG_PARSER_PROTOTYPE(config_parse_route_mtu);
 CONFIG_PARSER_PROTOTYPE(config_parse_multipath_route);
 CONFIG_PARSER_PROTOTYPE(config_parse_tcp_congestion);