Commit | Line | Data |
---|---|---|
5449c685 FB |
1 | /* |
2 | * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. | |
3 | * All rights reserved. | |
4 | * | |
5 | * This program is free software; you can redistribute it and/or modify | |
6 | * it under the terms of the GNU General Public License as published by | |
7 | * the Free Software Foundation; either version 2 of the License, or | |
8 | * (at your option) any later version. | |
9 | * | |
10 | * This program is distributed in the hope that it will be useful, | |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | * GNU General Public License for more details. | |
14 | * | |
15 | * You should have received a copy of the GNU General Public License along | |
16 | * with this program; if not, write to the Free Software Foundation, Inc., | |
17 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 | * | |
19 | * | |
20 | * File: vntwifi.c | |
21 | * | |
22 | * Purpose: export functions for vntwifi lib | |
23 | * | |
24 | * Functions: | |
25 | * | |
26 | * Revision History: | |
27 | * | |
28 | * Author: Yiching Chen | |
29 | * | |
30 | * Date: feb. 2, 2005 | |
31 | * | |
32 | */ | |
33 | ||
5449c685 | 34 | #include "vntwifi.h" |
5449c685 | 35 | #include "IEEE11h.h" |
5449c685 | 36 | #include "country.h" |
5449c685 | 37 | #include "device.h" |
5449c685 | 38 | #include "wmgr.h" |
5449c685 | 39 | #include "datarate.h" |
a7ad322a | 40 | |
5449c685 FB |
41 | //#define PLICE_DEBUG |
42 | ||
43 | /*--------------------- Static Definitions -------------------------*/ | |
44 | //static int msglevel =MSG_LEVEL_DEBUG; | |
45 | //static int msglevel =MSG_LEVEL_INFO; | |
46 | ||
47 | /*--------------------- Static Classes ----------------------------*/ | |
48 | ||
49 | /*--------------------- Static Variables --------------------------*/ | |
50 | ||
51 | /*--------------------- Static Functions --------------------------*/ | |
52 | ||
53 | /*--------------------- Export Variables --------------------------*/ | |
54 | ||
55 | /*--------------------- Export Functions --------------------------*/ | |
56 | ||
57 | /*+ | |
58 | * | |
59 | * Description: | |
60 | * Set Operation Mode | |
61 | * | |
62 | * Parameters: | |
63 | * In: | |
64 | * pMgmtHandle - pointer to management object | |
65 | * eOPMode - Opreation Mode | |
66 | * Out: | |
67 | * none | |
68 | * | |
69 | * Return Value: none | |
70 | * | |
71 | -*/ | |
6b35b7b3 | 72 | void |
5449c685 | 73 | VNTWIFIvSetOPMode ( |
3a215e0f CC |
74 | void *pMgmtHandle, |
75 | WMAC_CONFIG_MODE eOPMode | |
5449c685 FB |
76 | ) |
77 | { | |
78 | PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle; | |
79 | ||
80 | pMgmt->eConfigMode = eOPMode; | |
81 | } | |
82 | ||
83 | ||
84 | /*+ | |
85 | * | |
86 | * Description: | |
87 | * Set Operation Mode | |
88 | * | |
89 | * Parameters: | |
90 | * In: | |
91 | * pMgmtHandle - pointer to management object | |
92 | * wBeaconPeriod - Beacon Period | |
93 | * wATIMWindow - ATIM window | |
94 | * uChannel - channel number | |
95 | * Out: | |
96 | * none | |
97 | * | |
98 | * Return Value: none | |
99 | * | |
100 | -*/ | |
6b35b7b3 | 101 | void |
5449c685 | 102 | VNTWIFIvSetIBSSParameter ( |
3a215e0f | 103 | void *pMgmtHandle, |
2986db5f CC |
104 | unsigned short wBeaconPeriod, |
105 | unsigned short wATIMWindow, | |
b6e95cd5 | 106 | unsigned int uChannel |
5449c685 FB |
107 | ) |
108 | { | |
109 | PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle; | |
110 | ||
111 | pMgmt->wIBSSBeaconPeriod = wBeaconPeriod; | |
112 | pMgmt->wIBSSATIMWindow = wATIMWindow; | |
113 | pMgmt->uIBSSChannel = uChannel; | |
114 | } | |
115 | ||
116 | /*+ | |
117 | * | |
118 | * Description: | |
119 | * Get current SSID | |
120 | * | |
121 | * Parameters: | |
122 | * In: | |
123 | * pMgmtHandle - pointer to management object | |
124 | * Out: | |
125 | * none | |
126 | * | |
127 | * Return Value: current SSID pointer. | |
128 | * | |
129 | -*/ | |
130 | PWLAN_IE_SSID | |
131 | VNTWIFIpGetCurrentSSID ( | |
3a215e0f | 132 | void *pMgmtHandle |
5449c685 FB |
133 | ) |
134 | { | |
135 | PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle; | |
136 | return((PWLAN_IE_SSID) pMgmt->abyCurrSSID); | |
137 | } | |
138 | ||
139 | /*+ | |
140 | * | |
141 | * Description: | |
142 | * Get current link channel | |
143 | * | |
144 | * Parameters: | |
145 | * In: | |
146 | * pMgmtHandle - pointer to management object | |
147 | * Out: | |
148 | * none | |
149 | * | |
150 | * Return Value: current Channel. | |
151 | * | |
152 | -*/ | |
b6e95cd5 | 153 | unsigned int |
5449c685 | 154 | VNTWIFIpGetCurrentChannel ( |
3a215e0f | 155 | void *pMgmtHandle |
5449c685 FB |
156 | ) |
157 | { | |
158 | PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle; | |
159 | if (pMgmtHandle != NULL) { | |
160 | return (pMgmt->uCurrChannel); | |
161 | } | |
162 | return 0; | |
163 | } | |
164 | ||
165 | /*+ | |
166 | * | |
167 | * Description: | |
168 | * Get current Assoc ID | |
169 | * | |
170 | * Parameters: | |
171 | * In: | |
172 | * pMgmtHandle - pointer to management object | |
173 | * Out: | |
174 | * none | |
175 | * | |
176 | * Return Value: current Assoc ID | |
177 | * | |
178 | -*/ | |
2986db5f | 179 | unsigned short |
5449c685 | 180 | VNTWIFIwGetAssocID ( |
3a215e0f | 181 | void *pMgmtHandle |
5449c685 FB |
182 | ) |
183 | { | |
184 | PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle; | |
185 | return(pMgmt->wCurrAID); | |
186 | } | |
187 | ||
188 | ||
189 | ||
190 | /*+ | |
191 | * | |
192 | * Description: | |
193 | * This routine return max support rate of IES | |
194 | * | |
195 | * Parameters: | |
196 | * In: | |
197 | * pSupportRateIEs | |
198 | * pExtSupportRateIEs | |
199 | * | |
200 | * Out: | |
201 | * | |
202 | * Return Value: max support rate | |
203 | * | |
204 | -*/ | |
3fc9b584 | 205 | unsigned char |
5449c685 | 206 | VNTWIFIbyGetMaxSupportRate ( |
3a215e0f CC |
207 | PWLAN_IE_SUPP_RATES pSupportRateIEs, |
208 | PWLAN_IE_SUPP_RATES pExtSupportRateIEs | |
5449c685 FB |
209 | ) |
210 | { | |
3fc9b584 CC |
211 | unsigned char byMaxSupportRate = RATE_1M; |
212 | unsigned char bySupportRate = RATE_1M; | |
b6e95cd5 | 213 | unsigned int ii = 0; |
5449c685 FB |
214 | |
215 | if (pSupportRateIEs) { | |
216 | for (ii = 0; ii < pSupportRateIEs->len; ii++) { | |
217 | bySupportRate = DATARATEbyGetRateIdx(pSupportRateIEs->abyRates[ii]); | |
218 | if (bySupportRate > byMaxSupportRate) { | |
219 | byMaxSupportRate = bySupportRate; | |
220 | } | |
221 | } | |
222 | } | |
223 | if (pExtSupportRateIEs) { | |
224 | for (ii = 0; ii < pExtSupportRateIEs->len; ii++) { | |
225 | bySupportRate = DATARATEbyGetRateIdx(pExtSupportRateIEs->abyRates[ii]); | |
226 | if (bySupportRate > byMaxSupportRate) { | |
227 | byMaxSupportRate = bySupportRate; | |
228 | } | |
229 | } | |
230 | } | |
231 | ||
232 | return byMaxSupportRate; | |
233 | } | |
234 | ||
235 | /*+ | |
236 | * | |
237 | * Description: | |
238 | * This routine return data rate of ACK packtet | |
239 | * | |
240 | * Parameters: | |
241 | * In: | |
242 | * byRxDataRate | |
243 | * pSupportRateIEs | |
244 | * pExtSupportRateIEs | |
245 | * | |
246 | * Out: | |
247 | * | |
248 | * Return Value: max support rate | |
249 | * | |
250 | -*/ | |
3fc9b584 | 251 | unsigned char |
5449c685 | 252 | VNTWIFIbyGetACKTxRate ( |
3fc9b584 | 253 | unsigned char byRxDataRate, |
3a215e0f CC |
254 | PWLAN_IE_SUPP_RATES pSupportRateIEs, |
255 | PWLAN_IE_SUPP_RATES pExtSupportRateIEs | |
5449c685 FB |
256 | ) |
257 | { | |
3fc9b584 CC |
258 | unsigned char byMaxAckRate; |
259 | unsigned char byBasicRate; | |
b6e95cd5 | 260 | unsigned int ii; |
5449c685 FB |
261 | |
262 | if (byRxDataRate <= RATE_11M) { | |
263 | byMaxAckRate = RATE_1M; | |
264 | } else { | |
265 | // 24M is mandatory for 802.11a and 802.11g | |
266 | byMaxAckRate = RATE_24M; | |
267 | } | |
268 | if (pSupportRateIEs) { | |
269 | for (ii = 0; ii < pSupportRateIEs->len; ii++) { | |
270 | if (pSupportRateIEs->abyRates[ii] & 0x80) { | |
271 | byBasicRate = DATARATEbyGetRateIdx(pSupportRateIEs->abyRates[ii]); | |
272 | if ((byBasicRate <= byRxDataRate) && | |
273 | (byBasicRate > byMaxAckRate)) { | |
274 | byMaxAckRate = byBasicRate; | |
275 | } | |
276 | } | |
277 | } | |
278 | } | |
279 | if (pExtSupportRateIEs) { | |
280 | for (ii = 0; ii < pExtSupportRateIEs->len; ii++) { | |
281 | if (pExtSupportRateIEs->abyRates[ii] & 0x80) { | |
282 | byBasicRate = DATARATEbyGetRateIdx(pExtSupportRateIEs->abyRates[ii]); | |
283 | if ((byBasicRate <= byRxDataRate) && | |
284 | (byBasicRate > byMaxAckRate)) { | |
285 | byMaxAckRate = byBasicRate; | |
286 | } | |
287 | } | |
288 | } | |
289 | } | |
290 | ||
291 | return byMaxAckRate; | |
292 | } | |
293 | ||
294 | /*+ | |
295 | * | |
296 | * Description: | |
297 | * Set Authentication Mode | |
298 | * | |
299 | * Parameters: | |
300 | * In: | |
301 | * pMgmtHandle - pointer to management object | |
302 | * eAuthMode - Authentication mode | |
303 | * Out: | |
304 | * none | |
305 | * | |
306 | * Return Value: none | |
307 | * | |
308 | -*/ | |
6b35b7b3 | 309 | void |
5449c685 | 310 | VNTWIFIvSetAuthenticationMode ( |
3a215e0f CC |
311 | void *pMgmtHandle, |
312 | WMAC_AUTHENTICATION_MODE eAuthMode | |
5449c685 FB |
313 | ) |
314 | { | |
315 | PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle; | |
316 | ||
317 | pMgmt->eAuthenMode = eAuthMode; | |
318 | if ((eAuthMode == WMAC_AUTH_SHAREKEY) || | |
319 | (eAuthMode == WMAC_AUTH_AUTO)) { | |
1b12068a | 320 | pMgmt->bShareKeyAlgorithm = true; |
5449c685 | 321 | } else { |
5a5a2a6a | 322 | pMgmt->bShareKeyAlgorithm = false; |
5449c685 FB |
323 | } |
324 | } | |
325 | ||
326 | /*+ | |
327 | * | |
328 | * Description: | |
329 | * Set Encryption Mode | |
330 | * | |
331 | * Parameters: | |
332 | * In: | |
333 | * pMgmtHandle - pointer to management object | |
334 | * eAuthMode - Authentication mode | |
335 | * Out: | |
336 | * none | |
337 | * | |
338 | * Return Value: none | |
339 | * | |
340 | -*/ | |
6b35b7b3 | 341 | void |
5449c685 | 342 | VNTWIFIvSetEncryptionMode ( |
3a215e0f CC |
343 | void *pMgmtHandle, |
344 | WMAC_ENCRYPTION_MODE eEncryptionMode | |
5449c685 FB |
345 | ) |
346 | { | |
347 | PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle; | |
348 | ||
349 | pMgmt->eEncryptionMode = eEncryptionMode; | |
350 | if ((eEncryptionMode == WMAC_ENCRYPTION_WEPEnabled) || | |
351 | (eEncryptionMode == WMAC_ENCRYPTION_TKIPEnabled) || | |
352 | (eEncryptionMode == WMAC_ENCRYPTION_AESEnabled) ) { | |
1b12068a | 353 | pMgmt->bPrivacyInvoked = true; |
5449c685 | 354 | } else { |
5a5a2a6a | 355 | pMgmt->bPrivacyInvoked = false; |
5449c685 FB |
356 | } |
357 | } | |
358 | ||
359 | ||
360 | ||
7b6a0013 | 361 | bool |
5449c685 | 362 | VNTWIFIbConfigPhyMode ( |
3a215e0f CC |
363 | void *pMgmtHandle, |
364 | CARD_PHY_TYPE ePhyType | |
5449c685 FB |
365 | ) |
366 | { | |
367 | PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle; | |
368 | ||
369 | if ((ePhyType != PHY_TYPE_AUTO) && | |
370 | (ePhyType != pMgmt->eCurrentPHYMode)) { | |
1b12068a | 371 | if (CARDbSetPhyParameter(pMgmt->pAdapter, ePhyType, 0, 0, NULL, NULL)==true) { |
5449c685 FB |
372 | pMgmt->eCurrentPHYMode = ePhyType; |
373 | } else { | |
5a5a2a6a | 374 | return(false); |
5449c685 FB |
375 | } |
376 | } | |
377 | pMgmt->eConfigPHYMode = ePhyType; | |
1b12068a | 378 | return(true); |
5449c685 FB |
379 | } |
380 | ||
381 | ||
6b35b7b3 | 382 | void |
5449c685 | 383 | VNTWIFIbGetConfigPhyMode ( |
3a215e0f | 384 | void *pMgmtHandle, |
3cdec554 | 385 | void *pePhyType |
5449c685 FB |
386 | ) |
387 | { | |
388 | PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle; | |
389 | ||
390 | if ((pMgmt != NULL) && (pePhyType != NULL)) { | |
391 | *(PCARD_PHY_TYPE)pePhyType = pMgmt->eConfigPHYMode; | |
392 | } | |
393 | } | |
394 | ||
395 | /*+ | |
396 | * | |
397 | * Description: | |
398 | * Clear BSS List Database except current assoc BSS | |
399 | * | |
400 | * Parameters: | |
401 | * In: | |
402 | * pMgmtHandle - Management Object structure | |
403 | * bLinkPass - Current Link status | |
404 | * Out: | |
405 | * | |
406 | * Return Value: None. | |
407 | * | |
408 | -*/ | |
409 | ||
410 | ||
411 | /*+ | |
412 | * | |
413 | * Description: | |
414 | * Query BSS List in management database | |
415 | * | |
416 | * Parameters: | |
417 | * In: | |
418 | * pMgmtHandle - Management Object structure | |
419 | * Out: | |
420 | * puBSSCount - BSS count | |
421 | * pvFirstBSS - pointer to first BSS | |
422 | * | |
423 | * Return Value: None. | |
424 | * | |
425 | -*/ | |
426 | ||
6b35b7b3 | 427 | void |
fe4f34bd | 428 | VNTWIFIvQueryBSSList(void *pMgmtHandle, unsigned int *puBSSCount, void **pvFirstBSS) |
5449c685 | 429 | { |
b6e95cd5 | 430 | unsigned int ii = 0; |
5449c685 FB |
431 | PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle; |
432 | PKnownBSS pBSS = NULL; | |
b6e95cd5 | 433 | unsigned int uCount = 0; |
5449c685 FB |
434 | |
435 | *pvFirstBSS = NULL; | |
436 | ||
437 | for (ii = 0; ii < MAX_BSS_NUM; ii++) { | |
438 | pBSS = &(pMgmt->sBSSList[ii]); | |
439 | if (!pBSS->bActive) { | |
440 | continue; | |
441 | } | |
442 | if (*pvFirstBSS == NULL) { | |
443 | *pvFirstBSS = &(pMgmt->sBSSList[ii]); | |
444 | } | |
445 | uCount++; | |
446 | } | |
447 | *puBSSCount = uCount; | |
448 | } | |
449 | ||
450 | ||
451 | ||
452 | ||
6b35b7b3 | 453 | void |
5449c685 | 454 | VNTWIFIvGetNextBSS ( |
3a215e0f CC |
455 | void *pMgmtHandle, |
456 | void *pvCurrentBSS, | |
3cdec554 | 457 | void **pvNextBSS |
5449c685 FB |
458 | ) |
459 | { | |
460 | PKnownBSS pBSS = (PKnownBSS) pvCurrentBSS; | |
461 | PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle; | |
462 | ||
463 | *pvNextBSS = NULL; | |
464 | ||
465 | while (*pvNextBSS == NULL) { | |
466 | pBSS++; | |
467 | if (pBSS > &(pMgmt->sBSSList[MAX_BSS_NUM])) { | |
468 | return; | |
469 | } | |
1b12068a | 470 | if (pBSS->bActive == true) { |
5449c685 FB |
471 | *pvNextBSS = pBSS; |
472 | return; | |
473 | } | |
474 | } | |
475 | } | |
476 | ||
477 | ||
478 | ||
479 | ||
480 | ||
481 | /*+ | |
482 | * | |
483 | * Description: | |
484 | * Update Tx attemps, Tx failure counter in Node DB | |
485 | * | |
486 | * In: | |
487 | * Out: | |
488 | * none | |
489 | * | |
490 | * Return Value: none | |
491 | * | |
492 | -*/ | |
6b35b7b3 | 493 | void |
5449c685 | 494 | VNTWIFIvUpdateNodeTxCounter( |
3a215e0f | 495 | void *pMgmtHandle, |
2989e96f | 496 | unsigned char *pbyDestAddress, |
7b6a0013 | 497 | bool bTxOk, |
2986db5f | 498 | unsigned short wRate, |
2989e96f | 499 | unsigned char *pbyTxFailCount |
5449c685 FB |
500 | ) |
501 | { | |
502 | PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle; | |
b6e95cd5 CC |
503 | unsigned int uNodeIndex = 0; |
504 | unsigned int ii; | |
5449c685 FB |
505 | |
506 | if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) || | |
507 | (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) { | |
5a5a2a6a | 508 | if (BSSDBbIsSTAInNodeDB(pMgmt, pbyDestAddress, &uNodeIndex) == false) { |
5449c685 FB |
509 | return; |
510 | } | |
511 | } | |
512 | pMgmt->sNodeDBTable[uNodeIndex].uTxAttempts++; | |
1b12068a | 513 | if (bTxOk == true) { |
5449c685 FB |
514 | // transmit success, TxAttempts at least plus one |
515 | pMgmt->sNodeDBTable[uNodeIndex].uTxOk[MAX_RATE]++; | |
516 | pMgmt->sNodeDBTable[uNodeIndex].uTxOk[wRate]++; | |
517 | } else { | |
518 | pMgmt->sNodeDBTable[uNodeIndex].uTxFailures++; | |
519 | } | |
520 | pMgmt->sNodeDBTable[uNodeIndex].uTxRetry += pbyTxFailCount[MAX_RATE]; | |
521 | for(ii=0;ii<MAX_RATE;ii++) { | |
522 | pMgmt->sNodeDBTable[uNodeIndex].uTxFail[ii] += pbyTxFailCount[ii]; | |
523 | } | |
524 | return; | |
525 | } | |
526 | ||
527 | ||
6b35b7b3 | 528 | void |
5449c685 | 529 | VNTWIFIvGetTxRate( |
3a215e0f | 530 | void *pMgmtHandle, |
2989e96f | 531 | unsigned char *pbyDestAddress, |
15df6c2b | 532 | unsigned short *pwTxDataRate, |
2989e96f CC |
533 | unsigned char *pbyACKRate, |
534 | unsigned char *pbyCCKBasicRate, | |
535 | unsigned char *pbyOFDMBasicRate | |
5449c685 FB |
536 | ) |
537 | { | |
538 | PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle; | |
b6e95cd5 | 539 | unsigned int uNodeIndex = 0; |
2986db5f | 540 | unsigned short wTxDataRate = RATE_1M; |
3fc9b584 CC |
541 | unsigned char byACKRate = RATE_1M; |
542 | unsigned char byCCKBasicRate = RATE_1M; | |
543 | unsigned char byOFDMBasicRate = RATE_24M; | |
5449c685 FB |
544 | PWLAN_IE_SUPP_RATES pSupportRateIEs = NULL; |
545 | PWLAN_IE_SUPP_RATES pExtSupportRateIEs = NULL; | |
546 | ||
547 | ||
548 | if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) || | |
549 | (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) { | |
550 | // Adhoc Tx rate decided from node DB | |
551 | if(BSSDBbIsSTAInNodeDB(pMgmt, pbyDestAddress, &uNodeIndex)) { | |
552 | wTxDataRate = (pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate); | |
553 | pSupportRateIEs = (PWLAN_IE_SUPP_RATES) (pMgmt->sNodeDBTable[uNodeIndex].abyCurrSuppRates); | |
554 | pExtSupportRateIEs = (PWLAN_IE_SUPP_RATES) (pMgmt->sNodeDBTable[uNodeIndex].abyCurrExtSuppRates); | |
555 | } else { | |
556 | if (pMgmt->eCurrentPHYMode != PHY_TYPE_11A) { | |
557 | wTxDataRate = RATE_2M; | |
558 | } else { | |
559 | wTxDataRate = RATE_24M; | |
560 | } | |
561 | pSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrSuppRates; | |
562 | pExtSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrExtSuppRates; | |
563 | } | |
564 | } else { // Infrastructure: rate decided from AP Node, index = 0 | |
565 | ||
566 | wTxDataRate = (pMgmt->sNodeDBTable[0].wTxDataRate); | |
567 | #ifdef PLICE_DEBUG | |
3c02dc22 | 568 | printk(KERN_DEBUG "GetTxRate:AP MAC is %pM,TxRate is %d\n", |
e7cde7b3 | 569 | pMgmt->sNodeDBTable[0].abyMACAddr, wTxDataRate); |
5449c685 FB |
570 | #endif |
571 | ||
572 | ||
573 | pSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrSuppRates; | |
574 | pExtSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrExtSuppRates; | |
575 | } | |
3fc9b584 | 576 | byACKRate = VNTWIFIbyGetACKTxRate( (unsigned char) wTxDataRate, |
5449c685 FB |
577 | pSupportRateIEs, |
578 | pExtSupportRateIEs | |
579 | ); | |
3fc9b584 CC |
580 | if (byACKRate > (unsigned char) wTxDataRate) { |
581 | byACKRate = (unsigned char) wTxDataRate; | |
5449c685 FB |
582 | } |
583 | byCCKBasicRate = VNTWIFIbyGetACKTxRate( RATE_11M, | |
584 | pSupportRateIEs, | |
585 | pExtSupportRateIEs | |
586 | ); | |
587 | byOFDMBasicRate = VNTWIFIbyGetACKTxRate(RATE_54M, | |
588 | pSupportRateIEs, | |
589 | pExtSupportRateIEs | |
590 | ); | |
591 | *pwTxDataRate = wTxDataRate; | |
592 | *pbyACKRate = byACKRate; | |
593 | *pbyCCKBasicRate = byCCKBasicRate; | |
594 | *pbyOFDMBasicRate = byOFDMBasicRate; | |
595 | return; | |
596 | } | |
597 | ||
3fc9b584 | 598 | unsigned char |
5449c685 | 599 | VNTWIFIbyGetKeyCypher( |
3a215e0f | 600 | void *pMgmtHandle, |
7b6a0013 | 601 | bool bGroupKey |
5449c685 FB |
602 | ) |
603 | { | |
604 | PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle; | |
605 | ||
1b12068a | 606 | if (bGroupKey == true) { |
5449c685 FB |
607 | return (pMgmt->byCSSGK); |
608 | } else { | |
609 | return (pMgmt->byCSSPK); | |
610 | } | |
611 | } | |
612 | ||
613 | ||
614 | /* | |
7b6a0013 | 615 | bool |
5449c685 | 616 | VNTWIFIbInit( |
3a215e0f | 617 | void *pAdapterHandler, |
3cdec554 | 618 | void **pMgmtHandler |
5449c685 FB |
619 | ) |
620 | { | |
621 | ||
622 | PSMgmtObject pMgmt = NULL; | |
b6e95cd5 | 623 | unsigned int ii; |
5449c685 FB |
624 | |
625 | ||
626 | pMgmt = (PSMgmtObject)kmalloc(sizeof(SMgmtObject), (int)GFP_ATOMIC); | |
627 | if (pMgmt == NULL) { | |
628 | *pMgmtHandler = NULL; | |
5a5a2a6a | 629 | return false; |
5449c685 FB |
630 | } |
631 | ||
632 | memset(pMgmt, 0, sizeof(SMgmtObject)); | |
830a619c | 633 | pMgmt->pAdapter = (void *) pAdapterHandler; |
5449c685 FB |
634 | |
635 | // should initial MAC address abyMACAddr | |
636 | for(ii=0;ii<WLAN_BSSID_LEN;ii++) { | |
637 | pMgmt->abyDesireBSSID[ii] = 0xFF; | |
638 | } | |
639 | pMgmt->pbyPSPacketPool = &pMgmt->byPSPacketPool[0]; | |
640 | pMgmt->pbyMgmtPacketPool = &pMgmt->byMgmtPacketPool[0]; | |
641 | pMgmt->byCSSPK = KEY_CTL_NONE; | |
642 | pMgmt->byCSSGK = KEY_CTL_NONE; | |
643 | pMgmt->wIBSSBeaconPeriod = DEFAULT_IBSS_BI; | |
644 | ||
645 | pMgmt->cbFreeCmdQueue = CMD_Q_SIZE; | |
646 | pMgmt->uCmdDequeueIdx = 0; | |
647 | pMgmt->uCmdEnqueueIdx = 0; | |
648 | pMgmt->eCommandState = WLAN_CMD_STATE_IDLE; | |
5a5a2a6a CC |
649 | pMgmt->bCmdStop = false; |
650 | pMgmt->bCmdRunning = false; | |
5449c685 FB |
651 | |
652 | *pMgmtHandler = pMgmt; | |
1b12068a | 653 | return true; |
5449c685 FB |
654 | } |
655 | */ | |
656 | ||
657 | ||
658 | ||
7b6a0013 | 659 | bool |
5449c685 | 660 | VNTWIFIbSetPMKIDCache ( |
3a215e0f | 661 | void *pMgmtObject, |
e3fd16d0 | 662 | unsigned long ulCount, |
3a215e0f | 663 | void *pPMKIDInfo |
5449c685 FB |
664 | ) |
665 | { | |
666 | PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject; | |
667 | ||
668 | if (ulCount > MAX_PMKID_CACHE) { | |
5a5a2a6a | 669 | return (false); |
5449c685 FB |
670 | } |
671 | pMgmt->gsPMKIDCache.BSSIDInfoCount = ulCount; | |
51b6d9c2 | 672 | memcpy(pMgmt->gsPMKIDCache.BSSIDInfo, pPMKIDInfo, (ulCount*sizeof(PMKIDInfo))); |
1b12068a | 673 | return (true); |
5449c685 FB |
674 | } |
675 | ||
676 | ||
677 | ||
2986db5f | 678 | unsigned short |
5449c685 | 679 | VNTWIFIwGetMaxSupportRate( |
3a215e0f | 680 | void *pMgmtObject |
5449c685 FB |
681 | ) |
682 | { | |
2986db5f | 683 | unsigned short wRate = RATE_54M; |
5449c685 FB |
684 | PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject; |
685 | ||
686 | for(wRate = RATE_54M; wRate > RATE_1M; wRate--) { | |
256a816b | 687 | if (pMgmt->sNodeDBTable[0].wSuppRate & (1<<wRate)) { |
5449c685 FB |
688 | return (wRate); |
689 | } | |
690 | } | |
691 | if (pMgmt->eCurrentPHYMode == PHY_TYPE_11A) { | |
692 | return (RATE_6M); | |
693 | } else { | |
694 | return (RATE_1M); | |
695 | } | |
696 | } | |
697 | ||
698 | ||
6b35b7b3 | 699 | void |
5449c685 | 700 | VNTWIFIvSet11h ( |
3a215e0f | 701 | void *pMgmtObject, |
7b6a0013 | 702 | bool b11hEnable |
5449c685 FB |
703 | ) |
704 | { | |
705 | PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject; | |
706 | ||
707 | pMgmt->b11hEnable = b11hEnable; | |
708 | } | |
709 | ||
7b6a0013 | 710 | bool |
5449c685 | 711 | VNTWIFIbMeasureReport( |
3a215e0f | 712 | void *pMgmtObject, |
7b6a0013 | 713 | bool bEndOfReport, |
3a215e0f | 714 | void *pvMeasureEID, |
3fc9b584 CC |
715 | unsigned char byReportMode, |
716 | unsigned char byBasicMap, | |
717 | unsigned char byCCAFraction, | |
2989e96f | 718 | unsigned char *pbyRPIs |
5449c685 FB |
719 | ) |
720 | { | |
721 | PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject; | |
2989e96f | 722 | unsigned char *pbyCurrentEID = (unsigned char *) (pMgmt->pCurrMeasureEIDRep); |
5449c685 FB |
723 | |
724 | //spin_lock_irq(&pDevice->lock); | |
725 | if ((pvMeasureEID != NULL) && | |
726 | (pMgmt->uLengthOfRepEIDs < (WLAN_A3FR_MAXLEN - sizeof(MEASEURE_REP) - sizeof(WLAN_80211HDR_A3) - 3)) | |
727 | ) { | |
728 | pMgmt->pCurrMeasureEIDRep->byElementID = WLAN_EID_MEASURE_REP; | |
729 | pMgmt->pCurrMeasureEIDRep->len = 3; | |
730 | pMgmt->pCurrMeasureEIDRep->byToken = ((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->byToken; | |
731 | pMgmt->pCurrMeasureEIDRep->byMode = byReportMode; | |
732 | pMgmt->pCurrMeasureEIDRep->byType = ((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->byType; | |
733 | switch (pMgmt->pCurrMeasureEIDRep->byType) { | |
734 | case MEASURE_TYPE_BASIC : | |
735 | pMgmt->pCurrMeasureEIDRep->len += sizeof(MEASEURE_REP_BASIC); | |
51b6d9c2 | 736 | memcpy( &(pMgmt->pCurrMeasureEIDRep->sRep.sBasic), |
5449c685 FB |
737 | &(((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->sReq), |
738 | sizeof(MEASEURE_REQ)); | |
739 | pMgmt->pCurrMeasureEIDRep->sRep.sBasic.byMap = byBasicMap; | |
740 | break; | |
741 | case MEASURE_TYPE_CCA : | |
742 | pMgmt->pCurrMeasureEIDRep->len += sizeof(MEASEURE_REP_CCA); | |
51b6d9c2 | 743 | memcpy( &(pMgmt->pCurrMeasureEIDRep->sRep.sCCA), |
5449c685 FB |
744 | &(((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->sReq), |
745 | sizeof(MEASEURE_REQ)); | |
746 | pMgmt->pCurrMeasureEIDRep->sRep.sCCA.byCCABusyFraction = byCCAFraction; | |
747 | break; | |
748 | case MEASURE_TYPE_RPI : | |
749 | pMgmt->pCurrMeasureEIDRep->len += sizeof(MEASEURE_REP_RPI); | |
51b6d9c2 | 750 | memcpy( &(pMgmt->pCurrMeasureEIDRep->sRep.sRPI), |
5449c685 FB |
751 | &(((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->sReq), |
752 | sizeof(MEASEURE_REQ)); | |
51b6d9c2 | 753 | memcpy(pMgmt->pCurrMeasureEIDRep->sRep.sRPI.abyRPIdensity, pbyRPIs, 8); |
5449c685 FB |
754 | break; |
755 | default : | |
756 | break; | |
757 | } | |
758 | pbyCurrentEID += (2 + pMgmt->pCurrMeasureEIDRep->len); | |
759 | pMgmt->uLengthOfRepEIDs += (2 + pMgmt->pCurrMeasureEIDRep->len); | |
760 | pMgmt->pCurrMeasureEIDRep = (PWLAN_IE_MEASURE_REP) pbyCurrentEID; | |
761 | } | |
1b12068a | 762 | if (bEndOfReport == true) { |
5449c685 FB |
763 | IEEE11hbMSRRepTx(pMgmt); |
764 | } | |
765 | //spin_unlock_irq(&pDevice->lock); | |
1b12068a | 766 | return (true); |
5449c685 FB |
767 | } |
768 | ||
769 | ||
7b6a0013 | 770 | bool |
5449c685 | 771 | VNTWIFIbChannelSwitch( |
3a215e0f | 772 | void *pMgmtObject, |
3fc9b584 | 773 | unsigned char byNewChannel |
5449c685 FB |
774 | ) |
775 | { | |
776 | PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject; | |
777 | ||
778 | //spin_lock_irq(&pDevice->lock); | |
779 | pMgmt->uCurrChannel = byNewChannel; | |
5a5a2a6a | 780 | pMgmt->bSwitchChannel = false; |
5449c685 | 781 | //spin_unlock_irq(&pDevice->lock); |
1b12068a | 782 | return true; |
5449c685 FB |
783 | } |
784 | ||
785 | /* | |
7b6a0013 | 786 | bool |
5449c685 | 787 | VNTWIFIbRadarPresent( |
3a215e0f | 788 | void *pMgmtObject, |
3fc9b584 | 789 | unsigned char byChannel |
5449c685 FB |
790 | ) |
791 | { | |
792 | PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject; | |
793 | if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && | |
3fc9b584 | 794 | (byChannel == (unsigned char) pMgmt->uCurrChannel) && |
1b12068a CC |
795 | (pMgmt->bSwitchChannel != true) && |
796 | (pMgmt->b11hEnable == true)) { | |
2ef98c60 | 797 | if (!compare_ether_addr(pMgmt->abyIBSSDFSOwner, CARDpGetCurrentAddress(pMgmt->pAdapter))) { |
3fc9b584 | 798 | pMgmt->byNewChannel = CARDbyAutoChannelSelect(pMgmt->pAdapter,(unsigned char) pMgmt->uCurrChannel); |
1b12068a | 799 | pMgmt->bSwitchChannel = true; |
5449c685 FB |
800 | } |
801 | BEACONbSendBeacon(pMgmt); | |
802 | CARDbChannelSwitch(pMgmt->pAdapter, 0, pMgmt->byNewChannel, 10); | |
803 | } | |
1b12068a | 804 | return true; |
5449c685 FB |
805 | } |
806 | */ | |
807 |