From ee7302ebd07d5f4efa3dc20789393b23d9de7416 Mon Sep 17 00:00:00 2001 From: Pragaspathi Thilagaraj Date: Tue, 22 Sep 2020 18:49:45 +0530 Subject: [PATCH] qcacld-3.0: Wait for probe response from AP in OWE transition mode In OWE transition mode, the AP advertises one Hidden SSID and one normal ssid and the OWE capable STA connects to the OWE supported hidden SSID. When connecting to the hidden SSID, if the AP sends beacon for the unicast probe request sent by driver before anouncing join success, then the beacon NULL ssid gets updated to the kernel. Then after successful association, while indicating the connection successs to the kernel, the current bss is not filled as wlan_cfg80211_get_bss() is called with the actual ssid and not the NULL ssid. Due to this when supplicant sends install key command for this bss, kernel returns error and set_key always fails. Wait for the probe response from the AP for the unicast probe request sent before announcing join success and drop the beacon received from the AP so that the driver fills the proper ssid to the kernel bss entry and same ssid gets used in association completion handler. Change-Id: Icded0af5d45d3281ab4304bf166bdc318aa7a942 CRs-Fixed: 2782618 --- .../mlme/dispatcher/inc/wlan_mlme_public_struct.h | 3 +++ core/mac/src/pe/lim/lim_process_beacon_frame.c | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index 1452699efd4f..2f459a396181 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -29,6 +29,9 @@ #include #include "wlan_cm_roam_public_struct.h" +#define OWE_TRANSITION_OUI_TYPE "\x50\x6f\x9a\x1c" +#define OWE_TRANSITION_OUI_SIZE 4 + #define CFG_VALID_CHANNEL_LIST_LEN 100 #define CFG_PMKID_MODES_OKC (0x1) diff --git a/core/mac/src/pe/lim/lim_process_beacon_frame.c b/core/mac/src/pe/lim/lim_process_beacon_frame.c index 5947d10c86fd..a07a4f20619b 100644 --- a/core/mac/src/pe/lim/lim_process_beacon_frame.c +++ b/core/mac/src/pe/lim/lim_process_beacon_frame.c @@ -59,6 +59,8 @@ lim_process_beacon_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_info, { tpSirMacMgmtHdr mac_hdr; tSchBeaconStruct *bcn_ptr; + uint8_t *frame; + uint16_t frame_len; mac_ctx->lim.gLimNumBeaconsRcvd++; @@ -67,6 +69,8 @@ lim_process_beacon_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_info, * beacon counter */ mac_hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info); + frame = WMA_GET_RX_MPDU_DATA(rx_pkt_info); + frame_len = WMA_GET_RX_PAYLOAD_LEN(rx_pkt_info); pe_debug("Beacon (len %d): " QDF_MAC_ADDR_FMT " RSSI %d", WMA_GET_RX_MPDU_LEN(rx_pkt_info), @@ -114,6 +118,15 @@ lim_process_beacon_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_info, if (session->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE) { + if (session->connected_akm == ANI_AKM_TYPE_OWE && + wlan_get_vendor_ie_ptr_from_oui(OWE_TRANSITION_OUI_TYPE, + OWE_TRANSITION_OUI_SIZE, + frame, frame_len)) { + pe_debug("Drop OWE rx beacon. Wait for probe for join success"); + qdf_mem_free(bcn_ptr); + return; + } + if (session->beacon) { qdf_mem_free(session->beacon); session->beacon = NULL;