From 681cb84a63c14410449469c580ea3cc54f590ca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 28 Sep 2021 10:12:36 +0200 Subject: [PATCH] meson: allow extra net naming schemes to be defined during configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In upstream, we have a linearly-growing list of net-naming-scheme defines; we add a new one for every release where we make user-visible changes to the naming scheme. But the general idea was that downstream distributions could define their own combinations (or even just their own names for existing combinations), so provide stability for their users. So far this required patching of the netif-naming-scheme.c and .h files to add the new lines. With this patch, patching is not required: $ meson configure build \ -Dextra-net-naming-schemes=gargoyle=v238+npar_ari+allow_rerenames,gargoyle2=gargoyle+nspawn_long_hash \ -Ddefault-net-naming-scheme=gargoyle2 or even $ meson configure build \ -Dextra-net-naming-schemes=gargoyle=v238+npar_ari+allow_rerenames,gargoyle2=gargoyle+nspawn_long_hash,latest=v249 \ -Ddefault-net-naming-scheme=gargoyle2 The syntax is a comma-separated list of NAME=name+name+… This syntax is a bit scary, but any typos result in compilation errors, so I think it should be OK in practice. With this approach, we don't allow users to define arbitrary combinations: what is allowed is still defined at compilation time, so it's up to the distribution maintainers to provide reasonable combinations. In this regard, the only difference from status quo is that it's much easier to do (and harder to do incorrectly, for example by forgetting to add a name to one of the maps). --- meson.build | 18 ++++++++++++++++++ meson_options.txt | 2 ++ src/shared/netif-naming-scheme.c | 10 ++++++++-- src/shared/netif-naming-scheme.h | 2 ++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 67695a43682..0d716d54853 100644 --- a/meson.build +++ b/meson.build @@ -707,6 +707,24 @@ else conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL') endif +extra_net_naming_schemes = [] +extra_net_naming_map = [] +foreach scheme: get_option('extra-net-naming-schemes').split(',') + if scheme != '' + name = scheme.split('=')[0] + value = scheme.split('=')[1] + NAME = name.underscorify().to_upper() + VALUE = [] + foreach field: value.split('+') + VALUE += 'NAMING_' + field.underscorify().to_upper() + endforeach + extra_net_naming_schemes += 'NAMING_@0@ = @1@,'.format(NAME, '|'.join(VALUE)) + extra_net_naming_map += '{ "@0@", NAMING_@1@ },'.format(name, NAME) + endif +endforeach +conf.set('EXTRA_NET_NAMING_SCHEMES', ' '.join(extra_net_naming_schemes)) +conf.set('EXTRA_NET_NAMING_MAP', ' '.join(extra_net_naming_map)) + default_net_naming_scheme = get_option('default-net-naming-scheme') conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme) if default_net_naming_scheme != 'latest' diff --git a/meson_options.txt b/meson_options.txt index 15be1959d1f..c09a23dc03e 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -200,6 +200,8 @@ option('fallback-hostname', type : 'string', value : 'localhost', option('default-hierarchy', type : 'combo', choices : ['legacy', 'hybrid', 'unified'], value : 'unified', description : 'default cgroup hierarchy') +option('extra-net-naming-schemes', type : 'string', + description : 'comma-separated list of extra net.naming-scheme= definitions') option('default-net-naming-scheme', type : 'string', value : 'latest', description : 'default net.naming-scheme= value') option('status-unit-format-default', type : 'combo', diff --git a/src/shared/netif-naming-scheme.c b/src/shared/netif-naming-scheme.c index 287a942014b..d949f7381a8 100644 --- a/src/shared/netif-naming-scheme.c +++ b/src/shared/netif-naming-scheme.c @@ -22,16 +22,22 @@ static const NamingScheme naming_schemes[] = { { "v247", NAMING_V247 }, { "v249", NAMING_V249 }, /* … add more schemes here, as the logic to name devices is updated … */ + + EXTRA_NET_NAMING_MAP }; const NamingScheme* naming_scheme_from_name(const char *name) { - if (streq(name, "latest")) - return naming_schemes + ELEMENTSOF(naming_schemes) - 1; + /* "latest" may either be defined explicitly by the extra map, in which case we we will find it in + * the table like any other name. After iterating through the table, we check for "latest" again, + * which means that if not mapped explicitly, it maps to the last defined entry, whatever that is. */ for (size_t i = 0; i < ELEMENTSOF(naming_schemes); i++) if (streq(naming_schemes[i].name, name)) return naming_schemes + i; + if (streq(name, "latest")) + return naming_schemes + ELEMENTSOF(naming_schemes) - 1; + return NULL; } diff --git a/src/shared/netif-naming-scheme.h b/src/shared/netif-naming-scheme.h index f5d040cc090..0141a4fb90a 100644 --- a/src/shared/netif-naming-scheme.h +++ b/src/shared/netif-naming-scheme.h @@ -46,6 +46,8 @@ typedef enum NamingSchemeFlags { NAMING_V247 = NAMING_V245 | NAMING_BRIDGE_NO_SLOT, NAMING_V249 = NAMING_V247 | NAMING_SLOT_FUNCTION_ID | NAMING_16BIT_INDEX | NAMING_REPLACE_STRICTLY, + EXTRA_NET_NAMING_SCHEMES + _NAMING_SCHEME_FLAGS_INVALID = -EINVAL, } NamingSchemeFlags;