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
This commit is contained in:
Amruta Kulkarni
2021-06-14 21:53:55 -07:00
committato da Madan Koyyalamudi
parent 43709382b1
commit 46d873e37a
5 ha cambiato i file con 133 aggiunte e 3 eliminazioni

1
Kbuild
Vedi File

@@ -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))

Vedi File

@@ -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 */
};

Vedi File

@@ -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);

Vedi File

@@ -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.

Vedi File

@@ -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,