diff options
Diffstat (limited to 'src/udev/net/link-config.c')
-rw-r--r-- | src/udev/net/link-config.c | 125 |
1 files changed, 64 insertions, 61 deletions
diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index cec4f4f779..ac66ffd047 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -2,17 +2,18 @@ #include <netinet/ether.h> +#include "sd-device.h" #include "sd-netlink.h" #include "alloc-util.h" #include "conf-files.h" #include "conf-parser.h" +#include "device-util.h" #include "ethtool-util.h" #include "fd-util.h" -#include "libudev-private.h" #include "link-config.h" #include "log.h" -#include "missing.h" +#include "missing_network.h" #include "netlink-util.h" #include "network-internal.h" #include "parse-util.h" @@ -125,6 +126,7 @@ int link_config_ctx_new(link_config_ctx **ret) { static int load_link(link_config_ctx *ctx, const char *filename) { _cleanup_(link_config_freep) link_config *link = NULL; _cleanup_fclose_ FILE *file = NULL; + int i; int r; assert(ctx); @@ -153,7 +155,8 @@ static int load_link(link_config_ctx *ctx, const char *filename) { link->port = _NET_DEV_PORT_INVALID; link->autonegotiation = -1; - memset(&link->features, 0xFF, sizeof(link->features)); + for (i = 0; i < (int)ELEMENTSOF(link->features); i++) + link->features[i] = -1; r = config_parse(NULL, filename, file, "Match\0Link\0Ethernet\0", @@ -215,8 +218,7 @@ bool link_config_should_reload(link_config_ctx *ctx) { return paths_check_timestamp(link_dirs, &ctx->link_dirs_ts_usec, false); } -int link_config_get(link_config_ctx *ctx, struct udev_device *device, - link_config **ret) { +int link_config_get(link_config_ctx *ctx, sd_device *device, link_config **ret) { link_config *link; assert(ctx); @@ -224,43 +226,50 @@ int link_config_get(link_config_ctx *ctx, struct udev_device *device, assert(ret); LIST_FOREACH(links, link, ctx->links) { - const char* attr_value; + const char *address = NULL, *id_path = NULL, *parent_driver = NULL, *id_net_driver = NULL, *devtype = NULL, *sysname = NULL; + sd_device *parent; - attr_value = udev_device_get_sysattr_value(device, "address"); + (void) sd_device_get_sysattr_value(device, "address", &address); + (void) sd_device_get_property_value(device, "ID_PATH", &id_path); + if (sd_device_get_parent(device, &parent) >= 0) + (void) sd_device_get_driver(parent, &parent_driver); + (void) sd_device_get_property_value(device, "ID_NET_DRIVER", &id_net_driver); + (void) sd_device_get_devtype(device, &devtype); + (void) sd_device_get_sysname(device, &sysname); if (net_match_config(link->match_mac, link->match_path, link->match_driver, link->match_type, link->match_name, link->match_host, link->match_virt, link->match_kernel_cmdline, link->match_kernel_version, link->match_arch, - attr_value ? ether_aton(attr_value) : NULL, - udev_device_get_property_value(device, "ID_PATH"), - udev_device_get_driver(udev_device_get_parent(device)), - udev_device_get_property_value(device, "ID_NET_DRIVER"), - udev_device_get_devtype(device), - udev_device_get_sysname(device))) { + address ? ether_aton(address) : NULL, + id_path, + parent_driver, + id_net_driver, + devtype, + sysname)) { if (link->match_name) { unsigned char name_assign_type = NET_NAME_UNKNOWN; + const char *attr_value; - attr_value = udev_device_get_sysattr_value(device, "name_assign_type"); - if (attr_value) + if (sd_device_get_sysattr_value(device, "name_assign_type", &attr_value) >= 0) (void) safe_atou8(attr_value, &name_assign_type); if (name_assign_type == NET_NAME_ENUM) { log_warning("Config file %s applies to device based on potentially unpredictable interface name '%s'", - link->filename, udev_device_get_sysname(device)); + link->filename, sysname); *ret = link; return 0; } else if (name_assign_type == NET_NAME_RENAMED) { log_warning("Config file %s matches device based on renamed interface name '%s', ignoring", - link->filename, udev_device_get_sysname(device)); + link->filename, sysname); continue; } } log_debug("Config file %s applies to device %s", - link->filename, udev_device_get_sysname(device)); + link->filename, sysname); *ret = link; @@ -273,14 +282,13 @@ int link_config_get(link_config_ctx *ctx, struct udev_device *device, return -ENOENT; } -static bool mac_is_random(struct udev_device *device) { +static bool mac_is_random(sd_device *device) { const char *s; unsigned type; int r; /* if we can't get the assign type, assume it is not random */ - s = udev_device_get_sysattr_value(device, "addr_assign_type"); - if (!s) + if (sd_device_get_sysattr_value(device, "addr_assign_type", &s) < 0) return false; r = safe_atou(s, &type); @@ -290,14 +298,13 @@ static bool mac_is_random(struct udev_device *device) { return type == NET_ADDR_RANDOM; } -static bool should_rename(struct udev_device *device, bool respect_predictable) { +static bool should_rename(sd_device *device, bool respect_predictable) { const char *s; unsigned type; int r; /* if we can't get the assgin type, assume we should rename */ - s = udev_device_get_sysattr_value(device, "name_assign_type"); - if (!s) + if (sd_device_get_sysattr_value(device, "name_assign_type", &s) < 0) return true; r = safe_atou(s, &type); @@ -305,23 +312,18 @@ static bool should_rename(struct udev_device *device, bool respect_predictable) return true; switch (type) { - case NET_NAME_USER: - case NET_NAME_RENAMED: - /* these were already named by userspace, do not touch again */ - return false; case NET_NAME_PREDICTABLE: /* the kernel claims to have given a predictable name */ if (respect_predictable) return false; _fallthrough_; - case NET_NAME_ENUM: default: /* the name is known to be bad, or of an unknown type */ return true; } } -static int get_mac(struct udev_device *device, bool want_random, +static int get_mac(sd_device *device, bool want_random, struct ether_addr *mac) { int r; @@ -346,7 +348,7 @@ static int get_mac(struct udev_device *device, bool want_random, } int link_config_apply(link_config_ctx *ctx, link_config *config, - struct udev_device *device, const char **name) { + sd_device *device, const char **name) { bool respect_predictable = false; struct ether_addr generated_mac; struct ether_addr *mac = NULL; @@ -360,23 +362,30 @@ int link_config_apply(link_config_ctx *ctx, link_config *config, assert(device); assert(name); - old_name = udev_device_get_sysname(device); - if (!old_name) - return -EINVAL; + r = sd_device_get_sysname(device, &old_name); + if (r < 0) + return r; r = ethtool_set_glinksettings(&ctx->ethtool_fd, old_name, config); if (r < 0) { if (config->port != _NET_DEV_PORT_INVALID) - log_warning_errno(r, "Could not set port (%s) of %s: %m", port_to_string(config->port), old_name); + log_warning_errno(r, "Could not set port (%s) of %s: %m", port_to_string(config->port), old_name); - speed = DIV_ROUND_UP(config->speed, 1000000); - if (r == -EOPNOTSUPP) - r = ethtool_set_speed(&ctx->ethtool_fd, old_name, speed, config->duplex); + if (!eqzero(config->advertise)) + log_warning_errno(r, "Could not set advertise mode: %m"); /* TODO: include modes in the log message. */ - if (r < 0) - log_warning_errno(r, "Could not set speed or duplex of %s to %u Mbps (%s): %m", - old_name, speed, duplex_to_string(config->duplex)); + if (config->speed) { + speed = DIV_ROUND_UP(config->speed, 1000000); + if (r == -EOPNOTSUPP) { + r = ethtool_set_speed(&ctx->ethtool_fd, old_name, speed, config->duplex); + if (r < 0) + log_warning_errno(r, "Could not set speed of %s to %u Mbps: %m", old_name, speed); + } + } + + if (config->duplex !=_DUP_INVALID) + log_warning_errno(r, "Could not set duplex of %s to (%s): %m", old_name, duplex_to_string(config->duplex)); } r = ethtool_set_wol(&ctx->ethtool_fd, old_name, config->wol); @@ -394,11 +403,9 @@ int link_config_apply(link_config_ctx *ctx, link_config *config, log_warning_errno(r, "Could not set channels of %s: %m", old_name); } - ifindex = udev_device_get_ifindex(device); - if (ifindex <= 0) { - log_warning("Could not find ifindex"); - return -ENODEV; - } + r = sd_device_get_ifindex(device, &ifindex); + if (r < 0) + return log_device_warning_errno(device, r, "Could not find ifindex: %m"); if (ctx->enable_name_policy && config->name_policy) { NamePolicy *policy; @@ -410,19 +417,19 @@ int link_config_apply(link_config_ctx *ctx, link_config *config, respect_predictable = true; break; case NAMEPOLICY_DATABASE: - new_name = udev_device_get_property_value(device, "ID_NET_NAME_FROM_DATABASE"); + (void) sd_device_get_property_value(device, "ID_NET_NAME_FROM_DATABASE", &new_name); break; case NAMEPOLICY_ONBOARD: - new_name = udev_device_get_property_value(device, "ID_NET_NAME_ONBOARD"); + (void) sd_device_get_property_value(device, "ID_NET_NAME_ONBOARD", &new_name); break; case NAMEPOLICY_SLOT: - new_name = udev_device_get_property_value(device, "ID_NET_NAME_SLOT"); + (void) sd_device_get_property_value(device, "ID_NET_NAME_SLOT", &new_name); break; case NAMEPOLICY_PATH: - new_name = udev_device_get_property_value(device, "ID_NET_NAME_PATH"); + (void) sd_device_get_property_value(device, "ID_NET_NAME_PATH", &new_name); break; case NAMEPOLICY_MAC: - new_name = udev_device_get_property_value(device, "ID_NET_NAME_MAC"); + (void) sd_device_get_property_value(device, "ID_NET_NAME_MAC", &new_name); break; default: break; @@ -430,12 +437,8 @@ int link_config_apply(link_config_ctx *ctx, link_config *config, } } - if (should_rename(device, respect_predictable)) { - /* if not set by policy, fall back manually set name */ - if (!new_name) - new_name = config->name; - } else - new_name = NULL; + if (!new_name && should_rename(device, respect_predictable)) + new_name = config->name; switch (config->mac_policy) { case MACPOLICY_PERSISTENT: @@ -474,14 +477,14 @@ int link_config_apply(link_config_ctx *ctx, link_config *config, return 0; } -int link_get_driver(link_config_ctx *ctx, struct udev_device *device, char **ret) { +int link_get_driver(link_config_ctx *ctx, sd_device *device, char **ret) { const char *name; char *driver = NULL; int r; - name = udev_device_get_sysname(device); - if (!name) - return -EINVAL; + r = sd_device_get_sysname(device, &name); + if (r < 0) + return r; r = ethtool_get_driver(&ctx->ethtool_fd, name, &driver); if (r < 0) |