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:
Kiran Kumar Lokere 2018-01-04 16:25:02 -08:00 • committed by snandini
commit 3a5b4243c0
2 changed files with 27 additions and 22 deletions

View file

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

View file

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