summaryrefslogtreecommitdiff
path: root/src/udev/udev-builtin-net_id.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/udev/udev-builtin-net_id.c')
-rw-r--r--src/udev/udev-builtin-net_id.c103
1 files changed, 3 insertions, 100 deletions
diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
index 0292c4973c..03b281a771 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;
@@ -460,7 +363,7 @@ static int dev_pci_slot(sd_device *dev, struct netnames *names) {
}
}
- /* kernel provided front panel port name for multiple port PCI device */
+ /* kernel provided front panel port name for multi-port PCI device */
(void) sd_device_get_sysattr_value(dev, "phys_port_name", &port_name);
/* compose a name based on the raw kernel's PCI bus, slot numbers */
@@ -478,7 +381,7 @@ static int dev_pci_slot(sd_device *dev, struct netnames *names) {
if (l == 0)
names->pci_path[0] = '\0';
- /* ACPI _SUN — slot user number */
+ /* ACPI _SUN — slot user number */
r = sd_device_new_from_subsystem_sysname(&pci, "subsystem", "pci");
if (r < 0)
return r;