]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network,udev: make MACAddress= in [Match] section take multiple MAC addresses
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 9 May 2018 02:59:18 +0000 (11:59 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 9 May 2018 02:59:18 +0000 (11:59 +0900)
src/libsystemd-network/network-internal.c
src/libsystemd-network/network-internal.h
src/network/networkd-network-bus.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h
src/udev/net/link-config-gperf.gperf
src/udev/net/link-config.c
src/udev/net/link-config.h

index 282508875a8529ef8f2683abeed62bc757b68f1d..7c2bf962d653116c4844fb8c0d19e3410aa13cb3 100644 (file)
@@ -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();
 
index 5860d635281dba5928fb5306c71d69f92d3c91d1..c7b659b7317e4b4eb2cf19e63fb1f4d8f722b5d5 100644 (file)
@@ -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,
index 22160ec10b340c1f4bc447eff20782609bb0687f..159537b19ae38a87a72896ed5c3d85360f764f2d 100644 (file)
@@ -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),
index 216572aeb4a079740e64888e290645523f3685a8..83ac330142f1ba1dade035d509c9ef7bb5643d60 100644 (file)
@@ -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)
index aafb192baf0b6395fe0a761f857c819998e53c42..daa30cb8f08de86cb4704a737c739948b4d85074 100644 (file)
@@ -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);
index e4bb0ba83a39c4f9ea1f23b7551146ed73baa420..a8cf11ca5dd3c96170de14f9f453f2b32f0f5962 100644 (file)
@@ -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;
index dee305f3250ddea2cda5310d6b932db325448123..b984c1befc02fef05edb3133c13706fec20e6958 100644 (file)
@@ -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)
index e33eae542176dd4000e0b8dfe901428e7233368b..2f7aa2f8d9d59dda8b06d06b1596a8d4578d4d05 100644 (file)
@@ -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);
index bedb80ea4392cd594cd40dc30908ef671921910b..cbc532e340c4c36d758258812875c0bfc6025fb9 100644 (file)
@@ -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;