Browse Source

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
Pragaspathi Thilagaraj 4 years ago
parent
commit
ee7302ebd0

+ 3 - 0
components/mlme/dispatcher/inc/wlan_mlme_public_struct.h

@@ -29,6 +29,9 @@
 #include <sir_api.h>
 #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)

+ 13 - 0
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;