mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-22 13:33:56 +03:00
udev: move naming-scheme bits into their own file
This commit is contained in:
parent
3907446f02
commit
35b351900f
@ -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
|
||||
|
64
src/udev/net/naming-scheme.c
Normal file
64
src/udev/net/naming-scheme.c
Normal file
@ -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;
|
||||
}
|
47
src/udev/net/naming-scheme.h
Normal file
47
src/udev/net/naming-scheme.h
Normal file
@ -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);
|
||||
}
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user