diff --git a/NEWS b/NEWS
index c76b571d2ba..d44e51136f0 100644
--- a/NEWS
+++ b/NEWS
@@ -22,6 +22,23 @@ CHANGES WITH 241 in spe:
* $DBUS_SESSION_BUS_ADDRESS environment variable is set by pam_systemd
again.
+ * A new network device NamePolicy "keep" is implemented for link files,
+ and used by default in 99-default.link (the fallback configuration
+ provided by systemd). With this policy, if the network device name
+ was already set by userspace, the device will not be renamed again.
+ This matches the naming scheme that was implemented before
+ systemd-240. If naming-scheme < 240 is specified, the "keep" policy
+ is also enabled by default, even if not specified. Effectively, this
+ means that if naming-scheme >= 240 is specified, network devices will
+ be renamed according to the configuration, even if they have been
+ renamed already, if "keep" is not specified as the naming policy in
+ the .link file. The 99-default.link file provided by systemd includes
+ "keep" for backwards compatibility, but it is recommended for user
+ installed .link files to *not* include it.
+
+ The "kernel" policy, which keeps kernel names declared to be
+ "persistent", now works again as documented.
+
* kernel-install script now optionally takes a path to an initrd file,
and passes it to all plugins.
@@ -509,6 +526,11 @@ CHANGES WITH 240:
* $DBUS_SESSION_BUS_ADDRESS environment variable is not set by
pam_systemd anymore.
+ * The naming scheme for network devices was changed to always rename
+ devices, even if they were already renamed by userspace. The "kernel"
+ policy was changed to only apply as a fallback, if no other naming
+ policy took effect.
+
* The requirements to build systemd is bumped to meson-0.46 and
python-3.5.
diff --git a/man/systemd.link.xml b/man/systemd.link.xml
index ec0314dec3f..178f9b81afc 100644
--- a/man/systemd.link.xml
+++ b/man/systemd.link.xml
@@ -50,27 +50,21 @@
same name pointing to /dev/null disables the
configuration file entirely (it is "masked").
- The link file contains a [Match] section,
- which determines if a given link file may be applied to a given
- device, as well as a [Link] section specifying
- how the device should be configured. The first (in lexical order)
- of the link files that matches a given device is applied. Note
- that a default file 99-default.link is
- shipped by the system. Any user-supplied
- .link should hence have a lexically earlier
- name to be considered at all.
+ The link file contains a [Match] section, which determines if a given link file may be applied to a
+ given device, as well as a [Link] section specifying how the device should be configured. The first (in
+ lexical order) of the link files that matches a given device is applied. Note that a default file
+ 99-default.link is shipped by the system. Any user-supplied
+ .link should hence have a lexically earlier name to be considered at all.
- See
- udevadm8
- for diagnosing problems with .link files.
+ See udevadm8 for
+ diagnosing problems with .link files.[Match] Section Options
- A link file is said to match a device if each of the entries
- in the [Match] section matches, or if the
- section is empty. The following keys are accepted:
+ A link file is said to match a device if each of the entries in the [Match] section matches, or if
+ the section is empty. The following keys are accepted:
@@ -100,18 +94,15 @@
A whitespace-separated list of shell-style globs matching
the persistent path, as exposed by the udev property
- ID_PATH.
+ ID_PATH.
Driver=
- A whitespace-separated list of shell-style globs matching
- the driver currently bound to the device,
- as exposed by the udev property DRIVER
- of its parent device, or if that is not set, the
- driver as exposed by ethtool -i
- of the device itself.
+ A whitespace-separated list of shell-style globs matching the driver currently bound to the
+ device, as exposed by the udev property DRIVER of its parent device, or if that
+ is not set, the driver as exposed by ethtool -i of the device itself.
@@ -119,14 +110,14 @@
A whitespace-separated list of shell-style globs matching
the device type, as exposed by the udev
- property DEVTYPE.
+ property DEVTYPE.
Host=Matches against the hostname or machine
- ID of the host. See ConditionHost= in
+ ID of the host. See ConditionHost= in
systemd.unit5
for details.
@@ -137,7 +128,7 @@
Checks whether the system is executed in
a virtualized environment and optionally test
whether it is a specific implementation. See
- ConditionVirtualization= in
+ ConditionVirtualization= in
systemd.unit5
for details.
@@ -147,7 +138,7 @@
Checks whether a specific kernel command line option
is set (or if prefixed with the exclamation mark unset). See
- ConditionKernelCommandLine= in
+ ConditionKernelCommandLine= in
systemd.unit5
for details.
@@ -157,7 +148,7 @@
Checks whether the kernel version (as reported by uname -r) matches a certain
expression (or if prefixed with the exclamation mark does not match it). See
- ConditionKernelVersion= in
+ ConditionKernelVersion= in
systemd.unit5 for
details.
@@ -167,7 +158,7 @@
Architecture=Checks whether the system is running on a specific
- architecture. See ConditionArchitecture=
+ architecture. See ConditionArchitecture=
in
systemd.unit5
for details.
@@ -180,7 +171,7 @@
[Link] Section Options
- The [Link] section accepts the following
+ The [Link] section accepts the following
keys:
@@ -193,8 +184,7 @@
Alias=
- The ifalias is set to this
- value.
+ The ifalias interface property is set to this value.
@@ -206,7 +196,7 @@
- persistent
+ If the hardware has a persistent MAC address, as
most hardware should, and if it is used by the kernel,
@@ -220,7 +210,7 @@
- random
+ If the kernel is using a random MAC address,
nothing is done. Otherwise, a new address is randomly
@@ -231,7 +221,7 @@
- none
+ Keeps the MAC address assigned by the kernel.
@@ -243,28 +233,23 @@
MACAddress=The MAC address to use, if no
- MACAddressPolicy=
+ MACAddressPolicy=
is specified.NamePolicy=
- An ordered, space-separated list of policies by which
- the interface name should be set.
- NamePolicy may be disabled by specifying
- net.ifnames=0 on the kernel command line.
- Each of the policies may fail, and the first successful one
- is used. The name is not set directly, but is exported to
- udev as the property ID_NET_NAME, which
- is, by default, used by a udev rule to set
- NAME. If the name has already been set by
- userspace, no renaming is performed. The available policies
- are:
+ An ordered, space-separated list of policies by which the interface name should be set.
+ NamePolicy= may be disabled by specifying on the
+ kernel command line. Each of the policies may fail, and the first successful one is used. The name
+ is not set directly, but is exported to udev as the property , which
+ is, by default, used by a udev rule to set NAME. The available policies are:
+
- kernel
+ If the kernel claims that the name it has set
for a device is predictable, then no renaming is
@@ -272,46 +257,53 @@
- database
+ The name is set based on entries in the udev's
Hardware Database with the key
- ID_NET_NAME_FROM_DATABASE.
+ ID_NET_NAME_FROM_DATABASE.
- onboard
+ The name is set based on information given by
the firmware for on-board devices, as exported by the
- udev property ID_NET_NAME_ONBOARD.
+ udev property ID_NET_NAME_ONBOARD.
- slot
+ The name is set based on information given by
the firmware for hot-plug devices, as exported by the
- udev property ID_NET_NAME_SLOT.
+ udev property ID_NET_NAME_SLOT.
- path
+ The name is set based on the device's physical
location, as exported by the udev property
- ID_NET_NAME_PATH.
+ ID_NET_NAME_PATH.
- mac
+ The name is set based on the device's persistent
MAC address, as exported by the udev property
- ID_NET_NAME_MAC.
+ ID_NET_NAME_MAC.
+
+
+
+
+
+ If the device already had a name given by userspace (as part of creation of the device
+ or a rename), keep it.
@@ -356,9 +348,8 @@
Duplex=
- The duplex mode to set for the device. The accepted
- values are half and
- full.
+ The duplex mode to set for the device. The accepted values are and
+ .
@@ -382,58 +373,58 @@
- phy
+ Wake on PHY activity.
- unicast
+ Wake on unicast messages.
- multicast
+ Wake on multicast messages.
- broadcast
+ Wake on broadcast messages.
- arp
+ Wake on ARP.
- magic
+ Wake on receipt of a magic packet.
- secureon
+ Enable secureon(tm) password for MagicPacket(tm).
- off
+ Never wake.
- Defaults to off.
+ Defaults to .
@@ -444,32 +435,32 @@
- tp
+ An Ethernet interface using Twisted-Pair cable as the medium.
- aui
+ Attachment Unit Interface (AUI). Normally used with hubs.
- bnc
+ An Ethernet interface using BNC connectors and co-axial cable.
- mii
+ An Ethernet interface using a Media Independent Interface (MII).
- fibre
+ An Ethernet interface using Optical Fibre as the medium.
@@ -496,47 +487,46 @@
Duplex Mode
-
- 10baset-half
+ 10half
- 10baset-full
+ 10full
- 100baset-half
+ 100half
- 100baset-full
+ 100full
- 1000baset-half
+ 1000half
- 1000baset-full
+ 1000full
- 10000baset-full
+ 10000full
- 2500basex-full
+ 2500full
- 1000basekx-full
+ 1000full
- 10000basekx4-full
+ 10000full
- 10000basekr-full
+ 10000full
- 10000baser-fec
+ 10000full
- 20000basemld2-full
+ 20000full
- 20000basekr2-full
+ 20000full
diff --git a/network/99-default.link b/network/99-default.link
index 561bf329e48..92fcbe83eab 100644
--- a/network/99-default.link
+++ b/network/99-default.link
@@ -8,5 +8,5 @@
# (at your option) any later version.
[Link]
-NamePolicy=kernel database onboard slot path
+NamePolicy=keep kernel database onboard slot path
MACAddressPolicy=persistent
diff --git a/src/libsystemd-network/dhcp-identifier.c b/src/libsystemd-network/dhcp-identifier.c
index 07496adaa39..4221b9c5044 100644
--- a/src/libsystemd-network/dhcp-identifier.c
+++ b/src/libsystemd-network/dhcp-identifier.c
@@ -11,6 +11,7 @@
#include "network-internal.h"
#include "siphash24.h"
#include "sparse-endian.h"
+#include "stdio-util.h"
#include "virt.h"
#define SYSTEMD_PEN 43793
@@ -169,10 +170,10 @@ int dhcp_identifier_set_iaid(
if (detect_container() <= 0) {
/* not in a container, udev will be around */
- char ifindex_str[2 + DECIMAL_STR_MAX(int)];
+ char ifindex_str[1 + DECIMAL_STR_MAX(int)];
int r;
- sprintf(ifindex_str, "n%d", ifindex);
+ xsprintf(ifindex_str, "n%d", ifindex);
if (sd_device_new_from_device_id(&device, ifindex_str) >= 0) {
r = sd_device_get_is_initialized(device);
if (r < 0)
diff --git a/src/udev/meson.build b/src/udev/meson.build
index a9d6c6363f2..9d3f6d1c562 100644
--- a/src/udev/meson.build
+++ b/src/udev/meson.build
@@ -41,6 +41,8 @@ libudev_core_sources = '''
net/link-config.h
net/ethtool-util.c
net/ethtool-util.h
+ net/naming-scheme.c
+ net/naming-scheme.h
'''.split()
if conf.get('HAVE_KMOD') == 1
diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c
index 537cc0cdd99..eb2477cea41 100644
--- a/src/udev/net/link-config.c
+++ b/src/udev/net/link-config.c
@@ -14,6 +14,7 @@
#include "link-config.h"
#include "log.h"
#include "missing_network.h"
+#include "naming-scheme.h"
#include "netlink-util.h"
#include "network-internal.h"
#include "parse-util.h"
@@ -186,6 +187,22 @@ static bool enable_name_policy(void) {
return proc_cmdline_get_bool("net.ifnames", &b) <= 0 || b;
}
+static int link_name_type(sd_device *device, unsigned *type) {
+ const char *s;
+ int r;
+
+ r = sd_device_get_sysattr_value(device, "name_assign_type", &s);
+ if (r < 0)
+ return log_device_debug_errno(device, r, "Failed to query name_assign_type: %m");
+
+ r = safe_atou(s, type);
+ if (r < 0)
+ return log_device_warning_errno(device, r, "Failed to parse name_assign_type \"%s\": %m", s);
+
+ log_device_debug(device, "Device has name_assign_type=%d", *type);
+ return 0;
+}
+
int link_config_load(link_config_ctx *ctx) {
_cleanup_strv_free_ char **files;
char **f;
@@ -296,31 +313,6 @@ static bool mac_is_random(sd_device *device) {
return type == NET_ADDR_RANDOM;
}
-static bool should_rename(sd_device *device, bool respect_predictable) {
- const char *s;
- unsigned type;
- int r;
-
- /* if we can't get the assign type, assume we should rename */
- if (sd_device_get_sysattr_value(device, "name_assign_type", &s) < 0)
- return true;
-
- r = safe_atou(s, &type);
- if (r < 0)
- return true;
-
- switch (type) {
- case NET_NAME_PREDICTABLE:
- /* the kernel claims to have given a predictable name */
- if (respect_predictable)
- return false;
- _fallthrough_;
- default:
- /* the name is known to be bad, or of an unknown type */
- return true;
- }
-}
-
static int get_mac(sd_device *device, bool want_random,
struct ether_addr *mac) {
int r;
@@ -347,12 +339,12 @@ static int get_mac(sd_device *device, bool want_random,
int link_config_apply(link_config_ctx *ctx, link_config *config,
sd_device *device, const char **name) {
- bool respect_predictable = false;
struct ether_addr generated_mac;
struct ether_addr *mac = NULL;
const char *new_name = NULL;
const char *old_name;
- unsigned speed;
+ unsigned speed, name_type = NET_NAME_UNKNOWN;
+ NamePolicy policy;
int r, ifindex;
assert(ctx);
@@ -405,38 +397,63 @@ int link_config_apply(link_config_ctx *ctx, link_config *config,
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;
- for (policy = config->name_policy;
- !new_name && *policy != _NAMEPOLICY_INVALID; policy++) {
- switch (*policy) {
- case NAMEPOLICY_KERNEL:
- respect_predictable = true;
- break;
- case NAMEPOLICY_DATABASE:
- (void) sd_device_get_property_value(device, "ID_NET_NAME_FROM_DATABASE", &new_name);
- break;
- case NAMEPOLICY_ONBOARD:
- (void) sd_device_get_property_value(device, "ID_NET_NAME_ONBOARD", &new_name);
- break;
- case NAMEPOLICY_SLOT:
- (void) sd_device_get_property_value(device, "ID_NET_NAME_SLOT", &new_name);
- break;
- case NAMEPOLICY_PATH:
- (void) sd_device_get_property_value(device, "ID_NET_NAME_PATH", &new_name);
- break;
- case NAMEPOLICY_MAC:
- (void) sd_device_get_property_value(device, "ID_NET_NAME_MAC", &new_name);
- break;
- default:
- break;
- }
- }
+ (void) link_name_type(device, &name_type);
+
+ if (IN_SET(name_type, NET_NAME_USER, NET_NAME_RENAMED)
+ && !naming_scheme_has(NAMING_ALLOW_RERENAMES)) {
+ log_device_debug(device, "Device already has a name given by userspace, not renaming.");
+ goto no_rename;
}
- if (!new_name && should_rename(device, respect_predictable))
+ if (ctx->enable_name_policy && config->name_policy)
+ for (NamePolicy *p = config->name_policy; !new_name && *p != _NAMEPOLICY_INVALID; p++) {
+ policy = *p;
+
+ switch (policy) {
+ case NAMEPOLICY_KERNEL:
+ if (name_type != NET_NAME_PREDICTABLE)
+ continue;
+
+ /* The kernel claims to have given a predictable name, keep it. */
+ log_device_debug(device, "Policy *%s*: keeping predictable kernel name",
+ name_policy_to_string(policy));
+ goto no_rename;
+ case NAMEPOLICY_KEEP:
+ if (!IN_SET(name_type, NET_NAME_USER, NET_NAME_RENAMED))
+ continue;
+
+ log_device_debug(device, "Policy *%s*: keeping existing userspace name",
+ name_policy_to_string(policy));
+ goto no_rename;
+ case NAMEPOLICY_DATABASE:
+ (void) sd_device_get_property_value(device, "ID_NET_NAME_FROM_DATABASE", &new_name);
+ break;
+ case NAMEPOLICY_ONBOARD:
+ (void) sd_device_get_property_value(device, "ID_NET_NAME_ONBOARD", &new_name);
+ break;
+ case NAMEPOLICY_SLOT:
+ (void) sd_device_get_property_value(device, "ID_NET_NAME_SLOT", &new_name);
+ break;
+ case NAMEPOLICY_PATH:
+ (void) sd_device_get_property_value(device, "ID_NET_NAME_PATH", &new_name);
+ break;
+ case NAMEPOLICY_MAC:
+ (void) sd_device_get_property_value(device, "ID_NET_NAME_MAC", &new_name);
+ break;
+ default:
+ assert_not_reached("invalid policy");
+ }
+ }
+
+ if (new_name)
+ log_device_debug(device, "Policy *%s* yields \"%s\".", name_policy_to_string(policy), new_name);
+ else if (config->name) {
new_name = config->name;
+ log_device_debug(device, "Policies didn't yield a name, using specified Name=%s.", new_name);
+ } else
+ log_device_debug(device, "Policies didn't yield a name and Name= is not given, not renaming.");
+ no_rename:
switch (config->mac_policy) {
case MACPOLICY_PERSISTENT:
@@ -495,7 +512,7 @@ int link_get_driver(link_config_ctx *ctx, sd_device *device, char **ret) {
static const char* const mac_policy_table[_MACPOLICY_MAX] = {
[MACPOLICY_PERSISTENT] = "persistent",
[MACPOLICY_RANDOM] = "random",
- [MACPOLICY_NONE] = "none"
+ [MACPOLICY_NONE] = "none",
};
DEFINE_STRING_TABLE_LOOKUP(mac_policy, MACPolicy);
@@ -504,11 +521,12 @@ DEFINE_CONFIG_PARSE_ENUM(config_parse_mac_policy, mac_policy, MACPolicy,
static const char* const name_policy_table[_NAMEPOLICY_MAX] = {
[NAMEPOLICY_KERNEL] = "kernel",
+ [NAMEPOLICY_KEEP] = "keep",
[NAMEPOLICY_DATABASE] = "database",
[NAMEPOLICY_ONBOARD] = "onboard",
[NAMEPOLICY_SLOT] = "slot",
[NAMEPOLICY_PATH] = "path",
- [NAMEPOLICY_MAC] = "mac"
+ [NAMEPOLICY_MAC] = "mac",
};
DEFINE_STRING_TABLE_LOOKUP(name_policy, NamePolicy);
diff --git a/src/udev/net/link-config.h b/src/udev/net/link-config.h
index 82049590346..1113b1052e7 100644
--- a/src/udev/net/link-config.h
+++ b/src/udev/net/link-config.h
@@ -22,6 +22,7 @@ typedef enum MACPolicy {
typedef enum NamePolicy {
NAMEPOLICY_KERNEL,
+ NAMEPOLICY_KEEP,
NAMEPOLICY_DATABASE,
NAMEPOLICY_ONBOARD,
NAMEPOLICY_SLOT,
diff --git a/src/udev/net/naming-scheme.c b/src/udev/net/naming-scheme.c
new file mode 100644
index 00000000000..27cede5e2e5
--- /dev/null
+++ b/src/udev/net/naming-scheme.c
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#include "alloc-util.h"
+#include "naming-scheme.h"
+#include "proc-cmdline.h"
+#include "string-util.h"
+
+static const NamingScheme naming_schemes[] = {
+ { "v238", NAMING_V238 },
+ { "v239", NAMING_V239 },
+ { "v240", NAMING_V240 },
+ /* … add more schemes here, as the logic to name devices is updated … */
+};
+
+static const NamingScheme* naming_scheme_from_name(const char *name) {
+ size_t i;
+
+ if (streq(name, "latest"))
+ return naming_schemes + ELEMENTSOF(naming_schemes) - 1;
+
+ for (i = 0; i < ELEMENTSOF(naming_schemes); i++)
+ if (streq(naming_schemes[i].name, name))
+ return naming_schemes + i;
+
+ return NULL;
+}
+
+const NamingScheme* naming_scheme(void) {
+ static const NamingScheme *cache = NULL;
+ _cleanup_free_ char *buffer = NULL;
+ const char *e, *k;
+
+ if (cache)
+ return cache;
+
+ /* Acquire setting from the kernel command line */
+ (void) proc_cmdline_get_key("net.naming-scheme", 0, &buffer);
+
+ /* Also acquire it from an env var */
+ e = getenv("NET_NAMING_SCHEME");
+ if (e) {
+ if (*e == ':') {
+ /* If prefixed with ':' the kernel cmdline takes precedence */
+ k = buffer ?: e + 1;
+ } else
+ k = e; /* Otherwise the env var takes precedence */
+ } else
+ k = buffer;
+
+ if (k) {
+ cache = naming_scheme_from_name(k);
+ if (cache) {
+ log_info("Using interface naming scheme '%s'.", cache->name);
+ return cache;
+ }
+
+ log_warning("Unknown interface naming scheme '%s' requested, ignoring.", k);
+ }
+
+ cache = naming_scheme_from_name(DEFAULT_NET_NAMING_SCHEME);
+ assert(cache);
+ log_info("Using default interface naming scheme '%s'.", cache->name);
+
+ return cache;
+}
diff --git a/src/udev/net/naming-scheme.h b/src/udev/net/naming-scheme.h
new file mode 100644
index 00000000000..0b3d9bff1d7
--- /dev/null
+++ b/src/udev/net/naming-scheme.h
@@ -0,0 +1,48 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#pragma once
+
+#include
+
+#include "macro.h"
+
+/* So here's the deal: net_id is supposed to be an excercise in providing stable names for network devices. However, we
+ * also want to keep updating the naming scheme used in future versions of net_id. These two goals of course are
+ * contradictory: on one hand we want things to not change and on the other hand we want them to improve. Our way out
+ * of this dilemma is to introduce the "naming scheme" concept: each time we improve the naming logic we define a new
+ * flag for it. Then, we keep a list of schemes, each identified by a name associated with the flags it implements. Via
+ * a kernel command line and environment variable we then allow the user to pick the scheme they want us to follow:
+ * installers could "freeze" the used scheme at the moment of installation this way.
+ *
+ * Developers: each time you tweak the naming logic here, define a new flag below, and condition the tweak with
+ * it. Each time we do a release we'll then add a new scheme entry and include all newly defined flags.
+ *
+ * Note that this is only half a solution to the problem though: not only udev/net_id gets updated all the time, the
+ * kernel gets too. And thus a kernel that previously didn't expose some sysfs attribute we look for might eventually
+ * do, and thus affect our naming scheme too. Thus, enforcing a naming scheme will make interfacing more stable across
+ * OS versions, but not fully stabilize them. */
+typedef enum NamingSchemeFlags {
+ /* First, the individual features */
+ NAMING_SR_IOV_V = 1 << 0, /* Use "v" suffix for SR-IOV, see 609948c7043a40008b8299529c978ed8e11de8f6*/
+ NAMING_NPAR_ARI = 1 << 1, /* Use NPAR "ARI", see 6bc04997b6eab35d1cb9fa73889892702c27be09 */
+ NAMING_INFINIBAND = 1 << 2, /* Use "ib" prefix for infiniband, see 938d30aa98df887797c9e05074a562ddacdcdf5e */
+ NAMING_ZERO_ACPI_INDEX = 1 << 3, /* Allow zero acpi_index field, see d81186ef4f6a888a70f20a1e73a812d6acb9e22f */
+ NAMING_ALLOW_RERENAMES = 1 << 4, /* Allow re-renaming of devices, see #9006 */
+
+ /* And now the masks that combine the features above */
+ NAMING_V238 = 0,
+ NAMING_V239 = NAMING_V238 | NAMING_SR_IOV_V | NAMING_NPAR_ARI,
+ NAMING_V240 = NAMING_V239 | NAMING_INFINIBAND | NAMING_ZERO_ACPI_INDEX | NAMING_ALLOW_RERENAMES,
+
+ _NAMING_SCHEME_FLAGS_INVALID = -1,
+} NamingSchemeFlags;
+
+typedef struct NamingScheme {
+ const char *name;
+ NamingSchemeFlags flags;
+} NamingScheme;
+
+const NamingScheme* naming_scheme(void);
+
+static inline bool naming_scheme_has(NamingSchemeFlags flags) {
+ return FLAGS_SET(naming_scheme()->flags, flags);
+}
diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
index e4d40b149cc..03b281a7710 100644
--- a/src/udev/udev-builtin-net_id.c
+++ b/src/udev/udev-builtin-net_id.c
@@ -106,6 +106,7 @@
#include "fd-util.h"
#include "fileio.h"
#include "fs-util.h"
+#include "naming-scheme.h"
#include "parse-util.h"
#include "proc-cmdline.h"
#include "stdio-util.h"
@@ -116,48 +117,6 @@
#define ONBOARD_INDEX_MAX (16*1024-1)
-/* So here's the deal: net_id is supposed to be an excercise in providing stable names for network devices. However, we
- * also want to keep updating the naming scheme used in future versions of net_id. These two goals of course are
- * contradictory: on one hand we want things to not change and on the other hand we want them to improve. Our way out
- * of this dilemma is to introduce the "naming scheme" concept: each time we improve the naming logic we define a new
- * flag for it. Then, we keep a list of schemes, each identified by a name associated with the flags it implements. Via
- * a kernel command line and environment variable we then allow the user to pick the scheme they want us to follow:
- * installers could "freeze" the used scheme at the moment of installation this way.
- *
- * Developers: each time you tweak the naming logic here, define a new flag below, and condition the tweak with
- * it. Each time we do a release we'll then add a new scheme entry and include all newly defined flags.
- *
- * Note that this is only half a solution to the problem though: not only udev/net_id gets updated all the time, the
- * kernel gets too. And thus a kernel that previously didn't expose some sysfs attribute we look for might eventually
- * do, and thus affect our naming scheme too. Thus, enforcing a naming scheme will make interfacing more stable across
- * OS versions, but not fully stabilize them. */
-typedef enum NamingSchemeFlags {
- /* First, the individual features */
- NAMING_SR_IOV_V = 1 << 0, /* Use "v" suffix for SR-IOV, see 609948c7043a40008b8299529c978ed8e11de8f6*/
- NAMING_NPAR_ARI = 1 << 1, /* Use NPAR "ARI", see 6bc04997b6eab35d1cb9fa73889892702c27be09 */
- NAMING_INFINIBAND = 1 << 2, /* Use "ib" prefix for infiniband, see 938d30aa98df887797c9e05074a562ddacdcdf5e */
- NAMING_ZERO_ACPI_INDEX = 1 << 3, /* Allow zero acpi_index field, see d81186ef4f6a888a70f20a1e73a812d6acb9e22f */
-
- /* And now the masks that combine the features above */
- NAMING_V238 = 0,
- NAMING_V239 = NAMING_V238|NAMING_SR_IOV_V|NAMING_NPAR_ARI,
- NAMING_V240 = NAMING_V239|NAMING_INFINIBAND|NAMING_ZERO_ACPI_INDEX,
-
- _NAMING_SCHEME_FLAGS_INVALID = -1,
-} NamingSchemeFlags;
-
-typedef struct NamingScheme {
- const char *name;
- NamingSchemeFlags flags;
-} NamingScheme;
-
-static const NamingScheme naming_schemes[] = {
- { "v238", NAMING_V238 },
- { "v239", NAMING_V239 },
- { "v240", NAMING_V240 },
- /* … add more schemes here, as the logic to name devices is updated … */
-};
-
enum netname_type{
NET_UNDEF,
NET_PCI,
@@ -193,62 +152,6 @@ struct virtfn_info {
char suffix[IFNAMSIZ];
};
-static const NamingScheme* naming_scheme_from_name(const char *name) {
- size_t i;
-
- if (streq(name, "latest"))
- return naming_schemes + ELEMENTSOF(naming_schemes) - 1;
-
- for (i = 0; i < ELEMENTSOF(naming_schemes); i++)
- if (streq(naming_schemes[i].name, name))
- return naming_schemes + i;
-
- return NULL;
-}
-
-static const NamingScheme* naming_scheme(void) {
- static const NamingScheme *cache = NULL;
- _cleanup_free_ char *buffer = NULL;
- const char *e, *k;
-
- if (cache)
- return cache;
-
- /* Acquire setting from the kernel command line */
- (void) proc_cmdline_get_key("net.naming-scheme", 0, &buffer);
-
- /* Also acquire it from an env var */
- e = getenv("NET_NAMING_SCHEME");
- if (e) {
- if (*e == ':') {
- /* If prefixed with ':' the kernel cmdline takes precedence */
- k = buffer ?: e + 1;
- } else
- k = e; /* Otherwise the env var takes precedence */
- } else
- k = buffer;
-
- if (k) {
- cache = naming_scheme_from_name(k);
- if (cache) {
- log_info("Using interface naming scheme '%s'.", cache->name);
- return cache;
- }
-
- log_warning("Unknown interface naming scheme '%s' requested, ignoring.", k);
- }
-
- cache = naming_scheme_from_name(DEFAULT_NET_NAMING_SCHEME);
- assert(cache);
- log_info("Using default interface naming scheme '%s'.", cache->name);
-
- return cache;
-}
-
-static bool naming_scheme_has(NamingSchemeFlags flags) {
- return FLAGS_SET(naming_scheme()->flags, flags);
-}
-
/* skip intermediate virtio devices */
static sd_device *skip_virtio(sd_device *dev) {
sd_device *parent;
diff --git a/src/udev/udev-builtin.c b/src/udev/udev-builtin.c
index 3a61be10caa..48ce295a465 100644
--- a/src/udev/udev-builtin.c
+++ b/src/udev/udev-builtin.c
@@ -139,7 +139,7 @@ int udev_builtin_add_property(sd_device *dev, bool test, const char *key, const
key, val ? "=" : "", strempty(val));
if (test)
- printf("%s=%s\n", key, val);
+ printf("%s=%s\n", key, strempty(val));
return 0;
}