all: differentiate NM_CLONED_MAC_IS_SPECIAL() for wired/wireless

Will be used next, when we support "stable-ssid" for
"wifi.cloned-mac-address" property.
This commit is contained in:
Thomas Haller 2023-11-14 11:56:30 +01:00
parent 901a1b096b
commit 587f5afb5a
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
15 changed files with 59 additions and 30 deletions

View file

@ -670,9 +670,9 @@ check_connection_cloned_mac_address(NMConnection *orig,
cand_mac = nm_setting_wired_get_cloned_mac_address(s_wired_cand); cand_mac = nm_setting_wired_get_cloned_mac_address(s_wired_cand);
/* special cloned mac address entries are accepted. */ /* special cloned mac address entries are accepted. */
if (NM_CLONED_MAC_IS_SPECIAL(orig_mac)) if (NM_CLONED_MAC_IS_SPECIAL(orig_mac, FALSE))
orig_mac = NULL; orig_mac = NULL;
if (NM_CLONED_MAC_IS_SPECIAL(cand_mac)) if (NM_CLONED_MAC_IS_SPECIAL(cand_mac, FALSE))
cand_mac = NULL; cand_mac = NULL;
if (!orig_mac || !cand_mac) { if (!orig_mac || !cand_mac) {

View file

@ -2352,7 +2352,7 @@ _prop_get_x_cloned_mac_address(NMDevice *self, NMConnection *connection, gboolea
if (v == NM_SETTING_MAC_RANDOMIZATION_ALWAYS) if (v == NM_SETTING_MAC_RANDOMIZATION_ALWAYS)
addr = NM_CLONED_MAC_RANDOM; addr = NM_CLONED_MAC_RANDOM;
} }
} else if (NM_CLONED_MAC_IS_SPECIAL(a) || nm_utils_hwaddr_valid(a, ETH_ALEN)) } else if (NM_CLONED_MAC_IS_SPECIAL(a, is_wifi) || nm_utils_hwaddr_valid(a, ETH_ALEN))
addr = a; addr = a;
} }

View file

@ -40,13 +40,16 @@
#define NM_CLONED_MAC_STABLE "stable" #define NM_CLONED_MAC_STABLE "stable"
static inline gboolean static inline gboolean
NM_CLONED_MAC_IS_SPECIAL(const char *str) NM_CLONED_MAC_IS_SPECIAL(const char *str, gboolean is_wifi)
{ {
return NM_IN_STRSET(str, if (NM_IN_STRSET(str,
NM_CLONED_MAC_PRESERVE, NM_CLONED_MAC_PRESERVE,
NM_CLONED_MAC_PERMANENT, NM_CLONED_MAC_PERMANENT,
NM_CLONED_MAC_RANDOM, NM_CLONED_MAC_RANDOM,
NM_CLONED_MAC_STABLE); NM_CLONED_MAC_STABLE))
return TRUE;
return FALSE;
} }
#define NM_IAID_MAC "mac" #define NM_IAID_MAC "mac"

View file

@ -1219,9 +1219,14 @@ mac_address_parser(KeyfileReaderInfo *info,
tmp_string = nm_keyfile_plugin_kf_get_string(info->keyfile, setting_name, key, NULL); tmp_string = nm_keyfile_plugin_kf_get_string(info->keyfile, setting_name, key, NULL);
if (cloned_mac_addr && NM_CLONED_MAC_IS_SPECIAL(tmp_string)) { if (cloned_mac_addr) {
mac_str = tmp_string; gboolean is_wifi;
goto out;
is_wifi = NM_IS_SETTING_WIRELESS(setting);
if (NM_CLONED_MAC_IS_SPECIAL(tmp_string, is_wifi)) {
mac_str = tmp_string;
goto out;
}
} }
if (tmp_string && nm_utils_hwaddr_aton(tmp_string, addr_bin, addr_len)) if (tmp_string && nm_utils_hwaddr_aton(tmp_string, addr_bin, addr_len))

View file

@ -891,7 +891,7 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
} }
} }
if (priv->cloned_mac_address && !NM_CLONED_MAC_IS_SPECIAL(priv->cloned_mac_address) if (priv->cloned_mac_address && !NM_CLONED_MAC_IS_SPECIAL(priv->cloned_mac_address, FALSE)
&& !nm_utils_hwaddr_valid(priv->cloned_mac_address, ETH_ALEN)) { && !nm_utils_hwaddr_valid(priv->cloned_mac_address, ETH_ALEN)) {
g_set_error(error, g_set_error(error,
NM_CONNECTION_ERROR, NM_CONNECTION_ERROR,

View file

@ -963,7 +963,7 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
return FALSE; return FALSE;
} }
if (priv->cloned_mac_address && !NM_CLONED_MAC_IS_SPECIAL(priv->cloned_mac_address) if (priv->cloned_mac_address && !NM_CLONED_MAC_IS_SPECIAL(priv->cloned_mac_address, TRUE)
&& !nm_utils_hwaddr_valid(priv->cloned_mac_address, ETH_ALEN)) { && !nm_utils_hwaddr_valid(priv->cloned_mac_address, ETH_ALEN)) {
g_set_error_literal(error, g_set_error_literal(error,
NM_CONNECTION_ERROR, NM_CONNECTION_ERROR,

View file

@ -1557,7 +1557,11 @@ _set_fcn_gobject_mac(ARGS_SET_FCN)
} else { } else {
valid = valid =
nm_utils_hwaddr_valid(value, ETH_ALEN) nm_utils_hwaddr_valid(value, ETH_ALEN)
|| (mode == NM_META_PROPERTY_TYPE_MAC_MODE_CLONED && NM_CLONED_MAC_IS_SPECIAL(value)); || (NM_IN_SET(mode,
NM_META_PROPERTY_TYPE_MAC_MODE_CLONED_ETHERNET,
NM_META_PROPERTY_TYPE_MAC_MODE_CLONED_WIFI)
&& NM_CLONED_MAC_IS_SPECIAL(value,
mode == NM_META_PROPERTY_TYPE_MAC_MODE_CLONED_WIFI));
} }
if (!valid) { if (!valid) {
@ -7937,7 +7941,7 @@ static const NMMetaPropertyInfo *const property_infos_WIRED[] = {
.prompt = N_("Cloned MAC [none]"), .prompt = N_("Cloned MAC [none]"),
.property_type = &_pt_gobject_mac, .property_type = &_pt_gobject_mac,
.property_typ_data = DEFINE_PROPERTY_TYP_DATA_SUBTYPE (mac, .property_typ_data = DEFINE_PROPERTY_TYP_DATA_SUBTYPE (mac,
.mode = NM_META_PROPERTY_TYPE_MAC_MODE_CLONED, .mode = NM_META_PROPERTY_TYPE_MAC_MODE_CLONED_ETHERNET,
), ),
), ),
PROPERTY_INFO_WITH_DESC (NM_SETTING_WIRED_GENERATE_MAC_ADDRESS_MASK, PROPERTY_INFO_WITH_DESC (NM_SETTING_WIRED_GENERATE_MAC_ADDRESS_MASK,
@ -8118,7 +8122,7 @@ static const NMMetaPropertyInfo *const property_infos_WIRELESS[] = {
.prompt = N_("Cloned MAC [none]"), .prompt = N_("Cloned MAC [none]"),
.property_type = &_pt_gobject_mac, .property_type = &_pt_gobject_mac,
.property_typ_data = DEFINE_PROPERTY_TYP_DATA_SUBTYPE (mac, .property_typ_data = DEFINE_PROPERTY_TYP_DATA_SUBTYPE (mac,
.mode = NM_META_PROPERTY_TYPE_MAC_MODE_CLONED, .mode = NM_META_PROPERTY_TYPE_MAC_MODE_CLONED_WIFI,
), ),
), ),
PROPERTY_INFO_WITH_DESC (NM_SETTING_WIRELESS_GENERATE_MAC_ADDRESS_MASK, PROPERTY_INFO_WITH_DESC (NM_SETTING_WIRELESS_GENERATE_MAC_ADDRESS_MASK,

View file

@ -178,7 +178,8 @@ typedef enum {
typedef enum { typedef enum {
NM_META_PROPERTY_TYPE_MAC_MODE_DEFAULT, NM_META_PROPERTY_TYPE_MAC_MODE_DEFAULT,
NM_META_PROPERTY_TYPE_MAC_MODE_CLONED, NM_META_PROPERTY_TYPE_MAC_MODE_CLONED_ETHERNET,
NM_META_PROPERTY_TYPE_MAC_MODE_CLONED_WIFI,
NM_META_PROPERTY_TYPE_MAC_MODE_INFINIBAND, NM_META_PROPERTY_TYPE_MAC_MODE_INFINIBAND,
NM_META_PROPERTY_TYPE_MAC_MODE_WPAN, NM_META_PROPERTY_TYPE_MAC_MODE_WPAN,
} NMMetaPropertyTypeMacMode; } NMMetaPropertyTypeMacMode;

View file

@ -5,6 +5,7 @@
#include "libnmc-setting/nm-meta-setting-desc.h" #include "libnmc-setting/nm-meta-setting-desc.h"
#include "libnmc-setting/nm-meta-setting-base.h" #include "libnmc-setting/nm-meta-setting-base.h"
#include "libnm-glib-aux/nm-enum-utils.h" #include "libnm-glib-aux/nm-enum-utils.h"
#include "libnm-core-aux-intern/nm-common-macros.h"
#include "nm-core-enum-types.h" #include "nm-core-enum-types.h"
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
@ -87,7 +88,8 @@ get_mac_format(const NMMetaPropertyInfo *prop_info)
if (prop_typ_data) { if (prop_typ_data) {
switch (prop_typ_data->subtype.mac.mode) { switch (prop_typ_data->subtype.mac.mode) {
case NM_META_PROPERTY_TYPE_MAC_MODE_DEFAULT: case NM_META_PROPERTY_TYPE_MAC_MODE_DEFAULT:
case NM_META_PROPERTY_TYPE_MAC_MODE_CLONED: case NM_META_PROPERTY_TYPE_MAC_MODE_CLONED_ETHERNET:
case NM_META_PROPERTY_TYPE_MAC_MODE_CLONED_WIFI:
break; break;
case NM_META_PROPERTY_TYPE_MAC_MODE_INFINIBAND: case NM_META_PROPERTY_TYPE_MAC_MODE_INFINIBAND:
return g_strdup("Infiniband MAC address"); return g_strdup("Infiniband MAC address");
@ -471,9 +473,20 @@ get_property_special_values(const NMMetaPropertyInfo *prop_info)
append_int_special_values(prop_info, special_values); append_int_special_values(prop_info, special_values);
break; break;
case NM_META_PROPERTY_TYPE_FORMAT_MAC: case NM_META_PROPERTY_TYPE_FORMAT_MAC:
if (prop_typ_data if (prop_typ_data) {
&& prop_typ_data->subtype.mac.mode == NM_META_PROPERTY_TYPE_MAC_MODE_CLONED) switch (prop_typ_data->subtype.mac.mode) {
append_vals(special_values, "preserve", "permanent", "random", "stable"); case NM_META_PROPERTY_TYPE_MAC_MODE_CLONED_ETHERNET:
case NM_META_PROPERTY_TYPE_MAC_MODE_CLONED_WIFI:
append_vals(special_values,
NM_CLONED_MAC_PRESERVE,
NM_CLONED_MAC_PERMANENT,
NM_CLONED_MAC_RANDOM,
NM_CLONED_MAC_STABLE);
break;
default:
break;
}
}
break; break;
case NM_META_PROPERTY_TYPE_FORMAT_MTU: case NM_META_PROPERTY_TYPE_FORMAT_MTU:
g_ptr_array_add(special_values, g_strdup("auto")); g_ptr_array_add(special_values, g_strdup("auto"));

View file

@ -90,8 +90,10 @@ mac_validator(NmtNewtEntry *entry, const char *text, gpointer user_data)
if (!*text) if (!*text)
return TRUE; return TRUE;
if (priv->entry_type == NMT_MAC_ENTRY_TYPE_CLONED) { if (NM_IN_SET(priv->entry_type,
if (NM_CLONED_MAC_IS_SPECIAL(text)) NMT_MAC_ENTRY_TYPE_CLONED_ETHERNET,
NMT_MAC_ENTRY_TYPE_CLONED_WIFI)) {
if (NM_CLONED_MAC_IS_SPECIAL(text, priv->entry_type == NMT_MAC_ENTRY_TYPE_CLONED_WIFI))
return TRUE; return TRUE;
} }
@ -237,7 +239,7 @@ nmt_mac_entry_class_init(NmtMacEntryClass *entry_class)
"", "",
"", "",
NMT_MAC_ENTRY_TYPE_MAC, NMT_MAC_ENTRY_TYPE_MAC,
NMT_MAC_ENTRY_TYPE_CLONED, NMT_MAC_ENTRY_TYPE_CLONED_WIFI,
NMT_MAC_ENTRY_TYPE_MAC, NMT_MAC_ENTRY_TYPE_MAC,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
} }

View file

@ -11,7 +11,8 @@
typedef enum { typedef enum {
NMT_MAC_ENTRY_TYPE_MAC, NMT_MAC_ENTRY_TYPE_MAC,
NMT_MAC_ENTRY_TYPE_CLONED, NMT_MAC_ENTRY_TYPE_CLONED_ETHERNET,
NMT_MAC_ENTRY_TYPE_CLONED_WIFI,
} NmtMacEntryType; } NmtMacEntryType;
#define NMT_TYPE_MAC_ENTRY (nmt_mac_entry_get_type()) #define NMT_TYPE_MAC_ENTRY (nmt_mac_entry_get_type())

View file

@ -395,7 +395,7 @@ nmt_page_bond_constructed(GObject *object)
nmt_editor_grid_append(grid, _("ARP targets"), widget, NULL); nmt_editor_grid_append(grid, _("ARP targets"), widget, NULL);
priv->arp_ip_target = NMT_ADDRESS_LIST(widget); priv->arp_ip_target = NMT_ADDRESS_LIST(widget);
widget = nmt_mac_entry_new(40, ETH_ALEN, NMT_MAC_ENTRY_TYPE_CLONED); widget = nmt_mac_entry_new(40, ETH_ALEN, NMT_MAC_ENTRY_TYPE_CLONED_ETHERNET);
g_object_bind_property(s_wired, g_object_bind_property(s_wired,
NM_SETTING_WIRED_CLONED_MAC_ADDRESS, NM_SETTING_WIRED_CLONED_MAC_ADDRESS,
widget, widget,

View file

@ -107,7 +107,7 @@ nmt_page_ethernet_constructed(GObject *object)
section = nmt_editor_section_new(_("ETHERNET"), NULL, FALSE); section = nmt_editor_section_new(_("ETHERNET"), NULL, FALSE);
grid = nmt_editor_section_get_body(section); grid = nmt_editor_section_get_body(section);
widget = nmt_mac_entry_new(40, ETH_ALEN, NMT_MAC_ENTRY_TYPE_CLONED); widget = nmt_mac_entry_new(40, ETH_ALEN, NMT_MAC_ENTRY_TYPE_CLONED_ETHERNET);
g_object_bind_property(s_wired, g_object_bind_property(s_wired,
NM_SETTING_WIRED_CLONED_MAC_ADDRESS, NM_SETTING_WIRED_CLONED_MAC_ADDRESS,
widget, widget,

View file

@ -83,7 +83,7 @@ nmt_page_vlan_constructed(GObject *object)
nmt_editor_grid_append(grid, NULL, nmt_newt_separator_new(), NULL); nmt_editor_grid_append(grid, NULL, nmt_newt_separator_new(), NULL);
widget = nmt_mac_entry_new(40, ETH_ALEN, NMT_MAC_ENTRY_TYPE_CLONED); widget = nmt_mac_entry_new(40, ETH_ALEN, NMT_MAC_ENTRY_TYPE_CLONED_ETHERNET);
g_object_bind_property(s_wired, g_object_bind_property(s_wired,
NM_SETTING_WIRED_CLONED_MAC_ADDRESS, NM_SETTING_WIRED_CLONED_MAC_ADDRESS,
widget, widget,

View file

@ -378,7 +378,7 @@ nmt_page_wifi_constructed(GObject *object)
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
nmt_editor_grid_append(grid, _("BSSID"), widget, NULL); nmt_editor_grid_append(grid, _("BSSID"), widget, NULL);
widget = nmt_mac_entry_new(40, ETH_ALEN, NMT_MAC_ENTRY_TYPE_CLONED); widget = nmt_mac_entry_new(40, ETH_ALEN, NMT_MAC_ENTRY_TYPE_CLONED_WIFI);
g_object_bind_property(s_wireless, g_object_bind_property(s_wireless,
NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS, NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS,
widget, widget,