aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2013-10-28 00:19:59 +0100
committerTom Gundersen <teg@jklm.no>2013-10-28 01:18:04 +0100
commitdaeb71a36a98834664e4d95773a3629b746f4db8 (patch)
tree5b8aeab2278a26dace26feb13629d22e52c89500
parentudev: link-config - sanity check the ifname and mac address (diff)
downloadsystemd-daeb71.tar.xz
systemd-daeb71.zip
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.
-rw-r--r--Makefile.am6
-rw-r--r--links/99-default.link2
-rw-r--r--rules/80-net-name-slot.rules14
-rw-r--r--src/shared/util.c2
-rw-r--r--src/udev/net/link-config-gperf.gperf1
-rw-r--r--src/udev/net/link-config.c52
-rw-r--r--src/udev/net/link-config.h1
7 files changed, 59 insertions, 19 deletions
diff --git a/Makefile.am b/Makefile.am
index e5ed3020b19..4a96a500575 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -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
diff --git a/links/99-default.link b/links/99-default.link
new file mode 100644
index 00000000000..c5043b85706
--- /dev/null
+++ b/links/99-default.link
@@ -0,0 +1,2 @@
+[Link]
+NamePolicy=onboard slot path
diff --git a/rules/80-net-name-slot.rules b/rules/80-net-name-slot.rules
deleted file mode 100644
index c5f1b3885b0..00000000000
--- a/rules/80-net-name-slot.rules
+++ /dev/null
@@ -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"
diff --git a/src/shared/util.c b/src/shared/util.c
index 2419a76d988..ef3b67b5975 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -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)
diff --git a/src/udev/net/link-config-gperf.gperf b/src/udev/net/link-config-gperf.gperf
index 182a6641929..b38dbe80bda 100644
--- a/src/udev/net/link-config-gperf.gperf
+++ b/src/udev/net/link-config-gperf.gperf
@@ -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)
diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c
index bb0640589be..9c75b62b735 100644
--- a/src/udev/net/link-config.c
+++ b/src/udev/net/link-config.c
@@ -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;
diff --git a/src/udev/net/link-config.h b/src/udev/net/link-config.h
index 849e481520e..0f57dc9cbc8 100644
--- a/src/udev/net/link-config.h
+++ b/src/udev/net/link-config.h
@@ -39,6 +39,7 @@ struct link_config {
char *description;
char *mac;
+ char **name_policy;
char *name;
unsigned int mtu;
unsigned int speed;