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
这个提交包含在:
1
Kbuild
1
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_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_cmn.o \
|
||||||
$(UMAC_MLO_MGR_CMN_DIR)/src/wlan_mlo_mgr_sta.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
|
$(UMAC_MLO_MGR_CMN_DIR)/src/wlan_mlo_mgr_ap.o
|
||||||
|
|
||||||
$(call add-wlan-objs,umac_ifmgr,$(UMAC_MLO_MGR_OBJS))
|
$(call add-wlan-objs,umac_ifmgr,$(UMAC_MLO_MGR_OBJS))
|
||||||
|
@@ -653,6 +653,7 @@ struct pe_session {
|
|||||||
tDot11fIEeht_op eht_op;
|
tDot11fIEeht_op eht_op;
|
||||||
#ifdef WLAN_FEATURE_11BE_MLO
|
#ifdef WLAN_FEATURE_11BE_MLO
|
||||||
struct mlo_link_ie_info mlo_link_info;
|
struct mlo_link_ie_info mlo_link_info;
|
||||||
|
struct mlo_partner_info ml_partner_info;
|
||||||
#endif
|
#endif
|
||||||
#endif /* WLAN_FEATURE_11BE */
|
#endif /* WLAN_FEATURE_11BE */
|
||||||
};
|
};
|
||||||
|
@@ -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);
|
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
|
* lim_process_assoc_rsp_frame() - Processes assoc response
|
||||||
* @mac_ctx: Pointer to Global MAC structure
|
* @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;
|
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;
|
hdr = (tpSirMacMgmtHdr)rx_pkt_info;
|
||||||
frame_len = reassoc_frame_len - SIR_MAC_HDR_LEN_3A;
|
frame_len = reassoc_frame_len - SIR_MAC_HDR_LEN_3A;
|
||||||
rssi = 0;
|
rssi = 0;
|
||||||
@@ -876,7 +905,8 @@ lim_process_assoc_rsp_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_info,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* Get pointer to Re/Association Response frame body */
|
/* 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;
|
body = rx_pkt_info + SIR_MAC_HDR_LEN_3A;
|
||||||
else
|
else
|
||||||
body = WMA_GET_RX_MPDU_DATA(rx_pkt_info);
|
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;
|
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_update_ric_data(mac_ctx, session_entry, assoc_rsp);
|
||||||
|
|
||||||
lim_set_r0kh(assoc_rsp, session_entry);
|
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,
|
beacon,
|
||||||
&session_entry->lim_join_req->bssDescription, true,
|
&session_entry->lim_join_req->bssDescription, true,
|
||||||
session_entry)) {
|
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);
|
clean_up_ft_sha384(assoc_rsp, sha384_akm);
|
||||||
qdf_mem_free(assoc_rsp);
|
qdf_mem_free(assoc_rsp);
|
||||||
qdf_mem_free(beacon);
|
qdf_mem_free(beacon);
|
||||||
|
@@ -44,6 +44,8 @@
|
|||||||
#include "wlan_pkt_capture_ucfg_api.h"
|
#include "wlan_pkt_capture_ucfg_api.h"
|
||||||
#include "wlan_lmac_if_def.h"
|
#include "wlan_lmac_if_def.h"
|
||||||
#include <lim_mlo.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
|
#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,
|
MTRACE(mac_trace(mac_ctx, TRACE_CODE_SME_STATE,
|
||||||
session_entry->peSessionId,
|
session_entry->peSessionId,
|
||||||
session_entry->limSmeState));
|
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,
|
lim_post_mlm_message(mac_ctx, LIM_MLM_AUTH_REQ,
|
||||||
(uint32_t *) pMlmAuthReq);
|
(uint32_t *) pMlmAuthReq);
|
||||||
return;
|
return;
|
||||||
@@ -2715,6 +2723,63 @@ static void lim_process_switch_channel_join_req(
|
|||||||
/* Apply previously set configuration at HW */
|
/* Apply previously set configuration at HW */
|
||||||
lim_apply_configuration(mac_ctx, session_entry);
|
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
|
* If deauth_before_connection is enabled, Send Deauth first to AP if
|
||||||
* last disconnection was caused by HB failure.
|
* last disconnection was caused by HB failure.
|
||||||
|
@@ -383,6 +383,27 @@ static void lim_free_pession_ies(struct pe_session *pe_session)
|
|||||||
lim_free_tspec_ie(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,
|
void lim_cm_send_connect_rsp(struct mac_context *mac_ctx,
|
||||||
struct pe_session *pe_session,
|
struct pe_session *pe_session,
|
||||||
struct cm_vdev_join_req *req,
|
struct cm_vdev_join_req *req,
|
||||||
@@ -415,6 +436,9 @@ void lim_cm_send_connect_rsp(struct mac_context *mac_ctx,
|
|||||||
connect_status,
|
connect_status,
|
||||||
status_code);
|
status_code);
|
||||||
lim_free_pession_ies(pe_session);
|
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)) {
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
pe_err("vdev_id: %d cm_id 0x%x : fail to prepare rsp",
|
pe_err("vdev_id: %d cm_id 0x%x : fail to prepare rsp",
|
||||||
rsp->connect_rsp.vdev_id,
|
rsp->connect_rsp.vdev_id,
|
||||||
|
在新工单中引用
屏蔽一个用户