Browse Source

qcacmn: Avoid MLO sta connect duplicated BSS

After legacy STA connected 1 link of MLO AP as 11ax, MLO STA connect
same MLO AP, 1 link connect will fail for bss peer existed, tx queue
will be disabled, other links can't be used at all.

To fix it, when MLO STA select candidate AP link, if peer with BSS link
addr exist, disable the link.

Change-Id: Ib7e2f4cd43c8190c5e5fd0bb7786df41b022f518
CRs-Fixed: 3715997
Jianmin Zhu 1 year ago
parent
commit
4c64c692a1
1 changed files with 20 additions and 8 deletions
  1. 20 8
      umac/mlme/connection_mgr/core/src/wlan_cm_bss_scoring.c

+ 20 - 8
umac/mlme/connection_mgr/core/src/wlan_cm_bss_scoring.c

@@ -3085,13 +3085,14 @@ static void cm_eliminate_common_candidate(qdf_list_t *candidate_list)
 	}
 }
 
-static void cm_validate_partner_links_rsn_cap(struct wlan_objmgr_psoc *psoc,
-					      struct scan_cache_entry *entry,
-					      qdf_list_t *scan_list)
+static void cm_validate_partner_links(struct wlan_objmgr_psoc *psoc,
+				      struct scan_cache_entry *entry,
+				      qdf_list_t *scan_list)
 {
 	uint8_t idx;
 	struct scan_cache_entry *partner_entry;
 	struct partner_link_info *partner_info;
+	struct wlan_objmgr_peer *peer;
 
 	if (!entry->ie_list.multi_link_bv || !entry->ml_info.num_links)
 		return;
@@ -3101,6 +3102,18 @@ static void cm_validate_partner_links_rsn_cap(struct wlan_objmgr_psoc *psoc,
 		if (!partner_info->is_valid_link)
 			continue;
 
+		peer = wlan_objmgr_get_peer_by_mac(psoc,
+						   partner_info->link_addr.bytes,
+						   WLAN_MLME_CM_ID);
+		if (peer) {
+			mlme_debug(QDF_MAC_ADDR_FMT "link (%d) dup peer existed",
+				   QDF_MAC_ADDR_REF(partner_entry->bssid.bytes),
+				   partner_info->freq);
+			partner_info->is_valid_link = false;
+			wlan_objmgr_peer_release_ref(peer, WLAN_MLME_CM_ID);
+			continue;
+		}
+
 		/*
 		 * If partner link is not found in the current candidate list
 		 * don't treat it as failure, it can be removed post ML
@@ -3135,9 +3148,9 @@ static void cm_eliminate_common_candidate(qdf_list_t *candidate_list)
 }
 
 static inline void
-cm_validate_partner_links_rsn_cap(struct wlan_objmgr_psoc *psoc,
-				  struct scan_cache_entry *entry,
-				  qdf_list_t *scan_list)
+cm_validate_partner_links(struct wlan_objmgr_psoc *psoc,
+			  struct scan_cache_entry *entry,
+			  qdf_list_t *scan_list)
 {
 }
 #endif
@@ -3231,8 +3244,7 @@ void wlan_cm_calculate_bss_score(struct wlan_objmgr_pdev *pdev,
 		}
 
 		/* Check if the partner links RSN caps are matching. */
-		cm_validate_partner_links_rsn_cap(psoc,
-						  scan_entry->entry, scan_list);
+		cm_validate_partner_links(psoc, scan_entry->entry, scan_list);
 		if (denylist_action == CM_DLM_NO_ACTION ||
 		    (are_all_candidate_denylisted && denylist_action ==
 		     CM_DLM_REMOVE)) {