]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: static route - Allow to configure per route hop liimt
authorSusant Sahani <ssahani@gmail.com>
Wed, 16 Aug 2023 17:07:48 +0000 (22:37 +0530)
committerSusant Sahani <ssahani@gmail.com>
Fri, 18 Aug 2023 09:16:37 +0000 (14:46 +0530)
man/systemd.network.xml
src/network/networkd-network-gperf.gperf
src/network/networkd-route.c
src/network/networkd-route.h

index 2d9596dfe46fcaa6973889b1c3ae7e2bca6edd0e..db9a9ac25d437b9c39174427df4a639318f2badd 100644 (file)
@@ -1617,6 +1617,13 @@ allow my_server_t localnet_peer_t:peer recv;</programlisting>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>HopLimit=</varname></term>
+        <listitem>
+          <para> Configures per route hop limit. See also <varname>IPv6HopLimit=</varname>.</para>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>Protocol=</varname></term>
         <listitem>
index d0214d131a19c19e0bdca000c305ef43c285ac9c..c3f286e8bd358a52beacb24ad9e381010b31518f 100644 (file)
@@ -197,6 +197,7 @@ Route.IPv6Preference,                        config_parse_ipv6_route_preference,
 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.HopLimit,                              config_parse_route_hop_limit,                             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 a13ec8180699a0f787c1c7f14804988f663be2b5..7af697c16d25ec8c7ca38014b83a9bbb7d895a0d 100644 (file)
@@ -2532,6 +2532,67 @@ int config_parse_route_type(
         return 0;
 }
 
+int config_parse_route_hop_limit(
+                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) {
+
+        _cleanup_(route_free_or_set_invalidp) Route *n = NULL;
+        Network *network = userdata;
+        uint32_t k;
+        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;
+        }
+
+        if (isempty(rvalue)) {
+                n->hop_limit = 0;
+                TAKE_PTR(n);
+                return 0;
+        }
+
+        r = safe_atou32(rvalue, &k);
+        if (r < 0) {
+                log_syntax(unit, LOG_WARNING, filename, line, r,
+                           "Could not parse route hop limit %s \"%s\", ignoring assignment: %m", lvalue, rvalue);
+                return 0;
+        }
+        if (k > 255) {
+                log_syntax(unit, LOG_WARNING, filename, line, 0,
+                           "Specified route hop limit %s \"%s\" is too large, ignoring assignment: %m", lvalue, rvalue);
+                return 0;
+        }
+        if (k == 0) {
+                log_syntax(unit, LOG_WARNING, filename, line, 0,
+                           "Invalid route hop limit %s \"%s\", ignoring assignment: %m", lvalue, rvalue);
+                return 0;
+        }
+
+        n->hop_limit = k;
+
+        TAKE_PTR(n);
+        return 0;
+}
+
 int config_parse_tcp_congestion(
                 const char *unit,
                 const char *filename,
index f64d081fe26db1187d924f30e0c77279d3810bfa..3d85889a2fa753291a123ee1b3724f946b8cc146 100644 (file)
@@ -125,6 +125,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_ipv6_route_preference);
 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_route_hop_limit);
 CONFIG_PARSER_PROTOTYPE(config_parse_tcp_window);
 CONFIG_PARSER_PROTOTYPE(config_parse_route_tcp_rto);
 CONFIG_PARSER_PROTOTYPE(config_parse_route_mtu);