blob: 03b8b4decf0978df9768dfd2e0676824cb91224f [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 "michael.h"
Forest Bond92b96792009-06-13 07:38:31 -040057#include "tkip.h"
Forest Bond92b96792009-06-13 07:38:31 -040058#include "tcrc.h"
Forest Bond92b96792009-06-13 07:38:31 -040059#include "wctl.h"
Forest Bond92b96792009-06-13 07:38:31 -040060#include "hostap.h"
Forest Bond92b96792009-06-13 07:38:31 -040061#include "rf.h"
Forest Bond92b96792009-06-13 07:38:31 -040062#include "datarate.h"
Forest Bond92b96792009-06-13 07:38:31 -040063#include "usbpipe.h"
Forest Bond92b96792009-06-13 07:38:31 -040064
65#ifdef WPA_SM_Transtatus
Forest Bond92b96792009-06-13 07:38:31 -040066#include "iocmd.h"
67#endif
Jim Lieb9d26d602009-08-12 14:54:08 -070068
Forest Bond92b96792009-06-13 07:38:31 -040069/*--------------------- Static Definitions -------------------------*/
70
71/*--------------------- Static Classes ----------------------------*/
72
73/*--------------------- Static Variables --------------------------*/
74//static int msglevel =MSG_LEVEL_DEBUG;
75static int msglevel =MSG_LEVEL_INFO;
76
77/*--------------------- Static Functions --------------------------*/
78
79/*--------------------- Static Definitions -------------------------*/
80#define CRITICAL_PACKET_LEN 256 // if packet size < 256 -> in-direct send
81 // packet size >= 256 -> direct send
82
83const WORD wTimeStampOff[2][MAX_RATE] = {
84 {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
85 {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
86 };
87
88const WORD wFB_Opt0[2][5] = {
89 {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0
90 {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1
91 };
92const WORD wFB_Opt1[2][5] = {
93 {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0
94 {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1
95 };
96
97
98#define RTSDUR_BB 0
99#define RTSDUR_BA 1
100#define RTSDUR_AA 2
101#define CTSDUR_BA 3
102#define RTSDUR_BA_F0 4
103#define RTSDUR_AA_F0 5
104#define RTSDUR_BA_F1 6
105#define RTSDUR_AA_F1 7
106#define CTSDUR_BA_F0 8
107#define CTSDUR_BA_F1 9
108#define DATADUR_B 10
109#define DATADUR_A 11
110#define DATADUR_A_F0 12
111#define DATADUR_A_F1 13
112
113/*--------------------- Static Functions --------------------------*/
114
115static
116VOID
117s_vSaveTxPktInfo(
118 IN PSDevice pDevice,
119 IN BYTE byPktNum,
120 IN PBYTE pbyDestAddr,
121 IN WORD wPktLength,
122 IN WORD wFIFOCtl
123);
124
125static
126PVOID
127s_vGetFreeContext(
128 PSDevice pDevice
129 );
130
131
132static
133VOID
134s_vGenerateTxParameter(
135 IN PSDevice pDevice,
136 IN BYTE byPktType,
137 IN WORD wCurrentRate,
138 IN PVOID pTxBufHead,
139 IN PVOID pvRrvTime,
140 IN PVOID pvRTS,
141 IN PVOID pvCTS,
142 IN UINT cbFrameSize,
143 IN BOOL bNeedACK,
144 IN UINT uDMAIdx,
145 IN PSEthernetHeader psEthHeader
146 );
147
148
149static
150UINT
151s_uFillDataHead (
152 IN PSDevice pDevice,
153 IN BYTE byPktType,
154 IN WORD wCurrentRate,
155 IN PVOID pTxDataHead,
156 IN UINT cbFrameLength,
157 IN UINT uDMAIdx,
158 IN BOOL bNeedAck,
159 IN UINT uFragIdx,
160 IN UINT cbLastFragmentSize,
161 IN UINT uMACfragNum,
162 IN BYTE byFBOption
163 );
164
165
166
167
168static
169VOID
170s_vGenerateMACHeader (
171 IN PSDevice pDevice,
172 IN PBYTE pbyBufferAddr,
173 IN WORD wDuration,
174 IN PSEthernetHeader psEthHeader,
175 IN BOOL bNeedEncrypt,
176 IN WORD wFragType,
177 IN UINT uDMAIdx,
178 IN UINT uFragIdx
179 );
180
181static
182VOID
183s_vFillTxKey(
184 IN PSDevice pDevice,
185 IN PBYTE pbyBuf,
186 IN PBYTE pbyIVHead,
187 IN PSKeyItem pTransmitKey,
188 IN PBYTE pbyHdrBuf,
189 IN WORD wPayloadLen,
190 OUT PBYTE pMICHDR
191 );
192
193static
194VOID
195s_vSWencryption (
196 IN PSDevice pDevice,
197 IN PSKeyItem pTransmitKey,
198 IN PBYTE pbyPayloadHead,
199 IN WORD wPayloadSize
200 );
201
202static
203UINT
204s_uGetTxRsvTime (
205 IN PSDevice pDevice,
206 IN BYTE byPktType,
207 IN UINT cbFrameLength,
208 IN WORD wRate,
209 IN BOOL bNeedAck
210 );
211
212
213static
214UINT
215s_uGetRTSCTSRsvTime (
216 IN PSDevice pDevice,
217 IN BYTE byRTSRsvType,
218 IN BYTE byPktType,
219 IN UINT cbFrameLength,
220 IN WORD wCurrentRate
221 );
222
223static
224VOID
225s_vFillCTSHead (
226 IN PSDevice pDevice,
227 IN UINT uDMAIdx,
228 IN BYTE byPktType,
229 IN PVOID pvCTS,
230 IN UINT cbFrameLength,
231 IN BOOL bNeedAck,
232 IN BOOL bDisCRC,
233 IN WORD wCurrentRate,
234 IN BYTE byFBOption
235 );
236
237static
238VOID
239s_vFillRTSHead(
240 IN PSDevice pDevice,
241 IN BYTE byPktType,
242 IN PVOID pvRTS,
243 IN UINT cbFrameLength,
244 IN BOOL bNeedAck,
245 IN BOOL bDisCRC,
246 IN PSEthernetHeader psEthHeader,
247 IN WORD wCurrentRate,
248 IN BYTE byFBOption
249 );
250
251static
252UINT
253s_uGetDataDuration (
254 IN PSDevice pDevice,
255 IN BYTE byDurType,
256 IN UINT cbFrameLength,
257 IN BYTE byPktType,
258 IN WORD wRate,
259 IN BOOL bNeedAck,
260 IN UINT uFragIdx,
261 IN UINT cbLastFragmentSize,
262 IN UINT uMACfragNum,
263 IN BYTE byFBOption
264 );
265
266
267static
268UINT
269s_uGetRTSCTSDuration (
270 IN PSDevice pDevice,
271 IN BYTE byDurType,
272 IN UINT cbFrameLength,
273 IN BYTE byPktType,
274 IN WORD wRate,
275 IN BOOL bNeedAck,
276 IN BYTE byFBOption
277 );
278
279
280/*--------------------- Export Variables --------------------------*/
281
282static
283PVOID
284s_vGetFreeContext(
285 PSDevice pDevice
286 )
287{
288 PUSB_SEND_CONTEXT pContext = NULL;
289 PUSB_SEND_CONTEXT pReturnContext = NULL;
290 UINT ii;
291
292 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GetFreeContext()\n");
293
294 for (ii = 0; ii < pDevice->cbTD; ii++) {
295 pContext = pDevice->apTD[ii];
296 if (pContext->bBoolInUse == FALSE) {
297 pContext->bBoolInUse = TRUE;
298 pReturnContext = pContext;
299 break;
300 }
301 }
302 if ( ii == pDevice->cbTD ) {
303 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Free Tx Context\n");
304 }
305 return ((PVOID) pReturnContext);
306}
307
308
309static
310VOID
311s_vSaveTxPktInfo(PSDevice pDevice, BYTE byPktNum, PBYTE pbyDestAddr, WORD wPktLength, WORD wFIFOCtl)
312{
313 PSStatCounter pStatistic=&(pDevice->scStatistic);
314
315
316 if (IS_BROADCAST_ADDRESS(pbyDestAddr))
317 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_BROAD;
318 else if (IS_MULTICAST_ADDRESS(pbyDestAddr))
319 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_MULTI;
320 else
321 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_UNI;
322
323 pStatistic->abyTxPktInfo[byPktNum].wLength = wPktLength;
324 pStatistic->abyTxPktInfo[byPktNum].wFIFOCtl = wFIFOCtl;
Andres More9a0e7562010-04-13 21:54:48 -0300325 memcpy(pStatistic->abyTxPktInfo[byPktNum].abyDestAddr,
326 pbyDestAddr,
327 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -0400328}
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 ){
Jim Lieb3e362592009-08-12 14:54:11 -0700363 memcpy(pDevice->abyPRNG, (PBYTE)&(dwRevIVCounter), 3);
364 memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
Forest Bond92b96792009-06-13 07:38:31 -0400365 } else {
Jim Lieb3e362592009-08-12 14:54:11 -0700366 memcpy(pbyBuf, (PBYTE)&(dwRevIVCounter), 3);
367 memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
Forest Bond92b96792009-06-13 07:38:31 -0400368 if(pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
Jim Lieb3e362592009-08-12 14:54:11 -0700369 memcpy(pbyBuf+8, (PBYTE)&(dwRevIVCounter), 3);
370 memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
Forest Bond92b96792009-06-13 07:38:31 -0400371 }
Jim Lieb3e362592009-08-12 14:54:11 -0700372 memcpy(pDevice->abyPRNG, pbyBuf, 16);
Forest Bond92b96792009-06-13 07:38:31 -0400373 }
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);
Jim Lieb3e362592009-08-12 14:54:11 -0700389 memcpy(pbyBuf, pDevice->abyPRNG, 16);
Forest Bond92b96792009-06-13 07:38:31 -0400390 // Make IV
Jim Lieb3e362592009-08-12 14:54:11 -0700391 memcpy(pdwIV, pDevice->abyPRNG, 3);
Forest Bond92b96792009-06-13 07:38:31 -0400392
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 }
Jim Lieb3e362592009-08-12 14:54:11 -0700403 memcpy(pbyBuf, pTransmitKey->abyKey, 16);
Forest Bond92b96792009-06-13 07:38:31 -0400404
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
Jim Lieb3e362592009-08-12 14:54:11 -0700415 memcpy(pMICHDR+2, &(pMACHeader->abyAddr2[0]), 6);
Forest Bond92b96792009-06-13 07:38:31 -0400416 *((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);
Jim Lieb3e362592009-08-12 14:54:11 -0700433 memcpy(pMICHDR+18, (PBYTE)&wValue, 2); // MSKFRACTL
434 memcpy(pMICHDR+20, &(pMACHeader->abyAddr1[0]), 6);
435 memcpy(pMICHDR+26, &(pMACHeader->abyAddr2[0]), 6);
Forest Bond92b96792009-06-13 07:38:31 -0400436
437 //Fill MICHDR2
Jim Lieb3e362592009-08-12 14:54:11 -0700438 memcpy(pMICHDR+32, &(pMACHeader->abyAddr3[0]), 6);
Forest Bond92b96792009-06-13 07:38:31 -0400439 wValue = pMACHeader->wSeqCtl;
440 wValue &= 0x000F;
441 wValue = cpu_to_le16(wValue);
Jim Lieb3e362592009-08-12 14:54:11 -0700442 memcpy(pMICHDR+38, (PBYTE)&wValue, 2); // MSKSEQCTL
Forest Bond92b96792009-06-13 07:38:31 -0400443 if (pDevice->bLongHeader) {
Jim Lieb3e362592009-08-12 14:54:11 -0700444 memcpy(pMICHDR+40, &(pMACHeader->abyAddr4[0]), 6);
Forest Bond92b96792009-06-13 07:38:31 -0400445 }
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
Andres More9a0e7562010-04-13 21:54:48 -03001031
1032 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1033 (pDevice->eOPMode == OP_MODE_AP)) {
1034 memcpy(&(pBuf->Data.abyRA[0]),
1035 &(psEthHeader->abyDstAddr[0]),
1036 ETH_ALEN);
1037 }
Forest Bond92b96792009-06-13 07:38:31 -04001038 else {
Andres More9a0e7562010-04-13 21:54:48 -03001039 memcpy(&(pBuf->Data.abyRA[0]),
1040 &(pDevice->abyBSSID[0]),
1041 ETH_ALEN);
1042 }
1043 if (pDevice->eOPMode == OP_MODE_AP) {
1044 memcpy(&(pBuf->Data.abyTA[0]),
1045 &(pDevice->abyBSSID[0]),
1046 ETH_ALEN);
1047 }
Forest Bond92b96792009-06-13 07:38:31 -04001048 else {
Andres More9a0e7562010-04-13 21:54:48 -03001049 memcpy(&(pBuf->Data.abyTA[0]),
1050 &(psEthHeader->abySrcAddr[0]),
1051 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001052 }
1053 }
1054 else {
1055 PSRTS_g_FB pBuf = (PSRTS_g_FB)pvRTS;
1056 //Get SignalField,ServiceField,Length
1057 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1058 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
1059 );
1060 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1061 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
1062 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
1063 );
1064 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
1065 //Get Duration
1066 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
1067 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
1068 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
1069 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
1070 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
1071 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
1072 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
1073 pBuf->Data.wDurationID = pBuf->wDuration_aa;
1074 //Get RTS Frame body
1075 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1076
Andres More9a0e7562010-04-13 21:54:48 -03001077 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1078 (pDevice->eOPMode == OP_MODE_AP)) {
1079 memcpy(&(pBuf->Data.abyRA[0]),
1080 &(psEthHeader->abyDstAddr[0]),
1081 ETH_ALEN);
1082 }
Forest Bond92b96792009-06-13 07:38:31 -04001083 else {
Andres More9a0e7562010-04-13 21:54:48 -03001084 memcpy(&(pBuf->Data.abyRA[0]),
1085 &(pDevice->abyBSSID[0]),
1086 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001087 }
1088
Andres More9a0e7562010-04-13 21:54:48 -03001089 if (pDevice->eOPMode == OP_MODE_AP) {
1090 memcpy(&(pBuf->Data.abyTA[0]),
1091 &(pDevice->abyBSSID[0]),
1092 ETH_ALEN);
1093 }
Forest Bond92b96792009-06-13 07:38:31 -04001094 else {
Andres More9a0e7562010-04-13 21:54:48 -03001095 memcpy(&(pBuf->Data.abyTA[0]),
1096 &(psEthHeader->abySrcAddr[0]),
1097 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001098 }
1099
1100 } // if (byFBOption == AUTO_FB_NONE)
1101 }
1102 else if (byPktType == PK_TYPE_11A) {
1103 if (byFBOption == AUTO_FB_NONE) {
1104 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
1105 //Get SignalField,ServiceField,Length
1106 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
1107 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
1108 );
1109 pBuf->wTransmitLength = cpu_to_le16(wLen);
1110 //Get Duration
1111 pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
1112 pBuf->Data.wDurationID = pBuf->wDuration;
1113 //Get RTS Frame body
1114 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1115
Andres More9a0e7562010-04-13 21:54:48 -03001116 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1117 (pDevice->eOPMode == OP_MODE_AP)) {
1118 memcpy(&(pBuf->Data.abyRA[0]),
1119 &(psEthHeader->abyDstAddr[0]),
1120 ETH_ALEN);
1121 } else {
1122 memcpy(&(pBuf->Data.abyRA[0]),
1123 &(pDevice->abyBSSID[0]),
1124 ETH_ALEN);
1125 }
Forest Bond92b96792009-06-13 07:38:31 -04001126
Andres More9a0e7562010-04-13 21:54:48 -03001127 if (pDevice->eOPMode == OP_MODE_AP) {
1128 memcpy(&(pBuf->Data.abyTA[0]),
1129 &(pDevice->abyBSSID[0]),
1130 ETH_ALEN);
1131 } else {
1132 memcpy(&(pBuf->Data.abyTA[0]),
1133 &(psEthHeader->abySrcAddr[0]),
1134 ETH_ALEN);
1135 }
Forest Bond92b96792009-06-13 07:38:31 -04001136
1137 }
1138 else {
1139 PSRTS_a_FB pBuf = (PSRTS_a_FB)pvRTS;
1140 //Get SignalField,ServiceField,Length
1141 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
1142 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
1143 );
1144 pBuf->wTransmitLength = cpu_to_le16(wLen);
1145 //Get Duration
1146 pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
1147 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
1148 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:
1149 pBuf->Data.wDurationID = pBuf->wDuration;
1150 //Get RTS Frame body
1151 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1152
Andres More9a0e7562010-04-13 21:54:48 -03001153 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1154 (pDevice->eOPMode == OP_MODE_AP)) {
1155 memcpy(&(pBuf->Data.abyRA[0]),
1156 &(psEthHeader->abyDstAddr[0]),
1157 ETH_ALEN);
1158 } else {
1159 memcpy(&(pBuf->Data.abyRA[0]),
1160 &(pDevice->abyBSSID[0]),
1161 ETH_ALEN);
1162 }
1163 if (pDevice->eOPMode == OP_MODE_AP) {
1164 memcpy(&(pBuf->Data.abyTA[0]),
1165 &(pDevice->abyBSSID[0]),
1166 ETH_ALEN);
1167 } else {
1168 memcpy(&(pBuf->Data.abyTA[0]),
1169 &(psEthHeader->abySrcAddr[0]),
1170 ETH_ALEN);
1171 }
Forest Bond92b96792009-06-13 07:38:31 -04001172 }
1173 }
1174 else if (byPktType == PK_TYPE_11B) {
1175 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
1176 //Get SignalField,ServiceField,Length
1177 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1178 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
1179 );
1180 pBuf->wTransmitLength = cpu_to_le16(wLen);
1181 //Get Duration
1182 pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
1183 pBuf->Data.wDurationID = pBuf->wDuration;
1184 //Get RTS Frame body
1185 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1186
Andres More9a0e7562010-04-13 21:54:48 -03001187 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
Forest Bond92b96792009-06-13 07:38:31 -04001188 (pDevice->eOPMode == OP_MODE_AP)) {
Andres More9a0e7562010-04-13 21:54:48 -03001189 memcpy(&(pBuf->Data.abyRA[0]),
1190 &(psEthHeader->abyDstAddr[0]),
1191 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001192 }
1193 else {
Andres More9a0e7562010-04-13 21:54:48 -03001194 memcpy(&(pBuf->Data.abyRA[0]),
1195 &(pDevice->abyBSSID[0]),
1196 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001197 }
1198
1199 if (pDevice->eOPMode == OP_MODE_AP) {
Andres More9a0e7562010-04-13 21:54:48 -03001200 memcpy(&(pBuf->Data.abyTA[0]),
1201 &(pDevice->abyBSSID[0]),
1202 ETH_ALEN);
1203 } else {
1204 memcpy(&(pBuf->Data.abyTA[0]),
1205 &(psEthHeader->abySrcAddr[0]),
1206 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001207 }
1208 }
1209}
1210
1211static
1212VOID
1213s_vFillCTSHead (
1214 IN PSDevice pDevice,
1215 IN UINT uDMAIdx,
1216 IN BYTE byPktType,
1217 IN PVOID pvCTS,
1218 IN UINT cbFrameLength,
1219 IN BOOL bNeedAck,
1220 IN BOOL bDisCRC,
1221 IN WORD wCurrentRate,
1222 IN BYTE byFBOption
1223 )
1224{
1225 UINT uCTSFrameLen = 14;
1226 WORD wLen = 0x0000;
1227
1228 if (pvCTS == NULL) {
1229 return;
1230 }
1231
1232 if (bDisCRC) {
1233 // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
1234 // in this case we need to decrease its length by 4.
1235 uCTSFrameLen -= 4;
1236 }
1237
1238 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1239 if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
1240 // Auto Fall back
1241 PSCTS_FB pBuf = (PSCTS_FB)pvCTS;
1242 //Get SignalField,ServiceField,Length
1243 BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1244 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
1245 );
1246 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1247 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
1248 pBuf->wDuration_ba += pDevice->wCTSDuration;
1249 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1250 //Get CTSDuration_ba_f0
1251 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
1252 pBuf->wCTSDuration_ba_f0 += pDevice->wCTSDuration;
1253 pBuf->wCTSDuration_ba_f0 = cpu_to_le16(pBuf->wCTSDuration_ba_f0);
1254 //Get CTSDuration_ba_f1
1255 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
1256 pBuf->wCTSDuration_ba_f1 += pDevice->wCTSDuration;
1257 pBuf->wCTSDuration_ba_f1 = cpu_to_le16(pBuf->wCTSDuration_ba_f1);
1258 //Get CTS Frame body
1259 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1260 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1261 pBuf->Data.wReserved = 0x0000;
Andres More9a0e7562010-04-13 21:54:48 -03001262 memcpy(&(pBuf->Data.abyRA[0]),
1263 &(pDevice->abyCurrentNetAddr[0]),
1264 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001265 } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
1266 PSCTS pBuf = (PSCTS)pvCTS;
1267 //Get SignalField,ServiceField,Length
1268 BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1269 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
1270 );
1271 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1272 //Get CTSDuration_ba
1273 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
1274 pBuf->wDuration_ba += pDevice->wCTSDuration;
1275 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1276
1277 //Get CTS Frame body
1278 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1279 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1280 pBuf->Data.wReserved = 0x0000;
Andres More9a0e7562010-04-13 21:54:48 -03001281 memcpy(&(pBuf->Data.abyRA[0]),
1282 &(pDevice->abyCurrentNetAddr[0]),
1283 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001284 }
1285 }
1286}
1287
Forest Bond92b96792009-06-13 07:38:31 -04001288/*+
1289 *
1290 * Description:
1291 * Generate FIFO control for MAC & Baseband controller
1292 *
1293 * Parameters:
1294 * In:
1295 * pDevice - Pointer to adpater
1296 * pTxDataHead - Transmit Data Buffer
1297 * pTxBufHead - pTxBufHead
1298 * pvRrvTime - pvRrvTime
1299 * pvRTS - RTS Buffer
1300 * pCTS - CTS Buffer
1301 * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
1302 * bNeedACK - If need ACK
1303 * uDMAIdx - DMA Index
1304 * Out:
1305 * none
1306 *
1307 * Return Value: none
1308 *
1309-*/
1310// UINT cbFrameSize,//Hdr+Payload+FCS
1311static
1312VOID
1313s_vGenerateTxParameter (
1314 IN PSDevice pDevice,
1315 IN BYTE byPktType,
1316 IN WORD wCurrentRate,
1317 IN PVOID pTxBufHead,
1318 IN PVOID pvRrvTime,
1319 IN PVOID pvRTS,
1320 IN PVOID pvCTS,
1321 IN UINT cbFrameSize,
1322 IN BOOL bNeedACK,
1323 IN UINT uDMAIdx,
1324 IN PSEthernetHeader psEthHeader
1325 )
1326{
1327 UINT cbMACHdLen = WLAN_HDR_ADDR3_LEN; //24
1328 WORD wFifoCtl;
1329 BOOL bDisCRC = FALSE;
1330 BYTE byFBOption = AUTO_FB_NONE;
1331// WORD wCurrentRate = pDevice->wCurrentRate;
1332
1333 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter...\n");
1334 PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
1335 pFifoHead->wReserved = wCurrentRate;
1336 wFifoCtl = pFifoHead->wFIFOCtl;
1337
1338 if (wFifoCtl & FIFOCTL_CRCDIS) {
1339 bDisCRC = TRUE;
1340 }
1341
1342 if (wFifoCtl & FIFOCTL_AUTO_FB_0) {
1343 byFBOption = AUTO_FB_0;
1344 }
1345 else if (wFifoCtl & FIFOCTL_AUTO_FB_1) {
1346 byFBOption = AUTO_FB_1;
1347 }
1348
1349 if (pDevice->bLongHeader)
1350 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1351
1352 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1353
1354 if (pvRTS != NULL) { //RTS_need
1355 //Fill RsvTime
1356 if (pvRrvTime) {
1357 PSRrvTime_gRTS pBuf = (PSRrvTime_gRTS)pvRrvTime;
1358 pBuf->wRTSTxRrvTime_aa = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 1:2.4GHz
1359 pBuf->wRTSTxRrvTime_ba = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate));//1:RTSTxRrvTime_ba, 1:2.4GHz
1360 pBuf->wRTSTxRrvTime_bb = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1361 pBuf->wTxRrvTime_a = cpu_to_le16((WORD) s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1362 pBuf->wTxRrvTime_b = cpu_to_le16((WORD) s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1363 }
1364 //Fill RTS
1365 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1366 }
1367 else {//RTS_needless, PCF mode
1368
1369 //Fill RsvTime
1370 if (pvRrvTime) {
1371 PSRrvTime_gCTS pBuf = (PSRrvTime_gCTS)pvRrvTime;
1372 pBuf->wTxRrvTime_a = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1373 pBuf->wTxRrvTime_b = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1374 pBuf->wCTSTxRrvTime_ba = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate));//3:CTSTxRrvTime_Ba, 1:2.4GHz
1375 }
1376 //Fill CTS
1377 s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
1378 }
1379 }
1380 else if (byPktType == PK_TYPE_11A) {
1381
1382 if (pvRTS != NULL) {//RTS_need, non PCF mode
1383 //Fill RsvTime
1384 if (pvRrvTime) {
1385 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1386 pBuf->wRTSTxRrvTime = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 0:5GHz
1387 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//0:OFDM
1388 }
1389 //Fill RTS
1390 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1391 }
1392 else if (pvRTS == NULL) {//RTS_needless, non PCF mode
1393 //Fill RsvTime
1394 if (pvRrvTime) {
1395 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1396 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK)); //0:OFDM
1397 }
1398 }
1399 }
1400 else if (byPktType == PK_TYPE_11B) {
1401
1402 if ((pvRTS != NULL)) {//RTS_need, non PCF mode
1403 //Fill RsvTime
1404 if (pvRrvTime) {
1405 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1406 pBuf->wRTSTxRrvTime = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1407 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK));//1:CCK
1408 }
1409 //Fill RTS
1410 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1411 }
1412 else { //RTS_needless, non PCF mode
1413 //Fill RsvTime
1414 if (pvRrvTime) {
1415 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1416 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK)); //1:CCK
1417 }
1418 }
1419 }
1420 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter END.\n");
1421}
1422/*
1423 PBYTE pbyBuffer,//point to pTxBufHead
1424 WORD wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last
1425 UINT cbFragmentSize,//Hdr+payoad+FCS
1426*/
1427
1428
1429BOOL
1430s_bPacketToWirelessUsb(
1431 IN PSDevice pDevice,
1432 IN BYTE byPktType,
1433 IN PBYTE usbPacketBuf,
1434 IN BOOL bNeedEncryption,
1435 IN UINT uSkbPacketLen,
1436 IN UINT uDMAIdx,
1437 IN PSEthernetHeader psEthHeader,
1438 IN PBYTE pPacket,
1439 IN PSKeyItem pTransmitKey,
1440 IN UINT uNodeIndex,
1441 IN WORD wCurrentRate,
1442 OUT UINT *pcbHeaderLen,
1443 OUT UINT *pcbTotalLen
1444 )
1445{
1446 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1447 UINT cbFrameSize,cbFrameBodySize;
1448 PTX_BUFFER pTxBufHead;
1449 UINT cb802_1_H_len;
1450 UINT cbIVlen=0,cbICVlen=0,cbMIClen=0,cbMACHdLen=0,cbFCSlen=4;
1451 UINT cbMICHDR = 0;
1452 BOOL bNeedACK,bRTS;
1453 PBYTE pbyType,pbyMacHdr,pbyIVHead,pbyPayloadHead,pbyTxBufferAddr;
1454 BYTE abySNAP_RFC1042[6] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
1455 BYTE abySNAP_Bridgetunnel[6] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
1456 UINT uDuration;
1457 UINT cbHeaderLength= 0,uPadding = 0;
1458 PVOID pvRrvTime;
1459 PSMICHDRHead pMICHDR;
1460 PVOID pvRTS;
1461 PVOID pvCTS;
1462 PVOID pvTxDataHd;
1463 BYTE byFBOption = AUTO_FB_NONE,byFragType;
1464 WORD wTxBufSize;
1465 DWORD dwMICKey0,dwMICKey1,dwMIC_Priority,dwCRC;
1466 PDWORD pdwMIC_L,pdwMIC_R;
1467 BOOL bSoftWEP = FALSE;
1468
1469
1470
1471
1472 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
1473 if ((bNeedEncryption) && (pTransmitKey != NULL)) {
1474 if (((PSKeyTable) (pTransmitKey->pvKeyTable))->bSoftWEP == TRUE) {
1475 // WEP 256
1476 bSoftWEP = TRUE;
1477 }
1478 }
1479
1480 pTxBufHead = (PTX_BUFFER) usbPacketBuf;
Jim Lieb3e362592009-08-12 14:54:11 -07001481 memset(pTxBufHead, 0, sizeof(TX_BUFFER));
Forest Bond92b96792009-06-13 07:38:31 -04001482
1483 // Get pkt type
1484 if (ntohs(psEthHeader->wType) > MAX_DATA_LEN) {
1485 if (pDevice->dwDiagRefCount == 0) {
1486 cb802_1_H_len = 8;
1487 } else {
1488 cb802_1_H_len = 2;
1489 }
1490 } else {
1491 cb802_1_H_len = 0;
1492 }
1493
1494 cbFrameBodySize = uSkbPacketLen - U_HEADER_LEN + cb802_1_H_len;
1495
1496 //Set packet type
1497 pTxBufHead->wFIFOCtl |= (WORD)(byPktType<<8);
1498
1499 if (pDevice->dwDiagRefCount != 0) {
1500 bNeedACK = FALSE;
1501 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
1502 } else { //if (pDevice->dwDiagRefCount != 0) {
1503 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1504 (pDevice->eOPMode == OP_MODE_AP)) {
1505 if (IS_MULTICAST_ADDRESS(&(psEthHeader->abyDstAddr[0])) ||
1506 IS_BROADCAST_ADDRESS(&(psEthHeader->abyDstAddr[0]))) {
1507 bNeedACK = FALSE;
1508 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
1509 }
1510 else {
1511 bNeedACK = TRUE;
1512 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1513 }
1514 }
1515 else {
1516 // MSDUs in Infra mode always need ACK
1517 bNeedACK = TRUE;
1518 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1519 }
1520 } //if (pDevice->dwDiagRefCount != 0) {
1521
1522 pTxBufHead->wTimeStamp = DEFAULT_MSDU_LIFETIME_RES_64us;
1523
1524 //Set FIFOCTL_LHEAD
1525 if (pDevice->bLongHeader)
1526 pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
1527
1528 if (pDevice->bSoftwareGenCrcErr) {
1529 pTxBufHead->wFIFOCtl |= FIFOCTL_CRCDIS; // set tx descriptors to NO hardware CRC
1530 }
1531
1532 //Set FRAGCTL_MACHDCNT
1533 if (pDevice->bLongHeader) {
1534 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1535 } else {
1536 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
1537 }
1538 pTxBufHead->wFragCtl |= (WORD)(cbMACHdLen << 10);
1539
1540 //Set FIFOCTL_GrpAckPolicy
1541 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
1542 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
1543 }
1544
1545 //Set Auto Fallback Ctl
1546 if (wCurrentRate >= RATE_18M) {
1547 if (pDevice->byAutoFBCtrl == AUTO_FB_0) {
1548 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
1549 byFBOption = AUTO_FB_0;
1550 } else if (pDevice->byAutoFBCtrl == AUTO_FB_1) {
1551 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
1552 byFBOption = AUTO_FB_1;
1553 }
1554 }
1555
1556 if (bSoftWEP != TRUE) {
1557 if ((bNeedEncryption) && (pTransmitKey != NULL)) { //WEP enabled
1558 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
1559 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
1560 }
1561 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1562 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Tx Set wFragCtl == FRAGCTL_TKIP\n");
1563 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
1564 }
1565 else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
1566 pTxBufHead->wFragCtl |= FRAGCTL_AES;
1567 }
1568 }
1569 }
1570
1571
1572 if ((bNeedEncryption) && (pTransmitKey != NULL)) {
1573 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
1574 cbIVlen = 4;
1575 cbICVlen = 4;
1576 }
1577 else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1578 cbIVlen = 8;//IV+ExtIV
1579 cbMIClen = 8;
1580 cbICVlen = 4;
1581 }
1582 if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
1583 cbIVlen = 8;//RSN Header
1584 cbICVlen = 8;//MIC
1585 cbMICHDR = sizeof(SMICHDRHead);
1586 }
1587 if (bSoftWEP == FALSE) {
1588 //MAC Header should be padding 0 to DW alignment.
1589 uPadding = 4 - (cbMACHdLen%4);
1590 uPadding %= 4;
1591 }
1592 }
1593
1594 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
1595
1596 if ( (bNeedACK == FALSE) ||(cbFrameSize < pDevice->wRTSThreshold) ) {
1597 bRTS = FALSE;
1598 } else {
1599 bRTS = TRUE;
1600 pTxBufHead->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
1601 }
1602
1603 pbyTxBufferAddr = (PBYTE) &(pTxBufHead->adwTxKey[0]);
1604 wTxBufSize = sizeof(STxBufHead);
1605 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
1606 if (byFBOption == AUTO_FB_NONE) {
1607 if (bRTS == TRUE) {//RTS_need
1608 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1609 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1610 pvRTS = (PSRTS_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1611 pvCTS = NULL;
1612 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g));
1613 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g) + sizeof(STxDataHead_g);
1614 }
1615 else { //RTS_needless
1616 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1617 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1618 pvRTS = NULL;
1619 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1620 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
1621 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
1622 }
1623 } else {
1624 // Auto Fall Back
1625 if (bRTS == TRUE) {//RTS_need
1626 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1627 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1628 pvRTS = (PSRTS_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1629 pvCTS = NULL;
1630 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB));
1631 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB) + sizeof(STxDataHead_g_FB);
1632 }
1633 else if (bRTS == FALSE) { //RTS_needless
1634 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1635 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1636 pvRTS = NULL;
1637 pvCTS = (PSCTS_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1638 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB));
1639 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB) + sizeof(STxDataHead_g_FB);
1640 }
1641 } // Auto Fall Back
1642 }
1643 else {//802.11a/b packet
1644 if (byFBOption == AUTO_FB_NONE) {
1645 if (bRTS == TRUE) {//RTS_need
1646 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1647 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1648 pvRTS = (PSRTS_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1649 pvCTS = NULL;
1650 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab));
1651 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab) + sizeof(STxDataHead_ab);
1652 }
1653 else if (bRTS == FALSE) { //RTS_needless, no MICHDR
1654 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1655 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1656 pvRTS = NULL;
1657 pvCTS = NULL;
1658 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1659 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
1660 }
1661 } else {
1662 // Auto Fall Back
1663 if (bRTS == TRUE) {//RTS_need
1664 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1665 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1666 pvRTS = (PSRTS_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1667 pvCTS = NULL;
1668 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB));
1669 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB) + sizeof(STxDataHead_a_FB);
1670 }
1671 else if (bRTS == FALSE) { //RTS_needless
1672 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1673 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1674 pvRTS = NULL;
1675 pvCTS = NULL;
1676 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1677 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_a_FB);
1678 }
1679 } // Auto Fall Back
1680 }
1681
1682 pbyMacHdr = (PBYTE)(pbyTxBufferAddr + cbHeaderLength);
1683 pbyIVHead = (PBYTE)(pbyMacHdr + cbMACHdLen + uPadding);
1684 pbyPayloadHead = (PBYTE)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
1685
1686
1687 //=========================
1688 // No Fragmentation
1689 //=========================
1690 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Fragmentation...\n");
1691 byFragType = FRAGCTL_NONFRAG;
1692 //uDMAIdx = TYPE_AC0DMA;
1693 //pTxBufHead = (PSTxBufHead) &(pTxBufHead->adwTxKey[0]);
1694
1695
1696 //Fill FIFO,RrvTime,RTS,and CTS
1697 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, (PVOID)pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
1698 cbFrameSize, bNeedACK, uDMAIdx, psEthHeader);
1699 //Fill DataHead
1700 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
1701 0, 0, 1/*uMACfragNum*/, byFBOption);
1702 // Generate TX MAC Header
1703 s_vGenerateMACHeader(pDevice, pbyMacHdr, (WORD)uDuration, psEthHeader, bNeedEncryption,
1704 byFragType, uDMAIdx, 0);
1705
1706 if (bNeedEncryption == TRUE) {
1707 //Fill TXKEY
1708 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
1709 pbyMacHdr, (WORD)cbFrameBodySize, (PBYTE)pMICHDR);
1710
1711 if (pDevice->bEnableHostWEP) {
1712 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1713 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1714 }
1715 }
1716
1717 // 802.1H
1718 if (ntohs(psEthHeader->wType) > MAX_DATA_LEN) {
1719 if (pDevice->dwDiagRefCount == 0) {
1720 if ( (psEthHeader->wType == TYPE_PKT_IPX) ||
1721 (psEthHeader->wType == cpu_to_le16(0xF380))) {
Jim Lieb3e362592009-08-12 14:54:11 -07001722 memcpy((PBYTE) (pbyPayloadHead), &abySNAP_Bridgetunnel[0], 6);
Forest Bond92b96792009-06-13 07:38:31 -04001723 } else {
Jim Lieb3e362592009-08-12 14:54:11 -07001724 memcpy((PBYTE) (pbyPayloadHead), &abySNAP_RFC1042[0], 6);
Forest Bond92b96792009-06-13 07:38:31 -04001725 }
1726 pbyType = (PBYTE) (pbyPayloadHead + 6);
Jim Lieb3e362592009-08-12 14:54:11 -07001727 memcpy(pbyType, &(psEthHeader->wType), sizeof(WORD));
Forest Bond92b96792009-06-13 07:38:31 -04001728 } else {
Jim Lieb3e362592009-08-12 14:54:11 -07001729 memcpy((PBYTE) (pbyPayloadHead), &(psEthHeader->wType), sizeof(WORD));
Forest Bond92b96792009-06-13 07:38:31 -04001730
1731 }
1732
1733 }
1734
1735
1736 if (pPacket != NULL) {
1737 // Copy the Packet into a tx Buffer
Jim Lieb3e362592009-08-12 14:54:11 -07001738 memcpy((pbyPayloadHead + cb802_1_H_len),
Forest Bond92b96792009-06-13 07:38:31 -04001739 (pPacket + U_HEADER_LEN),
1740 uSkbPacketLen - U_HEADER_LEN
1741 );
1742
1743 } else {
1744 // while bRelayPacketSend psEthHeader is point to header+payload
Jim Lieb3e362592009-08-12 14:54:11 -07001745 memcpy((pbyPayloadHead + cb802_1_H_len), ((PBYTE)psEthHeader)+U_HEADER_LEN, uSkbPacketLen - U_HEADER_LEN);
Forest Bond92b96792009-06-13 07:38:31 -04001746 }
1747
1748 ASSERT(uLength == cbNdisBodySize);
1749
1750 if ((bNeedEncryption == TRUE) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1751
1752 ///////////////////////////////////////////////////////////////////
1753
1754 if (pDevice->sMgmtObj.eAuthenMode == WMAC_AUTH_WPANONE) {
1755 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
1756 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
1757 }
1758 else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
1759 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
1760 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
1761 }
1762 else {
1763 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[24]);
1764 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[28]);
1765 }
1766 // DO Software Michael
1767 MIC_vInit(dwMICKey0, dwMICKey1);
1768 MIC_vAppend((PBYTE)&(psEthHeader->abyDstAddr[0]), 12);
1769 dwMIC_Priority = 0;
1770 MIC_vAppend((PBYTE)&dwMIC_Priority, 4);
1771 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
1772
1773 ///////////////////////////////////////////////////////////////////
1774
1775 //DBG_PRN_GRP12(("Length:%d, %d\n", cbFrameBodySize, uFromHDtoPLDLength));
1776 //for (ii = 0; ii < cbFrameBodySize; ii++) {
1777 // DBG_PRN_GRP12(("%02x ", *((PBYTE)((pbyPayloadHead + cb802_1_H_len) + ii))));
1778 //}
1779 //DBG_PRN_GRP12(("\n\n\n"));
1780
1781 MIC_vAppend(pbyPayloadHead, cbFrameBodySize);
1782
1783 pdwMIC_L = (PDWORD)(pbyPayloadHead + cbFrameBodySize);
1784 pdwMIC_R = (PDWORD)(pbyPayloadHead + cbFrameBodySize + 4);
1785
1786 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1787 MIC_vUnInit();
1788
1789 if (pDevice->bTxMICFail == TRUE) {
1790 *pdwMIC_L = 0;
1791 *pdwMIC_R = 0;
1792 pDevice->bTxMICFail = FALSE;
1793 }
1794 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
1795 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderLength, uPadding, cbIVlen);
1796 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
1797 }
1798
1799
1800 if (bSoftWEP == TRUE) {
1801
1802 s_vSWencryption(pDevice, pTransmitKey, (pbyPayloadHead), (WORD)(cbFrameBodySize + cbMIClen));
1803
1804 } else if ( ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) && (bNeedEncryption == TRUE)) ||
1805 ((pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) && (bNeedEncryption == TRUE)) ||
1806 ((pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) && (bNeedEncryption == TRUE)) ) {
1807 cbFrameSize -= cbICVlen;
1808 }
1809
1810 if (pDevice->bSoftwareGenCrcErr == TRUE) {
1811 UINT cbLen;
1812 PDWORD pdwCRC;
1813
1814 dwCRC = 0xFFFFFFFFL;
1815 cbLen = cbFrameSize - cbFCSlen;
1816 // calculate CRC, and wrtie CRC value to end of TD
1817 dwCRC = CRCdwGetCrc32Ex(pbyMacHdr, cbLen, dwCRC);
1818 pdwCRC = (PDWORD)(pbyMacHdr + cbLen);
1819 // finally, we must invert dwCRC to get the correct answer
1820 *pdwCRC = ~dwCRC;
1821 // Force Error
1822 *pdwCRC -= 1;
1823 } else {
1824 cbFrameSize -= cbFCSlen;
1825 }
1826
1827 *pcbHeaderLen = cbHeaderLength;
1828 *pcbTotalLen = cbHeaderLength + cbFrameSize ;
1829
1830
1831 //Set FragCtl in TxBufferHead
1832 pTxBufHead->wFragCtl |= (WORD)byFragType;
1833
1834
1835 return TRUE;
1836
1837}
1838
1839
1840/*+
1841 *
1842 * Description:
1843 * Translate 802.3 to 802.11 header
1844 *
1845 * Parameters:
1846 * In:
1847 * pDevice - Pointer to adpater
1848 * dwTxBufferAddr - Transmit Buffer
1849 * pPacket - Packet from upper layer
1850 * cbPacketSize - Transmit Data Length
1851 * Out:
1852 * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
1853 * pcbAppendPayload - size of append payload for 802.1H translation
1854 *
1855 * Return Value: none
1856 *
1857-*/
1858
1859VOID
1860s_vGenerateMACHeader (
1861 IN PSDevice pDevice,
1862 IN PBYTE pbyBufferAddr,
1863 IN WORD wDuration,
1864 IN PSEthernetHeader psEthHeader,
1865 IN BOOL bNeedEncrypt,
1866 IN WORD wFragType,
1867 IN UINT uDMAIdx,
1868 IN UINT uFragIdx
1869 )
1870{
1871 PS802_11Header pMACHeader = (PS802_11Header)pbyBufferAddr;
1872
Jim Lieb3e362592009-08-12 14:54:11 -07001873 memset(pMACHeader, 0, (sizeof(S802_11Header))); //- sizeof(pMACHeader->dwIV)));
Forest Bond92b96792009-06-13 07:38:31 -04001874
1875 if (uDMAIdx == TYPE_ATIMDMA) {
1876 pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
1877 } else {
1878 pMACHeader->wFrameCtl = TYPE_802_11_DATA;
1879 }
1880
1881 if (pDevice->eOPMode == OP_MODE_AP) {
Andres More9a0e7562010-04-13 21:54:48 -03001882 memcpy(&(pMACHeader->abyAddr1[0]),
1883 &(psEthHeader->abyDstAddr[0]),
1884 ETH_ALEN);
1885 memcpy(&(pMACHeader->abyAddr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
1886 memcpy(&(pMACHeader->abyAddr3[0]),
1887 &(psEthHeader->abySrcAddr[0]),
1888 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001889 pMACHeader->wFrameCtl |= FC_FROMDS;
Andres More9a0e7562010-04-13 21:54:48 -03001890 } else {
1891 if (pDevice->eOPMode == OP_MODE_ADHOC) {
1892 memcpy(&(pMACHeader->abyAddr1[0]),
1893 &(psEthHeader->abyDstAddr[0]),
1894 ETH_ALEN);
1895 memcpy(&(pMACHeader->abyAddr2[0]),
1896 &(psEthHeader->abySrcAddr[0]),
1897 ETH_ALEN);
1898 memcpy(&(pMACHeader->abyAddr3[0]),
1899 &(pDevice->abyBSSID[0]),
1900 ETH_ALEN);
1901 } else {
1902 memcpy(&(pMACHeader->abyAddr3[0]),
1903 &(psEthHeader->abyDstAddr[0]),
1904 ETH_ALEN);
1905 memcpy(&(pMACHeader->abyAddr2[0]),
1906 &(psEthHeader->abySrcAddr[0]),
1907 ETH_ALEN);
1908 memcpy(&(pMACHeader->abyAddr1[0]),
1909 &(pDevice->abyBSSID[0]),
1910 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001911 pMACHeader->wFrameCtl |= FC_TODS;
1912 }
1913 }
1914
1915 if (bNeedEncrypt)
1916 pMACHeader->wFrameCtl |= cpu_to_le16((WORD)WLAN_SET_FC_ISWEP(1));
1917
1918 pMACHeader->wDurationID = cpu_to_le16(wDuration);
1919
1920 if (pDevice->bLongHeader) {
1921 PWLAN_80211HDR_A4 pMACA4Header = (PWLAN_80211HDR_A4) pbyBufferAddr;
1922 pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
Jim Lieb3e362592009-08-12 14:54:11 -07001923 memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
Forest Bond92b96792009-06-13 07:38:31 -04001924 }
1925 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
1926
1927 //Set FragNumber in Sequence Control
1928 pMACHeader->wSeqCtl |= cpu_to_le16((WORD)uFragIdx);
1929
1930 if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
1931 pDevice->wSeqCounter++;
1932 if (pDevice->wSeqCounter > 0x0fff)
1933 pDevice->wSeqCounter = 0;
1934 }
1935
1936 if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) { //StartFrag or MidFrag
1937 pMACHeader->wFrameCtl |= FC_MOREFRAG;
1938 }
1939}
1940
1941
1942
1943/*+
1944 *
1945 * Description:
1946 * Request instructs a MAC to transmit a 802.11 management packet through
1947 * the adapter onto the medium.
1948 *
1949 * Parameters:
1950 * In:
1951 * hDeviceContext - Pointer to the adapter
1952 * pPacket - A pointer to a descriptor for the packet to transmit
1953 * Out:
1954 * none
1955 *
1956 * Return Value: CMD_STATUS_PENDING if MAC Tx resource avaliable; otherwise FALSE
1957 *
1958-*/
1959
1960CMD_STATUS csMgmt_xmit(
1961 IN PSDevice pDevice,
1962 IN PSTxMgmtPacket pPacket
1963 )
1964{
1965 BYTE byPktType;
1966 PBYTE pbyTxBufferAddr;
1967 PVOID pvRTS;
1968 PSCTS pCTS;
1969 PVOID pvTxDataHd;
1970 UINT uDuration;
1971 UINT cbReqCount;
1972 PS802_11Header pMACHeader;
1973 UINT cbHeaderSize;
1974 UINT cbFrameBodySize;
1975 BOOL bNeedACK;
1976 BOOL bIsPSPOLL = FALSE;
1977 PSTxBufHead pTxBufHead;
1978 UINT cbFrameSize;
1979 UINT cbIVlen = 0;
1980 UINT cbICVlen = 0;
1981 UINT cbMIClen = 0;
1982 UINT cbFCSlen = 4;
1983 UINT uPadding = 0;
1984 WORD wTxBufSize;
1985 UINT cbMacHdLen;
1986 SEthernetHeader sEthHeader;
1987 PVOID pvRrvTime;
1988 PVOID pMICHDR;
1989 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1990 WORD wCurrentRate = RATE_1M;
1991 PTX_BUFFER pTX_Buffer;
1992 PUSB_SEND_CONTEXT pContext;
1993
1994
1995
1996 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
1997
1998 if (NULL == pContext) {
1999 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n");
2000 return CMD_STATUS_RESOURCES;
2001 }
2002
2003 pTX_Buffer = (PTX_BUFFER) (&pContext->Data[0]);
2004 pbyTxBufferAddr = (PBYTE)&(pTX_Buffer->adwTxKey[0]);
2005 cbFrameBodySize = pPacket->cbPayloadLen;
2006 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2007 wTxBufSize = sizeof(STxBufHead);
2008 memset(pTxBufHead, 0, wTxBufSize);
2009
2010 if (pDevice->byBBType == BB_TYPE_11A) {
2011 wCurrentRate = RATE_6M;
2012 byPktType = PK_TYPE_11A;
2013 } else {
2014 wCurrentRate = RATE_1M;
2015 byPktType = PK_TYPE_11B;
2016 }
2017
2018 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2019 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2020 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2021 // to set power here.
2022 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
2023 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2024 } else {
2025 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2026 }
2027 pDevice->wCurrentRate = wCurrentRate;
2028
2029
2030 //Set packet type
2031 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2032 pTxBufHead->wFIFOCtl = 0;
2033 }
2034 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2035 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2036 }
2037 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2038 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2039 }
2040 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2041 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2042 }
2043
2044 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2045 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2046
2047
2048 if (IS_MULTICAST_ADDRESS(&(pPacket->p80211Header->sA3.abyAddr1[0])) ||
2049 IS_BROADCAST_ADDRESS(&(pPacket->p80211Header->sA3.abyAddr1[0]))) {
2050 bNeedACK = FALSE;
2051 }
2052 else {
2053 bNeedACK = TRUE;
2054 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2055 };
2056
2057 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2058 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
2059
2060 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2061 //Set Preamble type always long
2062 //pDevice->byPreambleType = PREAMBLE_LONG;
2063 // probe-response don't retry
2064 //if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2065 // bNeedACK = FALSE;
2066 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2067 //}
2068 }
2069
2070 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2071
2072 if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2073 bIsPSPOLL = TRUE;
2074 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2075 } else {
2076 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2077 }
2078
2079 //Set FRAGCTL_MACHDCNT
2080 pTxBufHead->wFragCtl |= cpu_to_le16((WORD)(cbMacHdLen << 10));
2081
2082 // Notes:
2083 // Although spec says MMPDU can be fragmented; In most case,
2084 // no one will send a MMPDU under fragmentation. With RTS may occur.
2085 pDevice->bAES = FALSE; //Set FRAGCTL_WEPTYP
2086
2087 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2088 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2089 cbIVlen = 4;
2090 cbICVlen = 4;
2091 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2092 }
2093 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2094 cbIVlen = 8;//IV+ExtIV
2095 cbMIClen = 8;
2096 cbICVlen = 4;
2097 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2098 //We need to get seed here for filling TxKey entry.
2099 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2100 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2101 }
2102 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2103 cbIVlen = 8;//RSN Header
2104 cbICVlen = 8;//MIC
2105 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2106 pDevice->bAES = TRUE;
2107 }
2108 //MAC Header should be padding 0 to DW alignment.
2109 uPadding = 4 - (cbMacHdLen%4);
2110 uPadding %= 4;
2111 }
2112
2113 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
2114
2115 //Set FIFOCTL_GrpAckPolicy
2116 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
2117 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2118 }
2119 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2120
2121 //Set RrvTime/RTS/CTS Buffer
2122 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2123
2124 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2125 pMICHDR = NULL;
2126 pvRTS = NULL;
2127 pCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2128 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS));
2129 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS) + sizeof(STxDataHead_g);
2130 }
2131 else { // 802.11a/b packet
2132 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2133 pMICHDR = NULL;
2134 pvRTS = NULL;
2135 pCTS = NULL;
2136 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2137 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + sizeof(STxDataHead_ab);
2138 }
2139
Jim Lieb3e362592009-08-12 14:54:11 -07002140 memset((PVOID)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
Forest Bond92b96792009-06-13 07:38:31 -04002141
Andres More9a0e7562010-04-13 21:54:48 -03002142 memcpy(&(sEthHeader.abyDstAddr[0]),
2143 &(pPacket->p80211Header->sA3.abyAddr1[0]),
2144 ETH_ALEN);
2145 memcpy(&(sEthHeader.abySrcAddr[0]),
2146 &(pPacket->p80211Header->sA3.abyAddr2[0]),
2147 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04002148 //=========================
2149 // No Fragmentation
2150 //=========================
2151 pTxBufHead->wFragCtl |= (WORD)FRAGCTL_NONFRAG;
2152
2153
2154 //Fill FIFO,RrvTime,RTS,and CTS
2155 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
2156 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader);
2157
2158 //Fill DataHead
2159 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2160 0, 0, 1, AUTO_FB_NONE);
2161
2162 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2163
2164 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
2165
2166 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2167 PBYTE pbyIVHead;
2168 PBYTE pbyPayloadHead;
2169 PBYTE pbyBSSID;
2170 PSKeyItem pTransmitKey = NULL;
2171
2172 pbyIVHead = (PBYTE)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
2173 pbyPayloadHead = (PBYTE)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
2174 do {
2175 if ((pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) &&
2176 (pDevice->bLinkPass == TRUE)) {
2177 pbyBSSID = pDevice->abyBSSID;
2178 // get pairwise key
2179 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) {
2180 // get group key
2181 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) {
2182 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
2183 break;
2184 }
2185 } else {
2186 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get PTK.\n");
2187 break;
2188 }
2189 }
2190 // get group key
2191 pbyBSSID = pDevice->abyBroadcastAddr;
2192 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
2193 pTransmitKey = NULL;
2194 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KEY is NULL. OP Mode[%d]\n", pDevice->eOPMode);
2195 } else {
2196 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
2197 }
2198 } while(FALSE);
2199 //Fill TXKEY
2200 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2201 (PBYTE)pMACHeader, (WORD)cbFrameBodySize, NULL);
2202
Jim Lieb3e362592009-08-12 14:54:11 -07002203 memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
2204 memcpy(pbyPayloadHead, ((PBYTE)(pPacket->p80211Header) + cbMacHdLen),
Forest Bond92b96792009-06-13 07:38:31 -04002205 cbFrameBodySize);
2206 }
2207 else {
2208 // Copy the Packet into a tx Buffer
Jim Lieb3e362592009-08-12 14:54:11 -07002209 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
Forest Bond92b96792009-06-13 07:38:31 -04002210 }
2211
2212 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2213 pDevice->wSeqCounter++ ;
2214 if (pDevice->wSeqCounter > 0x0fff)
2215 pDevice->wSeqCounter = 0;
2216
2217 if (bIsPSPOLL) {
2218 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2219 // of FIFO control header.
2220 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2221 // in the same place of other packet's Duration-field).
2222 // And it will cause Cisco-AP to issue Disassociation-packet
2223 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2224 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2225 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2226 } else {
2227 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2228 }
2229 }
2230
2231
2232 pTX_Buffer->wTxByteCount = cpu_to_le16((WORD)(cbReqCount));
2233 pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2234 pTX_Buffer->byType = 0x00;
2235
2236 pContext->pPacket = NULL;
2237 pContext->Type = CONTEXT_MGMT_PACKET;
2238 pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
2239
2240 if (WLAN_GET_FC_TODS(pMACHeader->wFrameCtl) == 0) {
2241 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr1[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2242 }
2243 else {
2244 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr3[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2245 }
2246
2247 PIPEnsSendBulkOut(pDevice,pContext);
2248 return CMD_STATUS_PENDING;
2249}
2250
2251
2252CMD_STATUS
2253csBeacon_xmit(
2254 IN PSDevice pDevice,
2255 IN PSTxMgmtPacket pPacket
2256 )
2257{
2258
2259 UINT cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
2260 UINT cbHeaderSize = 0;
2261 WORD wTxBufSize = sizeof(STxShortBufHead);
2262 PSTxShortBufHead pTxBufHead;
2263 PS802_11Header pMACHeader;
2264 PSTxDataHead_ab pTxDataHead;
2265 WORD wCurrentRate;
2266 UINT cbFrameBodySize;
2267 UINT cbReqCount;
2268 PBEACON_BUFFER pTX_Buffer;
2269 PBYTE pbyTxBufferAddr;
2270 PUSB_SEND_CONTEXT pContext;
2271 CMD_STATUS status;
2272
2273
2274 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2275 if (NULL == pContext) {
2276 status = CMD_STATUS_RESOURCES;
2277 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n");
2278 return status ;
2279 }
2280 pTX_Buffer = (PBEACON_BUFFER) (&pContext->Data[0]);
2281 pbyTxBufferAddr = (PBYTE)&(pTX_Buffer->wFIFOCtl);
2282
2283 cbFrameBodySize = pPacket->cbPayloadLen;
2284
2285 pTxBufHead = (PSTxShortBufHead) pbyTxBufferAddr;
2286 wTxBufSize = sizeof(STxShortBufHead);
2287 memset(pTxBufHead, 0, wTxBufSize);
2288
2289 if (pDevice->byBBType == BB_TYPE_11A) {
2290 wCurrentRate = RATE_6M;
2291 pTxDataHead = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize);
2292 //Get SignalField,ServiceField,Length
2293 BBvCaculateParameter(pDevice, cbFrameSize, wCurrentRate, PK_TYPE_11A,
2294 (PWORD)&(pTxDataHead->wTransmitLength), (PBYTE)&(pTxDataHead->byServiceField), (PBYTE)&(pTxDataHead->bySignalField)
2295 );
2296 //Get Duration and TimeStampOff
2297 pTxDataHead->wDuration = cpu_to_le16((WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameSize, PK_TYPE_11A,
2298 wCurrentRate, FALSE, 0, 0, 1, AUTO_FB_NONE));
2299 pTxDataHead->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
2300 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2301 } else {
2302 wCurrentRate = RATE_1M;
2303 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2304 pTxDataHead = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize);
2305 //Get SignalField,ServiceField,Length
2306 BBvCaculateParameter(pDevice, cbFrameSize, wCurrentRate, PK_TYPE_11B,
2307 (PWORD)&(pTxDataHead->wTransmitLength), (PBYTE)&(pTxDataHead->byServiceField), (PBYTE)&(pTxDataHead->bySignalField)
2308 );
2309 //Get Duration and TimeStampOff
2310 pTxDataHead->wDuration = cpu_to_le16((WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameSize, PK_TYPE_11B,
2311 wCurrentRate, FALSE, 0, 0, 1, AUTO_FB_NONE));
2312 pTxDataHead->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
2313 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2314 }
2315
2316 //Generate Beacon Header
2317 pMACHeader = (PS802_11Header)(pbyTxBufferAddr + cbHeaderSize);
Jim Lieb3e362592009-08-12 14:54:11 -07002318 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
Forest Bond92b96792009-06-13 07:38:31 -04002319
2320 pMACHeader->wDurationID = 0;
2321 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2322 pDevice->wSeqCounter++ ;
2323 if (pDevice->wSeqCounter > 0x0fff)
2324 pDevice->wSeqCounter = 0;
2325
2326 cbReqCount = cbHeaderSize + WLAN_HDR_ADDR3_LEN + cbFrameBodySize;
2327
2328 pTX_Buffer->wTxByteCount = (WORD)cbReqCount;
2329 pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2330 pTX_Buffer->byType = 0x01;
2331
2332 pContext->pPacket = NULL;
2333 pContext->Type = CONTEXT_MGMT_PACKET;
2334 pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
2335
2336 PIPEnsSendBulkOut(pDevice,pContext);
2337 return CMD_STATUS_PENDING;
2338
2339}
2340
2341
2342
2343
2344
2345VOID
2346vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb) {
2347
2348 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
2349 BYTE byPktType;
2350 PBYTE pbyTxBufferAddr;
2351 PVOID pvRTS;
2352 PVOID pvCTS;
2353 PVOID pvTxDataHd;
2354 UINT uDuration;
2355 UINT cbReqCount;
2356 PS802_11Header pMACHeader;
2357 UINT cbHeaderSize;
2358 UINT cbFrameBodySize;
2359 BOOL bNeedACK;
2360 BOOL bIsPSPOLL = FALSE;
2361 PSTxBufHead pTxBufHead;
2362 UINT cbFrameSize;
2363 UINT cbIVlen = 0;
2364 UINT cbICVlen = 0;
2365 UINT cbMIClen = 0;
2366 UINT cbFCSlen = 4;
2367 UINT uPadding = 0;
2368 UINT cbMICHDR = 0;
2369 UINT uLength = 0;
2370 DWORD dwMICKey0, dwMICKey1;
2371 DWORD dwMIC_Priority;
2372 PDWORD pdwMIC_L;
2373 PDWORD pdwMIC_R;
2374 WORD wTxBufSize;
2375 UINT cbMacHdLen;
2376 SEthernetHeader sEthHeader;
2377 PVOID pvRrvTime;
2378 PVOID pMICHDR;
2379 WORD wCurrentRate = RATE_1M;
2380 PUWLAN_80211HDR p80211Header;
2381 UINT uNodeIndex = 0;
2382 BOOL bNodeExist = FALSE;
2383 SKeyItem STempKey;
2384 PSKeyItem pTransmitKey = NULL;
2385 PBYTE pbyIVHead;
2386 PBYTE pbyPayloadHead;
2387 PBYTE pbyMacHdr;
2388 UINT cbExtSuppRate = 0;
2389 PTX_BUFFER pTX_Buffer;
2390 PUSB_SEND_CONTEXT pContext;
2391// PWLAN_IE pItem;
2392
2393
2394 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
2395
2396 if(skb->len <= WLAN_HDR_ADDR3_LEN) {
2397 cbFrameBodySize = 0;
2398 }
2399 else {
2400 cbFrameBodySize = skb->len - WLAN_HDR_ADDR3_LEN;
2401 }
2402 p80211Header = (PUWLAN_80211HDR)skb->data;
2403
2404 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2405
2406 if (NULL == pContext) {
2407 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0 TX...NO CONTEXT!\n");
2408 dev_kfree_skb_irq(skb);
2409 return ;
2410 }
2411
2412 pTX_Buffer = (PTX_BUFFER)(&pContext->Data[0]);
2413 pbyTxBufferAddr = (PBYTE)(&pTX_Buffer->adwTxKey[0]);
2414 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2415 wTxBufSize = sizeof(STxBufHead);
2416 memset(pTxBufHead, 0, wTxBufSize);
2417
2418 if (pDevice->byBBType == BB_TYPE_11A) {
2419 wCurrentRate = RATE_6M;
2420 byPktType = PK_TYPE_11A;
2421 } else {
2422 wCurrentRate = RATE_1M;
2423 byPktType = PK_TYPE_11B;
2424 }
2425
2426 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2427 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2428 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2429 // to set power here.
2430 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
2431 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2432 } else {
2433 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2434 }
2435
2436 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x \n", p80211Header->sA3.wFrameCtl);
2437
2438 //Set packet type
2439 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2440 pTxBufHead->wFIFOCtl = 0;
2441 }
2442 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2443 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2444 }
2445 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2446 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2447 }
2448 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2449 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2450 }
2451
2452 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2453 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2454
2455
2456 if (IS_MULTICAST_ADDRESS(&(p80211Header->sA3.abyAddr1[0])) ||
2457 IS_BROADCAST_ADDRESS(&(p80211Header->sA3.abyAddr1[0]))) {
2458 bNeedACK = FALSE;
2459 if (pDevice->bEnableHostWEP) {
2460 uNodeIndex = 0;
2461 bNodeExist = TRUE;
2462 };
2463 }
2464 else {
2465 if (pDevice->bEnableHostWEP) {
2466 if (BSSbIsSTAInNodeDB(pDevice, (PBYTE)(p80211Header->sA3.abyAddr1), &uNodeIndex))
2467 bNodeExist = TRUE;
2468 };
2469 bNeedACK = TRUE;
2470 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2471 };
2472
2473 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2474 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
2475
2476 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2477 //Set Preamble type always long
2478 //pDevice->byPreambleType = PREAMBLE_LONG;
2479
2480 // probe-response don't retry
2481 //if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2482 // bNeedACK = FALSE;
2483 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2484 //}
2485 }
2486
2487 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2488
2489 if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2490 bIsPSPOLL = TRUE;
2491 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2492 } else {
2493 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2494 }
2495
2496 // hostapd deamon ext support rate patch
2497 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2498
2499 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0) {
2500 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
2501 }
2502
2503 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0) {
2504 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
2505 }
2506
2507 if (cbExtSuppRate >0) {
2508 cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
2509 }
2510 }
2511
2512
2513 //Set FRAGCTL_MACHDCNT
2514 pTxBufHead->wFragCtl |= cpu_to_le16((WORD)cbMacHdLen << 10);
2515
2516 // Notes:
2517 // Although spec says MMPDU can be fragmented; In most case,
2518 // no one will send a MMPDU under fragmentation. With RTS may occur.
2519 pDevice->bAES = FALSE; //Set FRAGCTL_WEPTYP
2520
2521
2522 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2523 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2524 cbIVlen = 4;
2525 cbICVlen = 4;
2526 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2527 }
2528 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2529 cbIVlen = 8;//IV+ExtIV
2530 cbMIClen = 8;
2531 cbICVlen = 4;
2532 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2533 //We need to get seed here for filling TxKey entry.
2534 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2535 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2536 }
2537 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2538 cbIVlen = 8;//RSN Header
2539 cbICVlen = 8;//MIC
2540 cbMICHDR = sizeof(SMICHDRHead);
2541 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2542 pDevice->bAES = TRUE;
2543 }
2544 //MAC Header should be padding 0 to DW alignment.
2545 uPadding = 4 - (cbMacHdLen%4);
2546 uPadding %= 4;
2547 }
2548
2549 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
2550
2551 //Set FIFOCTL_GrpAckPolicy
2552 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
2553 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2554 }
2555 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2556
2557
2558 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2559
2560 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2561 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2562 pvRTS = NULL;
2563 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
2564 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
2565 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
2566
2567 }
2568 else {//802.11a/b packet
2569
2570 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2571 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2572 pvRTS = NULL;
2573 pvCTS = NULL;
2574 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
2575 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
2576 }
Jim Lieb3e362592009-08-12 14:54:11 -07002577 memset((PVOID)(pbyTxBufferAddr + wTxBufSize), 0, (cbHeaderSize - wTxBufSize));
Andres More9a0e7562010-04-13 21:54:48 -03002578 memcpy(&(sEthHeader.abyDstAddr[0]),
2579 &(p80211Header->sA3.abyAddr1[0]),
2580 ETH_ALEN);
2581 memcpy(&(sEthHeader.abySrcAddr[0]),
2582 &(p80211Header->sA3.abyAddr2[0]),
2583 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04002584 //=========================
2585 // No Fragmentation
2586 //=========================
2587 pTxBufHead->wFragCtl |= (WORD)FRAGCTL_NONFRAG;
2588
2589
2590 //Fill FIFO,RrvTime,RTS,and CTS
2591 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
2592 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader);
2593
2594 //Fill DataHead
2595 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2596 0, 0, 1, AUTO_FB_NONE);
2597
2598 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2599
2600 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
2601
2602 pbyMacHdr = (PBYTE)(pbyTxBufferAddr + cbHeaderSize);
2603 pbyPayloadHead = (PBYTE)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
2604 pbyIVHead = (PBYTE)(pbyMacHdr + cbMacHdLen + uPadding);
2605
2606 // Copy the Packet into a tx Buffer
2607 memcpy(pbyMacHdr, skb->data, cbMacHdLen);
2608
2609 // version set to 0, patch for hostapd deamon
2610 pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
2611 memcpy(pbyPayloadHead, (skb->data + cbMacHdLen), cbFrameBodySize);
2612
2613 // replace support rate, patch for hostapd deamon( only support 11M)
2614 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2615 if (cbExtSuppRate != 0) {
2616 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
2617 memcpy((pbyPayloadHead + cbFrameBodySize),
2618 pMgmt->abyCurrSuppRates,
2619 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
2620 );
2621 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
2622 memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
2623 pMgmt->abyCurrExtSuppRates,
2624 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
2625 );
2626 }
2627 }
2628
2629 // Set wep
2630 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2631
2632 if (pDevice->bEnableHostWEP) {
2633 pTransmitKey = &STempKey;
2634 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2635 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2636 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2637 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2638 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2639 memcpy(pTransmitKey->abyKey,
2640 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2641 pTransmitKey->uKeyLength
2642 );
2643 }
2644
2645 if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
2646
2647 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
2648 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
2649
2650 // DO Software Michael
2651 MIC_vInit(dwMICKey0, dwMICKey1);
2652 MIC_vAppend((PBYTE)&(sEthHeader.abyDstAddr[0]), 12);
2653 dwMIC_Priority = 0;
2654 MIC_vAppend((PBYTE)&dwMIC_Priority, 4);
2655 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0_tx_8021:MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
2656
2657 uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
2658
2659 MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
2660
2661 pdwMIC_L = (PDWORD)(pbyTxBufferAddr + uLength + cbFrameBodySize);
2662 pdwMIC_R = (PDWORD)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
2663
2664 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
2665 MIC_vUnInit();
2666
2667 if (pDevice->bTxMICFail == TRUE) {
2668 *pdwMIC_L = 0;
2669 *pdwMIC_R = 0;
2670 pDevice->bTxMICFail = FALSE;
2671 }
2672
2673 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
2674 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderSize, uPadding, cbIVlen);
2675 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lx, %lx\n", *pdwMIC_L, *pdwMIC_R);
2676
2677 }
2678
2679 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2680 pbyMacHdr, (WORD)cbFrameBodySize, (PBYTE)pMICHDR);
2681
2682 if (pDevice->bEnableHostWEP) {
2683 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
2684 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
2685 }
2686
2687 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
2688 s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (WORD)(cbFrameBodySize + cbMIClen));
2689 }
2690 }
2691
2692 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2693 pDevice->wSeqCounter++ ;
2694 if (pDevice->wSeqCounter > 0x0fff)
2695 pDevice->wSeqCounter = 0;
2696
2697
2698 if (bIsPSPOLL) {
2699 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2700 // of FIFO control header.
2701 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2702 // in the same place of other packet's Duration-field).
2703 // And it will cause Cisco-AP to issue Disassociation-packet
2704 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2705 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
2706 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
2707 } else {
2708 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(p80211Header->sA2.wDurationID);
2709 }
2710 }
2711
2712 pTX_Buffer->wTxByteCount = cpu_to_le16((WORD)(cbReqCount));
2713 pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2714 pTX_Buffer->byType = 0x00;
2715
2716 pContext->pPacket = skb;
2717 pContext->Type = CONTEXT_MGMT_PACKET;
2718 pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
2719
2720 if (WLAN_GET_FC_TODS(pMACHeader->wFrameCtl) == 0) {
2721 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr1[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2722 }
2723 else {
2724 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr3[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2725 }
2726 PIPEnsSendBulkOut(pDevice,pContext);
2727 return ;
2728
2729}
2730
2731
2732
2733
2734//TYPE_AC0DMA data tx
2735/*
2736 * Description:
2737 * Tx packet via AC0DMA(DMA1)
2738 *
2739 * Parameters:
2740 * In:
2741 * pDevice - Pointer to the adapter
2742 * skb - Pointer to tx skb packet
2743 * Out:
2744 * void
2745 *
2746 * Return Value: NULL
2747 */
2748
2749
2750
2751NTSTATUS
2752nsDMA_tx_packet(
2753 IN PSDevice pDevice,
2754 IN UINT uDMAIdx,
2755 IN struct sk_buff *skb
2756 )
2757{
2758 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
2759 UINT BytesToWrite =0,uHeaderLen = 0;
2760 UINT uNodeIndex = 0;
2761 BYTE byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
2762 WORD wAID;
2763 BYTE byPktType;
2764 BOOL bNeedEncryption = FALSE;
2765 PSKeyItem pTransmitKey = NULL;
2766 SKeyItem STempKey;
2767 UINT ii;
2768 BOOL bTKIP_UseGTK = FALSE;
2769 BOOL bNeedDeAuth = FALSE;
2770 PBYTE pbyBSSID;
2771 BOOL bNodeExist = FALSE;
2772 PUSB_SEND_CONTEXT pContext;
2773 BOOL fConvertedPacket;
2774 PTX_BUFFER pTX_Buffer;
2775 UINT status;
2776 WORD wKeepRate = pDevice->wCurrentRate;
2777 struct net_device_stats* pStats = &pDevice->stats;
2778//#ifdef WPA_SM_Transtatus
2779 // extern SWPAResult wpa_Result;
2780//#endif
2781 BOOL bTxeapol_key = FALSE;
2782
2783
2784 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2785
2786 if (pDevice->uAssocCount == 0) {
2787 dev_kfree_skb_irq(skb);
2788 return 0;
2789 }
2790
2791 if (IS_MULTICAST_ADDRESS((PBYTE)(skb->data))) {
2792 uNodeIndex = 0;
2793 bNodeExist = TRUE;
2794 if (pMgmt->sNodeDBTable[0].bPSEnable) {
2795
2796 skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skb);
2797 pMgmt->sNodeDBTable[0].wEnQueueCnt++;
2798 // set tx map
2799 pMgmt->abyPSTxMap[0] |= byMask[0];
2800 return 0;
2801 }
2802 // muticast/broadcast data rate
2803
2804 if (pDevice->byBBType != BB_TYPE_11A)
2805 pDevice->wCurrentRate = RATE_2M;
2806 else
2807 pDevice->wCurrentRate = RATE_24M;
2808 // long preamble type
2809 pDevice->byPreambleType = PREAMBLE_SHORT;
2810
2811 }else {
2812
2813 if (BSSbIsSTAInNodeDB(pDevice, (PBYTE)(skb->data), &uNodeIndex)) {
2814
2815 if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
2816
2817 skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
2818
2819 pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
2820 // set tx map
2821 wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
2822 pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
2823 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set:pMgmt->abyPSTxMap[%d]= %d\n",
2824 (wAID >> 3), pMgmt->abyPSTxMap[wAID >> 3]);
2825
2826 return 0;
2827 }
2828 // AP rate decided from node
2829 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2830 // tx preamble decided from node
2831
2832 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2833 pDevice->byPreambleType = pDevice->byShortPreamble;
2834
2835 }else {
2836 pDevice->byPreambleType = PREAMBLE_LONG;
2837 }
2838 bNodeExist = TRUE;
2839 }
2840 }
2841
2842 if (bNodeExist == FALSE) {
2843 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Unknown STA not found in node DB \n");
2844 dev_kfree_skb_irq(skb);
2845 return 0;
2846 }
2847 }
2848
2849 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2850
2851 if (pContext == NULL) {
2852 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG" pContext == NULL\n");
2853 dev_kfree_skb_irq(skb);
2854 return STATUS_RESOURCES;
2855 }
2856
2857 memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)(skb->data), U_HEADER_LEN);
2858
2859//mike add:station mode check eapol-key challenge--->
2860{
2861 BYTE Protocol_Version; //802.1x Authentication
2862 BYTE Packet_Type; //802.1x Authentication
2863 BYTE Descriptor_type;
2864 WORD Key_info;
2865
2866 Protocol_Version = skb->data[U_HEADER_LEN];
2867 Packet_Type = skb->data[U_HEADER_LEN+1];
2868 Descriptor_type = skb->data[U_HEADER_LEN+1+1+2];
2869 Key_info = (skb->data[U_HEADER_LEN+1+1+2+1] << 8)|(skb->data[U_HEADER_LEN+1+1+2+2]);
2870 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
2871 if(((Protocol_Version==1) ||(Protocol_Version==2)) &&
2872 (Packet_Type==3)) { //802.1x OR eapol-key challenge frame transfer
2873 bTxeapol_key = TRUE;
2874 if(!(Key_info & BIT3) && //WPA or RSN group-key challenge
2875 (Key_info & BIT8) && (Key_info & BIT9)) { //send 2/2 key
2876 if(Descriptor_type==254) {
2877 pDevice->fWPA_Authened = TRUE;
2878 PRINT_K("WPA ");
2879 }
2880 else {
2881 pDevice->fWPA_Authened = TRUE;
2882 PRINT_K("WPA2(re-keying) ");
2883 }
2884 PRINT_K("Authentication completed!!\n");
2885 }
2886 else if((Key_info & BIT3) && (Descriptor_type==2) && //RSN pairse-key challenge
2887 (Key_info & BIT8) && (Key_info & BIT9)) {
2888 pDevice->fWPA_Authened = TRUE;
2889 PRINT_K("WPA2 Authentication completed!!\n");
2890 }
2891 }
2892 }
2893}
2894//mike add:station mode check eapol-key challenge<---
2895
2896 if (pDevice->bEncryptionEnable == TRUE) {
2897 bNeedEncryption = TRUE;
2898 // get Transmit key
2899 do {
2900 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
2901 (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2902 pbyBSSID = pDevice->abyBSSID;
2903 // get pairwise key
2904 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) {
2905 // get group key
2906 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) {
2907 bTKIP_UseGTK = TRUE;
2908 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2909 break;
2910 }
2911 } else {
2912 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get PTK.\n");
2913 break;
2914 }
2915 }else if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2916
2917 pbyBSSID = pDevice->sTxEthHeader.abyDstAddr; //TO_DS = 0 and FROM_DS = 0 --> 802.11 MAC Address1
2918 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS Serach Key: \n");
2919 for (ii = 0; ii< 6; ii++)
2920 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"%x \n", *(pbyBSSID+ii));
2921 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"\n");
2922
2923 // get pairwise key
2924 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == TRUE)
2925 break;
2926 }
2927 // get group key
2928 pbyBSSID = pDevice->abyBroadcastAddr;
2929 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
2930 pTransmitKey = NULL;
2931 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2932 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode);
2933 }
2934 else
2935 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"NOT IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode);
2936 } else {
2937 bTKIP_UseGTK = TRUE;
2938 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2939 }
2940 } while(FALSE);
2941 }
2942
2943 if (pDevice->bEnableHostWEP) {
2944 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"acdma0: STA index %d\n", uNodeIndex);
2945 if (pDevice->bEncryptionEnable == TRUE) {
2946 pTransmitKey = &STempKey;
2947 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2948 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2949 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2950 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2951 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2952 memcpy(pTransmitKey->abyKey,
2953 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2954 pTransmitKey->uKeyLength
2955 );
2956 }
2957 }
2958
2959 byPktType = (BYTE)pDevice->byPacketType;
2960
2961 if (pDevice->bFixRate) {
2962 if (pDevice->byBBType == BB_TYPE_11B) {
2963 if (pDevice->uConnectionRate >= RATE_11M) {
2964 pDevice->wCurrentRate = RATE_11M;
2965 } else {
2966 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
2967 }
2968 } else {
2969 if ((pDevice->byBBType == BB_TYPE_11A) &&
2970 (pDevice->uConnectionRate <= RATE_6M)) {
2971 pDevice->wCurrentRate = RATE_6M;
2972 } else {
2973 if (pDevice->uConnectionRate >= RATE_54M)
2974 pDevice->wCurrentRate = RATE_54M;
2975 else
2976 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
2977 }
2978 }
2979 }
2980 else {
2981 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2982 // Adhoc Tx rate decided from node DB
2983 if (IS_MULTICAST_ADDRESS(&(pDevice->sTxEthHeader.abyDstAddr[0]))) {
2984 // Multicast use highest data rate
2985 pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate;
2986 // preamble type
2987 pDevice->byPreambleType = pDevice->byShortPreamble;
2988 }
2989 else {
2990 if(BSSbIsSTAInNodeDB(pDevice, &(pDevice->sTxEthHeader.abyDstAddr[0]), &uNodeIndex)) {
2991 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2992 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2993 pDevice->byPreambleType = pDevice->byShortPreamble;
2994
2995 }
2996 else {
2997 pDevice->byPreambleType = PREAMBLE_LONG;
2998 }
2999 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Found Node Index is [%d] Tx Data Rate:[%d]\n",uNodeIndex, pDevice->wCurrentRate);
3000 }
3001 else {
3002 if (pDevice->byBBType != BB_TYPE_11A)
3003 pDevice->wCurrentRate = RATE_2M;
3004 else
3005 pDevice->wCurrentRate = RATE_24M; // refer to vMgrCreateOwnIBSS()'s
3006 // abyCurrExtSuppRates[]
3007 pDevice->byPreambleType = PREAMBLE_SHORT;
3008 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Not Found Node use highest basic Rate.....\n");
3009 }
3010 }
3011 }
3012 if (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) {
3013 // Infra STA rate decided from AP Node, index = 0
3014 pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate;
3015 }
3016 }
3017
3018 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
3019 if (pDevice->byBBType != BB_TYPE_11A) {
3020 pDevice->wCurrentRate = RATE_1M;
3021 pDevice->byACKRate = RATE_1M;
3022 pDevice->byTopCCKBasicRate = RATE_1M;
3023 pDevice->byTopOFDMBasicRate = RATE_6M;
3024 } else {
3025 pDevice->wCurrentRate = RATE_6M;
3026 pDevice->byACKRate = RATE_6M;
3027 pDevice->byTopCCKBasicRate = RATE_1M;
3028 pDevice->byTopOFDMBasicRate = RATE_6M;
3029 }
3030 }
3031
3032 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "dma_tx: pDevice->wCurrentRate = %d \n", pDevice->wCurrentRate);
3033
3034 if (wKeepRate != pDevice->wCurrentRate) {
3035 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_SETPOWER, NULL);
3036 }
3037
3038 if (pDevice->wCurrentRate <= RATE_11M) {
3039 byPktType = PK_TYPE_11B;
3040 }
3041
3042 if (bNeedEncryption == TRUE) {
3043 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType));
3044 if ((pDevice->sTxEthHeader.wType) == TYPE_PKT_802_1x) {
3045 bNeedEncryption = FALSE;
3046 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType));
3047 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
3048 if (pTransmitKey == NULL) {
3049 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Don't Find TX KEY\n");
3050 }
3051 else {
3052 if (bTKIP_UseGTK == TRUE) {
3053 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n");
3054 }
3055 else {
3056 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
3057 bNeedEncryption = TRUE;
3058 }
3059 }
3060 }
3061
3062 if (pDevice->byCntMeasure == 2) {
3063 bNeedDeAuth = TRUE;
3064 pDevice->s802_11Counter.TKIPCounterMeasuresInvoked++;
3065 }
3066
3067 if (pDevice->bEnableHostWEP) {
3068 if ((uNodeIndex != 0) &&
3069 (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) {
3070 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
3071 bNeedEncryption = TRUE;
3072 }
3073 }
3074 }
3075 else {
3076
3077#if 0
3078 if((pDevice->fWPA_Authened == FALSE) &&
3079 ((pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK)||(pMgmt->eAuthenMode = WMAC_AUTH_WPA2PSK))){
3080 dev_kfree_skb_irq(skb);
3081 pStats->tx_dropped++;
3082 return STATUS_FAILURE;
3083 }
3084 else if (pTransmitKey == NULL) {
3085 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n");
3086 dev_kfree_skb_irq(skb);
3087 pStats->tx_dropped++;
3088 return STATUS_FAILURE;
3089 }
3090#else
3091 if (pTransmitKey == NULL) {
3092 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n");
3093 dev_kfree_skb_irq(skb);
3094 pStats->tx_dropped++;
3095 return STATUS_FAILURE;
3096 }
3097#endif
3098
3099 }
3100 }
3101
3102 fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType,
3103 (PBYTE)(&pContext->Data[0]), bNeedEncryption,
3104 skb->len, uDMAIdx, &pDevice->sTxEthHeader,
3105 (PBYTE)skb->data, pTransmitKey, uNodeIndex,
3106 pDevice->wCurrentRate,
3107 &uHeaderLen, &BytesToWrite
3108 );
3109
3110 if (fConvertedPacket == FALSE) {
3111 pContext->bBoolInUse = FALSE;
3112 dev_kfree_skb_irq(skb);
3113 return STATUS_FAILURE;
3114 }
3115
3116 if ( pDevice->bEnablePSMode == TRUE ) {
3117 if ( !pDevice->bPSModeTxBurst ) {
3118 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_MAC_DISPOWERSAVING, NULL);
3119 pDevice->bPSModeTxBurst = TRUE;
3120 }
3121 }
3122
3123 pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]);
3124 pTX_Buffer->byPKTNO = (BYTE) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
3125 pTX_Buffer->wTxByteCount = (WORD)BytesToWrite;
3126
3127 pContext->pPacket = skb;
3128 pContext->Type = CONTEXT_DATA_PACKET;
3129 pContext->uBufLen = (WORD)BytesToWrite + 4 ; //USB header
3130
3131 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.abyDstAddr[0]),(WORD) (BytesToWrite-uHeaderLen),pTX_Buffer->wFIFOCtl);
3132
3133 status = PIPEnsSendBulkOut(pDevice,pContext);
3134
3135 if (bNeedDeAuth == TRUE) {
3136 WORD wReason = WLAN_MGMT_REASON_MIC_FAILURE;
3137
3138 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_DEAUTH, (PBYTE)&wReason);
3139 }
3140
3141 if(status!=STATUS_PENDING) {
3142 pContext->bBoolInUse = FALSE;
3143 dev_kfree_skb_irq(skb);
3144 return STATUS_FAILURE;
3145 }
3146 else
3147 return 0;
3148
3149}
3150
3151
3152
3153/*
3154 * Description:
3155 * Relay packet send (AC1DMA) from rx dpc.
3156 *
3157 * Parameters:
3158 * In:
3159 * pDevice - Pointer to the adapter
3160 * pPacket - Pointer to rx packet
3161 * cbPacketSize - rx ethernet frame size
3162 * Out:
3163 * TURE, FALSE
3164 *
3165 * Return Value: Return TRUE if packet is copy to dma1; otherwise FALSE
3166 */
3167
3168
3169BOOL
3170bRelayPacketSend (
3171 IN PSDevice pDevice,
3172 IN PBYTE pbySkbData,
3173 IN UINT uDataLen,
3174 IN UINT uNodeIndex
3175 )
3176{
3177 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
3178 UINT BytesToWrite =0,uHeaderLen = 0;
3179 BYTE byPktType = PK_TYPE_11B;
3180 BOOL bNeedEncryption = FALSE;
3181 SKeyItem STempKey;
3182 PSKeyItem pTransmitKey = NULL;
3183 PBYTE pbyBSSID;
3184 PUSB_SEND_CONTEXT pContext;
3185 BYTE byPktTyp;
3186 BOOL fConvertedPacket;
3187 PTX_BUFFER pTX_Buffer;
3188 UINT status;
3189 WORD wKeepRate = pDevice->wCurrentRate;
3190
3191
3192
3193 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
3194
3195 if (NULL == pContext) {
3196 return FALSE;
3197 }
3198
3199 memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)pbySkbData, U_HEADER_LEN);
3200
3201 if (pDevice->bEncryptionEnable == TRUE) {
3202 bNeedEncryption = TRUE;
3203 // get group key
3204 pbyBSSID = pDevice->abyBroadcastAddr;
3205 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
3206 pTransmitKey = NULL;
3207 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"KEY is NULL. [%d]\n", pMgmt->eCurrMode);
3208 } else {
3209 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
3210 }
3211 }
3212
3213 if (pDevice->bEnableHostWEP) {
Roel Kluinee93e192009-10-16 20:17:57 +02003214 if (uNodeIndex < MAX_NODE_NUM + 1) {
Forest Bond92b96792009-06-13 07:38:31 -04003215 pTransmitKey = &STempKey;
3216 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
3217 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
3218 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
3219 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
3220 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
3221 memcpy(pTransmitKey->abyKey,
3222 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
3223 pTransmitKey->uKeyLength
3224 );
3225 }
3226 }
3227
3228 if ( bNeedEncryption && (pTransmitKey == NULL) ) {
3229 pContext->bBoolInUse = FALSE;
3230 return FALSE;
3231 }
3232
3233 byPktTyp = (BYTE)pDevice->byPacketType;
3234
3235 if (pDevice->bFixRate) {
3236 if (pDevice->byBBType == BB_TYPE_11B) {
3237 if (pDevice->uConnectionRate >= RATE_11M) {
3238 pDevice->wCurrentRate = RATE_11M;
3239 } else {
3240 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
3241 }
3242 } else {
3243 if ((pDevice->byBBType == BB_TYPE_11A) &&
3244 (pDevice->uConnectionRate <= RATE_6M)) {
3245 pDevice->wCurrentRate = RATE_6M;
3246 } else {
3247 if (pDevice->uConnectionRate >= RATE_54M)
3248 pDevice->wCurrentRate = RATE_54M;
3249 else
3250 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
3251 }
3252 }
3253 }
3254 else {
3255 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
3256 }
3257
3258
3259 if (wKeepRate != pDevice->wCurrentRate) {
3260 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SETPOWER, NULL);
3261 }
3262
3263 if (pDevice->wCurrentRate <= RATE_11M)
3264 byPktType = PK_TYPE_11B;
3265
3266 BytesToWrite = uDataLen + U_CRC_LEN;
3267 // Convert the packet to an usb frame and copy into our buffer
3268 // and send the irp.
3269
3270 fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType,
3271 (PBYTE)(&pContext->Data[0]), bNeedEncryption,
3272 uDataLen, TYPE_AC0DMA, &pDevice->sTxEthHeader,
3273 pbySkbData, pTransmitKey, uNodeIndex,
3274 pDevice->wCurrentRate,
3275 &uHeaderLen, &BytesToWrite
3276 );
3277
3278 if (fConvertedPacket == FALSE) {
3279 pContext->bBoolInUse = FALSE;
3280 return FALSE;
3281 }
3282
3283 pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]);
3284 pTX_Buffer->byPKTNO = (BYTE) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
3285 pTX_Buffer->wTxByteCount = (WORD)BytesToWrite;
3286
3287 pContext->pPacket = NULL;
3288 pContext->Type = CONTEXT_DATA_PACKET;
3289 pContext->uBufLen = (WORD)BytesToWrite + 4 ; //USB header
3290
3291 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.abyDstAddr[0]),(WORD) (BytesToWrite-uHeaderLen),pTX_Buffer->wFIFOCtl);
3292
3293 status = PIPEnsSendBulkOut(pDevice,pContext);
3294
3295 return TRUE;
3296}
3297