浏览代码

qcacld-3.0: Generate assoc resp for MLO links

- Generate association response for secondary MLO links
- Update pe session and connect resp with partner link info

CRs-Fixed: 2977970
Change-Id: I17a820abef4f4df082c1f219f35599f669142670
Amruta Kulkarni 3 年之前
父节点
当前提交
46d873e37a

+ 1 - 0
Kbuild

@@ -1254,6 +1254,7 @@ ifeq ($(CONFIG_WLAN_FEATURE_11BE_MLO), y)
 UMAC_MLO_MGR_OBJS := $(UMAC_MLO_MGR_CMN_DIR)/src/wlan_mlo_mgr_main.o \
 			  $(UMAC_MLO_MGR_CMN_DIR)/src/wlan_mlo_mgr_cmn.o \
 			  $(UMAC_MLO_MGR_CMN_DIR)/src/wlan_mlo_mgr_sta.o \
+			  $(UMAC_MLO_MGR_CMN_DIR)/src/utils_mlo.o \
 			  $(UMAC_MLO_MGR_CMN_DIR)/src/wlan_mlo_mgr_ap.o
 
 $(call add-wlan-objs,umac_ifmgr,$(UMAC_MLO_MGR_OBJS))

+ 1 - 0
core/mac/src/pe/include/lim_session.h

@@ -653,6 +653,7 @@ struct pe_session {
 	tDot11fIEeht_op eht_op;
 #ifdef WLAN_FEATURE_11BE_MLO
 	struct mlo_link_ie_info mlo_link_info;
+	struct mlo_partner_info ml_partner_info;
 #endif
 #endif /* WLAN_FEATURE_11BE */
 };

+ 42 - 3
core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c

@@ -741,6 +741,34 @@ lim_update_iot_aggr_sz(struct mac_context *mac_ctx, uint8_t *ie_ptr,
 		pe_err("Failed to set iot amsdu size: %d", ret);
 }
 
+#ifdef WLAN_FEATURE_11BE_MLO
+static void lim_update_ml_partner_info(struct pe_session *session_entry,
+				       tpSirAssocRsp assoc_rsp)
+{
+	int i;
+	tDot11fIEmlo_ie ie;
+	struct mlo_partner_info partner_info;
+
+	if (!assoc_rsp || !session_entry)
+		return;
+
+	ie = assoc_rsp->mlo_ie.mlo_ie;
+	partner_info = session_entry->ml_partner_info;
+
+	partner_info.num_partner_links = mlo_ie.num_sta_profile;
+	pe_err("copying partner info from join req to join rsp, num_partner_links %d",
+	       partner_info.num_partner_links);
+
+	for (i = 0; i < partner_info.num_partner_links; i++) {
+		partner_info.partner_link_info[i].link_id =
+			ie.sta_profile[i].link_id;
+		qdf_mem_copy(&partner_info.partner_link_info[i].link_addr,
+			     ie.sta_profile[i].sta_mac_addr.info.sta_mac_addr,
+			     QDF_MAC_ADDR_SIZE);
+	}
+}
+#endif
+
 /**
  * lim_process_assoc_rsp_frame() - Processes assoc response
  * @mac_ctx: Pointer to Global MAC structure
@@ -790,7 +818,8 @@ lim_process_assoc_rsp_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_info,
 		return;
 	}
 
-	if (lim_is_roam_synch_in_progress(mac_ctx->psoc, session_entry)) {
+	if (lim_is_roam_synch_in_progress(mac_ctx->psoc, session_entry) ||
+	    wlan_vdev_mlme_is_mlo_link_vdev(session_entry->vdev)) {
 		hdr = (tpSirMacMgmtHdr)rx_pkt_info;
 		frame_len = reassoc_frame_len - SIR_MAC_HDR_LEN_3A;
 		rssi = 0;
@@ -876,7 +905,8 @@ lim_process_assoc_rsp_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_info,
 		return;
 	}
 	/* Get pointer to Re/Association Response frame body */
-	if (lim_is_roam_synch_in_progress(mac_ctx->psoc, session_entry))
+	if (lim_is_roam_synch_in_progress(mac_ctx->psoc, session_entry) ||
+	    wlan_vdev_mlme_is_mlo_link_vdev(session_entry->vdev))
 		body =  rx_pkt_info + SIR_MAC_HDR_LEN_3A;
 	else
 		body = WMA_GET_RX_MPDU_DATA(rx_pkt_info);
@@ -916,7 +946,9 @@ lim_process_assoc_rsp_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_info,
 			session_entry->assocRspLen = frame_len;
 		}
 	}
-
+#ifdef WLAN_FEATURE_11BE_MLO
+	lim_update_ml_partner_info(session_entry, assoc_rsp);
+#endif
 	lim_update_ric_data(mac_ctx, session_entry, assoc_rsp);
 
 	lim_set_r0kh(assoc_rsp, session_entry);
@@ -1257,6 +1289,13 @@ lim_process_assoc_rsp_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_info,
 			beacon,
 			&session_entry->lim_join_req->bssDescription, true,
 			 session_entry)) {
+#ifdef WLAN_FEATURE_11BE_MLO
+		if (wlan_vdev_mlme_is_mlo_link_vdev(session_entry->vdev)) {
+			pe_err("sending assoc cnf for MLO link vdev");
+			lim_post_sme_message(mac_ctx, LIM_MLM_ASSOC_CNF,
+					     (uint32_t *)&assoc_cnf);
+		}
+#endif
 		clean_up_ft_sha384(assoc_rsp, sha384_akm);
 		qdf_mem_free(assoc_rsp);
 		qdf_mem_free(beacon);

+ 65 - 0
core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c

@@ -44,6 +44,8 @@
 #include "wlan_pkt_capture_ucfg_api.h"
 #include "wlan_lmac_if_def.h"
 #include <lim_mlo.h>
+#include "wlan_mlo_mgr_sta.h"
+#include "../../../../qca-wifi-host-cmn/umac/mlo_mgr/inc/utils_mlo.h"
 
 #define MAX_SUPPORTED_PEERS_WEP 16
 
@@ -2164,6 +2166,12 @@ void lim_process_sta_add_bss_rsp_pre_assoc(struct mac_context *mac_ctx,
 		MTRACE(mac_trace(mac_ctx, TRACE_CODE_SME_STATE,
 			session_entry->peSessionId,
 			session_entry->limSmeState));
+#ifdef WLAN_FEATURE_11BE_MLO
+		if (wlan_vdev_mlme_is_mlo_link_vdev(session_entry->vdev)) {
+			pe_err("vdev is an MLO link, skip Auth");
+			return;
+		}
+#endif
 		lim_post_mlm_message(mac_ctx, LIM_MLM_AUTH_REQ,
 			(uint32_t *) pMlmAuthReq);
 		return;
@@ -2715,6 +2723,63 @@ static void lim_process_switch_channel_join_req(
 	/* Apply previously set configuration at HW */
 	lim_apply_configuration(mac_ctx, session_entry);
 
+/* WLAN_FEATURE_11BE_MLO flag will be removed
+ * once the MLO testing is complete
+ */
+#ifdef WLAN_FEATURE_11BE_MLO
+	if (wlan_vdev_mlme_is_mlo_link_vdev(session_entry->vdev)) {
+		struct element_info *assoc_rsp = NULL;
+		struct qdf_mac_addr sta_link_addr;
+
+		mlo_get_assoc_rsp(session_entry->vdev, &assoc_rsp);
+		if (!assoc_rsp)
+			goto error;
+
+		if (!session_entry->ml_partner_info.num_partner_links) {
+			pe_debug("MLO: num_partner_links is 0");
+			goto error;
+		}
+		/* Todo: update the sta addr by matching link id */
+		qdf_mem_copy(&sta_link_addr, session_entry->self_mac_addr,
+			     QDF_MAC_ADDR_SIZE);
+
+		pe_debug("MLO: assoc rsp len %d ", assoc_rsp.len);
+
+		if (assoc_rsp.len) {
+			struct element_info link_assoc_rsp;
+			tLimMlmJoinCnf mlm_join_cnf;
+
+			mlm_join_cnf.resultCode = eSIR_SME_SUCCESS;
+			mlm_join_cnf.protStatusCode = STATUS_SUCCESS;
+			/* Update PE sessionId */
+			mlm_join_cnf.sessionId = session_entry->peSessionId;
+			lim_post_sme_message(mac_ctx, LIM_MLM_JOIN_CNF,
+					     (uint32_t *)&mlm_join_cnf);
+
+			session_entry->limSmeState = eLIM_SME_WT_ASSOC_STATE;
+			assoc_rsp.len += SIR_MAC_HDR_LEN_3A;
+			pe_debug("MLO:assoc rsp len + hdr %d ", assoc_rsp.len);
+
+			link_assoc_rsp.ptr = qdf_mem_malloc(assoc_rsp.len);
+			if (link_assoc_rsp.ptr) {
+				link_assoc_rsp.len = assoc_rsp.len;
+			session_entry->limMlmState = eLIM_MLM_WT_ASSOC_RSP_STATE;
+			pe_debug("MLO: Generate and process assoc rsp for link vdev");
+
+			if (QDF_IS_STATUS_SUCCESS(util_gen_link_assoc_rsp(assoc_rsp.ptr,
+									  assoc_rsp.len,
+									  sta_link_addr,
+									  link_assoc_rsp.ptr)))
+				lim_process_assoc_rsp_frame(mac_ctx,
+							    link_assoc_rsp.ptr,
+							    link_assoc_rsp.len,
+							    LIM_ASSOC,
+							    session_entry);
+			}
+		}
+		return;
+	}
+#endif
 	/*
 	* If deauth_before_connection is enabled, Send Deauth first to AP if
 	* last disconnection was caused by HB failure.

+ 24 - 0
core/mac/src/pe/lim/lim_send_sme_rsp_messages.c

@@ -383,6 +383,27 @@ static void lim_free_pession_ies(struct pe_session *pe_session)
 	lim_free_tspec_ie(pe_session);
 }
 
+#ifdef WLAN_FEATURE_11BE_MLO
+static void lim_copy_ml_partner_info(struct cm_vdev_join_rsp *rsp,
+				     struct pe_session *pe_session)
+{
+	int i;
+	struct mlo_partner_info partner_info;
+	struct mlo_partner_info rsp_partner_info;
+
+	partner_info = pe_session->ml_partner_info;
+	rsp_partner_info = rsp->connect_rsp.ml_parnter_info;
+
+	rsp_partner_info.num_partner_links = partner_info.num_partner_links;
+
+	for (i = 0; i < rsp_partner_info.num_partner_links; i++) {
+		rsp_partner_info.partner_link_info[i].link_id =
+			partner_info.partner_link_info[i].link_id;
+		qdf_copy_macaddr(&rsp_partner_info.partner_link_info[i].link_addr,
+				 &partner_info.partner_link_info[i].link_addr);
+	}
+}
+#endif
 void lim_cm_send_connect_rsp(struct mac_context *mac_ctx,
 			     struct pe_session *pe_session,
 			     struct cm_vdev_join_req *req,
@@ -415,6 +436,9 @@ void lim_cm_send_connect_rsp(struct mac_context *mac_ctx,
 								connect_status,
 								status_code);
 		lim_free_pession_ies(pe_session);
+#ifdef WLAN_FEATURE_11BE_MLO
+		lim_copy_ml_partner_info(rsp, pe_session);
+#endif
 		if (QDF_IS_STATUS_ERROR(status)) {
 			pe_err("vdev_id: %d cm_id 0x%x : fail to prepare rsp",
 			       rsp->connect_rsp.vdev_id,