From 46d873e37a9498712eb09c31f2b3e2989a596bbc Mon Sep 17 00:00:00 2001 From: Amruta Kulkarni Date: Mon, 14 Jun 2021 21:53:55 -0700 Subject: [PATCH] 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 --- Kbuild | 1 + core/mac/src/pe/include/lim_session.h | 1 + .../src/pe/lim/lim_process_assoc_rsp_frame.c | 45 ++++++++++++- .../src/pe/lim/lim_process_mlm_rsp_messages.c | 65 +++++++++++++++++++ .../src/pe/lim/lim_send_sme_rsp_messages.c | 24 +++++++ 5 files changed, 133 insertions(+), 3 deletions(-) diff --git a/Kbuild b/Kbuild index d03aa98e11..85b3b7ad12 100644 --- a/Kbuild +++ b/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)) diff --git a/core/mac/src/pe/include/lim_session.h b/core/mac/src/pe/include/lim_session.h index 5efe28b90d..f8a0297bba 100644 --- a/core/mac/src/pe/include/lim_session.h +++ b/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 */ }; diff --git a/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c b/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c index d9c7ef28cd..7f6f578f5a 100644 --- a/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c +++ b/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); diff --git a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c b/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c index 430357ee87..ed8fe1c8a1 100644 --- a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c +++ b/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 +#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. diff --git a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c b/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c index bda252c704..d033dfa0b7 100644 --- a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c +++ b/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,