diff options
| author | Vignesh Viswanathan <viswanat@codeaurora.org> | 2017-12-06 16:03:56 +0530 |
|---|---|---|
| committer | snandini <snandini@codeaurora.org> | 2017-12-06 08:37:17 -0800 |
| commit | cb0176c82d303edc1daa5a3705b59f78a1bf5edf (patch) | |
| tree | dc93ab507093e4c52734a190c9d8e13447fe8471 | |
| parent | f284f22b7239a3d2c19229f8b2d497221f0db3de (diff) | |
qcacld-3.0: Pass roam_info for SSID scan failure if FILS connection
Currenly for Scan for SSID failure case, roam_info is not passed to
hdd_association_completion_handler leading to driver not sending
FILS seq num info to the supplicant. This makes the supplicant to
trigger a full EAP connection instead of FILS in the next connect.
Pass roam_info from csr_scan_handle_search_for_ssid_failure to
hdd_association_completion_handler and populate and send FILS seq
number info to supplicant.
Change-Id: I4e0a4c3cb55a286b1c66424f6b3a61c020c522a0
CRs-Fixed: 2146342
| -rw-r--r-- | core/hdd/src/wlan_hdd_assoc.c | 5 | ||||
| -rw-r--r-- | core/sme/src/csr/csr_api_scan.c | 67 |
2 files changed, 58 insertions, 14 deletions
diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 61d1010281e1..08e250467f95 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -2948,6 +2948,11 @@ static QDF_STATUS hdd_association_completion_handler(hdd_adapter_t *pAdapter, bool connect_timeout = false; hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter); + if (pRoamInfo && pRoamInfo->is_fils_connection && + eCSR_ROAM_RESULT_SCAN_FOR_SSID_FAILURE == roamResult) + qdf_copy_macaddr(&pRoamInfo->bssid, + &pWextState->req_bssId); + if (pRoamInfo) hdd_err("wlan: connection failed with " MAC_ADDRESS_STR " result: %d and Status: %d", diff --git a/core/sme/src/csr/csr_api_scan.c b/core/sme/src/csr/csr_api_scan.c index 8660ce4aa404..11273e607332 100644 --- a/core/sme/src/csr/csr_api_scan.c +++ b/core/sme/src/csr/csr_api_scan.c @@ -1200,6 +1200,32 @@ QDF_STATUS csr_scan_handle_search_for_ssid(tpAniSirGlobal pMac, return status; } +#ifdef WLAN_FEATURE_FILS_SK +static +bool csr_handle_fils_scan_for_ssid_failure(tCsrRoamProfile *roam_profile, + tCsrRoamInfo *roam_info) +{ + if (roam_profile && roam_profile->fils_con_info && + roam_profile->fils_con_info->is_fils_connection) { + sme_debug("send roam_info for FILS connection failure, seq %d", + roam_profile->fils_con_info->sequence_number); + roam_info->is_fils_connection = true; + roam_info->fils_seq_num = + roam_profile->fils_con_info->sequence_number; + return true; + } + + return false; +} +#else +static +bool csr_handle_fils_scan_for_ssid_failure(tCsrRoamProfile *roam_profile, + tCsrRoamInfo *roam_info) +{ + return false; +} +#endif + QDF_STATUS csr_scan_handle_search_for_ssid_failure(tpAniSirGlobal pMac, tSmeCmd *pCommand) { @@ -1208,6 +1234,8 @@ QDF_STATUS csr_scan_handle_search_for_ssid_failure(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile = pCommand->u.scanCmd.pToRoamProfile; tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId); eCsrRoamResult roam_result; + tCsrRoamInfo *roam_info = NULL; + struct tag_csrscan_result *scan_result; if (!pSession) { sme_err("session %d not found", sessionId); @@ -1255,31 +1283,42 @@ QDF_STATUS csr_scan_handle_search_for_ssid_failure(tpAniSirGlobal pMac, roam_result = eCSR_ROAM_RESULT_IBSS_START_FAILED; goto roam_completion; } + + roam_info = qdf_mem_malloc(sizeof(tCsrRoamInfo)); + if (!roam_info) { + sme_err("Failed to allocate memory for roam_info"); + goto roam_completion; + } + + if (pCommand->u.roamCmd.pRoamBssEntry) { + scan_result = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, + struct tag_csrscan_result, Link); + roam_info->pBssDesc = &scan_result->Result.BssDescriptor; + } + roam_info->statusCode = pSession->joinFailStatusCode.statusCode; + roam_info->reasonCode = pSession->joinFailStatusCode.reasonCode; + /* Only indicate assoc_completion if we indicate assoc_start. */ if (pSession->bRefAssocStartCnt > 0) { - tCsrRoamInfo *pRoamInfo = NULL, roamInfo; - - qdf_mem_set(&roamInfo, sizeof(tCsrRoamInfo), 0); - pRoamInfo = &roamInfo; - if (pCommand->u.roamCmd.pRoamBssEntry) { - struct tag_csrscan_result *pScanResult = GET_BASE_ADDR( - pCommand->u.roamCmd.pRoamBssEntry, - struct tag_csrscan_result, Link); - roamInfo.pBssDesc = &pScanResult->Result.BssDescriptor; - } - roamInfo.statusCode = pSession->joinFailStatusCode.statusCode; - roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode; pSession->bRefAssocStartCnt--; - csr_roam_call_callback(pMac, sessionId, pRoamInfo, + csr_roam_call_callback(pMac, sessionId, roam_info, pCommand->u.scanCmd.roamId, eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_SCAN_FOR_SSID_FAILURE); } else { - csr_roam_call_callback(pMac, sessionId, NULL, + if (!csr_handle_fils_scan_for_ssid_failure( + pProfile, roam_info)) { + qdf_mem_free(roam_info); + roam_info = NULL; + } + csr_roam_call_callback(pMac, sessionId, roam_info, pCommand->u.scanCmd.roamId, eCSR_ROAM_ASSOCIATION_FAILURE, eCSR_ROAM_RESULT_SCAN_FOR_SSID_FAILURE); } + + if (roam_info) + qdf_mem_free(roam_info); roam_completion: csr_roam_completion(pMac, sessionId, NULL, pCommand, roam_result, false); |
