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);
/* 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;
if (NM_CLONED_MAC_IS_SPECIAL(cand_mac))
if (NM_CLONED_MAC_IS_SPECIAL(cand_mac, FALSE))
cand_mac = NULL;
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)
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;
}

View file

@ -40,13 +40,16 @@
#define NM_CLONED_MAC_STABLE "stable"
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,
NM_CLONED_MAC_PRESERVE,
NM_CLONED_MAC_PERMANENT,
NM_CLONED_MAC_RANDOM,
NM_CLONED_MAC_STABLE);
if (NM_IN_STRSET(str,
NM_CLONED_MAC_PRESERVE,
NM_CLONED_MAC_PERMANENT,
NM_CLONED_MAC_RANDOM,
NM_CLONED_MAC_STABLE))
return TRUE;
return FALSE;
}
#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);
if (cloned_mac_addr && NM_CLONED_MAC_IS_SPECIAL(tmp_string)) {
mac_str = tmp_string;
goto out;
if (cloned_mac_addr) {
gboolean is_wifi;
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))

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)) {
g_set_error(error,
NM_CONNECTION_ERROR,

View file

@ -963,7 +963,7 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
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)) {
g_set_error_literal(error,
NM_CONNECTION_ERROR,

View file

@ -1557,7 +1557,11 @@ _set_fcn_gobject_mac(ARGS_SET_FCN)
} else {
valid =
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) {
@ -7937,7 +7941,7 @@ static const NMMetaPropertyInfo *const property_infos_WIRED[] = {
.prompt = N_("Cloned MAC [none]"),
.property_type = &_pt_gobject_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,
@ -8118,7 +8122,7 @@ static const NMMetaPropertyInfo *const property_infos_WIRELESS[] = {
.prompt = N_("Cloned MAC [none]"),
.property_type = &_pt_gobject_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,

View file

@ -178,7 +178,8 @@ typedef enum {
typedef enum {
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_WPAN,
} NMMetaPropertyTypeMacMode;

View file

@ -5,6 +5,7 @@
#include "libnmc-setting/nm-meta-setting-desc.h"
#include "libnmc-setting/nm-meta-setting-base.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 <stdarg.h>
#include <stdlib.h>
@ -87,7 +88,8 @@ get_mac_format(const NMMetaPropertyInfo *prop_info)
if (prop_typ_data) {
switch (prop_typ_data->subtype.mac.mode) {
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;
case NM_META_PROPERTY_TYPE_MAC_MODE_INFINIBAND:
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);
break;
case NM_META_PROPERTY_TYPE_FORMAT_MAC:
if (prop_typ_data
&& prop_typ_data->subtype.mac.mode == NM_META_PROPERTY_TYPE_MAC_MODE_CLONED)
append_vals(special_values, "preserve", "permanent", "random", "stable");
if (prop_typ_data) {
switch (prop_typ_data->subtype.mac.mode) {
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;
case NM_META_PROPERTY_TYPE_FORMAT_MTU:
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)
return TRUE;
if (priv->entry_type == NMT_MAC_ENTRY_TYPE_CLONED) {
if (NM_CLONED_MAC_IS_SPECIAL(text))
if (NM_IN_SET(priv->entry_type,
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;
}
@ -237,7 +239,7 @@ nmt_mac_entry_class_init(NmtMacEntryClass *entry_class)
"",
"",
NMT_MAC_ENTRY_TYPE_MAC,
NMT_MAC_ENTRY_TYPE_CLONED,
NMT_MAC_ENTRY_TYPE_CLONED_WIFI,
NMT_MAC_ENTRY_TYPE_MAC,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
}

View file

@ -11,7 +11,8 @@
typedef enum {
NMT_MAC_ENTRY_TYPE_MAC,
NMT_MAC_ENTRY_TYPE_CLONED,
NMT_MAC_ENTRY_TYPE_CLONED_ETHERNET,
NMT_MAC_ENTRY_TYPE_CLONED_WIFI,
} NmtMacEntryType;
#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);
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,
NM_SETTING_WIRED_CLONED_MAC_ADDRESS,
widget,

View file

@ -107,7 +107,7 @@ nmt_page_ethernet_constructed(GObject *object)
section = nmt_editor_section_new(_("ETHERNET"), NULL, FALSE);
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,
NM_SETTING_WIRED_CLONED_MAC_ADDRESS,
widget,

View file

@ -83,7 +83,7 @@ nmt_page_vlan_constructed(GObject *object)
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,
NM_SETTING_WIRED_CLONED_MAC_ADDRESS,
widget,

View file

@ -378,7 +378,7 @@ nmt_page_wifi_constructed(GObject *object)
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
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,
NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS,
widget,