mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-12 07:37:31 -04:00
qcacld-3.0: Fix the issue with duplicate HE caps advertisement
HE caps and HE op IE are derived in driver and also sent from hostapd as part of additional IE. additional IEs are appended at end of the beacon frame hence the duplicate IEs are observed. Strip out the HE caps and HE op IE from additional IE after the IEs are derived in driver. Change-Id: Ia11b16ef8e7d376e5c1ef44d54e1cd1885f5b842 CRs-Fixed: 2159867
This commit is contained in:
parent
1436c1da0b
commit
3a5b4243c0
2 changed files with 27 additions and 22 deletions
|
|
@ -7315,25 +7315,27 @@ void lim_update_stads_he_caps(tpDphHashNode sta_ds, tpSirAssocRsp assoc_rsp,
|
|||
|
||||
void lim_update_usr_he_cap(tpAniSirGlobal mac_ctx, tpPESession session)
|
||||
{
|
||||
const uint8_t *vendor_ie;
|
||||
tSirAddIeParams *add_ie = &session->addIeParams;
|
||||
tDot11fIEhe_cap *he_cap = &session->he_config;
|
||||
struct he_cap_network_endian *he_cap_from_ie;
|
||||
|
||||
vendor_ie = wlan_get_ext_ie_ptr_from_ext_id(
|
||||
HE_CAP_OUI_TYPE, HE_CAP_OUI_SIZE,
|
||||
add_ie->probeRespBCNData_buff,
|
||||
add_ie->probeRespBCNDataLen);
|
||||
if (!vendor_ie) {
|
||||
pe_err("11AX: Unable to parse HE Caps");
|
||||
uint8_t extracted_buff[DOT11F_IE_HE_CAP_MAX_LEN + 2];
|
||||
enum eSirRetStatus status;
|
||||
qdf_mem_zero(extracted_buff, sizeof(extracted_buff));
|
||||
status = lim_strip_ie(mac_ctx, add_ie->probeRespBCNData_buff,
|
||||
&add_ie->probeRespBCNDataLen,
|
||||
DOT11F_EID_HE_CAP, ONE_BYTE,
|
||||
HE_CAP_OUI_TYPE, (uint8_t)HE_CAP_OUI_SIZE,
|
||||
extracted_buff, DOT11F_IE_HE_CAP_MAX_LEN);
|
||||
if (eSIR_SUCCESS != status) {
|
||||
pe_debug("Failed to strip HE cap IE status: %d", status);
|
||||
return;
|
||||
}
|
||||
|
||||
pe_debug("Before update: su_beamformer: %d, su_beamformee: %d, mu_beamformer: %d",
|
||||
he_cap->su_beamformer, he_cap->su_beamformee, he_cap->mu_beamformer);
|
||||
|
||||
he_cap_from_ie =
|
||||
(struct he_cap_network_endian *)&vendor_ie[HE_OP_OUI_SIZE + 2];
|
||||
he_cap_from_ie = (struct he_cap_network_endian *)
|
||||
&extracted_buff[HE_CAP_OUI_SIZE + 2];
|
||||
|
||||
he_cap->su_beamformer =
|
||||
he_cap->su_beamformer & he_cap_from_ie->su_beamformer;
|
||||
|
|
@ -7350,22 +7352,24 @@ void lim_decide_he_op(tpAniSirGlobal mac_ctx, tpAddBssParams add_bss,
|
|||
tpPESession session)
|
||||
{
|
||||
uint32_t val;
|
||||
const uint8_t *vendor_ie;
|
||||
struct he_ops_network_endian *he_ops_from_ie;
|
||||
tDot11fIEhe_op *he_ops = &add_bss->he_op;
|
||||
tSirAddIeParams *add_ie = &session->addIeParams;
|
||||
uint8_t extracted_buff[DOT11F_IE_HE_OP_MAX_LEN + 2];
|
||||
enum eSirRetStatus status;
|
||||
|
||||
vendor_ie = wlan_get_ext_ie_ptr_from_ext_id(
|
||||
HE_OP_OUI_TYPE, HE_OP_OUI_SIZE,
|
||||
add_ie->probeRespBCNData_buff,
|
||||
add_ie->probeRespBCNDataLen);
|
||||
if (!vendor_ie) {
|
||||
pe_err("11AX: Unable to parse HE Operation");
|
||||
qdf_mem_zero(extracted_buff, sizeof(extracted_buff));
|
||||
status = lim_strip_ie(mac_ctx, add_ie->probeRespBCNData_buff,
|
||||
&add_ie->probeRespBCNDataLen,
|
||||
DOT11F_EID_HE_OP, ONE_BYTE,
|
||||
HE_OP_OUI_TYPE, (uint8_t)HE_OP_OUI_SIZE,
|
||||
extracted_buff, DOT11F_IE_HE_OP_MAX_LEN);
|
||||
if (eSIR_SUCCESS != status) {
|
||||
pe_debug("Failed to strip HE OP IE status: %d", status);
|
||||
return;
|
||||
}
|
||||
|
||||
he_ops_from_ie =
|
||||
(struct he_ops_network_endian *)&vendor_ie[HE_OP_OUI_SIZE + 2];
|
||||
he_ops_from_ie = (struct he_ops_network_endian *)
|
||||
&extracted_buff[HE_OP_OUI_SIZE + 2];
|
||||
|
||||
he_ops->bss_color = he_ops_from_ie->bss_color;
|
||||
he_ops->default_pe = he_ops_from_ie->default_pe;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
|
||||
*
|
||||
|
|
@ -6265,6 +6265,7 @@ QDF_STATUS populate_dot11f_he_operation(tpAniSirGlobal mac_ctx,
|
|||
qdf_mem_copy(he_op, &session->he_op, sizeof(*he_op));
|
||||
|
||||
he_op->vht_oper_present = 1;
|
||||
he_op->present = 1;
|
||||
if (session->ch_width > CH_WIDTH_40MHZ) {
|
||||
he_op->vht_oper.info.chan_width = 1;
|
||||
he_op->vht_oper.info.center_freq_seg0 =
|
||||
|
|
|
|||
Loading…
Reference in a new issue