浏览代码

qcacld-3.0: correct logic for parsing t2lm ie

Adding extn_ie_header and the invoking function
wlan_mlo_parse_t2lm_info because dot11f logic
removed the ie header.

Change-Id: I957c574ecf6323bfd6fb488f417ab1f738b4ee37
CRs-Fixed: 3362726
Paul Zhang 2 年之前
父节点
当前提交
2e183b559f

+ 22 - 24
components/umac/mlme/mlo_mgr/src/wlan_t2lm_api.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -193,9 +193,9 @@ wlan_t2lm_validate_candidate(struct cnx_mgr *cm_ctx,
 	QDF_STATUS status;
 	struct wlan_objmgr_vdev *vdev;
 	struct wlan_t2lm_context t2lm_ctx;
-	uint8_t tid_map_link_id = 0;
-	uint16_t tid_mapped_link_id[WLAN_MAX_T2LM_IE];
-	uint8_t i;
+	uint16_t tid_map_link_id;
+	uint16_t established_tid_mapped_link_id = 0;
+	uint16_t upcoming_tid_mapped_link_id = 0;
 
 	if (!scan_entry)
 		return QDF_STATUS_E_NULL_VALUE;
@@ -211,32 +211,30 @@ wlan_t2lm_validate_candidate(struct cnx_mgr *cm_ctx,
 			goto end;
 		}
 
-		t2lm_ctx = vdev->mlo_dev_ctx->t2lm_ctx;
 		status = wlan_mlo_parse_bcn_prbresp_t2lm_ie(&t2lm_ctx,
-							    scan_entry->ie_list.t2lm[0]);
+						scan_entry->ie_list.t2lm[0]);
 		if (QDF_IS_STATUS_ERROR(status))
 			goto end;
 
-		if (!t2lm_ctx.num_of_t2lm_ie) {
-			t2lm_debug("T2LM IE parsing failed");
-			status = QDF_STATUS_E_FAILURE;
+		status =
+		   t2lm_find_tid_mapped_link_id(&t2lm_ctx.established_t2lm.t2lm,
+					       &established_tid_mapped_link_id);
+		if (QDF_IS_STATUS_ERROR(status))
 			goto end;
-		}
-
-		for (i = 0; i < t2lm_ctx.num_of_t2lm_ie; i++) {
-			status = t2lm_find_tid_mapped_link_id(&t2lm_ctx.t2lm_ie[i].t2lm,
-							      &tid_mapped_link_id[i]);
-			if (QDF_IS_STATUS_ERROR(status))
-				goto end;
-		}
 
-		if (t2lm_ctx.num_of_t2lm_ie == WLAN_MAX_T2LM_IE) {
-			tid_map_link_id = tid_mapped_link_id[0] & tid_mapped_link_id[1];
-			if (!tid_map_link_id)
-				tid_map_link_id = tid_mapped_link_id[0];
-		} else {
-			tid_map_link_id = tid_mapped_link_id[0];
-		}
+		status =
+		      t2lm_find_tid_mapped_link_id(&t2lm_ctx.upcoming_t2lm.t2lm,
+						  &upcoming_tid_mapped_link_id);
+		if (QDF_IS_STATUS_ERROR(status))
+			goto end;
+		t2lm_debug("established_tid_mapped_link_id %x, upcoming_tid_mapped_link_id %x",
+			   established_tid_mapped_link_id,
+			   upcoming_tid_mapped_link_id);
+
+		tid_map_link_id =
+		   established_tid_mapped_link_id & upcoming_tid_mapped_link_id;
+		if (!tid_map_link_id)
+			tid_map_link_id = established_tid_mapped_link_id;
 
 		if (tid_map_link_id == scan_entry->ml_info.self_link_id) {
 			t2lm_debug("self link id %d, tid map link id %d",

+ 14 - 14
core/mac/src/pe/lim/lim_process_beacon_frame.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -38,6 +38,8 @@
 #include "lim_assoc_utils.h"
 #include "lim_prop_exts_utils.h"
 #include "lim_ser_des_utils.h"
+#include "wlan_mlo_t2lm.h"
+#include "wlan_mlo_mgr_roam.h"
 #ifdef WLAN_FEATURE_11BE_MLO
 #include <wlan_mlo_mgr_sta.h>
 #include <cds_ieee80211_common.h>
@@ -49,7 +51,7 @@ void lim_process_bcn_prb_rsp_t2lm(struct mac_context *mac_ctx,
 				  tpSirProbeRespBeacon bcn_ptr)
 {
 	struct wlan_objmgr_vdev *vdev;
-	struct wlan_mlo_dev_context *mlo_ctx;
+	uint64_t tsf;
 
 	if (!session || !bcn_ptr || !mac_ctx) {
 		pe_err("invalid input parameters");
@@ -60,22 +62,20 @@ void lim_process_bcn_prb_rsp_t2lm(struct mac_context *mac_ctx,
 	if (!vdev || !wlan_vdev_mlme_is_mlo_vdev(vdev))
 		return;
 
-	mlo_ctx = vdev->mlo_dev_ctx;
-	if (!mlo_ctx) {
-		pe_err("null mlo_dev_ctx");
+	if (!mlo_check_if_all_links_up(vdev))
 		return;
-	}
 
-	if (!bcn_ptr->t2lm_ctx.num_of_t2lm_ie) {
-		pe_debug("tid to link mapping ie not present in beacon/prb rsp");
+	if (bcn_ptr->t2lm_ctx.upcoming_t2lm.t2lm.direction ==
+	    WLAN_T2LM_INVALID_DIRECTION &&
+	    bcn_ptr->t2lm_ctx.established_t2lm.t2lm.direction ==
+	    WLAN_T2LM_INVALID_DIRECTION) {
+		pe_debug("No t2lm IE");
 		return;
 	}
 
-	mlo_ctx->t2lm_ctx.num_of_t2lm_ie = bcn_ptr->t2lm_ctx.num_of_t2lm_ie;
-	qdf_mem_copy(&mlo_ctx->t2lm_ctx.t2lm_ie,
-		     &bcn_ptr->t2lm_ctx.t2lm_ie,
-		     sizeof(struct wlan_mlo_t2lm_ie) *
-		     mlo_ctx->t2lm_ctx.num_of_t2lm_ie);
+	qdf_mem_copy((uint8_t *)&tsf, (uint8_t *)bcn_ptr->timeStamp,
+		     sizeof(uint64_t));
+	wlan_process_bcn_prbrsp_t2lm_ie(vdev, &bcn_ptr->t2lm_ctx, tsf);
 }
 
 void lim_process_beacon_mlo(struct mac_context *mac_ctx,
@@ -421,11 +421,11 @@ lim_process_beacon_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_info,
 		return;
 	}
 
+	lim_process_bcn_prb_rsp_t2lm(mac_ctx, session, bcn_ptr);
 	if (QDF_IS_STATUS_SUCCESS(lim_check_for_ml_probe_req(session)))
 		goto end;
 
 	lim_process_beacon_eht(mac_ctx, session, bcn_ptr);
-	lim_process_bcn_prb_rsp_t2lm(mac_ctx, session, bcn_ptr);
 
 	/*
 	 * during scanning, when any session is active, and

+ 20 - 20
core/mac/src/pe/lim/lim_types.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -427,19 +427,6 @@ void lim_cleanup_mlm(struct mac_context *);
 /* Management frame handling functions */
 
 #ifdef WLAN_FEATURE_11BE
-/**
- * lim_process_bcn_prb_rsp_t2lm() - process beacon/probe response
- * 11be t2lm IE
- * @mac_ctx: global mac context
- * @session: pe session
- * @bcn_ptr: pointer to tpSirProbeRespBeacon
- *
- * Return none
- */
-void lim_process_bcn_prb_rsp_t2lm(struct mac_context *mac_ctx,
-				  struct pe_session *session,
-				  tpSirProbeRespBeacon bcn_ptr);
-
 /**
  * lim_process_beacon_eht() - process beacon 11be IE
  * @mac_ctx: global mac context
@@ -474,16 +461,22 @@ void lim_process_beacon_eht_op(struct pe_session *session,
 			       tDot11fIEeht_op *eht_op)
 {
 }
+#endif
 
-static inline
+#ifdef WLAN_FEATURE_11BE_MLO
+/**
+ * lim_process_bcn_prb_rsp_t2lm() - process beacon/probe response
+ * 11be t2lm IE
+ * @mac_ctx: global mac context
+ * @session: pe session
+ * @bcn_ptr: pointer to tpSirProbeRespBeacon
+ *
+ * Return none
+ */
 void lim_process_bcn_prb_rsp_t2lm(struct mac_context *mac_ctx,
 				  struct pe_session *session,
-				  tpSirProbeRespBeacon bcn_ptr)
-{
-}
-#endif
+				  tpSirProbeRespBeacon bcn_ptr);
 
-#ifdef WLAN_FEATURE_11BE_MLO
 /**
  * lim_process_beacon_mlo() - process beacon mlo IE
  * @mac_ctx: global mac context
@@ -502,6 +495,13 @@ void lim_process_beacon_mlo(struct mac_context *mac_ctx,
 			    tSchBeaconStruct *bcn_ptr)
 {
 }
+
+static inline
+void lim_process_bcn_prb_rsp_t2lm(struct mac_context *mac_ctx,
+				  struct pe_session *session,
+				  tpSirProbeRespBeacon bcn_ptr)
+{
+}
 #endif
 
 void lim_process_beacon_frame(struct mac_context *, uint8_t *, struct pe_session *);

+ 2 - 2
core/mac/src/pe/sch/sch_beacon_process.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -998,7 +998,7 @@ sch_beacon_process(struct mac_context *mac_ctx, uint8_t *rx_pkt_info,
 		pe_err_rl("beacon parsing failed");
 		return;
 	}
-
+	lim_process_bcn_prb_rsp_t2lm(mac_ctx, session, &bcn);
 	sch_send_beacon_report(mac_ctx, &bcn, session);
 	__sch_beacon_process_for_session(mac_ctx, &bcn, rx_pkt_info, session);
 }

+ 80 - 9
core/mac/src/sys/legacy/src/utils/src/parser_api.c

@@ -2892,19 +2892,56 @@ sir_convert_probe_frame2_t2lm_struct(tDot11fProbeResponse *pr,
 				     tpSirProbeRespBeacon bcn_struct)
 {
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	struct wlan_t2lm_context *t2lm_ctx;
+	/* add 3 bytes for extn_ie_header */
+	uint8_t ie[DOT11F_IE_T2LM_IE_MAX_LEN + 3];
+	struct wlan_t2lm_info t2lm;
 	uint8_t i;
 
+	t2lm_ctx = &bcn_struct->t2lm_ctx;
+	qdf_mem_zero(&t2lm_ctx->established_t2lm.t2lm,
+		     sizeof(struct wlan_t2lm_info));
+	t2lm_ctx->established_t2lm.t2lm.direction = WLAN_T2LM_INVALID_DIRECTION;
+
+	qdf_mem_zero(&t2lm_ctx->upcoming_t2lm.t2lm,
+		     sizeof(struct wlan_t2lm_info));
+	t2lm_ctx->upcoming_t2lm.t2lm.direction = WLAN_T2LM_INVALID_DIRECTION;
+
 	if (!pr->num_t2lm_ie) {
 		pe_debug("T2LM IEs not present");
 		return status;
 	}
-	bcn_struct->t2lm_ctx.num_of_t2lm_ie = pr->num_t2lm_ie;
+
 	pe_debug("Number of T2LM IEs in probe rsp %d", pr->num_t2lm_ie);
 	for (i = 0; i < pr->num_t2lm_ie; i++) {
-		status = wlan_mlo_parse_bcn_prbresp_t2lm_ie(&bcn_struct->t2lm_ctx,
-							    &pr->t2lm_ie[i].data[0]);
-		if (QDF_IS_STATUS_ERROR(status))
+		qdf_mem_zero(&ie[0], DOT11F_IE_T2LM_IE_MAX_LEN + 3);
+		qdf_mem_zero(&t2lm, sizeof(struct wlan_t2lm_info));
+		ie[ID_POS] = WLAN_ELEMID_EXTN_ELEM;
+		ie[TAG_LEN_POS] = pr->t2lm_ie[i].num_data + 1;
+		ie[IDEXT_POS] = WLAN_EXTN_ELEMID_T2LM;
+		qdf_mem_copy(&ie[3], &pr->t2lm_ie[i].data[0],
+			     pr->t2lm_ie[i].num_data);
+
+		qdf_trace_hex_dump(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
+				   &ie[0], pr->t2lm_ie[i].num_data + 3);
+
+		status = wlan_mlo_parse_t2lm_info(&ie[0], &t2lm);
+		if (QDF_IS_STATUS_ERROR(status)) {
+			pe_debug("Parse T2LM IE fail");
 			return status;
+		}
+
+		if (!t2lm.mapping_switch_time_present &&
+		    t2lm.expected_duration_present) {
+			qdf_mem_copy(&t2lm_ctx->established_t2lm.t2lm, &t2lm,
+				     sizeof(struct wlan_t2lm_info));
+			pe_debug("Parse established T2LM IE success");
+		} else if (t2lm.mapping_switch_time_present) {
+			qdf_mem_copy(&t2lm_ctx->upcoming_t2lm.t2lm, &t2lm,
+				     sizeof(struct wlan_t2lm_info));
+			pe_debug("Parse upcoming T2LM IE success");
+		}
+		pe_debug("Parse T2LM IE success");
 	}
 	return status;
 }
@@ -5036,20 +5073,54 @@ sir_convert_beacon_frame2_t2lm_struct(tDot11fBeacon *bcn_frm,
 				      tpSirProbeRespBeacon bcn_struct)
 {
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	struct wlan_t2lm_context *t2lm_ctx;
+	/* add 3 bytes for extn_ie_header */
+	uint8_t ie[DOT11F_IE_T2LM_IE_MAX_LEN + 3];
+	struct wlan_t2lm_info t2lm;
 	uint8_t i;
 
+	t2lm_ctx = &bcn_struct->t2lm_ctx;
+	qdf_mem_zero(&t2lm_ctx->established_t2lm.t2lm,
+		     sizeof(struct wlan_t2lm_info));
+	t2lm_ctx->established_t2lm.t2lm.direction = WLAN_T2LM_INVALID_DIRECTION;
+
+	qdf_mem_zero(&t2lm_ctx->upcoming_t2lm.t2lm,
+		     sizeof(struct wlan_t2lm_info));
+	t2lm_ctx->upcoming_t2lm.t2lm.direction = WLAN_T2LM_INVALID_DIRECTION;
+
 	if (!bcn_frm->num_t2lm_ie) {
 		pe_debug("T2LM IEs not present");
 		return status;
 	}
 
-	bcn_struct->t2lm_ctx.num_of_t2lm_ie = bcn_frm->num_t2lm_ie;
-	pe_debug("Number of T2LM IEs in probe rsp %d", bcn_frm->num_t2lm_ie);
+	pe_debug("Number of T2LM IEs in beacon %d", bcn_frm->num_t2lm_ie);
 	for (i = 0; i < bcn_frm->num_t2lm_ie; i++) {
-		status = wlan_mlo_parse_bcn_prbresp_t2lm_ie(&bcn_struct->t2lm_ctx,
-							    &bcn_frm->t2lm_ie[i].data[0]);
-		if (QDF_IS_STATUS_ERROR(status))
+		qdf_mem_zero(&ie[0], DOT11F_IE_T2LM_IE_MAX_LEN + 3);
+		qdf_mem_zero(&t2lm, sizeof(struct wlan_t2lm_info));
+		ie[ID_POS] = WLAN_ELEMID_EXTN_ELEM;
+		ie[TAG_LEN_POS] = bcn_frm->t2lm_ie[i].num_data + 1;
+		ie[IDEXT_POS] = WLAN_EXTN_ELEMID_T2LM;
+		qdf_mem_copy(&ie[3], &bcn_frm->t2lm_ie[i].data[0],
+			     bcn_frm->t2lm_ie[i].num_data + 3);
+		qdf_trace_hex_dump(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
+				   &ie[0], bcn_frm->t2lm_ie[i].num_data + 3);
+		status = wlan_mlo_parse_t2lm_info(&ie[0], &t2lm);
+		if (QDF_IS_STATUS_ERROR(status)) {
+			pe_debug("Parse T2LM IE fail");
 			return status;
+		}
+
+		if (!t2lm.mapping_switch_time_present &&
+		    t2lm.expected_duration_present) {
+			qdf_mem_copy(&t2lm_ctx->established_t2lm.t2lm, &t2lm,
+				     sizeof(struct wlan_t2lm_info));
+			pe_debug("Parse established T2LM IE success");
+		} else if (t2lm.mapping_switch_time_present) {
+			qdf_mem_copy(&t2lm_ctx->upcoming_t2lm.t2lm, &t2lm,
+				     sizeof(struct wlan_t2lm_info));
+			pe_debug("Parse upcoming T2LM IE success");
+		}
+		pe_debug("Parse T2LM IE success");
 	}
 	return status;
 }