summaryrefslogtreecommitdiff
path: root/src/udev/net/link-config.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/udev/net/link-config.c')
-rw-r--r--src/udev/net/link-config.c125
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)