qcacld-3.0: Use util_gen_link_assoc_req for partner link of mlo ap

MLO assoc request frame parsing and generating for partner link is
converged, switch to this new API.

Change-Id: Icfe2e975b70579927a255930b9bd042d9e864045
CRs-Fixed: 3078837
This commit is contained in:
Bing Sun
2021-11-19 15:57:28 +08:00
committed by Madan Koyyalamudi
parent 2ac114ac4e
commit 23c1f486ca
5 changed files with 42 additions and 497 deletions

View File

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 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
@@ -1329,44 +1330,6 @@ QDF_STATUS populate_dot11f_twt_extended_caps(struct mac_context *mac_ctx,
#endif
#ifdef WLAN_FEATURE_11BE_MLO
/**
* sir_convert_mlo_reassoc_req_frame2_struct() - convert mlo reassoc req from
* frame to struct for given
* link id
* @mac_ctx: Global MAC context
* @pFrame: mlo reassoc req frame body
* @nFrame: mlo reassoc req frame length
* @pAssocReq: pointer to REASSOC Request frame
* @link_id: link id
*
* Return: QDF_STATUS_SUCCESS of no error
*/
QDF_STATUS
sir_convert_mlo_reassoc_req_frame2_struct(struct mac_context *mac,
uint8_t *pFrame,
uint32_t nFrame,
tpSirAssocReq pAssocReq,
uint8_t link_id);
/**
* sir_convert_mlo_assoc_req_frame2_struct() - convert mlo assoc req from
* frame to struct for given
* link id
* @mac_ctx: Global MAC context
* @pFrame: mlo assoc req frame body
* @nFrame: mlo assoc req frame length
* @pAssocReq: pointer to ASSOC Request frame
* @link_id: link id
*
* Return: QDF_STATUS_SUCCESS of no error
*/
QDF_STATUS
sir_convert_mlo_assoc_req_frame2_struct(struct mac_context *mac,
uint8_t *pFrame,
uint32_t nFrame,
tpSirAssocReq pAssocReq,
uint8_t link_id);
/**
* populate_dot11f_assoc_rsp_mlo_ie() - populate mlo ie for assoc response
* @mac_ctx: Global MAC context
@@ -1419,26 +1382,6 @@ void populate_dot11f_rnr_tbtt_info_10(struct mac_context *mac_ctx,
tDot11fIEreduced_neighbor_report *dot11f);
#else
static inline QDF_STATUS
sir_convert_mlo_reassoc_req_frame2_struct(struct mac_context *mac,
uint8_t *pFrame,
uint32_t nFrame,
tpSirAssocReq pAssocReq,
uint8_t link_id)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS
sir_convert_mlo_assoc_req_frame2_struct(struct mac_context *mac,
uint8_t *pFrame,
uint32_t nFrame,
tpSirAssocReq pAssocReq,
uint8_t link_id)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS
populate_dot11f_assoc_rsp_mlo_ie(struct mac_context *mac_ctx,
struct pe_session *session,

View File

@@ -31,6 +31,7 @@
#include <lim_assoc_utils.h>
#include <wlan_mlo_mgr_peer.h>
#include <lim_utils.h>
#include <utils_mlo.h>
/**
* lim_send_mlo_ie_update - mlo ie is changed, populate new beacon template
@@ -437,6 +438,8 @@ QDF_STATUS lim_mlo_proc_assoc_req_frm(struct wlan_objmgr_vdev *vdev,
tSirMacFrameCtl fc;
tpSirAssocReq assoc_req;
QDF_STATUS status;
qdf_size_t link_frame_len;
struct qdf_mac_addr link_bssid;
if (!vdev) {
pe_err("vdev is null");
@@ -507,19 +510,36 @@ QDF_STATUS lim_mlo_proc_assoc_req_frm(struct wlan_objmgr_vdev *vdev,
if (!assoc_req)
return QDF_STATUS_E_NOMEM;
status = lim_mlo_partner_assoc_req_parse(mac_ctx, sa, session,
assoc_req, sub_type,
frm_body, frame_len);
assoc_req->assoc_req_buf = qdf_nbuf_clone(buf);
if (!assoc_req->assoc_req_buf) {
pe_err("partner link assoc request buf clone failed");
qdf_mem_free(assoc_req);
return QDF_STATUS_E_NOMEM;
}
qdf_copy_macaddr(&link_bssid, (struct qdf_mac_addr *)session->bssId);
status = util_gen_link_assoc_req(
frm_body, frame_len, sub_type == LIM_REASSOC,
link_bssid,
qdf_nbuf_data(assoc_req->assoc_req_buf),
qdf_nbuf_len(assoc_req->assoc_req_buf),
&link_frame_len);
if (QDF_IS_STATUS_ERROR(status)) {
pe_warn("Assoc Req rejected: frame parsing error. source addr:"
pe_warn("Partner Assoc Req frame gen error. source addr:"
QDF_MAC_ADDR_FMT, QDF_MAC_ADDR_REF(sa));
lim_free_assoc_req_frm_buf(assoc_req);
qdf_mem_free(assoc_req);
return status;
}
return lim_proc_assoc_req_frm_cmn(mac_ctx, frm_body, frame_len,
sub_type, session, sa, assoc_req,
peer_aid);
qdf_nbuf_set_len(assoc_req->assoc_req_buf, link_frame_len);
assoc_req->assocReqFrame = qdf_nbuf_data(assoc_req->assoc_req_buf) +
sizeof(*pHdr);
assoc_req->assocReqFrameLength = link_frame_len - sizeof(*pHdr);
qdf_copy_macaddr((struct qdf_mac_addr *)assoc_req->mld_mac,
&ml_peer->peer_mld_addr);
return lim_proc_assoc_req_frm_cmn(mac_ctx, sub_type, session, sa,
assoc_req, peer_aid);
}
void lim_mlo_ap_sta_assoc_suc(struct wlan_objmgr_peer *peer)
@@ -804,7 +824,7 @@ QDF_STATUS lim_mlo_assoc_ind_upper_layer(struct mac_context *mac,
sme_assoc_ind->messageType = eWNI_SME_ASSOC_IND_UPPER_LAYER;
lim_fill_sme_assoc_ind_params(mac, lim_assoc_ind, sme_assoc_ind,
lk_session, false);
lk_session, true);
qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
msg.type = eWNI_SME_ASSOC_IND_UPPER_LAYER;
@@ -817,6 +837,8 @@ QDF_STATUS lim_mlo_assoc_ind_upper_layer(struct mac_context *mac,
lim_sys_process_mmh_msg_api(mac, &msg);
qdf_mem_free(lim_assoc_ind);
lim_free_assoc_req_frm_buf(
lk_session->parsedAssocReq[sta->assocId]);
qdf_mem_free(lk_session->parsedAssocReq[sta->assocId]);
lk_session->parsedAssocReq[sta->assocId] = NULL;
status = QDF_STATUS_SUCCESS;

View File

@@ -231,35 +231,6 @@ static bool lim_chk_sa_da(struct mac_context *mac_ctx, tpSirMacMgmtHdr hdr,
return false;
}
#ifdef WLAN_FEATURE_11BE_MLO
QDF_STATUS lim_mlo_partner_assoc_req_parse(struct mac_context *mac_ctx,
tSirMacAddr sa,
struct pe_session *session,
tpSirAssocReq assoc_req,
uint8_t sub_type, uint8_t *frm_body,
uint32_t frame_len)
{
QDF_STATUS status;
uint8_t link_id;
link_id = wlan_vdev_get_link_id(session->vdev);
if (sub_type == LIM_ASSOC)
status = sir_convert_mlo_assoc_req_frame2_struct(mac_ctx,
frm_body,
frame_len,
assoc_req,
link_id);
else
status = sir_convert_mlo_reassoc_req_frame2_struct(mac_ctx,
frm_body,
frame_len,
assoc_req,
link_id);
return status;
}
#endif
/**
* lim_chk_assoc_req_parse_error() - checks for error in frame parsing
* @mac_ctx: pointer to Global MAC structure
@@ -2377,7 +2348,6 @@ QDF_STATUS lim_check_assoc_req(struct mac_context *mac_ctx,
}
QDF_STATUS lim_proc_assoc_req_frm_cmn(struct mac_context *mac_ctx,
uint8_t *frm_body, uint32_t frame_len,
uint8_t sub_type,
struct pe_session *session,
tSirMacAddr sa,
@@ -2393,7 +2363,11 @@ QDF_STATUS lim_proc_assoc_req_frm_cmn(struct mac_context *mac_ctx,
tpDphHashNode sta_ds = NULL;
bool dup_entry = false, force_1x1 = false;
QDF_STATUS status;
uint8_t *frm_body;
uint32_t frame_len;
frm_body = assoc_req->assocReqFrame;
frame_len = assoc_req->assocReqFrameLength;
lim_get_phy_mode(mac_ctx, &phy_mode, session);
limGetQosMode(session, &qos_mode);
@@ -2439,6 +2413,11 @@ QDF_STATUS lim_proc_assoc_req_frm_cmn(struct mac_context *mac_ctx,
}
}
if (!lim_chk_assoc_req_parse_error(mac_ctx, sa, session,
assoc_req, sub_type,
frm_body, frame_len))
goto error;
if (!lim_chk_capab(mac_ctx, sa, session, assoc_req,
sub_type, &local_cap))
goto error;
@@ -2691,20 +2670,14 @@ void lim_process_assoc_req_frame(struct mac_context *mac_ctx,
if (!assoc_req)
return;
/* Parse Assoc Request frame */
if (!lim_chk_assoc_req_parse_error(mac_ctx, hdr->sa, session,
assoc_req, sub_type,
frm_body, frame_len))
goto error;
if (!lim_alloc_assoc_req_frm_buf(assoc_req,
WMA_GET_QDF_NBUF(rx_pkt_info),
WMA_GET_RX_MAC_HEADER_LEN(rx_pkt_info),
frame_len))
goto error;
lim_proc_assoc_req_frm_cmn(mac_ctx, frm_body, frame_len, sub_type,
session, hdr->sa, assoc_req, 0);
lim_proc_assoc_req_frm_cmn(mac_ctx, sub_type, session, hdr->sa,
assoc_req, 0);
return;
error:

View File

@@ -430,8 +430,6 @@ QDF_STATUS lim_check_assoc_req(struct mac_context *mac_ctx,
/**
* lim_proc_assoc_req_frm_cmn() - process assoc req frame
* @mac_ctx: pointer to Global MAC structure
* @frm_body: frame body
* @frame_len: frame len
* @sub_type: Assoc(=0) or Reassoc(=1) Requestframe
* @session: pointer to pe session entry
* @sa: Mac address of requesting peer
@@ -441,37 +439,12 @@ QDF_STATUS lim_check_assoc_req(struct mac_context *mac_ctx,
* Return: QDF_STATUS
*/
QDF_STATUS lim_proc_assoc_req_frm_cmn(struct mac_context *mac_ctx,
uint8_t *frm_body, uint32_t frame_len,
uint8_t sub_type,
struct pe_session *session,
tSirMacAddr sa,
tpSirAssocReq assoc_req,
uint16_t peer_aid);
/**
* lim_mlo_partner_assoc_req_parse() - checks for error in assoc req frame
* parsing for mlo partner link
* @mac_ctx: pointer to Global MAC structure
* @sa: Mac address of requesting peer
* @session: pointer to pe session entry
* @assoc_req: pointer to ASSOC/REASSOC Request frame
* @sub_type: Assoc(=0) or Reassoc(=1) Requestframe
* @frm_body: frame body
* @frame_len: frame len
*
* Checks for error in frame parsing
*
* Return: QDF_STATUS
*/
#ifdef WLAN_FEATURE_11BE_MLO
QDF_STATUS lim_mlo_partner_assoc_req_parse(struct mac_context *mac_ctx,
tSirMacAddr sa,
struct pe_session *session,
tpSirAssocReq assoc_req,
uint8_t sub_type, uint8_t *frm_body,
uint32_t frame_len);
#endif
void lim_process_assoc_req_frame(struct mac_context *, uint8_t *, uint8_t, struct pe_session *);
/**

View File

@@ -6754,372 +6754,6 @@ QDF_STATUS populate_dot11f_eht_operation(struct mac_context *mac_ctx,
#endif /* WLAN_FEATURE_11BE */
#ifdef WLAN_FEATURE_11BE_MLO
/*
* is_noninh_ie() - find the noninhertance information element
* in the received frame's IE list, so that we can stop inheriting that IE
* in the caller function.
*
* @elem_id: Element ID in the received frame's IE, which is being processed.
* @non_inh_list: pointer to the non inherited list of element IDs or
* list of extension element IDs.
* @len: Length of non inheritance IE list
*
* Return: False if the element ID is not found or else return true
*/
static bool is_noninh_ie(uint8_t elem_id,
uint8_t *non_inh_list,
int8_t len)
{
int count;
for (count = 0; count < len; count++) {
if (elem_id == non_inh_list[count])
return true;
}
return false;
}
QDF_STATUS
sir_convert_mlo_reassoc_req_frame2_struct(struct mac_context *mac,
uint8_t *pFrame,
uint32_t nFrame,
tpSirAssocReq pAssocReq,
uint8_t link_id)
{
/* TD MLO much more like sir_convert_mlo_assoc_req_frame2_struct */
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
sir_convert_mlo_assoc_req_frame2_struct(struct mac_context *mac,
uint8_t *pFrame,
uint32_t nFrame,
tpSirAssocReq pAssocReq,
uint8_t link_id)
{
tDot11fAssocRequest *ar;
uint32_t status;
tDot11fIEsta_profile *sta_pro = NULL;
uint16_t num_sta_pro;
int sta_index;
uint8_t num_ie_list = 0;
uint8_t *non_inheri_data;
uint8_t ie_list[255];
uint8_t num_extn_ie_list = 0;
uint8_t extn_ie_list[255];
qdf_mem_zero(ie_list, 255);
qdf_mem_zero(extn_ie_list, 255);
ar = qdf_mem_malloc(sizeof(*ar));
if (!ar)
return QDF_STATUS_E_NOMEM;
/* Zero-init our [out] parameter, */
qdf_mem_zero((uint8_t *)pAssocReq, sizeof(tSirAssocReq));
/* delegate to the framesc-generated code, */
status = dot11f_unpack_assoc_request(mac, pFrame, nFrame, ar, false);
if (DOT11F_FAILED(status)) {
pe_err("Failed to parse an mlo Association Request (0x%08x, %d bytes):",
status, nFrame);
QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_ERROR,
pFrame, nFrame);
qdf_mem_free(ar);
return QDF_STATUS_E_FAILURE;
} else if (DOT11F_WARNED(status)) {
pe_debug("There were warnings while unpacking an mlo Assoication Request (0x%08x, %d bytes):",
status, nFrame);
}
/* & "transliterate" from a 'tDot11fAssocRequest' to a 'tSirAssocReq' */
/* make sure this is seen as an assoc request */
pAssocReq->reassocRequest = 0;
if (!ar->mlo_ie.present) {
pe_err("can't get assoc info since no mlo ie");
qdf_mem_free(ar);
return QDF_STATUS_E_FAILURE;
}
num_sta_pro = ar->mlo_ie.num_sta_profile;
for (sta_index = 0; sta_index < num_sta_pro; sta_index++) {
sta_pro = &ar->mlo_ie.sta_profile[sta_index];
if (link_id == sta_pro->link_id)
break;
}
if (sta_index == num_sta_pro) {
pe_err("can't get link id %d assoc info since no mlo ie",
link_id);
qdf_mem_free(ar);
return QDF_STATUS_E_FAILURE;
}
if (!sta_pro->complete_profile || !sta_pro->sta_mac_addr_present) {
pe_err("Incorrect assoc req mlo ie per sta profile complete %d sta mac %d",
sta_pro->complete_profile,
sta_pro->sta_mac_addr_present);
qdf_mem_free(ar);
return QDF_STATUS_E_FAILURE;
}
/* fix field in mlo TD */
/* Capabilities */
pAssocReq->capabilityInfo.ess = sta_pro->mlo_capabilities.ess;
pAssocReq->capabilityInfo.ibss = sta_pro->mlo_capabilities.ibss;
pAssocReq->capabilityInfo.cfPollable =
sta_pro->mlo_capabilities.cfPollable;
pAssocReq->capabilityInfo.cfPollReq =
sta_pro->mlo_capabilities.cfPollReq;
pAssocReq->capabilityInfo.privacy = sta_pro->mlo_capabilities.privacy;
pAssocReq->capabilityInfo.shortPreamble =
sta_pro->mlo_capabilities.shortPreamble;
pAssocReq->capabilityInfo.criticalUpdateFlag =
sta_pro->mlo_capabilities.criticalUpdateFlag;
pAssocReq->capabilityInfo.channelAgility =
sta_pro->mlo_capabilities.channelAgility;
pAssocReq->capabilityInfo.spectrumMgt =
sta_pro->mlo_capabilities.spectrumMgt;
pAssocReq->capabilityInfo.qos = sta_pro->mlo_capabilities.qos;
pAssocReq->capabilityInfo.shortSlotTime =
sta_pro->mlo_capabilities.shortSlotTime;
pAssocReq->capabilityInfo.apsd = sta_pro->mlo_capabilities.apsd;
pAssocReq->capabilityInfo.rrm = sta_pro->mlo_capabilities.rrm;
pAssocReq->capabilityInfo.dsssOfdm = sta_pro->mlo_capabilities.dsssOfdm;
pAssocReq->capabilityInfo.delayedBA =
sta_pro->mlo_capabilities.delayedBA;
pAssocReq->capabilityInfo.immediateBA =
sta_pro->mlo_capabilities.immediateBA;
/* Listen Interval */
pAssocReq->listenInterval = ar->ListenInterval.interval;
if (sta_pro->non_inheritance.present) {
non_inheri_data = sta_pro->non_inheritance.data;
num_ie_list = *non_inheri_data++;
qdf_mem_copy(ie_list, non_inheri_data, num_ie_list);
non_inheri_data += num_ie_list;
num_extn_ie_list = *non_inheri_data++;
qdf_mem_copy(extn_ie_list, non_inheri_data, num_extn_ie_list);
}
/* SSID */
if (ar->SSID.present) {
pAssocReq->ssidPresent = 1;
convert_ssid(mac, &pAssocReq->ssId, &ar->SSID);
}
/* Supported Rates */
if (sta_pro->SuppRates.present) {
pAssocReq->suppRatesPresent = 1;
convert_supp_rates(mac, &pAssocReq->supportedRates,
&sta_pro->SuppRates);
} else if (ar->SuppRates.present &&
!is_noninh_ie(DOT11F_EID_SUPPRATES,
ie_list,
num_ie_list)) {
pAssocReq->suppRatesPresent = 1;
convert_supp_rates(mac, &pAssocReq->supportedRates,
&ar->SuppRates);
}
/* Extended Supported Rates */
if (sta_pro->ExtSuppRates.present) {
pAssocReq->extendedRatesPresent = 1;
convert_ext_supp_rates(mac, &pAssocReq->extendedRates,
&sta_pro->ExtSuppRates);
} else if (ar->ExtSuppRates.present &&
!is_noninh_ie(DOT11F_EID_EXTSUPPRATES,
ie_list,
num_ie_list)) {
pAssocReq->extendedRatesPresent = 1;
convert_ext_supp_rates(mac, &pAssocReq->extendedRates,
&ar->ExtSuppRates);
}
if (sta_pro->HTCaps.present)
qdf_mem_copy(&pAssocReq->HTCaps, &sta_pro->HTCaps,
sizeof(tDot11fIEHTCaps));
else if (ar->HTCaps.present &&
!is_noninh_ie(DOT11F_EID_HTCAPS,
ie_list,
num_ie_list))
qdf_mem_copy(&pAssocReq->HTCaps, &ar->HTCaps,
sizeof(tDot11fIEHTCaps));
if (sta_pro->WMMInfoStation.present) {
pAssocReq->wmeInfoPresent = 1;
qdf_mem_copy(&pAssocReq->WMMInfoStation,
&sta_pro->WMMInfoStation,
sizeof(tDot11fIEWMMInfoStation));
} else if (ar->WMMInfoStation.present &&
!is_noninh_ie(DOT11F_EID_WMMINFOSTATION,
ie_list,
num_ie_list)) {
pAssocReq->wmeInfoPresent = 1;
qdf_mem_copy(&pAssocReq->WMMInfoStation, &ar->WMMInfoStation,
sizeof(tDot11fIEWMMInfoStation));
}
if (sta_pro->WMMCaps.present)
pAssocReq->wsmCapablePresent = 1;
else if (ar->WMMCaps.present &&
!is_noninh_ie(DOT11F_EID_WMMCAPS,
ie_list,
num_ie_list))
pAssocReq->wsmCapablePresent = 1;
if (!pAssocReq->ssidPresent) {
pe_debug("Received Assoc without SSID IE");
qdf_mem_free(ar);
return QDF_STATUS_E_FAILURE;
}
if (!pAssocReq->suppRatesPresent && !pAssocReq->extendedRatesPresent) {
pe_debug("Received Assoc without supp rate IE");
qdf_mem_free(ar);
return QDF_STATUS_E_FAILURE;
}
if (sta_pro->VHTCaps.present) {
qdf_mem_copy(&pAssocReq->VHTCaps, &sta_pro->VHTCaps,
sizeof(tDot11fIEVHTCaps));
pe_debug("Received Assoc Req with VHT Cap");
lim_log_vht_cap(mac, &pAssocReq->VHTCaps);
} else if (ar->VHTCaps.present &&
!is_noninh_ie(DOT11F_EID_VHTCAPS,
ie_list,
num_ie_list)) {
qdf_mem_copy(&pAssocReq->VHTCaps, &ar->VHTCaps,
sizeof(tDot11fIEVHTCaps));
pe_debug("Received Assoc Req with VHT Cap");
lim_log_vht_cap(mac, &pAssocReq->VHTCaps);
}
if (sta_pro->OperatingMode.present) {
qdf_mem_copy(&pAssocReq->operMode, &sta_pro->OperatingMode,
sizeof(tDot11fIEOperatingMode));
pe_debug("Received Assoc Req with Operating Mode IE");
lim_log_operating_mode(mac, &pAssocReq->operMode);
} else if (ar->OperatingMode.present &&
!is_noninh_ie(DOT11F_EID_OPERATINGMODE,
ie_list,
num_ie_list)) {
qdf_mem_copy(&pAssocReq->operMode, &ar->OperatingMode,
sizeof(tDot11fIEOperatingMode));
pe_debug("Received Assoc Req with Operating Mode IE");
lim_log_operating_mode(mac, &pAssocReq->operMode);
}
if (sta_pro->ExtCap.present) {
struct s_ext_cap *ext_cap;
qdf_mem_copy(&pAssocReq->ExtCap, &sta_pro->ExtCap,
sizeof(tDot11fIEExtCap));
ext_cap = (struct s_ext_cap *)&pAssocReq->ExtCap.bytes;
pe_debug("timingMeas: %d, finetimingMeas Init: %d, Resp: %d",
ext_cap->timing_meas,
ext_cap->fine_time_meas_initiator,
ext_cap->fine_time_meas_responder);
} else if (ar->ExtCap.present &&
!is_noninh_ie(DOT11F_EID_EXTCAP,
ie_list,
num_ie_list)) {
struct s_ext_cap *ext_cap;
qdf_mem_copy(&pAssocReq->ExtCap, &ar->ExtCap,
sizeof(tDot11fIEExtCap));
ext_cap = (struct s_ext_cap *)&pAssocReq->ExtCap.bytes;
pe_debug("timingMeas: %d, finetimingMeas Init: %d, Resp: %d",
ext_cap->timing_meas,
ext_cap->fine_time_meas_initiator,
ext_cap->fine_time_meas_responder);
}
if (sta_pro->SuppOperatingClasses.present) {
uint8_t num_classes = sta_pro->SuppOperatingClasses.num_classes;
if (num_classes > sizeof(sta_pro->SuppOperatingClasses.classes))
num_classes =
sizeof(sta_pro->SuppOperatingClasses.classes);
qdf_mem_copy(&pAssocReq->supp_operating_classes,
&sta_pro->SuppOperatingClasses,
sizeof(tDot11fIESuppOperatingClasses));
QDF_TRACE_HEX_DUMP(
QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
sta_pro->SuppOperatingClasses.classes, num_classes);
} else if (ar->SuppOperatingClasses.present &&
!is_noninh_ie(DOT11F_EID_SUPPOPERATINGCLASSES,
ie_list,
num_ie_list)) {
uint8_t num_classes = ar->SuppOperatingClasses.num_classes;
if (num_classes > sizeof(ar->SuppOperatingClasses.classes))
num_classes =
sizeof(ar->SuppOperatingClasses.classes);
qdf_mem_copy(&pAssocReq->supp_operating_classes,
&ar->SuppOperatingClasses,
sizeof(tDot11fIESuppOperatingClasses));
QDF_TRACE_HEX_DUMP(
QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
ar->SuppOperatingClasses.classes, num_classes);
}
if (sta_pro->qcn_ie.present)
qdf_mem_copy(&pAssocReq->qcn_ie, &sta_pro->qcn_ie,
sizeof(tDot11fIEqcn_ie));
else if (ar->qcn_ie.present &&
!is_noninh_ie(DOT11F_EID_QCN_IE,
ie_list,
num_ie_list))
qdf_mem_copy(&pAssocReq->qcn_ie, &ar->qcn_ie,
sizeof(tDot11fIEqcn_ie));
if (sta_pro->he_cap.present) {
qdf_mem_copy(&pAssocReq->he_cap, &sta_pro->he_cap,
sizeof(tDot11fIEhe_cap));
pe_debug("Received Assoc Req with HE Capability IE");
QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
&pAssocReq->he_cap, sizeof(tDot11fIEhe_cap));
} else if (ar->he_cap.present &&
!is_noninh_ie(
WLAN_EXTN_ELEMID_HECAP,
extn_ie_list,
num_extn_ie_list)) {
qdf_mem_copy(&pAssocReq->he_cap, &ar->he_cap,
sizeof(tDot11fIEhe_cap));
pe_debug("Received Assoc Req with HE Capability IE");
QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
&pAssocReq->he_cap, sizeof(tDot11fIEhe_cap));
}
if (sta_pro->he_6ghz_band_cap.present) {
qdf_mem_copy(&pAssocReq->he_6ghz_band_cap,
&sta_pro->he_6ghz_band_cap,
sizeof(tDot11fIEhe_6ghz_band_cap));
pe_debug("Received Assoc Req with HE Band Capability IE");
} else if (ar->he_6ghz_band_cap.present &&
!is_noninh_ie(
DOT11F_EID_HE_6GHZ_BAND_CAP,
extn_ie_list,
num_extn_ie_list)) {
qdf_mem_copy(&pAssocReq->he_6ghz_band_cap,
&ar->he_6ghz_band_cap,
sizeof(tDot11fIEhe_6ghz_band_cap));
pe_debug("Received Assoc Req with HE Band Capability IE");
}
if (sta_pro->eht_cap.present) {
qdf_mem_copy(&pAssocReq->eht_cap, &sta_pro->eht_cap,
sizeof(tDot11fIEeht_cap));
pe_debug("Received Assoc Req with EHT Capability IE");
QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
&pAssocReq->eht_cap,
sizeof(tDot11fIEeht_cap));
} else if (ar->eht_cap.present &&
!is_noninh_ie(
WLAN_EXTN_ELEMID_EHTCAP,
extn_ie_list,
num_extn_ie_list)) {
qdf_mem_copy(&pAssocReq->eht_cap, &ar->eht_cap,
sizeof(tDot11fIEeht_cap));
pe_debug("Received Assoc Req with EHT Capability IE");
QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
&pAssocReq->eht_cap,
sizeof(tDot11fIEeht_cap));
}
qdf_mem_copy(pAssocReq->mld_mac,
ar->mlo_ie.mld_mac_addr.info.mld_mac_addr,
QDF_MAC_ADDR_SIZE);
qdf_mem_free(ar);
return QDF_STATUS_SUCCESS;
} /* End sir_convert_mlo_assoc_req_frame2_struct. */
QDF_STATUS populate_dot11f_assoc_rsp_mlo_ie(struct mac_context *mac_ctx,
struct pe_session *session,
tpDphHashNode sta,