Jelajahi Sumber

qcacld-3.0: Avoid MLO RSO start before link vdev up

For mlo initial connect, vdev0 connected first, when received assoc rsp,
then up vdev0 at last trigger vdev1 connect, set wlan_connected_links
bitmap for vdev1.

For owe 1x roaming, vdev1 link is set up on host side, when handle roam
sync, we need stop RSO first to finish EAPOL, then trigger vdev1 connect,
set wlan_connected_links bitmap for vdev1.

Above design has race condition issue:
vdev0 becomes up (T1) before set wlan_connected_links bitmap for vdev1
(T2), if enable RSO for vdev0 happens between T1 and T2 for some reason
like vdev2 connect/disconnect, mlo_check_if_all_vdev_up return true, so
mlo vdev0 RSO is enabled in F/W before vdev1 up, which is unexpected.

Fix proposal for both initial connect and roaming:
For mlo initial connect, vdev0 connected first, when received assoc rsp,
we know whether other links need set up, can set wlan_connected_links
bitmap at that time, then up vdev0, at last trigger vdev1 connect.

For owe 1x roaming, vdev1 link is set up on host side, when handle roam
sync, we need stop RSO first to finish EAPOL, then set
wlan_connected_links bitmap for vdev1, at last trigger vdev1 connect.

Change-Id: I9abe48dbf7781be80ab5ec99ec42e6324a676283
CRs-Fixed: 3576584
Jianmin Zhu 1 tahun lalu
induk
melakukan
af2244d20a

+ 3 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_fw_sync.c

@@ -1034,6 +1034,9 @@ cm_fw_roam_sync_propagation(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 			 CM_PREFIX_REF(vdev_id, cm_id));
 		goto error;
 	}
+
+	if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev))
+		mlo_roam_update_connected_links(vdev, connect_rsp);
 	mlme_cm_osif_connect_complete(vdev, connect_rsp);
 	mlme_cm_osif_roam_complete(vdev);
 

+ 22 - 0
core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c

@@ -726,6 +726,22 @@ lim_fill_sme_assoc_ind_mlo_mld_addr_copy(struct assoc_ind *sme_assoc_ind,
 	qdf_mem_copy(sme_assoc_ind->peer_mld_addr, assoc_ind->peer_mld_addr,
 		     num_bytes);
 }
+
+/**
+ * lim_update_connected_links() - Update connected mlo links bmap
+ * @session: Pointer to pe session
+ *
+ * Update connected mlo links bmap for all vdev taking
+ * part in association
+ *
+ * Return: None
+ */
+static void lim_update_connected_links(struct pe_session *session)
+{
+	mlo_update_connected_links(session->vdev, 1);
+	mlo_update_connected_links_bmap(session->vdev->mlo_dev_ctx,
+					session->ml_partner_info);
+}
 #else /* WLAN_FEATURE_11BE_MLO */
 static inline void
 lim_fill_sme_assoc_ind_mlo_mld_addr_copy(struct assoc_ind *sme_assoc_ind,
@@ -733,6 +749,10 @@ lim_fill_sme_assoc_ind_mlo_mld_addr_copy(struct assoc_ind *sme_assoc_ind,
 					 uint32_t num_bytes)
 {
 }
+
+static void lim_update_connected_links(struct pe_session *session)
+{
+}
 #endif /* WLAN_FEATURE_11BE_MLO */
 
 void
@@ -1395,6 +1415,8 @@ void lim_handle_sme_join_result(struct mac_context *mac_ctx,
 	}
 
 	if (result_code == eSIR_SME_SUCCESS) {
+		if (wlan_vdev_mlme_is_mlo_vdev(session->vdev))
+			lim_update_connected_links(session);
 		wlan_vdev_mlme_sm_deliver_evt(session->vdev,
 					      WLAN_VDEV_SM_EV_START_SUCCESS,
 					      0, NULL);