@@ -2244,31 +2244,36 @@ const u8 * wpa_bss_get_rsne(struct wpa_supplicant *wpa_s,
bool mlo)
{
#ifndef CONFIG_NO_WPA
- const u8 *ie;
-
if (wpas_rsn_overriding(wpa_s, ssid)) {
+ const u8 *ie;
+
if (!ssid)
ssid = wpa_s->current_ssid;
/* MLO cases for RSN overriding are required to use RSNE
- * Override 2 element and RSNXE Override element together. */
+ * Override 2 element and RSNXE Override element together.
+ * However, we are also expected to do a fallback, so for MLO,
+ * accept either Override if the RSNXE override is present.
+ */
ie = wpa_bss_get_vendor_ie(bss, RSNE_OVERRIDE_2_IE_VENDOR_TYPE);
+ if (!ie || !wpa_bss_supported_rsne(wpa_s, ssid, ie)) {
+ ie = wpa_bss_get_vendor_ie(bss,
+ RSNE_OVERRIDE_IE_VENDOR_TYPE);
+ if (!ie || !wpa_bss_supported_rsne(wpa_s, ssid, ie))
+ ie = NULL;
+ }
+
if (mlo && ie &&
!wpa_bss_get_vendor_ie(bss,
RSNXE_OVERRIDE_IE_VENDOR_TYPE)) {
wpa_printf(MSG_DEBUG, "BSS " MACSTR
- " advertises RSNE Override 2 element without RSNXE Override element - ignore RSNE Override 2 element for MLO",
+ " has no RSNX Override Element - ignore RSN Override for MLO",
MAC2STR(bss->bssid));
- } else if (ie && wpa_bss_supported_rsne(wpa_s, ssid, ie)) {
- return ie;
+ ie = NULL;
}
- if (!mlo) {
- ie = wpa_bss_get_vendor_ie(
- bss, RSNE_OVERRIDE_IE_VENDOR_TYPE);
- if (ie && wpa_bss_supported_rsne(wpa_s, ssid, ie))
- return ie;
- }
+ if (ie)
+ return ie;
}
#endif /* CONFIG_NO_WPA */