diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2019-01-16 14:47:56 +0100 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2019-01-17 13:56:02 +0100 |
commit | 35b351900fb7b5cf7a86813cb6549afaea2fe423 (patch) | |
tree | 19daf7ee1c9e9668659749883c7169c55dd2c4d6 | |
parent | 3907446f02d5966e795a7361860f7189c8b3ccc5 (diff) | |
download | systemd-35b351900fb7b5cf7a86813cb6549afaea2fe423.tar.gz |
udev: move naming-scheme bits into their own file
-rw-r--r-- | src/udev/meson.build | 2 | ||||
-rw-r--r-- | src/udev/net/naming-scheme.c | 64 | ||||
-rw-r--r-- | src/udev/net/naming-scheme.h | 47 | ||||
-rw-r--r-- | src/udev/udev-builtin-net_id.c | 99 |
4 files changed, 114 insertions, 98 deletions
diff --git a/src/udev/meson.build b/src/udev/meson.build index a9d6c6363f..9d3f6d1c56 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/naming-scheme.c b/src/udev/net/naming-scheme.c new file mode 100644 index 0000000000..27cede5e2e --- /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 0000000000..c7f9505ab7 --- /dev/null +++ b/src/udev/net/naming-scheme.h @@ -0,0 +1,47 @@ +/* SPDX-License-Identifier: LGPL-2.1+ */ +#pragma once + +#include <stdbool.h> + +#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 */ + + /* 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; + +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 e4d40b149c..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; |