blob: 9b91902ae7de78a3bb872e00f398d26595c3cb25 [file] [log] [blame]
/*
* Copyright (c) 2011-2014 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 utils_parser.cc contains the code for parsing
* 802.11 messages.
* Author: Pierre Vandwalle
* Date: 03/18/02
* History:-
* Date Modified by Modification Information
* --------------------------------------------------------------------
*
*/
#include "ani_global.h"
#include "utils_parser.h"
#include "lim_ser_des_utils.h"
void convert_ssid(tpAniSirGlobal pMac, tSirMacSSid *pOld, tDot11fIESSID *pNew)
{
pOld->length = pNew->num_ssid;
cdf_mem_copy(pOld->ssId, pNew->ssid, pNew->num_ssid);
}
void convert_supp_rates(tpAniSirGlobal pMac,
tSirMacRateSet *pOld, tDot11fIESuppRates *pNew)
{
pOld->numRates = pNew->num_rates;
cdf_mem_copy(pOld->rate, pNew->rates, pNew->num_rates);
}
void convert_ext_supp_rates(tpAniSirGlobal pMac,
tSirMacRateSet *pOld, tDot11fIEExtSuppRates *pNew)
{
pOld->numRates = pNew->num_rates;
cdf_mem_copy(pOld->rate, pNew->rates, pNew->num_rates);
}
void convert_qos_caps(tpAniSirGlobal pMac,
tSirMacQosCapabilityIE *pOld, tDot11fIEQOSCapsAp *pNew)
{
pOld->type = 46;
pOld->length = 1;
pOld->qosInfo.count = pNew->count;
}
void convert_qos_caps_station(tpAniSirGlobal pMac,
tSirMacQosCapabilityStaIE *pOld,
tDot11fIEQOSCapsStation *pNew)
{
pOld->type = 46;
pOld->length = 1;
pOld->qosInfo.moreDataAck = pNew->more_data_ack;
pOld->qosInfo.maxSpLen = pNew->max_sp_length;
pOld->qosInfo.qack = pNew->qack;
pOld->qosInfo.acbe_uapsd = pNew->acbe_uapsd;
pOld->qosInfo.acbk_uapsd = pNew->acbk_uapsd;
pOld->qosInfo.acvi_uapsd = pNew->acvi_uapsd;
pOld->qosInfo.acvo_uapsd = pNew->acvo_uapsd;
}
tSirRetStatus convert_wpa(tpAniSirGlobal pMac,
tSirMacWpaInfo *pOld, tDot11fIEWPA *pNew)
{
/* This is awful, I know, but the old code just rammed the IE into an */
/* array... */
uint8_t buffer[257];
uint32_t status, written = 0, nbuffer = 257;
status = dot11f_pack_ie_wpa(pMac, pNew, buffer, nbuffer, &written);
if (DOT11F_FAILED(status)) {
dot11f_log(pMac, LOG2, FL("Failed to re-pack the WPA IE (0x%0x"
"8).\n"), status);
return eSIR_FAILURE;
}
pOld->length = (uint8_t) written - 2;
cdf_mem_copy(pOld->info, buffer + 2, pOld->length);
return eSIR_SUCCESS;
}
tSirRetStatus convert_wpa_opaque(tpAniSirGlobal pMac,
tSirMacWpaInfo *pOld, tDot11fIEWPAOpaque *pNew)
{
/* This is awful, I know, but the old code just rammed the IE into */
/* an opaque array. Note that we need to explicitly add the OUI! */
pOld->length = pNew->num_data + 4;
pOld->info[0] = 0x00;
pOld->info[1] = 0x50;
pOld->info[2] = 0xf2;
pOld->info[3] = 0x01;
cdf_mem_copy(pOld->info + 4, pNew->data, pNew->num_data);
return eSIR_SUCCESS;
}
#ifdef FEATURE_WLAN_WAPI
tSirRetStatus convert_wapi_opaque(tpAniSirGlobal pMac,
tSirMacWapiInfo *pOld,
tDot11fIEWAPIOpaque *pNew)
{
/* This is awful, I know, but the old code just rammed the IE into */
/* an opaque array. Note that we need to explicitly add the OUI! */
pOld->length = pNew->num_data;
cdf_mem_copy(pOld->info, pNew->data, pNew->num_data);
return eSIR_SUCCESS;
}
#endif
tSirRetStatus convert_wsc_opaque(tpAniSirGlobal pMac,
tSirAddie *pOld, tDot11fIEWscIEOpaque *pNew)
{
/* This is awful, I know, but the old code just rammed the IE into */
/* an opaque array. Note that we need to explicitly add the vendorIE and OUI ! */
uint8_t curAddIELen = pOld->length;
pOld->length = curAddIELen + pNew->num_data + 6;
pOld->addIEdata[curAddIELen++] = 0xdd;
pOld->addIEdata[curAddIELen++] = pNew->num_data + 4;
pOld->addIEdata[curAddIELen++] = 0x00;
pOld->addIEdata[curAddIELen++] = 0x50;
pOld->addIEdata[curAddIELen++] = 0xf2;
pOld->addIEdata[curAddIELen++] = 0x04;
cdf_mem_copy(pOld->addIEdata + curAddIELen, pNew->data, pNew->num_data);
return eSIR_SUCCESS;
}
tSirRetStatus convert_p2p_opaque(tpAniSirGlobal pMac,
tSirAddie *pOld, tDot11fIEP2PIEOpaque *pNew)
{
/* This is awful, I know, but the old code just rammed the IE into */
/* an opaque array. Note that we need to explicitly add the vendorIE and OUI ! */
uint8_t curAddIELen = pOld->length;
pOld->length = curAddIELen + pNew->num_data + 6;
pOld->addIEdata[curAddIELen++] = 0xdd;
pOld->addIEdata[curAddIELen++] = pNew->num_data + 4;
pOld->addIEdata[curAddIELen++] = 0x50;
pOld->addIEdata[curAddIELen++] = 0x6f;
pOld->addIEdata[curAddIELen++] = 0x9A;
pOld->addIEdata[curAddIELen++] = 0x09;
cdf_mem_copy(pOld->addIEdata + curAddIELen, pNew->data, pNew->num_data);
return eSIR_SUCCESS;
}
#ifdef WLAN_FEATURE_WFD
tSirRetStatus convert_wfd_opaque(tpAniSirGlobal pMac,
tSirAddie *pOld, tDot11fIEWFDIEOpaque *pNew)
{
/* This is awful, I know, but the old code just rammed the IE into */
/* an opaque array. Note that we need to explicitly add the vendorIE and OUI ! */
uint8_t curAddIELen = pOld->length;
pOld->length = curAddIELen + pNew->num_data + 6;
pOld->addIEdata[curAddIELen++] = 0xdd;
pOld->addIEdata[curAddIELen++] = pNew->num_data + 4;
pOld->addIEdata[curAddIELen++] = 0x50;
pOld->addIEdata[curAddIELen++] = 0x6f;
pOld->addIEdata[curAddIELen++] = 0x9A;
pOld->addIEdata[curAddIELen++] = 0x0a;
cdf_mem_copy(pOld->addIEdata + curAddIELen, pNew->data, pNew->num_data);
return eSIR_SUCCESS;
}
#endif
tSirRetStatus convert_rsn(tpAniSirGlobal pMac,
tSirMacRsnInfo *pOld, tDot11fIERSN *pNew)
{
uint8_t buffer[257];
uint32_t status, written = 0, nbuffer = 257;
status = dot11f_pack_ie_rsn(pMac, pNew, buffer, nbuffer, &written);
if (DOT11F_FAILED(status)) {
dot11f_log(pMac, LOG2, FL("Failed to re-pack the RSN IE (0x%0x"
"8).\n"), status);
return eSIR_FAILURE;
}
pOld->length = (uint8_t) written - 2;
cdf_mem_copy(pOld->info, buffer + 2, pOld->length);
return eSIR_SUCCESS;
}
tSirRetStatus convert_rsn_opaque(tpAniSirGlobal pMac,
tSirMacRsnInfo *pOld, tDot11fIERSNOpaque *pNew)
{
/* This is awful, I know, but the old code just rammed the IE into */
/* an opaque array. */
pOld->length = pNew->num_data;
cdf_mem_copy(pOld->info, pNew->data, pOld->length);
return eSIR_SUCCESS;
}
void convert_power_caps(tpAniSirGlobal pMac,
tSirMacPowerCapabilityIE *pOld,
tDot11fIEPowerCaps *pNew)
{
pOld->type = 33;
pOld->length = 2;
pOld->minTxPower = pNew->minTxPower;
pOld->maxTxPower = pNew->maxTxPower;
}
void convert_supp_channels(tpAniSirGlobal pMac,
tSirMacSupportedChannelIE *pOld,
tDot11fIESuppChannels *pNew)
{
pOld->type = 36;
pOld->length = (pNew->num_bands * 2);
cdf_mem_copy((uint8_t *) pOld->supportedChannels,
(uint8_t *) pNew->bands, pOld->length);
}
void convert_cf_params(tpAniSirGlobal pMac,
tSirMacCfParamSet *pOld, tDot11fIECFParams *pNew)
{
pOld->cfpCount = pNew->cfp_count;
pOld->cfpPeriod = pNew->cfp_period;
pOld->cfpMaxDuration = pNew->cfp_maxduration;
pOld->cfpDurRemaining = pNew->cfp_durremaining;
}
void convert_fh_params(tpAniSirGlobal pMac,
tSirMacFHParamSet *pOld, tDot11fIEFHParamSet *pNew)
{
pOld->dwellTime = pNew->dwell_time;
pOld->hopSet = pNew->hop_set;
pOld->hopPattern = pNew->hop_pattern;
pOld->hopIndex = pNew->hop_index;
}
void convert_tim(tpAniSirGlobal pMac, tSirMacTim *pOld, tDot11fIETIM *pNew)
{
pOld->dtimCount = pNew->dtim_count;
pOld->dtimPeriod = pNew->dtim_period;
pOld->bitmapControl = pNew->bmpctl;
pOld->bitmapLength = pNew->num_vbmp;
cdf_mem_copy(pOld->bitmap, pNew->vbmp, pNew->num_vbmp);
}
void convert_country(tpAniSirGlobal pMac,
tSirCountryInformation *pOld, tDot11fIECountry *pNew)
{
int i;
cdf_mem_copy(pOld->countryString, pNew->country, COUNTRY_STRING_LENGTH);
pOld->numIntervals = pNew->num_triplets;
for (i = 0; i < pNew->num_triplets; ++i) {
pOld->channelTransmitPower[i].channelNumber =
pNew->triplets[i][0];
pOld->channelTransmitPower[i].numChannel = pNew->triplets[i][1];
pOld->channelTransmitPower[i].maxTransmitPower =
pNew->triplets[i][2];
}
}
void convert_wmm_params(tpAniSirGlobal pMac,
tSirMacEdcaParamSetIE *pOld, tDot11fIEWMMParams *pNew)
{
pOld->type = 221;
pOld->length = 24;
cdf_mem_copy((uint8_t *) &pOld->qosInfo, (uint8_t *) &pNew->qosInfo,
1);
pOld->acbe.aci.aifsn = pNew->acbe_aifsn;
pOld->acbe.aci.acm = pNew->acbe_acm;
pOld->acbe.aci.aci = pNew->acbe_aci;
pOld->acbe.cw.min = pNew->acbe_acwmin;
pOld->acbe.cw.max = pNew->acbe_acwmax;
pOld->acbe.txoplimit = pNew->acbe_txoplimit;
pOld->acbk.aci.aifsn = pNew->acbk_aifsn;
pOld->acbk.aci.acm = pNew->acbk_acm;
pOld->acbk.aci.aci = pNew->acbk_aci;
pOld->acbk.cw.min = pNew->acbk_acwmin;
pOld->acbk.cw.max = pNew->acbk_acwmax;
pOld->acbk.txoplimit = pNew->acbk_txoplimit;
pOld->acvi.aci.aifsn = pNew->acvi_aifsn;
pOld->acvi.aci.acm = pNew->acvi_acm;
pOld->acvi.aci.aci = pNew->acvi_aci;
pOld->acvi.cw.min = pNew->acvi_acwmin;
pOld->acvi.cw.max = pNew->acvi_acwmax;
pOld->acvi.txoplimit = pNew->acvi_txoplimit;
pOld->acvo.aci.aifsn = pNew->acvo_aifsn;
pOld->acvo.aci.acm = pNew->acvo_acm;
pOld->acvo.aci.aci = pNew->acvo_aci;
pOld->acvo.cw.min = pNew->acvo_acwmin;
pOld->acvo.cw.max = pNew->acvo_acwmax;
pOld->acvo.txoplimit = pNew->acvo_txoplimit;
}
void convert_erp_info(tpAniSirGlobal pMac,
tSirMacErpInfo *pOld, tDot11fIEERPInfo *pNew)
{
pOld->nonErpPresent = pNew->non_erp_present;
pOld->useProtection = pNew->use_prot;
pOld->barkerPreambleMode = pNew->barker_preamble;
}
void convert_edca_param(tpAniSirGlobal pMac,
tSirMacEdcaParamSetIE *pOld,
tDot11fIEEDCAParamSet *pNew)
{
pOld->type = 12;
pOld->length = 20;
cdf_mem_copy((uint8_t *) &pOld->qosInfo, (uint8_t *) &pNew->qos, 1);
pOld->acbe.aci.aifsn = pNew->acbe_aifsn;
pOld->acbe.aci.acm = pNew->acbe_acm;
pOld->acbe.aci.aci = pNew->acbe_aci;
pOld->acbe.cw.min = pNew->acbe_acwmin;
pOld->acbe.cw.max = pNew->acbe_acwmax;
pOld->acbe.txoplimit = pNew->acbe_txoplimit;
pOld->acbk.aci.aifsn = pNew->acbk_aifsn;
pOld->acbk.aci.acm = pNew->acbk_acm;
pOld->acbk.aci.aci = pNew->acbk_aci;
pOld->acbk.cw.min = pNew->acbk_acwmin;
pOld->acbk.cw.max = pNew->acbk_acwmax;
pOld->acbk.txoplimit = pNew->acbk_txoplimit;
pOld->acvi.aci.aifsn = pNew->acvi_aifsn;
pOld->acvi.aci.acm = pNew->acvi_acm;
pOld->acvi.aci.aci = pNew->acvi_aci;
pOld->acvi.cw.min = pNew->acvi_acwmin;
pOld->acvi.cw.max = pNew->acvi_acwmax;
pOld->acvi.txoplimit = pNew->acvi_txoplimit;
pOld->acvo.aci.aifsn = pNew->acvo_aifsn;
pOld->acvo.aci.acm = pNew->acvo_acm;
pOld->acvo.aci.aci = pNew->acvo_aci;
pOld->acvo.cw.min = pNew->acvo_acwmin;
pOld->acvo.cw.max = pNew->acvo_acwmax;
pOld->acvo.txoplimit = pNew->acvo_txoplimit;
}
void convert_tspec(tpAniSirGlobal pMac,
tSirMacTspecIE *pOld, tDot11fIETSPEC *pNew)
{
pOld->tsinfo.traffic.trafficType = (uint16_t) pNew->traffic_type;
pOld->tsinfo.traffic.tsid = (uint16_t) pNew->tsid;
pOld->tsinfo.traffic.direction = (uint16_t) pNew->direction;
pOld->tsinfo.traffic.accessPolicy = (uint16_t) pNew->access_policy;
pOld->tsinfo.traffic.aggregation = (uint16_t) pNew->aggregation;
pOld->tsinfo.traffic.psb = (uint16_t) pNew->psb;
pOld->tsinfo.traffic.userPrio = (uint16_t) pNew->user_priority;
pOld->tsinfo.traffic.ackPolicy = (uint16_t) pNew->tsinfo_ack_pol;
pOld->tsinfo.schedule.schedule = (uint8_t) pNew->schedule;
pOld->nomMsduSz = pNew->size;
pOld->maxMsduSz = pNew->max_msdu_size;
pOld->minSvcInterval = pNew->min_service_int;
pOld->maxSvcInterval = pNew->max_service_int;
pOld->inactInterval = pNew->inactivity_int;
pOld->suspendInterval = pNew->suspension_int;
pOld->svcStartTime = pNew->service_start_time;
pOld->minDataRate = pNew->min_data_rate;
pOld->meanDataRate = pNew->mean_data_rate;
pOld->peakDataRate = pNew->peak_data_rate;
pOld->maxBurstSz = pNew->burst_size;
pOld->delayBound = pNew->delay_bound;
pOld->minPhyRate = pNew->min_phy_rate;
pOld->surplusBw = pNew->surplus_bw_allowance;
pOld->mediumTime = pNew->medium_time;
}
tSirRetStatus convert_tclas(tpAniSirGlobal pMac,
tSirTclasInfo *pOld, tDot11fIETCLAS *pNew)
{
uint32_t length = 0;
if (DOT11F_FAILED(dot11f_get_packed_ietclas(pMac, pNew, &length))) {
return eSIR_FAILURE;
}
pOld->tclas.type = DOT11F_EID_TCLAS;
pOld->tclas.length = (uint8_t) length;
pOld->tclas.userPrio = pNew->user_priority;
pOld->tclas.classifierType = pNew->classifier_type;
pOld->tclas.classifierMask = pNew->classifier_mask;
switch (pNew->classifier_type) {
case 0:
cdf_mem_copy(pOld->tclasParams.eth.srcAddr,
pNew->info.EthParams.source, 6);
cdf_mem_copy(pOld->tclasParams.eth.dstAddr,
pNew->info.EthParams.dest, 6);
pOld->tclasParams.eth.type = pNew->info.EthParams.type;
break;
case 1:
pOld->version = pNew->info.IpParams.version;
if (4 == pNew->info.IpParams.version) {
pOld->tclasParams.ipv4.version = 4;
cdf_mem_copy(pOld->tclasParams.ipv4.srcIpAddr,
pNew->info.IpParams.params.IpV4Params.
source, 4);
cdf_mem_copy(pOld->tclasParams.ipv4.dstIpAddr,
pNew->info.IpParams.params.IpV4Params.dest,
4);
pOld->tclasParams.ipv4.srcPort =
pNew->info.IpParams.params.IpV4Params.src_port;
pOld->tclasParams.ipv4.dstPort =
pNew->info.IpParams.params.IpV4Params.dest_port;
pOld->tclasParams.ipv4.dscp =
pNew->info.IpParams.params.IpV4Params.DSCP;
pOld->tclasParams.ipv4.protocol =
pNew->info.IpParams.params.IpV4Params.proto;
pOld->tclasParams.ipv4.rsvd =
pNew->info.IpParams.params.IpV4Params.reserved;
} else if (6 == pNew->info.IpParams.version) {
pOld->tclasParams.ipv6.version = 6;
cdf_mem_copy((uint8_t *) pOld->tclasParams.ipv6.
srcIpAddr,
(uint8_t *) pNew->info.IpParams.params.
IpV6Params.source, 16);
cdf_mem_copy((uint8_t *) pOld->tclasParams.ipv6.
dstIpAddr,
(uint8_t *) pNew->info.IpParams.params.
IpV6Params.dest, 16);
pOld->tclasParams.ipv6.srcPort =
pNew->info.IpParams.params.IpV6Params.src_port;
pOld->tclasParams.ipv6.dstPort =
pNew->info.IpParams.params.IpV6Params.dest_port;
cdf_mem_copy((uint8_t *) pOld->tclasParams.ipv6.
flowLabel,
(uint8_t *) pNew->info.IpParams.params.
IpV6Params.flow_label, 3);
} else {
return eSIR_FAILURE;
}
break;
case 2:
pOld->tclasParams.t8021dq.tag =
pNew->info.Params8021dq.tag_type;
break;
default:
return eSIR_FAILURE;
}
return eSIR_SUCCESS;
}
void convert_wmmtspec(tpAniSirGlobal pMac,
tSirMacTspecIE *pOld, tDot11fIEWMMTSPEC *pNew)
{
pOld->tsinfo.traffic.trafficType = (uint16_t) pNew->traffic_type;
pOld->tsinfo.traffic.tsid = (uint16_t) pNew->tsid;
pOld->tsinfo.traffic.direction = (uint16_t) pNew->direction;
pOld->tsinfo.traffic.accessPolicy = (uint16_t) pNew->access_policy;
pOld->tsinfo.traffic.aggregation = (uint16_t) pNew->aggregation;
pOld->tsinfo.traffic.psb = (uint16_t) pNew->psb;
pOld->tsinfo.traffic.userPrio = (uint16_t) pNew->user_priority;
pOld->tsinfo.traffic.ackPolicy = (uint16_t) pNew->tsinfo_ack_pol;
pOld->nomMsduSz = (pNew->fixed << 15) | pNew->size;
pOld->maxMsduSz = pNew->max_msdu_size;
pOld->minSvcInterval = pNew->min_service_int;
pOld->maxSvcInterval = pNew->max_service_int;
pOld->inactInterval = pNew->inactivity_int;
pOld->suspendInterval = pNew->suspension_int;
pOld->svcStartTime = pNew->service_start_time;
pOld->minDataRate = pNew->min_data_rate;
pOld->meanDataRate = pNew->mean_data_rate;
pOld->peakDataRate = pNew->peak_data_rate;
pOld->maxBurstSz = pNew->burst_size;
pOld->delayBound = pNew->delay_bound;
pOld->minPhyRate = pNew->min_phy_rate;
pOld->surplusBw = pNew->surplus_bw_allowance;
pOld->mediumTime = pNew->medium_time;
}
tSirRetStatus convert_wmmtclas(tpAniSirGlobal pMac,
tSirTclasInfo *pOld, tDot11fIEWMMTCLAS *pNew)
{
uint32_t length = 0;
if (DOT11F_FAILED(dot11f_get_packed_iewmmtclas(pMac, pNew, &length))) {
return eSIR_FAILURE;
}
pOld->tclas.type = DOT11F_EID_WMMTCLAS;
pOld->tclas.length = (uint8_t) length;
pOld->tclas.userPrio = pNew->user_priority;
pOld->tclas.classifierType = pNew->classifier_type;
pOld->tclas.classifierMask = pNew->classifier_mask;
switch (pNew->classifier_type) {
case 0:
cdf_mem_copy(pOld->tclasParams.eth.srcAddr,
pNew->info.EthParams.source, 6);
cdf_mem_copy(pOld->tclasParams.eth.dstAddr,
pNew->info.EthParams.dest, 6);
pOld->tclasParams.eth.type = pNew->info.EthParams.type;
break;
case 1:
pOld->version = pNew->info.IpParams.version;
if (4 == pNew->info.IpParams.version) {
pOld->tclasParams.ipv4.version = 4;
cdf_mem_copy(pOld->tclasParams.ipv4.srcIpAddr,
pNew->info.IpParams.params.IpV4Params.
source, 4);
cdf_mem_copy(pOld->tclasParams.ipv4.dstIpAddr,
pNew->info.IpParams.params.IpV4Params.dest,
4);
pOld->tclasParams.ipv4.srcPort =
pNew->info.IpParams.params.IpV4Params.src_port;
pOld->tclasParams.ipv4.dstPort =
pNew->info.IpParams.params.IpV4Params.dest_port;
pOld->tclasParams.ipv4.dscp =
pNew->info.IpParams.params.IpV4Params.DSCP;
pOld->tclasParams.ipv4.protocol =
pNew->info.IpParams.params.IpV4Params.proto;
pOld->tclasParams.ipv4.rsvd =
pNew->info.IpParams.params.IpV4Params.reserved;
} else if (6 == pNew->info.IpParams.version) {
pOld->tclasParams.ipv6.version = 6;
cdf_mem_copy((uint8_t *) pOld->tclasParams.ipv6.
srcIpAddr,
(uint8_t *) pNew->info.IpParams.params.
IpV6Params.source, 16);
cdf_mem_copy((uint8_t *) pOld->tclasParams.ipv6.
dstIpAddr,
(uint8_t *) pNew->info.IpParams.params.
IpV6Params.dest, 16);
pOld->tclasParams.ipv6.srcPort =
pNew->info.IpParams.params.IpV6Params.src_port;
pOld->tclasParams.ipv6.dstPort =
pNew->info.IpParams.params.IpV6Params.dest_port;
cdf_mem_copy((uint8_t *) pOld->tclasParams.ipv6.
flowLabel,
(uint8_t *) pNew->info.IpParams.params.
IpV6Params.flow_label, 3);
} else {
return eSIR_FAILURE;
}
break;
case 2:
pOld->tclasParams.t8021dq.tag =
pNew->info.Params8021dq.tag_type;
break;
default:
return eSIR_FAILURE;
}
return eSIR_SUCCESS;
}
void convert_ts_delay(tpAniSirGlobal pMac,
tSirMacTsDelayIE *pOld, tDot11fIETSDelay *pNew)
{
pOld->type = DOT11F_EID_TSDELAY;
pOld->length = 4U;
pOld->delay = pNew->delay;
}
void convert_schedule(tpAniSirGlobal pMac,
tSirMacScheduleIE *pOld, tDot11fIESchedule *pNew)
{
pOld->type = DOT11F_EID_SCHEDULE;
pOld->length = DOT11F_IE_SCHEDULE_MIN_LEN;
pOld->info.aggregation = pNew->aggregation;
pOld->info.tsid = pNew->tsid;
pOld->info.direction = pNew->direction;
pOld->svcStartTime = pNew->service_start_time;
pOld->svcInterval = pNew->service_interval;
pOld->specInterval = pNew->spec_interval;
}
void convert_wmm_schedule(tpAniSirGlobal pMac,
tSirMacScheduleIE *pOld, tDot11fIEWMMSchedule *pNew)
{
pOld->type = DOT11F_EID_WMMSCHEDULE;
pOld->length = DOT11F_IE_WMMSCHEDULE_MIN_LEN;
pOld->info.aggregation = pNew->aggregation;
pOld->info.tsid = pNew->tsid;
pOld->info.direction = pNew->direction;
pOld->svcStartTime = pNew->service_start_time;
pOld->svcInterval = pNew->service_interval;
pOld->specInterval = pNew->spec_interval;
}
/**
@brief : This functions converts the given buffer till given size to Big endian format assuming the
bus is 32 bit. The size should be four byte aligned.
@param : ptr to be converted, size
@return : void
*/
void convertto_big_endian(void *ptr, uint16_t size)
{
uint8_t *temp_ptr;
uint32_t *dest_ptr;
dest_ptr = (uint32_t *) ptr;
while (size) {
temp_ptr = (uint8_t *) dest_ptr;
*dest_ptr =
(temp_ptr[0] << 24) | (temp_ptr[1] << 16) | (temp_ptr[2] <<
8) |
temp_ptr[3];
dest_ptr++;
size -= 4;
}
}
void create_scan_data_null_frame(tpAniSirGlobal pMac, tSirMacMgmtHdr *macMgmtHdr,
uint8_t pwrMgmt, tSirMacAddr bssid,
tSirMacAddr selfMacAddr)
{
macMgmtHdr->fc.type = SIR_MAC_DATA_FRAME;
macMgmtHdr->fc.subType = SIR_MAC_DATA_NULL;
macMgmtHdr->fc.protVer = SIR_MAC_PROTOCOL_VERSION;
macMgmtHdr->fc.order = 0;
macMgmtHdr->fc.wep = 0;
macMgmtHdr->fc.moreData = 0;
macMgmtHdr->fc.powerMgmt = pwrMgmt;
macMgmtHdr->fc.retry = 0;
macMgmtHdr->fc.moreFrag = 0;
macMgmtHdr->fc.fromDS = 0;
macMgmtHdr->fc.toDS = 0;
macMgmtHdr->durationLo =
(uint8_t) (SIR_MAC_MAX_DURATION_MICRO_SECONDS & 0xff);
macMgmtHdr->durationHi =
(uint8_t) ((SIR_MAC_MAX_DURATION_MICRO_SECONDS & 0xff00) >> 8);
macMgmtHdr->seqControl.fragNum = 0;
macMgmtHdr->seqControl.seqNumLo = 0;
macMgmtHdr->seqControl.seqNumHi = 2;
cdf_mem_copy((void *)&macMgmtHdr->da,
(void *)bssid, sizeof(tSirMacAddr));
cdf_mem_copy((void *)&macMgmtHdr->sa,
(void *)selfMacAddr, sizeof(tSirMacAddr));
cdf_mem_copy((void *)&macMgmtHdr->bssId,
(void *)bssid, sizeof(tSirMacAddr));
return;
}
void create_scan_cts_frame(tpAniSirGlobal pMac, tSirMacMgmtHdr *macMgmtHdr,
tSirMacAddr selfMac)
{
macMgmtHdr->fc.type = SIR_MAC_CTRL_FRAME;
macMgmtHdr->fc.subType = SIR_MAC_CTRL_CTS;
macMgmtHdr->fc.order = 0;
macMgmtHdr->fc.wep = 0;
macMgmtHdr->fc.moreData = 0;
macMgmtHdr->fc.powerMgmt = 0;
macMgmtHdr->fc.retry = 0;
macMgmtHdr->fc.moreFrag = 0;
macMgmtHdr->fc.fromDS = 0;
macMgmtHdr->fc.toDS = 0;
macMgmtHdr->durationLo =
(uint8_t) (SIR_MAC_MAX_DURATION_MICRO_SECONDS & 0xff);
macMgmtHdr->durationHi =
(uint8_t) ((SIR_MAC_MAX_DURATION_MICRO_SECONDS & 0xff00) >> 8);
cdf_mem_copy((void *)macMgmtHdr->da, (void *)selfMac,
sizeof(tSirMacAddr));
return;
}
void convert_qos_mapset_frame(tpAniSirGlobal pMac, tSirQosMapSet *Qos,
tDot11fIEQosMapSet *dot11fIE)
{
uint8_t i, j = 0;
Qos->num_dscp_exceptions = (dot11fIE->num_dscp_exceptions - 16) / 2;
for (i = 0; i < Qos->num_dscp_exceptions; i++) {
Qos->dscp_exceptions[i][0] = dot11fIE->dscp_exceptions[j];
j++;
Qos->dscp_exceptions[i][1] = dot11fIE->dscp_exceptions[j];
j++;
}
for (i = 0; i < 8; i++) {
Qos->dscp_range[i][0] = dot11fIE->dscp_exceptions[j];
j++;
Qos->dscp_range[i][1] = dot11fIE->dscp_exceptions[j];
j++;
}
}
/**
@brief : This functions creates a DATA_NULL/CTS2SELF frame in Big endian format
@param : Global MAC structure, pointer to return the created packet, role which is Station/AP
@return : void
*/
void create_init_scan_raw_frame(tpAniSirGlobal pMac, tSirMacMgmtHdr *macMgmtHdr,
tBssSystemRole role)
{
#if 0
tpStaStruct pSta = (tpStaStruct) pMac->hal.halMac.staTable;
if (role == eSYSTEM_STA_ROLE) {
macMgmtHdr->fc.type = SIR_MAC_DATA_FRAME;
macMgmtHdr->fc.subType = SIR_MAC_DATA_NULL;
macMgmtHdr->fc.protVer = SIR_MAC_PROTOCOL_VERSION;
macMgmtHdr->fc.order = 0;
macMgmtHdr->fc.wep = 0;
macMgmtHdr->fc.moreData = 0;
macMgmtHdr->fc.powerMgmt = 1; /* Needed for station */
macMgmtHdr->fc.retry = 0;
macMgmtHdr->fc.moreFrag = 0;
macMgmtHdr->fc.fromDS = 0;
macMgmtHdr->fc.toDS = 1;
macMgmtHdr->durationLo =
(uint8_t) (SIR_MAC_MAX_DURATION_MICRO_SECONDS & 0xff);
macMgmtHdr->durationHi =
(uint8_t) ((SIR_MAC_MAX_DURATION_MICRO_SECONDS & 0xff00) >>
8);
macMgmtHdr->seqControl.fragNum = 0;
macMgmtHdr->seqControl.seqNumLo = 0;
macMgmtHdr->seqControl.seqNumHi = 2;
cdf_mem_copy((void *)&macMgmtHdr->da, (void *)pSta[0].bssId, 6);
cdf_mem_copy(&macMgmtHdr->sa, pSta[0].staAddr, 6);
cdf_mem_copy((void *)&macMgmtHdr->bssId, (void *)pSta[0].bssId,
6);
} else if (role == eSYSTEM_AP_ROLE || role == eSYSTEM_STA_IN_IBSS_ROLE) {
macMgmtHdr->fc.type = SIR_MAC_CTRL_FRAME;
macMgmtHdr->fc.subType = SIR_MAC_CTRL_CTS;
macMgmtHdr->fc.order = 0;
macMgmtHdr->fc.wep = 0;
macMgmtHdr->fc.moreData = 0;
macMgmtHdr->fc.powerMgmt = 0; /* Needed for station */
macMgmtHdr->fc.retry = 0;
macMgmtHdr->fc.moreFrag = 0;
macMgmtHdr->fc.fromDS = 0;
macMgmtHdr->fc.toDS = 0;
macMgmtHdr->durationLo =
(uint8_t) (SIR_MAC_MAX_DURATION_MICRO_SECONDS & 0xff);
macMgmtHdr->durationHi =
(uint8_t) ((SIR_MAC_MAX_DURATION_MICRO_SECONDS & 0xff00) >>
8);
cdf_mem_copy((void *)macMgmtHdr->da, (void *)pSta[0].staAddr,
6);
}
return;
#endif
}
/**
@brief : This functions creates a DATA_NULL frame in Big endian format
@param : Global MAC structure, pointer to return the created packet, role which is Station/AP
@return : void
*/
void create_finish_scan_raw_frame(tpAniSirGlobal pMac, tSirMacMgmtHdr *macMgmtHdr,
tBssSystemRole role)
{
#if 0
tpStaStruct pSta = (tpStaStruct) pMac->hal.halMac.staTable;
if (role == eSYSTEM_STA_ROLE) {
macMgmtHdr->fc.type = SIR_MAC_DATA_FRAME;
macMgmtHdr->fc.subType = SIR_MAC_DATA_NULL;
macMgmtHdr->fc.protVer = SIR_MAC_PROTOCOL_VERSION;
macMgmtHdr->fc.order = 0;
macMgmtHdr->fc.wep = 0;
macMgmtHdr->fc.moreData = 0;
macMgmtHdr->fc.powerMgmt = 0; /* Needed for station */
macMgmtHdr->fc.retry = 0;
macMgmtHdr->fc.moreFrag = 0;
macMgmtHdr->fc.fromDS = 0;
macMgmtHdr->fc.toDS = 1;
macMgmtHdr->durationLo =
(uint8_t) (SIR_MAC_MAX_DURATION_MICRO_SECONDS & 0xff);
macMgmtHdr->durationHi =
(uint8_t) ((SIR_MAC_MAX_DURATION_MICRO_SECONDS & 0xff00) >>
8);
macMgmtHdr->seqControl.fragNum = 0;
macMgmtHdr->seqControl.seqNumLo = 0;
macMgmtHdr->seqControl.seqNumHi = 2;
cdf_mem_copy((void *)macMgmtHdr->da, (void *)pSta[0].bssId, 6);
cdf_mem_copy(macMgmtHdr->sa, pSta[0].staAddr, 6);
cdf_mem_copy((void *)macMgmtHdr->bssId, (void *)pSta[0].bssId,
6);
}
return;
#endif
}
/* utils_parser.c ends here. */