From 85e865082767c84ea689a74006947693f06b69af Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 14 Dec 2021 13:12:41 +0900 Subject: [PATCH 1/6] unit: run network-generator before starting udevd Otherwise, .link files generated by the service may not be loaded by udevd. --- units/systemd-network-generator.service.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/units/systemd-network-generator.service.in b/units/systemd-network-generator.service.in index 2799de0844..6c65efa20e 100644 --- a/units/systemd-network-generator.service.in +++ b/units/systemd-network-generator.service.in @@ -11,7 +11,7 @@ Description=Generate network units from Kernel command line Documentation=man:systemd-network-generator.service(8) DefaultDependencies=no -Before=network-pre.target +Before=network-pre.target systemd-udevd.service Wants=network-pre.target [Service] From 987dd89c775815831ae21736fe60aef59cb7a6fa Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 16 Dec 2021 01:51:22 +0900 Subject: [PATCH 2/6] meson: build network-generator unconditionally The service also generates .link files for udevd. --- man/rules/meson.build | 5 +--- man/systemd-network-generator.service.xml | 2 +- meson.build | 28 +++++++++++------------ units/meson.build | 2 +- 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/man/rules/meson.build b/man/rules/meson.build index 9513d7e059..ca19dc73e7 100644 --- a/man/rules/meson.build +++ b/man/rules/meson.build @@ -929,10 +929,7 @@ manpages = [ ''], ['systemd-modules-load.service', '8', ['systemd-modules-load'], 'HAVE_KMOD'], ['systemd-mount', '1', ['systemd-umount'], ''], - ['systemd-network-generator.service', - '8', - ['systemd-network-generator'], - 'ENABLE_NETWORKD'], + ['systemd-network-generator.service', '8', ['systemd-network-generator'], ''], ['systemd-networkd-wait-online.service', '8', ['systemd-networkd-wait-online'], diff --git a/man/systemd-network-generator.service.xml b/man/systemd-network-generator.service.xml index 67567c4099..99a032179e 100644 --- a/man/systemd-network-generator.service.xml +++ b/man/systemd-network-generator.service.xml @@ -3,7 +3,7 @@ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"> - + systemd-network-generator.service diff --git a/meson.build b/meson.build index 94bc49ed63..f885118807 100644 --- a/meson.build +++ b/meson.build @@ -3467,22 +3467,22 @@ if conf.get('ENABLE_NETWORKD') == 1 install_rpath : rootlibexecdir, install : true, install_dir : rootbindir) +endif - exe = executable( - 'systemd-network-generator', - network_generator_sources, - include_directories : includes, - link_with : [networkd_link_with], - install_rpath : rootlibexecdir, - install : true, - install_dir : rootlibexecdir) +exe = executable( + 'systemd-network-generator', + network_generator_sources, + include_directories : includes, + link_with : [networkd_link_with], + install_rpath : rootlibexecdir, + install : true, + install_dir : rootlibexecdir) - if want_tests != 'false' - test('test-network-generator-conversion', - test_network_generator_conversion_sh, - # https://github.com/mesonbuild/meson/issues/2681 - args : exe.full_path()) - endif +if want_tests != 'false' + test('test-network-generator-conversion', + test_network_generator_conversion_sh, + # https://github.com/mesonbuild/meson/issues/2681 + args : exe.full_path()) endif executable( diff --git a/units/meson.build b/units/meson.build index 903443a85d..a9bf28f6d9 100644 --- a/units/meson.build +++ b/units/meson.build @@ -217,7 +217,7 @@ in_units = [ 'dbus-org.freedesktop.machine1.service'], ['systemd-modules-load.service', 'HAVE_KMOD', 'sysinit.target.wants/'], - ['systemd-network-generator.service', 'ENABLE_NETWORKD'], + ['systemd-network-generator.service', ''], ['systemd-networkd.service', 'ENABLE_NETWORKD'], ['systemd-networkd-wait-online.service', 'ENABLE_NETWORKD'], ['systemd-nspawn@.service', ''], From eb3e86ae2c62570d0a138ef15a120f1be183f192 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 14 Dec 2021 10:38:02 +0900 Subject: [PATCH 3/6] network-generator: support MAC address longer or shorter than ETH_ALEN --- src/network/generator/network-generator.c | 16 ++++++++++------ src/network/generator/network-generator.h | 6 ++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/network/generator/network-generator.c b/src/network/generator/network-generator.c index 4a4ac3ed39..67480974e8 100644 --- a/src/network/generator/network-generator.c +++ b/src/network/generator/network-generator.c @@ -1,6 +1,5 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ -#include "ether-addr-util.h" #include "fd-util.h" #include "fileio.h" #include "hostname-util.h" @@ -270,7 +269,12 @@ static Link *link_free(Link *link) { DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free); -static int link_new(Context *context, const char *name, struct ether_addr *mac, Link **ret) { +static int link_new( + Context *context, + const char *name, + const struct hw_addr_data *mac, + Link **ret) { + _cleanup_(link_freep) Link *link = NULL; _cleanup_free_ char *ifname = NULL; int r; @@ -896,7 +900,7 @@ static int parse_cmdline_bond(Context *context, const char *key, const char *val } static int parse_cmdline_ifname(Context *context, const char *key, const char *value) { - struct ether_addr mac; + struct hw_addr_data mac; const char *name, *p; int r; @@ -911,7 +915,7 @@ static int parse_cmdline_ifname(Context *context, const char *key, const char *v name = strndupa_safe(value, p - value); - r = parse_ether_addr(p + 1, &mac); + r = parse_hw_addr(p + 1, &mac); if (r < 0) return r; @@ -1117,8 +1121,8 @@ void link_dump(Link *link, FILE *f) { fputs("[Match]\n", f); - if (!ether_addr_is_null(&link->mac)) - fprintf(f, "MACAddress=%s\n", ETHER_ADDR_TO_STR(&link->mac)); + if (!hw_addr_is_null(&link->mac)) + fprintf(f, "MACAddress=%s\n", HW_ADDR_TO_STR(&link->mac)); fprintf(f, "\n[Link]\n" diff --git a/src/network/generator/network-generator.h b/src/network/generator/network-generator.h index 25c8816bbe..deaa40f8f3 100644 --- a/src/network/generator/network-generator.h +++ b/src/network/generator/network-generator.h @@ -1,9 +1,9 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include #include +#include "ether-addr-util.h" #include "hashmap.h" #include "in-addr-util.h" #include "list.h" @@ -82,8 +82,10 @@ struct NetDev { struct Link { /* [Match] */ + struct hw_addr_data mac; + + /* [Link] */ char *ifname; - struct ether_addr mac; }; typedef struct Context { From ff516b4341eb869b450ab0c0e0d7fd0bd555e99f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 14 Dec 2021 11:26:44 +0900 Subject: [PATCH 4/6] udev: move NamePolicy to netif-naming-scheme.[ch] --- src/shared/netif-naming-scheme.c | 23 +++++++++++++++++++++++ src/shared/netif-naming-scheme.h | 18 ++++++++++++++++++ src/udev/net/link-config.c | 21 --------------------- src/udev/net/link-config.h | 19 +------------------ 4 files changed, 42 insertions(+), 39 deletions(-) diff --git a/src/shared/netif-naming-scheme.c b/src/shared/netif-naming-scheme.c index 8d03e0e5e7..245466c4cb 100644 --- a/src/shared/netif-naming-scheme.c +++ b/src/shared/netif-naming-scheme.c @@ -4,6 +4,7 @@ #include "netif-naming-scheme.h" #include "proc-cmdline.h" #include "string-util.h" +#include "string-table.h" #ifdef _DEFAULT_NET_NAMING_SCHEME_TEST /* The primary purpose of this check is to verify that _DEFAULT_NET_NAMING_SCHEME_TEST @@ -80,3 +81,25 @@ const NamingScheme* naming_scheme(void) { return cache; } + +static const char* const name_policy_table[_NAMEPOLICY_MAX] = { + [NAMEPOLICY_KERNEL] = "kernel", + [NAMEPOLICY_KEEP] = "keep", + [NAMEPOLICY_DATABASE] = "database", + [NAMEPOLICY_ONBOARD] = "onboard", + [NAMEPOLICY_SLOT] = "slot", + [NAMEPOLICY_PATH] = "path", + [NAMEPOLICY_MAC] = "mac", +}; + +DEFINE_STRING_TABLE_LOOKUP(name_policy, NamePolicy); + +static const char* const alternative_names_policy_table[_NAMEPOLICY_MAX] = { + [NAMEPOLICY_DATABASE] = "database", + [NAMEPOLICY_ONBOARD] = "onboard", + [NAMEPOLICY_SLOT] = "slot", + [NAMEPOLICY_PATH] = "path", + [NAMEPOLICY_MAC] = "mac", +}; + +DEFINE_STRING_TABLE_LOOKUP(alternative_names_policy, NamePolicy); diff --git a/src/shared/netif-naming-scheme.h b/src/shared/netif-naming-scheme.h index 11ce6e62ee..16b304ce10 100644 --- a/src/shared/netif-naming-scheme.h +++ b/src/shared/netif-naming-scheme.h @@ -64,3 +64,21 @@ const NamingScheme* naming_scheme(void); static inline bool naming_scheme_has(NamingSchemeFlags flags) { return FLAGS_SET(naming_scheme()->flags, flags); } + +typedef enum NamePolicy { + NAMEPOLICY_KERNEL, + NAMEPOLICY_KEEP, + NAMEPOLICY_DATABASE, + NAMEPOLICY_ONBOARD, + NAMEPOLICY_SLOT, + NAMEPOLICY_PATH, + NAMEPOLICY_MAC, + _NAMEPOLICY_MAX, + _NAMEPOLICY_INVALID = -EINVAL, +} NamePolicy; + +const char *name_policy_to_string(NamePolicy p) _const_; +NamePolicy name_policy_from_string(const char *p) _pure_; + +const char *alternative_names_policy_to_string(NamePolicy p) _const_; +NamePolicy alternative_names_policy_from_string(const char *p) _pure_; diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 880de0baf5..05f0f2e0a6 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -22,7 +22,6 @@ #include "log-link.h" #include "memory-util.h" #include "net-condition.h" -#include "netif-naming-scheme.h" #include "netif-util.h" #include "netlink-util.h" #include "parse-util.h" @@ -1032,30 +1031,10 @@ DEFINE_CONFIG_PARSE_ENUM_WITH_DEFAULT( MAC_ADDRESS_POLICY_NONE, "Failed to parse MAC address policy"); -static const char* const name_policy_table[_NAMEPOLICY_MAX] = { - [NAMEPOLICY_KERNEL] = "kernel", - [NAMEPOLICY_KEEP] = "keep", - [NAMEPOLICY_DATABASE] = "database", - [NAMEPOLICY_ONBOARD] = "onboard", - [NAMEPOLICY_SLOT] = "slot", - [NAMEPOLICY_PATH] = "path", - [NAMEPOLICY_MAC] = "mac", -}; - -DEFINE_STRING_TABLE_LOOKUP(name_policy, NamePolicy); DEFINE_CONFIG_PARSE_ENUMV(config_parse_name_policy, name_policy, NamePolicy, _NAMEPOLICY_INVALID, "Failed to parse interface name policy"); -static const char* const alternative_names_policy_table[_NAMEPOLICY_MAX] = { - [NAMEPOLICY_DATABASE] = "database", - [NAMEPOLICY_ONBOARD] = "onboard", - [NAMEPOLICY_SLOT] = "slot", - [NAMEPOLICY_PATH] = "path", - [NAMEPOLICY_MAC] = "mac", -}; - -DEFINE_STRING_TABLE_LOOKUP(alternative_names_policy, NamePolicy); DEFINE_CONFIG_PARSE_ENUMV(config_parse_alternative_names_policy, alternative_names_policy, NamePolicy, _NAMEPOLICY_INVALID, "Failed to parse alternative names policy"); diff --git a/src/udev/net/link-config.h b/src/udev/net/link-config.h index 092a6fa808..3b2cd69620 100644 --- a/src/udev/net/link-config.h +++ b/src/udev/net/link-config.h @@ -9,6 +9,7 @@ #include "ethtool-util.h" #include "list.h" #include "net-condition.h" +#include "netif-naming-scheme.h" typedef struct LinkConfigContext LinkConfigContext; typedef struct LinkConfig LinkConfig; @@ -21,18 +22,6 @@ typedef enum MACAddressPolicy { _MAC_ADDRESS_POLICY_INVALID = -EINVAL, } MACAddressPolicy; -typedef enum NamePolicy { - NAMEPOLICY_KERNEL, - NAMEPOLICY_KEEP, - NAMEPOLICY_DATABASE, - NAMEPOLICY_ONBOARD, - NAMEPOLICY_SLOT, - NAMEPOLICY_PATH, - NAMEPOLICY_MAC, - _NAMEPOLICY_MAX, - _NAMEPOLICY_INVALID = -EINVAL, -} NamePolicy; - typedef struct Link { int ifindex; const char *ifname; @@ -105,12 +94,6 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free); int link_get_config(LinkConfigContext *ctx, Link *link); int link_apply_config(LinkConfigContext *ctx, sd_netlink **rtnl, Link *link); -const char *name_policy_to_string(NamePolicy p) _const_; -NamePolicy name_policy_from_string(const char *p) _pure_; - -const char *alternative_names_policy_to_string(NamePolicy p) _const_; -NamePolicy alternative_names_policy_from_string(const char *p) _pure_; - const char *mac_address_policy_to_string(MACAddressPolicy p) _const_; MACAddressPolicy mac_address_policy_from_string(const char *p) _pure_; From a4c9bf2e51c92b411c88804070373f1e2123331a Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 14 Dec 2021 11:29:08 +0900 Subject: [PATCH 5/6] network-generator: support to set NamePolicy= through kernel command line argument Closes #16296. --- man/systemd-network-generator.service.xml | 3 + man/systemd-udevd.service.xml | 39 +++++++ src/network/generator/main.c | 9 +- src/network/generator/network-generator.c | 125 +++++++++++++++++++--- src/network/generator/network-generator.h | 8 +- 5 files changed, 164 insertions(+), 20 deletions(-) diff --git a/man/systemd-network-generator.service.xml b/man/systemd-network-generator.service.xml index 99a032179e..6b7e2564d4 100644 --- a/man/systemd-network-generator.service.xml +++ b/man/systemd-network-generator.service.xml @@ -59,6 +59,7 @@ ifname= + net.ifname-policy= — translated into systemd.link5 files. @@ -88,6 +89,8 @@ See dracut.kernel7 + and + systemd-udevd.service8 for option syntax and details. diff --git a/man/systemd-udevd.service.xml b/man/systemd-udevd.service.xml index 32cb82bac3..1bc86469be 100644 --- a/man/systemd-udevd.service.xml +++ b/man/systemd-udevd.service.xml @@ -224,6 +224,45 @@ appear, which affects older name derivation algorithms, too. + + net.ifname-policy=policy1[,policy2,…][,MAC] + + Specifies naming policies applied when renaming network interfaces. Takes a list of + policies and an optional MAC address separated with comma. Each policy value must be one of + the policies understood by the NamePolicy= setting in .link files, e.g. + onboard or path. See + systemd.link5 + for more details. When the MAC address is specified, the policies are applied to the + interface which has the address. When no MAC address is specified, the policies are applied + to all interfaces. This kernel command line argument can be specified multiple times. This + argument is not directly read from systemd-udevd, but read and converted + to a .link file by systemd-network-generator. So, to make this argument + take effect, systemd-network-generator.service must be enabled and + started before starting systemd-udevd.service. See + systemd-network-generator.service8 + for more details about the service. + Example: + net.ifname-policy=keep,kernel,path,slot,onboard,01:23:45:67:89:ab +net.ifname-policy=keep,kernel,path,slot,onboard,mac + This is mostly equivalent to creating the following .link files: + # 91-name-policy-with-mac.link +[Match] +MACAddress=01:23:45:67:89:ab + +[Link] +NamePolicy=keep kernel path slot onboard +AlternativeNamePolicy=path slot onboard + and + # 92-name-policy-for-all.link +[Match] +OriginalName=* + +[Link] +NamePolicy=keep kernel path slot onboard mac +AlternativeNamePolicy=path slot onboard mac + + + diff --git a/src/network/generator/main.c b/src/network/generator/main.c index 624b0a0b5d..a36fe98c86 100644 --- a/src/network/generator/main.c +++ b/src/network/generator/main.c @@ -65,9 +65,10 @@ static int link_save(Link *link, const char *dest_dir) { assert(link); - r = asprintf(&filename, "90-%s.link", - link->ifname); - if (r < 0) + filename = strjoin(!isempty(link->ifname) ? "90" : + !hw_addr_is_null(&link->mac) ? "91" : "92", + "-", link->filename, ".link"); + if (!filename) return log_oom(); r = generator_open_unit_file(dest_dir, "kernel command line", filename, &f); @@ -104,7 +105,7 @@ static int context_save(Context *context) { r = k; } - HASHMAP_FOREACH(link, context->links_by_name) { + HASHMAP_FOREACH(link, context->links_by_filename) { k = link_save(link, p); if (k < 0 && r >= 0) r = k; diff --git a/src/network/generator/network-generator.c b/src/network/generator/network-generator.c index 67480974e8..c081ec673c 100644 --- a/src/network/generator/network-generator.c +++ b/src/network/generator/network-generator.c @@ -5,6 +5,7 @@ #include "hostname-util.h" #include "log.h" #include "macro.h" +#include "netif-naming-scheme.h" #include "network-generator.h" #include "parse-util.h" #include "proc-cmdline.h" @@ -25,6 +26,7 @@ # .link ifname=: + net.ifname-policy=policy1[,policy2,...][,] # This is an original rule, not supported by other tools. # .netdev vlan=: @@ -263,7 +265,10 @@ static Link *link_free(Link *link) { if (!link) return NULL; + free(link->filename); free(link->ifname); + strv_free(link->policies); + strv_free(link->alt_policies); return mfree(link); } @@ -276,28 +281,43 @@ static int link_new( Link **ret) { _cleanup_(link_freep) Link *link = NULL; - _cleanup_free_ char *ifname = NULL; + _cleanup_free_ char *ifname = NULL, *filename = NULL; int r; assert(context); + assert(mac); - if (!ifname_valid(name)) - return -EINVAL; + if (name) { + if (!ifname_valid(name)) + return -EINVAL; - ifname = strdup(name); - if (!ifname) - return -ENOMEM; + ifname = strdup(name); + if (!ifname) + return -ENOMEM; + + filename = strdup(name); + if (!filename) + return -ENOMEM; + } + + if (!filename) { + filename = strdup(hw_addr_is_null(mac) ? "default" : + HW_ADDR_TO_STR_FULL(mac, HW_ADDR_TO_STRING_NO_COLON)); + if (!filename) + return -ENOMEM; + } link = new(Link, 1); if (!link) return -ENOMEM; *link = (Link) { + .filename = TAKE_PTR(filename), .ifname = TAKE_PTR(ifname), .mac = *mac, }; - r = hashmap_ensure_put(&context->links_by_name, &string_hash_ops, link->ifname, link); + r = hashmap_ensure_put(&context->links_by_filename, &string_hash_ops, link->filename, link); if (r < 0) return r; @@ -308,8 +328,10 @@ static int link_new( return 0; } -Link *link_get(Context *context, const char *ifname) { - return hashmap_get(context->links_by_name, ifname); +Link *link_get(Context *context, const char *filename) { + assert(context); + assert(filename); + return hashmap_get(context->links_by_filename, filename); } static int network_set_dhcp_type(Context *context, const char *ifname, const char *dhcp_type) { @@ -922,6 +944,65 @@ static int parse_cmdline_ifname(Context *context, const char *key, const char *v return link_new(context, name, &mac, NULL); } +static int parse_cmdline_ifname_policy(Context *context, const char *key, const char *value) { + _cleanup_strv_free_ char **policies = NULL, **alt_policies = NULL; + struct hw_addr_data mac = HW_ADDR_NULL; + Link *link; + int r; + + /* net.ifname-policy=policy1[,policy2,...][,] */ + + if (proc_cmdline_value_missing(key, value)) + return -EINVAL; + + for (const char *q = value; ; ) { + _cleanup_free_ char *word = NULL; + NamePolicy p; + + r = extract_first_word(&q, &word, ",", 0); + if (r == 0) + break; + if (r < 0) + return r; + + p = name_policy_from_string(word); + if (p < 0) { + r = parse_hw_addr(word, &mac); + if (r < 0) + return r; + + if (hw_addr_is_null(&mac)) + return -EINVAL; + + if (!isempty(q)) + return -EINVAL; + + break; + } + + if (alternative_names_policy_from_string(word) >= 0) { + r = strv_extend(&alt_policies, word); + if (r < 0) + return r; + } + + r = strv_consume(&policies, TAKE_PTR(word)); + if (r < 0) + return r; + } + + if (strv_isempty(policies)) + return -EINVAL; + + r = link_new(context, NULL, &mac, &link); + if (r < 0) + return r; + + link->policies = TAKE_PTR(policies); + link->alt_policies = TAKE_PTR(alt_policies); + return 0; +} + int parse_cmdline_item(const char *key, const char *value, void *data) { Context *context = data; @@ -944,6 +1025,8 @@ int parse_cmdline_item(const char *key, const char *value, void *data) { return parse_cmdline_bond(context, key, value); if (streq(key, "ifname")) return parse_cmdline_ifname(context, key, value); + if (streq(key, "net.ifname-policy")) + return parse_cmdline_ifname_policy(context, key, value); return 0; } @@ -995,7 +1078,7 @@ void context_clear(Context *context) { hashmap_free_with_destructor(context->networks_by_name, network_free); hashmap_free_with_destructor(context->netdevs_by_name, netdev_free); - hashmap_free_with_destructor(context->links_by_name, link_free); + hashmap_free_with_destructor(context->links_by_filename, link_free); } static int address_dump(Address *address, FILE *f) { @@ -1123,11 +1206,25 @@ void link_dump(Link *link, FILE *f) { if (!hw_addr_is_null(&link->mac)) fprintf(f, "MACAddress=%s\n", HW_ADDR_TO_STR(&link->mac)); + else + fputs("OriginalName=*\n", f); - fprintf(f, - "\n[Link]\n" - "Name=%s\n", - link->ifname); + fputs("\n[Link]\n", f); + + if (!isempty(link->ifname)) + fprintf(f, "Name=%s\n", link->ifname); + + if (!strv_isempty(link->policies)) { + fputs("NamePolicy=", f); + fputstrv(f, link->policies, " ", NULL); + fputc('\n', f); + } + + if (!strv_isempty(link->alt_policies)) { + fputs("AlternativeNamesPolicy=", f); + fputstrv(f, link->alt_policies, " ", NULL); + fputc('\n', f); + } } int network_format(Network *network, char **ret) { diff --git a/src/network/generator/network-generator.h b/src/network/generator/network-generator.h index deaa40f8f3..dd0a58738b 100644 --- a/src/network/generator/network-generator.h +++ b/src/network/generator/network-generator.h @@ -81,17 +81,21 @@ struct NetDev { }; struct Link { + char *filename; + /* [Match] */ struct hw_addr_data mac; /* [Link] */ char *ifname; + char **policies; + char **alt_policies; }; typedef struct Context { Hashmap *networks_by_name; Hashmap *netdevs_by_name; - Hashmap *links_by_name; + Hashmap *links_by_filename; } Context; int parse_cmdline_item(const char *key, const char *value, void *data); @@ -106,6 +110,6 @@ NetDev *netdev_get(Context *context, const char *ifname); void netdev_dump(NetDev *netdev, FILE *f); int netdev_format(NetDev *netdev, char **ret); -Link *link_get(Context *context, const char *ifname); +Link *link_get(Context *context, const char *filename); void link_dump(Link *link, FILE *f); int link_format(Link *link, char **ret); From 79463de5336ad8aafd7e66235e907cc584b7b649 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 14 Dec 2021 13:11:17 +0900 Subject: [PATCH 6/6] test: add testcases for net.ifname-policy= kernel command line argument --- .../generator/test-network-generator.c | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/network/generator/test-network-generator.c b/src/network/generator/test-network-generator.c index e658d89333..bcd4b1d9e4 100644 --- a/src/network/generator/test-network-generator.c +++ b/src/network/generator/test-network-generator.c @@ -49,14 +49,14 @@ static void test_netdev_one(const char *ifname, const char *key, const char *val assert_se(streq(output, expected)); } -static void test_link_one(const char *ifname, const char *key, const char *value, const char *expected) { +static void test_link_one(const char *filename, const char *key, const char *value, const char *expected) { _cleanup_(context_clear) Context context = {}; _cleanup_free_ char *output = NULL; Link *link; printf("# %s=%s\n", key, value); assert_se(parse_cmdline_item(key, value, &context) >= 0); - assert_se(link = link_get(&context, ifname)); + assert_se(link = link_get(&context, filename)); assert_se(link_format(link, &output) >= 0); puts(output); assert_se(streq(output, expected)); @@ -334,6 +334,22 @@ int main(int argc, char *argv[]) { "Name=hogehoge\n" ); + test_link_one("001122334455", "net.ifname-policy", "keep,kernel,database,onboard,slot,path,mac,00:11:22:33:44:55", + "[Match]\n" + "MACAddress=00:11:22:33:44:55\n" + "\n[Link]\n" + "NamePolicy=keep kernel database onboard slot path mac\n" + "AlternativeNamesPolicy=database onboard slot path mac\n" + ); + + test_link_one("default", "net.ifname-policy", "keep,kernel,database,onboard,slot,path,mac", + "[Match]\n" + "OriginalName=*\n" + "\n[Link]\n" + "NamePolicy=keep kernel database onboard slot path mac\n" + "AlternativeNamesPolicy=database onboard slot path mac\n" + ); + test_network_two("eth0", "ip", "192.168.0.10:192.168.0.2:192.168.0.1:255.255.255.0:hogehoge:eth0:on:10.10.10.10:10.10.10.11", "rd.route", "10.1.2.3/16:10.0.2.3",