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