From 1de88f3048bc727fc648455be61bd417555cce40 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 5 Nov 2021 02:29:34 +0900 Subject: [PATCH] udev/net: read hardware address from netlink message --- src/libsystemd/sd-netlink/netlink-util.c | 26 +++++++++++++++++++++++- src/libsystemd/sd-netlink/netlink-util.h | 8 +++++++- src/shared/net-condition.c | 5 ----- src/udev/net/link-config.c | 15 ++++++++------ src/udev/udev-event.c | 2 +- 5 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/libsystemd/sd-netlink/netlink-util.c b/src/libsystemd/sd-netlink/netlink-util.c index 49249ca6722..c477bdd3268 100644 --- a/src/libsystemd/sd-netlink/netlink-util.c +++ b/src/libsystemd/sd-netlink/netlink-util.c @@ -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; } diff --git a/src/libsystemd/sd-netlink/netlink-util.h b/src/libsystemd/sd-netlink/netlink-util.h index 13b284ee649..837a6066495 100644 --- a/src/libsystemd/sd-netlink/netlink-util.h +++ b/src/libsystemd/sd-netlink/netlink-util.h @@ -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); diff --git a/src/shared/net-condition.c b/src/shared/net-condition.c index ac0a364f068..6be8f1cbcea 100644 --- a/src/shared/net-condition.c +++ b/src/shared/net-condition.c @@ -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))) diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 966c2060d71..95450772b14 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -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) diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c index 837cef08387..a60e4f294c8 100644 --- a/src/udev/udev-event.c +++ b/src/udev/udev-event.c @@ -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"); -- 2.47.3