瀏覽代碼

qcacld-3.0: defer sending STA_CONNECT to IPA after key install

Unlike wpa2, in wpa3 roaming scenario, roaming is not fully
offloaded to FW, EAPOL handshake and key install are done
from host, in current design during assoc completion handler,
it sends STA_CONNECT event to IPA and IPA gets hung waiting
for buffer replenish from FW and FW is waiting for current
thread to return, this causes deadlock, so defer sending
STA_CONNECT event to IPA after EAPOL handshake and key install
for all the secure connections, hence IPA HW is ready to
process the STA_CONNECT event, in this case.

Change-Id: I19961cdd303ccef13621c7a20867ba852342a526
CRs-Fixed: 2958313
Vevek Venkatesan 3 年之前
父節點
當前提交
753c26db74
共有 2 個文件被更改,包括 63 次插入34 次删除
  1. 12 0
      core/hdd/src/wlan_hdd_assoc.c
  2. 51 34
      core/hdd/src/wlan_hdd_cm_connect.c

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

@@ -2439,6 +2439,18 @@ static int hdd_change_sta_state_authenticated(struct hdd_adapter *adapter,
 		WLAN_HDD_GET_STATION_CTX_PTR(adapter);
 
 	mac_addr = hddstactx->conn_info.bssid.bytes;
+
+	if (ucfg_ipa_is_enabled() && !hddstactx->conn_info.is_authenticated &&
+	    adapter->device_mode == QDF_STA_MODE &&
+	    hddstactx->conn_info.auth_type != eCSR_AUTH_TYPE_NONE &&
+	    hddstactx->conn_info.auth_type != eCSR_AUTH_TYPE_OPEN_SYSTEM &&
+	    hddstactx->conn_info.auth_type != eCSR_AUTH_TYPE_SHARED_KEY)
+		ucfg_ipa_wlan_evt(adapter->hdd_ctx->pdev, adapter->dev,
+				  adapter->device_mode, adapter->vdev_id,
+				  WLAN_IPA_STA_CONNECT, mac_addr,
+				  WLAN_REG_IS_24GHZ_CH_FREQ(
+					hddstactx->conn_info.chan_freq));
+
 	hdd_cm_set_peer_authenticate(adapter, &hddstactx->conn_info.bssid,
 				     false);
 

+ 51 - 34
core/hdd/src/wlan_hdd_cm_connect.c

@@ -816,6 +816,39 @@ static void hdd_cm_save_connect_info(struct hdd_adapter *adapter,
 	hdd_cm_save_bss_info(adapter, rsp);
 }
 
+#ifdef WLAN_FEATURE_FILS_SK
+static bool hdd_cm_is_fils_connection(struct wlan_cm_connect_resp *rsp)
+{
+	return rsp->is_fils_connection;
+}
+#else
+static inline
+bool hdd_cm_is_fils_connection(struct wlan_cm_connect_resp *rsp)
+{
+	return false;
+}
+#endif
+
+#ifdef WLAN_FEATURE_ROAM_OFFLOAD
+static bool hdd_cm_is_roam_auth_required(struct hdd_station_ctx *sta_ctx,
+					 struct wlan_cm_connect_resp *rsp)
+{
+	if (!rsp->roaming_info)
+		return false;
+
+	if (rsp->roaming_info->auth_status == ROAM_AUTH_STATUS_AUTHENTICATED)
+		return false;
+
+	return true;
+}
+#else
+static bool hdd_cm_is_roam_auth_required(struct hdd_station_ctx *sta_ctx,
+					 struct wlan_cm_connect_resp *rsp)
+{
+	return true;
+}
+#endif
+
 static void
 hdd_cm_connect_success_pre_user_update(struct wlan_objmgr_vdev *vdev,
 				       struct wlan_cm_connect_resp *rsp)
@@ -828,6 +861,8 @@ hdd_cm_connect_success_pre_user_update(struct wlan_objmgr_vdev *vdev,
 	uint32_t ie_len;
 	uint8_t *ie_field;
 	mac_handle_t mac_handle;
+	bool is_auth_required = true;
+	bool is_roam_offload = false;
 	bool is_roam = rsp->is_reassoc;
 	ol_txrx_soc_handle soc = cds_get_context(QDF_MODULE_ID_SOC);
 	uint32_t phymode;
@@ -941,7 +976,22 @@ hdd_cm_connect_success_pre_user_update(struct wlan_objmgr_vdev *vdev,
 		adapter->is_link_up_service_needed = false;
 	}
 
-	if (ucfg_ipa_is_enabled())
+	if (!rsp->is_wps_connection &&
+	    (sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_NONE ||
+	     sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_OPEN_SYSTEM ||
+	     sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_SHARED_KEY ||
+	     hdd_cm_is_fils_connection(rsp)))
+		is_auth_required = false;
+
+	if (is_roam)
+		/* If roaming is set check if FW roaming/LFR3  */
+		ucfg_mlme_get_roaming_offload(hdd_ctx->psoc, &is_roam_offload);
+
+	if (is_roam_offload)
+		/* for LFR 3 get authenticated info from resp */
+		is_auth_required = hdd_cm_is_roam_auth_required(sta_ctx, rsp);
+
+	if (ucfg_ipa_is_enabled() && !is_auth_required)
 		ucfg_ipa_wlan_evt(hdd_ctx->pdev, adapter->dev,
 				  adapter->device_mode,
 				  adapter->vdev_id,
@@ -965,39 +1015,6 @@ hdd_cm_connect_success_pre_user_update(struct wlan_objmgr_vdev *vdev,
 	 /* hdd_objmgr_set_peer_mlme_auth_state */
 }
 
-#ifdef WLAN_FEATURE_FILS_SK
-static bool hdd_cm_is_fils_connection(struct wlan_cm_connect_resp *rsp)
-{
-	return rsp->is_fils_connection;
-}
-#else
-static inline
-bool hdd_cm_is_fils_connection(struct wlan_cm_connect_resp *rsp)
-{
-	return false;
-}
-#endif
-
-#ifdef WLAN_FEATURE_ROAM_OFFLOAD
-static bool hdd_cm_is_roam_auth_required(struct hdd_station_ctx *sta_ctx,
-					 struct wlan_cm_connect_resp *rsp)
-{
-	if (!rsp->roaming_info)
-		return false;
-
-	if (rsp->roaming_info->auth_status == ROAM_AUTH_STATUS_AUTHENTICATED)
-		return false;
-
-	return true;
-}
-#else
-static bool hdd_cm_is_roam_auth_required(struct hdd_station_ctx *sta_ctx,
-					 struct wlan_cm_connect_resp *rsp)
-{
-	return true;
-}
-#endif
-
 static void
 hdd_cm_connect_success_post_user_update(struct wlan_objmgr_vdev *vdev,
 					struct wlan_cm_connect_resp *rsp)