]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: radv: add RouteMetric= setting in [IPv6Prefix]
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 17 Apr 2021 17:49:15 +0000 (02:49 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 21 Apr 2021 04:55:02 +0000 (13:55 +0900)
man/systemd.network.xml
src/network/networkd-address.c
src/network/networkd-network-gperf.gperf
src/network/networkd-radv.c
src/network/networkd-radv.h
test/fuzz/fuzz-network-parser/directives.network

index 7a47132336d224deff2bb5ed4be7036e30dbf5c9..128ade5b34e2387aaa4d38eeca5c60e82160af5e 100644 (file)
@@ -2582,6 +2582,15 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
         <listitem><para>Takes a boolean. When true, adds an address from the prefix. Default to false.
         </para></listitem>
       </varlistentry>
+
+      <varlistentry>
+        <term><varname>RouteMetric=</varname></term>
+        <listitem>
+          <para>The metric of the prefix route. Takes an unsigned integer in the range 0…4294967295.
+          When unset or set to 0, the kernel's default value is used. This setting is ignored when
+          <varname>Assign=</varname> is false.</para>
+        </listitem>
+      </varlistentry>
     </variablelist>
     </refsect1>
 
index 145bc25190a22dce10ebb6c30f0ddc8c95684910..e589fff150d21c3d6cc0a8bb28f46f3eda17ad23 100644 (file)
@@ -1095,6 +1095,7 @@ int link_set_addresses(Link *link) {
                         return log_link_warning_errno(link, r, "Could not generate EUI64 address: %m");
 
                 address->family = AF_INET6;
+                address->route_metric = p->route_metric;
                 r = static_address_configure(address, link);
                 if (r < 0)
                         return r;
index 50aab8de6d11335b91b30552dbd2516fef442832..568c34f51bd573c2be35eea6de952188eb960979 100644 (file)
@@ -325,6 +325,7 @@ IPv6Prefix.AddressAutoconfiguration,         config_parse_prefix_flags,
 IPv6Prefix.ValidLifetimeSec,                 config_parse_prefix_lifetime,                             0,                             0
 IPv6Prefix.PreferredLifetimeSec,             config_parse_prefix_lifetime,                             0,                             0
 IPv6Prefix.Assign,                           config_parse_prefix_assign,                               0,                             0
+IPv6Prefix.RouteMetric,                      config_parse_prefix_metric,                               0,                             0
 IPv6RoutePrefix.Route,                       config_parse_route_prefix,                                0,                             0
 IPv6RoutePrefix.LifetimeSec,                 config_parse_route_prefix_lifetime,                       0,                             0
 LLDP.MUDURL,                                 config_parse_lldp_mud,                                    0,                             0
index 19f75e01da5b25b995d0929ea1dee4dd940bd82a..52c9afcc5e3eb003b0746e6dd0a120321c920f37 100644 (file)
@@ -382,6 +382,45 @@ int config_parse_prefix_assign(
         return 0;
 }
 
+int config_parse_prefix_metric(
+                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_(prefix_free_or_set_invalidp) Prefix *p = NULL;
+        int r;
+
+        assert(filename);
+        assert(section);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = prefix_new_static(network, filename, section_line, &p);
+        if (r < 0)
+                return log_oom();
+
+        r = safe_atou32(rvalue, &p->route_metric);
+        if (r < 0) {
+                log_syntax(unit, LOG_WARNING, filename, line, r,
+                           "Failed to parse %s=, ignoring assignment: %s",
+                           lvalue, rvalue);
+                return 0;
+        }
+
+        TAKE_PTR(p);
+
+        return 0;
+}
+
 int config_parse_route_prefix(
                 const char *unit,
                 const char *filename,
index 73d2f245452b2ba619c1d3438dbba9198e5d0d2a..f6efd326979b3d440c2759e8bde2df6b936fa655 100644 (file)
@@ -33,6 +33,7 @@ typedef struct Prefix {
         sd_radv_prefix *radv_prefix;
 
         bool assign;
+        uint32_t route_metric;
 } Prefix;
 
 typedef struct RoutePrefix {
@@ -64,6 +65,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_prefix);
 CONFIG_PARSER_PROTOTYPE(config_parse_prefix_flags);
 CONFIG_PARSER_PROTOTYPE(config_parse_prefix_lifetime);
 CONFIG_PARSER_PROTOTYPE(config_parse_prefix_assign);
+CONFIG_PARSER_PROTOTYPE(config_parse_prefix_metric);
 CONFIG_PARSER_PROTOTYPE(config_parse_radv_dns);
 CONFIG_PARSER_PROTOTYPE(config_parse_radv_search_domains);
 CONFIG_PARSER_PROTOTYPE(config_parse_route_prefix);
index 467854728e2e4ca8e2509da8723aa5e58a03cc0e..e5acc5d67d2618745865ee1478a38928eb62bbef 100644 (file)
@@ -237,6 +237,7 @@ PreferredLifetimeSec=
 AddressAutoconfiguration=
 ValidLifetimeSec=
 Assign=
+RouteMetric=
 [IPv6RoutePrefix]
 Route=
 LifetimeSec=