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:

committed by
Madan Koyyalamudi

parent
2ac114ac4e
commit
23c1f486ca
@@ -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,
|
||||
|
@@ -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;
|
||||
|
@@ -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:
|
||||
|
@@ -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 *);
|
||||
|
||||
/**
|
||||
|
@@ -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,
|
||||
|
Reference in New Issue
Block a user