udev/net: read hardware address from netlink message

This commit is contained in:
Yu Watanabe
2021-11-13 08:53:33 +09:00
parent 49c351a8ac
commit 1de88f3048
5 changed files with 42 additions and 14 deletions
+25 -1
View 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;
}
+7 -1
View 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);
-5
View 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)))
+9 -6
View 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)
+1 -1
View 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");