Browse Source

qcacld-3.0: Fix wrong SAE tx addr issue in WoW mode

In WoW mode, roam auth event may comes before roam start event, so CM
isn't in ROAMING state at that time, can't assume ROAMING state.

Change-Id: Ibf868db1ca0f9863d4beae4c83227cf04fe55adb
CRs-Fixed: 3357115
Jianmin Zhu 2 years ago
parent
commit
61c100819e

+ 2 - 0
components/mlme/core/inc/wlan_mlme_main.h

@@ -229,6 +229,7 @@ struct wlan_mlme_roaming_config {
  * @sae_single_pmk: Details for sae roaming using single pmk
  * @set_pmk_pending: RSO update status of PMK from set_key
  * @sae_auth_ta: SAE pre-auth tx address
+ * @sae_auth_pending:  Roaming SAE auth pending
  */
 struct wlan_mlme_roam {
 	struct wlan_mlme_roam_state_info roam_sm;
@@ -238,6 +239,7 @@ struct wlan_mlme_roam {
 #endif
 	bool set_pmk_pending;
 	struct qdf_mac_addr sae_auth_ta;
+	uint8_t sae_auth_pending;
 };
 
 #ifdef WLAN_FEATURE_MSCS

+ 12 - 3
components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c

@@ -3802,6 +3802,7 @@ wlan_cm_set_sae_auth_ta(struct wlan_objmgr_pdev *pdev,
 	}
 	qdf_mem_copy(mlme_priv->mlme_roam.sae_auth_ta.bytes, sae_auth_ta.bytes,
 		     QDF_MAC_ADDR_SIZE);
+	mlme_priv->mlme_roam.sae_auth_pending = true;
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
 
 	return QDF_STATUS_SUCCESS;
@@ -3829,9 +3830,17 @@ wlan_cm_get_sae_auth_ta(struct wlan_objmgr_pdev *pdev,
 		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
 		return QDF_STATUS_E_INVAL;
 	}
-	qdf_mem_copy(sae_auth_ta->bytes, mlme_priv->mlme_roam.sae_auth_ta.bytes,
-		     QDF_MAC_ADDR_SIZE);
+
+	if (mlme_priv->mlme_roam.sae_auth_pending) {
+		qdf_mem_copy(sae_auth_ta->bytes,
+			     mlme_priv->mlme_roam.sae_auth_ta.bytes,
+			     QDF_MAC_ADDR_SIZE);
+		mlme_priv->mlme_roam.sae_auth_pending = false;
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
+		return QDF_STATUS_SUCCESS;
+	}
+
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
 
-	return QDF_STATUS_SUCCESS;
+	return QDF_STATUS_E_ALREADY;
 }

+ 6 - 8
core/hdd/src/wlan_hdd_assoc.c

@@ -237,14 +237,12 @@ void wlan_hdd_sae_copy_ta_addr(struct cfg80211_external_auth_params *params,
 			       struct sir_sae_info *sae_info)
 {
 	struct qdf_mac_addr ta = QDF_MAC_ADDR_ZERO_INIT;
-	bool roaming;
-
-	roaming = wlan_cm_roaming_in_progress(adapter->hdd_ctx->pdev,
-					      sae_info->vdev_id);
-	if (roaming) {
-		ucfg_cm_get_sae_auth_ta(adapter->hdd_ctx->pdev,
-					sae_info->vdev_id,
-					&ta);
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+
+	status = ucfg_cm_get_sae_auth_ta(adapter->hdd_ctx->pdev,
+					 sae_info->vdev_id,
+					 &ta);
+	if (QDF_IS_STATUS_SUCCESS(status)) {
 		qdf_mem_copy(params->tx_addr, ta.bytes, QDF_MAC_ADDR_SIZE);
 		hdd_debug("ta:" QDF_MAC_ADDR_FMT,
 			  QDF_MAC_ADDR_REF(params->tx_addr));