chiark / gitweb /
udev: link-config - move naming policy from udev rules
authorTom Gundersen <teg@jklm.no>
Sun, 27 Oct 2013 23:19:59 +0000 (00:19 +0100)
committerTom Gundersen <teg@jklm.no>
Mon, 28 Oct 2013 00:18:04 +0000 (01:18 +0100)
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.

Makefile.am
links/99-default.link [new file with mode: 0644]
rules/80-net-name-slot.rules [deleted file]
src/shared/util.c
src/udev/net/link-config-gperf.gperf
src/udev/net/link-config.c
src/udev/net/link-config.h

index e5ed3020b1932afd8323eef4c20bdd981c0d6dd3..4a96a500575a54faaf5a49e5662e9951dcb14617 100644 (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
 
diff --git a/links/99-default.link b/links/99-default.link
new file mode 100644 (file)
index 0000000..c5043b8
--- /dev/null
@@ -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 (file)
index c5f1b38..0000000
+++ /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"
index 2419a76d9887eb71be3578b66eadc754babbcf33..ef3b67b597594597e0c005fa628565158b493076 100644 (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)
index 182a6641929005951feefe92843909d9317b6980..b38dbe80bdaebc1f20c5898a7dadbf1eecd63548 100644 (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)
index bb0640589be5160e26b6e66ee45219727e594265..9c75b62b735eb78858d7e16f378601ce97c5d0e9 100644 (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;
index 849e481520e3aa068204296e69f7714cd9e34c87..0f57dc9cbc84e67a5c4cdb80ff52c276be5d340d 100644 (file)
@@ -39,6 +39,7 @@ struct link_config {
 
         char *description;
         char *mac;
+        char **name_policy;
         char *name;
         unsigned int mtu;
         unsigned int speed;