]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev/net: read hardware address from netlink message 21277/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 4 Nov 2021 17:29:34 +0000 (02:29 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 12 Nov 2021 23:53:33 +0000 (08:53 +0900)
src/libsystemd/sd-netlink/netlink-util.c
src/libsystemd/sd-netlink/netlink-util.h
src/shared/net-condition.c
src/udev/net/link-config.c
src/udev/udev-event.c

index 49249ca672257c381687cb28c714972050add5fd..c477bdd3268a65a90e4ee10ec1f9da5be0347d04 100644 (file)
@@ -355,8 +355,16 @@ int rtnl_resolve_interface_or_warn(sd_netlink **rtnl, const char *name) {
         return r;
 }
 
-int rtnl_get_link_info(sd_netlink **rtnl, int ifindex, unsigned short *ret_iftype, unsigned *ret_flags) {
+int rtnl_get_link_info(
+                sd_netlink **rtnl,
+                int ifindex,
+                unsigned short *ret_iftype,
+                unsigned *ret_flags,
+                struct hw_addr_data *ret_hw_addr,
+                struct hw_addr_data *ret_permanent_hw_addr) {
+
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *message = NULL, *reply = NULL;
+        struct hw_addr_data addr = HW_ADDR_NULL, perm_addr = HW_ADDR_NULL;
         unsigned short iftype;
         unsigned flags;
         int r;
@@ -395,10 +403,26 @@ int rtnl_get_link_info(sd_netlink **rtnl, int ifindex, unsigned short *ret_iftyp
                         return r;
         }
 
+        if (ret_hw_addr) {
+                r = netlink_message_read_hw_addr(reply, IFLA_ADDRESS, &addr);
+                if (r < 0 && r != -ENODATA)
+                        return r;
+        }
+
+        if (ret_permanent_hw_addr) {
+                r = netlink_message_read_hw_addr(reply, IFLA_PERM_ADDRESS, &perm_addr);
+                if (r < 0 && r != -ENODATA)
+                        return r;
+        }
+
         if (ret_iftype)
                 *ret_iftype = iftype;
         if (ret_flags)
                 *ret_flags = flags;
+        if (ret_hw_addr)
+                *ret_hw_addr = addr;
+        if (ret_permanent_hw_addr)
+                *ret_permanent_hw_addr = perm_addr;
         return 0;
 }
 
index 13b284ee649c70efd575021f7f3549b0ccd145b1..837a6066495986fa3556530d5268301c1cabbfa3 100644 (file)
@@ -91,7 +91,13 @@ int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name, char
 int rtnl_resolve_ifname(sd_netlink **rtnl, const char *name);
 int rtnl_resolve_interface(sd_netlink **rtnl, const char *name);
 int rtnl_resolve_interface_or_warn(sd_netlink **rtnl, const char *name);
-int rtnl_get_link_info(sd_netlink **rtnl, int ifindex, unsigned short *ret_iftype, unsigned *ret_flags);
+int rtnl_get_link_info(
+                sd_netlink **rtnl,
+                int ifindex,
+                unsigned short *ret_iftype,
+                unsigned *ret_flags,
+                struct hw_addr_data *ret_hw_addr,
+                struct hw_addr_data *ret_permanent_hw_addr);
 
 int rtnl_log_parse_error(int r);
 int rtnl_log_create_error(int r);
index ac0a364f06865f2917e6a0b722050f9ad03f5880..6be8f1cbcea460c391e922a08dbaae6ee26f75d0 100644 (file)
@@ -143,16 +143,11 @@ int net_match_config(
                 return r;
 
         if (device) {
-                const char *mac_str;
-
                 (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)
-                        mac = ether_aton(mac_str);
         }
 
         if (match->mac && (!mac || !set_contains(match->mac, mac)))
index 966c2060d71eebb36a42a2f7acff3c5b8c5ad419..95450772b14067fb5b326ee200f823715abe2d7e 100644 (file)
@@ -349,7 +349,7 @@ bool link_config_should_reload(LinkConfigContext *ctx) {
 
 int link_config_get(LinkConfigContext *ctx, sd_netlink **rtnl, sd_device *device, LinkConfig **ret) {
         unsigned name_assign_type = NET_NAME_UNKNOWN;
-        struct hw_addr_data permanent_hw_addr = {};
+        struct hw_addr_data hw_addr, permanent_hw_addr;
         unsigned short iftype;
         LinkConfig *link;
         const char *name;
@@ -369,7 +369,7 @@ int link_config_get(LinkConfigContext *ctx, sd_netlink **rtnl, sd_device *device
         if (r < 0)
                 return r;
 
-        r = rtnl_get_link_info(rtnl, ifindex, &iftype, &flags);
+        r = rtnl_get_link_info(rtnl, ifindex, &iftype, &flags, &hw_addr, &permanent_hw_addr);
         if (r < 0)
                 return r;
 
@@ -377,14 +377,17 @@ int link_config_get(LinkConfigContext *ctx, sd_netlink **rtnl, sd_device *device
         if (flags & IFF_LOOPBACK)
                 return -ENOENT;
 
-        r = ethtool_get_permanent_hw_addr(&ctx->ethtool_fd, name, &permanent_hw_addr);
-        if (r < 0)
-                log_device_debug_errno(device, r, "Failed to get permanent hardware address, ignoring: %m");
+        if (hw_addr.length > 0 && permanent_hw_addr.length == 0) {
+                r = ethtool_get_permanent_hw_addr(&ctx->ethtool_fd, name, &permanent_hw_addr);
+                if (r < 0)
+                        log_device_debug_errno(device, r, "Failed to get permanent hardware address, ignoring: %m");
+        }
 
         (void) link_unsigned_attribute(device, "name_assign_type", &name_assign_type);
 
         LIST_FOREACH(links, link, ctx->links) {
-                r = net_match_config(&link->match, device, NULL,
+                r = net_match_config(&link->match, device,
+                                     hw_addr.length == ETH_ALEN ? &hw_addr.ether : NULL,
                                      permanent_hw_addr.length == ETH_ALEN ? &permanent_hw_addr.ether : NULL,
                                      NULL, iftype, NULL, NULL, 0, NULL, NULL);
                 if (r < 0)
index 837cef083875b2222914ed3a4bcd3a276abca6fd..a60e4f294c8ef6973e859ad293ff77f7a83b696d 100644 (file)
@@ -855,7 +855,7 @@ static int rename_netif(UdevEvent *event) {
                 return 0;
         }
 
-        r = rtnl_get_link_info(&event->rtnl, ifindex, NULL, &flags);
+        r = rtnl_get_link_info(&event->rtnl, ifindex, NULL, &flags, NULL, NULL);
         if (r < 0)
                 return log_device_warning_errno(dev, r, "Failed to get link flags: %m");