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:
Selvaraj, Sridhar
2017-05-26 19:32:05 +05:30
committed by snandini
父節點 c9703c2ace
當前提交 6f97f41021
共有 3 個文件被更改,包括 68 次插入20 次删除

查看文件

@@ -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!");