qcacld-3.0: Parse beacon IE's to extract Fixed fields
Currently, in beacon IE parsing of roam synch indication, fixed fields [beacon interval, timestamp, capabilities] are not parsed resulting in these fields being reported as zeros to supplicant. Parse beacon IE's to extract fixed fields from beacon IE's. Change-Id: I3ba2b8037de99a49b42eeecc7670bdb23c118f9d CRs-Fixed: 2053019
This commit is contained in:
@@ -1009,6 +1009,19 @@ sir_validate_and_rectify_ies(tpAniSirGlobal mac_ctx,
|
||||
uint8_t *mgmt_frame,
|
||||
uint32_t frame_bytes,
|
||||
uint32_t *missing_rsn_bytes);
|
||||
/**
|
||||
* sir_copy_caps_info() - Copy Caps info from tDot11fFfCapabilities to
|
||||
* beacon/probe response structure.
|
||||
* @mac_ctx: MAC Context
|
||||
* @caps: tDot11fFfCapabilities structure
|
||||
* @pProbeResp: beacon/probe response structure
|
||||
*
|
||||
* Copy the caps info to beacon/probe response structure
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void sir_copy_caps_info(tpAniSirGlobal mac_ctx, tDot11fFfCapabilities caps,
|
||||
tpSirProbeRespBeacon pProbeResp);
|
||||
|
||||
#ifdef WLAN_FEATURE_11AX
|
||||
QDF_STATUS populate_dot11f_he_caps(tpAniSirGlobal , tpPESession ,
|
||||
|
@@ -1828,6 +1828,30 @@ void lim_fill_join_rsp_ht_caps(tpPESession session, tpSirSmeJoinRsp join_rsp)
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* sir_parse_bcn_fixed_fields() - Parse fixed fields in Beacon IE's
|
||||
*
|
||||
* @mac_ctx: MAC Context
|
||||
* @beacon_struct: Beacon/Probe Response structure
|
||||
* @buf: Fixed Fields buffer
|
||||
*/
|
||||
static void sir_parse_bcn_fixed_fields(tpAniSirGlobal mac_ctx,
|
||||
tpSirProbeRespBeacon beacon_struct,
|
||||
uint8_t *buf)
|
||||
{
|
||||
tDot11fFfCapabilities dst;
|
||||
beacon_struct->timeStamp[0] = lim_get_u32(buf);
|
||||
beacon_struct->timeStamp[1] = lim_get_u32(buf + 4);
|
||||
buf += 8;
|
||||
|
||||
beacon_struct->beaconInterval = lim_get_u16(buf);
|
||||
buf += 2;
|
||||
|
||||
dot11f_unpack_ff_capabilities(mac_ctx, buf, &dst);
|
||||
|
||||
sir_copy_caps_info(mac_ctx, dst, beacon_struct);
|
||||
}
|
||||
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
static QDF_STATUS
|
||||
lim_roam_fill_bss_descr(tpAniSirGlobal pMac,
|
||||
@@ -1884,6 +1908,15 @@ lim_roam_fill_bss_descr(tpAniSirGlobal pMac,
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* For probe response, unpack core parses beacon interval, capabilities,
|
||||
* timestamp. For beacon IEs, these fields are not parsed.
|
||||
*/
|
||||
if (roam_offload_synch_ind_ptr->isBeacon)
|
||||
sir_parse_bcn_fixed_fields(pMac, parsed_frm_ptr,
|
||||
&bcn_proberesp_ptr[SIR_MAC_HDR_LEN_3A]);
|
||||
|
||||
/* 24 byte MAC header and 12 byte to ssid IE */
|
||||
if (roam_offload_synch_ind_ptr->beaconProbeRespLength >
|
||||
(SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET)) {
|
||||
|
@@ -2254,6 +2254,27 @@ sir_validate_and_rectify_ies(tpAniSirGlobal mac_ctx,
|
||||
return eSIR_SUCCESS;
|
||||
}
|
||||
|
||||
void sir_copy_caps_info(tpAniSirGlobal mac_ctx, tDot11fFfCapabilities caps,
|
||||
tpSirProbeRespBeacon pProbeResp)
|
||||
{
|
||||
pProbeResp->capabilityInfo.ess = caps.ess;
|
||||
pProbeResp->capabilityInfo.ibss = caps.ibss;
|
||||
pProbeResp->capabilityInfo.cfPollable = caps.cfPollable;
|
||||
pProbeResp->capabilityInfo.cfPollReq = caps.cfPollReq;
|
||||
pProbeResp->capabilityInfo.privacy = caps.privacy;
|
||||
pProbeResp->capabilityInfo.shortPreamble = caps.shortPreamble;
|
||||
pProbeResp->capabilityInfo.pbcc = caps.pbcc;
|
||||
pProbeResp->capabilityInfo.channelAgility = caps.channelAgility;
|
||||
pProbeResp->capabilityInfo.spectrumMgt = caps.spectrumMgt;
|
||||
pProbeResp->capabilityInfo.qos = caps.qos;
|
||||
pProbeResp->capabilityInfo.shortSlotTime = caps.shortSlotTime;
|
||||
pProbeResp->capabilityInfo.apsd = caps.apsd;
|
||||
pProbeResp->capabilityInfo.rrm = caps.rrm;
|
||||
pProbeResp->capabilityInfo.dsssOfdm = caps.dsssOfdm;
|
||||
pProbeResp->capabilityInfo.delayedBA = caps.delayedBA;
|
||||
pProbeResp->capabilityInfo.immediateBA = caps.immediateBA;
|
||||
}
|
||||
|
||||
tSirRetStatus sir_convert_probe_frame2_struct(tpAniSirGlobal pMac,
|
||||
uint8_t *pFrame,
|
||||
uint32_t nFrame,
|
||||
@@ -2295,26 +2316,7 @@ tSirRetStatus sir_convert_probe_frame2_struct(tpAniSirGlobal pMac,
|
||||
/* Beacon Interval */
|
||||
pProbeResp->beaconInterval = pr->BeaconInterval.interval;
|
||||
|
||||
/* Capabilities */
|
||||
pProbeResp->capabilityInfo.ess = pr->Capabilities.ess;
|
||||
pProbeResp->capabilityInfo.ibss = pr->Capabilities.ibss;
|
||||
pProbeResp->capabilityInfo.cfPollable = pr->Capabilities.cfPollable;
|
||||
pProbeResp->capabilityInfo.cfPollReq = pr->Capabilities.cfPollReq;
|
||||
pProbeResp->capabilityInfo.privacy = pr->Capabilities.privacy;
|
||||
pProbeResp->capabilityInfo.shortPreamble =
|
||||
pr->Capabilities.shortPreamble;
|
||||
pProbeResp->capabilityInfo.pbcc = pr->Capabilities.pbcc;
|
||||
pProbeResp->capabilityInfo.channelAgility =
|
||||
pr->Capabilities.channelAgility;
|
||||
pProbeResp->capabilityInfo.spectrumMgt = pr->Capabilities.spectrumMgt;
|
||||
pProbeResp->capabilityInfo.qos = pr->Capabilities.qos;
|
||||
pProbeResp->capabilityInfo.shortSlotTime =
|
||||
pr->Capabilities.shortSlotTime;
|
||||
pProbeResp->capabilityInfo.apsd = pr->Capabilities.apsd;
|
||||
pProbeResp->capabilityInfo.rrm = pr->Capabilities.rrm;
|
||||
pProbeResp->capabilityInfo.dsssOfdm = pr->Capabilities.dsssOfdm;
|
||||
pProbeResp->capabilityInfo.delayedBA = pr->Capabilities.delayedBA;
|
||||
pProbeResp->capabilityInfo.immediateBA = pr->Capabilities.immediateBA;
|
||||
sir_copy_caps_info(pMac, pr->Capabilities, pProbeResp);
|
||||
|
||||
if (!pr->SSID.present) {
|
||||
pe_warn("Mandatory IE SSID not present!");
|
||||
|
Reference in New Issue
Block a user