Просмотр исходного кода

qcacld-3.0: Stop t2lm timer during disconnection

Add support to stop t2lm timer during sta disconnection
and clear t2lm mapping.

Change-Id: I59e724331eda8b67fd1405031bdb00d12805ad09
CRs-Fixed: 3479496
Amruta Kulkarni 1 год назад
Родитель
Сommit
adef8d5e58

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

@@ -34,6 +34,7 @@
 #include "connection_mgr/core/src/wlan_cm_roam.h"
 #include <wlan_mlo_mgr_sta.h>
 #include "wlan_mlo_mgr_roam.h"
+#include "wlan_t2lm_api.h"
 
 static void cm_abort_connect_request_timers(struct wlan_objmgr_vdev *vdev)
 {
@@ -92,6 +93,8 @@ QDF_STATUS cm_disconnect_start_ind(struct wlan_objmgr_vdev *vdev,
 		mlo_roam_free_copied_reassoc_rsp(vdev);
 	}
 
+	wlan_t2lm_clear_all_tid_mapping(vdev);
+
 	return QDF_STATUS_SUCCESS;
 }
 

+ 29 - 0
components/umac/mlme/mlo_mgr/inc/wlan_t2lm_api.h

@@ -188,6 +188,16 @@ QDF_STATUS wlan_t2lm_deliver_event(struct wlan_objmgr_vdev *vdev,
 				   void *event_data,
 				   uint8_t *dialog_token);
 
+/**
+ * wlan_t2lm_clear_ongoing_negotiation - Clear ongoing
+ * negotiation peer level TID-to-link-mapping.
+ * @peer: pointer to peer
+ *
+ * Return: none
+ */
+void
+wlan_t2lm_clear_ongoing_negotiation(struct wlan_objmgr_peer *peer);
+
 /**
  * wlan_t2lm_clear_peer_negotiation - Clear previously
  * negotiated peer level TID-to-link-mapping.
@@ -197,6 +207,17 @@ QDF_STATUS wlan_t2lm_deliver_event(struct wlan_objmgr_vdev *vdev,
  */
 void
 wlan_t2lm_clear_peer_negotiation(struct wlan_objmgr_peer *peer);
+
+/**
+ * wlan_t2lm_clear_all_tid_mapping - Clear all tid mapping
+ * @vdev: pointer to vdev
+ *
+ * This api will clear peer level and beacon t2lm mapping.
+ * Return: none
+ */
+void
+wlan_t2lm_clear_all_tid_mapping(struct wlan_objmgr_vdev *vdev);
+
 #else
 static inline QDF_STATUS
 t2lm_handle_rx_req(struct wlan_objmgr_vdev *vdev,
@@ -250,10 +271,18 @@ wlan_t2lm_validate_candidate(struct cnx_mgr *cm_ctx,
 	return QDF_STATUS_E_NOSUPPORT;
 }
 
+static inline void
+wlan_t2lm_clear_ongoing_negotiation(struct wlan_objmgr_peer *peer)
+{}
+
 static inline void
 wlan_t2lm_clear_peer_negotiation(struct wlan_objmgr_peer *peer)
 {}
 
+static inline void
+wlan_t2lm_clear_all_tid_mapping(struct wlan_objmgr_vdev *vdev)
+{}
+
 static inline
 QDF_STATUS wlan_t2lm_deliver_event(struct wlan_objmgr_vdev *vdev,
 				   struct wlan_objmgr_peer *peer,

+ 70 - 1
components/umac/mlme/mlo_mgr/src/wlan_t2lm_api.c

@@ -429,12 +429,43 @@ end:
 	return status;
 }
 
+void
+wlan_t2lm_clear_ongoing_negotiation(struct wlan_objmgr_peer *peer)
+{
+	struct wlan_mlo_peer_context *ml_peer;
+	struct wlan_t2lm_onging_negotiation_info *ongoing_tid_to_link_mapping;
+	uint8_t i;
+
+	ml_peer = peer->mlo_peer_ctx;
+	if (!ml_peer) {
+		t2lm_err("ml peer is null");
+		return;
+	}
+
+	ongoing_tid_to_link_mapping = &ml_peer->t2lm_policy.ongoing_tid_to_link_mapping;
+	if (!ongoing_tid_to_link_mapping) {
+		t2lm_err("ongoing tid mapping is null");
+		return;
+	}
+
+	qdf_mem_zero(&ongoing_tid_to_link_mapping->t2lm_info,
+		     sizeof(struct wlan_t2lm_info) * WLAN_T2LM_MAX_DIRECTION);
+
+	ongoing_tid_to_link_mapping->dialog_token = 0;
+	ongoing_tid_to_link_mapping->category = WLAN_T2LM_CATEGORY_NONE;
+	ongoing_tid_to_link_mapping->t2lm_resp_type = WLAN_T2LM_RESP_TYPE_INVALID;
+	ongoing_tid_to_link_mapping->t2lm_tx_status = WLAN_T2LM_TX_STATUS_NONE;
+
+	for (i = 0; i < WLAN_T2LM_MAX_DIRECTION; i++)
+		ongoing_tid_to_link_mapping->t2lm_info[i].direction =
+				WLAN_T2LM_INVALID_DIRECTION;
+}
+
 void
 wlan_t2lm_clear_peer_negotiation(struct wlan_objmgr_peer *peer)
 {
 	struct wlan_mlo_peer_context *ml_peer;
 	struct wlan_prev_t2lm_negotiated_info *t2lm_negotiated_info;
-
 	uint8_t i;
 
 	ml_peer = peer->mlo_peer_ctx;
@@ -453,6 +484,44 @@ wlan_t2lm_clear_peer_negotiation(struct wlan_objmgr_peer *peer)
 				WLAN_T2LM_INVALID_DIRECTION;
 }
 
+void
+wlan_t2lm_clear_all_tid_mapping(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_objmgr_peer *peer;
+	struct wlan_t2lm_context *t2lm_ctx;
+
+	if (!vdev) {
+		t2lm_err("Vdev is null");
+		return;
+	}
+
+	if (!wlan_vdev_mlme_is_mlo_vdev(vdev))
+		return;
+
+	if (!vdev->mlo_dev_ctx) {
+		t2lm_err("mlo dev ctx is null");
+		return;
+	}
+
+	t2lm_ctx = &vdev->mlo_dev_ctx->t2lm_ctx;
+	peer = wlan_vdev_get_bsspeer(vdev);
+	if (!peer) {
+		t2lm_err("peer is null");
+		return;
+	}
+	qdf_mem_zero(&t2lm_ctx->established_t2lm,
+		     sizeof(struct wlan_mlo_t2lm_ie));
+	t2lm_ctx->established_t2lm.t2lm.direction = WLAN_T2LM_INVALID_DIRECTION;
+
+	qdf_mem_zero(&t2lm_ctx->upcoming_t2lm,
+		     sizeof(struct wlan_mlo_t2lm_ie));
+	t2lm_ctx->upcoming_t2lm.t2lm.direction = WLAN_T2LM_INVALID_DIRECTION;
+
+	wlan_t2lm_clear_peer_negotiation(peer);
+	wlan_t2lm_clear_ongoing_negotiation(peer);
+	wlan_mlo_t2lm_timer_stop(vdev);
+}
+
 QDF_STATUS wlan_t2lm_deliver_event(struct wlan_objmgr_vdev *vdev,
 				   struct wlan_objmgr_peer *peer,
 				   enum wlan_t2lm_evt event,