blob: 6db362dbecbbac4db25b5341f263fbf85cc8a2ec [file] [log] [blame]
/*
* Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/*
* This file was originally distributed by Qualcomm Atheros, Inc.
* under proprietary terms before Copyright ownership was assigned
* to the Linux Foundation.
*/
/*
* This file parserApi.h contains the definitions used
* for parsing received 802.11 frames
* Author: Chandra Modumudi
* Date: 02/11/02
* History:-
* Date Modified by Modification Information
* --------------------------------------------------------------------
*
*/
#ifndef __PARSE_H__
#define __PARSE_H__
#include <stdarg.h>
#include "sirMacPropExts.h"
#include "dot11f.h"
#ifdef WLAN_FEATURE_VOWIFI_11R
#include "limFTDefs.h"
#endif
#include "limSession.h"
#define COUNTRY_STRING_LENGTH ( 3 )
#define COUNTRY_INFO_MAX_CHANNEL ( 84 )
#define MAX_SIZE_OF_TRIPLETS_IN_COUNTRY_IE (COUNTRY_STRING_LENGTH * COUNTRY_INFO_MAX_CHANNEL)
#define HIGHEST_24GHZ_CHANNEL_NUM ( 14 )
#define IS_24G_CH(__chNum) ((__chNum > 0) && (__chNum < 15))
#define IS_5G_CH(__chNum) ((__chNum >= 36) && (__chNum <= 165))
#define IS_2X2_CHAIN(__chain) ((__chain & 0x3) == 0x3)
#define DISABLE_NSS2_MCS 0xC
#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
#define QCOM_VENDOR_IE_MCC_AVOID_CH 0x01
struct sAvoidChannelIE {
/* following must be 0xDD (221) */
uint8_t tag_number;
uint8_t length;
/* following must be 00-A0-C6 */
uint8_t oui[3];
/* following must be 0x01 */
uint8_t type;
uint8_t type_len;
uint8_t channel;
};
#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
/**
* struct vendor_ie_sub20_channelwidth
* @elem_id: Vendor Sub20 Channel Width Element id
* @elem_len: Vendor Sub20 Channel Width Element data length
* @sub20_capability: sub20 capability
* @new_sub20_channelwidth: new sub20 channelwidth
*/
struct vendor_ie_sub20_channelwidth {
uint8_t elem_id;
uint8_t elem_len;
uint8_t sub20_capability;
uint8_t new_sub20_channelwidth;
} __packed;
#define SIZE_OF_FIXED_PARAM ( 12 )
#define SIZE_OF_TAG_PARAM_NUM ( 1 )
#define SIZE_OF_TAG_PARAM_LEN ( 1 )
#define RSNIEID ( 0x30 )
#define RSNIE_CAPABILITY_LEN ( 2 )
#define DEFAULT_RSNIE_CAP_VAL ( 0x00 )
typedef struct sSirCountryInformation
{
tANI_U8 countryString[COUNTRY_STRING_LENGTH];
tANI_U8 numIntervals; //number of channel intervals
struct channelPowerLim
{
tANI_U8 channelNumber;
tANI_U8 numChannel;
tANI_U8 maxTransmitPower;
} channelTransmitPower[COUNTRY_INFO_MAX_CHANNEL];
} tSirCountryInformation,*tpSirCountryInformation;
#ifdef WLAN_FEATURE_FILS_SK
#define SIR_MAX_IDENTIFIER_CNT 7
#define SIR_CACHE_IDENTIFIER_LEN 2
#define SIR_HESSID_LEN 6
#define SIR_MAX_KEY_CNT 7
#define SIR_MAX_KEY_LEN 48
/*
* struct public_key_identifier: structure for public key identifier
* present in fils indication element
* @is_present: if Key info is present
* @key_cnt: number of keys present
* @key_type: type of key used
* @length: length of key
* @key: key data
*/
struct public_key_identifier {
bool is_present;
uint8_t key_cnt;
uint8_t key_type;
uint8_t length;
uint8_t key[SIR_MAX_KEY_CNT][SIR_MAX_KEY_LEN];
};
/*
* struct fils_cache_identifier: structure for fils cache identifier
* present in fils indication element
* @is_present: if cache identifier is present
* @identifier: cache identifier
*/
struct fils_cache_identifier {
bool is_present;
uint8_t identifier[SIR_CACHE_IDENTIFIER_LEN];
};
/*
* struct fils_hessid: structure for fils hessid
* present in fils indication element
* @is_present: if hessid info is present
* @hessid: hessid data
*/
struct fils_hessid {
bool is_present;
uint8_t hessid[SIR_HESSID_LEN];
};
/*
* struct fils_realm_identifier: structure for fils_realm_identifier
* present in fils indication element
* @is_present: if realm info is present
* @realm_cnt: realm count
* @realm: realm data
*/
struct fils_realm_identifier {
bool is_present;
uint8_t realm_cnt;
uint8_t realm[SIR_MAX_REALM_COUNT][SIR_REALM_LEN];
};
/*
* struct sir_fils_indication: structure for fils indication element
* @is_present: if indication element is present
* @is_ip_config_supported: if IP config is supported
* @is_fils_sk_auth_supported: if fils sk suppprted
* @is_fils_sk_auth_pfs_supported: if fils sk with pfs supported
* @is_pk_auth_supported: if fils public key supported
* @cache_identifier: fils cache idenfier info
* @hessid: fils hessid info
* @realm_identifier: fils realm info
* @key_identifier: fils key identifier info
*/
struct sir_fils_indication {
bool is_present;
uint8_t is_ip_config_supported;
uint8_t is_fils_sk_auth_supported;
uint8_t is_fils_sk_auth_pfs_supported;
uint8_t is_pk_auth_supported;
struct fils_cache_identifier cache_identifier;
struct fils_hessid hessid;
struct fils_realm_identifier realm_identifier;
struct public_key_identifier key_identifier;
};
#endif
/* Structure common to Beacons & Probe Responses */
typedef struct sSirProbeRespBeacon
{
tSirMacTimeStamp timeStamp;
tANI_U16 beaconInterval;
tSirMacCapabilityInfo capabilityInfo;
tSirMacSSid ssId;
tSirMacRateSet supportedRates;
tSirMacRateSet extendedRates;
tSirMacChanNum channelNumber;
tSirMacCfParamSet cfParamSet;
tSirMacTim tim;
tSirMacEdcaParamSetIE edcaParams;
tSirMacQosCapabilityIE qosCapability;
tSirCountryInformation countryInfoParam;
tSirMacWpaInfo wpa;
tSirMacRsnInfo rsn;
tSirMacErpInfo erpIEInfo;
tSirPropIEStruct propIEinfo;
tDot11fIEPowerConstraints localPowerConstraint;
tDot11fIETPCReport tpcReport;
tDot11fIEChanSwitchAnn channelSwitchIE;
tDot11fIEsec_chan_offset_ele sec_chan_offset;
tDot11fIEext_chan_switch_ann ext_chan_switch;
tDot11fIESuppOperatingClasses supp_operating_classes;
tSirMacAddr bssid;
tDot11fIEQuiet quietIE;
tDot11fIEHTCaps HTCaps;
tDot11fIEHTInfo HTInfo;
tDot11fIEP2PProbeRes P2PProbeRes;
#ifdef WLAN_FEATURE_VOWIFI_11R
tANI_U8 mdie[SIR_MDIE_SIZE];
#endif
#ifdef FEATURE_WLAN_ESE
tDot11fIEESETxmitPower eseTxPwr;
tDot11fIEQBSSLoad QBSSLoad;
#endif
tANI_U8 ssidPresent;
tANI_U8 suppRatesPresent;
tANI_U8 extendedRatesPresent;
tANI_U8 cfPresent;
tANI_U8 dsParamsPresent;
tANI_U8 timPresent;
tANI_U8 edcaPresent;
tANI_U8 qosCapabilityPresent;
tANI_U8 wmeEdcaPresent;
tANI_U8 wmeInfoPresent;
tANI_U8 wsmCapablePresent;
tANI_U8 countryInfoPresent;
tANI_U8 wpaPresent;
tANI_U8 rsnPresent;
tANI_U8 erpPresent;
tANI_U8 channelSwitchPresent;
uint8_t sec_chan_offset_present;
uint8_t ext_chan_switch_present;
uint8_t supp_operating_class_present;
tANI_U8 quietIEPresent;
tANI_U8 tpcReportPresent;
tANI_U8 powerConstraintPresent;
#ifdef WLAN_FEATURE_VOWIFI_11R
tANI_U8 mdiePresent;
#endif
#ifdef WLAN_FEATURE_11AC
tDot11fIEVHTCaps VHTCaps;
tDot11fIEVHTOperation VHTOperation;
tDot11fIEVHTExtBssLoad VHTExtBssLoad;
tDot11fIEExtCap ExtCap;
tDot11fIEOperatingMode OperatingMode;
tANI_U8 WiderBWChanSwitchAnnPresent;
tDot11fIEWiderBWChanSwitchAnn WiderBWChanSwitchAnn;
#endif
tANI_U8 Vendor1IEPresent;
tDot11fIEvendor2_ie vendor2_ie;
tANI_U8 Vendor3IEPresent;
tDot11fIEhs20vendor_ie hs20vendor_ie;
tDot11fIEIBSSParams IBSSParams;
#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
tDot11fIEQComVendorIE AvoidChannelIE;
#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
#ifdef FEATURE_WLAN_ESE
uint8_t is_ese_ver_ie_present;
#endif
uint8_t vendor_sub20_capability;
#ifdef WLAN_FEATURE_FILS_SK
struct sir_fils_indication fils_ind;
#endif
} tSirProbeRespBeacon, *tpSirProbeRespBeacon;
// probe Request structure
typedef struct sSirProbeReq
{
tSirMacSSid ssId;
tSirMacRateSet supportedRates;
tSirMacRateSet extendedRates;
tDot11fIEWscProbeReq probeReqWscIeInfo;
tDot11fIEHTCaps HTCaps;
tANI_U8 ssidPresent;
tANI_U8 suppRatesPresent;
tANI_U8 extendedRatesPresent;
tANI_U8 wscIePresent;
tANI_U8 p2pIePresent;
#ifdef WLAN_FEATURE_11AC
tDot11fIEVHTCaps VHTCaps;
#endif
} tSirProbeReq, *tpSirProbeReq;
/// Association Request structure (one day to be replaced by
/// tDot11fAssocRequest)
typedef struct sSirAssocReq
{
tSirMacCapabilityInfo capabilityInfo;
tANI_U16 listenInterval;
tSirMacAddr currentApAddr; /* only in reassoc frames */
tSirMacSSid ssId;
tSirMacRateSet supportedRates;
tSirMacRateSet extendedRates;
tSirAddtsReqInfo addtsReq;
tSirMacQosCapabilityStaIE qosCapability;
tSirMacWapiInfo wapi;
tSirMacWpaInfo wpa;
tSirMacRsnInfo rsn;
tSirAddie addIE;
tSirPropIEStruct propIEinfo;
tSirMacPowerCapabilityIE powerCapability;
tSirMacSupportedChannelIE supportedChannels;
tDot11fIEHTCaps HTCaps;
tDot11fIEWMMInfoStation WMMInfoStation;
/// This is set if the frame is a reassoc request:
tANI_U8 reassocRequest;
tANI_U8 ssidPresent;
tANI_U8 suppRatesPresent;
tANI_U8 extendedRatesPresent;
tANI_U8 wmeInfoPresent;
tANI_U8 qosCapabilityPresent;
tANI_U8 addtsPresent;
tANI_U8 wsmCapablePresent;
tANI_U8 wapiPresent;
tANI_U8 wpaPresent;
tANI_U8 rsnPresent;
tANI_U8 addIEPresent;
tANI_U8 powerCapabilityPresent;
tANI_U8 supportedChannelsPresent;
/* keeping copy of association request received, this is
required for indicating the frame to upper layers */
tANI_U32 assocReqFrameLength;
tANI_U8* assocReqFrame;
#ifdef WLAN_FEATURE_11AC
tDot11fIEVHTCaps VHTCaps;
tDot11fIEOperatingMode operMode;
#endif
tDot11fIEExtCap ExtCap;
tDot11fIEvendor2_ie vendor2_ie;
uint8_t vendor_sub20_capability;
tDot11fIEhs20vendor_ie hs20vendor_ie;
} tSirAssocReq, *tpSirAssocReq;
/// Association Response structure (one day to be replaced by
/// tDot11fAssocRequest)
typedef struct sSirAssocRsp
{
tSirMacCapabilityInfo capabilityInfo;
tANI_U16 aid;
tANI_U16 statusCode;
tSirMacRateSet supportedRates;
tSirMacRateSet extendedRates;
tSirPropIEStruct propIEinfo;
tSirMacEdcaParamSetIE edca;
tSirAddtsRspInfo addtsRsp;
tDot11fIEHTCaps HTCaps;
tDot11fIEHTInfo HTInfo;
#if defined WLAN_FEATURE_VOWIFI_11R
tDot11fIEFTInfo FTInfo;
tANI_U8 mdie[SIR_MDIE_SIZE];
tANI_U8 num_RICData;
tDot11fIERICDataDesc RICData[2];
#endif
#ifdef FEATURE_WLAN_ESE
tANI_U8 num_tspecs;
tDot11fIEWMMTSPEC TSPECInfo[SIR_ESE_MAX_TSPEC_IES];
tSirMacESETSMIE tsmIE;
#endif
tANI_U8 suppRatesPresent;
tANI_U8 extendedRatesPresent;
tANI_U8 edcaPresent;
tANI_U8 wmeEdcaPresent;
tANI_U8 addtsPresent;
tANI_U8 wsmCapablePresent;
#if defined WLAN_FEATURE_VOWIFI_11R
tANI_U8 ftinfoPresent;
tANI_U8 mdiePresent;
tANI_U8 ricPresent;
#endif
#ifdef FEATURE_WLAN_ESE
tANI_U8 tspecPresent;
tANI_U8 tsmPresent;
#endif
#ifdef WLAN_FEATURE_11AC
tDot11fIEVHTCaps VHTCaps;
tDot11fIEVHTOperation VHTOperation;
#endif
tDot11fIEExtCap ExtCap;
tSirQosMapSet QosMapSet;
#ifdef WLAN_FEATURE_11W
tDot11fIETimeoutInterval TimeoutInterval;
#endif
tDot11fIEvendor2_ie vendor2_ie;
uint8_t vendor_sub20_capability;
#ifdef WLAN_FEATURE_FILS_SK
tDot11fIEfils_session fils_session;
tDot11fIEfils_key_confirmation fils_key_auth;
tDot11fIEfils_kde fils_kde;
#endif
} tSirAssocRsp, *tpSirAssocRsp;
#if defined(FEATURE_WLAN_ESE_UPLOAD)
// Structure to hold ESE Beacon report mandatory IEs
typedef struct sSirEseBcnReportMandatoryIe
{
tSirMacSSid ssId;
tSirMacRateSet supportedRates;
tSirMacFHParamSet fhParamSet;
tSirMacDsParamSetIE dsParamSet;
tSirMacCfParamSet cfParamSet;
tSirMacIBSSParams ibssParamSet;
tSirMacTim tim;
tSirMacRRMEnabledCap rmEnabledCapabilities;
tANI_U8 ssidPresent;
tANI_U8 suppRatesPresent;
tANI_U8 fhParamPresent;
tANI_U8 dsParamsPresent;
tANI_U8 cfPresent;
tANI_U8 ibssParamPresent;
tANI_U8 timPresent;
tANI_U8 rrmPresent;
} tSirEseBcnReportMandatoryIe, *tpSirEseBcnReportMandatoryIe;
#endif /* FEATURE_WLAN_ESE_UPLOAD */
struct s_ext_cap {
uint8_t bssCoexistMgmtSupport: 1;
uint8_t reserved1: 1;
uint8_t extChanSwitch: 1;
uint8_t reserved2: 1;
uint8_t psmpCap: 1;
uint8_t reserved3: 1;
uint8_t spsmpCap: 1;
uint8_t event: 1;
uint8_t diagnostics: 1;
uint8_t multiDiagnostics: 1;
uint8_t locTracking: 1;
uint8_t FMS: 1;
uint8_t proxyARPService: 1;
uint8_t coLocIntfReporting: 1;
uint8_t civicLoc: 1;
uint8_t geospatialLoc: 1;
uint8_t TFS: 1;
uint8_t wnmSleepMode: 1;
uint8_t timBroadcast: 1;
uint8_t bssTransition: 1;
uint8_t qosTrafficCap: 1;
uint8_t acStaCnt: 1;
uint8_t multiBSSID: 1;
uint8_t timingMeas: 1;
uint8_t chanUsage: 1;
uint8_t ssidList: 1;
uint8_t DMS: 1;
uint8_t UTCTSFOffset: 1;
uint8_t TDLSPeerUAPSDBufferSTA: 1;
uint8_t TDLSPeerPSMSupp: 1;
uint8_t TDLSChannelSwitching: 1;
uint8_t interworkingService: 1;
uint8_t qosMap: 1;
uint8_t EBR: 1;
uint8_t sspnInterface: 1;
uint8_t reserved4: 1;
uint8_t msgCFCap: 1;
uint8_t TDLSSupport: 1;
uint8_t TDLSProhibited: 1;
uint8_t TDLSChanSwitProhibited: 1;
uint8_t rejectUnadmittedTraffic: 1;
uint8_t serviceIntervalGranularity: 3;
uint8_t identifierLoc: 1;
uint8_t uapsdCoexistence: 1;
uint8_t wnmNotification: 1;
uint8_t QABcapbility: 1;
uint8_t UTF8SSID: 1;
uint8_t QMFActivated: 1;
uint8_t QMFreconAct: 1;
uint8_t RobustAVStreaming: 1;
uint8_t AdvancedGCR: 1;
uint8_t MeshGCR: 1;
uint8_t SCS: 1;
uint8_t QLoadReport: 1;
uint8_t AlternateEDCA: 1;
uint8_t UnprotTXOPneg: 1;
uint8_t ProtTXOPneg: 1;
uint8_t reserved6: 1;
uint8_t ProtQLoadReport: 1;
uint8_t TDLSWiderBW: 1;
uint8_t operModeNotification: 1;
uint8_t maxNumOfMSDU_bit1: 1;
uint8_t maxNumOfMSDU_bit2: 1;
uint8_t ChanSchMgmt: 1;
uint8_t GeoDBInbandEnSignal: 1;
uint8_t NwChanControl: 1;
uint8_t WhiteSpaceMap: 1;
uint8_t ChanAvailQuery: 1;
uint8_t fine_time_meas_responder: 1;
uint8_t fine_time_meas_initiator: 1;
};
tANI_U8
sirIsPropCapabilityEnabled(struct sAniSirGlobal *pMac, tANI_U32 bitnum);
void dot11fLog(tpAniSirGlobal pMac, int nSev, const char *lpszFormat, ...);
#define CFG_GET_INT(nStatus, pMac, nItem, cfg ) do { \
(nStatus) = wlan_cfgGetInt( (pMac), (nItem), & (cfg) ); \
if ( eSIR_SUCCESS != (nStatus) ) \
{ \
dot11fLog( (pMac), LOGP, FL("Failed to retrieve " \
#nItem " from CFG (%d)."), \
(nStatus) ); \
return nStatus; \
} \
} while (0)
#define CFG_GET_INT_NO_STATUS(nStatus, pMac, nItem, cfg ) do { \
(nStatus) = wlan_cfgGetInt( (pMac), (nItem), & (cfg) ); \
if ( eSIR_SUCCESS != (nStatus) ) \
{ \
dot11fLog( (pMac), LOGP, FL("Failed to retrieve " \
#nItem " from CFG (%d)."), \
(nStatus) ); \
return; \
} \
} while (0)
#define CFG_GET_STR(nStatus, pMac, nItem, cfg, nCfg, nMaxCfg) do { \
(nCfg) = (nMaxCfg); \
(nStatus) = wlan_cfgGetStr( (pMac), (nItem), (cfg), & (nCfg) ); \
if ( eSIR_SUCCESS != (nStatus) ) \
{ \
dot11fLog( (pMac), LOGP, FL("Failed to retrieve " \
#nItem " from CFG (%d)."), \
(nStatus) ); \
return nStatus; \
} \
} while (0)
#define CFG_GET_STR_NO_STATUS(nStatus, pMac, nItem, cfg, nCfg, \
nMaxCfg) do { \
(nCfg) = (nMaxCfg); \
(nStatus) = wlan_cfgGetStr( (pMac), (nItem), (cfg), & (nCfg) ); \
if ( eSIR_SUCCESS != (nStatus) ) \
{ \
dot11fLog( (pMac), LOGP, FL("Failed to retrieve " \
#nItem " from CFG (%d)."), \
(nStatus) ); \
return; \
} \
} while (0)
void swapBitField16(tANI_U16 in, tANI_U16 *out);
// Currently implemented as "shims" between callers & the new framesc-
// generated code:
tSirRetStatus
sirConvertProbeReqFrame2Struct(struct sAniSirGlobal *pMac,
tANI_U8 *frame,
tANI_U32 len,
tpSirProbeReq probe);
tSirRetStatus
sirConvertProbeFrame2Struct(struct sAniSirGlobal *pMac, tANI_U8 *frame,
tANI_U32 len,
tpSirProbeRespBeacon probe);
tSirRetStatus
sirConvertAssocReqFrame2Struct(struct sAniSirGlobal *pMac,
tANI_U8 * frame,
tANI_U32 len,
tpSirAssocReq assoc);
tSirRetStatus
sirConvertAssocRespFrame2Struct(struct sAniSirGlobal *pMac,
tpPESession psessionEntry,
tANI_U8 * frame,
tANI_U32 len,
tpSirAssocRsp assoc);
tSirRetStatus
sirConvertReassocReqFrame2Struct(struct sAniSirGlobal *pMac,
tANI_U8 * frame,
tANI_U32 len,
tpSirAssocReq assoc);
tSirRetStatus
sirParseBeaconIE(struct sAniSirGlobal *pMac,
tpSirProbeRespBeacon pBeaconStruct,
tANI_U8 *pPayload,
tANI_U32 payloadLength);
#if defined(FEATURE_WLAN_ESE_UPLOAD)
tSirRetStatus
sirFillBeaconMandatoryIEforEseBcnReport(tpAniSirGlobal pMac,
tANI_U8 *pPayload,
const tANI_U32 payloadLength,
tANI_U8 **outIeBuf,
tANI_U32 *pOutIeLen);
#endif /* FEATURE_WLAN_ESE_UPLOAD */
tSirRetStatus
sirConvertBeaconFrame2Struct(struct sAniSirGlobal *pMac,
tANI_U8 *pBeaconFrame,
tpSirProbeRespBeacon pBeaconStruct);
tSirRetStatus
sirConvertAuthFrame2Struct(struct sAniSirGlobal *pMac,
tANI_U8 * frame,
tANI_U32 len,
tpSirMacAuthFrameBody auth);
tSirRetStatus
sirConvertAddtsReq2Struct(struct sAniSirGlobal *pMac,
tANI_U8 *frame,
tANI_U32 len,
tSirAddtsReqInfo *addTs);
tSirRetStatus
sirConvertAddtsRsp2Struct(struct sAniSirGlobal *pMac,
tANI_U8 *frame,
tANI_U32 len,
tSirAddtsRspInfo *addts);
tSirRetStatus
sirConvertDeltsReq2Struct(struct sAniSirGlobal *pMac,
tANI_U8 *frame,
tANI_U32 len,
tSirDeltsReqInfo *delTs);
tSirRetStatus
sirConvertQosMapConfigureFrame2Struct(tpAniSirGlobal pMac,
tANI_U8 *pFrame,
tANI_U32 nFrame,
tSirQosMapSet *pQosMapSet);
/**
* \brief Populated a tDot11fFfCapabilities
*
* \sa PopulatedDot11fCapabilities2
*
*
* \param pMac Pointer to the global MAC data structure
*
* \param pDot11f Address of a tDot11fFfCapabilities to be filled in
*
*
* \note If SIR_MAC_PROP_CAPABILITY_11EQOS is enabled, we'll clear the QOS
* bit in pDot11f
*
*
*/
tSirRetStatus
PopulateDot11fCapabilities(tpAniSirGlobal pMac,
tDot11fFfCapabilities *pDot11f,
tpPESession psessionEntry);
/**
* \brief Populated a tDot11fFfCapabilities
*
* \sa PopulatedDot11fCapabilities2
*
*
* \param pMac Pointer to the global MAC data structure
*
* \param pDot11f Address of a tDot11fFfCapabilities to be filled in
*
* \param pSta Pointer to a tDphHashNode representing a peer
*
*
* \note If SIR_MAC_PROP_CAPABILITY_11EQOS is enabled on our peer, we'll
* clear the QOS bit in pDot11f
*
*
*/
struct sDphHashNode;
tSirRetStatus
PopulateDot11fCapabilities2(tpAniSirGlobal pMac,
tDot11fFfCapabilities *pDot11f,
struct sDphHashNode *pSta,
tpPESession psessionEntry);
/// Populate a tDot11fIEChanSwitchAnn
void
PopulateDot11fChanSwitchAnn(tpAniSirGlobal pMac,
tDot11fIEChanSwitchAnn *pDot11f,
tpPESession psessionEntry);
/**
* populate_dot_11_f_ext_chann_switch_ann() - Function to populate ECS
* @mac_ptr: Pointer to PMAC structure
* @dot_11_ptr: ECS element
* @session_entry: PE session entry
*
* This function is used to populate the extended channel switch element
*
* Return: None
*
*/
void
populate_dot_11_f_ext_chann_switch_ann(tpAniSirGlobal mac_ptr,
tDot11fIEext_chan_switch_ann *dot_11_ptr,
tpPESession session_entry);
/// Populate a tDot11fIEChannelSwitchWrapper
void
PopulateDot11fChanSwitchWrapper(tpAniSirGlobal pMac,
tDot11fIEChannelSwitchWrapper *pDot11f,
tpPESession psessionEntry);
#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
/* Populate a tDot11fIEQComVendorIE */
void
populate_dot11f_avoid_channel_ie(tpAniSirGlobal mac_ctx,
tDot11fIEQComVendorIE *dot11f,
tpPESession session_entry);
#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
#ifdef FEATURE_WLAN_SUB_20_MHZ
void
populate_dot11f_sub_20_channel_width_ie(tpAniSirGlobal mac_ctx_ptr,
tDot11fIEQComVendorIE *dot11f_ptr,
tpPESession pe_session);
#else
static inline void
populate_dot11f_sub_20_channel_width_ie(
tpAniSirGlobal mac_ctx_ptr,
tDot11fIEQComVendorIE *dot11f_ptr,
tpPESession pe_session)
{
dot11f_ptr->Sub20Info.present = false;
return;
}
#endif
/// Populate a tDot11fIECountry
tSirRetStatus
PopulateDot11fCountry(tpAniSirGlobal pMac,
tDot11fIECountry *pDot11f, tpPESession psessionEntry);
/// Populated a PopulateDot11fDSParams
tSirRetStatus
PopulateDot11fDSParams(tpAniSirGlobal pMac,
tDot11fIEDSParams *pDot11f, tANI_U8 channel,
tpPESession psessionEntry);
/// Populated a tDot11fIEEDCAParamSet
void
PopulateDot11fEDCAParamSet(tpAniSirGlobal pMac,
tDot11fIEEDCAParamSet *pDot11f,
tpPESession psessionEntry);
tSirRetStatus
PopulateDot11fERPInfo(tpAniSirGlobal pMac,
tDot11fIEERPInfo *pDot11f, tpPESession psessionEntry);
tSirRetStatus
PopulateDot11fExtSuppRates(tpAniSirGlobal pMac,
tANI_U8 nChannelNum, tDot11fIEExtSuppRates *pDot11f,
tpPESession psessionEntry);
#if defined WLAN_FEATURE_VOWIFI
tSirRetStatus
PopulateDot11fBeaconReport(tpAniSirGlobal pMac,
tDot11fIEMeasurementReport *pDot11f,
tSirMacBeaconReport *pBeaconReport );
#endif
/**
* \brief Populate a tDot11fIEExtSuppRates
*
*
* \param pMac Pointer to the global MAC data structure
*
* \param nChannelNum Channel on which the enclosing frame will be going out
*
* \param pDot11f Address of a tDot11fIEExtSuppRates struct to be filled in.
*
*
* This method is a NOP if the channel is greater than 14.
*
*
*/
tSirRetStatus
PopulateDot11fExtSuppRates1(tpAniSirGlobal pMac,
tANI_U8 nChannelNum,
tDot11fIEExtSuppRates *pDot11f);
tSirRetStatus
PopulateDot11fHTCaps(tpAniSirGlobal pMac,
tpPESession psessionEntry,
tDot11fIEHTCaps *pDot11f);
tSirRetStatus
PopulateDot11fHTInfo(tpAniSirGlobal pMac,
tDot11fIEHTInfo *pDot11f,
tpPESession psessionEntry);
void PopulateDot11fIBSSParams(tpAniSirGlobal pMac,
tDot11fIEIBSSParams *pDot11f, tpPESession psessionEntry);
/// Populate a tDot11fIEPowerCaps
void
PopulateDot11fPowerCaps(tpAniSirGlobal pMac,
tDot11fIEPowerCaps *pCaps,
tANI_U8 nAssocType,tpPESession psessionEntry);
/// Populate a tDot11fIEPowerConstraints
tSirRetStatus
PopulateDot11fPowerConstraints(tpAniSirGlobal pMac,
tDot11fIEPowerConstraints *pDot11f);
void
PopulateDot11fQOSCapsAp(tpAniSirGlobal pMac,
tDot11fIEQOSCapsAp *pDot11f, tpPESession psessionEntry);
void
PopulateDot11fQOSCapsStation(tpAniSirGlobal pMac,
tDot11fIEQOSCapsStation *pDot11f);
tSirRetStatus
PopulateDot11fRSN(tpAniSirGlobal pMac,
tpSirRSNie pRsnIe,
tDot11fIERSN *pDot11f);
tSirRetStatus
PopulateDot11fRSNOpaque( tpAniSirGlobal pMac,
tpSirRSNie pRsnIe,
tDot11fIERSNOpaque *pDot11f );
#if defined(FEATURE_WLAN_WAPI)
tSirRetStatus
PopulateDot11fWAPI(tpAniSirGlobal pMac,
tpSirRSNie pRsnIe,
tDot11fIEWAPI *pDot11f);
tSirRetStatus PopulateDot11fWAPIOpaque( tpAniSirGlobal pMac,
tpSirRSNie pRsnIe,
tDot11fIEWAPIOpaque *pDot11f );
#endif //defined(FEATURE_WLAN_WAPI)
/// Populate a tDot11fIESSID given a tSirMacSSid
void
PopulateDot11fSSID(tpAniSirGlobal pMac,
tSirMacSSid *pInternal,
tDot11fIESSID *pDot11f);
/// Populate a tDot11fIESSID from CFG
tSirRetStatus
PopulateDot11fSSID2(tpAniSirGlobal pMac,
tDot11fIESSID *pDot11f);
/**
* \brief Populate a tDot11fIESchedule
*
* \sa PopulateDot11fWMMSchedule
*
*
* \param pSchedule Address of a tSirMacScheduleIE struct
*
* \param pDot11f Address of a tDot11fIESchedule to be filled in
*
*
*/
void
PopulateDot11fSchedule(tSirMacScheduleIE *pSchedule,
tDot11fIESchedule *pDot11f);
void
PopulateDot11fSuppChannels(tpAniSirGlobal pMac,
tDot11fIESuppChannels *pDot11f,
tANI_U8 nAssocType,tpPESession psessionEntry);
/**
* \brief Populated a tDot11fIESuppRates
*
*
* \param pMac Pointer to the global MAC data structure
*
* \param nChannelNum Channel the enclosing frame will be going out on; see
* below
*
* \param pDot11f Address of a tDot11fIESuppRates struct to be filled in.
*
*
* If nChannelNum is greater than 13, the supported rates will be
* WNI_CFG_SUPPORTED_RATES_11B. If it is less than or equal to 13, the
* supported rates will be WNI_CFG_SUPPORTED_RATES_11A. If nChannelNum is
* set to the sentinel value POPULATE_DOT11F_RATES_OPERATIONAL, the struct
* will be populated with WNI_CFG_OPERATIONAL_RATE_SET.
*
*
*/
#define POPULATE_DOT11F_RATES_OPERATIONAL ( 0xff )
tSirRetStatus
PopulateDot11fSuppRates(tpAniSirGlobal pMac,
tANI_U8 nChannelNum,
tDot11fIESuppRates *pDot11f,tpPESession);
tSirRetStatus
populate_dot11f_rates_tdls(tpAniSirGlobal p_mac,
tDot11fIESuppRates *p_supp_rates,
tDot11fIEExtSuppRates *p_ext_supp_rates,
uint8_t curr_oper_channel);
tSirRetStatus PopulateDot11fTPCReport(tpAniSirGlobal pMac,
tDot11fIETPCReport *pDot11f,
tpPESession psessionEntry);
/// Populate a tDot11FfTSInfo
void PopulateDot11fTSInfo(tSirMacTSInfo *pInfo,
tDot11fFfTSInfo *pDot11f);
void PopulateDot11fWMM(tpAniSirGlobal pMac,
tDot11fIEWMMInfoAp *pInfo,
tDot11fIEWMMParams *pParams,
tDot11fIEWMMCaps *pCaps,
tpPESession psessionEntry);
void PopulateDot11fWMMCaps(tDot11fIEWMMCaps *pCaps);
#if defined(FEATURE_WLAN_ESE)
// Fill the ESE version IE
void PopulateDot11fESEVersion(tDot11fIEESEVersion *pESEVersion);
// Fill the Radio Management Capability
void PopulateDot11fESERadMgmtCap(tDot11fIEESERadMgmtCap *pESERadMgmtCap);
// Fill the CCKM IE
tSirRetStatus PopulateDot11fESECckmOpaque( tpAniSirGlobal pMac,
tpSirCCKMie pCCKMie,
tDot11fIEESECckmOpaque *pDot11f );
void PopulateDot11TSRSIE(tpAniSirGlobal pMac,
tSirMacESETSRSIE *pOld,
tDot11fIEESETrafStrmRateSet *pDot11f,
tANI_U8 rate_length);
void PopulateDot11fReAssocTspec(tpAniSirGlobal pMac, tDot11fReAssocRequest *pReassoc, tpPESession psessionEntry);
#endif
void PopulateDot11fWMMInfoAp(tpAniSirGlobal pMac,
tDot11fIEWMMInfoAp *pInfo,
tpPESession psessionEntry);
void PopulateDot11fWMMInfoStation(tpAniSirGlobal pMac,
tDot11fIEWMMInfoStation *pInfo);
void PopulateDot11fWMMInfoStationPerSession(tpAniSirGlobal pMac,
tpPESession psessionEntry,
tDot11fIEWMMInfoStation *pInfo);
void PopulateDot11fWMMParams(tpAniSirGlobal pMac,
tDot11fIEWMMParams *pParams,
tpPESession psessionEntry);
/**
* \brief Populate a tDot11fIEWMMSchedule
*
* \sa PopulatedDot11fSchedule
*
*
* \param pSchedule Address of a tSirMacScheduleIE struct
*
* \param pDot11f Address of a tDot11fIEWMMSchedule to be filled in
*
*
*/
void
PopulateDot11fWMMSchedule(tSirMacScheduleIE *pSchedule,
tDot11fIEWMMSchedule *pDot11f);
tSirRetStatus
PopulateDot11fWPA(tpAniSirGlobal pMac,
tpSirRSNie pRsnIe,
tDot11fIEWPA *pDot11f);
tSirRetStatus
PopulateDot11fWPAOpaque( tpAniSirGlobal pMac,
tpSirRSNie pRsnIe,
tDot11fIEWPAOpaque *pDot11f );
void
PopulateDot11fTSPEC(tSirMacTspecIE *pOld,
tDot11fIETSPEC *pDot11f);
void
PopulateDot11fWMMTSPEC(tSirMacTspecIE *pOld,
tDot11fIEWMMTSPEC *pDot11f);
tSirRetStatus
PopulateDot11fTCLAS(tpAniSirGlobal pMac,
tSirTclasInfo *pOld,
tDot11fIETCLAS *pDot11f);
tSirRetStatus
PopulateDot11fWMMTCLAS(tpAniSirGlobal pMac,
tSirTclasInfo *pOld,
tDot11fIEWMMTCLAS *pDot11f);
tSirRetStatus PopulateDot11fWsc(tpAniSirGlobal pMac,
tDot11fIEWscBeacon *pDot11f);
tSirRetStatus PopulateDot11fWscRegistrarInfo(tpAniSirGlobal pMac,
tDot11fIEWscBeacon *pDot11f);
tSirRetStatus DePopulateDot11fWscRegistrarInfo(tpAniSirGlobal pMac,
tDot11fIEWscBeacon *pDot11f);
tSirRetStatus PopulateDot11fProbeResWPSIEs(tpAniSirGlobal pMac, tDot11fIEWscProbeRes *pDot11f, tpPESession psessionEntry);
tSirRetStatus PopulateDot11fAssocResWPSIEs(tpAniSirGlobal pMac, tDot11fIEWscAssocRes *pDot11f, tpPESession psessionEntry);
tSirRetStatus PopulateDot11fBeaconWPSIEs(tpAniSirGlobal pMac, tDot11fIEWscBeacon *pDot11f, tpPESession psessionEntry);
tSirRetStatus PopulateDot11fWscInProbeRes(tpAniSirGlobal pMac,
tDot11fIEWscProbeRes *pDot11f);
tSirRetStatus PopulateDot11fWscRegistrarInfoInProbeRes(tpAniSirGlobal pMac,
tDot11fIEWscProbeRes *pDot11f);
tSirRetStatus DePopulateDot11fWscRegistrarInfoInProbeRes(tpAniSirGlobal pMac,
tDot11fIEWscProbeRes *pDot11f);
tSirRetStatus PopulateDot11fAssocResWscIE(tpAniSirGlobal pMac,
tDot11fIEWscAssocRes *pDot11f,
tpSirAssocReq pRcvdAssocReq);
tSirRetStatus PopulateDot11AssocResP2PIE(tpAniSirGlobal pMac,
tDot11fIEP2PAssocRes *pDot11f,
tpSirAssocReq pRcvdAssocReq);
tSirRetStatus PopulateDot11fWscInAssocRes(tpAniSirGlobal pMac,
tDot11fIEWscAssocRes *pDot11f);
#if defined WLAN_FEATURE_VOWIFI
tSirRetStatus PopulateDot11fWFATPC( tpAniSirGlobal pMac,
tDot11fIEWFATPC *pDot11f, tANI_U8 txPower, tANI_U8 linkMargin );
tSirRetStatus PopulateDot11fRRMIe( tpAniSirGlobal pMac,
tDot11fIERRMEnabledCap *pDot11f,
tpPESession psessionEntry );
#endif
#if defined WLAN_FEATURE_VOWIFI_11R
void PopulateMDIE( tpAniSirGlobal pMac,
tDot11fIEMobilityDomain *pDot11f, tANI_U8 mdie[] );
void PopulateFTInfo( tpAniSirGlobal pMac,
tDot11fIEFTInfo *pDot11f );
#endif
void PopulateDot11fAssocRspRates ( tpAniSirGlobal pMac, tDot11fIESuppRates *pSupp,
tDot11fIEExtSuppRates *pExt, tANI_U16 *_11bRates, tANI_U16 *_11aRates );
int FindIELocation( tpAniSirGlobal pMac,
tpSirRSNie pRsnIe,
tANI_U8 EID);
#ifdef WLAN_FEATURE_11AC
tSirRetStatus
PopulateDot11fVHTCaps(tpAniSirGlobal pMac, tpPESession psessionEntry,
tDot11fIEVHTCaps *pDot11f);
tSirRetStatus
PopulateDot11fVHTOperation(tpAniSirGlobal pMac,
tpPESession psessionEntry,
tDot11fIEVHTOperation *pDot11f);
tSirRetStatus
PopulateDot11fVHTExtBssLoad(tpAniSirGlobal pMac, tDot11fIEVHTExtBssLoad *pDot11f);
tSirRetStatus
PopulateDot11fExtCap(tpAniSirGlobal pMac, tANI_BOOLEAN isVHTEnabled,
tDot11fIEExtCap * pDot11f, tpPESession psessionEntry);
tSirRetStatus
PopulateDot11fOperatingMode(tpAniSirGlobal pMac, tDot11fIEOperatingMode *pDot11f, tpPESession psessionEntry );
void
PopulateDot11fWiderBWChanSwitchAnn(tpAniSirGlobal pMac,
tDot11fIEWiderBWChanSwitchAnn *pDot11f,
tpPESession psessionEntry);
#endif
void PopulateDot11fTimeoutInterval( tpAniSirGlobal pMac,
tDot11fIETimeoutInterval *pDot11f,
tANI_U8 type, tANI_U32 value );
void populate_dot11_supp_operating_classes(tpAniSirGlobal mac_ptr,
tDot11fIESuppOperatingClasses *dot_11_ptr,
tpPESession session_entry);
#ifdef SAP_AUTH_OFFLOAD
void
sap_auth_offload_update_rsn_ie(tpAniSirGlobal pmac,
tDot11fIERSNOpaque *pdot11f);
#endif /* SAP_AUTH_OFFLOAD */
tSirRetStatus PopulateDot11fTimingAdvertFrame(tpAniSirGlobal pMac,
tDot11fTimingAdvertisementFrame *frame);
tSirRetStatus sirvalidateandrectifyies(tpAniSirGlobal pMac,
tANI_U8 *pMgmtFrame,
tANI_U32 nFrameBytes,
tANI_U32 *nMissingRsnBytes);
/**
* sir_copy_hs20_ie() - Update HS 2.0 Information Element.
* @dest: dest HS IE buffer to be updated
* @src: src HS IE buffer
*
* Update HS2.0 IE info from src to dest
*
* Return: void
*/
void sir_copy_hs20_ie(tDot11fIEhs20vendor_ie *dest,
tDot11fIEhs20vendor_ie *src);
#ifdef WLAN_FEATURE_FILS_SK
/**
* populate_dot11f_fils_params() - Populate FILS IE to frame
* @mac_ctx: global mac context
* @frm: Assoc request frame
* @pe_session: PE session
*
* This API is used to populate FILS IE to Association request
*
* Return: None
*/
void populate_dot11f_fils_params(tpAniSirGlobal mac_ctx,
tDot11fAssocRequest *frm,
tpPESession pe_session);
#else
static inline void populate_dot11f_fils_params(tpAniSirGlobal mac_ctx,
tDot11fAssocRequest *frm,
tpPESession pe_session)
{}
#endif
#endif /* __PARSE_H__ */