From ea9e8bcf929b8f32ae2f6d746230606e8bcaddca Mon Sep 17 00:00:00 2001 From: Abhishek Singh Date: Fri, 23 Nov 2018 18:07:55 +0530 Subject: [PATCH] qcacld-3.0: Fix NULL SSID filled in connected roam profile Connected roam profile's SSID is used to get the BSS entry from kernel and indicate the same to kernel in cfg80211_connect_bss. If the roam profile's SSID is NULL, the BSS entry indicated to kernel is with NULL SSID and this result in disconnect from supplicant as it assume that SSID of AP changed. Fix is to fill the SSID in connected roam profile from roam profile if SSID is NULL in beacon. Change-Id: Ie42eceb50b6af551ac1f4ca7d37b73eff107dfbd CRs-Fixed: 2349572 --- core/sme/src/csr/csr_api_roam.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 4eeca89f8e57..3f6994ff09f4 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -8985,11 +8985,19 @@ QDF_STATUS csr_roam_save_connected_information(tpAniSirGlobal mac, #endif /* save ssid */ if (QDF_IS_STATUS_SUCCESS(status)) { - if (pIesTemp->SSID.present) { + if (pIesTemp->SSID.present && + !csr_is_nullssid(pIesTemp->SSID.ssid, + pIesTemp->SSID.num_ssid)) { pConnectProfile->SSID.length = pIesTemp->SSID.num_ssid; qdf_mem_copy(pConnectProfile->SSID.ssId, pIesTemp->SSID.ssid, pIesTemp->SSID.num_ssid); + } else if (pProfile->SSIDs.SSIDList) { + pConnectProfile->SSID.length = + pProfile->SSIDs.SSIDList[0].SSID.length; + qdf_mem_copy(pConnectProfile->SSID.ssId, + pProfile->SSIDs.SSIDList[0].SSID.ssId, + pConnectProfile->SSID.length); } /* Save the bss desc */ status = csr_roam_save_connected_bss_desc(mac, sessionId, @@ -15022,16 +15030,25 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal mac, uint32_t sessionId, csr_join_req->length = msgLen; csr_join_req->sessionId = (uint8_t) sessionId; csr_join_req->transactionId = 0; - if (pIes->SSID.present && pIes->SSID.num_ssid) { + if (pIes->SSID.present && + !csr_is_nullssid(pIes->SSID.ssid, + pIes->SSID.num_ssid)) { csr_join_req->ssId.length = pIes->SSID.num_ssid; qdf_mem_copy(&csr_join_req->ssId.ssId, pIes->SSID.ssid, pIes->SSID.num_ssid); - } else + } else if (pProfile->SSIDs.SSIDList) { + csr_join_req->ssId.length = + pProfile->SSIDs.SSIDList[0].SSID.length; + qdf_mem_copy(&csr_join_req->ssId.ssId, + pProfile->SSIDs.SSIDList[0].SSID.ssId, + csr_join_req->ssId.length); + } else { csr_join_req->ssId.length = 0; + } qdf_mem_copy(&csr_join_req->selfMacAddr, &pSession->selfMacAddr, sizeof(tSirMacAddr)); sme_err("Connecting to ssid:%.*s bssid: "MAC_ADDRESS_STR" rssi: %d channel: %d country_code: %c%c", - pIes->SSID.num_ssid, pIes->SSID.ssid, + csr_join_req->ssId.length, csr_join_req->ssId.ssId, MAC_ADDR_ARRAY(pBssDescription->bssId), pBssDescription->rssi, pBssDescription->channelId, mac->scan.countryCodeCurrent[0],