From c76d050d8d61b4a63d4407bd03bd3f49cd9915ce Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 15 Dec 2019 22:46:19 +0900 Subject: [PATCH] network: make Name= in [Match] support alternative names of interfaces (cherry picked from commit 572b21d96cabd5860b0670e98440b6cb99a4b749 src/network bits have been left out.) Related: #1850986 --- man/systemd.network.xml | 7 +++---- src/libsystemd-network/network-internal.c | 20 ++++++++++++++++++-- src/libsystemd-network/network-internal.h | 3 ++- src/udev/net/link-config.c | 3 ++- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/man/systemd.network.xml b/man/systemd.network.xml index fc8e0aea68..8300540096 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -133,10 +133,9 @@ Name= - A whitespace-separated list of shell-style globs - matching the device name, as exposed by the udev property - INTERFACE. If the list is prefixed - with a "!", the test is inverted. + A whitespace-separated list of shell-style globs matching the device name, as exposed + by the udev property INTERFACE, or device's alternative names. If the + list is prefixed with a "!", the test is inverted. diff --git a/src/libsystemd-network/network-internal.c b/src/libsystemd-network/network-internal.c index 629e858def..a935709cd0 100644 --- a/src/libsystemd-network/network-internal.c +++ b/src/libsystemd-network/network-internal.c @@ -92,6 +92,18 @@ static bool net_condition_test_strv(char * const *raw_patterns, return string && strv_fnmatch(raw_patterns, string, 0); } +static bool net_condition_test_ifname(char * const *patterns, const char *ifname, char * const *alternative_names) { + if (net_condition_test_strv(patterns, ifname)) + return true; + + char * const *p; + STRV_FOREACH(p, alternative_names) + if (net_condition_test_strv(patterns, *p)) + return true; + + return false; +} + bool net_match_config(Set *match_mac, char * const *match_paths, char * const *match_drivers, @@ -107,7 +119,8 @@ bool net_match_config(Set *match_mac, const char *dev_parent_driver, const char *dev_driver, const char *dev_type, - const char *dev_name) { + const char *dev_name, + char * const *alternative_names) { if (match_host && condition_test(match_host) <= 0) return false; @@ -124,6 +137,9 @@ bool net_match_config(Set *match_mac, if (match_arch && condition_test(match_arch) <= 0) return false; + if (!net_condition_test_ifname(match_names, dev_name, alternative_names)) + return false; + if (match_mac && dev_mac && !set_contains(match_mac, dev_mac)) return false; @@ -214,7 +230,7 @@ int config_parse_match_ifnames( if (r == 0) break; - if (!ifname_valid(word)) { + if (!ifname_valid_full(word, ltype)) { log_syntax(unit, LOG_ERR, filename, line, 0, "Interface name is not valid or too long, ignoring assignment: %s", rvalue); return 0; } diff --git a/src/libsystemd-network/network-internal.h b/src/libsystemd-network/network-internal.h index 9074758bbb..e1d098f3fe 100644 --- a/src/libsystemd-network/network-internal.h +++ b/src/libsystemd-network/network-internal.h @@ -29,7 +29,8 @@ bool net_match_config(Set *match_mac, const char *dev_parent_driver, const char *dev_driver, const char *dev_type, - const char *dev_name); + const char *dev_name, + char * const *alternative_names); CONFIG_PARSER_PROTOTYPE(config_parse_net_condition); CONFIG_PARSER_PROTOTYPE(config_parse_hwaddr); diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index d07a1a1874..e5052f8f29 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -238,7 +238,8 @@ int link_config_get(link_config_ctx *ctx, struct udev_device *device, udev_device_get_driver(udev_device_get_parent(device)), udev_device_get_property_value(device, "ID_NET_DRIVER"), udev_device_get_devtype(device), - udev_device_get_sysname(device))) { + udev_device_get_sysname(device), + NULL)) { if (link->match_name) { unsigned char name_assign_type = NET_NAME_UNKNOWN;