1 /* SPDX-License-Identifier: LGPL-2.1+ */
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.
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.
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 609948c7043a40008b8299529c978ed8e11de8f6*/
26 NAMING_NPAR_ARI
= 1 << 1, /* Use NPAR "ARI", see 6bc04997b6eab35d1cb9fa73889892702c27be09 */
27 NAMING_INFINIBAND
= 1 << 2, /* Use "ib" prefix for infiniband, see 938d30aa98df887797c9e05074a562ddacdcdf5e */
28 NAMING_ZERO_ACPI_INDEX
= 1 << 3, /* Use zero acpi_index field, see d81186ef4f6a888a70f20a1e73a812d6acb9e22f */
29 NAMING_ALLOW_RERENAMES
= 1 << 4, /* Allow re-renaming of devices, see #9006 */
30 NAMING_NETDEVSIM
= 1 << 5, /* Generate names for netdevsim devices, see eaa9d507d85509c8bf727356e3884ec54b0fc646 */
32 /* And now the masks that combine the features above */
34 NAMING_V239
= NAMING_V238
| NAMING_SR_IOV_V
| NAMING_NPAR_ARI
,
35 NAMING_V240
= NAMING_V239
| NAMING_INFINIBAND
| NAMING_ZERO_ACPI_INDEX
| NAMING_ALLOW_RERENAMES
,
36 NAMING_V243
= NAMING_V240
| NAMING_NETDEVSIM
,
38 _NAMING_SCHEME_FLAGS_INVALID
= -1,
41 typedef struct NamingScheme
{
43 NamingSchemeFlags flags
;
46 const NamingScheme
* naming_scheme(void);
48 static inline bool naming_scheme_has(NamingSchemeFlags flags
) {
49 return FLAGS_SET(naming_scheme()->flags
, flags
);