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
This commit is contained in:
Pragaspathi Thilagaraj
2020-09-22 18:49:45 +05:30
committed by snandini
parent 8c8068fb81
commit ee7302ebd0
2 changed files with 16 additions and 0 deletions

View File

@@ -29,6 +29,9 @@
#include <sir_api.h> #include <sir_api.h>
#include "wlan_cm_roam_public_struct.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_VALID_CHANNEL_LIST_LEN 100
#define CFG_PMKID_MODES_OKC (0x1) #define CFG_PMKID_MODES_OKC (0x1)

View File

@@ -59,6 +59,8 @@ lim_process_beacon_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_info,
{ {
tpSirMacMgmtHdr mac_hdr; tpSirMacMgmtHdr mac_hdr;
tSchBeaconStruct *bcn_ptr; tSchBeaconStruct *bcn_ptr;
uint8_t *frame;
uint16_t frame_len;
mac_ctx->lim.gLimNumBeaconsRcvd++; mac_ctx->lim.gLimNumBeaconsRcvd++;
@@ -67,6 +69,8 @@ lim_process_beacon_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_info,
* beacon counter * beacon counter
*/ */
mac_hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info); 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", pe_debug("Beacon (len %d): " QDF_MAC_ADDR_FMT " RSSI %d",
WMA_GET_RX_MPDU_LEN(rx_pkt_info), 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 == if (session->limMlmState ==
eLIM_MLM_WT_JOIN_BEACON_STATE) { 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) { if (session->beacon) {
qdf_mem_free(session->beacon); qdf_mem_free(session->beacon);
session->beacon = NULL; session->beacon = NULL;