Jelajahi Sumber

qcacld-3.0: Handle t2lm action response frame

Add support to handle t2lm action response frame.

Change-Id: Ia7072d3050f6ee6eb078233c6129e532144740f4
CRs-Fixed: 3468073
Amruta Kulkarni 1 tahun lalu
induk
melakukan
7eca35c643

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

@@ -120,6 +120,7 @@ QDF_STATUS t2lm_handle_tx_req(struct wlan_objmgr_vdev *vdev,
 /**
  * t2lm_handle_rx_resp - Handler for parsing T2LM action frame
  * @vdev: vdev pointer
+ * @peer: peer pointer
  * @event_data: T2LM event data pointer
  * @token: Dialog token
  *
@@ -128,6 +129,7 @@ QDF_STATUS t2lm_handle_tx_req(struct wlan_objmgr_vdev *vdev,
  * Return: qdf_status
  */
 QDF_STATUS t2lm_handle_rx_resp(struct wlan_objmgr_vdev *vdev,
+			       struct wlan_objmgr_peer *peer,
 			       void *event_data, uint8_t *token);
 
 /**
@@ -220,6 +222,7 @@ t2lm_handle_tx_req(struct wlan_objmgr_vdev *vdev,
 
 static inline QDF_STATUS
 t2lm_handle_rx_resp(struct wlan_objmgr_vdev *vdev,
+		    struct wlan_objmgr_peer *peer,
 		    void *event_data, uint8_t *token)
 {
 	return QDF_STATUS_E_NOSUPPORT;

+ 52 - 2
components/umac/mlme/mlo_mgr/src/wlan_t2lm_api.c

@@ -22,6 +22,7 @@
 #include "wlan_t2lm_api.h"
 #include <wlan_mlo_t2lm.h>
 #include "wlan_cm_api.h"
+#include "wlan_mlo_mgr_roam.h"
 
 static
 const char *t2lm_get_event_str(enum wlan_t2lm_evt event)
@@ -173,9 +174,58 @@ QDF_STATUS t2lm_handle_tx_req(struct wlan_objmgr_vdev *vdev,
 }
 
 QDF_STATUS t2lm_handle_rx_resp(struct wlan_objmgr_vdev *vdev,
+			       struct wlan_objmgr_peer *peer,
 			       void *event_data, uint8_t *token)
 {
-	return QDF_STATUS_SUCCESS;
+	struct wlan_t2lm_onging_negotiation_info t2lm_rsp = {0};
+	struct wlan_t2lm_onging_negotiation_info *t2lm_req;
+	QDF_STATUS status;
+	struct wlan_mlo_peer_context *ml_peer;
+	struct wlan_t2lm_info *t2lm_info;
+	uint8_t dir;
+
+	if (!peer) {
+		t2lm_err("peer is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	ml_peer = peer->mlo_peer_ctx;
+	if (!ml_peer) {
+		t2lm_err("ml peer is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	/* ignore the frame if all links are not connected */
+	if (!mlo_check_if_all_links_up(vdev))
+		return QDF_STATUS_SUCCESS;
+
+	status = wlan_mlo_parse_t2lm_action_frame(&t2lm_rsp, event_data,
+						  WLAN_T2LM_CATEGORY_RESPONSE);
+	if (status != QDF_STATUS_SUCCESS) {
+		mlme_err("Unable to parse T2LM request action frame");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	t2lm_req = &ml_peer->t2lm_policy.ongoing_tid_to_link_mapping;
+
+	/* match dialog token and send t2lm mapping */
+	for (dir = 0; dir < WLAN_T2LM_MAX_DIRECTION; dir++) {
+		t2lm_info = &ml_peer->t2lm_policy.ongoing_tid_to_link_mapping.t2lm_info[dir];
+		if (t2lm_info &&
+		    t2lm_info->direction != WLAN_T2LM_INVALID_DIRECTION) {
+			if (t2lm_rsp.dialog_token == t2lm_req->dialog_token &&
+			    t2lm_rsp.t2lm_resp_type == WLAN_T2LM_RESP_TYPE_SUCCESS) {
+				status = wlan_send_tid_to_link_mapping(vdev,
+								       t2lm_info);
+				if (QDF_IS_STATUS_ERROR(status)) {
+					t2lm_err("sending t2lm wmi failed");
+					break;
+				}
+			}
+		}
+	}
+
+	return status;
 }
 
 QDF_STATUS t2lm_handle_rx_teardown(struct wlan_objmgr_vdev *vdev,
@@ -246,7 +296,7 @@ QDF_STATUS t2lm_deliver_event(struct wlan_objmgr_vdev *vdev,
 		status = t2lm_handle_tx_req(vdev, event_data, token);
 		break;
 	case WLAN_T2LM_EV_ACTION_FRAME_RX_RESP:
-		status = t2lm_handle_rx_resp(vdev, event_data, token);
+		status = t2lm_handle_rx_resp(vdev, peer, event_data, token);
 		break;
 	case WLAN_T2LM_EV_ACTION_FRAME_RX_TEARDOWN:
 		status = t2lm_handle_rx_teardown(vdev, peer, event_data);

+ 7 - 8
core/mac/src/pe/lim/lim_process_action_frame.c

@@ -2152,19 +2152,18 @@ void lim_process_action_frame(struct mac_context *mac_ctx,
 	case ACTION_CATEGORY_PROTECTED_EHT:
 		pe_debug("EHT T2LM action category: %d action: %d",
 			 action_hdr->category, action_hdr->actionID);
+		peer = wlan_objmgr_get_peer_by_mac(mac_ctx->psoc,
+						   mac_hdr->sa,
+						   WLAN_LEGACY_MAC_ID);
+		if (!peer) {
+			pe_err("Peer is null");
+			break;
+		}
 		switch (action_hdr->actionID) {
 		case EHT_T2LM_REQUEST:
 			mac_hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info);
 			body_ptr = WMA_GET_RX_MPDU_DATA(rx_pkt_info);
 			frame_len = WMA_GET_RX_PAYLOAD_LEN(rx_pkt_info);
-
-			peer = wlan_objmgr_get_peer_by_mac(mac_ctx->psoc,
-							   mac_hdr->sa,
-							   WLAN_LEGACY_MAC_ID);
-			if (!peer) {
-				pe_err("Peer is null");
-				break;
-			}
 			if (wlan_t2lm_deliver_event(
 				session->vdev, peer,
 				WLAN_T2LM_EV_ACTION_FRAME_RX_REQ,