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;