From e90d037411a1ef03196daf0bc97005776ae46aeb Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 9 May 2018 11:59:18 +0900 Subject: [PATCH] network,udev: make MACAddress= in [Match] section take multiple MAC addresses --- src/libsystemd-network/network-internal.c | 8 ++++---- src/libsystemd-network/network-internal.h | 2 +- src/network/networkd-network-bus.c | 18 ++++++++++-------- src/network/networkd-network-gperf.gperf | 2 +- src/network/networkd-network.c | 2 +- src/network/networkd-network.h | 2 +- src/udev/net/link-config-gperf.gperf | 2 +- src/udev/net/link-config.c | 2 +- src/udev/net/link-config.h | 3 ++- 9 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/libsystemd-network/network-internal.c b/src/libsystemd-network/network-internal.c index 282508875a8..7c2bf962d65 100644 --- a/src/libsystemd-network/network-internal.c +++ b/src/libsystemd-network/network-internal.c @@ -97,7 +97,7 @@ static bool net_condition_test_strv(char * const *raw_patterns, return string && strv_fnmatch(raw_patterns, string, 0); } -bool net_match_config(const struct ether_addr *match_mac, +bool net_match_config(Set *match_mac, char * const *match_paths, char * const *match_drivers, char * const *match_types, @@ -129,7 +129,7 @@ bool net_match_config(const struct ether_addr *match_mac, if (match_arch && condition_test(match_arch) <= 0) return false; - if (match_mac && (!dev_mac || memcmp(match_mac, dev_mac, ETH_ALEN))) + if (match_mac && dev_mac && !set_contains(match_mac, dev_mac)) return false; if (!net_condition_test_strv(match_paths, dev_path)) @@ -329,7 +329,7 @@ int config_parse_hwaddrs(const char *unit, if (isempty(rvalue)) { /* Empty assignment resets the list */ - set_free_free(*hwaddrs); + *hwaddrs = set_free_free(*hwaddrs); return 0; } @@ -351,7 +351,7 @@ int config_parse_hwaddrs(const char *unit, return 0; } - n = new0(struct ether_addr, 1); + n = new(struct ether_addr, 1); if (!n) return log_oom(); diff --git a/src/libsystemd-network/network-internal.h b/src/libsystemd-network/network-internal.h index 5860d635281..c7b659b7317 100644 --- a/src/libsystemd-network/network-internal.h +++ b/src/libsystemd-network/network-internal.h @@ -18,7 +18,7 @@ #define LINK_BRIDGE_PORT_PRIORITY_INVALID 128 #define LINK_BRIDGE_PORT_PRIORITY_MAX 63 -bool net_match_config(const struct ether_addr *match_mac, +bool net_match_config(Set *match_mac, char * const *match_path, char * const *match_driver, char * const *match_type, diff --git a/src/network/networkd-network-bus.c b/src/network/networkd-network-bus.c index 22160ec10b3..159537b19ae 100644 --- a/src/network/networkd-network-bus.c +++ b/src/network/networkd-network-bus.c @@ -6,6 +6,7 @@ ***/ #include "alloc-util.h" +#include "ether-addr-util.h" #include "networkd-manager.h" #include "string-util.h" #include "strv.h" @@ -19,23 +20,24 @@ static int property_get_ether_addrs( void *userdata, sd_bus_error *error) { - Network *n = userdata; - const char *ether = NULL; + char buf[ETHER_ADDR_TO_STRING_MAX]; + const struct ether_addr *p; + Iterator i; + Set *s; int r; assert(bus); assert(reply); - assert(n); + assert(userdata); - if (n->match_mac) - ether = ether_ntoa(n->match_mac); + s = *(Set **) userdata; r = sd_bus_message_open_container(reply, 'a', "s"); if (r < 0) return r; - if (ether) { - r = sd_bus_message_append(reply, "s", strempty(ether)); + SET_FOREACH(p, s, i) { + r = sd_bus_message_append(reply, "s", ether_addr_to_string(p, buf)); if (r < 0) return r; } @@ -48,7 +50,7 @@ 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, 0, 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), diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 216572aeb4a..83ac330142f 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -20,7 +20,7 @@ struct ConfigPerfItem; %struct-type %includes %% -Match.MACAddress, config_parse_hwaddr, 0, offsetof(Network, match_mac) +Match.MACAddress, config_parse_hwaddrs, 0, offsetof(Network, match_mac) Match.Path, config_parse_strv, 0, offsetof(Network, match_path) Match.Driver, config_parse_strv, 0, offsetof(Network, match_driver) Match.Type, config_parse_strv, 0, offsetof(Network, match_type) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index aafb192baf0..daa30cb8f08 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -353,7 +353,7 @@ void network_free(Network *network) { free(network->filename); - free(network->match_mac); + set_free_free(network->match_mac); strv_free(network->match_path); strv_free(network->match_driver); strv_free(network->match_type); diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index e4bb0ba83a3..a8cf11ca5dd 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -103,7 +103,7 @@ struct Network { char *filename; char *name; - struct ether_addr *match_mac; + Set *match_mac; char **match_path; char **match_driver; char **match_type; diff --git a/src/udev/net/link-config-gperf.gperf b/src/udev/net/link-config-gperf.gperf index dee305f3250..b984c1befc0 100644 --- a/src/udev/net/link-config-gperf.gperf +++ b/src/udev/net/link-config-gperf.gperf @@ -19,7 +19,7 @@ struct ConfigPerfItem; %struct-type %includes %% -Match.MACAddress, config_parse_hwaddr, 0, offsetof(link_config, match_mac) +Match.MACAddress, config_parse_hwaddrs, 0, offsetof(link_config, match_mac) Match.OriginalName, config_parse_ifnames, 0, offsetof(link_config, match_name) Match.Path, config_parse_strv, 0, offsetof(link_config, match_path) Match.Driver, config_parse_strv, 0, offsetof(link_config, match_driver) diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index e33eae54217..2f7aa2f8d9d 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -57,7 +57,7 @@ static void link_config_free(link_config *link) { free(link->filename); - free(link->match_mac); + set_free_free(link->match_mac); strv_free(link->match_path); strv_free(link->match_driver); strv_free(link->match_type); diff --git a/src/udev/net/link-config.h b/src/udev/net/link-config.h index bedb80ea439..cbc532e340c 100644 --- a/src/udev/net/link-config.h +++ b/src/udev/net/link-config.h @@ -12,6 +12,7 @@ #include "condition.h" #include "ethtool-util.h" #include "list.h" +#include "set.h" typedef struct link_config_ctx link_config_ctx; typedef struct link_config link_config; @@ -38,7 +39,7 @@ typedef enum NamePolicy { struct link_config { char *filename; - struct ether_addr *match_mac; + Set *match_mac; char **match_path; char **match_driver; char **match_type; -- 2.47.3