diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c index a5275963c..0d5d3e5c4 100644 --- a/src/nm-core-utils.c +++ b/src/nm-core-utils.c @@ -4354,7 +4354,8 @@ void nm_wifi_utils_parse_ies (const guint8 *bytes, gsize len, guint32 *out_max_rate, - gboolean *out_metered) + gboolean *out_metered, + gboolean *owe_transition_mode) { guint8 id, elem_len; guint32 m; @@ -4395,6 +4396,13 @@ nm_wifi_utils_parse_ies (const guint8 *bytes, && bytes[3] == 0x11) /* OUI type: Network cost */ *out_metered = (bytes[7] > 1); /* Cost level > 1 */ } + if ( owe_transition_mode + && elem_len >= 10 + && bytes[0] == 0x50 /* OUI: WiFi Alliance */ + && bytes[1] == 0x6f + && bytes[2] == 0x9a + && bytes[3] == 0x1c) /* OUI type: OWE Transition Mode */ + *owe_transition_mode = TRUE; break; } diff --git a/src/nm-core-utils.h b/src/nm-core-utils.h index 14cdae3cd..b7731b83d 100644 --- a/src/nm-core-utils.h +++ b/src/nm-core-utils.h @@ -476,7 +476,8 @@ const char *nm_utils_parse_dns_domain (const char *domain, gboolean *is_routing) void nm_wifi_utils_parse_ies (const guint8 *bytes, gsize len, guint32 *out_max_rate, - gboolean *out_metered); + gboolean *out_metered, + gboolean *owe_transition_mode); guint8 nm_wifi_utils_level_to_quality (int val); diff --git a/src/supplicant/nm-supplicant-interface.c b/src/supplicant/nm-supplicant-interface.c index 42179246c..b9f6e51d2 100644 --- a/src/supplicant/nm-supplicant-interface.c +++ b/src/supplicant/nm-supplicant-interface.c @@ -482,6 +482,7 @@ _bss_info_properties_changed (NMSupplicantInterface *self, const guint8 *arr_data; gsize arr_len; gboolean p_metered; + gboolean p_owe_transition_mode = FALSE; guint32 p_max_rate; gboolean p_max_rate_has; gint64 now_msec = 0; @@ -630,11 +631,18 @@ _bss_info_properties_changed (NMSupplicantInterface *self, guint32 rate; arr_data = g_variant_get_fixed_array (v_v, &arr_len, 1); - nm_wifi_utils_parse_ies (arr_data, arr_len, &rate, &p_metered); + nm_wifi_utils_parse_ies (arr_data, arr_len, &rate, &p_metered, &p_owe_transition_mode); p_max_rate = NM_MAX (p_max_rate, rate); p_max_rate_has = TRUE; g_variant_unref (v_v); + + /* Add OWE Security type if OWE transition mode is available */ + if (p_owe_transition_mode) + bss_info->rsn_flags |= NM_802_11_AP_SEC_KEY_MGMT_OWE; + else + bss_info->rsn_flags &= ~NM_802_11_AP_SEC_KEY_MGMT_OWE; + bss_info->metered = p_metered; } if (p_max_rate_has)