blob: bfc786059ad1457e0d6d01e0a865c858c441ac57 [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
Andres More8611a292010-05-01 14:25:00 -0300116void
Forest Bond92b96792009-06-13 07:38:31 -0400117s_vSaveTxPktInfo(
Andres More592ccfe2010-04-17 12:07:42 -0300118 PSDevice pDevice,
119 BYTE byPktNum,
120 PBYTE pbyDestAddr,
121 WORD wPktLength,
122 WORD wFIFOCtl
Forest Bond92b96792009-06-13 07:38:31 -0400123);
124
125static
Andres More8611a292010-05-01 14:25:00 -0300126void *
Forest Bond92b96792009-06-13 07:38:31 -0400127s_vGetFreeContext(
128 PSDevice pDevice
129 );
130
131
132static
Andres More8611a292010-05-01 14:25:00 -0300133void
Forest Bond92b96792009-06-13 07:38:31 -0400134s_vGenerateTxParameter(
Andres More592ccfe2010-04-17 12:07:42 -0300135 PSDevice pDevice,
136 BYTE byPktType,
137 WORD wCurrentRate,
Andres More8611a292010-05-01 14:25:00 -0300138 void *pTxBufHead,
139 void *pvRrvTime,
140 void *pvRTS,
141 void *pvCTS,
Andres More592ccfe2010-04-17 12:07:42 -0300142 UINT cbFrameSize,
143 BOOL bNeedACK,
144 UINT uDMAIdx,
145 PSEthernetHeader psEthHeader
Forest Bond92b96792009-06-13 07:38:31 -0400146 );
147
148
149static
150UINT
151s_uFillDataHead (
Andres More592ccfe2010-04-17 12:07:42 -0300152 PSDevice pDevice,
153 BYTE byPktType,
154 WORD wCurrentRate,
Andres More8611a292010-05-01 14:25:00 -0300155 void *pTxDataHead,
Andres More592ccfe2010-04-17 12:07:42 -0300156 UINT cbFrameLength,
157 UINT uDMAIdx,
158 BOOL bNeedAck,
159 UINT uFragIdx,
160 UINT cbLastFragmentSize,
161 UINT uMACfragNum,
162 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400163 );
164
165
166
167
168static
Andres More8611a292010-05-01 14:25:00 -0300169void
Forest Bond92b96792009-06-13 07:38:31 -0400170s_vGenerateMACHeader (
Andres More592ccfe2010-04-17 12:07:42 -0300171 PSDevice pDevice,
172 PBYTE pbyBufferAddr,
173 WORD wDuration,
174 PSEthernetHeader psEthHeader,
175 BOOL bNeedEncrypt,
176 WORD wFragType,
177 UINT uDMAIdx,
178 UINT uFragIdx
Forest Bond92b96792009-06-13 07:38:31 -0400179 );
180
181static
Andres More8611a292010-05-01 14:25:00 -0300182void
Forest Bond92b96792009-06-13 07:38:31 -0400183s_vFillTxKey(
Andres More592ccfe2010-04-17 12:07:42 -0300184 PSDevice pDevice,
185 PBYTE pbyBuf,
186 PBYTE pbyIVHead,
187 PSKeyItem pTransmitKey,
188 PBYTE pbyHdrBuf,
189 WORD wPayloadLen,
Andres More6f8c13c2010-05-04 20:40:10 -0300190 PBYTE pMICHDR
Forest Bond92b96792009-06-13 07:38:31 -0400191 );
192
193static
Andres More8611a292010-05-01 14:25:00 -0300194void
Forest Bond92b96792009-06-13 07:38:31 -0400195s_vSWencryption (
Andres More592ccfe2010-04-17 12:07:42 -0300196 PSDevice pDevice,
197 PSKeyItem pTransmitKey,
198 PBYTE pbyPayloadHead,
199 WORD wPayloadSize
Forest Bond92b96792009-06-13 07:38:31 -0400200 );
201
202static
203UINT
204s_uGetTxRsvTime (
Andres More592ccfe2010-04-17 12:07:42 -0300205 PSDevice pDevice,
206 BYTE byPktType,
207 UINT cbFrameLength,
208 WORD wRate,
209 BOOL bNeedAck
Forest Bond92b96792009-06-13 07:38:31 -0400210 );
211
212
213static
214UINT
215s_uGetRTSCTSRsvTime (
Andres More592ccfe2010-04-17 12:07:42 -0300216 PSDevice pDevice,
217 BYTE byRTSRsvType,
218 BYTE byPktType,
219 UINT cbFrameLength,
220 WORD wCurrentRate
Forest Bond92b96792009-06-13 07:38:31 -0400221 );
222
223static
Andres More8611a292010-05-01 14:25:00 -0300224void
Forest Bond92b96792009-06-13 07:38:31 -0400225s_vFillCTSHead (
Andres More592ccfe2010-04-17 12:07:42 -0300226 PSDevice pDevice,
227 UINT uDMAIdx,
228 BYTE byPktType,
Andres More8611a292010-05-01 14:25:00 -0300229 void *pvCTS,
Andres More592ccfe2010-04-17 12:07:42 -0300230 UINT cbFrameLength,
231 BOOL bNeedAck,
232 BOOL bDisCRC,
233 WORD wCurrentRate,
234 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400235 );
236
237static
Andres More8611a292010-05-01 14:25:00 -0300238void
Forest Bond92b96792009-06-13 07:38:31 -0400239s_vFillRTSHead(
Andres More592ccfe2010-04-17 12:07:42 -0300240 PSDevice pDevice,
241 BYTE byPktType,
Andres More8611a292010-05-01 14:25:00 -0300242 void *pvRTS,
Andres More592ccfe2010-04-17 12:07:42 -0300243 UINT cbFrameLength,
244 BOOL bNeedAck,
245 BOOL bDisCRC,
246 PSEthernetHeader psEthHeader,
247 WORD wCurrentRate,
248 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400249 );
250
251static
252UINT
253s_uGetDataDuration (
Andres More592ccfe2010-04-17 12:07:42 -0300254 PSDevice pDevice,
255 BYTE byDurType,
256 UINT cbFrameLength,
257 BYTE byPktType,
258 WORD wRate,
259 BOOL bNeedAck,
260 UINT uFragIdx,
261 UINT cbLastFragmentSize,
262 UINT uMACfragNum,
263 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400264 );
265
266
267static
268UINT
269s_uGetRTSCTSDuration (
Andres More592ccfe2010-04-17 12:07:42 -0300270 PSDevice pDevice,
271 BYTE byDurType,
272 UINT cbFrameLength,
273 BYTE byPktType,
274 WORD wRate,
275 BOOL bNeedAck,
276 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400277 );
278
279
280/*--------------------- Export Variables --------------------------*/
281
282static
Andres More8611a292010-05-01 14:25:00 -0300283void *
Forest Bond92b96792009-06-13 07:38:31 -0400284s_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 }
Andres More8611a292010-05-01 14:25:00 -0300305 return (void *) pReturnContext;
Forest Bond92b96792009-06-13 07:38:31 -0400306}
307
308
309static
Andres More8611a292010-05-01 14:25:00 -0300310void
Forest Bond92b96792009-06-13 07:38:31 -0400311s_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
Andres More8611a292010-05-01 14:25:00 -0300334void
Forest Bond92b96792009-06-13 07:38:31 -0400335s_vFillTxKey (
Andres More592ccfe2010-04-17 12:07:42 -0300336 PSDevice pDevice,
337 PBYTE pbyBuf,
338 PBYTE pbyIVHead,
339 PSKeyItem pTransmitKey,
340 PBYTE pbyHdrBuf,
341 WORD wPayloadLen,
Andres More6f8c13c2010-05-04 20:40:10 -0300342 PBYTE pMICHDR
Forest Bond92b96792009-06-13 07:38:31 -0400343 )
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
Andres More8611a292010-05-01 14:25:00 -0300451void
Forest Bond92b96792009-06-13 07:38:31 -0400452s_vSWencryption (
Andres More592ccfe2010-04-17 12:07:42 -0300453 PSDevice pDevice,
454 PSKeyItem pTransmitKey,
455 PBYTE pbyPayloadHead,
456 WORD wPayloadSize
Forest Bond92b96792009-06-13 07:38:31 -0400457 )
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 (
Andres More592ccfe2010-04-17 12:07:42 -0300502 PSDevice pDevice,
503 BYTE byPktType,
504 UINT cbFrameLength,
505 WORD wRate,
506 BOOL bNeedAck
Forest Bond92b96792009-06-13 07:38:31 -0400507 )
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 (
Andres More592ccfe2010-04-17 12:07:42 -0300530 PSDevice pDevice,
531 BYTE byRTSRsvType,
532 BYTE byPktType,
533 UINT cbFrameLength,
534 WORD wCurrentRate
Forest Bond92b96792009-06-13 07:38:31 -0400535 )
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 (
Andres More592ccfe2010-04-17 12:07:42 -0300572 PSDevice pDevice,
573 BYTE byDurType,
574 UINT cbFrameLength,
575 BYTE byPktType,
576 WORD wRate,
577 BOOL bNeedAck,
578 UINT uFragIdx,
579 UINT cbLastFragmentSize,
580 UINT uMACfragNum,
581 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400582 )
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 (
Andres More592ccfe2010-04-17 12:07:42 -0300742 PSDevice pDevice,
743 BYTE byDurType,
744 UINT cbFrameLength,
745 BYTE byPktType,
746 WORD wRate,
747 BOOL bNeedAck,
748 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400749 )
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 (
Andres More592ccfe2010-04-17 12:07:42 -0300841 PSDevice pDevice,
842 BYTE byPktType,
843 WORD wCurrentRate,
Andres More8611a292010-05-01 14:25:00 -0300844 void *pTxDataHead,
Andres More592ccfe2010-04-17 12:07:42 -0300845 UINT cbFrameLength,
846 UINT uDMAIdx,
847 BOOL bNeedAck,
848 UINT uFragIdx,
849 UINT cbLastFragmentSize,
850 UINT uMACfragNum,
851 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400852 )
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
Andres More8611a292010-05-01 14:25:00 -0300984void
Forest Bond92b96792009-06-13 07:38:31 -0400985s_vFillRTSHead (
Andres More592ccfe2010-04-17 12:07:42 -0300986 PSDevice pDevice,
987 BYTE byPktType,
Andres More8611a292010-05-01 14:25:00 -0300988 void *pvRTS,
Andres More592ccfe2010-04-17 12:07:42 -0300989 UINT cbFrameLength,
990 BOOL bNeedAck,
991 BOOL bDisCRC,
992 PSEthernetHeader psEthHeader,
993 WORD wCurrentRate,
994 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400995 )
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
Andres More8611a292010-05-01 14:25:00 -03001212void
Forest Bond92b96792009-06-13 07:38:31 -04001213s_vFillCTSHead (
Andres More592ccfe2010-04-17 12:07:42 -03001214 PSDevice pDevice,
1215 UINT uDMAIdx,
1216 BYTE byPktType,
Andres More8611a292010-05-01 14:25:00 -03001217 void *pvCTS,
Andres More592ccfe2010-04-17 12:07:42 -03001218 UINT cbFrameLength,
1219 BOOL bNeedAck,
1220 BOOL bDisCRC,
1221 WORD wCurrentRate,
1222 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -04001223 )
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
Andres More8611a292010-05-01 14:25:00 -03001312void
Forest Bond92b96792009-06-13 07:38:31 -04001313s_vGenerateTxParameter (
Andres More592ccfe2010-04-17 12:07:42 -03001314 PSDevice pDevice,
1315 BYTE byPktType,
1316 WORD wCurrentRate,
Andres More8611a292010-05-01 14:25:00 -03001317 void *pTxBufHead,
1318 void *pvRrvTime,
1319 void *pvRTS,
1320 void *pvCTS,
Andres More592ccfe2010-04-17 12:07:42 -03001321 UINT cbFrameSize,
1322 BOOL bNeedACK,
1323 UINT uDMAIdx,
1324 PSEthernetHeader psEthHeader
Forest Bond92b96792009-06-13 07:38:31 -04001325 )
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(
Andres More592ccfe2010-04-17 12:07:42 -03001431 PSDevice pDevice,
1432 BYTE byPktType,
1433 PBYTE usbPacketBuf,
1434 BOOL bNeedEncryption,
1435 UINT uSkbPacketLen,
1436 UINT uDMAIdx,
1437 PSEthernetHeader psEthHeader,
1438 PBYTE pPacket,
1439 PSKeyItem pTransmitKey,
1440 UINT uNodeIndex,
1441 WORD wCurrentRate,
Andres More6f8c13c2010-05-04 20:40:10 -03001442 UINT *pcbHeaderLen,
1443 UINT *pcbTotalLen
Forest Bond92b96792009-06-13 07:38:31 -04001444 )
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;
Andres More8611a292010-05-01 14:25:00 -03001458 void *pvRrvTime;
Forest Bond92b96792009-06-13 07:38:31 -04001459 PSMICHDRHead pMICHDR;
Andres More8611a292010-05-01 14:25:00 -03001460 void *pvRTS;
1461 void *pvCTS;
1462 void *pvTxDataHd;
Forest Bond92b96792009-06-13 07:38:31 -04001463 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
Andres More8611a292010-05-01 14:25:00 -03001697 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate,
1698 (void *)pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
Forest Bond92b96792009-06-13 07:38:31 -04001699 cbFrameSize, bNeedACK, uDMAIdx, psEthHeader);
1700 //Fill DataHead
1701 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
1702 0, 0, 1/*uMACfragNum*/, byFBOption);
1703 // Generate TX MAC Header
1704 s_vGenerateMACHeader(pDevice, pbyMacHdr, (WORD)uDuration, psEthHeader, bNeedEncryption,
1705 byFragType, uDMAIdx, 0);
1706
1707 if (bNeedEncryption == TRUE) {
1708 //Fill TXKEY
1709 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
1710 pbyMacHdr, (WORD)cbFrameBodySize, (PBYTE)pMICHDR);
1711
1712 if (pDevice->bEnableHostWEP) {
1713 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1714 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1715 }
1716 }
1717
1718 // 802.1H
1719 if (ntohs(psEthHeader->wType) > MAX_DATA_LEN) {
1720 if (pDevice->dwDiagRefCount == 0) {
1721 if ( (psEthHeader->wType == TYPE_PKT_IPX) ||
1722 (psEthHeader->wType == cpu_to_le16(0xF380))) {
Jim Lieb3e362592009-08-12 14:54:11 -07001723 memcpy((PBYTE) (pbyPayloadHead), &abySNAP_Bridgetunnel[0], 6);
Forest Bond92b96792009-06-13 07:38:31 -04001724 } else {
Jim Lieb3e362592009-08-12 14:54:11 -07001725 memcpy((PBYTE) (pbyPayloadHead), &abySNAP_RFC1042[0], 6);
Forest Bond92b96792009-06-13 07:38:31 -04001726 }
1727 pbyType = (PBYTE) (pbyPayloadHead + 6);
Jim Lieb3e362592009-08-12 14:54:11 -07001728 memcpy(pbyType, &(psEthHeader->wType), sizeof(WORD));
Forest Bond92b96792009-06-13 07:38:31 -04001729 } else {
Jim Lieb3e362592009-08-12 14:54:11 -07001730 memcpy((PBYTE) (pbyPayloadHead), &(psEthHeader->wType), sizeof(WORD));
Forest Bond92b96792009-06-13 07:38:31 -04001731
1732 }
1733
1734 }
1735
1736
1737 if (pPacket != NULL) {
1738 // Copy the Packet into a tx Buffer
Jim Lieb3e362592009-08-12 14:54:11 -07001739 memcpy((pbyPayloadHead + cb802_1_H_len),
Forest Bond92b96792009-06-13 07:38:31 -04001740 (pPacket + U_HEADER_LEN),
1741 uSkbPacketLen - U_HEADER_LEN
1742 );
1743
1744 } else {
1745 // while bRelayPacketSend psEthHeader is point to header+payload
Jim Lieb3e362592009-08-12 14:54:11 -07001746 memcpy((pbyPayloadHead + cb802_1_H_len), ((PBYTE)psEthHeader)+U_HEADER_LEN, uSkbPacketLen - U_HEADER_LEN);
Forest Bond92b96792009-06-13 07:38:31 -04001747 }
1748
1749 ASSERT(uLength == cbNdisBodySize);
1750
1751 if ((bNeedEncryption == TRUE) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1752
1753 ///////////////////////////////////////////////////////////////////
1754
1755 if (pDevice->sMgmtObj.eAuthenMode == WMAC_AUTH_WPANONE) {
1756 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
1757 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
1758 }
1759 else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
1760 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
1761 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
1762 }
1763 else {
1764 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[24]);
1765 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[28]);
1766 }
1767 // DO Software Michael
1768 MIC_vInit(dwMICKey0, dwMICKey1);
1769 MIC_vAppend((PBYTE)&(psEthHeader->abyDstAddr[0]), 12);
1770 dwMIC_Priority = 0;
1771 MIC_vAppend((PBYTE)&dwMIC_Priority, 4);
1772 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
1773
1774 ///////////////////////////////////////////////////////////////////
1775
1776 //DBG_PRN_GRP12(("Length:%d, %d\n", cbFrameBodySize, uFromHDtoPLDLength));
1777 //for (ii = 0; ii < cbFrameBodySize; ii++) {
1778 // DBG_PRN_GRP12(("%02x ", *((PBYTE)((pbyPayloadHead + cb802_1_H_len) + ii))));
1779 //}
1780 //DBG_PRN_GRP12(("\n\n\n"));
1781
1782 MIC_vAppend(pbyPayloadHead, cbFrameBodySize);
1783
1784 pdwMIC_L = (PDWORD)(pbyPayloadHead + cbFrameBodySize);
1785 pdwMIC_R = (PDWORD)(pbyPayloadHead + cbFrameBodySize + 4);
1786
1787 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1788 MIC_vUnInit();
1789
1790 if (pDevice->bTxMICFail == TRUE) {
1791 *pdwMIC_L = 0;
1792 *pdwMIC_R = 0;
1793 pDevice->bTxMICFail = FALSE;
1794 }
1795 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
1796 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderLength, uPadding, cbIVlen);
1797 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
1798 }
1799
1800
1801 if (bSoftWEP == TRUE) {
1802
1803 s_vSWencryption(pDevice, pTransmitKey, (pbyPayloadHead), (WORD)(cbFrameBodySize + cbMIClen));
1804
1805 } else if ( ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) && (bNeedEncryption == TRUE)) ||
1806 ((pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) && (bNeedEncryption == TRUE)) ||
1807 ((pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) && (bNeedEncryption == TRUE)) ) {
1808 cbFrameSize -= cbICVlen;
1809 }
1810
1811 if (pDevice->bSoftwareGenCrcErr == TRUE) {
1812 UINT cbLen;
1813 PDWORD pdwCRC;
1814
1815 dwCRC = 0xFFFFFFFFL;
1816 cbLen = cbFrameSize - cbFCSlen;
1817 // calculate CRC, and wrtie CRC value to end of TD
1818 dwCRC = CRCdwGetCrc32Ex(pbyMacHdr, cbLen, dwCRC);
1819 pdwCRC = (PDWORD)(pbyMacHdr + cbLen);
1820 // finally, we must invert dwCRC to get the correct answer
1821 *pdwCRC = ~dwCRC;
1822 // Force Error
1823 *pdwCRC -= 1;
1824 } else {
1825 cbFrameSize -= cbFCSlen;
1826 }
1827
1828 *pcbHeaderLen = cbHeaderLength;
1829 *pcbTotalLen = cbHeaderLength + cbFrameSize ;
1830
1831
1832 //Set FragCtl in TxBufferHead
1833 pTxBufHead->wFragCtl |= (WORD)byFragType;
1834
1835
1836 return TRUE;
1837
1838}
1839
1840
1841/*+
1842 *
1843 * Description:
1844 * Translate 802.3 to 802.11 header
1845 *
1846 * Parameters:
1847 * In:
1848 * pDevice - Pointer to adpater
1849 * dwTxBufferAddr - Transmit Buffer
1850 * pPacket - Packet from upper layer
1851 * cbPacketSize - Transmit Data Length
1852 * Out:
1853 * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
1854 * pcbAppendPayload - size of append payload for 802.1H translation
1855 *
1856 * Return Value: none
1857 *
1858-*/
1859
Andres More8611a292010-05-01 14:25:00 -03001860void
Forest Bond92b96792009-06-13 07:38:31 -04001861s_vGenerateMACHeader (
Andres More592ccfe2010-04-17 12:07:42 -03001862 PSDevice pDevice,
1863 PBYTE pbyBufferAddr,
1864 WORD wDuration,
1865 PSEthernetHeader psEthHeader,
1866 BOOL bNeedEncrypt,
1867 WORD wFragType,
1868 UINT uDMAIdx,
1869 UINT uFragIdx
Forest Bond92b96792009-06-13 07:38:31 -04001870 )
1871{
1872 PS802_11Header pMACHeader = (PS802_11Header)pbyBufferAddr;
1873
Jim Lieb3e362592009-08-12 14:54:11 -07001874 memset(pMACHeader, 0, (sizeof(S802_11Header))); //- sizeof(pMACHeader->dwIV)));
Forest Bond92b96792009-06-13 07:38:31 -04001875
1876 if (uDMAIdx == TYPE_ATIMDMA) {
1877 pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
1878 } else {
1879 pMACHeader->wFrameCtl = TYPE_802_11_DATA;
1880 }
1881
1882 if (pDevice->eOPMode == OP_MODE_AP) {
Andres More9a0e7562010-04-13 21:54:48 -03001883 memcpy(&(pMACHeader->abyAddr1[0]),
1884 &(psEthHeader->abyDstAddr[0]),
1885 ETH_ALEN);
1886 memcpy(&(pMACHeader->abyAddr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
1887 memcpy(&(pMACHeader->abyAddr3[0]),
1888 &(psEthHeader->abySrcAddr[0]),
1889 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001890 pMACHeader->wFrameCtl |= FC_FROMDS;
Andres More9a0e7562010-04-13 21:54:48 -03001891 } else {
1892 if (pDevice->eOPMode == OP_MODE_ADHOC) {
1893 memcpy(&(pMACHeader->abyAddr1[0]),
1894 &(psEthHeader->abyDstAddr[0]),
1895 ETH_ALEN);
1896 memcpy(&(pMACHeader->abyAddr2[0]),
1897 &(psEthHeader->abySrcAddr[0]),
1898 ETH_ALEN);
1899 memcpy(&(pMACHeader->abyAddr3[0]),
1900 &(pDevice->abyBSSID[0]),
1901 ETH_ALEN);
1902 } else {
1903 memcpy(&(pMACHeader->abyAddr3[0]),
1904 &(psEthHeader->abyDstAddr[0]),
1905 ETH_ALEN);
1906 memcpy(&(pMACHeader->abyAddr2[0]),
1907 &(psEthHeader->abySrcAddr[0]),
1908 ETH_ALEN);
1909 memcpy(&(pMACHeader->abyAddr1[0]),
1910 &(pDevice->abyBSSID[0]),
1911 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001912 pMACHeader->wFrameCtl |= FC_TODS;
1913 }
1914 }
1915
1916 if (bNeedEncrypt)
1917 pMACHeader->wFrameCtl |= cpu_to_le16((WORD)WLAN_SET_FC_ISWEP(1));
1918
1919 pMACHeader->wDurationID = cpu_to_le16(wDuration);
1920
1921 if (pDevice->bLongHeader) {
1922 PWLAN_80211HDR_A4 pMACA4Header = (PWLAN_80211HDR_A4) pbyBufferAddr;
1923 pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
Jim Lieb3e362592009-08-12 14:54:11 -07001924 memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
Forest Bond92b96792009-06-13 07:38:31 -04001925 }
1926 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
1927
1928 //Set FragNumber in Sequence Control
1929 pMACHeader->wSeqCtl |= cpu_to_le16((WORD)uFragIdx);
1930
1931 if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
1932 pDevice->wSeqCounter++;
1933 if (pDevice->wSeqCounter > 0x0fff)
1934 pDevice->wSeqCounter = 0;
1935 }
1936
1937 if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) { //StartFrag or MidFrag
1938 pMACHeader->wFrameCtl |= FC_MOREFRAG;
1939 }
1940}
1941
1942
1943
1944/*+
1945 *
1946 * Description:
1947 * Request instructs a MAC to transmit a 802.11 management packet through
1948 * the adapter onto the medium.
1949 *
1950 * Parameters:
1951 * In:
1952 * hDeviceContext - Pointer to the adapter
1953 * pPacket - A pointer to a descriptor for the packet to transmit
1954 * Out:
1955 * none
1956 *
1957 * Return Value: CMD_STATUS_PENDING if MAC Tx resource avaliable; otherwise FALSE
1958 *
1959-*/
1960
1961CMD_STATUS csMgmt_xmit(
Andres More592ccfe2010-04-17 12:07:42 -03001962 PSDevice pDevice,
1963 PSTxMgmtPacket pPacket
Forest Bond92b96792009-06-13 07:38:31 -04001964 )
1965{
1966 BYTE byPktType;
1967 PBYTE pbyTxBufferAddr;
Andres More8611a292010-05-01 14:25:00 -03001968 void *pvRTS;
Forest Bond92b96792009-06-13 07:38:31 -04001969 PSCTS pCTS;
Andres More8611a292010-05-01 14:25:00 -03001970 void *pvTxDataHd;
Forest Bond92b96792009-06-13 07:38:31 -04001971 UINT uDuration;
1972 UINT cbReqCount;
1973 PS802_11Header pMACHeader;
1974 UINT cbHeaderSize;
1975 UINT cbFrameBodySize;
1976 BOOL bNeedACK;
1977 BOOL bIsPSPOLL = FALSE;
1978 PSTxBufHead pTxBufHead;
1979 UINT cbFrameSize;
1980 UINT cbIVlen = 0;
1981 UINT cbICVlen = 0;
1982 UINT cbMIClen = 0;
1983 UINT cbFCSlen = 4;
1984 UINT uPadding = 0;
1985 WORD wTxBufSize;
1986 UINT cbMacHdLen;
1987 SEthernetHeader sEthHeader;
Andres More8611a292010-05-01 14:25:00 -03001988 void *pvRrvTime;
1989 void *pMICHDR;
Forest Bond92b96792009-06-13 07:38:31 -04001990 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1991 WORD wCurrentRate = RATE_1M;
1992 PTX_BUFFER pTX_Buffer;
1993 PUSB_SEND_CONTEXT pContext;
1994
1995
1996
1997 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
1998
1999 if (NULL == pContext) {
2000 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n");
2001 return CMD_STATUS_RESOURCES;
2002 }
2003
2004 pTX_Buffer = (PTX_BUFFER) (&pContext->Data[0]);
2005 pbyTxBufferAddr = (PBYTE)&(pTX_Buffer->adwTxKey[0]);
2006 cbFrameBodySize = pPacket->cbPayloadLen;
2007 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2008 wTxBufSize = sizeof(STxBufHead);
2009 memset(pTxBufHead, 0, wTxBufSize);
2010
2011 if (pDevice->byBBType == BB_TYPE_11A) {
2012 wCurrentRate = RATE_6M;
2013 byPktType = PK_TYPE_11A;
2014 } else {
2015 wCurrentRate = RATE_1M;
2016 byPktType = PK_TYPE_11B;
2017 }
2018
2019 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2020 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2021 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2022 // to set power here.
2023 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
2024 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2025 } else {
2026 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2027 }
2028 pDevice->wCurrentRate = wCurrentRate;
2029
2030
2031 //Set packet type
2032 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2033 pTxBufHead->wFIFOCtl = 0;
2034 }
2035 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2036 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2037 }
2038 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2039 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2040 }
2041 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2042 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2043 }
2044
2045 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2046 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2047
2048
2049 if (IS_MULTICAST_ADDRESS(&(pPacket->p80211Header->sA3.abyAddr1[0])) ||
2050 IS_BROADCAST_ADDRESS(&(pPacket->p80211Header->sA3.abyAddr1[0]))) {
2051 bNeedACK = FALSE;
2052 }
2053 else {
2054 bNeedACK = TRUE;
2055 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2056 };
2057
2058 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2059 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
2060
2061 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2062 //Set Preamble type always long
2063 //pDevice->byPreambleType = PREAMBLE_LONG;
2064 // probe-response don't retry
2065 //if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2066 // bNeedACK = FALSE;
2067 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2068 //}
2069 }
2070
2071 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2072
2073 if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2074 bIsPSPOLL = TRUE;
2075 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2076 } else {
2077 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2078 }
2079
2080 //Set FRAGCTL_MACHDCNT
2081 pTxBufHead->wFragCtl |= cpu_to_le16((WORD)(cbMacHdLen << 10));
2082
2083 // Notes:
2084 // Although spec says MMPDU can be fragmented; In most case,
2085 // no one will send a MMPDU under fragmentation. With RTS may occur.
2086 pDevice->bAES = FALSE; //Set FRAGCTL_WEPTYP
2087
2088 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2089 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2090 cbIVlen = 4;
2091 cbICVlen = 4;
2092 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2093 }
2094 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2095 cbIVlen = 8;//IV+ExtIV
2096 cbMIClen = 8;
2097 cbICVlen = 4;
2098 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2099 //We need to get seed here for filling TxKey entry.
2100 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2101 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2102 }
2103 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2104 cbIVlen = 8;//RSN Header
2105 cbICVlen = 8;//MIC
2106 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2107 pDevice->bAES = TRUE;
2108 }
2109 //MAC Header should be padding 0 to DW alignment.
2110 uPadding = 4 - (cbMacHdLen%4);
2111 uPadding %= 4;
2112 }
2113
2114 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
2115
2116 //Set FIFOCTL_GrpAckPolicy
2117 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
2118 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2119 }
2120 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2121
2122 //Set RrvTime/RTS/CTS Buffer
2123 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2124
2125 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2126 pMICHDR = NULL;
2127 pvRTS = NULL;
2128 pCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2129 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS));
2130 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS) + sizeof(STxDataHead_g);
2131 }
2132 else { // 802.11a/b packet
2133 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2134 pMICHDR = NULL;
2135 pvRTS = NULL;
2136 pCTS = NULL;
2137 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2138 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + sizeof(STxDataHead_ab);
2139 }
2140
Andres More8611a292010-05-01 14:25:00 -03002141 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0,
2142 (cbHeaderSize - wTxBufSize));
Forest Bond92b96792009-06-13 07:38:31 -04002143
Andres More9a0e7562010-04-13 21:54:48 -03002144 memcpy(&(sEthHeader.abyDstAddr[0]),
2145 &(pPacket->p80211Header->sA3.abyAddr1[0]),
2146 ETH_ALEN);
2147 memcpy(&(sEthHeader.abySrcAddr[0]),
2148 &(pPacket->p80211Header->sA3.abyAddr2[0]),
2149 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04002150 //=========================
2151 // No Fragmentation
2152 //=========================
2153 pTxBufHead->wFragCtl |= (WORD)FRAGCTL_NONFRAG;
2154
2155
2156 //Fill FIFO,RrvTime,RTS,and CTS
2157 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
2158 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader);
2159
2160 //Fill DataHead
2161 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2162 0, 0, 1, AUTO_FB_NONE);
2163
2164 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2165
2166 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
2167
2168 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2169 PBYTE pbyIVHead;
2170 PBYTE pbyPayloadHead;
2171 PBYTE pbyBSSID;
2172 PSKeyItem pTransmitKey = NULL;
2173
2174 pbyIVHead = (PBYTE)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
2175 pbyPayloadHead = (PBYTE)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
2176 do {
2177 if ((pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) &&
2178 (pDevice->bLinkPass == TRUE)) {
2179 pbyBSSID = pDevice->abyBSSID;
2180 // get pairwise key
2181 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) {
2182 // get group key
2183 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) {
2184 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
2185 break;
2186 }
2187 } else {
2188 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get PTK.\n");
2189 break;
2190 }
2191 }
2192 // get group key
2193 pbyBSSID = pDevice->abyBroadcastAddr;
2194 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
2195 pTransmitKey = NULL;
2196 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KEY is NULL. OP Mode[%d]\n", pDevice->eOPMode);
2197 } else {
2198 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
2199 }
2200 } while(FALSE);
2201 //Fill TXKEY
2202 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2203 (PBYTE)pMACHeader, (WORD)cbFrameBodySize, NULL);
2204
Jim Lieb3e362592009-08-12 14:54:11 -07002205 memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
2206 memcpy(pbyPayloadHead, ((PBYTE)(pPacket->p80211Header) + cbMacHdLen),
Forest Bond92b96792009-06-13 07:38:31 -04002207 cbFrameBodySize);
2208 }
2209 else {
2210 // Copy the Packet into a tx Buffer
Jim Lieb3e362592009-08-12 14:54:11 -07002211 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
Forest Bond92b96792009-06-13 07:38:31 -04002212 }
2213
2214 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2215 pDevice->wSeqCounter++ ;
2216 if (pDevice->wSeqCounter > 0x0fff)
2217 pDevice->wSeqCounter = 0;
2218
2219 if (bIsPSPOLL) {
2220 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2221 // of FIFO control header.
2222 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2223 // in the same place of other packet's Duration-field).
2224 // And it will cause Cisco-AP to issue Disassociation-packet
2225 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2226 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2227 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2228 } else {
2229 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2230 }
2231 }
2232
2233
2234 pTX_Buffer->wTxByteCount = cpu_to_le16((WORD)(cbReqCount));
2235 pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2236 pTX_Buffer->byType = 0x00;
2237
2238 pContext->pPacket = NULL;
2239 pContext->Type = CONTEXT_MGMT_PACKET;
2240 pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
2241
2242 if (WLAN_GET_FC_TODS(pMACHeader->wFrameCtl) == 0) {
2243 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr1[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2244 }
2245 else {
2246 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr3[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2247 }
2248
2249 PIPEnsSendBulkOut(pDevice,pContext);
2250 return CMD_STATUS_PENDING;
2251}
2252
2253
2254CMD_STATUS
2255csBeacon_xmit(
Andres More592ccfe2010-04-17 12:07:42 -03002256 PSDevice pDevice,
2257 PSTxMgmtPacket pPacket
Forest Bond92b96792009-06-13 07:38:31 -04002258 )
2259{
2260
2261 UINT cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
2262 UINT cbHeaderSize = 0;
2263 WORD wTxBufSize = sizeof(STxShortBufHead);
2264 PSTxShortBufHead pTxBufHead;
2265 PS802_11Header pMACHeader;
2266 PSTxDataHead_ab pTxDataHead;
2267 WORD wCurrentRate;
2268 UINT cbFrameBodySize;
2269 UINT cbReqCount;
2270 PBEACON_BUFFER pTX_Buffer;
2271 PBYTE pbyTxBufferAddr;
2272 PUSB_SEND_CONTEXT pContext;
2273 CMD_STATUS status;
2274
2275
2276 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2277 if (NULL == pContext) {
2278 status = CMD_STATUS_RESOURCES;
2279 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n");
2280 return status ;
2281 }
2282 pTX_Buffer = (PBEACON_BUFFER) (&pContext->Data[0]);
2283 pbyTxBufferAddr = (PBYTE)&(pTX_Buffer->wFIFOCtl);
2284
2285 cbFrameBodySize = pPacket->cbPayloadLen;
2286
2287 pTxBufHead = (PSTxShortBufHead) pbyTxBufferAddr;
2288 wTxBufSize = sizeof(STxShortBufHead);
2289 memset(pTxBufHead, 0, wTxBufSize);
2290
2291 if (pDevice->byBBType == BB_TYPE_11A) {
2292 wCurrentRate = RATE_6M;
2293 pTxDataHead = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize);
2294 //Get SignalField,ServiceField,Length
2295 BBvCaculateParameter(pDevice, cbFrameSize, wCurrentRate, PK_TYPE_11A,
2296 (PWORD)&(pTxDataHead->wTransmitLength), (PBYTE)&(pTxDataHead->byServiceField), (PBYTE)&(pTxDataHead->bySignalField)
2297 );
2298 //Get Duration and TimeStampOff
2299 pTxDataHead->wDuration = cpu_to_le16((WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameSize, PK_TYPE_11A,
2300 wCurrentRate, FALSE, 0, 0, 1, AUTO_FB_NONE));
2301 pTxDataHead->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
2302 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2303 } else {
2304 wCurrentRate = RATE_1M;
2305 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2306 pTxDataHead = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize);
2307 //Get SignalField,ServiceField,Length
2308 BBvCaculateParameter(pDevice, cbFrameSize, wCurrentRate, PK_TYPE_11B,
2309 (PWORD)&(pTxDataHead->wTransmitLength), (PBYTE)&(pTxDataHead->byServiceField), (PBYTE)&(pTxDataHead->bySignalField)
2310 );
2311 //Get Duration and TimeStampOff
2312 pTxDataHead->wDuration = cpu_to_le16((WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameSize, PK_TYPE_11B,
2313 wCurrentRate, FALSE, 0, 0, 1, AUTO_FB_NONE));
2314 pTxDataHead->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
2315 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2316 }
2317
2318 //Generate Beacon Header
2319 pMACHeader = (PS802_11Header)(pbyTxBufferAddr + cbHeaderSize);
Jim Lieb3e362592009-08-12 14:54:11 -07002320 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
Forest Bond92b96792009-06-13 07:38:31 -04002321
2322 pMACHeader->wDurationID = 0;
2323 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2324 pDevice->wSeqCounter++ ;
2325 if (pDevice->wSeqCounter > 0x0fff)
2326 pDevice->wSeqCounter = 0;
2327
2328 cbReqCount = cbHeaderSize + WLAN_HDR_ADDR3_LEN + cbFrameBodySize;
2329
2330 pTX_Buffer->wTxByteCount = (WORD)cbReqCount;
2331 pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2332 pTX_Buffer->byType = 0x01;
2333
2334 pContext->pPacket = NULL;
2335 pContext->Type = CONTEXT_MGMT_PACKET;
2336 pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
2337
2338 PIPEnsSendBulkOut(pDevice,pContext);
2339 return CMD_STATUS_PENDING;
2340
2341}
2342
2343
2344
2345
2346
Andres More8611a292010-05-01 14:25:00 -03002347void
Forest Bond92b96792009-06-13 07:38:31 -04002348vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb) {
2349
2350 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
2351 BYTE byPktType;
2352 PBYTE pbyTxBufferAddr;
Andres More8611a292010-05-01 14:25:00 -03002353 void *pvRTS;
2354 void *pvCTS;
2355 void *pvTxDataHd;
Forest Bond92b96792009-06-13 07:38:31 -04002356 UINT uDuration;
2357 UINT cbReqCount;
2358 PS802_11Header pMACHeader;
2359 UINT cbHeaderSize;
2360 UINT cbFrameBodySize;
2361 BOOL bNeedACK;
2362 BOOL bIsPSPOLL = FALSE;
2363 PSTxBufHead pTxBufHead;
2364 UINT cbFrameSize;
2365 UINT cbIVlen = 0;
2366 UINT cbICVlen = 0;
2367 UINT cbMIClen = 0;
2368 UINT cbFCSlen = 4;
2369 UINT uPadding = 0;
2370 UINT cbMICHDR = 0;
2371 UINT uLength = 0;
2372 DWORD dwMICKey0, dwMICKey1;
2373 DWORD dwMIC_Priority;
2374 PDWORD pdwMIC_L;
2375 PDWORD pdwMIC_R;
2376 WORD wTxBufSize;
2377 UINT cbMacHdLen;
2378 SEthernetHeader sEthHeader;
Andres More8611a292010-05-01 14:25:00 -03002379 void *pvRrvTime;
2380 void *pMICHDR;
Forest Bond92b96792009-06-13 07:38:31 -04002381 WORD wCurrentRate = RATE_1M;
2382 PUWLAN_80211HDR p80211Header;
2383 UINT uNodeIndex = 0;
2384 BOOL bNodeExist = FALSE;
2385 SKeyItem STempKey;
2386 PSKeyItem pTransmitKey = NULL;
2387 PBYTE pbyIVHead;
2388 PBYTE pbyPayloadHead;
2389 PBYTE pbyMacHdr;
2390 UINT cbExtSuppRate = 0;
2391 PTX_BUFFER pTX_Buffer;
2392 PUSB_SEND_CONTEXT pContext;
2393// PWLAN_IE pItem;
2394
2395
2396 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
2397
2398 if(skb->len <= WLAN_HDR_ADDR3_LEN) {
2399 cbFrameBodySize = 0;
2400 }
2401 else {
2402 cbFrameBodySize = skb->len - WLAN_HDR_ADDR3_LEN;
2403 }
2404 p80211Header = (PUWLAN_80211HDR)skb->data;
2405
2406 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2407
2408 if (NULL == pContext) {
2409 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0 TX...NO CONTEXT!\n");
2410 dev_kfree_skb_irq(skb);
2411 return ;
2412 }
2413
2414 pTX_Buffer = (PTX_BUFFER)(&pContext->Data[0]);
2415 pbyTxBufferAddr = (PBYTE)(&pTX_Buffer->adwTxKey[0]);
2416 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2417 wTxBufSize = sizeof(STxBufHead);
2418 memset(pTxBufHead, 0, wTxBufSize);
2419
2420 if (pDevice->byBBType == BB_TYPE_11A) {
2421 wCurrentRate = RATE_6M;
2422 byPktType = PK_TYPE_11A;
2423 } else {
2424 wCurrentRate = RATE_1M;
2425 byPktType = PK_TYPE_11B;
2426 }
2427
2428 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2429 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2430 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2431 // to set power here.
2432 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
2433 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2434 } else {
2435 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2436 }
2437
2438 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x \n", p80211Header->sA3.wFrameCtl);
2439
2440 //Set packet type
2441 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2442 pTxBufHead->wFIFOCtl = 0;
2443 }
2444 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2445 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2446 }
2447 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2448 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2449 }
2450 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2451 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2452 }
2453
2454 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2455 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2456
2457
2458 if (IS_MULTICAST_ADDRESS(&(p80211Header->sA3.abyAddr1[0])) ||
2459 IS_BROADCAST_ADDRESS(&(p80211Header->sA3.abyAddr1[0]))) {
2460 bNeedACK = FALSE;
2461 if (pDevice->bEnableHostWEP) {
2462 uNodeIndex = 0;
2463 bNodeExist = TRUE;
2464 };
2465 }
2466 else {
2467 if (pDevice->bEnableHostWEP) {
2468 if (BSSbIsSTAInNodeDB(pDevice, (PBYTE)(p80211Header->sA3.abyAddr1), &uNodeIndex))
2469 bNodeExist = TRUE;
2470 };
2471 bNeedACK = TRUE;
2472 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2473 };
2474
2475 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2476 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
2477
2478 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2479 //Set Preamble type always long
2480 //pDevice->byPreambleType = PREAMBLE_LONG;
2481
2482 // probe-response don't retry
2483 //if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2484 // bNeedACK = FALSE;
2485 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2486 //}
2487 }
2488
2489 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2490
2491 if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2492 bIsPSPOLL = TRUE;
2493 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2494 } else {
2495 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2496 }
2497
2498 // hostapd deamon ext support rate patch
2499 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2500
2501 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0) {
2502 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
2503 }
2504
2505 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0) {
2506 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
2507 }
2508
2509 if (cbExtSuppRate >0) {
2510 cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
2511 }
2512 }
2513
2514
2515 //Set FRAGCTL_MACHDCNT
2516 pTxBufHead->wFragCtl |= cpu_to_le16((WORD)cbMacHdLen << 10);
2517
2518 // Notes:
2519 // Although spec says MMPDU can be fragmented; In most case,
2520 // no one will send a MMPDU under fragmentation. With RTS may occur.
2521 pDevice->bAES = FALSE; //Set FRAGCTL_WEPTYP
2522
2523
2524 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2525 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2526 cbIVlen = 4;
2527 cbICVlen = 4;
2528 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2529 }
2530 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2531 cbIVlen = 8;//IV+ExtIV
2532 cbMIClen = 8;
2533 cbICVlen = 4;
2534 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2535 //We need to get seed here for filling TxKey entry.
2536 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2537 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2538 }
2539 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2540 cbIVlen = 8;//RSN Header
2541 cbICVlen = 8;//MIC
2542 cbMICHDR = sizeof(SMICHDRHead);
2543 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2544 pDevice->bAES = TRUE;
2545 }
2546 //MAC Header should be padding 0 to DW alignment.
2547 uPadding = 4 - (cbMacHdLen%4);
2548 uPadding %= 4;
2549 }
2550
2551 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
2552
2553 //Set FIFOCTL_GrpAckPolicy
2554 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
2555 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2556 }
2557 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2558
2559
2560 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2561
2562 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2563 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2564 pvRTS = NULL;
2565 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
2566 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
2567 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
2568
2569 }
2570 else {//802.11a/b packet
2571
2572 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2573 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2574 pvRTS = NULL;
2575 pvCTS = NULL;
2576 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
2577 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
2578 }
Andres More8611a292010-05-01 14:25:00 -03002579 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0,
2580 (cbHeaderSize - wTxBufSize));
Andres More9a0e7562010-04-13 21:54:48 -03002581 memcpy(&(sEthHeader.abyDstAddr[0]),
2582 &(p80211Header->sA3.abyAddr1[0]),
2583 ETH_ALEN);
2584 memcpy(&(sEthHeader.abySrcAddr[0]),
2585 &(p80211Header->sA3.abyAddr2[0]),
2586 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04002587 //=========================
2588 // No Fragmentation
2589 //=========================
2590 pTxBufHead->wFragCtl |= (WORD)FRAGCTL_NONFRAG;
2591
2592
2593 //Fill FIFO,RrvTime,RTS,and CTS
2594 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
2595 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader);
2596
2597 //Fill DataHead
2598 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2599 0, 0, 1, AUTO_FB_NONE);
2600
2601 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2602
2603 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
2604
2605 pbyMacHdr = (PBYTE)(pbyTxBufferAddr + cbHeaderSize);
2606 pbyPayloadHead = (PBYTE)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
2607 pbyIVHead = (PBYTE)(pbyMacHdr + cbMacHdLen + uPadding);
2608
2609 // Copy the Packet into a tx Buffer
2610 memcpy(pbyMacHdr, skb->data, cbMacHdLen);
2611
2612 // version set to 0, patch for hostapd deamon
2613 pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
2614 memcpy(pbyPayloadHead, (skb->data + cbMacHdLen), cbFrameBodySize);
2615
2616 // replace support rate, patch for hostapd deamon( only support 11M)
2617 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2618 if (cbExtSuppRate != 0) {
2619 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
2620 memcpy((pbyPayloadHead + cbFrameBodySize),
2621 pMgmt->abyCurrSuppRates,
2622 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
2623 );
2624 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
2625 memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
2626 pMgmt->abyCurrExtSuppRates,
2627 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
2628 );
2629 }
2630 }
2631
2632 // Set wep
2633 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2634
2635 if (pDevice->bEnableHostWEP) {
2636 pTransmitKey = &STempKey;
2637 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2638 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2639 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2640 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2641 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2642 memcpy(pTransmitKey->abyKey,
2643 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2644 pTransmitKey->uKeyLength
2645 );
2646 }
2647
2648 if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
2649
2650 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
2651 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
2652
2653 // DO Software Michael
2654 MIC_vInit(dwMICKey0, dwMICKey1);
2655 MIC_vAppend((PBYTE)&(sEthHeader.abyDstAddr[0]), 12);
2656 dwMIC_Priority = 0;
2657 MIC_vAppend((PBYTE)&dwMIC_Priority, 4);
2658 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0_tx_8021:MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
2659
2660 uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
2661
2662 MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
2663
2664 pdwMIC_L = (PDWORD)(pbyTxBufferAddr + uLength + cbFrameBodySize);
2665 pdwMIC_R = (PDWORD)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
2666
2667 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
2668 MIC_vUnInit();
2669
2670 if (pDevice->bTxMICFail == TRUE) {
2671 *pdwMIC_L = 0;
2672 *pdwMIC_R = 0;
2673 pDevice->bTxMICFail = FALSE;
2674 }
2675
2676 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
2677 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderSize, uPadding, cbIVlen);
2678 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lx, %lx\n", *pdwMIC_L, *pdwMIC_R);
2679
2680 }
2681
2682 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2683 pbyMacHdr, (WORD)cbFrameBodySize, (PBYTE)pMICHDR);
2684
2685 if (pDevice->bEnableHostWEP) {
2686 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
2687 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
2688 }
2689
2690 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
2691 s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (WORD)(cbFrameBodySize + cbMIClen));
2692 }
2693 }
2694
2695 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2696 pDevice->wSeqCounter++ ;
2697 if (pDevice->wSeqCounter > 0x0fff)
2698 pDevice->wSeqCounter = 0;
2699
2700
2701 if (bIsPSPOLL) {
2702 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2703 // of FIFO control header.
2704 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2705 // in the same place of other packet's Duration-field).
2706 // And it will cause Cisco-AP to issue Disassociation-packet
2707 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2708 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
2709 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
2710 } else {
2711 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(p80211Header->sA2.wDurationID);
2712 }
2713 }
2714
2715 pTX_Buffer->wTxByteCount = cpu_to_le16((WORD)(cbReqCount));
2716 pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2717 pTX_Buffer->byType = 0x00;
2718
2719 pContext->pPacket = skb;
2720 pContext->Type = CONTEXT_MGMT_PACKET;
2721 pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
2722
2723 if (WLAN_GET_FC_TODS(pMACHeader->wFrameCtl) == 0) {
2724 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr1[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2725 }
2726 else {
2727 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr3[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2728 }
2729 PIPEnsSendBulkOut(pDevice,pContext);
2730 return ;
2731
2732}
2733
2734
2735
2736
2737//TYPE_AC0DMA data tx
2738/*
2739 * Description:
2740 * Tx packet via AC0DMA(DMA1)
2741 *
2742 * Parameters:
2743 * In:
2744 * pDevice - Pointer to the adapter
2745 * skb - Pointer to tx skb packet
2746 * Out:
2747 * void
2748 *
2749 * Return Value: NULL
2750 */
2751
2752
2753
2754NTSTATUS
2755nsDMA_tx_packet(
Andres More592ccfe2010-04-17 12:07:42 -03002756 PSDevice pDevice,
2757 UINT uDMAIdx,
2758 struct sk_buff *skb
Forest Bond92b96792009-06-13 07:38:31 -04002759 )
2760{
2761 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
2762 UINT BytesToWrite =0,uHeaderLen = 0;
2763 UINT uNodeIndex = 0;
2764 BYTE byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
2765 WORD wAID;
2766 BYTE byPktType;
2767 BOOL bNeedEncryption = FALSE;
2768 PSKeyItem pTransmitKey = NULL;
2769 SKeyItem STempKey;
2770 UINT ii;
2771 BOOL bTKIP_UseGTK = FALSE;
2772 BOOL bNeedDeAuth = FALSE;
2773 PBYTE pbyBSSID;
2774 BOOL bNodeExist = FALSE;
2775 PUSB_SEND_CONTEXT pContext;
2776 BOOL fConvertedPacket;
2777 PTX_BUFFER pTX_Buffer;
2778 UINT status;
2779 WORD wKeepRate = pDevice->wCurrentRate;
2780 struct net_device_stats* pStats = &pDevice->stats;
2781//#ifdef WPA_SM_Transtatus
2782 // extern SWPAResult wpa_Result;
2783//#endif
2784 BOOL bTxeapol_key = FALSE;
2785
2786
2787 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2788
2789 if (pDevice->uAssocCount == 0) {
2790 dev_kfree_skb_irq(skb);
2791 return 0;
2792 }
2793
2794 if (IS_MULTICAST_ADDRESS((PBYTE)(skb->data))) {
2795 uNodeIndex = 0;
2796 bNodeExist = TRUE;
2797 if (pMgmt->sNodeDBTable[0].bPSEnable) {
2798
2799 skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skb);
2800 pMgmt->sNodeDBTable[0].wEnQueueCnt++;
2801 // set tx map
2802 pMgmt->abyPSTxMap[0] |= byMask[0];
2803 return 0;
2804 }
2805 // muticast/broadcast data rate
2806
2807 if (pDevice->byBBType != BB_TYPE_11A)
2808 pDevice->wCurrentRate = RATE_2M;
2809 else
2810 pDevice->wCurrentRate = RATE_24M;
2811 // long preamble type
2812 pDevice->byPreambleType = PREAMBLE_SHORT;
2813
2814 }else {
2815
2816 if (BSSbIsSTAInNodeDB(pDevice, (PBYTE)(skb->data), &uNodeIndex)) {
2817
2818 if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
2819
2820 skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
2821
2822 pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
2823 // set tx map
2824 wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
2825 pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
2826 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set:pMgmt->abyPSTxMap[%d]= %d\n",
2827 (wAID >> 3), pMgmt->abyPSTxMap[wAID >> 3]);
2828
2829 return 0;
2830 }
2831 // AP rate decided from node
2832 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2833 // tx preamble decided from node
2834
2835 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2836 pDevice->byPreambleType = pDevice->byShortPreamble;
2837
2838 }else {
2839 pDevice->byPreambleType = PREAMBLE_LONG;
2840 }
2841 bNodeExist = TRUE;
2842 }
2843 }
2844
2845 if (bNodeExist == FALSE) {
2846 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Unknown STA not found in node DB \n");
2847 dev_kfree_skb_irq(skb);
2848 return 0;
2849 }
2850 }
2851
2852 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2853
2854 if (pContext == NULL) {
2855 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG" pContext == NULL\n");
2856 dev_kfree_skb_irq(skb);
2857 return STATUS_RESOURCES;
2858 }
2859
2860 memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)(skb->data), U_HEADER_LEN);
2861
2862//mike add:station mode check eapol-key challenge--->
2863{
2864 BYTE Protocol_Version; //802.1x Authentication
2865 BYTE Packet_Type; //802.1x Authentication
2866 BYTE Descriptor_type;
2867 WORD Key_info;
2868
2869 Protocol_Version = skb->data[U_HEADER_LEN];
2870 Packet_Type = skb->data[U_HEADER_LEN+1];
2871 Descriptor_type = skb->data[U_HEADER_LEN+1+1+2];
2872 Key_info = (skb->data[U_HEADER_LEN+1+1+2+1] << 8)|(skb->data[U_HEADER_LEN+1+1+2+2]);
2873 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
2874 if(((Protocol_Version==1) ||(Protocol_Version==2)) &&
2875 (Packet_Type==3)) { //802.1x OR eapol-key challenge frame transfer
2876 bTxeapol_key = TRUE;
2877 if(!(Key_info & BIT3) && //WPA or RSN group-key challenge
2878 (Key_info & BIT8) && (Key_info & BIT9)) { //send 2/2 key
2879 if(Descriptor_type==254) {
2880 pDevice->fWPA_Authened = TRUE;
2881 PRINT_K("WPA ");
2882 }
2883 else {
2884 pDevice->fWPA_Authened = TRUE;
2885 PRINT_K("WPA2(re-keying) ");
2886 }
2887 PRINT_K("Authentication completed!!\n");
2888 }
2889 else if((Key_info & BIT3) && (Descriptor_type==2) && //RSN pairse-key challenge
2890 (Key_info & BIT8) && (Key_info & BIT9)) {
2891 pDevice->fWPA_Authened = TRUE;
2892 PRINT_K("WPA2 Authentication completed!!\n");
2893 }
2894 }
2895 }
2896}
2897//mike add:station mode check eapol-key challenge<---
2898
2899 if (pDevice->bEncryptionEnable == TRUE) {
2900 bNeedEncryption = TRUE;
2901 // get Transmit key
2902 do {
2903 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
2904 (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2905 pbyBSSID = pDevice->abyBSSID;
2906 // get pairwise key
2907 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) {
2908 // get group key
2909 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) {
2910 bTKIP_UseGTK = TRUE;
2911 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2912 break;
2913 }
2914 } else {
2915 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get PTK.\n");
2916 break;
2917 }
2918 }else if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2919
2920 pbyBSSID = pDevice->sTxEthHeader.abyDstAddr; //TO_DS = 0 and FROM_DS = 0 --> 802.11 MAC Address1
2921 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS Serach Key: \n");
2922 for (ii = 0; ii< 6; ii++)
2923 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"%x \n", *(pbyBSSID+ii));
2924 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"\n");
2925
2926 // get pairwise key
2927 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == TRUE)
2928 break;
2929 }
2930 // get group key
2931 pbyBSSID = pDevice->abyBroadcastAddr;
2932 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
2933 pTransmitKey = NULL;
2934 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2935 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode);
2936 }
2937 else
2938 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"NOT IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode);
2939 } else {
2940 bTKIP_UseGTK = TRUE;
2941 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2942 }
2943 } while(FALSE);
2944 }
2945
2946 if (pDevice->bEnableHostWEP) {
2947 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"acdma0: STA index %d\n", uNodeIndex);
2948 if (pDevice->bEncryptionEnable == TRUE) {
2949 pTransmitKey = &STempKey;
2950 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2951 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2952 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2953 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2954 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2955 memcpy(pTransmitKey->abyKey,
2956 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2957 pTransmitKey->uKeyLength
2958 );
2959 }
2960 }
2961
2962 byPktType = (BYTE)pDevice->byPacketType;
2963
2964 if (pDevice->bFixRate) {
2965 if (pDevice->byBBType == BB_TYPE_11B) {
2966 if (pDevice->uConnectionRate >= RATE_11M) {
2967 pDevice->wCurrentRate = RATE_11M;
2968 } else {
2969 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
2970 }
2971 } else {
2972 if ((pDevice->byBBType == BB_TYPE_11A) &&
2973 (pDevice->uConnectionRate <= RATE_6M)) {
2974 pDevice->wCurrentRate = RATE_6M;
2975 } else {
2976 if (pDevice->uConnectionRate >= RATE_54M)
2977 pDevice->wCurrentRate = RATE_54M;
2978 else
2979 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
2980 }
2981 }
2982 }
2983 else {
2984 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2985 // Adhoc Tx rate decided from node DB
2986 if (IS_MULTICAST_ADDRESS(&(pDevice->sTxEthHeader.abyDstAddr[0]))) {
2987 // Multicast use highest data rate
2988 pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate;
2989 // preamble type
2990 pDevice->byPreambleType = pDevice->byShortPreamble;
2991 }
2992 else {
2993 if(BSSbIsSTAInNodeDB(pDevice, &(pDevice->sTxEthHeader.abyDstAddr[0]), &uNodeIndex)) {
2994 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2995 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2996 pDevice->byPreambleType = pDevice->byShortPreamble;
2997
2998 }
2999 else {
3000 pDevice->byPreambleType = PREAMBLE_LONG;
3001 }
3002 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Found Node Index is [%d] Tx Data Rate:[%d]\n",uNodeIndex, pDevice->wCurrentRate);
3003 }
3004 else {
3005 if (pDevice->byBBType != BB_TYPE_11A)
3006 pDevice->wCurrentRate = RATE_2M;
3007 else
3008 pDevice->wCurrentRate = RATE_24M; // refer to vMgrCreateOwnIBSS()'s
3009 // abyCurrExtSuppRates[]
3010 pDevice->byPreambleType = PREAMBLE_SHORT;
3011 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Not Found Node use highest basic Rate.....\n");
3012 }
3013 }
3014 }
3015 if (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) {
3016 // Infra STA rate decided from AP Node, index = 0
3017 pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate;
3018 }
3019 }
3020
3021 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
3022 if (pDevice->byBBType != BB_TYPE_11A) {
3023 pDevice->wCurrentRate = RATE_1M;
3024 pDevice->byACKRate = RATE_1M;
3025 pDevice->byTopCCKBasicRate = RATE_1M;
3026 pDevice->byTopOFDMBasicRate = RATE_6M;
3027 } else {
3028 pDevice->wCurrentRate = RATE_6M;
3029 pDevice->byACKRate = RATE_6M;
3030 pDevice->byTopCCKBasicRate = RATE_1M;
3031 pDevice->byTopOFDMBasicRate = RATE_6M;
3032 }
3033 }
3034
Andres More0cbd8d92010-05-06 20:34:29 -03003035 DBG_PRT(MSG_LEVEL_DEBUG,
3036 KERN_INFO "dma_tx: pDevice->wCurrentRate = %d\n",
3037 pDevice->wCurrentRate);
Forest Bond92b96792009-06-13 07:38:31 -04003038
3039 if (wKeepRate != pDevice->wCurrentRate) {
Andres More0cbd8d92010-05-06 20:34:29 -03003040 bScheduleCommand((void *) pDevice, WLAN_CMD_SETPOWER, NULL);
Forest Bond92b96792009-06-13 07:38:31 -04003041 }
3042
3043 if (pDevice->wCurrentRate <= RATE_11M) {
3044 byPktType = PK_TYPE_11B;
3045 }
3046
3047 if (bNeedEncryption == TRUE) {
3048 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType));
3049 if ((pDevice->sTxEthHeader.wType) == TYPE_PKT_802_1x) {
3050 bNeedEncryption = FALSE;
3051 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType));
3052 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
3053 if (pTransmitKey == NULL) {
3054 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Don't Find TX KEY\n");
3055 }
3056 else {
3057 if (bTKIP_UseGTK == TRUE) {
3058 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n");
3059 }
3060 else {
3061 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
3062 bNeedEncryption = TRUE;
3063 }
3064 }
3065 }
3066
3067 if (pDevice->byCntMeasure == 2) {
3068 bNeedDeAuth = TRUE;
3069 pDevice->s802_11Counter.TKIPCounterMeasuresInvoked++;
3070 }
3071
3072 if (pDevice->bEnableHostWEP) {
3073 if ((uNodeIndex != 0) &&
3074 (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) {
3075 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
3076 bNeedEncryption = TRUE;
3077 }
3078 }
3079 }
3080 else {
3081
3082#if 0
3083 if((pDevice->fWPA_Authened == FALSE) &&
3084 ((pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK)||(pMgmt->eAuthenMode = WMAC_AUTH_WPA2PSK))){
3085 dev_kfree_skb_irq(skb);
3086 pStats->tx_dropped++;
3087 return STATUS_FAILURE;
3088 }
3089 else if (pTransmitKey == NULL) {
3090 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n");
3091 dev_kfree_skb_irq(skb);
3092 pStats->tx_dropped++;
3093 return STATUS_FAILURE;
3094 }
3095#else
3096 if (pTransmitKey == NULL) {
3097 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n");
3098 dev_kfree_skb_irq(skb);
3099 pStats->tx_dropped++;
3100 return STATUS_FAILURE;
3101 }
3102#endif
3103
3104 }
3105 }
3106
3107 fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType,
3108 (PBYTE)(&pContext->Data[0]), bNeedEncryption,
3109 skb->len, uDMAIdx, &pDevice->sTxEthHeader,
3110 (PBYTE)skb->data, pTransmitKey, uNodeIndex,
3111 pDevice->wCurrentRate,
3112 &uHeaderLen, &BytesToWrite
3113 );
3114
3115 if (fConvertedPacket == FALSE) {
3116 pContext->bBoolInUse = FALSE;
3117 dev_kfree_skb_irq(skb);
3118 return STATUS_FAILURE;
3119 }
3120
3121 if ( pDevice->bEnablePSMode == TRUE ) {
3122 if ( !pDevice->bPSModeTxBurst ) {
Andres More0cbd8d92010-05-06 20:34:29 -03003123 bScheduleCommand((void *) pDevice,
3124 WLAN_CMD_MAC_DISPOWERSAVING,
3125 NULL);
Forest Bond92b96792009-06-13 07:38:31 -04003126 pDevice->bPSModeTxBurst = TRUE;
3127 }
3128 }
3129
3130 pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]);
3131 pTX_Buffer->byPKTNO = (BYTE) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
3132 pTX_Buffer->wTxByteCount = (WORD)BytesToWrite;
3133
3134 pContext->pPacket = skb;
3135 pContext->Type = CONTEXT_DATA_PACKET;
3136 pContext->uBufLen = (WORD)BytesToWrite + 4 ; //USB header
3137
3138 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.abyDstAddr[0]),(WORD) (BytesToWrite-uHeaderLen),pTX_Buffer->wFIFOCtl);
3139
3140 status = PIPEnsSendBulkOut(pDevice,pContext);
3141
3142 if (bNeedDeAuth == TRUE) {
3143 WORD wReason = WLAN_MGMT_REASON_MIC_FAILURE;
3144
Andres More0cbd8d92010-05-06 20:34:29 -03003145 bScheduleCommand((void *) pDevice, WLAN_CMD_DEAUTH, (PBYTE) &wReason);
Forest Bond92b96792009-06-13 07:38:31 -04003146 }
3147
3148 if(status!=STATUS_PENDING) {
3149 pContext->bBoolInUse = FALSE;
3150 dev_kfree_skb_irq(skb);
3151 return STATUS_FAILURE;
3152 }
3153 else
3154 return 0;
3155
3156}
3157
3158
3159
3160/*
3161 * Description:
3162 * Relay packet send (AC1DMA) from rx dpc.
3163 *
3164 * Parameters:
3165 * In:
3166 * pDevice - Pointer to the adapter
3167 * pPacket - Pointer to rx packet
3168 * cbPacketSize - rx ethernet frame size
3169 * Out:
3170 * TURE, FALSE
3171 *
3172 * Return Value: Return TRUE if packet is copy to dma1; otherwise FALSE
3173 */
3174
3175
3176BOOL
3177bRelayPacketSend (
Andres More592ccfe2010-04-17 12:07:42 -03003178 PSDevice pDevice,
3179 PBYTE pbySkbData,
3180 UINT uDataLen,
3181 UINT uNodeIndex
Forest Bond92b96792009-06-13 07:38:31 -04003182 )
3183{
3184 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
3185 UINT BytesToWrite =0,uHeaderLen = 0;
3186 BYTE byPktType = PK_TYPE_11B;
3187 BOOL bNeedEncryption = FALSE;
3188 SKeyItem STempKey;
3189 PSKeyItem pTransmitKey = NULL;
3190 PBYTE pbyBSSID;
3191 PUSB_SEND_CONTEXT pContext;
3192 BYTE byPktTyp;
3193 BOOL fConvertedPacket;
3194 PTX_BUFFER pTX_Buffer;
3195 UINT status;
3196 WORD wKeepRate = pDevice->wCurrentRate;
3197
3198
3199
3200 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
3201
3202 if (NULL == pContext) {
3203 return FALSE;
3204 }
3205
3206 memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)pbySkbData, U_HEADER_LEN);
3207
3208 if (pDevice->bEncryptionEnable == TRUE) {
3209 bNeedEncryption = TRUE;
3210 // get group key
3211 pbyBSSID = pDevice->abyBroadcastAddr;
3212 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
3213 pTransmitKey = NULL;
3214 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"KEY is NULL. [%d]\n", pMgmt->eCurrMode);
3215 } else {
3216 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
3217 }
3218 }
3219
3220 if (pDevice->bEnableHostWEP) {
Roel Kluinee93e192009-10-16 20:17:57 +02003221 if (uNodeIndex < MAX_NODE_NUM + 1) {
Forest Bond92b96792009-06-13 07:38:31 -04003222 pTransmitKey = &STempKey;
3223 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
3224 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
3225 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
3226 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
3227 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
3228 memcpy(pTransmitKey->abyKey,
3229 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
3230 pTransmitKey->uKeyLength
3231 );
3232 }
3233 }
3234
3235 if ( bNeedEncryption && (pTransmitKey == NULL) ) {
3236 pContext->bBoolInUse = FALSE;
3237 return FALSE;
3238 }
3239
3240 byPktTyp = (BYTE)pDevice->byPacketType;
3241
3242 if (pDevice->bFixRate) {
3243 if (pDevice->byBBType == BB_TYPE_11B) {
3244 if (pDevice->uConnectionRate >= RATE_11M) {
3245 pDevice->wCurrentRate = RATE_11M;
3246 } else {
3247 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
3248 }
3249 } else {
3250 if ((pDevice->byBBType == BB_TYPE_11A) &&
3251 (pDevice->uConnectionRate <= RATE_6M)) {
3252 pDevice->wCurrentRate = RATE_6M;
3253 } else {
3254 if (pDevice->uConnectionRate >= RATE_54M)
3255 pDevice->wCurrentRate = RATE_54M;
3256 else
3257 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
3258 }
3259 }
3260 }
3261 else {
3262 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
3263 }
3264
Forest Bond92b96792009-06-13 07:38:31 -04003265 if (wKeepRate != pDevice->wCurrentRate) {
Andres More0cbd8d92010-05-06 20:34:29 -03003266 bScheduleCommand((void *) pDevice, WLAN_CMD_SETPOWER, NULL);
Forest Bond92b96792009-06-13 07:38:31 -04003267 }
3268
3269 if (pDevice->wCurrentRate <= RATE_11M)
3270 byPktType = PK_TYPE_11B;
3271
3272 BytesToWrite = uDataLen + U_CRC_LEN;
3273 // Convert the packet to an usb frame and copy into our buffer
3274 // and send the irp.
3275
3276 fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType,
3277 (PBYTE)(&pContext->Data[0]), bNeedEncryption,
3278 uDataLen, TYPE_AC0DMA, &pDevice->sTxEthHeader,
3279 pbySkbData, pTransmitKey, uNodeIndex,
3280 pDevice->wCurrentRate,
3281 &uHeaderLen, &BytesToWrite
3282 );
3283
3284 if (fConvertedPacket == FALSE) {
3285 pContext->bBoolInUse = FALSE;
3286 return FALSE;
3287 }
3288
3289 pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]);
3290 pTX_Buffer->byPKTNO = (BYTE) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
3291 pTX_Buffer->wTxByteCount = (WORD)BytesToWrite;
3292
3293 pContext->pPacket = NULL;
3294 pContext->Type = CONTEXT_DATA_PACKET;
3295 pContext->uBufLen = (WORD)BytesToWrite + 4 ; //USB header
3296
3297 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.abyDstAddr[0]),(WORD) (BytesToWrite-uHeaderLen),pTX_Buffer->wFIFOCtl);
3298
3299 status = PIPEnsSendBulkOut(pDevice,pContext);
3300
3301 return TRUE;
3302}
3303