diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-04-18 02:49:15 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-04-21 13:55:02 +0900 |
commit | 0e1fb1d09ac6c7507c8485ccd8cd0628454268f7 (patch) | |
tree | 2c5fa02dc7db94a7c5eedec2e5a99851d5766368 | |
parent | 9fe0b7b493bc3f878b047eba7d9360bbf9a24357 (diff) | |
download | systemd-0e1fb1d09ac6c7507c8485ccd8cd0628454268f7.tar.gz |
network: radv: add RouteMetric= setting in [IPv6Prefix]
-rw-r--r-- | man/systemd.network.xml | 9 | ||||
-rw-r--r-- | src/network/networkd-address.c | 1 | ||||
-rw-r--r-- | src/network/networkd-network-gperf.gperf | 1 | ||||
-rw-r--r-- | src/network/networkd-radv.c | 39 | ||||
-rw-r--r-- | src/network/networkd-radv.h | 2 | ||||
-rw-r--r-- | test/fuzz/fuzz-network-parser/directives.network | 1 |
6 files changed, 53 insertions, 0 deletions
diff --git a/man/systemd.network.xml b/man/systemd.network.xml index 7a47132336..128ade5b34 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -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> diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 145bc25190..e589fff150 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -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; diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 50aab8de6d..568c34f51b 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -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 diff --git a/src/network/networkd-radv.c b/src/network/networkd-radv.c index 19f75e01da..52c9afcc5e 100644 --- a/src/network/networkd-radv.c +++ b/src/network/networkd-radv.c @@ -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, diff --git a/src/network/networkd-radv.h b/src/network/networkd-radv.h index 73d2f24545..f6efd32697 100644 --- a/src/network/networkd-radv.h +++ b/src/network/networkd-radv.h @@ -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); diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network index 467854728e..e5acc5d67d 100644 --- a/test/fuzz/fuzz-network-parser/directives.network +++ b/test/fuzz/fuzz-network-parser/directives.network @@ -237,6 +237,7 @@ PreferredLifetimeSec= AddressAutoconfiguration= ValidLifetimeSec= Assign= +RouteMetric= [IPv6RoutePrefix] Route= LifetimeSec= |