diff --git a/src/core/NetworkManagerUtils.c b/src/core/NetworkManagerUtils.c index 7b6a20ab42..84379cdf95 100644 --- a/src/core/NetworkManagerUtils.c +++ b/src/core/NetworkManagerUtils.c @@ -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) { diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index 1edfaebf84..317a44a4f6 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -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; } diff --git a/src/libnm-core-aux-intern/nm-common-macros.h b/src/libnm-core-aux-intern/nm-common-macros.h index c452b7d3cb..155c585aef 100644 --- a/src/libnm-core-aux-intern/nm-common-macros.h +++ b/src/libnm-core-aux-intern/nm-common-macros.h @@ -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" diff --git a/src/libnm-core-impl/nm-keyfile.c b/src/libnm-core-impl/nm-keyfile.c index 82581d9fea..078ea5d766 100644 --- a/src/libnm-core-impl/nm-keyfile.c +++ b/src/libnm-core-impl/nm-keyfile.c @@ -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)) diff --git a/src/libnm-core-impl/nm-setting-wired.c b/src/libnm-core-impl/nm-setting-wired.c index 5476d983b4..82c3840ffa 100644 --- a/src/libnm-core-impl/nm-setting-wired.c +++ b/src/libnm-core-impl/nm-setting-wired.c @@ -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, diff --git a/src/libnm-core-impl/nm-setting-wireless.c b/src/libnm-core-impl/nm-setting-wireless.c index 14b7e874a8..cdf77ad7aa 100644 --- a/src/libnm-core-impl/nm-setting-wireless.c +++ b/src/libnm-core-impl/nm-setting-wireless.c @@ -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, diff --git a/src/libnmc-setting/nm-meta-setting-desc.c b/src/libnmc-setting/nm-meta-setting-desc.c index 2e9593f81e..650c54fa9f 100644 --- a/src/libnmc-setting/nm-meta-setting-desc.c +++ b/src/libnmc-setting/nm-meta-setting-desc.c @@ -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, diff --git a/src/libnmc-setting/nm-meta-setting-desc.h b/src/libnmc-setting/nm-meta-setting-desc.h index 94a689457c..f8e36b0e0a 100644 --- a/src/libnmc-setting/nm-meta-setting-desc.h +++ b/src/libnmc-setting/nm-meta-setting-desc.h @@ -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; diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.c b/src/nmcli/gen-metadata-nm-settings-nmcli.c index 874bc6ddb6..c52e6b3d74 100644 --- a/src/nmcli/gen-metadata-nm-settings-nmcli.c +++ b/src/nmcli/gen-metadata-nm-settings-nmcli.c @@ -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 #include @@ -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")); diff --git a/src/nmtui/nmt-mac-entry.c b/src/nmtui/nmt-mac-entry.c index 11ceecf9e9..6cecf0e9d8 100644 --- a/src/nmtui/nmt-mac-entry.c +++ b/src/nmtui/nmt-mac-entry.c @@ -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)); } diff --git a/src/nmtui/nmt-mac-entry.h b/src/nmtui/nmt-mac-entry.h index 6b5b289685..c5acd35a98 100644 --- a/src/nmtui/nmt-mac-entry.h +++ b/src/nmtui/nmt-mac-entry.h @@ -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()) diff --git a/src/nmtui/nmt-page-bond.c b/src/nmtui/nmt-page-bond.c index 5a64590cdd..c748315035 100644 --- a/src/nmtui/nmt-page-bond.c +++ b/src/nmtui/nmt-page-bond.c @@ -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, diff --git a/src/nmtui/nmt-page-ethernet.c b/src/nmtui/nmt-page-ethernet.c index 77abbb405e..652a2603e7 100644 --- a/src/nmtui/nmt-page-ethernet.c +++ b/src/nmtui/nmt-page-ethernet.c @@ -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, diff --git a/src/nmtui/nmt-page-vlan.c b/src/nmtui/nmt-page-vlan.c index 1956d3d64a..238dbafb5b 100644 --- a/src/nmtui/nmt-page-vlan.c +++ b/src/nmtui/nmt-page-vlan.c @@ -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, diff --git a/src/nmtui/nmt-page-wifi.c b/src/nmtui/nmt-page-wifi.c index 55feaee256..9767597b95 100644 --- a/src/nmtui/nmt-page-wifi.c +++ b/src/nmtui/nmt-page-wifi.c @@ -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,