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

index 554d1f663ce40102dfa12415fbe1542ed0b95c74..38123508206fe9d0911340892f728f48319dfec3 100644 (file)
@@ -1099,6 +1099,15 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
             Defaults to <literal>global</literal>.</para>
           </listitem>
         </varlistentry>
+        <varlistentry>
+          <term><varname>RouteMetric=</varname></term>
+          <listitem>
+            <para>The metric of the prefix route, which is pointing to the subnet of the configured IP
+            address, taking the configured prefix length into account. Takes an unsigned integer in the
+            range 0…4294967295. When unset or set to 0, the kernel's default value is used. This
+            setting will be ignored when <varname>AddPrefixRoute=</varname> is false.</para>
+          </listitem>
+        </varlistentry>
         <varlistentry>
           <term><varname>HomeAddress=</varname></term>
           <listitem>
index 58b089901bae4d4c28be37786e07ecad2bc79874..145bc25190a22dce10ebb6c30f0ddc8c95684910 100644 (file)
@@ -918,6 +918,10 @@ int address_configure(
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not append IFA_CACHEINFO attribute: %m");
 
+        r = sd_netlink_message_append_u32(req, IFA_RT_PRIORITY, address->route_metric);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not append IFA_RT_PRIORITY attribute: %m");
+
         k = address_add(link, address, &a);
         if (k < 0)
                 return log_link_error_errno(link, k, "Could not add address: %m");
@@ -1801,6 +1805,48 @@ int config_parse_address_scope(
         return 0;
 }
 
+int config_parse_address_route_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_(address_free_or_set_invalidp) Address *n = NULL;
+        int r;
+
+        assert(filename);
+        assert(section);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = address_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 new address, ignoring assignment: %m");
+                return 0;
+        }
+
+        r = safe_atou32(rvalue, &n->route_metric);
+        if (r < 0) {
+                log_syntax(unit, LOG_WARNING, filename, line, r,
+                           "Could not parse %s=, ignoring assignment: %s", lvalue, rvalue);
+                return 0;
+        }
+
+        TAKE_PTR(n);
+        return 0;
+}
+
 int config_parse_duplicate_address_detection(
                 const char *unit,
                 const char *filename,
index e3ca868c2ee8d27e3377c46c683c6ea129e8fc2d..58f44cd4cd4e2530611f7d8ae1c4559773e93bb4 100644 (file)
@@ -28,6 +28,7 @@ typedef struct Address {
         unsigned char prefixlen;
         unsigned char scope;
         uint32_t flags;
+        uint32_t route_metric; /* route metric for prefix route */
         char *label;
 
         int set_broadcast;
@@ -83,6 +84,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_label);
 CONFIG_PARSER_PROTOTYPE(config_parse_lifetime);
 CONFIG_PARSER_PROTOTYPE(config_parse_address_flags);
 CONFIG_PARSER_PROTOTYPE(config_parse_address_scope);
+CONFIG_PARSER_PROTOTYPE(config_parse_address_route_metric);
 CONFIG_PARSER_PROTOTYPE(config_parse_duplicate_address_detection);
 
 #define IPV4_ADDRESS_FMT_STR     "%u.%u.%u.%u"
index 4fc368547c25cd3291aa25a485547049f68a7b8a..0e3361b052b0e19553b5065c9b7b8156e2974a5d 100644 (file)
@@ -146,6 +146,7 @@ Address.AddPrefixRoute,                      config_parse_address_flags,
 Address.AutoJoin,                            config_parse_address_flags,                               IFA_F_MCAUTOJOIN,              0
 Address.DuplicateAddressDetection,           config_parse_duplicate_address_detection,                 0,                             0
 Address.Scope,                               config_parse_address_scope,                               0,                             0
+Address.RouteMetric,                         config_parse_address_route_metric,                        0,                             0
 IPv6AddressLabel.Prefix,                     config_parse_address_label_prefix,                        0,                             0
 IPv6AddressLabel.Label,                      config_parse_address_label,                               0,                             0
 Neighbor.Address,                            config_parse_neighbor_address,                            0,                             0
index 158f0ffad11a011fb994739a0bd3a4f1b30fe986..dbb6effa95842c24fac23d7b1768a7674d539814 100644 (file)
@@ -270,6 +270,7 @@ ManageTemporaryAddress=
 Broadcast=
 Peer=
 Label=
+RouteMetric=
 [RoutingPolicyRule]
 Table=
 IncomingInterface=