/src/systemd/src/udev/net/naming-scheme.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* SPDX-License-Identifier: LGPL-2.1+ */ |
2 | | #pragma once |
3 | | |
4 | | #include <stdbool.h> |
5 | | |
6 | | #include "macro.h" |
7 | | |
8 | | /* So here's the deal: net_id is supposed to be an exercise in providing stable names for network devices. However, we |
9 | | * also want to keep updating the naming scheme used in future versions of net_id. These two goals of course are |
10 | | * contradictory: on one hand we want things to not change and on the other hand we want them to improve. Our way out |
11 | | * of this dilemma is to introduce the "naming scheme" concept: each time we improve the naming logic we define a new |
12 | | * flag for it. Then, we keep a list of schemes, each identified by a name associated with the flags it implements. Via |
13 | | * a kernel command line and environment variable we then allow the user to pick the scheme they want us to follow: |
14 | | * installers could "freeze" the used scheme at the moment of installation this way. |
15 | | * |
16 | | * Developers: each time you tweak the naming logic here, define a new flag below, and condition the tweak with |
17 | | * it. Each time we do a release we'll then add a new scheme entry and include all newly defined flags. |
18 | | * |
19 | | * Note that this is only half a solution to the problem though: not only udev/net_id gets updated all the time, the |
20 | | * kernel gets too. And thus a kernel that previously didn't expose some sysfs attribute we look for might eventually |
21 | | * do, and thus affect our naming scheme too. Thus, enforcing a naming scheme will make interfacing more stable across |
22 | | * OS versions, but not fully stabilize them. */ |
23 | | typedef enum NamingSchemeFlags { |
24 | | /* First, the individual features */ |
25 | | NAMING_SR_IOV_V = 1 << 0, /* Use "v" suffix for SR-IOV, see 609948c7043a */ |
26 | | NAMING_NPAR_ARI = 1 << 1, /* Use NPAR "ARI", see 6bc04997b6ea */ |
27 | | NAMING_INFINIBAND = 1 << 2, /* Use "ib" prefix for infiniband, see 938d30aa98df */ |
28 | | NAMING_ZERO_ACPI_INDEX = 1 << 3, /* Use zero acpi_index field, see d81186ef4f6a */ |
29 | | NAMING_ALLOW_RERENAMES = 1 << 4, /* Allow re-renaming of devices, see #9006 */ |
30 | | NAMING_STABLE_VIRTUAL_MACS = 1 << 5, /* Use device name to generate MAC, see 6d3646406560 */ |
31 | | NAMING_NETDEVSIM = 1 << 6, /* Generate names for netdevsim devices, see eaa9d507d855 */ |
32 | | NAMING_LABEL_NOPREFIX = 1 << 7, /* Don't prepend ID_NET_LABEL_ONBOARD with interface type prefix */ |
33 | | |
34 | | /* And now the masks that combine the features above */ |
35 | | NAMING_V238 = 0, |
36 | | NAMING_V239 = NAMING_V238 | NAMING_SR_IOV_V | NAMING_NPAR_ARI, |
37 | | NAMING_V240 = NAMING_V239 | NAMING_INFINIBAND | NAMING_ZERO_ACPI_INDEX | NAMING_ALLOW_RERENAMES, |
38 | | NAMING_V241 = NAMING_V240 | NAMING_STABLE_VIRTUAL_MACS, |
39 | | NAMING_V243 = NAMING_V241 | NAMING_NETDEVSIM | NAMING_LABEL_NOPREFIX, |
40 | | |
41 | | _NAMING_SCHEME_FLAGS_INVALID = -1, |
42 | | } NamingSchemeFlags; |
43 | | |
44 | | typedef struct NamingScheme { |
45 | | const char *name; |
46 | | NamingSchemeFlags flags; |
47 | | } NamingScheme; |
48 | | |
49 | | const NamingScheme* naming_scheme(void); |
50 | | |
51 | 0 | static inline bool naming_scheme_has(NamingSchemeFlags flags) { |
52 | 0 | return FLAGS_SET(naming_scheme()->flags, flags); |
53 | 0 | } Unexecuted instantiation: udev-builtin-net_id.c:naming_scheme_has Unexecuted instantiation: link-config.c:naming_scheme_has Unexecuted instantiation: naming-scheme.c:naming_scheme_has |