Sfoglia il codice sorgente

qcacld-3.0: Abort roaming on link as well for MLO

Currently, roaming is not aborted in failure cases on
the link vdev and it's aborted only on primary vdev.
It results in link vdev not being cleaned up when roaming
fails due to some reason.

Change-Id: I0eb4b1da06a295935ff95be38228a5cacf127a73
CRs-Fixed: 3096648
Srinivas Dasari 3 anni fa
parent
commit
6d7dd83436

+ 1 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload_event.c

@@ -529,6 +529,7 @@ QDF_STATUS cm_roam_sync_event_handler_cb(struct wlan_objmgr_vdev *vdev,
 
 err:
 	if (QDF_IS_STATUS_ERROR(status)) {
+		wlan_mlo_roam_abort_on_link(psoc, sync_ind);
 		cm_fw_roam_abort_req(psoc, sync_ind->roamed_vdev_id);
 		cm_roam_stop_req(psoc, sync_ind->roamed_vdev_id,
 				 REASON_ROAM_SYNCH_FAILED);

+ 22 - 0
components/umac/mlme/mlo_mgr/inc/wlan_mlo_mgr_roam.h

@@ -173,6 +173,21 @@ void mlo_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev,
 			 void *event, uint32_t event_data_len);
 #endif /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */
 
+/**
+ * wlan_mlo_roam_abort_on_link - Abort roam on link
+ *
+ * @psoc: psoc pointer
+ * @sync_ind: Roam sync indication
+ *
+ * Abort roaming on all the links except the primary. Roam abort on primary
+ * link would be taken care in legacy path.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+wlan_mlo_roam_abort_on_link(struct wlan_objmgr_psoc *psoc,
+			    struct roam_offload_synch_ind *sync_ind);
+
 #else /* WLAN_FEATURE_11BE_MLO */
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 static inline
@@ -232,5 +247,12 @@ static inline void
 mlo_roam_update_connected_links(struct wlan_objmgr_vdev *vdev,
 				struct wlan_cm_connect_resp *connect_rsp)
 {}
+
+static inline QDF_STATUS
+wlan_mlo_roam_abort_on_link(struct wlan_objmgr_psoc *psoc,
+			    struct roam_offload_synch_ind *sync_ind)
+{
+	return QDF_STATUS_E_NOSUPPORT;
+}
 #endif /* WLAN_FEATURE_11BE_MLO */
 #endif

+ 18 - 0
components/umac/mlme/mlo_mgr/src/wlan_mlo_mgr_roam.c

@@ -369,3 +369,21 @@ mlo_roam_update_connected_links(struct wlan_objmgr_vdev *vdev,
 					connect_rsp->ml_parnter_info);
 }
 
+QDF_STATUS
+wlan_mlo_roam_abort_on_link(struct wlan_objmgr_psoc *psoc,
+			    struct roam_offload_synch_ind *sync_ind)
+{
+	uint8_t i;
+	QDF_STATUS status;
+
+	for (i = 0; i < sync_ind->num_setup_links; i++)
+		if (sync_ind->ml_link[i].vdev_id != sync_ind->roamed_vdev_id) {
+			status = cm_fw_roam_abort_req(psoc,
+						      sync_ind->roamed_vdev_id);
+			if (QDF_IS_STATUS_ERROR(status))
+				mlme_err("LFR3: Fail to abort roam on vdev: %u",
+					 sync_ind->ml_link[i].vdev_id);
+		}
+
+	return QDF_STATUS_SUCCESS;
+}