Browse Source

qcacmn: Handle roam target AP and current AP same MLD address case

If 2 MLO AP have same MLD addr, when roam between them,  link vdev1 old
peer is deleted first, ML peer goes to state ML_PEER_DISCONN_INITIATED,
Since ML peer can be found for same MLD addr, no new ML peer is created,
but vdev1 new link peer is failed to attach to ML peer for wrong state,
then ML peer will be double freed, assert will happen.

To fix it, if roam target AP and current AP have same MLD addr, before
attach new peer to reused ML peer, update different info from target AP,
update ML peer state to ML_PEER_CREATED again.

Change-Id: Ia656ed61be4ae417b8cfbe7711d421fbcee89b97
CRs-Fixed: 3302438
Jianmin Zhu 2 years ago
parent
commit
0e57c9b492
1 changed files with 16 additions and 2 deletions
  1. 16 2
      umac/mlo_mgr/src/wlan_mlo_mgr_peer.c

+ 16 - 2
umac/mlo_mgr/src/wlan_mlo_mgr_peer.c

@@ -851,12 +851,26 @@ QDF_STATUS wlan_mlo_peer_create(struct wlan_objmgr_vdev *vdev,
 			}
 		}
 	}
-
+	/* When roam to MLO AP, partner link vdev1 is updated first,
+	 * ml peer need be created and attached for partner link peer.
+	 *
+	 * When roam target AP and current AP have same MLD address, don't
+	 * delete old ML peer and re-create new one, just update different
+	 * info.
+	 */
 	if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) {
 		ml_peer = wlan_mlo_get_mlpeer(ml_dev,
 				 (struct qdf_mac_addr *)&link_peer->mldaddr[0]);
-		if (ml_peer)
+		if (ml_peer) {
+			mlo_debug("ML Peer " QDF_MAC_ADDR_FMT
+				" existed, state %d",
+				QDF_MAC_ADDR_REF(ml_peer->peer_mld_addr.bytes),
+				ml_peer->mlpeer_state);
+			ml_peer->mlpeer_state = ML_PEER_CREATED;
+			ml_peer->max_links = ml_info->num_partner_links;
+			wlan_mlo_peer_set_t2lm_enable_val(ml_peer, ml_info);
 			is_ml_peer_attached = true;
+		}
 	}
 	if (!ml_peer) {
 		/* Allocate MLO peer */