Prechádzať zdrojové kódy

qcacld-3.0: Cleanup current peers upon non-11BE roaming also

Currently, all bss peers are cleaned-up as soon as ROAM_SYNC
indication is received when ML-roaming happens. This is to
avoid self-roaming cross peer issue where a peer that is
present on one vdev in the previous connection moved to other
vdev due to roaming to the same AP. So far the use case is to
roam from one set of links(e.g. 2 GHz + 5 GHz) to another set
of links (e.g. 5 GHz + 6 GHz) of same AP.

But due to recent enhancements to support non-wpa3 connections,
firmware does downgraded-roaming from 11BE to non-11BE mode.
Host receives ROAM_SYNC indication and faces self-roaming cross
peer issue in this case also.

Delete all peers even when DUT roams to non-11BE AP to avoid
this issue.

Change-Id: I9b1e63ebba85e5f2f19efc5e4608a51e06e77a40
CRs-Fixed: 3548398
Vijay Patil 1 rok pred
rodič
commit
94435f22df
2 zmenil súbory, kde vykonal 17 pridanie a 18 odobranie
  1. 2 2
      core/mac/src/pe/lim/lim_mlo.c
  2. 15 16
      core/wma/src/wma_scan_roam.c

+ 2 - 2
core/mac/src/pe/lim/lim_mlo.c

@@ -456,8 +456,8 @@ void lim_mlo_roam_peer_disconn_del(struct wlan_objmgr_vdev *vdev)
 
 	status = wlan_vdev_get_bss_peer_mac(vdev, &bssid);
 	if (QDF_IS_STATUS_ERROR(status)) {
-		pe_err("vdev id %d : failed to get bssid",
-		       wlan_vdev_get_id(vdev));
+		pe_debug("vdev id %d : failed to get bssid",
+			 wlan_vdev_get_id(vdev));
 		return;
 	}
 

+ 15 - 16
core/wma/src/wma_scan_roam.c

@@ -583,6 +583,7 @@ wma_delete_all_peers(tp_wma_handle wma,
 	uint8_t link_vdev_id;
 	tDeleteStaParams *del_sta_params;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	struct qdf_mac_addr bssid;
 
 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, vdev_id,
 						    WLAN_MLME_OBJMGR_ID);
@@ -602,6 +603,15 @@ wma_delete_all_peers(tp_wma_handle wma,
 		if (!mlo_dev_ctx->wlan_vdev_list[i])
 			continue;
 
+		if (QDF_IS_STATUS_ERROR(wlan_vdev_get_bss_peer_mac(
+			mlo_dev_ctx->wlan_vdev_list[i],
+			&bssid))) {
+			pe_debug("bss peer is not present on vdev id %d, no need to cleanup",
+				 wlan_vdev_get_id(
+				 mlo_dev_ctx->wlan_vdev_list[i]));
+			continue;
+		}
+
 		del_sta_params = qdf_mem_malloc(sizeof(*del_sta_params));
 		if (!del_sta_params) {
 			status = QDF_STATUS_E_NOMEM;
@@ -648,7 +658,6 @@ wma_roam_update_vdev(tp_wma_handle wma,
 		     struct roam_offload_synch_ind *roam_synch_ind_ptr,
 		     uint8_t roamed_vdev_id)
 {
-	tDeleteStaParams *del_sta_params;
 	tAddStaParams *add_sta_params;
 	uint8_t vdev_id, *bssid;
 	int32_t uc_cipher, cipher_cap;
@@ -688,22 +697,12 @@ wma_roam_update_vdev(tp_wma_handle wma,
 	 * To handle this delete all link peers,
 	 * while doing roam sync on first link.
 	 */
-	if (is_multi_link_roam(roam_synch_ind_ptr)) {
-		if (wlan_vdev_mlme_get_is_mlo_link(wma->psoc, vdev_id) ||
-		    mlo_get_single_link_ml_roaming(wma->psoc, vdev_id)) {
-			status = wma_delete_all_peers(wma, vdev_id);
-			if (QDF_IS_STATUS_ERROR(status))
-				goto end;
-		}
-	} else {
-		del_sta_params = qdf_mem_malloc(sizeof(*del_sta_params));
-		if (!del_sta_params)
+	if (!is_multi_link_roam(roam_synch_ind_ptr) ||
+	    wlan_vdev_mlme_get_is_mlo_link(wma->psoc, vdev_id) ||
+	    mlo_get_single_link_ml_roaming(wma->psoc, vdev_id)) {
+		status = wma_delete_all_peers(wma, vdev_id);
+		if (QDF_IS_STATUS_ERROR(status))
 			goto end;
-
-		qdf_mem_zero(del_sta_params, sizeof(*del_sta_params));
-		del_sta_params->smesessionId = vdev_id;
-		wma_delete_sta(wma, del_sta_params);
-		wma_delete_bss(wma, vdev_id);
 	}
 
 	add_sta_params->staType = STA_ENTRY_SELF;