udev: link-config - move naming policy from udev rules

This introduces a new key NamePolicy, which takes an ordered list of naming
policies. The first successful one is applide. If all fail the value of Name
(if any) is used.

The possible policies are 'onboard', 'slot', 'path' and 'mac'.

This patch introduces a default link file, which replaces the equivalent udev
rule.
This commit is contained in:
Tom Gundersen 2013-10-28 00:19:59 +01:00
parent 2a73e0d39a
commit daeb71a36a
7 changed files with 59 additions and 19 deletions

View file

@ -83,7 +83,7 @@ userunitdir=$(prefix)/lib/systemd/user
userpresetdir=$(prefix)/lib/systemd/user-preset
tmpfilesdir=$(prefix)/lib/tmpfiles.d
sysctldir=$(prefix)/lib/sysctl.d
linkdir=$(prefix)/lib/net/links
linksdir=$(prefix)/lib/net/links
pkgincludedir=$(includedir)/systemd
systemgeneratordir=$(rootlibexecdir)/system-generators
usergeneratordir=$(prefix)/lib/systemd/user-generators
@ -2214,6 +2214,9 @@ INSTALL_DIRS += \
$(sysconfdir)/udev/rules.d \
$(sysconfdir)/udev/hwdb.d
dist_links_DATA = \
links/99-default.link
dist_udevrules_DATA += \
rules/99-systemd.rules \
rules/42-usb-hid-pm.rules \
@ -2228,7 +2231,6 @@ dist_udevrules_DATA += \
rules/75-net-description.rules \
rules/75-tty-description.rules \
rules/78-sound-card.rules \
rules/80-net-name-slot.rules \
rules/85-net-configure-link.rules \
rules/95-udev-late.rules

2
links/99-default.link Normal file
View file

@ -0,0 +1,2 @@
[Link]
NamePolicy=onboard slot path

View file

@ -1,14 +0,0 @@
# do not edit this file, it will be overwritten on update
ACTION!="add", GOTO="net_name_slot_end"
SUBSYSTEM!="net", GOTO="net_name_slot_end"
NAME!="", GOTO="net_name_slot_end"
IMPORT{cmdline}="net.ifnames"
ENV{net.ifnames}=="0", GOTO="net_name_slot_end"
NAME=="", ENV{ID_NET_NAME_ONBOARD}!="", NAME="$env{ID_NET_NAME_ONBOARD}"
NAME=="", ENV{ID_NET_NAME_SLOT}!="", NAME="$env{ID_NET_NAME_SLOT}"
NAME=="", ENV{ID_NET_NAME_PATH}!="", NAME="$env{ID_NET_NAME_PATH}"
LABEL="net_name_slot_end"

View file

@ -6004,7 +6004,7 @@ bool restore_state(void) {
r = read_one_line_file("/proc/cmdline", &line);
if (r < 0) {
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
return 0;
return true; /* something is very wrong, let's not make it worse */
}
FOREACH_WORD_QUOTED(w, l, line, state)

View file

@ -20,6 +20,7 @@ Match.Driver, config_parse_string, 0, offsetof(link
Match.Type, config_parse_string, 0, offsetof(link_config, match_type)
Link.Description, config_parse_string, 0, offsetof(link_config, description)
Link.MACAddress, config_parse_string, 0, offsetof(link_config, mac)
Link.NamePolicy, config_parse_strv, 0, offsetof(link_config, name_policy)
Link.Name, config_parse_string, 0, offsetof(link_config, name)
Link.MTU, config_parse_unsigned, 0, offsetof(link_config, mtu)
Link.SpeedMBytes, config_parse_unsigned, 0, offsetof(link_config, speed)

View file

@ -34,6 +34,7 @@
#include "path-util.h"
#include "conf-parser.h"
#include "conf-files.h"
#include "fileio.h"
struct link_config_ctx {
LIST_HEAD(link_config, links);
@ -308,8 +309,27 @@ static int rtnl_set_properties(sd_rtnl *rtnl, int ifindex, const char *name, con
return 0;
}
static bool enable_name_policy(void) {
_cleanup_free_ char *line;
char *w, *state;
int r;
size_t l;
r = read_one_line_file("/proc/cmdline", &line);
if (r < 0) {
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
return true; /* something is very wrong, let's not make it worse */
}
FOREACH_WORD_QUOTED(w, l, line, state)
if (strneq(w, "net.ifnames=0", l))
return false;
return true;
}
int link_config_apply(link_config_ctx *ctx, link_config *config, struct udev_device *device) {
const char *name;
const char *name, *new_name = NULL;
int r, ifindex;
name = udev_device_get_sysname(device);
@ -355,7 +375,35 @@ int link_config_apply(link_config_ctx *ctx, link_config *config, struct udev_dev
return -ENODEV;
}
r = rtnl_set_properties(ctx->rtnl, ifindex, config->name, config->mac, config->mtu);
if (config->name_policy && enable_name_policy()) {
char **policy;
STRV_FOREACH(policy, config->name_policy) {
if (streq(*policy, "onboard")) {
new_name = udev_device_get_property_value(device, "ID_NET_NAME_ONBOARD");
if (new_name)
break;
} else if (streq(*policy, "slot")) {
new_name = udev_device_get_property_value(device, "ID_NET_NAME_SLOT");
if (new_name)
break;
} else if (streq(*policy, "path")) {
new_name = udev_device_get_property_value(device, "ID_NET_NAME_PATH");
if (new_name)
break;
} else if (streq(*policy, "mac")) {
new_name = udev_device_get_property_value(device, "ID_NET_NAME_MAC");
if (new_name)
break;
} else
log_warning("Invalid link naming policy '%s', ignoring.", *policy);
}
}
if (!new_name && config->name)
new_name = config->name;
r = rtnl_set_properties(ctx->rtnl, ifindex, new_name, config->mac, config->mtu);
if (r < 0) {
log_warning("Could not set Name, MACAddress or MTU on %s", name);
return r;

View file

@ -39,6 +39,7 @@ struct link_config {
char *description;
char *mac;
char **name_policy;
char *name;
unsigned int mtu;
unsigned int speed;