ソースを参照

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
Vignesh Viswanathan 7 年 前
コミット
014096aad0
2 ファイル変更64 行追加13 行削除
  1. 4 0
      core/hdd/src/wlan_hdd_assoc.c
  2. 60 13
      core/sme/src/csr/csr_api_scan.c

+ 4 - 0
core/hdd/src/wlan_hdd_assoc.c

@@ -3111,6 +3111,10 @@ hdd_association_completion_handler(struct hdd_adapter *adapter,
 #endif
 #endif
 	} else {
 	} else {
 		bool connect_timeout = false;
 		bool connect_timeout = false;
+		if (roam_info && roam_info->is_fils_connection &&
+		    eCSR_ROAM_RESULT_SCAN_FOR_SSID_FAILURE == roamResult)
+			qdf_copy_macaddr(&roam_info->bssid,
+					 &sta_ctx->requested_bssid);
 		if (roam_info)
 		if (roam_info)
 			hdd_err("wlan: connection failed with " MAC_ADDRESS_STR
 			hdd_err("wlan: connection failed with " MAC_ADDRESS_STR
 				 " result: %d and Status: %d",
 				 " result: %d and Status: %d",

+ 60 - 13
core/sme/src/csr/csr_api_scan.c

@@ -1191,6 +1191,41 @@ QDF_STATUS csr_scan_handle_search_for_ssid(tpAniSirGlobal mac_ctx,
 	return status;
 	return status;
 }
 }
 
 
+/**
+ * csr_handle_fils_scan_for_ssid_failure() - Checks and fills FILS seq number
+ * in roam_info structure to send to hdd
+ *
+ * @roam_profile: Pointer to current roam_profile structure
+ * @roam_info: Pointer to roam_info strucure to be filled
+ *
+ * Return: true for FILS connection else false
+ */
+#ifdef WLAN_FEATURE_FILS_SK
+static
+bool csr_handle_fils_scan_for_ssid_failure(tCsrRoamProfile *roam_profile,
+					   struct csr_roam_info *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,
+					   struct csr_roam_info *roam_info)
+{
+	return false;
+}
+#endif
+
 QDF_STATUS csr_scan_handle_search_for_ssid_failure(tpAniSirGlobal mac_ctx,
 QDF_STATUS csr_scan_handle_search_for_ssid_failure(tpAniSirGlobal mac_ctx,
 						  uint32_t session_id)
 						  uint32_t session_id)
 {
 {
@@ -1198,6 +1233,8 @@ QDF_STATUS csr_scan_handle_search_for_ssid_failure(tpAniSirGlobal mac_ctx,
 	tCsrRoamProfile *profile;
 	tCsrRoamProfile *profile;
 	struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
 	struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
 	eCsrRoamResult roam_result;
 	eCsrRoamResult roam_result;
+	struct csr_roam_info *roam_info = NULL;
+	struct tag_csrscan_result *scan_result;
 
 
 	if (!session) {
 	if (!session) {
 		sme_err("session %d not found", session_id);
 		sme_err("session %d not found", session_id);
@@ -1227,32 +1264,42 @@ QDF_STATUS csr_scan_handle_search_for_ssid_failure(tpAniSirGlobal mac_ctx,
 		roam_result = eCSR_ROAM_RESULT_IBSS_START_FAILED;
 		roam_result = eCSR_ROAM_RESULT_IBSS_START_FAILED;
 		goto roam_completion;
 		goto roam_completion;
 	}
 	}
-	/* Only indicate assoc_completion if we indicate assoc_start. */
-	if (session->bRefAssocStartCnt > 0) {
-		struct csr_roam_info *roam_info = NULL, roamInfo;
 
 
-		qdf_mem_set(&roamInfo, sizeof(struct csr_roam_info), 0);
-		roam_info = &roamInfo;
-		if (session->scan_info.roambssentry) {
-			struct tag_csrscan_result *pScanResult = GET_BASE_ADDR(
-				session->scan_info.roambssentry,
+	roam_info = qdf_mem_malloc(sizeof(struct csr_roam_info));
+	if (!roam_info) {
+		sme_err("Failed to allocate memory for roam_info");
+		goto roam_completion;
+	}
+
+	if (session->scan_info.roambssentry) {
+		scan_result = GET_BASE_ADDR(session->scan_info.roambssentry,
 				struct tag_csrscan_result, Link);
 				struct tag_csrscan_result, Link);
-			roamInfo.pBssDesc = &pScanResult->Result.BssDescriptor;
-		}
+		roam_info->pBssDesc = &scan_result->Result.BssDescriptor;
+	}
+	roam_info->statusCode = session->joinFailStatusCode.statusCode;
+	roam_info->reasonCode = session->joinFailStatusCode.reasonCode;
 
 
-		roamInfo.statusCode = session->joinFailStatusCode.statusCode;
-		roamInfo.reasonCode = session->joinFailStatusCode.reasonCode;
+	/* Only indicate assoc_completion if we indicate assoc_start. */
+	if (session->bRefAssocStartCnt > 0) {
 		session->bRefAssocStartCnt--;
 		session->bRefAssocStartCnt--;
 		csr_roam_call_callback(mac_ctx, session_id, roam_info,
 		csr_roam_call_callback(mac_ctx, session_id, roam_info,
 				       session->scan_info.roam_id,
 				       session->scan_info.roam_id,
 				       eCSR_ROAM_ASSOCIATION_COMPLETION,
 				       eCSR_ROAM_ASSOCIATION_COMPLETION,
 				       eCSR_ROAM_RESULT_SCAN_FOR_SSID_FAILURE);
 				       eCSR_ROAM_RESULT_SCAN_FOR_SSID_FAILURE);
 	} else {
 	} else {
-		csr_roam_call_callback(mac_ctx, session_id, NULL,
+		if (!csr_handle_fils_scan_for_ssid_failure(
+		    profile, roam_info)) {
+			qdf_mem_free(roam_info);
+			roam_info = NULL;
+		}
+		csr_roam_call_callback(mac_ctx, session_id, roam_info,
 				       session->scan_info.roam_id,
 				       session->scan_info.roam_id,
 				       eCSR_ROAM_ASSOCIATION_FAILURE,
 				       eCSR_ROAM_ASSOCIATION_FAILURE,
 				       eCSR_ROAM_RESULT_SCAN_FOR_SSID_FAILURE);
 				       eCSR_ROAM_RESULT_SCAN_FOR_SSID_FAILURE);
 	}
 	}
+
+	if (roam_info)
+		qdf_mem_free(roam_info);
 roam_completion:
 roam_completion:
 	csr_roam_completion(mac_ctx, session_id, NULL, NULL, roam_result,
 	csr_roam_completion(mac_ctx, session_id, NULL, NULL, roam_result,
 			    false);
 			    false);