1 /*
2  * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /*
20  *
21  * This file utils_parser.cc contains the code for parsing
22  * 802.11 messages.
23  * Author:        Pierre Vandwalle
24  * Date:          03/18/02
25  * History:-
26  * Date           Modified by    Modification Information
27  * --------------------------------------------------------------------
28  *
29  */
30 
31 #include "ani_global.h"
32 #include "utils_parser.h"
33 #include "lim_ser_des_utils.h"
34 
convert_ssid(struct mac_context * mac,tSirMacSSid * pOld,tDot11fIESSID * pNew)35 void convert_ssid(struct mac_context *mac, tSirMacSSid *pOld, tDot11fIESSID *pNew)
36 {
37 	pOld->length = pNew->num_ssid;
38 	qdf_mem_copy(pOld->ssId, pNew->ssid, pNew->num_ssid);
39 }
40 
convert_supp_rates(struct mac_context * mac,tSirMacRateSet * pOld,tDot11fIESuppRates * pNew)41 void convert_supp_rates(struct mac_context *mac,
42 			tSirMacRateSet *pOld, tDot11fIESuppRates *pNew)
43 {
44 	pOld->numRates = pNew->num_rates;
45 	qdf_mem_copy(pOld->rate, pNew->rates, pNew->num_rates);
46 }
47 
convert_ext_supp_rates(struct mac_context * mac,tSirMacRateSet * pOld,tDot11fIEExtSuppRates * pNew)48 void convert_ext_supp_rates(struct mac_context *mac,
49 			    tSirMacRateSet *pOld, tDot11fIEExtSuppRates *pNew)
50 {
51 	pOld->numRates = pNew->num_rates;
52 	qdf_mem_copy(pOld->rate, pNew->rates, pNew->num_rates);
53 }
54 
convert_qos_caps(struct mac_context * mac,tSirMacQosCapabilityIE * pOld,tDot11fIEQOSCapsAp * pNew)55 void convert_qos_caps(struct mac_context *mac,
56 		      tSirMacQosCapabilityIE *pOld, tDot11fIEQOSCapsAp *pNew)
57 {
58 	pOld->type = 46;
59 	pOld->length = 1;
60 
61 	pOld->qosInfo.count = pNew->count;
62 }
63 
convert_qos_caps_station(struct mac_context * mac,tSirMacQosCapabilityStaIE * pOld,tDot11fIEQOSCapsStation * pNew)64 void convert_qos_caps_station(struct mac_context *mac,
65 			      tSirMacQosCapabilityStaIE *pOld,
66 			      tDot11fIEQOSCapsStation *pNew)
67 {
68 	pOld->type = 46;
69 	pOld->length = 1;
70 
71 	pOld->qosInfo.moreDataAck = pNew->more_data_ack;
72 	pOld->qosInfo.maxSpLen = pNew->max_sp_length;
73 	pOld->qosInfo.qack = pNew->qack;
74 	pOld->qosInfo.acbe_uapsd = pNew->acbe_uapsd;
75 	pOld->qosInfo.acbk_uapsd = pNew->acbk_uapsd;
76 	pOld->qosInfo.acvi_uapsd = pNew->acvi_uapsd;
77 	pOld->qosInfo.acvo_uapsd = pNew->acvo_uapsd;
78 }
79 
convert_wpa(struct mac_context * mac,tSirMacWpaInfo * pOld,tDot11fIEWPA * pNew)80 QDF_STATUS convert_wpa(struct mac_context *mac,
81 		       tSirMacWpaInfo *pOld, tDot11fIEWPA *pNew)
82 {
83 	/* This is awful, I know, but the old code just rammed the IE into an */
84 	/* array... */
85 	uint8_t buffer[257];
86 	uint32_t status, written = 0, nbuffer = 257;
87 
88 	status = dot11f_pack_ie_wpa(mac, pNew, buffer, nbuffer, &written);
89 	if (DOT11F_FAILED(status)) {
90 		pe_err("Failed to re-pack the WPA IE (0x%0x8)", status);
91 		return QDF_STATUS_E_FAILURE;
92 	}
93 
94 	pOld->length = (uint8_t) written - 2;
95 	qdf_mem_copy(pOld->info, buffer + 2, pOld->length);
96 
97 	return QDF_STATUS_SUCCESS;
98 }
99 
convert_wpa_opaque(struct mac_context * mac,tSirMacWpaInfo * pOld,tDot11fIEWPAOpaque * pNew)100 QDF_STATUS convert_wpa_opaque(struct mac_context *mac,
101 			      tSirMacWpaInfo *pOld, tDot11fIEWPAOpaque *pNew)
102 {
103 	/* This is awful, I know, but the old code just rammed the IE into */
104 	/* an opaque array.  Note that we need to explicitly add the OUI! */
105 	pOld->length = pNew->num_data + 4;
106 	pOld->info[0] = 0x00;
107 	pOld->info[1] = 0x50;
108 	pOld->info[2] = 0xf2;
109 	pOld->info[3] = 0x01;
110 	qdf_mem_copy(pOld->info + 4, pNew->data, pNew->num_data);
111 
112 	return QDF_STATUS_SUCCESS;
113 }
114 
115 #ifdef FEATURE_WLAN_WAPI
convert_wapi_opaque(struct mac_context * mac,tSirMacWapiInfo * pOld,tDot11fIEWAPIOpaque * pNew)116 QDF_STATUS convert_wapi_opaque(struct mac_context *mac,
117 			       tSirMacWapiInfo *pOld,
118 			       tDot11fIEWAPIOpaque *pNew)
119 {
120 	/* This is awful, I know, but the old code just rammed the IE into */
121 	/* an opaque array.  Note that we need to explicitly add the OUI! */
122 	pOld->length = pNew->num_data;
123 	qdf_mem_copy(pOld->info, pNew->data, pNew->num_data);
124 
125 	return QDF_STATUS_SUCCESS;
126 }
127 #endif
128 
convert_wsc_opaque(struct mac_context * mac,tSirAddie * pOld,tDot11fIEWscIEOpaque * pNew)129 QDF_STATUS convert_wsc_opaque(struct mac_context *mac,
130 			      tSirAddie *pOld, tDot11fIEWscIEOpaque *pNew)
131 {
132 	/* This is awful, I know, but the old code just rammed the IE into */
133 	/* an opaque array.  Note that we need to explicitly add the vendorIE and OUI ! */
134 	uint16_t curAddIELen = pOld->length;
135 
136 	pOld->length = curAddIELen + pNew->num_data + 6;
137 	pOld->addIEdata[curAddIELen++] = 0xdd;
138 	pOld->addIEdata[curAddIELen++] = pNew->num_data + 4;
139 	pOld->addIEdata[curAddIELen++] = 0x00;
140 	pOld->addIEdata[curAddIELen++] = 0x50;
141 	pOld->addIEdata[curAddIELen++] = 0xf2;
142 	pOld->addIEdata[curAddIELen++] = 0x04;
143 	qdf_mem_copy(pOld->addIEdata + curAddIELen, pNew->data, pNew->num_data);
144 
145 	return QDF_STATUS_SUCCESS;
146 }
147 
convert_p2p_opaque(struct mac_context * mac,tSirAddie * pOld,tDot11fIEP2PIEOpaque * pNew)148 QDF_STATUS convert_p2p_opaque(struct mac_context *mac,
149 			      tSirAddie *pOld, tDot11fIEP2PIEOpaque *pNew)
150 {
151 	/* This is awful, I know, but the old code just rammed the IE into */
152 	/* an opaque array.  Note that we need to explicitly add the vendorIE and OUI ! */
153 	uint16_t curAddIELen = pOld->length;
154 
155 	pOld->length = curAddIELen + pNew->num_data + 6;
156 	pOld->addIEdata[curAddIELen++] = 0xdd;
157 	pOld->addIEdata[curAddIELen++] = pNew->num_data + 4;
158 	pOld->addIEdata[curAddIELen++] = 0x50;
159 	pOld->addIEdata[curAddIELen++] = 0x6f;
160 	pOld->addIEdata[curAddIELen++] = 0x9A;
161 	pOld->addIEdata[curAddIELen++] = 0x09;
162 	qdf_mem_copy(pOld->addIEdata + curAddIELen, pNew->data, pNew->num_data);
163 
164 	return QDF_STATUS_SUCCESS;
165 }
166 
167 #ifdef WLAN_FEATURE_WFD
convert_wfd_opaque(struct mac_context * mac,tSirAddie * pOld,tDot11fIEWFDIEOpaque * pNew)168 QDF_STATUS convert_wfd_opaque(struct mac_context *mac,
169 			      tSirAddie *pOld, tDot11fIEWFDIEOpaque *pNew)
170 {
171 	/* This is awful, I know, but the old code just rammed the IE into */
172 	/* an opaque array.  Note that we need to explicitly add the vendorIE and OUI ! */
173 	uint16_t curAddIELen = pOld->length;
174 
175 	pOld->length = curAddIELen + pNew->num_data + 6;
176 	pOld->addIEdata[curAddIELen++] = 0xdd;
177 	pOld->addIEdata[curAddIELen++] = pNew->num_data + 4;
178 	pOld->addIEdata[curAddIELen++] = 0x50;
179 	pOld->addIEdata[curAddIELen++] = 0x6f;
180 	pOld->addIEdata[curAddIELen++] = 0x9A;
181 	pOld->addIEdata[curAddIELen++] = 0x0a;
182 	qdf_mem_copy(pOld->addIEdata + curAddIELen, pNew->data, pNew->num_data);
183 
184 	return QDF_STATUS_SUCCESS;
185 }
186 #endif
187 
convert_rsn(struct mac_context * mac,tSirMacRsnInfo * pOld,tDot11fIERSN * pNew)188 QDF_STATUS convert_rsn(struct mac_context *mac,
189 		       tSirMacRsnInfo *pOld, tDot11fIERSN *pNew)
190 {
191 	uint8_t buffer[257];
192 	uint32_t status, written = 0, nbuffer = 257;
193 
194 	status = dot11f_pack_ie_rsn(mac, pNew, buffer, nbuffer, &written);
195 	if (DOT11F_FAILED(status)) {
196 		pe_err("Failed to re-pack the RSN IE (0x%0x8)", status);
197 		return QDF_STATUS_E_FAILURE;
198 	}
199 
200 	pOld->length = (uint8_t) written - 2;
201 	qdf_mem_copy(pOld->info, buffer + 2, pOld->length);
202 
203 	return QDF_STATUS_SUCCESS;
204 }
205 
convert_rsn_opaque(struct mac_context * mac,tSirMacRsnInfo * pOld,tDot11fIERSNOpaque * pNew)206 QDF_STATUS convert_rsn_opaque(struct mac_context *mac,
207 			      tSirMacRsnInfo *pOld, tDot11fIERSNOpaque *pNew)
208 {
209 	/* This is awful, I know, but the old code just rammed the IE into */
210 	/* an opaque array. */
211 	pOld->length = pNew->num_data;
212 	qdf_mem_copy(pOld->info, pNew->data, pOld->length);
213 
214 	return QDF_STATUS_SUCCESS;
215 }
216 
convert_power_caps(struct mac_context * mac,tSirMacPowerCapabilityIE * pOld,tDot11fIEPowerCaps * pNew)217 void convert_power_caps(struct mac_context *mac,
218 			tSirMacPowerCapabilityIE *pOld,
219 			tDot11fIEPowerCaps *pNew)
220 {
221 	pOld->type = 33;
222 	pOld->length = 2;
223 	pOld->minTxPower = pNew->minTxPower;
224 	pOld->maxTxPower = pNew->maxTxPower;
225 }
226 
convert_supp_channels(struct mac_context * mac,tSirMacSupportedChannelIE * pOld,tDot11fIESuppChannels * pNew)227 void convert_supp_channels(struct mac_context *mac,
228 			   tSirMacSupportedChannelIE *pOld,
229 			   tDot11fIESuppChannels *pNew)
230 {
231 	pOld->type = 36;
232 	pOld->length = (pNew->num_bands * 2);
233 	qdf_mem_copy((uint8_t *) pOld->supportedChannels,
234 		     (uint8_t *) pNew->bands, pOld->length);
235 }
236 
convert_cf_params(struct mac_context * mac,tSirMacCfParamSet * pOld,tDot11fIECFParams * pNew)237 void convert_cf_params(struct mac_context *mac,
238 		       tSirMacCfParamSet *pOld, tDot11fIECFParams *pNew)
239 {
240 	pOld->cfpCount = pNew->cfp_count;
241 	pOld->cfpPeriod = pNew->cfp_period;
242 	pOld->cfpMaxDuration = pNew->cfp_maxduration;
243 	pOld->cfpDurRemaining = pNew->cfp_durremaining;
244 }
245 
convert_fh_params(struct mac_context * mac,tSirMacFHParamSet * pOld,tDot11fIEFHParamSet * pNew)246 void convert_fh_params(struct mac_context *mac,
247 		       tSirMacFHParamSet *pOld, tDot11fIEFHParamSet *pNew)
248 {
249 	pOld->dwellTime = pNew->dwell_time;
250 	pOld->hopSet = pNew->hop_set;
251 	pOld->hopPattern = pNew->hop_pattern;
252 	pOld->hopIndex = pNew->hop_index;
253 }
254 
convert_tim(struct mac_context * mac,tSirMacTim * pOld,tDot11fIETIM * pNew)255 void convert_tim(struct mac_context *mac, tSirMacTim *pOld, tDot11fIETIM *pNew)
256 {
257 	pOld->dtimCount = pNew->dtim_count;
258 	pOld->dtimPeriod = pNew->dtim_period;
259 	pOld->bitmapControl = pNew->bmpctl;
260 	pOld->bitmapLength = pNew->num_vbmp;
261 
262 	qdf_mem_copy(pOld->bitmap, pNew->vbmp, pNew->num_vbmp);
263 }
264 
convert_country(struct mac_context * mac,tSirCountryInformation * pOld,tDot11fIECountry * pNew)265 void convert_country(struct mac_context *mac,
266 		     tSirCountryInformation *pOld, tDot11fIECountry *pNew)
267 {
268 	uint8_t i = 0;
269 
270 	qdf_mem_copy(pOld->countryString, pNew->country, COUNTRY_STRING_LENGTH);
271 
272 	pOld->numIntervals = pNew->num_more_triplets;
273 
274 	pOld->channelTransmitPower[i].channelNumber = pNew->first_triplet[0];
275 	pOld->channelTransmitPower[i].numChannel = pNew->first_triplet[1];
276 	pOld->channelTransmitPower[i].maxTransmitPower = pNew->first_triplet[2];
277 
278 	for (i = 0; i < pNew->num_more_triplets; i++) {
279 		pOld->channelTransmitPower[i+1].channelNumber =
280 				pNew->more_triplets[i][0];
281 		pOld->channelTransmitPower[i+1].numChannel =
282 				pNew->more_triplets[i][1];
283 		pOld->channelTransmitPower[i+1].maxTransmitPower =
284 				pNew->more_triplets[i][2];
285 	}
286 }
287 
convert_wmm_params(struct mac_context * mac,tSirMacEdcaParamSetIE * pOld,tDot11fIEWMMParams * pNew)288 void convert_wmm_params(struct mac_context *mac,
289 			tSirMacEdcaParamSetIE *pOld, tDot11fIEWMMParams *pNew)
290 {
291 	pOld->type = 221;
292 	pOld->length = 24;
293 
294 	qdf_mem_copy((uint8_t *) &pOld->qosInfo, (uint8_t *) &pNew->qosInfo,
295 		     1);
296 
297 	pOld->acbe.aci.aifsn = pNew->acbe_aifsn;
298 	pOld->acbe.aci.acm = pNew->acbe_acm;
299 	pOld->acbe.aci.aci = pNew->acbe_aci;
300 	pOld->acbe.cw.min = pNew->acbe_acwmin;
301 	pOld->acbe.cw.max = pNew->acbe_acwmax;
302 	pOld->acbe.txoplimit = pNew->acbe_txoplimit;
303 
304 	pOld->acbk.aci.aifsn = pNew->acbk_aifsn;
305 	pOld->acbk.aci.acm = pNew->acbk_acm;
306 	pOld->acbk.aci.aci = pNew->acbk_aci;
307 	pOld->acbk.cw.min = pNew->acbk_acwmin;
308 	pOld->acbk.cw.max = pNew->acbk_acwmax;
309 	pOld->acbk.txoplimit = pNew->acbk_txoplimit;
310 
311 	pOld->acvi.aci.aifsn = pNew->acvi_aifsn;
312 	pOld->acvi.aci.acm = pNew->acvi_acm;
313 	pOld->acvi.aci.aci = pNew->acvi_aci;
314 	pOld->acvi.cw.min = pNew->acvi_acwmin;
315 	pOld->acvi.cw.max = pNew->acvi_acwmax;
316 	pOld->acvi.txoplimit = pNew->acvi_txoplimit;
317 
318 	pOld->acvo.aci.aifsn = pNew->acvo_aifsn;
319 	pOld->acvo.aci.acm = pNew->acvo_acm;
320 	pOld->acvo.aci.aci = pNew->acvo_aci;
321 	pOld->acvo.cw.min = pNew->acvo_acwmin;
322 	pOld->acvo.cw.max = pNew->acvo_acwmax;
323 	pOld->acvo.txoplimit = pNew->acvo_txoplimit;
324 }
325 
convert_erp_info(struct mac_context * mac,tSirMacErpInfo * pOld,tDot11fIEERPInfo * pNew)326 void convert_erp_info(struct mac_context *mac,
327 		      tSirMacErpInfo *pOld, tDot11fIEERPInfo *pNew)
328 {
329 	pOld->nonErpPresent = pNew->non_erp_present;
330 	pOld->useProtection = pNew->use_prot;
331 	pOld->barkerPreambleMode = pNew->barker_preamble;
332 }
333 
convert_edca_param(struct mac_context * mac,tSirMacEdcaParamSetIE * pOld,tDot11fIEEDCAParamSet * pNew)334 void convert_edca_param(struct mac_context *mac,
335 			tSirMacEdcaParamSetIE *pOld,
336 			tDot11fIEEDCAParamSet *pNew)
337 {
338 	pOld->type = 12;
339 	pOld->length = 20;
340 
341 	qdf_mem_copy((uint8_t *) &pOld->qosInfo, (uint8_t *) &pNew->qos, 1);
342 
343 	pOld->acbe.aci.aifsn = pNew->acbe_aifsn;
344 	pOld->acbe.aci.acm = pNew->acbe_acm;
345 	pOld->acbe.aci.aci = pNew->acbe_aci;
346 	pOld->acbe.cw.min = pNew->acbe_acwmin;
347 	pOld->acbe.cw.max = pNew->acbe_acwmax;
348 	pOld->acbe.txoplimit = pNew->acbe_txoplimit;
349 
350 	pOld->acbk.aci.aifsn = pNew->acbk_aifsn;
351 	pOld->acbk.aci.acm = pNew->acbk_acm;
352 	pOld->acbk.aci.aci = pNew->acbk_aci;
353 	pOld->acbk.cw.min = pNew->acbk_acwmin;
354 	pOld->acbk.cw.max = pNew->acbk_acwmax;
355 	pOld->acbk.txoplimit = pNew->acbk_txoplimit;
356 
357 	pOld->acvi.aci.aifsn = pNew->acvi_aifsn;
358 	pOld->acvi.aci.acm = pNew->acvi_acm;
359 	pOld->acvi.aci.aci = pNew->acvi_aci;
360 	pOld->acvi.cw.min = pNew->acvi_acwmin;
361 	pOld->acvi.cw.max = pNew->acvi_acwmax;
362 	pOld->acvi.txoplimit = pNew->acvi_txoplimit;
363 
364 	pOld->acvo.aci.aifsn = pNew->acvo_aifsn;
365 	pOld->acvo.aci.acm = pNew->acvo_acm;
366 	pOld->acvo.aci.aci = pNew->acvo_aci;
367 	pOld->acvo.cw.min = pNew->acvo_acwmin;
368 	pOld->acvo.cw.max = pNew->acvo_acwmax;
369 	pOld->acvo.txoplimit = pNew->acvo_txoplimit;
370 
371 }
372 
convert_mu_edca_param(struct mac_context * mac_ctx,tSirMacEdcaParamSetIE * mu_edca,tDot11fIEmu_edca_param_set * ie)373 void convert_mu_edca_param(struct mac_context *mac_ctx,
374 			tSirMacEdcaParamSetIE *mu_edca,
375 			tDot11fIEmu_edca_param_set *ie)
376 {
377 	qdf_mem_copy((uint8_t *) &mu_edca->qosInfo, (uint8_t *) &ie->qos, 1);
378 
379 	mu_edca->acbe.aci.aifsn = ie->acbe_aifsn;
380 	mu_edca->acbe.aci.acm = ie->acbe_acm;
381 	mu_edca->acbe.aci.aci = ie->acbe_aci;
382 	mu_edca->acbe.cw.min = ie->acbe_acwmin;
383 	mu_edca->acbe.cw.max = ie->acbe_acwmax;
384 	mu_edca->acbe.mu_edca_timer = ie->acbe_muedca_timer;
385 
386 	mu_edca->acbk.aci.aifsn = ie->acbk_aifsn;
387 	mu_edca->acbk.aci.acm = ie->acbk_acm;
388 	mu_edca->acbk.aci.aci = ie->acbk_aci;
389 	mu_edca->acbk.cw.min = ie->acbk_acwmin;
390 	mu_edca->acbk.cw.max = ie->acbk_acwmax;
391 	mu_edca->acbk.mu_edca_timer = ie->acbk_muedca_timer;
392 
393 	mu_edca->acvi.aci.aifsn = ie->acvi_aifsn;
394 	mu_edca->acvi.aci.acm = ie->acvi_acm;
395 	mu_edca->acvi.aci.aci = ie->acvi_aci;
396 	mu_edca->acvi.cw.min = ie->acvi_acwmin;
397 	mu_edca->acvi.cw.max = ie->acvi_acwmax;
398 	mu_edca->acvi.mu_edca_timer = ie->acvi_muedca_timer;
399 
400 	mu_edca->acvo.aci.aifsn = ie->acvo_aifsn;
401 	mu_edca->acvo.aci.acm = ie->acvo_acm;
402 	mu_edca->acvo.aci.aci = ie->acvo_aci;
403 	mu_edca->acvo.cw.min = ie->acvo_acwmin;
404 	mu_edca->acvo.cw.max = ie->acvo_acwmax;
405 	mu_edca->acvo.mu_edca_timer = ie->acvo_muedca_timer;
406 
407 }
408 
convert_tspec(struct mac_context * mac,struct mac_tspec_ie * pOld,tDot11fIETSPEC * pNew)409 void convert_tspec(struct mac_context *mac,
410 		   struct mac_tspec_ie *pOld, tDot11fIETSPEC *pNew)
411 {
412 	pOld->tsinfo.traffic.trafficType = (uint16_t) pNew->traffic_type;
413 	pOld->tsinfo.traffic.tsid = (uint16_t) pNew->tsid;
414 	pOld->tsinfo.traffic.direction = (uint16_t) pNew->direction;
415 	pOld->tsinfo.traffic.accessPolicy = (uint16_t) pNew->access_policy;
416 	pOld->tsinfo.traffic.aggregation = (uint16_t) pNew->aggregation;
417 	pOld->tsinfo.traffic.psb = (uint16_t) pNew->psb;
418 	pOld->tsinfo.traffic.userPrio = (uint16_t) pNew->user_priority;
419 	pOld->tsinfo.traffic.ackPolicy = (uint16_t) pNew->tsinfo_ack_pol;
420 
421 	pOld->tsinfo.schedule.schedule = (uint8_t) pNew->schedule;
422 
423 	pOld->nomMsduSz = pNew->size;
424 	pOld->maxMsduSz = pNew->max_msdu_size;
425 	pOld->minSvcInterval = pNew->min_service_int;
426 	pOld->maxSvcInterval = pNew->max_service_int;
427 	pOld->inactInterval = pNew->inactivity_int;
428 	pOld->suspendInterval = pNew->suspension_int;
429 	pOld->svcStartTime = pNew->service_start_time;
430 	pOld->minDataRate = pNew->min_data_rate;
431 	pOld->meanDataRate = pNew->mean_data_rate;
432 	pOld->peakDataRate = pNew->peak_data_rate;
433 	pOld->maxBurstSz = pNew->burst_size;
434 	pOld->delayBound = pNew->delay_bound;
435 	pOld->minPhyRate = pNew->min_phy_rate;
436 	pOld->surplusBw = pNew->surplus_bw_allowance;
437 	pOld->mediumTime = pNew->medium_time;
438 }
439 
convert_tclas(struct mac_context * mac,tSirTclasInfo * pOld,tDot11fIETCLAS * pNew)440 QDF_STATUS convert_tclas(struct mac_context *mac,
441 			 tSirTclasInfo *pOld, tDot11fIETCLAS *pNew)
442 {
443 	uint32_t length = 0;
444 
445 	if (DOT11F_FAILED(dot11f_get_packed_ietclas(mac, pNew, &length))) {
446 		return QDF_STATUS_E_FAILURE;
447 	}
448 
449 	pOld->tclas.type = DOT11F_EID_TCLAS;
450 	pOld->tclas.length = (uint8_t) length;
451 	pOld->tclas.userPrio = pNew->user_priority;
452 	pOld->tclas.classifierType = pNew->classifier_type;
453 	pOld->tclas.classifierMask = pNew->classifier_mask;
454 
455 	switch (pNew->classifier_type) {
456 	case 0:
457 		qdf_mem_copy(pOld->tclasParams.eth.srcAddr,
458 			     pNew->info.EthParams.source, 6);
459 		qdf_mem_copy(pOld->tclasParams.eth.dstAddr,
460 			     pNew->info.EthParams.dest, 6);
461 		pOld->tclasParams.eth.type = pNew->info.EthParams.type;
462 		break;
463 	case 1:
464 		pOld->version = pNew->info.IpParams.version;
465 		if (4 == pNew->info.IpParams.version) {
466 			pOld->tclasParams.ipv4.version = 4;
467 			qdf_mem_copy(pOld->tclasParams.ipv4.srcIpAddr,
468 				     pNew->info.IpParams.params.IpV4Params.
469 				     source, 4);
470 			qdf_mem_copy(pOld->tclasParams.ipv4.dstIpAddr,
471 				     pNew->info.IpParams.params.IpV4Params.dest,
472 				     4);
473 			pOld->tclasParams.ipv4.srcPort =
474 				pNew->info.IpParams.params.IpV4Params.src_port;
475 			pOld->tclasParams.ipv4.dstPort =
476 				pNew->info.IpParams.params.IpV4Params.dest_port;
477 			pOld->tclasParams.ipv4.dscp =
478 				pNew->info.IpParams.params.IpV4Params.DSCP;
479 			pOld->tclasParams.ipv4.protocol =
480 				pNew->info.IpParams.params.IpV4Params.proto;
481 			pOld->tclasParams.ipv4.rsvd =
482 				pNew->info.IpParams.params.IpV4Params.reserved;
483 		} else if (6 == pNew->info.IpParams.version) {
484 			pOld->tclasParams.ipv6.version = 6;
485 			qdf_mem_copy((uint8_t *) pOld->tclasParams.ipv6.
486 				     srcIpAddr,
487 				     (uint8_t *) pNew->info.IpParams.params.
488 				     IpV6Params.source, 16);
489 			qdf_mem_copy((uint8_t *) pOld->tclasParams.ipv6.
490 				     dstIpAddr,
491 				     (uint8_t *) pNew->info.IpParams.params.
492 				     IpV6Params.dest, 16);
493 			pOld->tclasParams.ipv6.srcPort =
494 				pNew->info.IpParams.params.IpV6Params.src_port;
495 			pOld->tclasParams.ipv6.dstPort =
496 				pNew->info.IpParams.params.IpV6Params.dest_port;
497 			qdf_mem_copy((uint8_t *) pOld->tclasParams.ipv6.
498 				     flowLabel,
499 				     (uint8_t *) pNew->info.IpParams.params.
500 				     IpV6Params.flow_label, 3);
501 		} else {
502 			return QDF_STATUS_E_FAILURE;
503 		}
504 		break;
505 	case 2:
506 		pOld->tclasParams.t8021dq.tag =
507 			pNew->info.Params8021dq.tag_type;
508 		break;
509 	default:
510 		return QDF_STATUS_E_FAILURE;
511 	}
512 
513 	return QDF_STATUS_SUCCESS;
514 }
515 
convert_wmmtspec(struct mac_context * mac,struct mac_tspec_ie * pOld,tDot11fIEWMMTSPEC * pNew)516 void convert_wmmtspec(struct mac_context *mac,
517 		      struct mac_tspec_ie *pOld, tDot11fIEWMMTSPEC *pNew)
518 {
519 	pOld->tsinfo.traffic.trafficType = (uint16_t) pNew->traffic_type;
520 	pOld->tsinfo.traffic.tsid = (uint16_t) pNew->tsid;
521 	pOld->tsinfo.traffic.direction = (uint16_t) pNew->direction;
522 	pOld->tsinfo.traffic.accessPolicy = (uint16_t) pNew->access_policy;
523 	pOld->tsinfo.traffic.aggregation = (uint16_t) pNew->aggregation;
524 	pOld->tsinfo.traffic.psb = (uint16_t) pNew->psb;
525 	pOld->tsinfo.traffic.userPrio = (uint16_t) pNew->user_priority;
526 	pOld->tsinfo.traffic.ackPolicy = (uint16_t) pNew->tsinfo_ack_pol;
527 	pOld->nomMsduSz = (pNew->fixed << 15) | pNew->size;
528 	pOld->maxMsduSz = pNew->max_msdu_size;
529 	pOld->minSvcInterval = pNew->min_service_int;
530 	pOld->maxSvcInterval = pNew->max_service_int;
531 	pOld->inactInterval = pNew->inactivity_int;
532 	pOld->suspendInterval = pNew->suspension_int;
533 	pOld->svcStartTime = pNew->service_start_time;
534 	pOld->minDataRate = pNew->min_data_rate;
535 	pOld->meanDataRate = pNew->mean_data_rate;
536 	pOld->peakDataRate = pNew->peak_data_rate;
537 	pOld->maxBurstSz = pNew->burst_size;
538 	pOld->delayBound = pNew->delay_bound;
539 	pOld->minPhyRate = pNew->min_phy_rate;
540 	pOld->surplusBw = pNew->surplus_bw_allowance;
541 	pOld->mediumTime = pNew->medium_time;
542 }
543 
convert_wmmtclas(struct mac_context * mac,tSirTclasInfo * pOld,tDot11fIEWMMTCLAS * pNew)544 QDF_STATUS convert_wmmtclas(struct mac_context *mac,
545 			    tSirTclasInfo *pOld, tDot11fIEWMMTCLAS *pNew)
546 {
547 	uint32_t length = 0;
548 
549 	if (DOT11F_FAILED(dot11f_get_packed_iewmmtclas(mac, pNew, &length))) {
550 		return QDF_STATUS_E_FAILURE;
551 	}
552 
553 	pOld->tclas.type = DOT11F_EID_WMMTCLAS;
554 	pOld->tclas.length = (uint8_t) length;
555 	pOld->tclas.userPrio = pNew->user_priority;
556 	pOld->tclas.classifierType = pNew->classifier_type;
557 	pOld->tclas.classifierMask = pNew->classifier_mask;
558 
559 	switch (pNew->classifier_type) {
560 	case 0:
561 		qdf_mem_copy(pOld->tclasParams.eth.srcAddr,
562 			     pNew->info.EthParams.source, 6);
563 		qdf_mem_copy(pOld->tclasParams.eth.dstAddr,
564 			     pNew->info.EthParams.dest, 6);
565 		pOld->tclasParams.eth.type = pNew->info.EthParams.type;
566 		break;
567 	case 1:
568 		pOld->version = pNew->info.IpParams.version;
569 		if (4 == pNew->info.IpParams.version) {
570 			pOld->tclasParams.ipv4.version = 4;
571 			qdf_mem_copy(pOld->tclasParams.ipv4.srcIpAddr,
572 				     pNew->info.IpParams.params.IpV4Params.
573 				     source, 4);
574 			qdf_mem_copy(pOld->tclasParams.ipv4.dstIpAddr,
575 				     pNew->info.IpParams.params.IpV4Params.dest,
576 				     4);
577 			pOld->tclasParams.ipv4.srcPort =
578 				pNew->info.IpParams.params.IpV4Params.src_port;
579 			pOld->tclasParams.ipv4.dstPort =
580 				pNew->info.IpParams.params.IpV4Params.dest_port;
581 			pOld->tclasParams.ipv4.dscp =
582 				pNew->info.IpParams.params.IpV4Params.DSCP;
583 			pOld->tclasParams.ipv4.protocol =
584 				pNew->info.IpParams.params.IpV4Params.proto;
585 			pOld->tclasParams.ipv4.rsvd =
586 				pNew->info.IpParams.params.IpV4Params.reserved;
587 		} else if (6 == pNew->info.IpParams.version) {
588 			pOld->tclasParams.ipv6.version = 6;
589 			qdf_mem_copy((uint8_t *) pOld->tclasParams.ipv6.
590 				     srcIpAddr,
591 				     (uint8_t *) pNew->info.IpParams.params.
592 				     IpV6Params.source, 16);
593 			qdf_mem_copy((uint8_t *) pOld->tclasParams.ipv6.
594 				     dstIpAddr,
595 				     (uint8_t *) pNew->info.IpParams.params.
596 				     IpV6Params.dest, 16);
597 			pOld->tclasParams.ipv6.srcPort =
598 				pNew->info.IpParams.params.IpV6Params.src_port;
599 			pOld->tclasParams.ipv6.dstPort =
600 				pNew->info.IpParams.params.IpV6Params.dest_port;
601 			qdf_mem_copy((uint8_t *) pOld->tclasParams.ipv6.
602 				     flowLabel,
603 				     (uint8_t *) pNew->info.IpParams.params.
604 				     IpV6Params.flow_label, 3);
605 		} else {
606 			return QDF_STATUS_E_FAILURE;
607 		}
608 		break;
609 	case 2:
610 		pOld->tclasParams.t8021dq.tag =
611 			pNew->info.Params8021dq.tag_type;
612 		break;
613 	default:
614 		return QDF_STATUS_E_FAILURE;
615 	}
616 
617 	return QDF_STATUS_SUCCESS;
618 }
619 
convert_ts_delay(struct mac_context * mac,tSirMacTsDelayIE * pOld,tDot11fIETSDelay * pNew)620 void convert_ts_delay(struct mac_context *mac,
621 		      tSirMacTsDelayIE *pOld, tDot11fIETSDelay *pNew)
622 {
623 	pOld->type = DOT11F_EID_TSDELAY;
624 	pOld->length = 4U;
625 	pOld->delay = pNew->delay;
626 }
627 
convert_schedule(struct mac_context * mac,tSirMacScheduleIE * pOld,tDot11fIESchedule * pNew)628 void convert_schedule(struct mac_context *mac,
629 		      tSirMacScheduleIE *pOld, tDot11fIESchedule *pNew)
630 {
631 	pOld->type = DOT11F_EID_SCHEDULE;
632 	pOld->length = DOT11F_IE_SCHEDULE_MIN_LEN;
633 
634 	pOld->info.aggregation = pNew->aggregation;
635 	pOld->info.tsid = pNew->tsid;
636 	pOld->info.direction = pNew->direction;
637 
638 	pOld->svcStartTime = pNew->service_start_time;
639 	pOld->svcInterval = pNew->service_interval;
640 	pOld->specInterval = pNew->spec_interval;
641 }
642 
convert_wmm_schedule(struct mac_context * mac,tSirMacScheduleIE * pOld,tDot11fIEWMMSchedule * pNew)643 void convert_wmm_schedule(struct mac_context *mac,
644 			  tSirMacScheduleIE *pOld, tDot11fIEWMMSchedule *pNew)
645 {
646 	pOld->type = DOT11F_EID_WMMSCHEDULE;
647 	pOld->length = DOT11F_IE_WMMSCHEDULE_MIN_LEN;
648 
649 	pOld->info.aggregation = pNew->aggregation;
650 	pOld->info.tsid = pNew->tsid;
651 	pOld->info.direction = pNew->direction;
652 
653 	pOld->svcStartTime = pNew->service_start_time;
654 	pOld->svcInterval = pNew->service_interval;
655 	pOld->specInterval = pNew->spec_interval;
656 }
657 
convert_qos_mapset_frame(struct mac_context * mac,struct qos_map_set * qos,tDot11fIEQosMapSet * dot11f_ie)658 void convert_qos_mapset_frame(struct mac_context *mac, struct qos_map_set *qos,
659 			      tDot11fIEQosMapSet *dot11f_ie)
660 {
661 	uint8_t i, j = 0;
662 	uint8_t dot11_dscp_exception_sz;
663 
664 	if (dot11f_ie->num_dscp_exceptions < DOT11F_IE_QOSMAPSET_MIN_LEN ||
665 	    dot11f_ie->num_dscp_exceptions % 2) {
666 		pe_debug("Invalid num_dscp_exceptions %d",
667 			 dot11f_ie->num_dscp_exceptions);
668 		return;
669 	}
670 
671 	dot11_dscp_exception_sz = dot11f_ie->num_dscp_exceptions -
672 				  DOT11F_IE_QOSMAPSET_MIN_LEN;
673 	qos->num_dscp_exceptions = dot11_dscp_exception_sz / 2;
674 	if (qos->num_dscp_exceptions > QOS_MAP_MAX_EX)
675 		qos->num_dscp_exceptions = QOS_MAP_MAX_EX;
676 
677 	for (i = 0; i < qos->num_dscp_exceptions &&
678 	     j < dot11_dscp_exception_sz - 1; i++) {
679 		qos->dscp_exceptions[i][0] = dot11f_ie->dscp_exceptions[j++];
680 		qos->dscp_exceptions[i][1] = dot11f_ie->dscp_exceptions[j++];
681 	}
682 
683 	for (i = 0; i < QOS_MAP_RANGE_NUM &&
684 	     j < dot11f_ie->num_dscp_exceptions - 1; i++) {
685 		qos->dscp_range[i][0] = dot11f_ie->dscp_exceptions[j++];
686 		qos->dscp_range[i][1] = dot11f_ie->dscp_exceptions[j++];
687 	}
688 }
689 
690 /* utils_parser.c ends here. */
691