Line data Source code
1 : /* SPDX-License-Identifier: LGPL-2.1+ */ 2 : #include "alloc-util.h" 3 : #include "naming-scheme.h" 4 : #include "proc-cmdline.h" 5 : #include "string-util.h" 6 : 7 : static const NamingScheme naming_schemes[] = { 8 : { "v238", NAMING_V238 }, 9 : { "v239", NAMING_V239 }, 10 : { "v240", NAMING_V240 }, 11 : { "v241", NAMING_V241 }, 12 : { "v243", NAMING_V243 }, 13 : /* … add more schemes here, as the logic to name devices is updated … */ 14 : }; 15 : 16 0 : static const NamingScheme* naming_scheme_from_name(const char *name) { 17 : size_t i; 18 : 19 0 : if (streq(name, "latest")) 20 0 : return naming_schemes + ELEMENTSOF(naming_schemes) - 1; 21 : 22 0 : for (i = 0; i < ELEMENTSOF(naming_schemes); i++) 23 0 : if (streq(naming_schemes[i].name, name)) 24 0 : return naming_schemes + i; 25 : 26 0 : return NULL; 27 : } 28 : 29 0 : const NamingScheme* naming_scheme(void) { 30 : static const NamingScheme *cache = NULL; 31 0 : _cleanup_free_ char *buffer = NULL; 32 : const char *e, *k; 33 : 34 0 : if (cache) 35 0 : return cache; 36 : 37 : /* Acquire setting from the kernel command line */ 38 0 : (void) proc_cmdline_get_key("net.naming-scheme", 0, &buffer); 39 : 40 : /* Also acquire it from an env var */ 41 0 : e = getenv("NET_NAMING_SCHEME"); 42 0 : if (e) { 43 0 : if (*e == ':') { 44 : /* If prefixed with ':' the kernel cmdline takes precedence */ 45 0 : k = buffer ?: e + 1; 46 : } else 47 0 : k = e; /* Otherwise the env var takes precedence */ 48 : } else 49 0 : k = buffer; 50 : 51 0 : if (k) { 52 0 : cache = naming_scheme_from_name(k); 53 0 : if (cache) { 54 0 : log_info("Using interface naming scheme '%s'.", cache->name); 55 0 : return cache; 56 : } 57 : 58 0 : log_warning("Unknown interface naming scheme '%s' requested, ignoring.", k); 59 : } 60 : 61 0 : cache = naming_scheme_from_name(DEFAULT_NET_NAMING_SCHEME); 62 0 : assert(cache); 63 0 : log_info("Using default interface naming scheme '%s'.", cache->name); 64 : 65 0 : return cache; 66 : }