summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVignesh Viswanathan <viswanat@codeaurora.org>2017-12-06 16:03:56 +0530
committersnandini <snandini@codeaurora.org>2017-12-06 08:37:17 -0800
commitcb0176c82d303edc1daa5a3705b59f78a1bf5edf (patch)
treedc93ab507093e4c52734a190c9d8e13447fe8471
parentf284f22b7239a3d2c19229f8b2d497221f0db3de (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.c5
-rw-r--r--core/sme/src/csr/csr_api_scan.c67
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);