summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2020-10-29 15:04:52 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2020-10-29 15:04:52 +0900
commit5722fb89bcb4d0fb228c0b99b82b70e00bb6095a (patch)
tree35d5bacdc33b714646809f5700184a5f7017bd71
parent26f4d32365eff9d9bbd77e6c04de10ff6d6d7791 (diff)
downloadsystemd-5722fb89bcb4d0fb228c0b99b82b70e00bb6095a.tar.gz
net-condition: introduce struct NetMatch
-rw-r--r--src/network/networkd-network-bus.c10
-rw-r--r--src/network/networkd-network-gperf.gperf20
-rw-r--r--src/network/networkd-network.c25
-rw-r--r--src/network/networkd-network.h12
-rw-r--r--src/network/test-networkd-conf.c2
-rw-r--r--src/shared/net-condition.c107
-rw-r--r--src/shared/net-condition.h43
-rw-r--r--src/udev/net/link-config-gperf.gperf14
-rw-r--r--src/udev/net/link-config.c19
-rw-r--r--src/udev/net/link-config.h10
10 files changed, 126 insertions, 136 deletions
diff --git a/src/network/networkd-network-bus.c b/src/network/networkd-network-bus.c
index 70fddd56a5..d8be6ee3ee 100644
--- a/src/network/networkd-network-bus.c
+++ b/src/network/networkd-network-bus.c
@@ -45,11 +45,11 @@ const sd_bus_vtable network_vtable[] = {
SD_BUS_PROPERTY("Description", "s", NULL, offsetof(Network, description), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("SourcePath", "s", NULL, offsetof(Network, filename), SD_BUS_VTABLE_PROPERTY_CONST),
- SD_BUS_PROPERTY("MatchMAC", "as", property_get_ether_addrs, offsetof(Network, match_mac), SD_BUS_VTABLE_PROPERTY_CONST),
- SD_BUS_PROPERTY("MatchPath", "as", NULL, offsetof(Network, match_path), SD_BUS_VTABLE_PROPERTY_CONST),
- SD_BUS_PROPERTY("MatchDriver", "as", NULL, offsetof(Network, match_driver), SD_BUS_VTABLE_PROPERTY_CONST),
- SD_BUS_PROPERTY("MatchType", "as", NULL, offsetof(Network, match_type), SD_BUS_VTABLE_PROPERTY_CONST),
- SD_BUS_PROPERTY("MatchName", "as", NULL, offsetof(Network, match_name), SD_BUS_VTABLE_PROPERTY_CONST),
+ SD_BUS_PROPERTY("MatchMAC", "as", property_get_ether_addrs, offsetof(Network, match.mac), SD_BUS_VTABLE_PROPERTY_CONST),
+ SD_BUS_PROPERTY("MatchPath", "as", NULL, offsetof(Network, match.path), SD_BUS_VTABLE_PROPERTY_CONST),
+ SD_BUS_PROPERTY("MatchDriver", "as", NULL, offsetof(Network, match.driver), SD_BUS_VTABLE_PROPERTY_CONST),
+ SD_BUS_PROPERTY("MatchType", "as", NULL, offsetof(Network, match.iftype), SD_BUS_VTABLE_PROPERTY_CONST),
+ SD_BUS_PROPERTY("MatchName", "as", NULL, offsetof(Network, match.ifname), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_VTABLE_END
};
diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
index 19c3b088a1..619c6a8c59 100644
--- a/src/network/networkd-network-gperf.gperf
+++ b/src/network/networkd-network-gperf.gperf
@@ -41,16 +41,16 @@ struct ConfigPerfItem;
%struct-type
%includes
%%
-Match.MACAddress, config_parse_hwaddrs, 0, offsetof(Network, match_mac)
-Match.PermanentMACAddress, config_parse_hwaddrs, 0, offsetof(Network, match_permanent_mac)
-Match.Path, config_parse_match_strv, 0, offsetof(Network, match_path)
-Match.Driver, config_parse_match_strv, 0, offsetof(Network, match_driver)
-Match.Type, config_parse_match_strv, 0, offsetof(Network, match_type)
-Match.WLANInterfaceType, config_parse_match_strv, 0, offsetof(Network, match_wlan_iftype)
-Match.SSID, config_parse_match_strv, 0, offsetof(Network, match_ssid)
-Match.BSSID, config_parse_hwaddrs, 0, offsetof(Network, match_bssid)
-Match.Name, config_parse_match_ifnames, IFNAME_VALID_ALTERNATIVE, offsetof(Network, match_name)
-Match.Property, config_parse_match_property, 0, offsetof(Network, match_property)
+Match.MACAddress, config_parse_hwaddrs, 0, offsetof(Network, match.mac)
+Match.PermanentMACAddress, config_parse_hwaddrs, 0, offsetof(Network, match.permanent_mac)
+Match.Path, config_parse_match_strv, 0, offsetof(Network, match.path)
+Match.Driver, config_parse_match_strv, 0, offsetof(Network, match.driver)
+Match.Type, config_parse_match_strv, 0, offsetof(Network, match.iftype)
+Match.WLANInterfaceType, config_parse_match_strv, 0, offsetof(Network, match.wifi_iftype)
+Match.SSID, config_parse_match_strv, 0, offsetof(Network, match.ssid)
+Match.BSSID, config_parse_hwaddrs, 0, offsetof(Network, match.bssid)
+Match.Name, config_parse_match_ifnames, IFNAME_VALID_ALTERNATIVE, offsetof(Network, match.ifname)
+Match.Property, config_parse_match_property, 0, offsetof(Network, match.property)
Match.Host, config_parse_net_condition, CONDITION_HOST, offsetof(Network, conditions)
Match.Virtualization, config_parse_net_condition, CONDITION_VIRTUALIZATION, offsetof(Network, conditions)
Match.KernelCommandLine, config_parse_net_condition, CONDITION_KERNEL_COMMAND_LINE, offsetof(Network, conditions)
diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
index dd937d37f2..c3ba604c4e 100644
--- a/src/network/networkd-network.c
+++ b/src/network/networkd-network.c
@@ -161,11 +161,7 @@ int network_verify(Network *network) {
assert(network);
assert(network->filename);
- if (set_isempty(network->match_mac) && set_isempty(network->match_permanent_mac) &&
- strv_isempty(network->match_path) && strv_isempty(network->match_driver) &&
- strv_isempty(network->match_type) && strv_isempty(network->match_name) &&
- strv_isempty(network->match_property) && strv_isempty(network->match_wlan_iftype) &&
- strv_isempty(network->match_ssid) && !network->conditions)
+ if (net_match_is_empty(&network->match) && !network->conditions)
return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
"%s: No valid settings found in the [Match] section, ignoring file. "
"To match all interfaces, add Name=* in the [Match] section.",
@@ -588,16 +584,7 @@ static Network *network_free(Network *network) {
free(network->filename);
- set_free_free(network->match_mac);
- set_free_free(network->match_permanent_mac);
- strv_free(network->match_path);
- strv_free(network->match_driver);
- strv_free(network->match_type);
- strv_free(network->match_name);
- strv_free(network->match_property);
- strv_free(network->match_wlan_iftype);
- strv_free(network->match_ssid);
- set_free_free(network->match_bssid);
+ net_match_clear(&network->match);
condition_free_list(network->conditions);
free(network->description);
@@ -704,13 +691,9 @@ int network_get(Manager *manager, unsigned short iftype, sd_device *device,
assert(ret);
ORDERED_HASHMAP_FOREACH(network, manager->networks)
- if (net_match_config(network->match_mac, network->match_permanent_mac,
- network->match_path, network->match_driver,
- network->match_type, network->match_name, network->match_property,
- network->match_wlan_iftype, network->match_ssid, network->match_bssid,
- device, mac, permanent_mac, driver, iftype,
+ if (net_match_config(&network->match, device, mac, permanent_mac, driver, iftype,
ifname, alternative_names, wlan_iftype, ssid, bssid)) {
- if (network->match_name && device) {
+ if (network->match.ifname && device) {
const char *attr;
uint8_t name_assign_type = NET_NAME_UNKNOWN;
diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h
index 92c7a4636f..c51dd34a57 100644
--- a/src/network/networkd-network.h
+++ b/src/network/networkd-network.h
@@ -10,6 +10,7 @@
#include "condition.h"
#include "conf-parser.h"
#include "hashmap.h"
+#include "net-condition.h"
#include "netdev.h"
#include "networkd-brvlan.h"
#include "networkd-dhcp-common.h"
@@ -65,16 +66,7 @@ struct Network {
char *description;
/* [Match] section */
- Set *match_mac;
- Set *match_permanent_mac;
- char **match_path;
- char **match_driver;
- char **match_type;
- char **match_name;
- char **match_property;
- char **match_wlan_iftype;
- char **match_ssid;
- Set *match_bssid;
+ NetMatch match;
LIST_HEAD(Condition, conditions);
/* Master or stacked netdevs */
diff --git a/src/network/test-networkd-conf.c b/src/network/test-networkd-conf.c
index 57c5068e3a..08ebf30bb9 100644
--- a/src/network/test-networkd-conf.c
+++ b/src/network/test-networkd-conf.c
@@ -171,7 +171,7 @@ static void test_config_parse_address_one(const char *rvalue, int family, unsign
assert_se(network = new0(Network, 1));
network->n_ref = 1;
assert_se(network->filename = strdup("hogehoge.network"));
- assert_se(config_parse_match_ifnames("network", "filename", 1, "section", 1, "Name", 0, "*", &network->match_name, network) == 0);
+ assert_se(config_parse_match_ifnames("network", "filename", 1, "section", 1, "Name", 0, "*", &network->match.ifname, network) == 0);
assert_se(config_parse_address("network", "filename", 1, "section", 1, "Address", 0, rvalue, network, network) == 0);
assert_se(ordered_hashmap_size(network->addresses_by_section) == 1);
assert_se(network_verify(network) >= 0);
diff --git a/src/shared/net-condition.c b/src/shared/net-condition.c
index b3bcebff1b..bdc8bc3fe4 100644
--- a/src/shared/net-condition.c
+++ b/src/shared/net-condition.c
@@ -11,6 +11,38 @@
#include "string-table.h"
#include "strv.h"
+void net_match_clear(NetMatch *match) {
+ if (!match)
+ return;
+
+ match->mac = set_free_free(match->mac);
+ match->permanent_mac = set_free_free(match->permanent_mac);
+ match->path = strv_free(match->path);
+ match->driver = strv_free(match->driver);
+ match->iftype = strv_free(match->iftype);
+ match->ifname = strv_free(match->ifname);
+ match->property = strv_free(match->property);
+ match->wifi_iftype = strv_free(match->wifi_iftype);
+ match->ssid = strv_free(match->ssid);
+ match->bssid = set_free_free(match->bssid);
+}
+
+bool net_match_is_empty(const NetMatch *match) {
+ assert(match);
+
+ return
+ set_isempty(match->mac) &&
+ set_isempty(match->permanent_mac) &&
+ strv_isempty(match->path) &&
+ strv_isempty(match->driver) &&
+ strv_isempty(match->iftype) &&
+ strv_isempty(match->ifname) &&
+ strv_isempty(match->property) &&
+ strv_isempty(match->wifi_iftype) &&
+ strv_isempty(match->ssid) &&
+ set_isempty(match->bssid);
+}
+
static bool net_condition_test_strv(char * const *patterns, const char *string) {
char * const *p;
bool match = false, has_positive_rule = false;
@@ -103,76 +135,69 @@ static const char *const wifi_iftype_table[NL80211_IFTYPE_MAX+1] = {
DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(wifi_iftype, enum nl80211_iftype);
bool net_match_config(
- Set *match_mac,
- Set *match_permanent_mac,
- char * const *match_paths,
- char * const *match_drivers,
- char * const *match_iftypes,
- char * const *match_names,
- char * const *match_property,
- char * const *match_wifi_iftype,
- char * const *match_ssid,
- Set *match_bssid,
+ const NetMatch *match,
sd_device *device,
- const struct ether_addr *dev_mac,
- const struct ether_addr *dev_permanent_mac,
- const char *dev_driver,
- unsigned short dev_iftype,
- const char *dev_name,
+ const struct ether_addr *mac,
+ const struct ether_addr *permanent_mac,
+ const char *driver,
+ unsigned short iftype,
+ const char *ifname,
char * const *alternative_names,
- enum nl80211_iftype dev_wifi_iftype,
- const char *dev_ssid,
- const struct ether_addr *dev_bssid) {
+ enum nl80211_iftype wifi_iftype,
+ const char *ssid,
+ const struct ether_addr *bssid) {
+
+ _cleanup_free_ char *iftype_str;
+ const char *path = NULL;
- _cleanup_free_ char *dev_iftype_str;
- const char *dev_path = NULL;
+ assert(match);
- dev_iftype_str = link_get_type_string(device, dev_iftype);
+ iftype_str = link_get_type_string(device, iftype);
if (device) {
const char *mac_str;
- (void) sd_device_get_property_value(device, "ID_PATH", &dev_path);
- if (!dev_driver)
- (void) sd_device_get_property_value(device, "ID_NET_DRIVER", &dev_driver);
- if (!dev_name)
- (void) sd_device_get_sysname(device, &dev_name);
- if (!dev_mac &&
+ (void) sd_device_get_property_value(device, "ID_PATH", &path);
+ if (!driver)
+ (void) sd_device_get_property_value(device, "ID_NET_DRIVER", &driver);
+ if (!ifname)
+ (void) sd_device_get_sysname(device, &ifname);
+ if (!mac &&
sd_device_get_sysattr_value(device, "address", &mac_str) >= 0)
- dev_mac = ether_aton(mac_str);
+ mac = ether_aton(mac_str);
}
- if (match_mac && (!dev_mac || !set_contains(match_mac, dev_mac)))
+ if (match->mac && (!mac || !set_contains(match->mac, mac)))
return false;
- if (match_permanent_mac &&
- (!dev_permanent_mac ||
- ether_addr_is_null(dev_permanent_mac) ||
- !set_contains(match_permanent_mac, dev_permanent_mac)))
+ if (match->permanent_mac &&
+ (!permanent_mac ||
+ ether_addr_is_null(permanent_mac) ||
+ !set_contains(match->permanent_mac, permanent_mac)))
return false;
- if (!net_condition_test_strv(match_paths, dev_path))
+ if (!net_condition_test_strv(match->path, path))
return false;
- if (!net_condition_test_strv(match_drivers, dev_driver))
+ if (!net_condition_test_strv(match->driver, driver))
return false;
- if (!net_condition_test_strv(match_iftypes, dev_iftype_str))
+ if (!net_condition_test_strv(match->iftype, iftype_str))
return false;
- if (!net_condition_test_ifname(match_names, dev_name, alternative_names))
+ if (!net_condition_test_ifname(match->ifname, ifname, alternative_names))
return false;
- if (!net_condition_test_property(match_property, device))
+ if (!net_condition_test_property(match->property, device))
return false;
- if (!net_condition_test_strv(match_wifi_iftype, wifi_iftype_to_string(dev_wifi_iftype)))
+ if (!net_condition_test_strv(match->wifi_iftype, wifi_iftype_to_string(wifi_iftype)))
return false;
- if (!net_condition_test_strv(match_ssid, dev_ssid))
+ if (!net_condition_test_strv(match->ssid, ssid))
return false;
- if (match_bssid && (!dev_bssid || !set_contains(match_bssid, dev_bssid)))
+ if (match->bssid && (!bssid || !set_contains(match->bssid, bssid)))
return false;
return true;
diff --git a/src/shared/net-condition.h b/src/shared/net-condition.h
index 31d5d01aa6..61058849a9 100644
--- a/src/shared/net-condition.h
+++ b/src/shared/net-condition.h
@@ -10,27 +10,34 @@
#include "ether-addr-util.h"
#include "set.h"
+typedef struct NetMatch {
+ Set *mac;
+ Set *permanent_mac;
+ char **path;
+ char **driver;
+ char **iftype;
+ char **ifname;
+ char **property;
+ char **wifi_iftype;
+ char **ssid;
+ Set *bssid;
+} NetMatch;
+
+void net_match_clear(NetMatch *match);
+bool net_match_is_empty(const NetMatch *match);
+
bool net_match_config(
- Set *match_mac,
- Set *match_permanent_mac,
- char * const *match_paths,
- char * const *match_drivers,
- char * const *match_iftypes,
- char * const *match_names,
- char * const *match_property,
- char * const *match_wifi_iftype,
- char * const *match_ssid,
- Set *match_bssid,
+ const NetMatch *match,
sd_device *device,
- const struct ether_addr *dev_mac,
- const struct ether_addr *dev_permanent_mac,
- const char *dev_driver,
- unsigned short dev_iftype,
- const char *dev_name,
+ const struct ether_addr *mac,
+ const struct ether_addr *permanent_mac,
+ const char *driver,
+ unsigned short iftype,
+ const char *ifname,
char * const *alternative_names,
- enum nl80211_iftype dev_wifi_iftype,
- const char *dev_ssid,
- const struct ether_addr *dev_bssid);
+ enum nl80211_iftype wifi_iftype,
+ const char *ssid,
+ const struct ether_addr *bssid);
CONFIG_PARSER_PROTOTYPE(config_parse_net_condition);
CONFIG_PARSER_PROTOTYPE(config_parse_match_strv);
diff --git a/src/udev/net/link-config-gperf.gperf b/src/udev/net/link-config-gperf.gperf
index 6c8d574875..dc107170cc 100644
--- a/src/udev/net/link-config-gperf.gperf
+++ b/src/udev/net/link-config-gperf.gperf
@@ -20,13 +20,13 @@ struct ConfigPerfItem;
%struct-type
%includes
%%
-Match.MACAddress, config_parse_hwaddrs, 0, offsetof(link_config, match_mac)
-Match.PermanentMACAddress, config_parse_hwaddrs, 0, offsetof(link_config, match_permanent_mac)
-Match.OriginalName, config_parse_match_ifnames, 0, offsetof(link_config, match_name)
-Match.Path, config_parse_match_strv, 0, offsetof(link_config, match_path)
-Match.Driver, config_parse_match_strv, 0, offsetof(link_config, match_driver)
-Match.Type, config_parse_match_strv, 0, offsetof(link_config, match_type)
-Match.Property, config_parse_match_property, 0, offsetof(link_config, match_property)
+Match.MACAddress, config_parse_hwaddrs, 0, offsetof(link_config, match.mac)
+Match.PermanentMACAddress, config_parse_hwaddrs, 0, offsetof(link_config, match.permanent_mac)
+Match.OriginalName, config_parse_match_ifnames, 0, offsetof(link_config, match.ifname)
+Match.Path, config_parse_match_strv, 0, offsetof(link_config, match.path)
+Match.Driver, config_parse_match_strv, 0, offsetof(link_config, match.driver)
+Match.Type, config_parse_match_strv, 0, offsetof(link_config, match.iftype)
+Match.Property, config_parse_match_property, 0, offsetof(link_config, match.property)
Match.Host, config_parse_net_condition, CONDITION_HOST, offsetof(link_config, conditions)
Match.Virtualization, config_parse_net_condition, CONDITION_VIRTUALIZATION, offsetof(link_config, conditions)
Match.KernelCommandLine, config_parse_net_condition, CONDITION_KERNEL_COMMAND_LINE, offsetof(link_config, conditions)
diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c
index 459294bf58..f885ff6a64 100644
--- a/src/udev/net/link-config.c
+++ b/src/udev/net/link-config.c
@@ -51,13 +51,7 @@ static void link_config_free(link_config *link) {
free(link->filename);
- set_free_free(link->match_mac);
- set_free_free(link->match_permanent_mac);
- strv_free(link->match_path);
- strv_free(link->match_driver);
- strv_free(link->match_type);
- strv_free(link->match_name);
- strv_free(link->match_property);
+ net_match_clear(&link->match);
condition_free_list(link->conditions);
free(link->description);
@@ -169,9 +163,7 @@ int link_load_one(link_config_ctx *ctx, const char *filename) {
if (r < 0)
return r;
- if (set_isempty(link->match_mac) && set_isempty(link->match_permanent_mac) &&
- strv_isempty(link->match_path) && strv_isempty(link->match_driver) && strv_isempty(link->match_type) &&
- strv_isempty(link->match_name) && strv_isempty(link->match_property) && !link->conditions) {
+ if (net_match_is_empty(&link->match) && !link->conditions) {
log_warning("%s: No valid settings found in the [Match] section, ignoring file. "
"To match all interfaces, add OriginalName=* in the [Match] section.",
filename);
@@ -274,11 +266,8 @@ int link_config_get(link_config_ctx *ctx, sd_device *device, link_config **ret)
(void) link_unsigned_attribute(device, "name_assign_type", &name_assign_type);
LIST_FOREACH(links, link, ctx->links) {
- if (net_match_config(link->match_mac, link->match_permanent_mac, link->match_path, link->match_driver,
- link->match_type, link->match_name, link->match_property, NULL, NULL, NULL,
- device, NULL, &permanent_mac, NULL, iftype, NULL, NULL, 0, NULL, NULL)) {
-
- if (link->match_name && !strv_contains(link->match_name, "*") && name_assign_type == NET_NAME_ENUM)
+ if (net_match_config(&link->match, device, NULL, &permanent_mac, NULL, iftype, NULL, NULL, 0, NULL, NULL)) {
+ if (link->match.ifname && !strv_contains(link->match.ifname, "*") && name_assign_type == NET_NAME_ENUM)
log_device_warning(device, "Config file %s is applied to device based on potentially unpredictable interface name.",
link->filename);
else
diff --git a/src/udev/net/link-config.h b/src/udev/net/link-config.h
index 8bed27e272..2874c506c9 100644
--- a/src/udev/net/link-config.h
+++ b/src/udev/net/link-config.h
@@ -7,7 +7,7 @@
#include "conf-parser.h"
#include "ethtool-util.h"
#include "list.h"
-#include "set.h"
+#include "net-condition.h"
typedef struct link_config_ctx link_config_ctx;
typedef struct link_config link_config;
@@ -35,13 +35,7 @@ typedef enum NamePolicy {
struct link_config {
char *filename;
- Set *match_mac;
- Set *match_permanent_mac;
- char **match_path;
- char **match_driver;
- char **match_type;
- char **match_name;
- char **match_property;
+ NetMatch match;
LIST_HEAD(Condition, conditions);
char *description;