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 * File: rxtx.c
20 *
21 * Purpose: handle WMAC/802.3/802.11 rx & tx functions
22 *
23 * Author: Lyndon Chen
24 *
25 * Date: May 20, 2003
26 *
27 * Functions:
28 * s_vGenerateTxParameter - Generate tx dma required parameter.
29 * s_vGenerateMACHeader - Translate 802.3 to 802.11 header
30 * csBeacon_xmit - beacon tx function
31 * csMgmt_xmit - management tx function
32 * s_uGetDataDuration - get tx data required duration
33 * s_uFillDataHead- fulfill tx data duration header
34 * s_uGetRTSCTSDuration- get rtx/cts required duration
35 * s_uGetRTSCTSRsvTime- get rts/cts reserved time
36 * s_uGetTxRsvTime- get frame reserved time
37 * s_vFillCTSHead- fulfill CTS ctl header
38 * s_vFillFragParameter- Set fragment ctl parameter.
39 * s_vFillRTSHead- fulfill RTS ctl header
40 * s_vFillTxKey- fulfill tx encrypt key
41 * s_vSWencryption- Software encrypt header
42 * vDMA0_tx_80211- tx 802.11 frame via dma0
43 * vGenerateFIFOHeader- Generate tx FIFO ctl header
44 *
45 * Revision History:
46 *
47 */
48
49 #include "device.h"
50 #include "rxtx.h"
51 #include "tether.h"
52 #include "card.h"
53 #include "bssdb.h"
54 #include "mac.h"
55 #include "baseband.h"
56 #include "michael.h"
57 #include "tkip.h"
58 #include "tcrc.h"
59 #include "wctl.h"
60 #include "hostap.h"
61 #include "rf.h"
62 #include "datarate.h"
63 #include "usbpipe.h"
64 #include "iocmd.h"
65
66 /*--------------------- Static Definitions -------------------------*/
67
68 /*--------------------- Static Classes ----------------------------*/
69
70 /*--------------------- Static Variables --------------------------*/
71 static int msglevel = MSG_LEVEL_INFO;
72
73 /*--------------------- Static Functions --------------------------*/
74
75 /*--------------------- Static Definitions -------------------------*/
76 #define CRITICAL_PACKET_LEN 256 // if packet size < 256 -> in-direct send
77 // packet size >= 256 -> direct send
78
79 const WORD wTimeStampOff[2][MAX_RATE] = {
80 {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
81 {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
82 };
83
84 const WORD wFB_Opt0[2][5] = {
85 {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0
86 {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1
87 };
88 const WORD wFB_Opt1[2][5] = {
89 {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0
90 {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1
91 };
92
93
94 #define RTSDUR_BB 0
95 #define RTSDUR_BA 1
96 #define RTSDUR_AA 2
97 #define CTSDUR_BA 3
98 #define RTSDUR_BA_F0 4
99 #define RTSDUR_AA_F0 5
100 #define RTSDUR_BA_F1 6
101 #define RTSDUR_AA_F1 7
102 #define CTSDUR_BA_F0 8
103 #define CTSDUR_BA_F1 9
104 #define DATADUR_B 10
105 #define DATADUR_A 11
106 #define DATADUR_A_F0 12
107 #define DATADUR_A_F1 13
108
109 /*--------------------- Static Functions --------------------------*/
110
111 static
112 void
113 s_vSaveTxPktInfo(
114 PSDevice pDevice,
115 BYTE byPktNum,
116 PBYTE pbyDestAddr,
117 WORD wPktLength,
118 WORD wFIFOCtl
119 );
120
121 static
122 void *
123 s_vGetFreeContext(
124 PSDevice pDevice
125 );
126
127
128 static
129 void
130 s_vGenerateTxParameter(
131 PSDevice pDevice,
132 BYTE byPktType,
133 WORD wCurrentRate,
134 void *pTxBufHead,
135 void *pvRrvTime,
136 void *pvRTS,
137 void *pvCTS,
138 unsigned int cbFrameSize,
139 BOOL bNeedACK,
140 unsigned int uDMAIdx,
141 PSEthernetHeader psEthHeader
142 );
143
144
145 static unsigned int s_uFillDataHead(
146 PSDevice pDevice,
147 BYTE byPktType,
148 WORD wCurrentRate,
149 void *pTxDataHead,
150 unsigned int cbFrameLength,
151 unsigned int uDMAIdx,
152 BOOL bNeedAck,
153 unsigned int uFragIdx,
154 unsigned int cbLastFragmentSize,
155 unsigned int uMACfragNum,
156 BYTE byFBOption
157 );
158
159
160
161
162 static
163 void
164 s_vGenerateMACHeader (
165 PSDevice pDevice,
166 PBYTE pbyBufferAddr,
167 WORD wDuration,
168 PSEthernetHeader psEthHeader,
169 BOOL bNeedEncrypt,
170 WORD wFragType,
171 unsigned int uDMAIdx,
172 unsigned int uFragIdx
173 );
174
175 static
176 void
177 s_vFillTxKey(
178 PSDevice pDevice,
179 PBYTE pbyBuf,
180 PBYTE pbyIVHead,
181 PSKeyItem pTransmitKey,
182 PBYTE pbyHdrBuf,
183 WORD wPayloadLen,
184 PBYTE pMICHDR
185 );
186
187 static
188 void
189 s_vSWencryption (
190 PSDevice pDevice,
191 PSKeyItem pTransmitKey,
192 PBYTE pbyPayloadHead,
193 WORD wPayloadSize
194 );
195
196 static unsigned int s_uGetTxRsvTime(
197 PSDevice pDevice,
198 BYTE byPktType,
199 unsigned int cbFrameLength,
200 WORD wRate,
201 BOOL bNeedAck
202 );
203
204
205 static unsigned int s_uGetRTSCTSRsvTime(
206 PSDevice pDevice,
207 BYTE byRTSRsvType,
208 BYTE byPktType,
209 unsigned int cbFrameLength,
210 WORD wCurrentRate
211 );
212
213 static
214 void
215 s_vFillCTSHead (
216 PSDevice pDevice,
217 unsigned int uDMAIdx,
218 BYTE byPktType,
219 void *pvCTS,
220 unsigned int cbFrameLength,
221 BOOL bNeedAck,
222 BOOL bDisCRC,
223 WORD wCurrentRate,
224 BYTE byFBOption
225 );
226
227 static
228 void
229 s_vFillRTSHead(
230 PSDevice pDevice,
231 BYTE byPktType,
232 void *pvRTS,
233 unsigned int cbFrameLength,
234 BOOL bNeedAck,
235 BOOL bDisCRC,
236 PSEthernetHeader psEthHeader,
237 WORD wCurrentRate,
238 BYTE byFBOption
239 );
240
241 static unsigned int s_uGetDataDuration(
242 PSDevice pDevice,
243 BYTE byDurType,
244 unsigned int cbFrameLength,
245 BYTE byPktType,
246 WORD wRate,
247 BOOL bNeedAck,
248 unsigned int uFragIdx,
249 unsigned int cbLastFragmentSize,
250 unsigned int uMACfragNum,
251 BYTE byFBOption
252 );
253
254
255 static
256 unsigned int
257 s_uGetRTSCTSDuration (
258 PSDevice pDevice,
259 BYTE byDurType,
260 unsigned int cbFrameLength,
261 BYTE byPktType,
262 WORD wRate,
263 BOOL bNeedAck,
264 BYTE byFBOption
265 );
266
267
268 /*--------------------- Export Variables --------------------------*/
269
270 static
271 void *
s_vGetFreeContext(PSDevice pDevice)272 s_vGetFreeContext(
273 PSDevice pDevice
274 )
275 {
276 PUSB_SEND_CONTEXT pContext = NULL;
277 PUSB_SEND_CONTEXT pReturnContext = NULL;
278 unsigned int ii;
279
280 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GetFreeContext()\n");
281
282 for (ii = 0; ii < pDevice->cbTD; ii++) {
283 pContext = pDevice->apTD[ii];
284 if (pContext->bBoolInUse == FALSE) {
285 pContext->bBoolInUse = TRUE;
286 pReturnContext = pContext;
287 break;
288 }
289 }
290 if ( ii == pDevice->cbTD ) {
291 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Free Tx Context\n");
292 }
293 return (void *) pReturnContext;
294 }
295
296
297 static
298 void
s_vSaveTxPktInfo(PSDevice pDevice,BYTE byPktNum,PBYTE pbyDestAddr,WORD wPktLength,WORD wFIFOCtl)299 s_vSaveTxPktInfo(PSDevice pDevice, BYTE byPktNum, PBYTE pbyDestAddr, WORD wPktLength, WORD wFIFOCtl)
300 {
301 PSStatCounter pStatistic=&(pDevice->scStatistic);
302
303 if (is_broadcast_ether_addr(pbyDestAddr))
304 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_BROAD;
305 else if (is_multicast_ether_addr(pbyDestAddr))
306 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_MULTI;
307 else
308 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_UNI;
309
310 pStatistic->abyTxPktInfo[byPktNum].wLength = wPktLength;
311 pStatistic->abyTxPktInfo[byPktNum].wFIFOCtl = wFIFOCtl;
312 memcpy(pStatistic->abyTxPktInfo[byPktNum].abyDestAddr,
313 pbyDestAddr,
314 ETH_ALEN);
315 }
316
317 static
318 void
s_vFillTxKey(PSDevice pDevice,PBYTE pbyBuf,PBYTE pbyIVHead,PSKeyItem pTransmitKey,PBYTE pbyHdrBuf,WORD wPayloadLen,PBYTE pMICHDR)319 s_vFillTxKey (
320 PSDevice pDevice,
321 PBYTE pbyBuf,
322 PBYTE pbyIVHead,
323 PSKeyItem pTransmitKey,
324 PBYTE pbyHdrBuf,
325 WORD wPayloadLen,
326 PBYTE pMICHDR
327 )
328 {
329 PDWORD pdwIV = (PDWORD) pbyIVHead;
330 PDWORD pdwExtIV = (PDWORD) ((PBYTE)pbyIVHead+4);
331 WORD wValue;
332 PS802_11Header pMACHeader = (PS802_11Header)pbyHdrBuf;
333 DWORD dwRevIVCounter;
334
335
336
337 //Fill TXKEY
338 if (pTransmitKey == NULL)
339 return;
340
341 dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
342 *pdwIV = pDevice->dwIVCounter;
343 pDevice->byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
344
345 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
346 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN ){
347 memcpy(pDevice->abyPRNG, (PBYTE)&(dwRevIVCounter), 3);
348 memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
349 } else {
350 memcpy(pbyBuf, (PBYTE)&(dwRevIVCounter), 3);
351 memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
352 if(pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
353 memcpy(pbyBuf+8, (PBYTE)&(dwRevIVCounter), 3);
354 memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
355 }
356 memcpy(pDevice->abyPRNG, pbyBuf, 16);
357 }
358 // Append IV after Mac Header
359 *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111
360 *pdwIV |= (pDevice->byKeyIndex << 30);
361 *pdwIV = cpu_to_le32(*pdwIV);
362 pDevice->dwIVCounter++;
363 if (pDevice->dwIVCounter > WEP_IV_MASK) {
364 pDevice->dwIVCounter = 0;
365 }
366 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
367 pTransmitKey->wTSC15_0++;
368 if (pTransmitKey->wTSC15_0 == 0) {
369 pTransmitKey->dwTSC47_16++;
370 }
371 TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
372 pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
373 memcpy(pbyBuf, pDevice->abyPRNG, 16);
374 // Make IV
375 memcpy(pdwIV, pDevice->abyPRNG, 3);
376
377 *(pbyIVHead+3) = (BYTE)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
378 // Append IV&ExtIV after Mac Header
379 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
380 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFillTxKey()---- pdwExtIV: %x\n",
381 *pdwExtIV);
382
383 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
384 pTransmitKey->wTSC15_0++;
385 if (pTransmitKey->wTSC15_0 == 0) {
386 pTransmitKey->dwTSC47_16++;
387 }
388 memcpy(pbyBuf, pTransmitKey->abyKey, 16);
389
390 // Make IV
391 *pdwIV = 0;
392 *(pbyIVHead+3) = (BYTE)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
393 *pdwIV |= cpu_to_le16((WORD)(pTransmitKey->wTSC15_0));
394 //Append IV&ExtIV after Mac Header
395 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
396
397 //Fill MICHDR0
398 *pMICHDR = 0x59;
399 *((PBYTE)(pMICHDR+1)) = 0; // TxPriority
400 memcpy(pMICHDR+2, &(pMACHeader->abyAddr2[0]), 6);
401 *((PBYTE)(pMICHDR+8)) = HIBYTE(HIWORD(pTransmitKey->dwTSC47_16));
402 *((PBYTE)(pMICHDR+9)) = LOBYTE(HIWORD(pTransmitKey->dwTSC47_16));
403 *((PBYTE)(pMICHDR+10)) = HIBYTE(LOWORD(pTransmitKey->dwTSC47_16));
404 *((PBYTE)(pMICHDR+11)) = LOBYTE(LOWORD(pTransmitKey->dwTSC47_16));
405 *((PBYTE)(pMICHDR+12)) = HIBYTE(pTransmitKey->wTSC15_0);
406 *((PBYTE)(pMICHDR+13)) = LOBYTE(pTransmitKey->wTSC15_0);
407 *((PBYTE)(pMICHDR+14)) = HIBYTE(wPayloadLen);
408 *((PBYTE)(pMICHDR+15)) = LOBYTE(wPayloadLen);
409
410 //Fill MICHDR1
411 *((PBYTE)(pMICHDR+16)) = 0; // HLEN[15:8]
412 if (pDevice->bLongHeader) {
413 *((PBYTE)(pMICHDR+17)) = 28; // HLEN[7:0]
414 } else {
415 *((PBYTE)(pMICHDR+17)) = 22; // HLEN[7:0]
416 }
417 wValue = cpu_to_le16(pMACHeader->wFrameCtl & 0xC78F);
418 memcpy(pMICHDR+18, (PBYTE)&wValue, 2); // MSKFRACTL
419 memcpy(pMICHDR+20, &(pMACHeader->abyAddr1[0]), 6);
420 memcpy(pMICHDR+26, &(pMACHeader->abyAddr2[0]), 6);
421
422 //Fill MICHDR2
423 memcpy(pMICHDR+32, &(pMACHeader->abyAddr3[0]), 6);
424 wValue = pMACHeader->wSeqCtl;
425 wValue &= 0x000F;
426 wValue = cpu_to_le16(wValue);
427 memcpy(pMICHDR+38, (PBYTE)&wValue, 2); // MSKSEQCTL
428 if (pDevice->bLongHeader) {
429 memcpy(pMICHDR+40, &(pMACHeader->abyAddr4[0]), 6);
430 }
431 }
432 }
433
434
435 static
436 void
s_vSWencryption(PSDevice pDevice,PSKeyItem pTransmitKey,PBYTE pbyPayloadHead,WORD wPayloadSize)437 s_vSWencryption (
438 PSDevice pDevice,
439 PSKeyItem pTransmitKey,
440 PBYTE pbyPayloadHead,
441 WORD wPayloadSize
442 )
443 {
444 unsigned int cbICVlen = 4;
445 DWORD dwICV = 0xFFFFFFFFL;
446 PDWORD pdwICV;
447
448 if (pTransmitKey == NULL)
449 return;
450
451 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
452 //=======================================================================
453 // Append ICV after payload
454 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
455 pdwICV = (PDWORD)(pbyPayloadHead + wPayloadSize);
456 // finally, we must invert dwCRC to get the correct answer
457 *pdwICV = cpu_to_le32(~dwICV);
458 // RC4 encryption
459 rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3);
460 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
461 //=======================================================================
462 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
463 //=======================================================================
464 //Append ICV after payload
465 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
466 pdwICV = (PDWORD)(pbyPayloadHead + wPayloadSize);
467 // finally, we must invert dwCRC to get the correct answer
468 *pdwICV = cpu_to_le32(~dwICV);
469 // RC4 encryption
470 rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
471 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
472 //=======================================================================
473 }
474 }
475
476
477
478
479 /*byPktType : PK_TYPE_11A 0
480 PK_TYPE_11B 1
481 PK_TYPE_11GB 2
482 PK_TYPE_11GA 3
483 */
484 static
485 unsigned int
s_uGetTxRsvTime(PSDevice pDevice,BYTE byPktType,unsigned int cbFrameLength,WORD wRate,BOOL bNeedAck)486 s_uGetTxRsvTime (
487 PSDevice pDevice,
488 BYTE byPktType,
489 unsigned int cbFrameLength,
490 WORD wRate,
491 BOOL bNeedAck
492 )
493 {
494 unsigned int uDataTime, uAckTime;
495
496 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate);
497 if (byPktType == PK_TYPE_11B) {//llb,CCK mode
498 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (WORD)pDevice->byTopCCKBasicRate);
499 } else {//11g 2.4G OFDM mode & 11a 5G OFDM mode
500 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (WORD)pDevice->byTopOFDMBasicRate);
501 }
502
503 if (bNeedAck) {
504 return (uDataTime + pDevice->uSIFS + uAckTime);
505 }
506 else {
507 return uDataTime;
508 }
509 }
510
511 //byFreqType: 0=>5GHZ 1=>2.4GHZ
512 static
513 unsigned int
s_uGetRTSCTSRsvTime(PSDevice pDevice,BYTE byRTSRsvType,BYTE byPktType,unsigned int cbFrameLength,WORD wCurrentRate)514 s_uGetRTSCTSRsvTime (
515 PSDevice pDevice,
516 BYTE byRTSRsvType,
517 BYTE byPktType,
518 unsigned int cbFrameLength,
519 WORD wCurrentRate
520 )
521 {
522 unsigned int uRrvTime , uRTSTime, uCTSTime, uAckTime, uDataTime;
523
524 uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0;
525
526
527 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate);
528 if (byRTSRsvType == 0) { //RTSTxRrvTime_bb
529 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
530 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
531 }
532 else if (byRTSRsvType == 1){ //RTSTxRrvTime_ba, only in 2.4GHZ
533 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
534 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
535 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
536 }
537 else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa
538 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate);
539 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
540 }
541 else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
542 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
543 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
544 uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS;
545 return uRrvTime;
546 }
547
548 //RTSRrvTime
549 uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS;
550 return uRrvTime;
551 }
552
553 //byFreqType 0: 5GHz, 1:2.4Ghz
554 static
555 unsigned int
s_uGetDataDuration(PSDevice pDevice,BYTE byDurType,unsigned int cbFrameLength,BYTE byPktType,WORD wRate,BOOL bNeedAck,unsigned int uFragIdx,unsigned int cbLastFragmentSize,unsigned int uMACfragNum,BYTE byFBOption)556 s_uGetDataDuration (
557 PSDevice pDevice,
558 BYTE byDurType,
559 unsigned int cbFrameLength,
560 BYTE byPktType,
561 WORD wRate,
562 BOOL bNeedAck,
563 unsigned int uFragIdx,
564 unsigned int cbLastFragmentSize,
565 unsigned int uMACfragNum,
566 BYTE byFBOption
567 )
568 {
569 BOOL bLastFrag = 0;
570 unsigned int uAckTime = 0, uNextPktTime = 0;
571
572 if (uFragIdx == (uMACfragNum-1)) {
573 bLastFrag = 1;
574 }
575
576 switch (byDurType) {
577
578 case DATADUR_B: //DATADUR_B
579 if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
580 if (bNeedAck) {
581 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
582 return (pDevice->uSIFS + uAckTime);
583 } else {
584 return 0;
585 }
586 }
587 else {//First Frag or Mid Frag
588 if (uFragIdx == (uMACfragNum-2)) {
589 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
590 } else {
591 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
592 }
593 if (bNeedAck) {
594 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
595 return (pDevice->uSIFS + uAckTime + uNextPktTime);
596 } else {
597 return (pDevice->uSIFS + uNextPktTime);
598 }
599 }
600 break;
601
602
603 case DATADUR_A: //DATADUR_A
604 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
605 if(bNeedAck){
606 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
607 return (pDevice->uSIFS + uAckTime);
608 } else {
609 return 0;
610 }
611 }
612 else {//First Frag or Mid Frag
613 if(uFragIdx == (uMACfragNum-2)){
614 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
615 } else {
616 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
617 }
618 if(bNeedAck){
619 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
620 return (pDevice->uSIFS + uAckTime + uNextPktTime);
621 } else {
622 return (pDevice->uSIFS + uNextPktTime);
623 }
624 }
625 break;
626
627 case DATADUR_A_F0: //DATADUR_A_F0
628 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
629 if(bNeedAck){
630 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
631 return (pDevice->uSIFS + uAckTime);
632 } else {
633 return 0;
634 }
635 }
636 else { //First Frag or Mid Frag
637 if (byFBOption == AUTO_FB_0) {
638 if (wRate < RATE_18M)
639 wRate = RATE_18M;
640 else if (wRate > RATE_54M)
641 wRate = RATE_54M;
642
643 if(uFragIdx == (uMACfragNum-2)){
644 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
645 } else {
646 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
647 }
648 } else { // (byFBOption == AUTO_FB_1)
649 if (wRate < RATE_18M)
650 wRate = RATE_18M;
651 else if (wRate > RATE_54M)
652 wRate = RATE_54M;
653
654 if(uFragIdx == (uMACfragNum-2)){
655 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
656 } else {
657 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
658 }
659 }
660
661 if(bNeedAck){
662 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
663 return (pDevice->uSIFS + uAckTime + uNextPktTime);
664 } else {
665 return (pDevice->uSIFS + uNextPktTime);
666 }
667 }
668 break;
669
670 case DATADUR_A_F1: //DATADUR_A_F1
671 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
672 if(bNeedAck){
673 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
674 return (pDevice->uSIFS + uAckTime);
675 } else {
676 return 0;
677 }
678 }
679 else { //First Frag or Mid Frag
680 if (byFBOption == AUTO_FB_0) {
681 if (wRate < RATE_18M)
682 wRate = RATE_18M;
683 else if (wRate > RATE_54M)
684 wRate = RATE_54M;
685
686 if(uFragIdx == (uMACfragNum-2)){
687 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
688 } else {
689 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
690 }
691
692 } else { // (byFBOption == AUTO_FB_1)
693 if (wRate < RATE_18M)
694 wRate = RATE_18M;
695 else if (wRate > RATE_54M)
696 wRate = RATE_54M;
697
698 if(uFragIdx == (uMACfragNum-2)){
699 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
700 } else {
701 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
702 }
703 }
704 if(bNeedAck){
705 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
706 return (pDevice->uSIFS + uAckTime + uNextPktTime);
707 } else {
708 return (pDevice->uSIFS + uNextPktTime);
709 }
710 }
711 break;
712
713 default:
714 break;
715 }
716
717 ASSERT(FALSE);
718 return 0;
719 }
720
721
722 //byFreqType: 0=>5GHZ 1=>2.4GHZ
723 static
724 unsigned int
s_uGetRTSCTSDuration(PSDevice pDevice,BYTE byDurType,unsigned int cbFrameLength,BYTE byPktType,WORD wRate,BOOL bNeedAck,BYTE byFBOption)725 s_uGetRTSCTSDuration (
726 PSDevice pDevice,
727 BYTE byDurType,
728 unsigned int cbFrameLength,
729 BYTE byPktType,
730 WORD wRate,
731 BOOL bNeedAck,
732 BYTE byFBOption
733 )
734 {
735 unsigned int uCTSTime = 0, uDurTime = 0;
736
737
738 switch (byDurType) {
739
740 case RTSDUR_BB: //RTSDuration_bb
741 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
742 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
743 break;
744
745 case RTSDUR_BA: //RTSDuration_ba
746 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
747 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
748 break;
749
750 case RTSDUR_AA: //RTSDuration_aa
751 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
752 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
753 break;
754
755 case CTSDUR_BA: //CTSDuration_ba
756 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
757 break;
758
759 case RTSDUR_BA_F0: //RTSDuration_ba_f0
760 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
761 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
762 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
763 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
764 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
765 }
766 break;
767
768 case RTSDUR_AA_F0: //RTSDuration_aa_f0
769 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
770 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
771 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
772 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
773 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
774 }
775 break;
776
777 case RTSDUR_BA_F1: //RTSDuration_ba_f1
778 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
779 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
780 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
781 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
782 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
783 }
784 break;
785
786 case RTSDUR_AA_F1: //RTSDuration_aa_f1
787 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
788 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
789 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
790 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
791 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
792 }
793 break;
794
795 case CTSDUR_BA_F0: //CTSDuration_ba_f0
796 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
797 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
798 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
799 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
800 }
801 break;
802
803 case CTSDUR_BA_F1: //CTSDuration_ba_f1
804 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
805 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
806 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
807 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
808 }
809 break;
810
811 default:
812 break;
813 }
814
815 return uDurTime;
816
817 }
818
819
820
821
822 static
823 unsigned int
s_uFillDataHead(PSDevice pDevice,BYTE byPktType,WORD wCurrentRate,void * pTxDataHead,unsigned int cbFrameLength,unsigned int uDMAIdx,BOOL bNeedAck,unsigned int uFragIdx,unsigned int cbLastFragmentSize,unsigned int uMACfragNum,BYTE byFBOption)824 s_uFillDataHead (
825 PSDevice pDevice,
826 BYTE byPktType,
827 WORD wCurrentRate,
828 void *pTxDataHead,
829 unsigned int cbFrameLength,
830 unsigned int uDMAIdx,
831 BOOL bNeedAck,
832 unsigned int uFragIdx,
833 unsigned int cbLastFragmentSize,
834 unsigned int uMACfragNum,
835 BYTE byFBOption
836 )
837 {
838
839 if (pTxDataHead == NULL) {
840 return 0;
841 }
842
843 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
844 if ((uDMAIdx == TYPE_ATIMDMA) || (uDMAIdx == TYPE_BEACONDMA)) {
845 PSTxDataHead_ab pBuf = (PSTxDataHead_ab) pTxDataHead;
846 //Get SignalField,ServiceField,Length
847 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
848 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
849 );
850 //Get Duration and TimeStampOff
851 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
852 wCurrentRate, bNeedAck, uFragIdx,
853 cbLastFragmentSize, uMACfragNum,
854 byFBOption); //1: 2.4GHz
855 if(uDMAIdx!=TYPE_ATIMDMA) {
856 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
857 }
858 return (pBuf->wDuration);
859 }
860 else { // DATA & MANAGE Frame
861 if (byFBOption == AUTO_FB_NONE) {
862 PSTxDataHead_g pBuf = (PSTxDataHead_g)pTxDataHead;
863 //Get SignalField,ServiceField,Length
864 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
865 (PWORD)&(pBuf->wTransmitLength_a), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
866 );
867 BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
868 (PWORD)&(pBuf->wTransmitLength_b), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
869 );
870 //Get Duration and TimeStamp
871 pBuf->wDuration_a = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength,
872 byPktType, wCurrentRate, bNeedAck, uFragIdx,
873 cbLastFragmentSize, uMACfragNum,
874 byFBOption); //1: 2.4GHz
875 pBuf->wDuration_b = (WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength,
876 PK_TYPE_11B, pDevice->byTopCCKBasicRate,
877 bNeedAck, uFragIdx, cbLastFragmentSize,
878 uMACfragNum, byFBOption); //1: 2.4GHz
879
880 pBuf->wTimeStampOff_a = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
881 pBuf->wTimeStampOff_b = wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE];
882 return (pBuf->wDuration_a);
883 } else {
884 // Auto Fallback
885 PSTxDataHead_g_FB pBuf = (PSTxDataHead_g_FB)pTxDataHead;
886 //Get SignalField,ServiceField,Length
887 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
888 (PWORD)&(pBuf->wTransmitLength_a), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
889 );
890 BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
891 (PWORD)&(pBuf->wTransmitLength_b), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
892 );
893 //Get Duration and TimeStamp
894 pBuf->wDuration_a = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
895 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
896 pBuf->wDuration_b = (WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B,
897 pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
898 pBuf->wDuration_a_f0 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
899 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
900 pBuf->wDuration_a_f1 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
901 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
902 pBuf->wTimeStampOff_a = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
903 pBuf->wTimeStampOff_b = wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE];
904 return (pBuf->wDuration_a);
905 } //if (byFBOption == AUTO_FB_NONE)
906 }
907 }
908 else if (byPktType == PK_TYPE_11A) {
909 if ((byFBOption != AUTO_FB_NONE) && (uDMAIdx != TYPE_ATIMDMA) && (uDMAIdx != TYPE_BEACONDMA)) {
910 // Auto Fallback
911 PSTxDataHead_a_FB pBuf = (PSTxDataHead_a_FB)pTxDataHead;
912 //Get SignalField,ServiceField,Length
913 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
914 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
915 );
916 //Get Duration and TimeStampOff
917 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
918 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz
919 pBuf->wDuration_f0 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
920 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz
921 pBuf->wDuration_f1 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
922 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz
923 if(uDMAIdx!=TYPE_ATIMDMA) {
924 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
925 }
926 return (pBuf->wDuration);
927 } else {
928 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
929 //Get SignalField,ServiceField,Length
930 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
931 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
932 );
933 //Get Duration and TimeStampOff
934 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
935 wCurrentRate, bNeedAck, uFragIdx,
936 cbLastFragmentSize, uMACfragNum,
937 byFBOption);
938
939 if(uDMAIdx!=TYPE_ATIMDMA) {
940 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
941 }
942 return (pBuf->wDuration);
943 }
944 }
945 else if (byPktType == PK_TYPE_11B) {
946 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
947 //Get SignalField,ServiceField,Length
948 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
949 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
950 );
951 //Get Duration and TimeStampOff
952 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType,
953 wCurrentRate, bNeedAck, uFragIdx,
954 cbLastFragmentSize, uMACfragNum,
955 byFBOption);
956 if (uDMAIdx != TYPE_ATIMDMA) {
957 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
958 }
959 return (pBuf->wDuration);
960 }
961 return 0;
962 }
963
964
965
966
967 static
968 void
s_vFillRTSHead(PSDevice pDevice,BYTE byPktType,void * pvRTS,unsigned int cbFrameLength,BOOL bNeedAck,BOOL bDisCRC,PSEthernetHeader psEthHeader,WORD wCurrentRate,BYTE byFBOption)969 s_vFillRTSHead (
970 PSDevice pDevice,
971 BYTE byPktType,
972 void *pvRTS,
973 unsigned int cbFrameLength,
974 BOOL bNeedAck,
975 BOOL bDisCRC,
976 PSEthernetHeader psEthHeader,
977 WORD wCurrentRate,
978 BYTE byFBOption
979 )
980 {
981 unsigned int uRTSFrameLen = 20;
982 WORD wLen = 0x0000;
983
984 if (pvRTS == NULL)
985 return;
986
987 if (bDisCRC) {
988 // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
989 // in this case we need to decrease its length by 4.
990 uRTSFrameLen -= 4;
991 }
992
993 // Note: So far RTSHead dosen't appear in ATIM & Beacom DMA, so we don't need to take them into account.
994 // Otherwise, we need to modified codes for them.
995 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
996 if (byFBOption == AUTO_FB_NONE) {
997 PSRTS_g pBuf = (PSRTS_g)pvRTS;
998 //Get SignalField,ServiceField,Length
999 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1000 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
1001 );
1002 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1003 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
1004 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
1005 );
1006 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
1007 //Get Duration
1008 pBuf->wDuration_bb = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, PK_TYPE_11B, pDevice->byTopCCKBasicRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
1009 pBuf->wDuration_aa = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //2:RTSDuration_aa, 1:2.4G, 2,3: 2.4G OFDMData
1010 pBuf->wDuration_ba = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //1:RTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
1011
1012 pBuf->Data.wDurationID = pBuf->wDuration_aa;
1013 //Get RTS Frame body
1014 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1015
1016 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1017 (pDevice->eOPMode == OP_MODE_AP)) {
1018 memcpy(&(pBuf->Data.abyRA[0]),
1019 &(psEthHeader->abyDstAddr[0]),
1020 ETH_ALEN);
1021 }
1022 else {
1023 memcpy(&(pBuf->Data.abyRA[0]),
1024 &(pDevice->abyBSSID[0]),
1025 ETH_ALEN);
1026 }
1027 if (pDevice->eOPMode == OP_MODE_AP) {
1028 memcpy(&(pBuf->Data.abyTA[0]),
1029 &(pDevice->abyBSSID[0]),
1030 ETH_ALEN);
1031 }
1032 else {
1033 memcpy(&(pBuf->Data.abyTA[0]),
1034 &(psEthHeader->abySrcAddr[0]),
1035 ETH_ALEN);
1036 }
1037 }
1038 else {
1039 PSRTS_g_FB pBuf = (PSRTS_g_FB)pvRTS;
1040 //Get SignalField,ServiceField,Length
1041 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1042 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
1043 );
1044 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1045 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
1046 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
1047 );
1048 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
1049 //Get Duration
1050 pBuf->wDuration_bb = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, PK_TYPE_11B, pDevice->byTopCCKBasicRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
1051 pBuf->wDuration_aa = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //2:RTSDuration_aa, 1:2.4G, 2,3:2.4G OFDMData
1052 pBuf->wDuration_ba = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //1:RTSDuration_ba, 1:2.4G, 2,3:2.4G OFDMData
1053 pBuf->wRTSDuration_ba_f0 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //4:wRTSDuration_ba_f0, 1:2.4G, 1:CCKData
1054 pBuf->wRTSDuration_aa_f0 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //5:wRTSDuration_aa_f0, 1:2.4G, 1:CCKData
1055 pBuf->wRTSDuration_ba_f1 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //6:wRTSDuration_ba_f1, 1:2.4G, 1:CCKData
1056 pBuf->wRTSDuration_aa_f1 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //7:wRTSDuration_aa_f1, 1:2.4G, 1:CCKData
1057 pBuf->Data.wDurationID = pBuf->wDuration_aa;
1058 //Get RTS Frame body
1059 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1060
1061 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1062 (pDevice->eOPMode == OP_MODE_AP)) {
1063 memcpy(&(pBuf->Data.abyRA[0]),
1064 &(psEthHeader->abyDstAddr[0]),
1065 ETH_ALEN);
1066 }
1067 else {
1068 memcpy(&(pBuf->Data.abyRA[0]),
1069 &(pDevice->abyBSSID[0]),
1070 ETH_ALEN);
1071 }
1072
1073 if (pDevice->eOPMode == OP_MODE_AP) {
1074 memcpy(&(pBuf->Data.abyTA[0]),
1075 &(pDevice->abyBSSID[0]),
1076 ETH_ALEN);
1077 }
1078 else {
1079 memcpy(&(pBuf->Data.abyTA[0]),
1080 &(psEthHeader->abySrcAddr[0]),
1081 ETH_ALEN);
1082 }
1083
1084 } // if (byFBOption == AUTO_FB_NONE)
1085 }
1086 else if (byPktType == PK_TYPE_11A) {
1087 if (byFBOption == AUTO_FB_NONE) {
1088 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
1089 //Get SignalField,ServiceField,Length
1090 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
1091 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
1092 );
1093 pBuf->wTransmitLength = cpu_to_le16(wLen);
1094 //Get Duration
1095 pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
1096 pBuf->Data.wDurationID = pBuf->wDuration;
1097 //Get RTS Frame body
1098 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1099
1100 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1101 (pDevice->eOPMode == OP_MODE_AP)) {
1102 memcpy(&(pBuf->Data.abyRA[0]),
1103 &(psEthHeader->abyDstAddr[0]),
1104 ETH_ALEN);
1105 } else {
1106 memcpy(&(pBuf->Data.abyRA[0]),
1107 &(pDevice->abyBSSID[0]),
1108 ETH_ALEN);
1109 }
1110
1111 if (pDevice->eOPMode == OP_MODE_AP) {
1112 memcpy(&(pBuf->Data.abyTA[0]),
1113 &(pDevice->abyBSSID[0]),
1114 ETH_ALEN);
1115 } else {
1116 memcpy(&(pBuf->Data.abyTA[0]),
1117 &(psEthHeader->abySrcAddr[0]),
1118 ETH_ALEN);
1119 }
1120
1121 }
1122 else {
1123 PSRTS_a_FB pBuf = (PSRTS_a_FB)pvRTS;
1124 //Get SignalField,ServiceField,Length
1125 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
1126 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
1127 );
1128 pBuf->wTransmitLength = cpu_to_le16(wLen);
1129 //Get Duration
1130 pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
1131 pBuf->wRTSDuration_f0 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //5:RTSDuration_aa_f0, 0:5G, 0: 5G OFDMData
1132 pBuf->wRTSDuration_f1 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //7:RTSDuration_aa_f1, 0:5G, 0:
1133 pBuf->Data.wDurationID = pBuf->wDuration;
1134 //Get RTS Frame body
1135 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1136
1137 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1138 (pDevice->eOPMode == OP_MODE_AP)) {
1139 memcpy(&(pBuf->Data.abyRA[0]),
1140 &(psEthHeader->abyDstAddr[0]),
1141 ETH_ALEN);
1142 } else {
1143 memcpy(&(pBuf->Data.abyRA[0]),
1144 &(pDevice->abyBSSID[0]),
1145 ETH_ALEN);
1146 }
1147 if (pDevice->eOPMode == OP_MODE_AP) {
1148 memcpy(&(pBuf->Data.abyTA[0]),
1149 &(pDevice->abyBSSID[0]),
1150 ETH_ALEN);
1151 } else {
1152 memcpy(&(pBuf->Data.abyTA[0]),
1153 &(psEthHeader->abySrcAddr[0]),
1154 ETH_ALEN);
1155 }
1156 }
1157 }
1158 else if (byPktType == PK_TYPE_11B) {
1159 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
1160 //Get SignalField,ServiceField,Length
1161 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1162 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
1163 );
1164 pBuf->wTransmitLength = cpu_to_le16(wLen);
1165 //Get Duration
1166 pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
1167 pBuf->Data.wDurationID = pBuf->wDuration;
1168 //Get RTS Frame body
1169 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1170
1171 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1172 (pDevice->eOPMode == OP_MODE_AP)) {
1173 memcpy(&(pBuf->Data.abyRA[0]),
1174 &(psEthHeader->abyDstAddr[0]),
1175 ETH_ALEN);
1176 }
1177 else {
1178 memcpy(&(pBuf->Data.abyRA[0]),
1179 &(pDevice->abyBSSID[0]),
1180 ETH_ALEN);
1181 }
1182
1183 if (pDevice->eOPMode == OP_MODE_AP) {
1184 memcpy(&(pBuf->Data.abyTA[0]),
1185 &(pDevice->abyBSSID[0]),
1186 ETH_ALEN);
1187 } else {
1188 memcpy(&(pBuf->Data.abyTA[0]),
1189 &(psEthHeader->abySrcAddr[0]),
1190 ETH_ALEN);
1191 }
1192 }
1193 }
1194
1195 static
1196 void
s_vFillCTSHead(PSDevice pDevice,unsigned int uDMAIdx,BYTE byPktType,void * pvCTS,unsigned int cbFrameLength,BOOL bNeedAck,BOOL bDisCRC,WORD wCurrentRate,BYTE byFBOption)1197 s_vFillCTSHead (
1198 PSDevice pDevice,
1199 unsigned int uDMAIdx,
1200 BYTE byPktType,
1201 void *pvCTS,
1202 unsigned int cbFrameLength,
1203 BOOL bNeedAck,
1204 BOOL bDisCRC,
1205 WORD wCurrentRate,
1206 BYTE byFBOption
1207 )
1208 {
1209 unsigned int uCTSFrameLen = 14;
1210 WORD wLen = 0x0000;
1211
1212 if (pvCTS == NULL) {
1213 return;
1214 }
1215
1216 if (bDisCRC) {
1217 // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
1218 // in this case we need to decrease its length by 4.
1219 uCTSFrameLen -= 4;
1220 }
1221
1222 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1223 if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
1224 // Auto Fall back
1225 PSCTS_FB pBuf = (PSCTS_FB)pvCTS;
1226 //Get SignalField,ServiceField,Length
1227 BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1228 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
1229 );
1230 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1231 pBuf->wDuration_ba = (WORD)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption); //3:CTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
1232 pBuf->wDuration_ba += pDevice->wCTSDuration;
1233 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1234 //Get CTSDuration_ba_f0
1235 pBuf->wCTSDuration_ba_f0 = (WORD)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption); //8:CTSDuration_ba_f0, 1:2.4G, 2,3:2.4G OFDM Data
1236 pBuf->wCTSDuration_ba_f0 += pDevice->wCTSDuration;
1237 pBuf->wCTSDuration_ba_f0 = cpu_to_le16(pBuf->wCTSDuration_ba_f0);
1238 //Get CTSDuration_ba_f1
1239 pBuf->wCTSDuration_ba_f1 = (WORD)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption); //9:CTSDuration_ba_f1, 1:2.4G, 2,3:2.4G OFDM Data
1240 pBuf->wCTSDuration_ba_f1 += pDevice->wCTSDuration;
1241 pBuf->wCTSDuration_ba_f1 = cpu_to_le16(pBuf->wCTSDuration_ba_f1);
1242 //Get CTS Frame body
1243 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1244 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1245 pBuf->Data.wReserved = 0x0000;
1246 memcpy(&(pBuf->Data.abyRA[0]),
1247 &(pDevice->abyCurrentNetAddr[0]),
1248 ETH_ALEN);
1249 } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
1250 PSCTS pBuf = (PSCTS)pvCTS;
1251 //Get SignalField,ServiceField,Length
1252 BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1253 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
1254 );
1255 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1256 //Get CTSDuration_ba
1257 pBuf->wDuration_ba = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //3:CTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
1258 pBuf->wDuration_ba += pDevice->wCTSDuration;
1259 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1260
1261 //Get CTS Frame body
1262 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1263 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1264 pBuf->Data.wReserved = 0x0000;
1265 memcpy(&(pBuf->Data.abyRA[0]),
1266 &(pDevice->abyCurrentNetAddr[0]),
1267 ETH_ALEN);
1268 }
1269 }
1270 }
1271
1272 /*+
1273 *
1274 * Description:
1275 * Generate FIFO control for MAC & Baseband controller
1276 *
1277 * Parameters:
1278 * In:
1279 * pDevice - Pointer to adpater
1280 * pTxDataHead - Transmit Data Buffer
1281 * pTxBufHead - pTxBufHead
1282 * pvRrvTime - pvRrvTime
1283 * pvRTS - RTS Buffer
1284 * pCTS - CTS Buffer
1285 * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
1286 * bNeedACK - If need ACK
1287 * uDMAIdx - DMA Index
1288 * Out:
1289 * none
1290 *
1291 * Return Value: none
1292 *
1293 -*/
1294
1295 static
1296 void
s_vGenerateTxParameter(PSDevice pDevice,BYTE byPktType,WORD wCurrentRate,void * pTxBufHead,void * pvRrvTime,void * pvRTS,void * pvCTS,unsigned int cbFrameSize,BOOL bNeedACK,unsigned int uDMAIdx,PSEthernetHeader psEthHeader)1297 s_vGenerateTxParameter (
1298 PSDevice pDevice,
1299 BYTE byPktType,
1300 WORD wCurrentRate,
1301 void *pTxBufHead,
1302 void *pvRrvTime,
1303 void *pvRTS,
1304 void *pvCTS,
1305 unsigned int cbFrameSize,
1306 BOOL bNeedACK,
1307 unsigned int uDMAIdx,
1308 PSEthernetHeader psEthHeader
1309 )
1310 {
1311 unsigned int cbMACHdLen = WLAN_HDR_ADDR3_LEN; /* 24 */
1312 WORD wFifoCtl;
1313 BOOL bDisCRC = FALSE;
1314 BYTE byFBOption = AUTO_FB_NONE;
1315 // WORD wCurrentRate = pDevice->wCurrentRate;
1316
1317 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter...\n");
1318 PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
1319 pFifoHead->wReserved = wCurrentRate;
1320 wFifoCtl = pFifoHead->wFIFOCtl;
1321
1322 if (wFifoCtl & FIFOCTL_CRCDIS) {
1323 bDisCRC = TRUE;
1324 }
1325
1326 if (wFifoCtl & FIFOCTL_AUTO_FB_0) {
1327 byFBOption = AUTO_FB_0;
1328 }
1329 else if (wFifoCtl & FIFOCTL_AUTO_FB_1) {
1330 byFBOption = AUTO_FB_1;
1331 }
1332
1333 if (pDevice->bLongHeader)
1334 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1335
1336 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1337
1338 if (pvRTS != NULL) { //RTS_need
1339 //Fill RsvTime
1340 if (pvRrvTime) {
1341 PSRrvTime_gRTS pBuf = (PSRrvTime_gRTS)pvRrvTime;
1342 pBuf->wRTSTxRrvTime_aa = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 1:2.4GHz
1343 pBuf->wRTSTxRrvTime_ba = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate));//1:RTSTxRrvTime_ba, 1:2.4GHz
1344 pBuf->wRTSTxRrvTime_bb = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1345 pBuf->wTxRrvTime_a = cpu_to_le16((WORD) s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1346 pBuf->wTxRrvTime_b = cpu_to_le16((WORD) s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1347 }
1348 //Fill RTS
1349 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1350 }
1351 else {//RTS_needless, PCF mode
1352
1353 //Fill RsvTime
1354 if (pvRrvTime) {
1355 PSRrvTime_gCTS pBuf = (PSRrvTime_gCTS)pvRrvTime;
1356 pBuf->wTxRrvTime_a = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1357 pBuf->wTxRrvTime_b = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1358 pBuf->wCTSTxRrvTime_ba = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate));//3:CTSTxRrvTime_Ba, 1:2.4GHz
1359 }
1360 //Fill CTS
1361 s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
1362 }
1363 }
1364 else if (byPktType == PK_TYPE_11A) {
1365
1366 if (pvRTS != NULL) {//RTS_need, non PCF mode
1367 //Fill RsvTime
1368 if (pvRrvTime) {
1369 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1370 pBuf->wRTSTxRrvTime = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 0:5GHz
1371 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//0:OFDM
1372 }
1373 //Fill RTS
1374 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1375 }
1376 else if (pvRTS == NULL) {//RTS_needless, non PCF mode
1377 //Fill RsvTime
1378 if (pvRrvTime) {
1379 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1380 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK)); //0:OFDM
1381 }
1382 }
1383 }
1384 else if (byPktType == PK_TYPE_11B) {
1385
1386 if ((pvRTS != NULL)) {//RTS_need, non PCF mode
1387 //Fill RsvTime
1388 if (pvRrvTime) {
1389 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1390 pBuf->wRTSTxRrvTime = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1391 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK));//1:CCK
1392 }
1393 //Fill RTS
1394 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1395 }
1396 else { //RTS_needless, non PCF mode
1397 //Fill RsvTime
1398 if (pvRrvTime) {
1399 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1400 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK)); //1:CCK
1401 }
1402 }
1403 }
1404 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter END.\n");
1405 }
1406 /*
1407 PBYTE pbyBuffer,//point to pTxBufHead
1408 WORD wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last
1409 unsigned int cbFragmentSize,//Hdr+payoad+FCS
1410 */
1411
1412
1413 BOOL
s_bPacketToWirelessUsb(PSDevice pDevice,BYTE byPktType,PBYTE usbPacketBuf,BOOL bNeedEncryption,unsigned int uSkbPacketLen,unsigned int uDMAIdx,PSEthernetHeader psEthHeader,PBYTE pPacket,PSKeyItem pTransmitKey,unsigned int uNodeIndex,WORD wCurrentRate,unsigned int * pcbHeaderLen,unsigned int * pcbTotalLen)1414 s_bPacketToWirelessUsb(
1415 PSDevice pDevice,
1416 BYTE byPktType,
1417 PBYTE usbPacketBuf,
1418 BOOL bNeedEncryption,
1419 unsigned int uSkbPacketLen,
1420 unsigned int uDMAIdx,
1421 PSEthernetHeader psEthHeader,
1422 PBYTE pPacket,
1423 PSKeyItem pTransmitKey,
1424 unsigned int uNodeIndex,
1425 WORD wCurrentRate,
1426 unsigned int *pcbHeaderLen,
1427 unsigned int *pcbTotalLen
1428 )
1429 {
1430 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1431 unsigned int cbFrameSize, cbFrameBodySize;
1432 PTX_BUFFER pTxBufHead;
1433 unsigned int cb802_1_H_len;
1434 unsigned int cbIVlen = 0, cbICVlen = 0, cbMIClen = 0,
1435 cbMACHdLen = 0, cbFCSlen = 4;
1436 unsigned int cbMICHDR = 0;
1437 BOOL bNeedACK,bRTS;
1438 PBYTE pbyType,pbyMacHdr,pbyIVHead,pbyPayloadHead,pbyTxBufferAddr;
1439 BYTE abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
1440 BYTE abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
1441 unsigned int uDuration;
1442 unsigned int cbHeaderLength = 0, uPadding = 0;
1443 void *pvRrvTime;
1444 PSMICHDRHead pMICHDR;
1445 void *pvRTS;
1446 void *pvCTS;
1447 void *pvTxDataHd;
1448 BYTE byFBOption = AUTO_FB_NONE,byFragType;
1449 WORD wTxBufSize;
1450 DWORD dwMICKey0,dwMICKey1,dwMIC_Priority,dwCRC;
1451 PDWORD pdwMIC_L,pdwMIC_R;
1452 BOOL bSoftWEP = FALSE;
1453
1454
1455
1456
1457 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
1458 if ((bNeedEncryption) && (pTransmitKey != NULL)) {
1459 if (((PSKeyTable) (pTransmitKey->pvKeyTable))->bSoftWEP == TRUE) {
1460 // WEP 256
1461 bSoftWEP = TRUE;
1462 }
1463 }
1464
1465 pTxBufHead = (PTX_BUFFER) usbPacketBuf;
1466 memset(pTxBufHead, 0, sizeof(TX_BUFFER));
1467
1468 // Get pkt type
1469 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1470 if (pDevice->dwDiagRefCount == 0) {
1471 cb802_1_H_len = 8;
1472 } else {
1473 cb802_1_H_len = 2;
1474 }
1475 } else {
1476 cb802_1_H_len = 0;
1477 }
1478
1479 cbFrameBodySize = uSkbPacketLen - ETH_HLEN + cb802_1_H_len;
1480
1481 //Set packet type
1482 pTxBufHead->wFIFOCtl |= (WORD)(byPktType<<8);
1483
1484 if (pDevice->dwDiagRefCount != 0) {
1485 bNeedACK = FALSE;
1486 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
1487 } else { //if (pDevice->dwDiagRefCount != 0) {
1488 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1489 (pDevice->eOPMode == OP_MODE_AP)) {
1490 if (is_multicast_ether_addr(psEthHeader->abyDstAddr)) {
1491 bNeedACK = FALSE;
1492 pTxBufHead->wFIFOCtl =
1493 pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
1494 } else {
1495 bNeedACK = TRUE;
1496 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1497 }
1498 }
1499 else {
1500 // MSDUs in Infra mode always need ACK
1501 bNeedACK = TRUE;
1502 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1503 }
1504 } //if (pDevice->dwDiagRefCount != 0) {
1505
1506 pTxBufHead->wTimeStamp = DEFAULT_MSDU_LIFETIME_RES_64us;
1507
1508 //Set FIFOCTL_LHEAD
1509 if (pDevice->bLongHeader)
1510 pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
1511
1512 if (pDevice->bSoftwareGenCrcErr) {
1513 pTxBufHead->wFIFOCtl |= FIFOCTL_CRCDIS; // set tx descriptors to NO hardware CRC
1514 }
1515
1516 //Set FRAGCTL_MACHDCNT
1517 if (pDevice->bLongHeader) {
1518 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1519 } else {
1520 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
1521 }
1522 pTxBufHead->wFragCtl |= (WORD)(cbMACHdLen << 10);
1523
1524 //Set FIFOCTL_GrpAckPolicy
1525 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
1526 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
1527 }
1528
1529 //Set Auto Fallback Ctl
1530 if (wCurrentRate >= RATE_18M) {
1531 if (pDevice->byAutoFBCtrl == AUTO_FB_0) {
1532 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
1533 byFBOption = AUTO_FB_0;
1534 } else if (pDevice->byAutoFBCtrl == AUTO_FB_1) {
1535 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
1536 byFBOption = AUTO_FB_1;
1537 }
1538 }
1539
1540 if (bSoftWEP != TRUE) {
1541 if ((bNeedEncryption) && (pTransmitKey != NULL)) { //WEP enabled
1542 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
1543 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
1544 }
1545 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1546 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Tx Set wFragCtl == FRAGCTL_TKIP\n");
1547 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
1548 }
1549 else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
1550 pTxBufHead->wFragCtl |= FRAGCTL_AES;
1551 }
1552 }
1553 }
1554
1555
1556 if ((bNeedEncryption) && (pTransmitKey != NULL)) {
1557 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
1558 cbIVlen = 4;
1559 cbICVlen = 4;
1560 }
1561 else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1562 cbIVlen = 8;//IV+ExtIV
1563 cbMIClen = 8;
1564 cbICVlen = 4;
1565 }
1566 if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
1567 cbIVlen = 8;//RSN Header
1568 cbICVlen = 8;//MIC
1569 cbMICHDR = sizeof(SMICHDRHead);
1570 }
1571 if (bSoftWEP == FALSE) {
1572 //MAC Header should be padding 0 to DW alignment.
1573 uPadding = 4 - (cbMACHdLen%4);
1574 uPadding %= 4;
1575 }
1576 }
1577
1578 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
1579
1580 if ( (bNeedACK == FALSE) ||(cbFrameSize < pDevice->wRTSThreshold) ) {
1581 bRTS = FALSE;
1582 } else {
1583 bRTS = TRUE;
1584 pTxBufHead->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
1585 }
1586
1587 pbyTxBufferAddr = (PBYTE) &(pTxBufHead->adwTxKey[0]);
1588 wTxBufSize = sizeof(STxBufHead);
1589 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
1590 if (byFBOption == AUTO_FB_NONE) {
1591 if (bRTS == TRUE) {//RTS_need
1592 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1593 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1594 pvRTS = (PSRTS_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1595 pvCTS = NULL;
1596 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g));
1597 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g) + sizeof(STxDataHead_g);
1598 }
1599 else { //RTS_needless
1600 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1601 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1602 pvRTS = NULL;
1603 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1604 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
1605 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
1606 }
1607 } else {
1608 // Auto Fall Back
1609 if (bRTS == TRUE) {//RTS_need
1610 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1611 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1612 pvRTS = (PSRTS_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1613 pvCTS = NULL;
1614 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB));
1615 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB) + sizeof(STxDataHead_g_FB);
1616 }
1617 else if (bRTS == FALSE) { //RTS_needless
1618 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1619 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1620 pvRTS = NULL;
1621 pvCTS = (PSCTS_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1622 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB));
1623 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB) + sizeof(STxDataHead_g_FB);
1624 }
1625 } // Auto Fall Back
1626 }
1627 else {//802.11a/b packet
1628 if (byFBOption == AUTO_FB_NONE) {
1629 if (bRTS == TRUE) {//RTS_need
1630 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1631 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1632 pvRTS = (PSRTS_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1633 pvCTS = NULL;
1634 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab));
1635 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab) + sizeof(STxDataHead_ab);
1636 }
1637 else if (bRTS == FALSE) { //RTS_needless, no MICHDR
1638 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1639 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1640 pvRTS = NULL;
1641 pvCTS = NULL;
1642 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1643 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
1644 }
1645 } else {
1646 // Auto Fall Back
1647 if (bRTS == TRUE) {//RTS_need
1648 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1649 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1650 pvRTS = (PSRTS_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1651 pvCTS = NULL;
1652 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB));
1653 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB) + sizeof(STxDataHead_a_FB);
1654 }
1655 else if (bRTS == FALSE) { //RTS_needless
1656 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1657 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1658 pvRTS = NULL;
1659 pvCTS = NULL;
1660 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1661 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_a_FB);
1662 }
1663 } // Auto Fall Back
1664 }
1665
1666 pbyMacHdr = (PBYTE)(pbyTxBufferAddr + cbHeaderLength);
1667 pbyIVHead = (PBYTE)(pbyMacHdr + cbMACHdLen + uPadding);
1668 pbyPayloadHead = (PBYTE)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
1669
1670
1671 //=========================
1672 // No Fragmentation
1673 //=========================
1674 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Fragmentation...\n");
1675 byFragType = FRAGCTL_NONFRAG;
1676 //uDMAIdx = TYPE_AC0DMA;
1677 //pTxBufHead = (PSTxBufHead) &(pTxBufHead->adwTxKey[0]);
1678
1679
1680 //Fill FIFO,RrvTime,RTS,and CTS
1681 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate,
1682 (void *)pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
1683 cbFrameSize, bNeedACK, uDMAIdx, psEthHeader);
1684 //Fill DataHead
1685 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
1686 0, 0, 1/*uMACfragNum*/, byFBOption);
1687 // Generate TX MAC Header
1688 s_vGenerateMACHeader(pDevice, pbyMacHdr, (WORD)uDuration, psEthHeader, bNeedEncryption,
1689 byFragType, uDMAIdx, 0);
1690
1691 if (bNeedEncryption == TRUE) {
1692 //Fill TXKEY
1693 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
1694 pbyMacHdr, (WORD)cbFrameBodySize, (PBYTE)pMICHDR);
1695
1696 if (pDevice->bEnableHostWEP) {
1697 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1698 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1699 }
1700 }
1701
1702 // 802.1H
1703 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
1704 if (pDevice->dwDiagRefCount == 0) {
1705 if ((psEthHeader->wType == cpu_to_be16(ETH_P_IPX)) ||
1706 (psEthHeader->wType == cpu_to_le16(0xF380))) {
1707 memcpy((PBYTE) (pbyPayloadHead),
1708 abySNAP_Bridgetunnel, 6);
1709 } else {
1710 memcpy((PBYTE) (pbyPayloadHead), &abySNAP_RFC1042[0], 6);
1711 }
1712 pbyType = (PBYTE) (pbyPayloadHead + 6);
1713 memcpy(pbyType, &(psEthHeader->wType), sizeof(WORD));
1714 } else {
1715 memcpy((PBYTE) (pbyPayloadHead), &(psEthHeader->wType), sizeof(WORD));
1716
1717 }
1718
1719 }
1720
1721
1722 if (pPacket != NULL) {
1723 // Copy the Packet into a tx Buffer
1724 memcpy((pbyPayloadHead + cb802_1_H_len),
1725 (pPacket + ETH_HLEN),
1726 uSkbPacketLen - ETH_HLEN
1727 );
1728
1729 } else {
1730 // while bRelayPacketSend psEthHeader is point to header+payload
1731 memcpy((pbyPayloadHead + cb802_1_H_len), ((PBYTE)psEthHeader) + ETH_HLEN, uSkbPacketLen - ETH_HLEN);
1732 }
1733
1734 ASSERT(uLength == cbNdisBodySize);
1735
1736 if ((bNeedEncryption == TRUE) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1737
1738 ///////////////////////////////////////////////////////////////////
1739
1740 if (pDevice->sMgmtObj.eAuthenMode == WMAC_AUTH_WPANONE) {
1741 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
1742 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
1743 }
1744 else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
1745 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
1746 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
1747 }
1748 else {
1749 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[24]);
1750 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[28]);
1751 }
1752 // DO Software Michael
1753 MIC_vInit(dwMICKey0, dwMICKey1);
1754 MIC_vAppend((PBYTE)&(psEthHeader->abyDstAddr[0]), 12);
1755 dwMIC_Priority = 0;
1756 MIC_vAppend((PBYTE)&dwMIC_Priority, 4);
1757 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC KEY: %X, %X\n",
1758 dwMICKey0, dwMICKey1);
1759
1760 ///////////////////////////////////////////////////////////////////
1761
1762 //DBG_PRN_GRP12(("Length:%d, %d\n", cbFrameBodySize, uFromHDtoPLDLength));
1763 //for (ii = 0; ii < cbFrameBodySize; ii++) {
1764 // DBG_PRN_GRP12(("%02x ", *((PBYTE)((pbyPayloadHead + cb802_1_H_len) + ii))));
1765 //}
1766 //DBG_PRN_GRP12(("\n\n\n"));
1767
1768 MIC_vAppend(pbyPayloadHead, cbFrameBodySize);
1769
1770 pdwMIC_L = (PDWORD)(pbyPayloadHead + cbFrameBodySize);
1771 pdwMIC_R = (PDWORD)(pbyPayloadHead + cbFrameBodySize + 4);
1772
1773 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1774 MIC_vUnInit();
1775
1776 if (pDevice->bTxMICFail == TRUE) {
1777 *pdwMIC_L = 0;
1778 *pdwMIC_R = 0;
1779 pDevice->bTxMICFail = FALSE;
1780 }
1781 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
1782 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderLength, uPadding, cbIVlen);
1783 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
1784 }
1785
1786
1787 if (bSoftWEP == TRUE) {
1788
1789 s_vSWencryption(pDevice, pTransmitKey, (pbyPayloadHead), (WORD)(cbFrameBodySize + cbMIClen));
1790
1791 } else if ( ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) && (bNeedEncryption == TRUE)) ||
1792 ((pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) && (bNeedEncryption == TRUE)) ||
1793 ((pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) && (bNeedEncryption == TRUE)) ) {
1794 cbFrameSize -= cbICVlen;
1795 }
1796
1797 if (pDevice->bSoftwareGenCrcErr == TRUE) {
1798 unsigned int cbLen;
1799 PDWORD pdwCRC;
1800
1801 dwCRC = 0xFFFFFFFFL;
1802 cbLen = cbFrameSize - cbFCSlen;
1803 // calculate CRC, and wrtie CRC value to end of TD
1804 dwCRC = CRCdwGetCrc32Ex(pbyMacHdr, cbLen, dwCRC);
1805 pdwCRC = (PDWORD)(pbyMacHdr + cbLen);
1806 // finally, we must invert dwCRC to get the correct answer
1807 *pdwCRC = ~dwCRC;
1808 // Force Error
1809 *pdwCRC -= 1;
1810 } else {
1811 cbFrameSize -= cbFCSlen;
1812 }
1813
1814 *pcbHeaderLen = cbHeaderLength;
1815 *pcbTotalLen = cbHeaderLength + cbFrameSize ;
1816
1817
1818 //Set FragCtl in TxBufferHead
1819 pTxBufHead->wFragCtl |= (WORD)byFragType;
1820
1821
1822 return TRUE;
1823
1824 }
1825
1826
1827 /*+
1828 *
1829 * Description:
1830 * Translate 802.3 to 802.11 header
1831 *
1832 * Parameters:
1833 * In:
1834 * pDevice - Pointer to adpater
1835 * dwTxBufferAddr - Transmit Buffer
1836 * pPacket - Packet from upper layer
1837 * cbPacketSize - Transmit Data Length
1838 * Out:
1839 * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
1840 * pcbAppendPayload - size of append payload for 802.1H translation
1841 *
1842 * Return Value: none
1843 *
1844 -*/
1845
1846 void
s_vGenerateMACHeader(PSDevice pDevice,PBYTE pbyBufferAddr,WORD wDuration,PSEthernetHeader psEthHeader,BOOL bNeedEncrypt,WORD wFragType,unsigned int uDMAIdx,unsigned int uFragIdx)1847 s_vGenerateMACHeader (
1848 PSDevice pDevice,
1849 PBYTE pbyBufferAddr,
1850 WORD wDuration,
1851 PSEthernetHeader psEthHeader,
1852 BOOL bNeedEncrypt,
1853 WORD wFragType,
1854 unsigned int uDMAIdx,
1855 unsigned int uFragIdx
1856 )
1857 {
1858 PS802_11Header pMACHeader = (PS802_11Header)pbyBufferAddr;
1859
1860 memset(pMACHeader, 0, (sizeof(S802_11Header))); //- sizeof(pMACHeader->dwIV)));
1861
1862 if (uDMAIdx == TYPE_ATIMDMA) {
1863 pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
1864 } else {
1865 pMACHeader->wFrameCtl = TYPE_802_11_DATA;
1866 }
1867
1868 if (pDevice->eOPMode == OP_MODE_AP) {
1869 memcpy(&(pMACHeader->abyAddr1[0]),
1870 &(psEthHeader->abyDstAddr[0]),
1871 ETH_ALEN);
1872 memcpy(&(pMACHeader->abyAddr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
1873 memcpy(&(pMACHeader->abyAddr3[0]),
1874 &(psEthHeader->abySrcAddr[0]),
1875 ETH_ALEN);
1876 pMACHeader->wFrameCtl |= FC_FROMDS;
1877 } else {
1878 if (pDevice->eOPMode == OP_MODE_ADHOC) {
1879 memcpy(&(pMACHeader->abyAddr1[0]),
1880 &(psEthHeader->abyDstAddr[0]),
1881 ETH_ALEN);
1882 memcpy(&(pMACHeader->abyAddr2[0]),
1883 &(psEthHeader->abySrcAddr[0]),
1884 ETH_ALEN);
1885 memcpy(&(pMACHeader->abyAddr3[0]),
1886 &(pDevice->abyBSSID[0]),
1887 ETH_ALEN);
1888 } else {
1889 memcpy(&(pMACHeader->abyAddr3[0]),
1890 &(psEthHeader->abyDstAddr[0]),
1891 ETH_ALEN);
1892 memcpy(&(pMACHeader->abyAddr2[0]),
1893 &(psEthHeader->abySrcAddr[0]),
1894 ETH_ALEN);
1895 memcpy(&(pMACHeader->abyAddr1[0]),
1896 &(pDevice->abyBSSID[0]),
1897 ETH_ALEN);
1898 pMACHeader->wFrameCtl |= FC_TODS;
1899 }
1900 }
1901
1902 if (bNeedEncrypt)
1903 pMACHeader->wFrameCtl |= cpu_to_le16((WORD)WLAN_SET_FC_ISWEP(1));
1904
1905 pMACHeader->wDurationID = cpu_to_le16(wDuration);
1906
1907 if (pDevice->bLongHeader) {
1908 PWLAN_80211HDR_A4 pMACA4Header = (PWLAN_80211HDR_A4) pbyBufferAddr;
1909 pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
1910 memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
1911 }
1912 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
1913
1914 //Set FragNumber in Sequence Control
1915 pMACHeader->wSeqCtl |= cpu_to_le16((WORD)uFragIdx);
1916
1917 if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
1918 pDevice->wSeqCounter++;
1919 if (pDevice->wSeqCounter > 0x0fff)
1920 pDevice->wSeqCounter = 0;
1921 }
1922
1923 if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) { //StartFrag or MidFrag
1924 pMACHeader->wFrameCtl |= FC_MOREFRAG;
1925 }
1926 }
1927
1928
1929
1930 /*+
1931 *
1932 * Description:
1933 * Request instructs a MAC to transmit a 802.11 management packet through
1934 * the adapter onto the medium.
1935 *
1936 * Parameters:
1937 * In:
1938 * hDeviceContext - Pointer to the adapter
1939 * pPacket - A pointer to a descriptor for the packet to transmit
1940 * Out:
1941 * none
1942 *
1943 * Return Value: CMD_STATUS_PENDING if MAC Tx resource available; otherwise FALSE
1944 *
1945 -*/
1946
csMgmt_xmit(PSDevice pDevice,PSTxMgmtPacket pPacket)1947 CMD_STATUS csMgmt_xmit(
1948 PSDevice pDevice,
1949 PSTxMgmtPacket pPacket
1950 )
1951 {
1952 BYTE byPktType;
1953 PBYTE pbyTxBufferAddr;
1954 void *pvRTS;
1955 PSCTS pCTS;
1956 void *pvTxDataHd;
1957 unsigned int uDuration;
1958 unsigned int cbReqCount;
1959 PS802_11Header pMACHeader;
1960 unsigned int cbHeaderSize;
1961 unsigned int cbFrameBodySize;
1962 BOOL bNeedACK;
1963 BOOL bIsPSPOLL = FALSE;
1964 PSTxBufHead pTxBufHead;
1965 unsigned int cbFrameSize;
1966 unsigned int cbIVlen = 0;
1967 unsigned int cbICVlen = 0;
1968 unsigned int cbMIClen = 0;
1969 unsigned int cbFCSlen = 4;
1970 unsigned int uPadding = 0;
1971 WORD wTxBufSize;
1972 unsigned int cbMacHdLen;
1973 SEthernetHeader sEthHeader;
1974 void *pvRrvTime;
1975 void *pMICHDR;
1976 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1977 WORD wCurrentRate = RATE_1M;
1978 PTX_BUFFER pTX_Buffer;
1979 PUSB_SEND_CONTEXT pContext;
1980
1981
1982
1983 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
1984
1985 if (NULL == pContext) {
1986 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n");
1987 return CMD_STATUS_RESOURCES;
1988 }
1989
1990 pTX_Buffer = (PTX_BUFFER) (&pContext->Data[0]);
1991 pbyTxBufferAddr = (PBYTE)&(pTX_Buffer->adwTxKey[0]);
1992 cbFrameBodySize = pPacket->cbPayloadLen;
1993 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
1994 wTxBufSize = sizeof(STxBufHead);
1995 memset(pTxBufHead, 0, wTxBufSize);
1996
1997 if (pDevice->byBBType == BB_TYPE_11A) {
1998 wCurrentRate = RATE_6M;
1999 byPktType = PK_TYPE_11A;
2000 } else {
2001 wCurrentRate = RATE_1M;
2002 byPktType = PK_TYPE_11B;
2003 }
2004
2005 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2006 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2007 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2008 // to set power here.
2009 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
2010 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2011 } else {
2012 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2013 }
2014 pDevice->wCurrentRate = wCurrentRate;
2015
2016
2017 //Set packet type
2018 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2019 pTxBufHead->wFIFOCtl = 0;
2020 }
2021 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2022 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2023 }
2024 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2025 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2026 }
2027 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2028 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2029 }
2030
2031 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2032 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2033
2034 if (is_multicast_ether_addr(pPacket->p80211Header->sA3.abyAddr1)) {
2035 bNeedACK = FALSE;
2036 }
2037 else {
2038 bNeedACK = TRUE;
2039 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2040 };
2041
2042 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2043 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
2044
2045 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2046 //Set Preamble type always long
2047 //pDevice->byPreambleType = PREAMBLE_LONG;
2048 // probe-response don't retry
2049 //if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2050 // bNeedACK = FALSE;
2051 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2052 //}
2053 }
2054
2055 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2056
2057 if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2058 bIsPSPOLL = TRUE;
2059 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2060 } else {
2061 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2062 }
2063
2064 //Set FRAGCTL_MACHDCNT
2065 pTxBufHead->wFragCtl |= cpu_to_le16((WORD)(cbMacHdLen << 10));
2066
2067 // Notes:
2068 // Although spec says MMPDU can be fragmented; In most case,
2069 // no one will send a MMPDU under fragmentation. With RTS may occur.
2070 pDevice->bAES = FALSE; //Set FRAGCTL_WEPTYP
2071
2072 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2073 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2074 cbIVlen = 4;
2075 cbICVlen = 4;
2076 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2077 }
2078 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2079 cbIVlen = 8;//IV+ExtIV
2080 cbMIClen = 8;
2081 cbICVlen = 4;
2082 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2083 //We need to get seed here for filling TxKey entry.
2084 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2085 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2086 }
2087 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2088 cbIVlen = 8;//RSN Header
2089 cbICVlen = 8;//MIC
2090 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2091 pDevice->bAES = TRUE;
2092 }
2093 //MAC Header should be padding 0 to DW alignment.
2094 uPadding = 4 - (cbMacHdLen%4);
2095 uPadding %= 4;
2096 }
2097
2098 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
2099
2100 //Set FIFOCTL_GrpAckPolicy
2101 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
2102 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2103 }
2104 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2105
2106 //Set RrvTime/RTS/CTS Buffer
2107 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2108
2109 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2110 pMICHDR = NULL;
2111 pvRTS = NULL;
2112 pCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2113 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS));
2114 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS) + sizeof(STxDataHead_g);
2115 }
2116 else { // 802.11a/b packet
2117 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2118 pMICHDR = NULL;
2119 pvRTS = NULL;
2120 pCTS = NULL;
2121 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2122 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + sizeof(STxDataHead_ab);
2123 }
2124
2125 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0,
2126 (cbHeaderSize - wTxBufSize));
2127
2128 memcpy(&(sEthHeader.abyDstAddr[0]),
2129 &(pPacket->p80211Header->sA3.abyAddr1[0]),
2130 ETH_ALEN);
2131 memcpy(&(sEthHeader.abySrcAddr[0]),
2132 &(pPacket->p80211Header->sA3.abyAddr2[0]),
2133 ETH_ALEN);
2134 //=========================
2135 // No Fragmentation
2136 //=========================
2137 pTxBufHead->wFragCtl |= (WORD)FRAGCTL_NONFRAG;
2138
2139
2140 //Fill FIFO,RrvTime,RTS,and CTS
2141 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
2142 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader);
2143
2144 //Fill DataHead
2145 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2146 0, 0, 1, AUTO_FB_NONE);
2147
2148 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2149
2150 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
2151
2152 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2153 PBYTE pbyIVHead;
2154 PBYTE pbyPayloadHead;
2155 PBYTE pbyBSSID;
2156 PSKeyItem pTransmitKey = NULL;
2157
2158 pbyIVHead = (PBYTE)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
2159 pbyPayloadHead = (PBYTE)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
2160 do {
2161 if ((pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) &&
2162 (pDevice->bLinkPass == TRUE)) {
2163 pbyBSSID = pDevice->abyBSSID;
2164 // get pairwise key
2165 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) {
2166 // get group key
2167 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) {
2168 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
2169 break;
2170 }
2171 } else {
2172 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get PTK.\n");
2173 break;
2174 }
2175 }
2176 // get group key
2177 pbyBSSID = pDevice->abyBroadcastAddr;
2178 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
2179 pTransmitKey = NULL;
2180 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KEY is NULL. OP Mode[%d]\n", pDevice->eOPMode);
2181 } else {
2182 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
2183 }
2184 } while(FALSE);
2185 //Fill TXKEY
2186 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2187 (PBYTE)pMACHeader, (WORD)cbFrameBodySize, NULL);
2188
2189 memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
2190 memcpy(pbyPayloadHead, ((PBYTE)(pPacket->p80211Header) + cbMacHdLen),
2191 cbFrameBodySize);
2192 }
2193 else {
2194 // Copy the Packet into a tx Buffer
2195 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2196 }
2197
2198 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2199 pDevice->wSeqCounter++ ;
2200 if (pDevice->wSeqCounter > 0x0fff)
2201 pDevice->wSeqCounter = 0;
2202
2203 if (bIsPSPOLL) {
2204 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2205 // of FIFO control header.
2206 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2207 // in the same place of other packet's Duration-field).
2208 // And it will cause Cisco-AP to issue Disassociation-packet
2209 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2210 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2211 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2212 } else {
2213 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2214 }
2215 }
2216
2217
2218 pTX_Buffer->wTxByteCount = cpu_to_le16((WORD)(cbReqCount));
2219 pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2220 pTX_Buffer->byType = 0x00;
2221
2222 pContext->pPacket = NULL;
2223 pContext->Type = CONTEXT_MGMT_PACKET;
2224 pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
2225
2226 if (WLAN_GET_FC_TODS(pMACHeader->wFrameCtl) == 0) {
2227 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr1[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2228 }
2229 else {
2230 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr3[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2231 }
2232
2233 PIPEnsSendBulkOut(pDevice,pContext);
2234 return CMD_STATUS_PENDING;
2235 }
2236
2237
2238 CMD_STATUS
csBeacon_xmit(PSDevice pDevice,PSTxMgmtPacket pPacket)2239 csBeacon_xmit(
2240 PSDevice pDevice,
2241 PSTxMgmtPacket pPacket
2242 )
2243 {
2244
2245 unsigned int cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
2246 unsigned int cbHeaderSize = 0;
2247 WORD wTxBufSize = sizeof(STxShortBufHead);
2248 PSTxShortBufHead pTxBufHead;
2249 PS802_11Header pMACHeader;
2250 PSTxDataHead_ab pTxDataHead;
2251 WORD wCurrentRate;
2252 unsigned int cbFrameBodySize;
2253 unsigned int cbReqCount;
2254 PBEACON_BUFFER pTX_Buffer;
2255 PBYTE pbyTxBufferAddr;
2256 PUSB_SEND_CONTEXT pContext;
2257 CMD_STATUS status;
2258
2259
2260 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2261 if (NULL == pContext) {
2262 status = CMD_STATUS_RESOURCES;
2263 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n");
2264 return status ;
2265 }
2266 pTX_Buffer = (PBEACON_BUFFER) (&pContext->Data[0]);
2267 pbyTxBufferAddr = (PBYTE)&(pTX_Buffer->wFIFOCtl);
2268
2269 cbFrameBodySize = pPacket->cbPayloadLen;
2270
2271 pTxBufHead = (PSTxShortBufHead) pbyTxBufferAddr;
2272 wTxBufSize = sizeof(STxShortBufHead);
2273 memset(pTxBufHead, 0, wTxBufSize);
2274
2275 if (pDevice->byBBType == BB_TYPE_11A) {
2276 wCurrentRate = RATE_6M;
2277 pTxDataHead = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize);
2278 //Get SignalField,ServiceField,Length
2279 BBvCaculateParameter(pDevice, cbFrameSize, wCurrentRate, PK_TYPE_11A,
2280 (PWORD)&(pTxDataHead->wTransmitLength), (PBYTE)&(pTxDataHead->byServiceField), (PBYTE)&(pTxDataHead->bySignalField)
2281 );
2282 //Get Duration and TimeStampOff
2283 pTxDataHead->wDuration = cpu_to_le16((WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameSize, PK_TYPE_11A,
2284 wCurrentRate, FALSE, 0, 0, 1, AUTO_FB_NONE));
2285 pTxDataHead->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
2286 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2287 } else {
2288 wCurrentRate = RATE_1M;
2289 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2290 pTxDataHead = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize);
2291 //Get SignalField,ServiceField,Length
2292 BBvCaculateParameter(pDevice, cbFrameSize, wCurrentRate, PK_TYPE_11B,
2293 (PWORD)&(pTxDataHead->wTransmitLength), (PBYTE)&(pTxDataHead->byServiceField), (PBYTE)&(pTxDataHead->bySignalField)
2294 );
2295 //Get Duration and TimeStampOff
2296 pTxDataHead->wDuration = cpu_to_le16((WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameSize, PK_TYPE_11B,
2297 wCurrentRate, FALSE, 0, 0, 1, AUTO_FB_NONE));
2298 pTxDataHead->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
2299 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2300 }
2301
2302 //Generate Beacon Header
2303 pMACHeader = (PS802_11Header)(pbyTxBufferAddr + cbHeaderSize);
2304 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
2305
2306 pMACHeader->wDurationID = 0;
2307 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2308 pDevice->wSeqCounter++ ;
2309 if (pDevice->wSeqCounter > 0x0fff)
2310 pDevice->wSeqCounter = 0;
2311
2312 cbReqCount = cbHeaderSize + WLAN_HDR_ADDR3_LEN + cbFrameBodySize;
2313
2314 pTX_Buffer->wTxByteCount = (WORD)cbReqCount;
2315 pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2316 pTX_Buffer->byType = 0x01;
2317
2318 pContext->pPacket = NULL;
2319 pContext->Type = CONTEXT_MGMT_PACKET;
2320 pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
2321
2322 PIPEnsSendBulkOut(pDevice,pContext);
2323 return CMD_STATUS_PENDING;
2324
2325 }
2326
2327
2328
2329
2330
2331 void
vDMA0_tx_80211(PSDevice pDevice,struct sk_buff * skb)2332 vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb) {
2333
2334 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
2335 BYTE byPktType;
2336 PBYTE pbyTxBufferAddr;
2337 void *pvRTS;
2338 void *pvCTS;
2339 void *pvTxDataHd;
2340 unsigned int uDuration;
2341 unsigned int cbReqCount;
2342 PS802_11Header pMACHeader;
2343 unsigned int cbHeaderSize;
2344 unsigned int cbFrameBodySize;
2345 BOOL bNeedACK;
2346 BOOL bIsPSPOLL = FALSE;
2347 PSTxBufHead pTxBufHead;
2348 unsigned int cbFrameSize;
2349 unsigned int cbIVlen = 0;
2350 unsigned int cbICVlen = 0;
2351 unsigned int cbMIClen = 0;
2352 unsigned int cbFCSlen = 4;
2353 unsigned int uPadding = 0;
2354 unsigned int cbMICHDR = 0;
2355 unsigned int uLength = 0;
2356 DWORD dwMICKey0, dwMICKey1;
2357 DWORD dwMIC_Priority;
2358 PDWORD pdwMIC_L;
2359 PDWORD pdwMIC_R;
2360 WORD wTxBufSize;
2361 unsigned int cbMacHdLen;
2362 SEthernetHeader sEthHeader;
2363 void *pvRrvTime;
2364 void *pMICHDR;
2365 WORD wCurrentRate = RATE_1M;
2366 PUWLAN_80211HDR p80211Header;
2367 unsigned int uNodeIndex = 0;
2368 BOOL bNodeExist = FALSE;
2369 SKeyItem STempKey;
2370 PSKeyItem pTransmitKey = NULL;
2371 PBYTE pbyIVHead;
2372 PBYTE pbyPayloadHead;
2373 PBYTE pbyMacHdr;
2374 unsigned int cbExtSuppRate = 0;
2375 PTX_BUFFER pTX_Buffer;
2376 PUSB_SEND_CONTEXT pContext;
2377 // PWLAN_IE pItem;
2378
2379
2380 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
2381
2382 if(skb->len <= WLAN_HDR_ADDR3_LEN) {
2383 cbFrameBodySize = 0;
2384 }
2385 else {
2386 cbFrameBodySize = skb->len - WLAN_HDR_ADDR3_LEN;
2387 }
2388 p80211Header = (PUWLAN_80211HDR)skb->data;
2389
2390 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2391
2392 if (NULL == pContext) {
2393 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0 TX...NO CONTEXT!\n");
2394 dev_kfree_skb_irq(skb);
2395 return ;
2396 }
2397
2398 pTX_Buffer = (PTX_BUFFER)(&pContext->Data[0]);
2399 pbyTxBufferAddr = (PBYTE)(&pTX_Buffer->adwTxKey[0]);
2400 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2401 wTxBufSize = sizeof(STxBufHead);
2402 memset(pTxBufHead, 0, wTxBufSize);
2403
2404 if (pDevice->byBBType == BB_TYPE_11A) {
2405 wCurrentRate = RATE_6M;
2406 byPktType = PK_TYPE_11A;
2407 } else {
2408 wCurrentRate = RATE_1M;
2409 byPktType = PK_TYPE_11B;
2410 }
2411
2412 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2413 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2414 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2415 // to set power here.
2416 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
2417 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2418 } else {
2419 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2420 }
2421
2422 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x \n", p80211Header->sA3.wFrameCtl);
2423
2424 //Set packet type
2425 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2426 pTxBufHead->wFIFOCtl = 0;
2427 }
2428 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2429 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2430 }
2431 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2432 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2433 }
2434 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2435 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2436 }
2437
2438 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2439 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2440
2441 if (is_multicast_ether_addr(p80211Header->sA3.abyAddr1)) {
2442 bNeedACK = FALSE;
2443 if (pDevice->bEnableHostWEP) {
2444 uNodeIndex = 0;
2445 bNodeExist = TRUE;
2446 }
2447 }
2448 else {
2449 if (pDevice->bEnableHostWEP) {
2450 if (BSSbIsSTAInNodeDB(pDevice, (PBYTE)(p80211Header->sA3.abyAddr1), &uNodeIndex))
2451 bNodeExist = TRUE;
2452 }
2453 bNeedACK = TRUE;
2454 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2455 };
2456
2457 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2458 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
2459
2460 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2461 //Set Preamble type always long
2462 //pDevice->byPreambleType = PREAMBLE_LONG;
2463
2464 // probe-response don't retry
2465 //if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2466 // bNeedACK = FALSE;
2467 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2468 //}
2469 }
2470
2471 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2472
2473 if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2474 bIsPSPOLL = TRUE;
2475 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2476 } else {
2477 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2478 }
2479
2480 // hostapd deamon ext support rate patch
2481 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2482
2483 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0) {
2484 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
2485 }
2486
2487 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0) {
2488 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
2489 }
2490
2491 if (cbExtSuppRate >0) {
2492 cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
2493 }
2494 }
2495
2496
2497 //Set FRAGCTL_MACHDCNT
2498 pTxBufHead->wFragCtl |= cpu_to_le16((WORD)cbMacHdLen << 10);
2499
2500 // Notes:
2501 // Although spec says MMPDU can be fragmented; In most case,
2502 // no one will send a MMPDU under fragmentation. With RTS may occur.
2503 pDevice->bAES = FALSE; //Set FRAGCTL_WEPTYP
2504
2505
2506 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2507 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2508 cbIVlen = 4;
2509 cbICVlen = 4;
2510 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2511 }
2512 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2513 cbIVlen = 8;//IV+ExtIV
2514 cbMIClen = 8;
2515 cbICVlen = 4;
2516 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2517 //We need to get seed here for filling TxKey entry.
2518 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2519 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2520 }
2521 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2522 cbIVlen = 8;//RSN Header
2523 cbICVlen = 8;//MIC
2524 cbMICHDR = sizeof(SMICHDRHead);
2525 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2526 pDevice->bAES = TRUE;
2527 }
2528 //MAC Header should be padding 0 to DW alignment.
2529 uPadding = 4 - (cbMacHdLen%4);
2530 uPadding %= 4;
2531 }
2532
2533 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
2534
2535 //Set FIFOCTL_GrpAckPolicy
2536 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
2537 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2538 }
2539 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2540
2541
2542 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2543
2544 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2545 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2546 pvRTS = NULL;
2547 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
2548 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
2549 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
2550
2551 }
2552 else {//802.11a/b packet
2553
2554 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2555 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2556 pvRTS = NULL;
2557 pvCTS = NULL;
2558 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
2559 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
2560 }
2561 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0,
2562 (cbHeaderSize - wTxBufSize));
2563 memcpy(&(sEthHeader.abyDstAddr[0]),
2564 &(p80211Header->sA3.abyAddr1[0]),
2565 ETH_ALEN);
2566 memcpy(&(sEthHeader.abySrcAddr[0]),
2567 &(p80211Header->sA3.abyAddr2[0]),
2568 ETH_ALEN);
2569 //=========================
2570 // No Fragmentation
2571 //=========================
2572 pTxBufHead->wFragCtl |= (WORD)FRAGCTL_NONFRAG;
2573
2574
2575 //Fill FIFO,RrvTime,RTS,and CTS
2576 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
2577 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader);
2578
2579 //Fill DataHead
2580 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2581 0, 0, 1, AUTO_FB_NONE);
2582
2583 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2584
2585 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
2586
2587 pbyMacHdr = (PBYTE)(pbyTxBufferAddr + cbHeaderSize);
2588 pbyPayloadHead = (PBYTE)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
2589 pbyIVHead = (PBYTE)(pbyMacHdr + cbMacHdLen + uPadding);
2590
2591 // Copy the Packet into a tx Buffer
2592 memcpy(pbyMacHdr, skb->data, cbMacHdLen);
2593
2594 // version set to 0, patch for hostapd deamon
2595 pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
2596 memcpy(pbyPayloadHead, (skb->data + cbMacHdLen), cbFrameBodySize);
2597
2598 // replace support rate, patch for hostapd deamon( only support 11M)
2599 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2600 if (cbExtSuppRate != 0) {
2601 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
2602 memcpy((pbyPayloadHead + cbFrameBodySize),
2603 pMgmt->abyCurrSuppRates,
2604 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
2605 );
2606 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
2607 memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
2608 pMgmt->abyCurrExtSuppRates,
2609 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
2610 );
2611 }
2612 }
2613
2614 // Set wep
2615 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2616
2617 if (pDevice->bEnableHostWEP) {
2618 pTransmitKey = &STempKey;
2619 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2620 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2621 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2622 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2623 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2624 memcpy(pTransmitKey->abyKey,
2625 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2626 pTransmitKey->uKeyLength
2627 );
2628 }
2629
2630 if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
2631
2632 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
2633 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
2634
2635 // DO Software Michael
2636 MIC_vInit(dwMICKey0, dwMICKey1);
2637 MIC_vAppend((PBYTE)&(sEthHeader.abyDstAddr[0]), 12);
2638 dwMIC_Priority = 0;
2639 MIC_vAppend((PBYTE)&dwMIC_Priority, 4);
2640 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0_tx_8021:MIC KEY:"\
2641 " %X, %X\n", dwMICKey0, dwMICKey1);
2642
2643 uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
2644
2645 MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
2646
2647 pdwMIC_L = (PDWORD)(pbyTxBufferAddr + uLength + cbFrameBodySize);
2648 pdwMIC_R = (PDWORD)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
2649
2650 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
2651 MIC_vUnInit();
2652
2653 if (pDevice->bTxMICFail == TRUE) {
2654 *pdwMIC_L = 0;
2655 *pdwMIC_R = 0;
2656 pDevice->bTxMICFail = FALSE;
2657 }
2658
2659 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
2660 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderSize, uPadding, cbIVlen);
2661 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%x, %x\n",
2662 *pdwMIC_L, *pdwMIC_R);
2663
2664 }
2665
2666 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2667 pbyMacHdr, (WORD)cbFrameBodySize, (PBYTE)pMICHDR);
2668
2669 if (pDevice->bEnableHostWEP) {
2670 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
2671 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
2672 }
2673
2674 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
2675 s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (WORD)(cbFrameBodySize + cbMIClen));
2676 }
2677 }
2678
2679 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2680 pDevice->wSeqCounter++ ;
2681 if (pDevice->wSeqCounter > 0x0fff)
2682 pDevice->wSeqCounter = 0;
2683
2684
2685 if (bIsPSPOLL) {
2686 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2687 // of FIFO control header.
2688 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2689 // in the same place of other packet's Duration-field).
2690 // And it will cause Cisco-AP to issue Disassociation-packet
2691 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2692 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
2693 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
2694 } else {
2695 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(p80211Header->sA2.wDurationID);
2696 }
2697 }
2698
2699 pTX_Buffer->wTxByteCount = cpu_to_le16((WORD)(cbReqCount));
2700 pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2701 pTX_Buffer->byType = 0x00;
2702
2703 pContext->pPacket = skb;
2704 pContext->Type = CONTEXT_MGMT_PACKET;
2705 pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
2706
2707 if (WLAN_GET_FC_TODS(pMACHeader->wFrameCtl) == 0) {
2708 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr1[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2709 }
2710 else {
2711 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr3[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2712 }
2713 PIPEnsSendBulkOut(pDevice,pContext);
2714 return ;
2715
2716 }
2717
2718
2719
2720
2721 //TYPE_AC0DMA data tx
2722 /*
2723 * Description:
2724 * Tx packet via AC0DMA(DMA1)
2725 *
2726 * Parameters:
2727 * In:
2728 * pDevice - Pointer to the adapter
2729 * skb - Pointer to tx skb packet
2730 * Out:
2731 * void
2732 *
2733 * Return Value: NULL
2734 */
2735
nsDMA_tx_packet(PSDevice pDevice,unsigned int uDMAIdx,struct sk_buff * skb)2736 int nsDMA_tx_packet(PSDevice pDevice, unsigned int uDMAIdx, struct sk_buff *skb)
2737 {
2738 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
2739 unsigned int BytesToWrite = 0, uHeaderLen = 0;
2740 unsigned int uNodeIndex = 0;
2741 BYTE byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
2742 WORD wAID;
2743 BYTE byPktType;
2744 BOOL bNeedEncryption = FALSE;
2745 PSKeyItem pTransmitKey = NULL;
2746 SKeyItem STempKey;
2747 unsigned int ii;
2748 BOOL bTKIP_UseGTK = FALSE;
2749 BOOL bNeedDeAuth = FALSE;
2750 PBYTE pbyBSSID;
2751 BOOL bNodeExist = FALSE;
2752 PUSB_SEND_CONTEXT pContext;
2753 BOOL fConvertedPacket;
2754 PTX_BUFFER pTX_Buffer;
2755 unsigned int status;
2756 WORD wKeepRate = pDevice->wCurrentRate;
2757 struct net_device_stats* pStats = &pDevice->stats;
2758 BOOL bTxeapol_key = FALSE;
2759
2760
2761 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2762
2763 if (pDevice->uAssocCount == 0) {
2764 dev_kfree_skb_irq(skb);
2765 return 0;
2766 }
2767
2768 if (is_multicast_ether_addr((PBYTE)(skb->data))) {
2769 uNodeIndex = 0;
2770 bNodeExist = TRUE;
2771 if (pMgmt->sNodeDBTable[0].bPSEnable) {
2772
2773 skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skb);
2774 pMgmt->sNodeDBTable[0].wEnQueueCnt++;
2775 // set tx map
2776 pMgmt->abyPSTxMap[0] |= byMask[0];
2777 return 0;
2778 }
2779 // muticast/broadcast data rate
2780
2781 if (pDevice->byBBType != BB_TYPE_11A)
2782 pDevice->wCurrentRate = RATE_2M;
2783 else
2784 pDevice->wCurrentRate = RATE_24M;
2785 // long preamble type
2786 pDevice->byPreambleType = PREAMBLE_SHORT;
2787
2788 }else {
2789
2790 if (BSSbIsSTAInNodeDB(pDevice, (PBYTE)(skb->data), &uNodeIndex)) {
2791
2792 if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
2793
2794 skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
2795
2796 pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
2797 // set tx map
2798 wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
2799 pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
2800 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set:pMgmt->abyPSTxMap[%d]= %d\n",
2801 (wAID >> 3), pMgmt->abyPSTxMap[wAID >> 3]);
2802
2803 return 0;
2804 }
2805 // AP rate decided from node
2806 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2807 // tx preamble decided from node
2808
2809 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2810 pDevice->byPreambleType = pDevice->byShortPreamble;
2811
2812 }else {
2813 pDevice->byPreambleType = PREAMBLE_LONG;
2814 }
2815 bNodeExist = TRUE;
2816 }
2817 }
2818
2819 if (bNodeExist == FALSE) {
2820 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Unknown STA not found in node DB \n");
2821 dev_kfree_skb_irq(skb);
2822 return 0;
2823 }
2824 }
2825
2826 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2827
2828 if (pContext == NULL) {
2829 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG" pContext == NULL\n");
2830 dev_kfree_skb_irq(skb);
2831 return STATUS_RESOURCES;
2832 }
2833
2834 memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)(skb->data), ETH_HLEN);
2835
2836 //mike add:station mode check eapol-key challenge--->
2837 {
2838 BYTE Protocol_Version; //802.1x Authentication
2839 BYTE Packet_Type; //802.1x Authentication
2840 BYTE Descriptor_type;
2841 WORD Key_info;
2842
2843 Protocol_Version = skb->data[ETH_HLEN];
2844 Packet_Type = skb->data[ETH_HLEN+1];
2845 Descriptor_type = skb->data[ETH_HLEN+1+1+2];
2846 Key_info = (skb->data[ETH_HLEN+1+1+2+1] << 8)|(skb->data[ETH_HLEN+1+1+2+2]);
2847 if (pDevice->sTxEthHeader.wType == cpu_to_be16(ETH_P_PAE)) {
2848 /* 802.1x OR eapol-key challenge frame transfer */
2849 if (((Protocol_Version == 1) || (Protocol_Version == 2)) &&
2850 (Packet_Type == 3)) {
2851 bTxeapol_key = TRUE;
2852 if(!(Key_info & BIT3) && //WPA or RSN group-key challenge
2853 (Key_info & BIT8) && (Key_info & BIT9)) { //send 2/2 key
2854 if(Descriptor_type==254) {
2855 pDevice->fWPA_Authened = TRUE;
2856 PRINT_K("WPA ");
2857 }
2858 else {
2859 pDevice->fWPA_Authened = TRUE;
2860 PRINT_K("WPA2(re-keying) ");
2861 }
2862 PRINT_K("Authentication completed!!\n");
2863 }
2864 else if((Key_info & BIT3) && (Descriptor_type==2) && //RSN pairse-key challenge
2865 (Key_info & BIT8) && (Key_info & BIT9)) {
2866 pDevice->fWPA_Authened = TRUE;
2867 PRINT_K("WPA2 Authentication completed!!\n");
2868 }
2869 }
2870 }
2871 }
2872 //mike add:station mode check eapol-key challenge<---
2873
2874 if (pDevice->bEncryptionEnable == TRUE) {
2875 bNeedEncryption = TRUE;
2876 // get Transmit key
2877 do {
2878 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
2879 (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2880 pbyBSSID = pDevice->abyBSSID;
2881 // get pairwise key
2882 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) {
2883 // get group key
2884 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) {
2885 bTKIP_UseGTK = TRUE;
2886 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2887 break;
2888 }
2889 } else {
2890 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get PTK.\n");
2891 break;
2892 }
2893 }else if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2894
2895 pbyBSSID = pDevice->sTxEthHeader.abyDstAddr; //TO_DS = 0 and FROM_DS = 0 --> 802.11 MAC Address1
2896 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS Serach Key: \n");
2897 for (ii = 0; ii< 6; ii++)
2898 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"%x \n", *(pbyBSSID+ii));
2899 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"\n");
2900
2901 // get pairwise key
2902 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == TRUE)
2903 break;
2904 }
2905 // get group key
2906 pbyBSSID = pDevice->abyBroadcastAddr;
2907 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
2908 pTransmitKey = NULL;
2909 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2910 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode);
2911 }
2912 else
2913 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"NOT IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode);
2914 } else {
2915 bTKIP_UseGTK = TRUE;
2916 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2917 }
2918 } while(FALSE);
2919 }
2920
2921 if (pDevice->bEnableHostWEP) {
2922 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"acdma0: STA index %d\n", uNodeIndex);
2923 if (pDevice->bEncryptionEnable == TRUE) {
2924 pTransmitKey = &STempKey;
2925 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2926 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2927 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2928 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2929 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2930 memcpy(pTransmitKey->abyKey,
2931 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2932 pTransmitKey->uKeyLength
2933 );
2934 }
2935 }
2936
2937 byPktType = (BYTE)pDevice->byPacketType;
2938
2939 if (pDevice->bFixRate) {
2940 if (pDevice->byBBType == BB_TYPE_11B) {
2941 if (pDevice->uConnectionRate >= RATE_11M) {
2942 pDevice->wCurrentRate = RATE_11M;
2943 } else {
2944 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
2945 }
2946 } else {
2947 if ((pDevice->byBBType == BB_TYPE_11A) &&
2948 (pDevice->uConnectionRate <= RATE_6M)) {
2949 pDevice->wCurrentRate = RATE_6M;
2950 } else {
2951 if (pDevice->uConnectionRate >= RATE_54M)
2952 pDevice->wCurrentRate = RATE_54M;
2953 else
2954 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
2955 }
2956 }
2957 }
2958 else {
2959 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2960 // Adhoc Tx rate decided from node DB
2961 if (is_multicast_ether_addr(pDevice->sTxEthHeader.abyDstAddr)) {
2962 // Multicast use highest data rate
2963 pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate;
2964 // preamble type
2965 pDevice->byPreambleType = pDevice->byShortPreamble;
2966 }
2967 else {
2968 if(BSSbIsSTAInNodeDB(pDevice, &(pDevice->sTxEthHeader.abyDstAddr[0]), &uNodeIndex)) {
2969 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2970 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2971 pDevice->byPreambleType = pDevice->byShortPreamble;
2972
2973 }
2974 else {
2975 pDevice->byPreambleType = PREAMBLE_LONG;
2976 }
2977 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Found Node Index is [%d] Tx Data Rate:[%d]\n",uNodeIndex, pDevice->wCurrentRate);
2978 }
2979 else {
2980 if (pDevice->byBBType != BB_TYPE_11A)
2981 pDevice->wCurrentRate = RATE_2M;
2982 else
2983 pDevice->wCurrentRate = RATE_24M; // refer to vMgrCreateOwnIBSS()'s
2984 // abyCurrExtSuppRates[]
2985 pDevice->byPreambleType = PREAMBLE_SHORT;
2986 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Not Found Node use highest basic Rate.....\n");
2987 }
2988 }
2989 }
2990 if (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) {
2991 // Infra STA rate decided from AP Node, index = 0
2992 pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate;
2993 }
2994 }
2995
2996 if (pDevice->sTxEthHeader.wType == cpu_to_be16(ETH_P_PAE)) {
2997 if (pDevice->byBBType != BB_TYPE_11A) {
2998 pDevice->wCurrentRate = RATE_1M;
2999 pDevice->byACKRate = RATE_1M;
3000 pDevice->byTopCCKBasicRate = RATE_1M;
3001 pDevice->byTopOFDMBasicRate = RATE_6M;
3002 } else {
3003 pDevice->wCurrentRate = RATE_6M;
3004 pDevice->byACKRate = RATE_6M;
3005 pDevice->byTopCCKBasicRate = RATE_1M;
3006 pDevice->byTopOFDMBasicRate = RATE_6M;
3007 }
3008 }
3009
3010 DBG_PRT(MSG_LEVEL_DEBUG,
3011 KERN_INFO "dma_tx: pDevice->wCurrentRate = %d\n",
3012 pDevice->wCurrentRate);
3013
3014 if (wKeepRate != pDevice->wCurrentRate) {
3015 bScheduleCommand((void *) pDevice, WLAN_CMD_SETPOWER, NULL);
3016 }
3017
3018 if (pDevice->wCurrentRate <= RATE_11M) {
3019 byPktType = PK_TYPE_11B;
3020 }
3021
3022 if (bNeedEncryption == TRUE) {
3023 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType));
3024 if ((pDevice->sTxEthHeader.wType) == cpu_to_be16(ETH_P_PAE)) {
3025 bNeedEncryption = FALSE;
3026 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType));
3027 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
3028 if (pTransmitKey == NULL) {
3029 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Don't Find TX KEY\n");
3030 }
3031 else {
3032 if (bTKIP_UseGTK == TRUE) {
3033 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n");
3034 }
3035 else {
3036 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%X]\n",
3037 pTransmitKey->dwKeyIndex);
3038 bNeedEncryption = TRUE;
3039 }
3040 }
3041 }
3042
3043 if (pDevice->byCntMeasure == 2) {
3044 bNeedDeAuth = TRUE;
3045 pDevice->s802_11Counter.TKIPCounterMeasuresInvoked++;
3046 }
3047
3048 if (pDevice->bEnableHostWEP) {
3049 if ((uNodeIndex != 0) &&
3050 (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) {
3051 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%X]\n",
3052 pTransmitKey->dwKeyIndex);
3053 bNeedEncryption = TRUE;
3054 }
3055 }
3056 }
3057 else {
3058
3059 if (pTransmitKey == NULL) {
3060 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n");
3061 dev_kfree_skb_irq(skb);
3062 pStats->tx_dropped++;
3063 return STATUS_FAILURE;
3064 }
3065 }
3066 }
3067
3068 fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType,
3069 (PBYTE)(&pContext->Data[0]), bNeedEncryption,
3070 skb->len, uDMAIdx, &pDevice->sTxEthHeader,
3071 (PBYTE)skb->data, pTransmitKey, uNodeIndex,
3072 pDevice->wCurrentRate,
3073 &uHeaderLen, &BytesToWrite
3074 );
3075
3076 if (fConvertedPacket == FALSE) {
3077 pContext->bBoolInUse = FALSE;
3078 dev_kfree_skb_irq(skb);
3079 return STATUS_FAILURE;
3080 }
3081
3082 if ( pDevice->bEnablePSMode == TRUE ) {
3083 if ( !pDevice->bPSModeTxBurst ) {
3084 bScheduleCommand((void *) pDevice,
3085 WLAN_CMD_MAC_DISPOWERSAVING,
3086 NULL);
3087 pDevice->bPSModeTxBurst = TRUE;
3088 }
3089 }
3090
3091 pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]);
3092 pTX_Buffer->byPKTNO = (BYTE) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
3093 pTX_Buffer->wTxByteCount = (WORD)BytesToWrite;
3094
3095 pContext->pPacket = skb;
3096 pContext->Type = CONTEXT_DATA_PACKET;
3097 pContext->uBufLen = (WORD)BytesToWrite + 4 ; //USB header
3098
3099 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.abyDstAddr[0]),(WORD) (BytesToWrite-uHeaderLen),pTX_Buffer->wFIFOCtl);
3100
3101 status = PIPEnsSendBulkOut(pDevice,pContext);
3102
3103 if (bNeedDeAuth == TRUE) {
3104 WORD wReason = WLAN_MGMT_REASON_MIC_FAILURE;
3105
3106 bScheduleCommand((void *) pDevice, WLAN_CMD_DEAUTH, (PBYTE) &wReason);
3107 }
3108
3109 if(status!=STATUS_PENDING) {
3110 pContext->bBoolInUse = FALSE;
3111 dev_kfree_skb_irq(skb);
3112 return STATUS_FAILURE;
3113 }
3114 else
3115 return 0;
3116
3117 }
3118
3119
3120
3121 /*
3122 * Description:
3123 * Relay packet send (AC1DMA) from rx dpc.
3124 *
3125 * Parameters:
3126 * In:
3127 * pDevice - Pointer to the adapter
3128 * pPacket - Pointer to rx packet
3129 * cbPacketSize - rx ethernet frame size
3130 * Out:
3131 * TURE, FALSE
3132 *
3133 * Return Value: Return TRUE if packet is copy to dma1; otherwise FALSE
3134 */
3135
3136
3137 BOOL
bRelayPacketSend(PSDevice pDevice,PBYTE pbySkbData,unsigned int uDataLen,unsigned int uNodeIndex)3138 bRelayPacketSend (
3139 PSDevice pDevice,
3140 PBYTE pbySkbData,
3141 unsigned int uDataLen,
3142 unsigned int uNodeIndex
3143 )
3144 {
3145 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
3146 unsigned int BytesToWrite = 0, uHeaderLen = 0;
3147 BYTE byPktType = PK_TYPE_11B;
3148 BOOL bNeedEncryption = FALSE;
3149 SKeyItem STempKey;
3150 PSKeyItem pTransmitKey = NULL;
3151 PBYTE pbyBSSID;
3152 PUSB_SEND_CONTEXT pContext;
3153 BYTE byPktTyp;
3154 BOOL fConvertedPacket;
3155 PTX_BUFFER pTX_Buffer;
3156 unsigned int status;
3157 WORD wKeepRate = pDevice->wCurrentRate;
3158
3159
3160
3161 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
3162
3163 if (NULL == pContext) {
3164 return FALSE;
3165 }
3166
3167 memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)pbySkbData, ETH_HLEN);
3168
3169 if (pDevice->bEncryptionEnable == TRUE) {
3170 bNeedEncryption = TRUE;
3171 // get group key
3172 pbyBSSID = pDevice->abyBroadcastAddr;
3173 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
3174 pTransmitKey = NULL;
3175 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"KEY is NULL. [%d]\n", pMgmt->eCurrMode);
3176 } else {
3177 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
3178 }
3179 }
3180
3181 if (pDevice->bEnableHostWEP) {
3182 if (uNodeIndex < MAX_NODE_NUM + 1) {
3183 pTransmitKey = &STempKey;
3184 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
3185 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
3186 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
3187 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
3188 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
3189 memcpy(pTransmitKey->abyKey,
3190 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
3191 pTransmitKey->uKeyLength
3192 );
3193 }
3194 }
3195
3196 if ( bNeedEncryption && (pTransmitKey == NULL) ) {
3197 pContext->bBoolInUse = FALSE;
3198 return FALSE;
3199 }
3200
3201 byPktTyp = (BYTE)pDevice->byPacketType;
3202
3203 if (pDevice->bFixRate) {
3204 if (pDevice->byBBType == BB_TYPE_11B) {
3205 if (pDevice->uConnectionRate >= RATE_11M) {
3206 pDevice->wCurrentRate = RATE_11M;
3207 } else {
3208 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
3209 }
3210 } else {
3211 if ((pDevice->byBBType == BB_TYPE_11A) &&
3212 (pDevice->uConnectionRate <= RATE_6M)) {
3213 pDevice->wCurrentRate = RATE_6M;
3214 } else {
3215 if (pDevice->uConnectionRate >= RATE_54M)
3216 pDevice->wCurrentRate = RATE_54M;
3217 else
3218 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
3219 }
3220 }
3221 }
3222 else {
3223 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
3224 }
3225
3226 if (wKeepRate != pDevice->wCurrentRate) {
3227 bScheduleCommand((void *) pDevice, WLAN_CMD_SETPOWER, NULL);
3228 }
3229
3230 if (pDevice->wCurrentRate <= RATE_11M)
3231 byPktType = PK_TYPE_11B;
3232
3233 BytesToWrite = uDataLen + ETH_FCS_LEN;
3234
3235 // Convert the packet to an usb frame and copy into our buffer
3236 // and send the irp.
3237
3238 fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType,
3239 (PBYTE)(&pContext->Data[0]), bNeedEncryption,
3240 uDataLen, TYPE_AC0DMA, &pDevice->sTxEthHeader,
3241 pbySkbData, pTransmitKey, uNodeIndex,
3242 pDevice->wCurrentRate,
3243 &uHeaderLen, &BytesToWrite
3244 );
3245
3246 if (fConvertedPacket == FALSE) {
3247 pContext->bBoolInUse = FALSE;
3248 return FALSE;
3249 }
3250
3251 pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]);
3252 pTX_Buffer->byPKTNO = (BYTE) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
3253 pTX_Buffer->wTxByteCount = (WORD)BytesToWrite;
3254
3255 pContext->pPacket = NULL;
3256 pContext->Type = CONTEXT_DATA_PACKET;
3257 pContext->uBufLen = (WORD)BytesToWrite + 4 ; //USB header
3258
3259 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.abyDstAddr[0]),(WORD) (BytesToWrite-uHeaderLen),pTX_Buffer->wFIFOCtl);
3260
3261 status = PIPEnsSendBulkOut(pDevice,pContext);
3262
3263 return TRUE;
3264 }
3265
3266