Browse Source

qcacmn: Clear peer-level negotiated T2LM mapping

Clear the peer-level tid-to-link mapping and set
direction to invalid if-
1) Host receives updated T2LM info through
critical update.
2) There are two T2LM elements received in beacons
and mapping switch time expires for first mapping.
Apply the second mapping.
3) There is a single T2LM element and its mapping
switch time expires. Apply default mapping.

Also, initialize peer-level mapping structure
when a new peer is created.

Change-Id: I1d06ec5f2f5aa398724213a3be08b6588f78c9b0
CRs-Fixed: 3435329
Gururaj Pandurangi 2 years ago
parent
commit
a11201af17

+ 18 - 0
umac/mlo_mgr/inc/wlan_mlo_t2lm.h

@@ -868,4 +868,22 @@ wlan_send_peer_level_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev,
 	return QDF_STATUS_SUCCESS;
 }
 #endif /* WLAN_FEATURE_11BE */
+
+#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_FEATURE_11BE_MLO_ADV_FEATURE)
+/**
+ * wlan_clear_peer_level_tid_to_link_mapping() - API to clear peer level T2LM
+ * info negotiated using action frames to FW.
+ *
+ * @vdev: Pointer to vdev
+ *
+ * Return: none
+ */
+void
+wlan_clear_peer_level_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev);
+#else
+static inline void
+wlan_clear_peer_level_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev)
+{
+}
+#endif
 #endif /* _WLAN_MLO_T2LM_H_ */

+ 3 - 0
umac/mlo_mgr/src/wlan_mlo_mgr_peer.c

@@ -1360,6 +1360,9 @@ QDF_STATUS wlan_mlo_peer_create(struct wlan_objmgr_vdev *vdev,
 		}
 	}
 
+	if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE)
+		wlan_clear_peer_level_tid_to_link_mapping(vdev);
+
 	wlan_mlo_peer_release_ref(ml_peer);
 
 	return QDF_STATUS_SUCCESS;

+ 28 - 2
umac/mlo_mgr/src/wlan_mlo_t2lm.c

@@ -26,6 +26,9 @@
 #include <wlan_mlo_mgr_cmn.h>
 #include <qdf_util.h>
 #include <wlan_cm_api.h>
+#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_FEATURE_11BE_MLO_ADV_FEATURE)
+#include <wlan_t2lm_api.h>
+#endif
 
 QDF_STATUS wlan_mlo_parse_t2lm_info(uint8_t *ie,
 				    struct wlan_t2lm_info *t2lm)
@@ -676,6 +679,8 @@ static void wlan_mlo_t2lm_handle_expected_duration_expiry(
 	t2lm_ctx->established_t2lm.disabled_link_bitmap = 0;
 	t2lm_ctx->established_t2lm.t2lm.link_mapping_size = 0;
 	t2lm_debug("Set established mapping to default mapping");
+
+	wlan_clear_peer_level_tid_to_link_mapping(vdev);
 }
 
 QDF_STATUS wlan_mlo_vdev_tid_to_link_map_event(
@@ -969,6 +974,24 @@ wlan_send_peer_level_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev,
 	return status;
 }
 
+#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_FEATURE_11BE_MLO_ADV_FEATURE)
+void
+wlan_clear_peer_level_tid_to_link_mapping(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_objmgr_peer *peer;
+
+	peer = wlan_objmgr_vdev_try_get_bsspeer(vdev, WLAN_MLO_MGR_ID);
+	if (!peer) {
+		t2lm_err("Peer not found");
+		return;
+	}
+
+	wlan_t2lm_clear_peer_negotiation(peer);
+
+	wlan_objmgr_peer_release_ref(peer, WLAN_MLO_MGR_ID);
+}
+#endif
+
 void wlan_mlo_t2lm_timer_expiry_handler(void *vdev)
 {
 	struct wlan_objmgr_vdev *vdev_ctx = (struct wlan_objmgr_vdev *)vdev;
@@ -1178,8 +1201,10 @@ static QDF_STATUS wlan_update_mapping_switch_time_expected_dur(
 
 	t2lm_dev_lock_acquire(t2lm_ctx);
 
-	if (t2lm_ctx->established_t2lm.t2lm.expected_duration_present &&
-	    rx_t2lm->established_t2lm.t2lm.expected_duration_present) {
+	if ((t2lm_ctx->established_t2lm.t2lm.expected_duration_present &&
+	    rx_t2lm->established_t2lm.t2lm.expected_duration_present) &&
+	    (rx_t2lm->established_t2lm.t2lm.expected_duration <
+	     t2lm_ctx->established_t2lm.t2lm.expected_duration)) {
 		/* Established T2LM is already saved in the T2LM context.
 		 * T2LM IE in the beacon/probe response frame has the updated
 		 * expected duration.
@@ -1210,6 +1235,7 @@ static QDF_STATUS wlan_update_mapping_switch_time_expected_dur(
 		/* Notify the registered caller about the link update*/
 		wlan_mlo_dev_t2lm_notify_link_update(vdev,
 					&t2lm_ctx->established_t2lm.t2lm);
+		wlan_clear_peer_level_tid_to_link_mapping(vdev);
 		wlan_send_tid_to_link_mapping(
 				vdev, &t2lm_ctx->established_t2lm.t2lm);
 	}