blob: 24437a081b7f810fcc316b5cb403d9c56093a201 [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:
Gilles Espinassef77f13e2010-03-29 15:41:47 +020028 * s_vGenerateTxParameter - Generate tx dma required parameter.
Forest Bond92b96792009-06-13 07:38:31 -040029 * 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
Gilles Espinassef77f13e2010-03-29 15:41:47 +020034 * s_uGetRTSCTSDuration- get rtx/cts required duration
Forest Bond92b96792009-06-13 07:38:31 -040035 * s_uGetRTSCTSRsvTime- get rts/cts reserved time
36 * s_uGetTxRsvTime- get frame reserved time
37 * s_vFillCTSHead- fulfill CTS ctl header
Gilles Espinassef77f13e2010-03-29 15:41:47 +020038 * s_vFillFragParameter- Set fragment ctl parameter.
Forest Bond92b96792009-06-13 07:38:31 -040039 * 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 Morecc856e62010-05-17 21:34:01 -0300142 unsigned int cbFrameSize,
Andres More592ccfe2010-04-17 12:07:42 -0300143 BOOL bNeedACK,
Andres Morecc856e62010-05-17 21:34:01 -0300144 unsigned int uDMAIdx,
Andres More592ccfe2010-04-17 12:07:42 -0300145 PSEthernetHeader psEthHeader
Forest Bond92b96792009-06-13 07:38:31 -0400146 );
147
148
Andres Morecc856e62010-05-17 21:34:01 -0300149static unsigned int s_uFillDataHead(
Andres More592ccfe2010-04-17 12:07:42 -0300150 PSDevice pDevice,
151 BYTE byPktType,
152 WORD wCurrentRate,
Andres More8611a292010-05-01 14:25:00 -0300153 void *pTxDataHead,
Andres Morecc856e62010-05-17 21:34:01 -0300154 unsigned int cbFrameLength,
155 unsigned int uDMAIdx,
Andres More592ccfe2010-04-17 12:07:42 -0300156 BOOL bNeedAck,
Andres Morecc856e62010-05-17 21:34:01 -0300157 unsigned int uFragIdx,
158 unsigned int cbLastFragmentSize,
159 unsigned int uMACfragNum,
Andres More592ccfe2010-04-17 12:07:42 -0300160 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400161 );
162
163
164
165
166static
Andres More8611a292010-05-01 14:25:00 -0300167void
Forest Bond92b96792009-06-13 07:38:31 -0400168s_vGenerateMACHeader (
Andres More592ccfe2010-04-17 12:07:42 -0300169 PSDevice pDevice,
170 PBYTE pbyBufferAddr,
171 WORD wDuration,
172 PSEthernetHeader psEthHeader,
173 BOOL bNeedEncrypt,
174 WORD wFragType,
Andres Morecc856e62010-05-17 21:34:01 -0300175 unsigned int uDMAIdx,
176 unsigned int uFragIdx
Forest Bond92b96792009-06-13 07:38:31 -0400177 );
178
179static
Andres More8611a292010-05-01 14:25:00 -0300180void
Forest Bond92b96792009-06-13 07:38:31 -0400181s_vFillTxKey(
Andres More592ccfe2010-04-17 12:07:42 -0300182 PSDevice pDevice,
183 PBYTE pbyBuf,
184 PBYTE pbyIVHead,
185 PSKeyItem pTransmitKey,
186 PBYTE pbyHdrBuf,
187 WORD wPayloadLen,
Andres More6f8c13c2010-05-04 20:40:10 -0300188 PBYTE pMICHDR
Forest Bond92b96792009-06-13 07:38:31 -0400189 );
190
191static
Andres More8611a292010-05-01 14:25:00 -0300192void
Forest Bond92b96792009-06-13 07:38:31 -0400193s_vSWencryption (
Andres More592ccfe2010-04-17 12:07:42 -0300194 PSDevice pDevice,
195 PSKeyItem pTransmitKey,
196 PBYTE pbyPayloadHead,
197 WORD wPayloadSize
Forest Bond92b96792009-06-13 07:38:31 -0400198 );
199
Andres Morecc856e62010-05-17 21:34:01 -0300200static unsigned int s_uGetTxRsvTime(
Andres More592ccfe2010-04-17 12:07:42 -0300201 PSDevice pDevice,
202 BYTE byPktType,
Andres Morecc856e62010-05-17 21:34:01 -0300203 unsigned int cbFrameLength,
Andres More592ccfe2010-04-17 12:07:42 -0300204 WORD wRate,
205 BOOL bNeedAck
Forest Bond92b96792009-06-13 07:38:31 -0400206 );
207
208
Andres Morecc856e62010-05-17 21:34:01 -0300209static unsigned int s_uGetRTSCTSRsvTime(
Andres More592ccfe2010-04-17 12:07:42 -0300210 PSDevice pDevice,
211 BYTE byRTSRsvType,
212 BYTE byPktType,
Andres Morecc856e62010-05-17 21:34:01 -0300213 unsigned int cbFrameLength,
Andres More592ccfe2010-04-17 12:07:42 -0300214 WORD wCurrentRate
Forest Bond92b96792009-06-13 07:38:31 -0400215 );
216
217static
Andres More8611a292010-05-01 14:25:00 -0300218void
Forest Bond92b96792009-06-13 07:38:31 -0400219s_vFillCTSHead (
Andres More592ccfe2010-04-17 12:07:42 -0300220 PSDevice pDevice,
Andres Morecc856e62010-05-17 21:34:01 -0300221 unsigned int uDMAIdx,
Andres More592ccfe2010-04-17 12:07:42 -0300222 BYTE byPktType,
Andres More8611a292010-05-01 14:25:00 -0300223 void *pvCTS,
Andres Morecc856e62010-05-17 21:34:01 -0300224 unsigned int cbFrameLength,
Andres More592ccfe2010-04-17 12:07:42 -0300225 BOOL bNeedAck,
226 BOOL bDisCRC,
227 WORD wCurrentRate,
228 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400229 );
230
231static
Andres More8611a292010-05-01 14:25:00 -0300232void
Forest Bond92b96792009-06-13 07:38:31 -0400233s_vFillRTSHead(
Andres More592ccfe2010-04-17 12:07:42 -0300234 PSDevice pDevice,
235 BYTE byPktType,
Andres More8611a292010-05-01 14:25:00 -0300236 void *pvRTS,
Andres Morecc856e62010-05-17 21:34:01 -0300237 unsigned int cbFrameLength,
Andres More592ccfe2010-04-17 12:07:42 -0300238 BOOL bNeedAck,
239 BOOL bDisCRC,
240 PSEthernetHeader psEthHeader,
241 WORD wCurrentRate,
242 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400243 );
244
Andres Morecc856e62010-05-17 21:34:01 -0300245static unsigned int s_uGetDataDuration(
Andres More592ccfe2010-04-17 12:07:42 -0300246 PSDevice pDevice,
247 BYTE byDurType,
Andres Morecc856e62010-05-17 21:34:01 -0300248 unsigned int cbFrameLength,
Andres More592ccfe2010-04-17 12:07:42 -0300249 BYTE byPktType,
250 WORD wRate,
251 BOOL bNeedAck,
Andres Morecc856e62010-05-17 21:34:01 -0300252 unsigned int uFragIdx,
253 unsigned int cbLastFragmentSize,
254 unsigned int uMACfragNum,
Andres More592ccfe2010-04-17 12:07:42 -0300255 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400256 );
257
258
259static
Andres Morecc856e62010-05-17 21:34:01 -0300260unsigned int
Forest Bond92b96792009-06-13 07:38:31 -0400261s_uGetRTSCTSDuration (
Andres More592ccfe2010-04-17 12:07:42 -0300262 PSDevice pDevice,
263 BYTE byDurType,
Andres Morecc856e62010-05-17 21:34:01 -0300264 unsigned int cbFrameLength,
Andres More592ccfe2010-04-17 12:07:42 -0300265 BYTE byPktType,
266 WORD wRate,
267 BOOL bNeedAck,
268 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400269 );
270
271
272/*--------------------- Export Variables --------------------------*/
273
274static
Andres More8611a292010-05-01 14:25:00 -0300275void *
Forest Bond92b96792009-06-13 07:38:31 -0400276s_vGetFreeContext(
277 PSDevice pDevice
278 )
279{
280 PUSB_SEND_CONTEXT pContext = NULL;
281 PUSB_SEND_CONTEXT pReturnContext = NULL;
Andres Morecc856e62010-05-17 21:34:01 -0300282 unsigned int ii;
Forest Bond92b96792009-06-13 07:38:31 -0400283
284 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GetFreeContext()\n");
285
286 for (ii = 0; ii < pDevice->cbTD; ii++) {
287 pContext = pDevice->apTD[ii];
288 if (pContext->bBoolInUse == FALSE) {
289 pContext->bBoolInUse = TRUE;
290 pReturnContext = pContext;
291 break;
292 }
293 }
294 if ( ii == pDevice->cbTD ) {
295 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Free Tx Context\n");
296 }
Andres More8611a292010-05-01 14:25:00 -0300297 return (void *) pReturnContext;
Forest Bond92b96792009-06-13 07:38:31 -0400298}
299
300
301static
Andres More8611a292010-05-01 14:25:00 -0300302void
Forest Bond92b96792009-06-13 07:38:31 -0400303s_vSaveTxPktInfo(PSDevice pDevice, BYTE byPktNum, PBYTE pbyDestAddr, WORD wPktLength, WORD wFIFOCtl)
304{
305 PSStatCounter pStatistic=&(pDevice->scStatistic);
306
Andres More4b50fb42010-06-22 21:57:42 -0300307 if (is_broadcast_ether_addr(pbyDestAddr))
Forest Bond92b96792009-06-13 07:38:31 -0400308 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_BROAD;
Andres More4b50fb42010-06-22 21:57:42 -0300309 else if (is_multicast_ether_addr(pbyDestAddr))
Forest Bond92b96792009-06-13 07:38:31 -0400310 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_MULTI;
311 else
312 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_UNI;
313
314 pStatistic->abyTxPktInfo[byPktNum].wLength = wPktLength;
315 pStatistic->abyTxPktInfo[byPktNum].wFIFOCtl = wFIFOCtl;
Andres More9a0e7562010-04-13 21:54:48 -0300316 memcpy(pStatistic->abyTxPktInfo[byPktNum].abyDestAddr,
317 pbyDestAddr,
318 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -0400319}
320
Forest Bond92b96792009-06-13 07:38:31 -0400321static
Andres More8611a292010-05-01 14:25:00 -0300322void
Forest Bond92b96792009-06-13 07:38:31 -0400323s_vFillTxKey (
Andres More592ccfe2010-04-17 12:07:42 -0300324 PSDevice pDevice,
325 PBYTE pbyBuf,
326 PBYTE pbyIVHead,
327 PSKeyItem pTransmitKey,
328 PBYTE pbyHdrBuf,
329 WORD wPayloadLen,
Andres More6f8c13c2010-05-04 20:40:10 -0300330 PBYTE pMICHDR
Forest Bond92b96792009-06-13 07:38:31 -0400331 )
332{
333 PDWORD pdwIV = (PDWORD) pbyIVHead;
334 PDWORD pdwExtIV = (PDWORD) ((PBYTE)pbyIVHead+4);
335 WORD wValue;
336 PS802_11Header pMACHeader = (PS802_11Header)pbyHdrBuf;
337 DWORD dwRevIVCounter;
338
339
340
341 //Fill TXKEY
342 if (pTransmitKey == NULL)
343 return;
344
345 dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
346 *pdwIV = pDevice->dwIVCounter;
347 pDevice->byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
348
349 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
350 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN ){
Jim Lieb3e362592009-08-12 14:54:11 -0700351 memcpy(pDevice->abyPRNG, (PBYTE)&(dwRevIVCounter), 3);
352 memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
Forest Bond92b96792009-06-13 07:38:31 -0400353 } else {
Jim Lieb3e362592009-08-12 14:54:11 -0700354 memcpy(pbyBuf, (PBYTE)&(dwRevIVCounter), 3);
355 memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
Forest Bond92b96792009-06-13 07:38:31 -0400356 if(pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
Jim Lieb3e362592009-08-12 14:54:11 -0700357 memcpy(pbyBuf+8, (PBYTE)&(dwRevIVCounter), 3);
358 memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
Forest Bond92b96792009-06-13 07:38:31 -0400359 }
Jim Lieb3e362592009-08-12 14:54:11 -0700360 memcpy(pDevice->abyPRNG, pbyBuf, 16);
Forest Bond92b96792009-06-13 07:38:31 -0400361 }
362 // Append IV after Mac Header
363 *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111
364 *pdwIV |= (pDevice->byKeyIndex << 30);
365 *pdwIV = cpu_to_le32(*pdwIV);
366 pDevice->dwIVCounter++;
367 if (pDevice->dwIVCounter > WEP_IV_MASK) {
368 pDevice->dwIVCounter = 0;
369 }
370 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
371 pTransmitKey->wTSC15_0++;
372 if (pTransmitKey->wTSC15_0 == 0) {
373 pTransmitKey->dwTSC47_16++;
374 }
375 TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
376 pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
Jim Lieb3e362592009-08-12 14:54:11 -0700377 memcpy(pbyBuf, pDevice->abyPRNG, 16);
Forest Bond92b96792009-06-13 07:38:31 -0400378 // Make IV
Jim Lieb3e362592009-08-12 14:54:11 -0700379 memcpy(pdwIV, pDevice->abyPRNG, 3);
Forest Bond92b96792009-06-13 07:38:31 -0400380
381 *(pbyIVHead+3) = (BYTE)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
382 // Append IV&ExtIV after Mac Header
383 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
384 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV);
385
386 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
387 pTransmitKey->wTSC15_0++;
388 if (pTransmitKey->wTSC15_0 == 0) {
389 pTransmitKey->dwTSC47_16++;
390 }
Jim Lieb3e362592009-08-12 14:54:11 -0700391 memcpy(pbyBuf, pTransmitKey->abyKey, 16);
Forest Bond92b96792009-06-13 07:38:31 -0400392
393 // Make IV
394 *pdwIV = 0;
395 *(pbyIVHead+3) = (BYTE)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
396 *pdwIV |= cpu_to_le16((WORD)(pTransmitKey->wTSC15_0));
397 //Append IV&ExtIV after Mac Header
398 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
399
400 //Fill MICHDR0
401 *pMICHDR = 0x59;
402 *((PBYTE)(pMICHDR+1)) = 0; // TxPriority
Jim Lieb3e362592009-08-12 14:54:11 -0700403 memcpy(pMICHDR+2, &(pMACHeader->abyAddr2[0]), 6);
Forest Bond92b96792009-06-13 07:38:31 -0400404 *((PBYTE)(pMICHDR+8)) = HIBYTE(HIWORD(pTransmitKey->dwTSC47_16));
405 *((PBYTE)(pMICHDR+9)) = LOBYTE(HIWORD(pTransmitKey->dwTSC47_16));
406 *((PBYTE)(pMICHDR+10)) = HIBYTE(LOWORD(pTransmitKey->dwTSC47_16));
407 *((PBYTE)(pMICHDR+11)) = LOBYTE(LOWORD(pTransmitKey->dwTSC47_16));
408 *((PBYTE)(pMICHDR+12)) = HIBYTE(pTransmitKey->wTSC15_0);
409 *((PBYTE)(pMICHDR+13)) = LOBYTE(pTransmitKey->wTSC15_0);
410 *((PBYTE)(pMICHDR+14)) = HIBYTE(wPayloadLen);
411 *((PBYTE)(pMICHDR+15)) = LOBYTE(wPayloadLen);
412
413 //Fill MICHDR1
414 *((PBYTE)(pMICHDR+16)) = 0; // HLEN[15:8]
415 if (pDevice->bLongHeader) {
416 *((PBYTE)(pMICHDR+17)) = 28; // HLEN[7:0]
417 } else {
418 *((PBYTE)(pMICHDR+17)) = 22; // HLEN[7:0]
419 }
420 wValue = cpu_to_le16(pMACHeader->wFrameCtl & 0xC78F);
Jim Lieb3e362592009-08-12 14:54:11 -0700421 memcpy(pMICHDR+18, (PBYTE)&wValue, 2); // MSKFRACTL
422 memcpy(pMICHDR+20, &(pMACHeader->abyAddr1[0]), 6);
423 memcpy(pMICHDR+26, &(pMACHeader->abyAddr2[0]), 6);
Forest Bond92b96792009-06-13 07:38:31 -0400424
425 //Fill MICHDR2
Jim Lieb3e362592009-08-12 14:54:11 -0700426 memcpy(pMICHDR+32, &(pMACHeader->abyAddr3[0]), 6);
Forest Bond92b96792009-06-13 07:38:31 -0400427 wValue = pMACHeader->wSeqCtl;
428 wValue &= 0x000F;
429 wValue = cpu_to_le16(wValue);
Jim Lieb3e362592009-08-12 14:54:11 -0700430 memcpy(pMICHDR+38, (PBYTE)&wValue, 2); // MSKSEQCTL
Forest Bond92b96792009-06-13 07:38:31 -0400431 if (pDevice->bLongHeader) {
Jim Lieb3e362592009-08-12 14:54:11 -0700432 memcpy(pMICHDR+40, &(pMACHeader->abyAddr4[0]), 6);
Forest Bond92b96792009-06-13 07:38:31 -0400433 }
434 }
435}
436
437
438static
Andres More8611a292010-05-01 14:25:00 -0300439void
Forest Bond92b96792009-06-13 07:38:31 -0400440s_vSWencryption (
Andres More592ccfe2010-04-17 12:07:42 -0300441 PSDevice pDevice,
442 PSKeyItem pTransmitKey,
443 PBYTE pbyPayloadHead,
444 WORD wPayloadSize
Forest Bond92b96792009-06-13 07:38:31 -0400445 )
446{
Andres Morecc856e62010-05-17 21:34:01 -0300447 unsigned int cbICVlen = 4;
Forest Bond92b96792009-06-13 07:38:31 -0400448 DWORD dwICV = 0xFFFFFFFFL;
449 PDWORD pdwICV;
450
451 if (pTransmitKey == NULL)
452 return;
453
454 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
455 //=======================================================================
456 // Append ICV after payload
457 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
458 pdwICV = (PDWORD)(pbyPayloadHead + wPayloadSize);
459 // finally, we must invert dwCRC to get the correct answer
460 *pdwICV = cpu_to_le32(~dwICV);
461 // RC4 encryption
462 rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3);
463 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
464 //=======================================================================
465 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
466 //=======================================================================
467 //Append ICV after payload
468 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
469 pdwICV = (PDWORD)(pbyPayloadHead + wPayloadSize);
470 // finally, we must invert dwCRC to get the correct answer
471 *pdwICV = cpu_to_le32(~dwICV);
472 // RC4 encryption
473 rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
474 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
475 //=======================================================================
476 }
477}
478
479
480
481
482/*byPktType : PK_TYPE_11A 0
483 PK_TYPE_11B 1
484 PK_TYPE_11GB 2
485 PK_TYPE_11GA 3
486*/
487static
Andres Morecc856e62010-05-17 21:34:01 -0300488unsigned int
Forest Bond92b96792009-06-13 07:38:31 -0400489s_uGetTxRsvTime (
Andres More592ccfe2010-04-17 12:07:42 -0300490 PSDevice pDevice,
491 BYTE byPktType,
Andres Morecc856e62010-05-17 21:34:01 -0300492 unsigned int cbFrameLength,
Andres More592ccfe2010-04-17 12:07:42 -0300493 WORD wRate,
494 BOOL bNeedAck
Forest Bond92b96792009-06-13 07:38:31 -0400495 )
496{
Andres Morecc856e62010-05-17 21:34:01 -0300497 unsigned int uDataTime, uAckTime;
Forest Bond92b96792009-06-13 07:38:31 -0400498
499 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate);
500 if (byPktType == PK_TYPE_11B) {//llb,CCK mode
501 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (WORD)pDevice->byTopCCKBasicRate);
502 } else {//11g 2.4G OFDM mode & 11a 5G OFDM mode
503 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (WORD)pDevice->byTopOFDMBasicRate);
504 }
505
506 if (bNeedAck) {
507 return (uDataTime + pDevice->uSIFS + uAckTime);
508 }
509 else {
510 return uDataTime;
511 }
512}
513
514//byFreqType: 0=>5GHZ 1=>2.4GHZ
515static
Andres Morecc856e62010-05-17 21:34:01 -0300516unsigned int
Forest Bond92b96792009-06-13 07:38:31 -0400517s_uGetRTSCTSRsvTime (
Andres More592ccfe2010-04-17 12:07:42 -0300518 PSDevice pDevice,
519 BYTE byRTSRsvType,
520 BYTE byPktType,
Andres Morecc856e62010-05-17 21:34:01 -0300521 unsigned int cbFrameLength,
Andres More592ccfe2010-04-17 12:07:42 -0300522 WORD wCurrentRate
Forest Bond92b96792009-06-13 07:38:31 -0400523 )
524{
Andres Morecc856e62010-05-17 21:34:01 -0300525 unsigned int uRrvTime , uRTSTime, uCTSTime, uAckTime, uDataTime;
Forest Bond92b96792009-06-13 07:38:31 -0400526
527 uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0;
528
529
530 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate);
531 if (byRTSRsvType == 0) { //RTSTxRrvTime_bb
532 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
533 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
534 }
535 else if (byRTSRsvType == 1){ //RTSTxRrvTime_ba, only in 2.4GHZ
536 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
537 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
538 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
539 }
540 else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa
541 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate);
542 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
543 }
544 else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
545 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
546 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
547 uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS;
548 return uRrvTime;
549 }
550
551 //RTSRrvTime
552 uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS;
553 return uRrvTime;
554}
555
556//byFreqType 0: 5GHz, 1:2.4Ghz
557static
Andres Morecc856e62010-05-17 21:34:01 -0300558unsigned int
Forest Bond92b96792009-06-13 07:38:31 -0400559s_uGetDataDuration (
Andres More592ccfe2010-04-17 12:07:42 -0300560 PSDevice pDevice,
561 BYTE byDurType,
Andres Morecc856e62010-05-17 21:34:01 -0300562 unsigned int cbFrameLength,
Andres More592ccfe2010-04-17 12:07:42 -0300563 BYTE byPktType,
564 WORD wRate,
565 BOOL bNeedAck,
Andres Morecc856e62010-05-17 21:34:01 -0300566 unsigned int uFragIdx,
567 unsigned int cbLastFragmentSize,
568 unsigned int uMACfragNum,
Andres More592ccfe2010-04-17 12:07:42 -0300569 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400570 )
571{
572 BOOL bLastFrag = 0;
Andres Morecc856e62010-05-17 21:34:01 -0300573 unsigned int uAckTime = 0, uNextPktTime = 0;
Forest Bond92b96792009-06-13 07:38:31 -0400574
575 if (uFragIdx == (uMACfragNum-1)) {
576 bLastFrag = 1;
577 }
578
579 switch (byDurType) {
580
581 case DATADUR_B: //DATADUR_B
582 if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
583 if (bNeedAck) {
584 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
585 return (pDevice->uSIFS + uAckTime);
586 } else {
587 return 0;
588 }
589 }
590 else {//First Frag or Mid Frag
591 if (uFragIdx == (uMACfragNum-2)) {
592 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
593 } else {
594 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
595 }
596 if (bNeedAck) {
597 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
598 return (pDevice->uSIFS + uAckTime + uNextPktTime);
599 } else {
600 return (pDevice->uSIFS + uNextPktTime);
601 }
602 }
603 break;
604
605
606 case DATADUR_A: //DATADUR_A
607 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
608 if(bNeedAck){
609 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
610 return (pDevice->uSIFS + uAckTime);
611 } else {
612 return 0;
613 }
614 }
615 else {//First Frag or Mid Frag
616 if(uFragIdx == (uMACfragNum-2)){
617 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
618 } else {
619 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
620 }
621 if(bNeedAck){
622 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
623 return (pDevice->uSIFS + uAckTime + uNextPktTime);
624 } else {
625 return (pDevice->uSIFS + uNextPktTime);
626 }
627 }
628 break;
629
630 case DATADUR_A_F0: //DATADUR_A_F0
631 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
632 if(bNeedAck){
633 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
634 return (pDevice->uSIFS + uAckTime);
635 } else {
636 return 0;
637 }
638 }
639 else { //First Frag or Mid Frag
640 if (byFBOption == AUTO_FB_0) {
641 if (wRate < RATE_18M)
642 wRate = RATE_18M;
643 else if (wRate > RATE_54M)
644 wRate = RATE_54M;
645
646 if(uFragIdx == (uMACfragNum-2)){
647 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
648 } else {
649 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
650 }
651 } else { // (byFBOption == AUTO_FB_1)
652 if (wRate < RATE_18M)
653 wRate = RATE_18M;
654 else if (wRate > RATE_54M)
655 wRate = RATE_54M;
656
657 if(uFragIdx == (uMACfragNum-2)){
658 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
659 } else {
660 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
661 }
662 }
663
664 if(bNeedAck){
665 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
666 return (pDevice->uSIFS + uAckTime + uNextPktTime);
667 } else {
668 return (pDevice->uSIFS + uNextPktTime);
669 }
670 }
671 break;
672
673 case DATADUR_A_F1: //DATADUR_A_F1
674 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
675 if(bNeedAck){
676 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
677 return (pDevice->uSIFS + uAckTime);
678 } else {
679 return 0;
680 }
681 }
682 else { //First Frag or Mid Frag
683 if (byFBOption == AUTO_FB_0) {
684 if (wRate < RATE_18M)
685 wRate = RATE_18M;
686 else if (wRate > RATE_54M)
687 wRate = RATE_54M;
688
689 if(uFragIdx == (uMACfragNum-2)){
690 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
691 } else {
692 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
693 }
694
695 } else { // (byFBOption == AUTO_FB_1)
696 if (wRate < RATE_18M)
697 wRate = RATE_18M;
698 else if (wRate > RATE_54M)
699 wRate = RATE_54M;
700
701 if(uFragIdx == (uMACfragNum-2)){
702 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
703 } else {
704 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
705 }
706 }
707 if(bNeedAck){
708 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
709 return (pDevice->uSIFS + uAckTime + uNextPktTime);
710 } else {
711 return (pDevice->uSIFS + uNextPktTime);
712 }
713 }
714 break;
715
716 default:
717 break;
718 }
719
720 ASSERT(FALSE);
721 return 0;
722}
723
724
725//byFreqType: 0=>5GHZ 1=>2.4GHZ
726static
Andres Morecc856e62010-05-17 21:34:01 -0300727unsigned int
Forest Bond92b96792009-06-13 07:38:31 -0400728s_uGetRTSCTSDuration (
Andres More592ccfe2010-04-17 12:07:42 -0300729 PSDevice pDevice,
730 BYTE byDurType,
Andres Morecc856e62010-05-17 21:34:01 -0300731 unsigned int cbFrameLength,
Andres More592ccfe2010-04-17 12:07:42 -0300732 BYTE byPktType,
733 WORD wRate,
734 BOOL bNeedAck,
735 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400736 )
737{
Andres Morecc856e62010-05-17 21:34:01 -0300738 unsigned int uCTSTime = 0, uDurTime = 0;
Forest Bond92b96792009-06-13 07:38:31 -0400739
740
741 switch (byDurType) {
742
743 case RTSDUR_BB: //RTSDuration_bb
744 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
745 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
746 break;
747
748 case RTSDUR_BA: //RTSDuration_ba
749 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
750 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
751 break;
752
753 case RTSDUR_AA: //RTSDuration_aa
754 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
755 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
756 break;
757
758 case CTSDUR_BA: //CTSDuration_ba
759 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
760 break;
761
762 case RTSDUR_BA_F0: //RTSDuration_ba_f0
763 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
764 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
765 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
766 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
767 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
768 }
769 break;
770
771 case RTSDUR_AA_F0: //RTSDuration_aa_f0
772 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
773 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
774 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
775 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
776 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
777 }
778 break;
779
780 case RTSDUR_BA_F1: //RTSDuration_ba_f1
781 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
782 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
783 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
784 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
785 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
786 }
787 break;
788
789 case RTSDUR_AA_F1: //RTSDuration_aa_f1
790 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
791 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
792 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
793 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
794 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
795 }
796 break;
797
798 case CTSDUR_BA_F0: //CTSDuration_ba_f0
799 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
800 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
801 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
802 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
803 }
804 break;
805
806 case CTSDUR_BA_F1: //CTSDuration_ba_f1
807 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
808 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
809 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
810 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
811 }
812 break;
813
814 default:
815 break;
816 }
817
818 return uDurTime;
819
820}
821
822
823
824
825static
Andres Morecc856e62010-05-17 21:34:01 -0300826unsigned int
Forest Bond92b96792009-06-13 07:38:31 -0400827s_uFillDataHead (
Andres More592ccfe2010-04-17 12:07:42 -0300828 PSDevice pDevice,
829 BYTE byPktType,
830 WORD wCurrentRate,
Andres More8611a292010-05-01 14:25:00 -0300831 void *pTxDataHead,
Andres Morecc856e62010-05-17 21:34:01 -0300832 unsigned int cbFrameLength,
833 unsigned int uDMAIdx,
Andres More592ccfe2010-04-17 12:07:42 -0300834 BOOL bNeedAck,
Andres Morecc856e62010-05-17 21:34:01 -0300835 unsigned int uFragIdx,
836 unsigned int cbLastFragmentSize,
837 unsigned int uMACfragNum,
Andres More592ccfe2010-04-17 12:07:42 -0300838 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400839 )
840{
841
842 if (pTxDataHead == NULL) {
843 return 0;
844 }
845
846 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
847 if((uDMAIdx==TYPE_ATIMDMA)||(uDMAIdx==TYPE_BEACONDMA)) {
848 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
849 //Get SignalField,ServiceField,Length
850 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
851 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
852 );
853 //Get Duration and TimeStampOff
854 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
855 wCurrentRate, bNeedAck, uFragIdx,
856 cbLastFragmentSize, uMACfragNum,
857 byFBOption); //1: 2.4GHz
858 if(uDMAIdx!=TYPE_ATIMDMA) {
859 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
860 }
861 return (pBuf->wDuration);
862 }
863 else { // DATA & MANAGE Frame
864 if (byFBOption == AUTO_FB_NONE) {
865 PSTxDataHead_g pBuf = (PSTxDataHead_g)pTxDataHead;
866 //Get SignalField,ServiceField,Length
867 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
868 (PWORD)&(pBuf->wTransmitLength_a), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
869 );
870 BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
871 (PWORD)&(pBuf->wTransmitLength_b), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
872 );
873 //Get Duration and TimeStamp
874 pBuf->wDuration_a = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength,
875 byPktType, wCurrentRate, bNeedAck, uFragIdx,
876 cbLastFragmentSize, uMACfragNum,
877 byFBOption); //1: 2.4GHz
878 pBuf->wDuration_b = (WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength,
879 PK_TYPE_11B, pDevice->byTopCCKBasicRate,
880 bNeedAck, uFragIdx, cbLastFragmentSize,
881 uMACfragNum, byFBOption); //1: 2.4GHz
882
883 pBuf->wTimeStampOff_a = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
884 pBuf->wTimeStampOff_b = wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE];
885 return (pBuf->wDuration_a);
886 } else {
887 // Auto Fallback
888 PSTxDataHead_g_FB pBuf = (PSTxDataHead_g_FB)pTxDataHead;
889 //Get SignalField,ServiceField,Length
890 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
891 (PWORD)&(pBuf->wTransmitLength_a), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
892 );
893 BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
894 (PWORD)&(pBuf->wTransmitLength_b), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
895 );
896 //Get Duration and TimeStamp
897 pBuf->wDuration_a = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
898 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
899 pBuf->wDuration_b = (WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B,
900 pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
901 pBuf->wDuration_a_f0 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
902 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
903 pBuf->wDuration_a_f1 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
904 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
905 pBuf->wTimeStampOff_a = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
906 pBuf->wTimeStampOff_b = wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE];
907 return (pBuf->wDuration_a);
908 } //if (byFBOption == AUTO_FB_NONE)
909 }
910 }
911 else if (byPktType == PK_TYPE_11A) {
912 if ((byFBOption != AUTO_FB_NONE) && (uDMAIdx != TYPE_ATIMDMA) && (uDMAIdx != TYPE_BEACONDMA)) {
913 // Auto Fallback
914 PSTxDataHead_a_FB pBuf = (PSTxDataHead_a_FB)pTxDataHead;
915 //Get SignalField,ServiceField,Length
916 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
917 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
918 );
919 //Get Duration and TimeStampOff
920 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
921 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz
922 pBuf->wDuration_f0 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
923 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz
924 pBuf->wDuration_f1 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
925 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz
926 if(uDMAIdx!=TYPE_ATIMDMA) {
927 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
928 }
929 return (pBuf->wDuration);
930 } else {
931 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
932 //Get SignalField,ServiceField,Length
933 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
934 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
935 );
936 //Get Duration and TimeStampOff
937 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
938 wCurrentRate, bNeedAck, uFragIdx,
939 cbLastFragmentSize, uMACfragNum,
940 byFBOption);
941
942 if(uDMAIdx!=TYPE_ATIMDMA) {
943 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
944 }
945 return (pBuf->wDuration);
946 }
947 }
948 else if (byPktType == PK_TYPE_11B) {
949 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
950 //Get SignalField,ServiceField,Length
951 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
952 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
953 );
954 //Get Duration and TimeStampOff
955 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType,
956 wCurrentRate, bNeedAck, uFragIdx,
957 cbLastFragmentSize, uMACfragNum,
958 byFBOption);
959 if (uDMAIdx != TYPE_ATIMDMA) {
960 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
961 }
962 return (pBuf->wDuration);
963 }
964 return 0;
965}
966
967
968
969
970static
Andres More8611a292010-05-01 14:25:00 -0300971void
Forest Bond92b96792009-06-13 07:38:31 -0400972s_vFillRTSHead (
Andres More592ccfe2010-04-17 12:07:42 -0300973 PSDevice pDevice,
974 BYTE byPktType,
Andres More8611a292010-05-01 14:25:00 -0300975 void *pvRTS,
Andres Morecc856e62010-05-17 21:34:01 -0300976 unsigned int cbFrameLength,
Andres More592ccfe2010-04-17 12:07:42 -0300977 BOOL bNeedAck,
978 BOOL bDisCRC,
979 PSEthernetHeader psEthHeader,
980 WORD wCurrentRate,
981 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -0400982 )
983{
Andres Morecc856e62010-05-17 21:34:01 -0300984 unsigned int uRTSFrameLen = 20;
Forest Bond92b96792009-06-13 07:38:31 -0400985 WORD wLen = 0x0000;
986
Forest Bond92b96792009-06-13 07:38:31 -0400987 if (pvRTS == NULL)
988 return;
989
990 if (bDisCRC) {
991 // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
992 // in this case we need to decrease its length by 4.
993 uRTSFrameLen -= 4;
994 }
995
996 // Note: So far RTSHead dosen't appear in ATIM & Beacom DMA, so we don't need to take them into account.
997 // Otherwise, we need to modified codes for them.
998 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
999 if (byFBOption == AUTO_FB_NONE) {
1000 PSRTS_g pBuf = (PSRTS_g)pvRTS;
1001 //Get SignalField,ServiceField,Length
1002 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1003 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
1004 );
1005 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1006 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
1007 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
1008 );
1009 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
1010 //Get Duration
1011 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
1012 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
1013 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
1014
1015 pBuf->Data.wDurationID = pBuf->wDuration_aa;
1016 //Get RTS Frame body
1017 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
Andres More9a0e7562010-04-13 21:54:48 -03001018
1019 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1020 (pDevice->eOPMode == OP_MODE_AP)) {
1021 memcpy(&(pBuf->Data.abyRA[0]),
1022 &(psEthHeader->abyDstAddr[0]),
1023 ETH_ALEN);
1024 }
Forest Bond92b96792009-06-13 07:38:31 -04001025 else {
Andres More9a0e7562010-04-13 21:54:48 -03001026 memcpy(&(pBuf->Data.abyRA[0]),
1027 &(pDevice->abyBSSID[0]),
1028 ETH_ALEN);
1029 }
1030 if (pDevice->eOPMode == OP_MODE_AP) {
1031 memcpy(&(pBuf->Data.abyTA[0]),
1032 &(pDevice->abyBSSID[0]),
1033 ETH_ALEN);
1034 }
Forest Bond92b96792009-06-13 07:38:31 -04001035 else {
Andres More9a0e7562010-04-13 21:54:48 -03001036 memcpy(&(pBuf->Data.abyTA[0]),
1037 &(psEthHeader->abySrcAddr[0]),
1038 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001039 }
1040 }
1041 else {
1042 PSRTS_g_FB pBuf = (PSRTS_g_FB)pvRTS;
1043 //Get SignalField,ServiceField,Length
1044 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1045 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
1046 );
1047 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1048 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
1049 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
1050 );
1051 pBuf->wTransmitLength_a = cpu_to_le16(wLen);
1052 //Get Duration
1053 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
1054 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
1055 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
1056 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
1057 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
1058 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
1059 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
1060 pBuf->Data.wDurationID = pBuf->wDuration_aa;
1061 //Get RTS Frame body
1062 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1063
Andres More9a0e7562010-04-13 21:54:48 -03001064 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1065 (pDevice->eOPMode == OP_MODE_AP)) {
1066 memcpy(&(pBuf->Data.abyRA[0]),
1067 &(psEthHeader->abyDstAddr[0]),
1068 ETH_ALEN);
1069 }
Forest Bond92b96792009-06-13 07:38:31 -04001070 else {
Andres More9a0e7562010-04-13 21:54:48 -03001071 memcpy(&(pBuf->Data.abyRA[0]),
1072 &(pDevice->abyBSSID[0]),
1073 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001074 }
1075
Andres More9a0e7562010-04-13 21:54:48 -03001076 if (pDevice->eOPMode == OP_MODE_AP) {
1077 memcpy(&(pBuf->Data.abyTA[0]),
1078 &(pDevice->abyBSSID[0]),
1079 ETH_ALEN);
1080 }
Forest Bond92b96792009-06-13 07:38:31 -04001081 else {
Andres More9a0e7562010-04-13 21:54:48 -03001082 memcpy(&(pBuf->Data.abyTA[0]),
1083 &(psEthHeader->abySrcAddr[0]),
1084 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001085 }
1086
1087 } // if (byFBOption == AUTO_FB_NONE)
1088 }
1089 else if (byPktType == PK_TYPE_11A) {
1090 if (byFBOption == AUTO_FB_NONE) {
1091 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
1092 //Get SignalField,ServiceField,Length
1093 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
1094 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
1095 );
1096 pBuf->wTransmitLength = cpu_to_le16(wLen);
1097 //Get Duration
1098 pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
1099 pBuf->Data.wDurationID = pBuf->wDuration;
1100 //Get RTS Frame body
1101 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1102
Andres More9a0e7562010-04-13 21:54:48 -03001103 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1104 (pDevice->eOPMode == OP_MODE_AP)) {
1105 memcpy(&(pBuf->Data.abyRA[0]),
1106 &(psEthHeader->abyDstAddr[0]),
1107 ETH_ALEN);
1108 } else {
1109 memcpy(&(pBuf->Data.abyRA[0]),
1110 &(pDevice->abyBSSID[0]),
1111 ETH_ALEN);
1112 }
Forest Bond92b96792009-06-13 07:38:31 -04001113
Andres More9a0e7562010-04-13 21:54:48 -03001114 if (pDevice->eOPMode == OP_MODE_AP) {
1115 memcpy(&(pBuf->Data.abyTA[0]),
1116 &(pDevice->abyBSSID[0]),
1117 ETH_ALEN);
1118 } else {
1119 memcpy(&(pBuf->Data.abyTA[0]),
1120 &(psEthHeader->abySrcAddr[0]),
1121 ETH_ALEN);
1122 }
Forest Bond92b96792009-06-13 07:38:31 -04001123
1124 }
1125 else {
1126 PSRTS_a_FB pBuf = (PSRTS_a_FB)pvRTS;
1127 //Get SignalField,ServiceField,Length
1128 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
1129 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
1130 );
1131 pBuf->wTransmitLength = cpu_to_le16(wLen);
1132 //Get Duration
1133 pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
1134 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
1135 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:
1136 pBuf->Data.wDurationID = pBuf->wDuration;
1137 //Get RTS Frame body
1138 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1139
Andres More9a0e7562010-04-13 21:54:48 -03001140 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1141 (pDevice->eOPMode == OP_MODE_AP)) {
1142 memcpy(&(pBuf->Data.abyRA[0]),
1143 &(psEthHeader->abyDstAddr[0]),
1144 ETH_ALEN);
1145 } else {
1146 memcpy(&(pBuf->Data.abyRA[0]),
1147 &(pDevice->abyBSSID[0]),
1148 ETH_ALEN);
1149 }
1150 if (pDevice->eOPMode == OP_MODE_AP) {
1151 memcpy(&(pBuf->Data.abyTA[0]),
1152 &(pDevice->abyBSSID[0]),
1153 ETH_ALEN);
1154 } else {
1155 memcpy(&(pBuf->Data.abyTA[0]),
1156 &(psEthHeader->abySrcAddr[0]),
1157 ETH_ALEN);
1158 }
Forest Bond92b96792009-06-13 07:38:31 -04001159 }
1160 }
1161 else if (byPktType == PK_TYPE_11B) {
1162 PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
1163 //Get SignalField,ServiceField,Length
1164 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1165 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
1166 );
1167 pBuf->wTransmitLength = cpu_to_le16(wLen);
1168 //Get Duration
1169 pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
1170 pBuf->Data.wDurationID = pBuf->wDuration;
1171 //Get RTS Frame body
1172 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
1173
Andres More9a0e7562010-04-13 21:54:48 -03001174 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
Forest Bond92b96792009-06-13 07:38:31 -04001175 (pDevice->eOPMode == OP_MODE_AP)) {
Andres More9a0e7562010-04-13 21:54:48 -03001176 memcpy(&(pBuf->Data.abyRA[0]),
1177 &(psEthHeader->abyDstAddr[0]),
1178 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001179 }
1180 else {
Andres More9a0e7562010-04-13 21:54:48 -03001181 memcpy(&(pBuf->Data.abyRA[0]),
1182 &(pDevice->abyBSSID[0]),
1183 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001184 }
1185
1186 if (pDevice->eOPMode == OP_MODE_AP) {
Andres More9a0e7562010-04-13 21:54:48 -03001187 memcpy(&(pBuf->Data.abyTA[0]),
1188 &(pDevice->abyBSSID[0]),
1189 ETH_ALEN);
1190 } else {
1191 memcpy(&(pBuf->Data.abyTA[0]),
1192 &(psEthHeader->abySrcAddr[0]),
1193 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001194 }
1195 }
1196}
1197
1198static
Andres More8611a292010-05-01 14:25:00 -03001199void
Forest Bond92b96792009-06-13 07:38:31 -04001200s_vFillCTSHead (
Andres More592ccfe2010-04-17 12:07:42 -03001201 PSDevice pDevice,
Andres Morecc856e62010-05-17 21:34:01 -03001202 unsigned int uDMAIdx,
Andres More592ccfe2010-04-17 12:07:42 -03001203 BYTE byPktType,
Andres More8611a292010-05-01 14:25:00 -03001204 void *pvCTS,
Andres Morecc856e62010-05-17 21:34:01 -03001205 unsigned int cbFrameLength,
Andres More592ccfe2010-04-17 12:07:42 -03001206 BOOL bNeedAck,
1207 BOOL bDisCRC,
1208 WORD wCurrentRate,
1209 BYTE byFBOption
Forest Bond92b96792009-06-13 07:38:31 -04001210 )
1211{
Andres Morecc856e62010-05-17 21:34:01 -03001212 unsigned int uCTSFrameLen = 14;
Forest Bond92b96792009-06-13 07:38:31 -04001213 WORD wLen = 0x0000;
1214
1215 if (pvCTS == NULL) {
1216 return;
1217 }
1218
1219 if (bDisCRC) {
1220 // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
1221 // in this case we need to decrease its length by 4.
1222 uCTSFrameLen -= 4;
1223 }
1224
1225 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1226 if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
1227 // Auto Fall back
1228 PSCTS_FB pBuf = (PSCTS_FB)pvCTS;
1229 //Get SignalField,ServiceField,Length
1230 BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1231 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
1232 );
1233 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1234 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
1235 pBuf->wDuration_ba += pDevice->wCTSDuration;
1236 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1237 //Get CTSDuration_ba_f0
1238 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
1239 pBuf->wCTSDuration_ba_f0 += pDevice->wCTSDuration;
1240 pBuf->wCTSDuration_ba_f0 = cpu_to_le16(pBuf->wCTSDuration_ba_f0);
1241 //Get CTSDuration_ba_f1
1242 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
1243 pBuf->wCTSDuration_ba_f1 += pDevice->wCTSDuration;
1244 pBuf->wCTSDuration_ba_f1 = cpu_to_le16(pBuf->wCTSDuration_ba_f1);
1245 //Get CTS Frame body
1246 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1247 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1248 pBuf->Data.wReserved = 0x0000;
Andres More9a0e7562010-04-13 21:54:48 -03001249 memcpy(&(pBuf->Data.abyRA[0]),
1250 &(pDevice->abyCurrentNetAddr[0]),
1251 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001252 } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
1253 PSCTS pBuf = (PSCTS)pvCTS;
1254 //Get SignalField,ServiceField,Length
1255 BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
1256 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
1257 );
1258 pBuf->wTransmitLength_b = cpu_to_le16(wLen);
1259 //Get CTSDuration_ba
1260 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
1261 pBuf->wDuration_ba += pDevice->wCTSDuration;
1262 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
1263
1264 //Get CTS Frame body
1265 pBuf->Data.wDurationID = pBuf->wDuration_ba;
1266 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
1267 pBuf->Data.wReserved = 0x0000;
Andres More9a0e7562010-04-13 21:54:48 -03001268 memcpy(&(pBuf->Data.abyRA[0]),
1269 &(pDevice->abyCurrentNetAddr[0]),
1270 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001271 }
1272 }
1273}
1274
Forest Bond92b96792009-06-13 07:38:31 -04001275/*+
1276 *
1277 * Description:
1278 * Generate FIFO control for MAC & Baseband controller
1279 *
1280 * Parameters:
1281 * In:
1282 * pDevice - Pointer to adpater
1283 * pTxDataHead - Transmit Data Buffer
1284 * pTxBufHead - pTxBufHead
1285 * pvRrvTime - pvRrvTime
1286 * pvRTS - RTS Buffer
1287 * pCTS - CTS Buffer
1288 * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
1289 * bNeedACK - If need ACK
1290 * uDMAIdx - DMA Index
1291 * Out:
1292 * none
1293 *
1294 * Return Value: none
1295 *
1296-*/
Andres Morecc856e62010-05-17 21:34:01 -03001297
Forest Bond92b96792009-06-13 07:38:31 -04001298static
Andres More8611a292010-05-01 14:25:00 -03001299void
Forest Bond92b96792009-06-13 07:38:31 -04001300s_vGenerateTxParameter (
Andres More592ccfe2010-04-17 12:07:42 -03001301 PSDevice pDevice,
1302 BYTE byPktType,
1303 WORD wCurrentRate,
Andres More8611a292010-05-01 14:25:00 -03001304 void *pTxBufHead,
1305 void *pvRrvTime,
1306 void *pvRTS,
1307 void *pvCTS,
Andres Morecc856e62010-05-17 21:34:01 -03001308 unsigned int cbFrameSize,
Andres More592ccfe2010-04-17 12:07:42 -03001309 BOOL bNeedACK,
Andres Morecc856e62010-05-17 21:34:01 -03001310 unsigned int uDMAIdx,
Andres More592ccfe2010-04-17 12:07:42 -03001311 PSEthernetHeader psEthHeader
Forest Bond92b96792009-06-13 07:38:31 -04001312 )
1313{
Andres Morecc856e62010-05-17 21:34:01 -03001314 unsigned int cbMACHdLen = WLAN_HDR_ADDR3_LEN; /* 24 */
Forest Bond92b96792009-06-13 07:38:31 -04001315 WORD wFifoCtl;
1316 BOOL bDisCRC = FALSE;
1317 BYTE byFBOption = AUTO_FB_NONE;
1318// WORD wCurrentRate = pDevice->wCurrentRate;
1319
1320 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter...\n");
1321 PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
1322 pFifoHead->wReserved = wCurrentRate;
1323 wFifoCtl = pFifoHead->wFIFOCtl;
1324
1325 if (wFifoCtl & FIFOCTL_CRCDIS) {
1326 bDisCRC = TRUE;
1327 }
1328
1329 if (wFifoCtl & FIFOCTL_AUTO_FB_0) {
1330 byFBOption = AUTO_FB_0;
1331 }
1332 else if (wFifoCtl & FIFOCTL_AUTO_FB_1) {
1333 byFBOption = AUTO_FB_1;
1334 }
1335
1336 if (pDevice->bLongHeader)
1337 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1338
1339 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
1340
1341 if (pvRTS != NULL) { //RTS_need
1342 //Fill RsvTime
1343 if (pvRrvTime) {
1344 PSRrvTime_gRTS pBuf = (PSRrvTime_gRTS)pvRrvTime;
1345 pBuf->wRTSTxRrvTime_aa = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 1:2.4GHz
1346 pBuf->wRTSTxRrvTime_ba = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate));//1:RTSTxRrvTime_ba, 1:2.4GHz
1347 pBuf->wRTSTxRrvTime_bb = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1348 pBuf->wTxRrvTime_a = cpu_to_le16((WORD) s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1349 pBuf->wTxRrvTime_b = cpu_to_le16((WORD) s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1350 }
1351 //Fill RTS
1352 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1353 }
1354 else {//RTS_needless, PCF mode
1355
1356 //Fill RsvTime
1357 if (pvRrvTime) {
1358 PSRrvTime_gCTS pBuf = (PSRrvTime_gCTS)pvRrvTime;
1359 pBuf->wTxRrvTime_a = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
1360 pBuf->wTxRrvTime_b = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
1361 pBuf->wCTSTxRrvTime_ba = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate));//3:CTSTxRrvTime_Ba, 1:2.4GHz
1362 }
1363 //Fill CTS
1364 s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
1365 }
1366 }
1367 else if (byPktType == PK_TYPE_11A) {
1368
1369 if (pvRTS != NULL) {//RTS_need, non PCF mode
1370 //Fill RsvTime
1371 if (pvRrvTime) {
1372 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1373 pBuf->wRTSTxRrvTime = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 0:5GHz
1374 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//0:OFDM
1375 }
1376 //Fill RTS
1377 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1378 }
1379 else if (pvRTS == NULL) {//RTS_needless, non PCF mode
1380 //Fill RsvTime
1381 if (pvRrvTime) {
1382 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1383 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK)); //0:OFDM
1384 }
1385 }
1386 }
1387 else if (byPktType == PK_TYPE_11B) {
1388
1389 if ((pvRTS != NULL)) {//RTS_need, non PCF mode
1390 //Fill RsvTime
1391 if (pvRrvTime) {
1392 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1393 pBuf->wRTSTxRrvTime = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
1394 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK));//1:CCK
1395 }
1396 //Fill RTS
1397 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
1398 }
1399 else { //RTS_needless, non PCF mode
1400 //Fill RsvTime
1401 if (pvRrvTime) {
1402 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
1403 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK)); //1:CCK
1404 }
1405 }
1406 }
1407 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter END.\n");
1408}
1409/*
1410 PBYTE pbyBuffer,//point to pTxBufHead
1411 WORD wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last
Andres Morecc856e62010-05-17 21:34:01 -03001412 unsigned int cbFragmentSize,//Hdr+payoad+FCS
Forest Bond92b96792009-06-13 07:38:31 -04001413*/
1414
1415
1416BOOL
1417s_bPacketToWirelessUsb(
Andres More592ccfe2010-04-17 12:07:42 -03001418 PSDevice pDevice,
1419 BYTE byPktType,
1420 PBYTE usbPacketBuf,
1421 BOOL bNeedEncryption,
Andres Morecc856e62010-05-17 21:34:01 -03001422 unsigned int uSkbPacketLen,
1423 unsigned int uDMAIdx,
Andres More592ccfe2010-04-17 12:07:42 -03001424 PSEthernetHeader psEthHeader,
1425 PBYTE pPacket,
1426 PSKeyItem pTransmitKey,
Andres Morecc856e62010-05-17 21:34:01 -03001427 unsigned int uNodeIndex,
Andres More592ccfe2010-04-17 12:07:42 -03001428 WORD wCurrentRate,
Andres Morecc856e62010-05-17 21:34:01 -03001429 unsigned int *pcbHeaderLen,
1430 unsigned int *pcbTotalLen
Forest Bond92b96792009-06-13 07:38:31 -04001431 )
1432{
1433 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
Andres Morecc856e62010-05-17 21:34:01 -03001434 unsigned int cbFrameSize, cbFrameBodySize;
Forest Bond92b96792009-06-13 07:38:31 -04001435 PTX_BUFFER pTxBufHead;
Andres Morecc856e62010-05-17 21:34:01 -03001436 unsigned int cb802_1_H_len;
1437 unsigned int cbIVlen = 0, cbICVlen = 0, cbMIClen = 0,
1438 cbMACHdLen = 0, cbFCSlen = 4;
1439 unsigned int cbMICHDR = 0;
Forest Bond92b96792009-06-13 07:38:31 -04001440 BOOL bNeedACK,bRTS;
1441 PBYTE pbyType,pbyMacHdr,pbyIVHead,pbyPayloadHead,pbyTxBufferAddr;
Andres Morecc856e62010-05-17 21:34:01 -03001442 BYTE abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
1443 BYTE abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
1444 unsigned int uDuration;
1445 unsigned int cbHeaderLength = 0, uPadding = 0;
Andres More8611a292010-05-01 14:25:00 -03001446 void *pvRrvTime;
Forest Bond92b96792009-06-13 07:38:31 -04001447 PSMICHDRHead pMICHDR;
Andres More8611a292010-05-01 14:25:00 -03001448 void *pvRTS;
1449 void *pvCTS;
1450 void *pvTxDataHd;
Forest Bond92b96792009-06-13 07:38:31 -04001451 BYTE byFBOption = AUTO_FB_NONE,byFragType;
1452 WORD wTxBufSize;
1453 DWORD dwMICKey0,dwMICKey1,dwMIC_Priority,dwCRC;
1454 PDWORD pdwMIC_L,pdwMIC_R;
1455 BOOL bSoftWEP = FALSE;
1456
1457
1458
1459
1460 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
1461 if ((bNeedEncryption) && (pTransmitKey != NULL)) {
1462 if (((PSKeyTable) (pTransmitKey->pvKeyTable))->bSoftWEP == TRUE) {
1463 // WEP 256
1464 bSoftWEP = TRUE;
1465 }
1466 }
1467
1468 pTxBufHead = (PTX_BUFFER) usbPacketBuf;
Jim Lieb3e362592009-08-12 14:54:11 -07001469 memset(pTxBufHead, 0, sizeof(TX_BUFFER));
Forest Bond92b96792009-06-13 07:38:31 -04001470
1471 // Get pkt type
1472 if (ntohs(psEthHeader->wType) > MAX_DATA_LEN) {
1473 if (pDevice->dwDiagRefCount == 0) {
1474 cb802_1_H_len = 8;
1475 } else {
1476 cb802_1_H_len = 2;
1477 }
1478 } else {
1479 cb802_1_H_len = 0;
1480 }
1481
Charles Clément21ec51f2010-05-18 10:08:14 -07001482 cbFrameBodySize = uSkbPacketLen - ETH_HLEN + cb802_1_H_len;
Forest Bond92b96792009-06-13 07:38:31 -04001483
1484 //Set packet type
1485 pTxBufHead->wFIFOCtl |= (WORD)(byPktType<<8);
1486
1487 if (pDevice->dwDiagRefCount != 0) {
1488 bNeedACK = FALSE;
1489 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
1490 } else { //if (pDevice->dwDiagRefCount != 0) {
1491 if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
1492 (pDevice->eOPMode == OP_MODE_AP)) {
Andres More4b50fb42010-06-22 21:57:42 -03001493 if (is_multicast_ether_addr(&(psEthHeader->abyDstAddr[0])) ||
1494 is_broadcast_ether_addr(&(psEthHeader->abyDstAddr[0]))) {
Forest Bond92b96792009-06-13 07:38:31 -04001495 bNeedACK = FALSE;
1496 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
1497 }
1498 else {
1499 bNeedACK = TRUE;
1500 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1501 }
1502 }
1503 else {
1504 // MSDUs in Infra mode always need ACK
1505 bNeedACK = TRUE;
1506 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
1507 }
1508 } //if (pDevice->dwDiagRefCount != 0) {
1509
1510 pTxBufHead->wTimeStamp = DEFAULT_MSDU_LIFETIME_RES_64us;
1511
1512 //Set FIFOCTL_LHEAD
1513 if (pDevice->bLongHeader)
1514 pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
1515
1516 if (pDevice->bSoftwareGenCrcErr) {
1517 pTxBufHead->wFIFOCtl |= FIFOCTL_CRCDIS; // set tx descriptors to NO hardware CRC
1518 }
1519
1520 //Set FRAGCTL_MACHDCNT
1521 if (pDevice->bLongHeader) {
1522 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
1523 } else {
1524 cbMACHdLen = WLAN_HDR_ADDR3_LEN;
1525 }
1526 pTxBufHead->wFragCtl |= (WORD)(cbMACHdLen << 10);
1527
1528 //Set FIFOCTL_GrpAckPolicy
1529 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
1530 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
1531 }
1532
1533 //Set Auto Fallback Ctl
1534 if (wCurrentRate >= RATE_18M) {
1535 if (pDevice->byAutoFBCtrl == AUTO_FB_0) {
1536 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
1537 byFBOption = AUTO_FB_0;
1538 } else if (pDevice->byAutoFBCtrl == AUTO_FB_1) {
1539 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
1540 byFBOption = AUTO_FB_1;
1541 }
1542 }
1543
1544 if (bSoftWEP != TRUE) {
1545 if ((bNeedEncryption) && (pTransmitKey != NULL)) { //WEP enabled
1546 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
1547 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
1548 }
1549 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1550 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Tx Set wFragCtl == FRAGCTL_TKIP\n");
1551 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
1552 }
1553 else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
1554 pTxBufHead->wFragCtl |= FRAGCTL_AES;
1555 }
1556 }
1557 }
1558
1559
1560 if ((bNeedEncryption) && (pTransmitKey != NULL)) {
1561 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
1562 cbIVlen = 4;
1563 cbICVlen = 4;
1564 }
1565 else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
1566 cbIVlen = 8;//IV+ExtIV
1567 cbMIClen = 8;
1568 cbICVlen = 4;
1569 }
1570 if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
1571 cbIVlen = 8;//RSN Header
1572 cbICVlen = 8;//MIC
1573 cbMICHDR = sizeof(SMICHDRHead);
1574 }
1575 if (bSoftWEP == FALSE) {
1576 //MAC Header should be padding 0 to DW alignment.
1577 uPadding = 4 - (cbMACHdLen%4);
1578 uPadding %= 4;
1579 }
1580 }
1581
1582 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
1583
1584 if ( (bNeedACK == FALSE) ||(cbFrameSize < pDevice->wRTSThreshold) ) {
1585 bRTS = FALSE;
1586 } else {
1587 bRTS = TRUE;
1588 pTxBufHead->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
1589 }
1590
1591 pbyTxBufferAddr = (PBYTE) &(pTxBufHead->adwTxKey[0]);
1592 wTxBufSize = sizeof(STxBufHead);
1593 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
1594 if (byFBOption == AUTO_FB_NONE) {
1595 if (bRTS == TRUE) {//RTS_need
1596 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1597 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1598 pvRTS = (PSRTS_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1599 pvCTS = NULL;
1600 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g));
1601 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g) + sizeof(STxDataHead_g);
1602 }
1603 else { //RTS_needless
1604 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1605 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1606 pvRTS = NULL;
1607 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1608 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
1609 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
1610 }
1611 } else {
1612 // Auto Fall Back
1613 if (bRTS == TRUE) {//RTS_need
1614 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
1615 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
1616 pvRTS = (PSRTS_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
1617 pvCTS = NULL;
1618 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB));
1619 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB) + sizeof(STxDataHead_g_FB);
1620 }
1621 else if (bRTS == FALSE) { //RTS_needless
1622 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
1623 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
1624 pvRTS = NULL;
1625 pvCTS = (PSCTS_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
1626 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB));
1627 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB) + sizeof(STxDataHead_g_FB);
1628 }
1629 } // Auto Fall Back
1630 }
1631 else {//802.11a/b packet
1632 if (byFBOption == AUTO_FB_NONE) {
1633 if (bRTS == TRUE) {//RTS_need
1634 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1635 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1636 pvRTS = (PSRTS_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1637 pvCTS = NULL;
1638 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab));
1639 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab) + sizeof(STxDataHead_ab);
1640 }
1641 else if (bRTS == FALSE) { //RTS_needless, no MICHDR
1642 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1643 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1644 pvRTS = NULL;
1645 pvCTS = NULL;
1646 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1647 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
1648 }
1649 } else {
1650 // Auto Fall Back
1651 if (bRTS == TRUE) {//RTS_need
1652 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1653 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1654 pvRTS = (PSRTS_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1655 pvCTS = NULL;
1656 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB));
1657 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB) + sizeof(STxDataHead_a_FB);
1658 }
1659 else if (bRTS == FALSE) { //RTS_needless
1660 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
1661 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
1662 pvRTS = NULL;
1663 pvCTS = NULL;
1664 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
1665 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_a_FB);
1666 }
1667 } // Auto Fall Back
1668 }
1669
1670 pbyMacHdr = (PBYTE)(pbyTxBufferAddr + cbHeaderLength);
1671 pbyIVHead = (PBYTE)(pbyMacHdr + cbMACHdLen + uPadding);
1672 pbyPayloadHead = (PBYTE)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
1673
1674
1675 //=========================
1676 // No Fragmentation
1677 //=========================
1678 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Fragmentation...\n");
1679 byFragType = FRAGCTL_NONFRAG;
1680 //uDMAIdx = TYPE_AC0DMA;
1681 //pTxBufHead = (PSTxBufHead) &(pTxBufHead->adwTxKey[0]);
1682
1683
1684 //Fill FIFO,RrvTime,RTS,and CTS
Andres More8611a292010-05-01 14:25:00 -03001685 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate,
1686 (void *)pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
Forest Bond92b96792009-06-13 07:38:31 -04001687 cbFrameSize, bNeedACK, uDMAIdx, psEthHeader);
1688 //Fill DataHead
1689 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
1690 0, 0, 1/*uMACfragNum*/, byFBOption);
1691 // Generate TX MAC Header
1692 s_vGenerateMACHeader(pDevice, pbyMacHdr, (WORD)uDuration, psEthHeader, bNeedEncryption,
1693 byFragType, uDMAIdx, 0);
1694
1695 if (bNeedEncryption == TRUE) {
1696 //Fill TXKEY
1697 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
1698 pbyMacHdr, (WORD)cbFrameBodySize, (PBYTE)pMICHDR);
1699
1700 if (pDevice->bEnableHostWEP) {
1701 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
1702 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
1703 }
1704 }
1705
1706 // 802.1H
1707 if (ntohs(psEthHeader->wType) > MAX_DATA_LEN) {
1708 if (pDevice->dwDiagRefCount == 0) {
1709 if ( (psEthHeader->wType == TYPE_PKT_IPX) ||
1710 (psEthHeader->wType == cpu_to_le16(0xF380))) {
Jim Lieb3e362592009-08-12 14:54:11 -07001711 memcpy((PBYTE) (pbyPayloadHead), &abySNAP_Bridgetunnel[0], 6);
Forest Bond92b96792009-06-13 07:38:31 -04001712 } else {
Jim Lieb3e362592009-08-12 14:54:11 -07001713 memcpy((PBYTE) (pbyPayloadHead), &abySNAP_RFC1042[0], 6);
Forest Bond92b96792009-06-13 07:38:31 -04001714 }
1715 pbyType = (PBYTE) (pbyPayloadHead + 6);
Jim Lieb3e362592009-08-12 14:54:11 -07001716 memcpy(pbyType, &(psEthHeader->wType), sizeof(WORD));
Forest Bond92b96792009-06-13 07:38:31 -04001717 } else {
Jim Lieb3e362592009-08-12 14:54:11 -07001718 memcpy((PBYTE) (pbyPayloadHead), &(psEthHeader->wType), sizeof(WORD));
Forest Bond92b96792009-06-13 07:38:31 -04001719
1720 }
1721
1722 }
1723
1724
1725 if (pPacket != NULL) {
1726 // Copy the Packet into a tx Buffer
Jim Lieb3e362592009-08-12 14:54:11 -07001727 memcpy((pbyPayloadHead + cb802_1_H_len),
Charles Clément21ec51f2010-05-18 10:08:14 -07001728 (pPacket + ETH_HLEN),
1729 uSkbPacketLen - ETH_HLEN
Forest Bond92b96792009-06-13 07:38:31 -04001730 );
1731
1732 } else {
1733 // while bRelayPacketSend psEthHeader is point to header+payload
Charles Clément21ec51f2010-05-18 10:08:14 -07001734 memcpy((pbyPayloadHead + cb802_1_H_len), ((PBYTE)psEthHeader) + ETH_HLEN, uSkbPacketLen - ETH_HLEN);
Forest Bond92b96792009-06-13 07:38:31 -04001735 }
1736
1737 ASSERT(uLength == cbNdisBodySize);
1738
1739 if ((bNeedEncryption == TRUE) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
1740
1741 ///////////////////////////////////////////////////////////////////
1742
1743 if (pDevice->sMgmtObj.eAuthenMode == WMAC_AUTH_WPANONE) {
1744 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
1745 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
1746 }
1747 else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
1748 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
1749 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
1750 }
1751 else {
1752 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[24]);
1753 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[28]);
1754 }
1755 // DO Software Michael
1756 MIC_vInit(dwMICKey0, dwMICKey1);
1757 MIC_vAppend((PBYTE)&(psEthHeader->abyDstAddr[0]), 12);
1758 dwMIC_Priority = 0;
1759 MIC_vAppend((PBYTE)&dwMIC_Priority, 4);
1760 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
1761
1762 ///////////////////////////////////////////////////////////////////
1763
1764 //DBG_PRN_GRP12(("Length:%d, %d\n", cbFrameBodySize, uFromHDtoPLDLength));
1765 //for (ii = 0; ii < cbFrameBodySize; ii++) {
1766 // DBG_PRN_GRP12(("%02x ", *((PBYTE)((pbyPayloadHead + cb802_1_H_len) + ii))));
1767 //}
1768 //DBG_PRN_GRP12(("\n\n\n"));
1769
1770 MIC_vAppend(pbyPayloadHead, cbFrameBodySize);
1771
1772 pdwMIC_L = (PDWORD)(pbyPayloadHead + cbFrameBodySize);
1773 pdwMIC_R = (PDWORD)(pbyPayloadHead + cbFrameBodySize + 4);
1774
1775 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
1776 MIC_vUnInit();
1777
1778 if (pDevice->bTxMICFail == TRUE) {
1779 *pdwMIC_L = 0;
1780 *pdwMIC_R = 0;
1781 pDevice->bTxMICFail = FALSE;
1782 }
1783 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
1784 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderLength, uPadding, cbIVlen);
1785 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
1786 }
1787
1788
1789 if (bSoftWEP == TRUE) {
1790
1791 s_vSWencryption(pDevice, pTransmitKey, (pbyPayloadHead), (WORD)(cbFrameBodySize + cbMIClen));
1792
1793 } else if ( ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) && (bNeedEncryption == TRUE)) ||
1794 ((pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) && (bNeedEncryption == TRUE)) ||
1795 ((pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) && (bNeedEncryption == TRUE)) ) {
1796 cbFrameSize -= cbICVlen;
1797 }
1798
1799 if (pDevice->bSoftwareGenCrcErr == TRUE) {
Andres Morecc856e62010-05-17 21:34:01 -03001800 unsigned int cbLen;
Forest Bond92b96792009-06-13 07:38:31 -04001801 PDWORD pdwCRC;
1802
1803 dwCRC = 0xFFFFFFFFL;
1804 cbLen = cbFrameSize - cbFCSlen;
1805 // calculate CRC, and wrtie CRC value to end of TD
1806 dwCRC = CRCdwGetCrc32Ex(pbyMacHdr, cbLen, dwCRC);
1807 pdwCRC = (PDWORD)(pbyMacHdr + cbLen);
1808 // finally, we must invert dwCRC to get the correct answer
1809 *pdwCRC = ~dwCRC;
1810 // Force Error
1811 *pdwCRC -= 1;
1812 } else {
1813 cbFrameSize -= cbFCSlen;
1814 }
1815
1816 *pcbHeaderLen = cbHeaderLength;
1817 *pcbTotalLen = cbHeaderLength + cbFrameSize ;
1818
1819
1820 //Set FragCtl in TxBufferHead
1821 pTxBufHead->wFragCtl |= (WORD)byFragType;
1822
1823
1824 return TRUE;
1825
1826}
1827
1828
1829/*+
1830 *
1831 * Description:
1832 * Translate 802.3 to 802.11 header
1833 *
1834 * Parameters:
1835 * In:
1836 * pDevice - Pointer to adpater
1837 * dwTxBufferAddr - Transmit Buffer
1838 * pPacket - Packet from upper layer
1839 * cbPacketSize - Transmit Data Length
1840 * Out:
1841 * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
1842 * pcbAppendPayload - size of append payload for 802.1H translation
1843 *
1844 * Return Value: none
1845 *
1846-*/
1847
Andres More8611a292010-05-01 14:25:00 -03001848void
Forest Bond92b96792009-06-13 07:38:31 -04001849s_vGenerateMACHeader (
Andres More592ccfe2010-04-17 12:07:42 -03001850 PSDevice pDevice,
1851 PBYTE pbyBufferAddr,
1852 WORD wDuration,
1853 PSEthernetHeader psEthHeader,
1854 BOOL bNeedEncrypt,
1855 WORD wFragType,
Andres Morecc856e62010-05-17 21:34:01 -03001856 unsigned int uDMAIdx,
1857 unsigned int uFragIdx
Forest Bond92b96792009-06-13 07:38:31 -04001858 )
1859{
1860 PS802_11Header pMACHeader = (PS802_11Header)pbyBufferAddr;
1861
Jim Lieb3e362592009-08-12 14:54:11 -07001862 memset(pMACHeader, 0, (sizeof(S802_11Header))); //- sizeof(pMACHeader->dwIV)));
Forest Bond92b96792009-06-13 07:38:31 -04001863
1864 if (uDMAIdx == TYPE_ATIMDMA) {
1865 pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
1866 } else {
1867 pMACHeader->wFrameCtl = TYPE_802_11_DATA;
1868 }
1869
1870 if (pDevice->eOPMode == OP_MODE_AP) {
Andres More9a0e7562010-04-13 21:54:48 -03001871 memcpy(&(pMACHeader->abyAddr1[0]),
1872 &(psEthHeader->abyDstAddr[0]),
1873 ETH_ALEN);
1874 memcpy(&(pMACHeader->abyAddr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
1875 memcpy(&(pMACHeader->abyAddr3[0]),
1876 &(psEthHeader->abySrcAddr[0]),
1877 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001878 pMACHeader->wFrameCtl |= FC_FROMDS;
Andres More9a0e7562010-04-13 21:54:48 -03001879 } else {
1880 if (pDevice->eOPMode == OP_MODE_ADHOC) {
1881 memcpy(&(pMACHeader->abyAddr1[0]),
1882 &(psEthHeader->abyDstAddr[0]),
1883 ETH_ALEN);
1884 memcpy(&(pMACHeader->abyAddr2[0]),
1885 &(psEthHeader->abySrcAddr[0]),
1886 ETH_ALEN);
1887 memcpy(&(pMACHeader->abyAddr3[0]),
1888 &(pDevice->abyBSSID[0]),
1889 ETH_ALEN);
1890 } else {
1891 memcpy(&(pMACHeader->abyAddr3[0]),
1892 &(psEthHeader->abyDstAddr[0]),
1893 ETH_ALEN);
1894 memcpy(&(pMACHeader->abyAddr2[0]),
1895 &(psEthHeader->abySrcAddr[0]),
1896 ETH_ALEN);
1897 memcpy(&(pMACHeader->abyAddr1[0]),
1898 &(pDevice->abyBSSID[0]),
1899 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04001900 pMACHeader->wFrameCtl |= FC_TODS;
1901 }
1902 }
1903
1904 if (bNeedEncrypt)
1905 pMACHeader->wFrameCtl |= cpu_to_le16((WORD)WLAN_SET_FC_ISWEP(1));
1906
1907 pMACHeader->wDurationID = cpu_to_le16(wDuration);
1908
1909 if (pDevice->bLongHeader) {
1910 PWLAN_80211HDR_A4 pMACA4Header = (PWLAN_80211HDR_A4) pbyBufferAddr;
1911 pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
Jim Lieb3e362592009-08-12 14:54:11 -07001912 memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
Forest Bond92b96792009-06-13 07:38:31 -04001913 }
1914 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
1915
1916 //Set FragNumber in Sequence Control
1917 pMACHeader->wSeqCtl |= cpu_to_le16((WORD)uFragIdx);
1918
1919 if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
1920 pDevice->wSeqCounter++;
1921 if (pDevice->wSeqCounter > 0x0fff)
1922 pDevice->wSeqCounter = 0;
1923 }
1924
1925 if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) { //StartFrag or MidFrag
1926 pMACHeader->wFrameCtl |= FC_MOREFRAG;
1927 }
1928}
1929
1930
1931
1932/*+
1933 *
1934 * Description:
1935 * Request instructs a MAC to transmit a 802.11 management packet through
1936 * the adapter onto the medium.
1937 *
1938 * Parameters:
1939 * In:
1940 * hDeviceContext - Pointer to the adapter
1941 * pPacket - A pointer to a descriptor for the packet to transmit
1942 * Out:
1943 * none
1944 *
1945 * Return Value: CMD_STATUS_PENDING if MAC Tx resource avaliable; otherwise FALSE
1946 *
1947-*/
1948
1949CMD_STATUS csMgmt_xmit(
Andres More592ccfe2010-04-17 12:07:42 -03001950 PSDevice pDevice,
1951 PSTxMgmtPacket pPacket
Forest Bond92b96792009-06-13 07:38:31 -04001952 )
1953{
1954 BYTE byPktType;
1955 PBYTE pbyTxBufferAddr;
Andres More8611a292010-05-01 14:25:00 -03001956 void *pvRTS;
Forest Bond92b96792009-06-13 07:38:31 -04001957 PSCTS pCTS;
Andres More8611a292010-05-01 14:25:00 -03001958 void *pvTxDataHd;
Andres Morecc856e62010-05-17 21:34:01 -03001959 unsigned int uDuration;
1960 unsigned int cbReqCount;
Forest Bond92b96792009-06-13 07:38:31 -04001961 PS802_11Header pMACHeader;
Andres Morecc856e62010-05-17 21:34:01 -03001962 unsigned int cbHeaderSize;
1963 unsigned int cbFrameBodySize;
Forest Bond92b96792009-06-13 07:38:31 -04001964 BOOL bNeedACK;
1965 BOOL bIsPSPOLL = FALSE;
1966 PSTxBufHead pTxBufHead;
Andres Morecc856e62010-05-17 21:34:01 -03001967 unsigned int cbFrameSize;
1968 unsigned int cbIVlen = 0;
1969 unsigned int cbICVlen = 0;
1970 unsigned int cbMIClen = 0;
1971 unsigned int cbFCSlen = 4;
1972 unsigned int uPadding = 0;
Forest Bond92b96792009-06-13 07:38:31 -04001973 WORD wTxBufSize;
Andres Morecc856e62010-05-17 21:34:01 -03001974 unsigned int cbMacHdLen;
Forest Bond92b96792009-06-13 07:38:31 -04001975 SEthernetHeader sEthHeader;
Andres More8611a292010-05-01 14:25:00 -03001976 void *pvRrvTime;
1977 void *pMICHDR;
Forest Bond92b96792009-06-13 07:38:31 -04001978 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1979 WORD wCurrentRate = RATE_1M;
1980 PTX_BUFFER pTX_Buffer;
1981 PUSB_SEND_CONTEXT pContext;
1982
1983
1984
1985 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
1986
1987 if (NULL == pContext) {
1988 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n");
1989 return CMD_STATUS_RESOURCES;
1990 }
1991
1992 pTX_Buffer = (PTX_BUFFER) (&pContext->Data[0]);
1993 pbyTxBufferAddr = (PBYTE)&(pTX_Buffer->adwTxKey[0]);
1994 cbFrameBodySize = pPacket->cbPayloadLen;
1995 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
1996 wTxBufSize = sizeof(STxBufHead);
1997 memset(pTxBufHead, 0, wTxBufSize);
1998
1999 if (pDevice->byBBType == BB_TYPE_11A) {
2000 wCurrentRate = RATE_6M;
2001 byPktType = PK_TYPE_11A;
2002 } else {
2003 wCurrentRate = RATE_1M;
2004 byPktType = PK_TYPE_11B;
2005 }
2006
2007 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2008 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2009 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2010 // to set power here.
2011 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
2012 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2013 } else {
2014 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2015 }
2016 pDevice->wCurrentRate = wCurrentRate;
2017
2018
2019 //Set packet type
2020 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2021 pTxBufHead->wFIFOCtl = 0;
2022 }
2023 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2024 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2025 }
2026 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2027 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2028 }
2029 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2030 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2031 }
2032
2033 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2034 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2035
2036
Andres More4b50fb42010-06-22 21:57:42 -03002037 if (is_multicast_ether_addr(&(pPacket->p80211Header->sA3.abyAddr1[0])) ||
2038 is_broadcast_ether_addr(&(pPacket->p80211Header->sA3.abyAddr1[0]))) {
Forest Bond92b96792009-06-13 07:38:31 -04002039 bNeedACK = FALSE;
2040 }
2041 else {
2042 bNeedACK = TRUE;
2043 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2044 };
2045
2046 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2047 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
2048
2049 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2050 //Set Preamble type always long
2051 //pDevice->byPreambleType = PREAMBLE_LONG;
2052 // probe-response don't retry
2053 //if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2054 // bNeedACK = FALSE;
2055 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2056 //}
2057 }
2058
2059 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2060
2061 if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2062 bIsPSPOLL = TRUE;
2063 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2064 } else {
2065 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2066 }
2067
2068 //Set FRAGCTL_MACHDCNT
2069 pTxBufHead->wFragCtl |= cpu_to_le16((WORD)(cbMacHdLen << 10));
2070
2071 // Notes:
2072 // Although spec says MMPDU can be fragmented; In most case,
2073 // no one will send a MMPDU under fragmentation. With RTS may occur.
2074 pDevice->bAES = FALSE; //Set FRAGCTL_WEPTYP
2075
2076 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2077 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2078 cbIVlen = 4;
2079 cbICVlen = 4;
2080 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2081 }
2082 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2083 cbIVlen = 8;//IV+ExtIV
2084 cbMIClen = 8;
2085 cbICVlen = 4;
2086 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2087 //We need to get seed here for filling TxKey entry.
2088 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2089 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2090 }
2091 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2092 cbIVlen = 8;//RSN Header
2093 cbICVlen = 8;//MIC
2094 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2095 pDevice->bAES = TRUE;
2096 }
2097 //MAC Header should be padding 0 to DW alignment.
2098 uPadding = 4 - (cbMacHdLen%4);
2099 uPadding %= 4;
2100 }
2101
2102 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
2103
2104 //Set FIFOCTL_GrpAckPolicy
2105 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
2106 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2107 }
2108 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2109
2110 //Set RrvTime/RTS/CTS Buffer
2111 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2112
2113 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2114 pMICHDR = NULL;
2115 pvRTS = NULL;
2116 pCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2117 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS));
2118 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS) + sizeof(STxDataHead_g);
2119 }
2120 else { // 802.11a/b packet
2121 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2122 pMICHDR = NULL;
2123 pvRTS = NULL;
2124 pCTS = NULL;
2125 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2126 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + sizeof(STxDataHead_ab);
2127 }
2128
Andres More8611a292010-05-01 14:25:00 -03002129 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0,
2130 (cbHeaderSize - wTxBufSize));
Forest Bond92b96792009-06-13 07:38:31 -04002131
Andres More9a0e7562010-04-13 21:54:48 -03002132 memcpy(&(sEthHeader.abyDstAddr[0]),
2133 &(pPacket->p80211Header->sA3.abyAddr1[0]),
2134 ETH_ALEN);
2135 memcpy(&(sEthHeader.abySrcAddr[0]),
2136 &(pPacket->p80211Header->sA3.abyAddr2[0]),
2137 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04002138 //=========================
2139 // No Fragmentation
2140 //=========================
2141 pTxBufHead->wFragCtl |= (WORD)FRAGCTL_NONFRAG;
2142
2143
2144 //Fill FIFO,RrvTime,RTS,and CTS
2145 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
2146 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader);
2147
2148 //Fill DataHead
2149 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2150 0, 0, 1, AUTO_FB_NONE);
2151
2152 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2153
2154 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
2155
2156 if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
2157 PBYTE pbyIVHead;
2158 PBYTE pbyPayloadHead;
2159 PBYTE pbyBSSID;
2160 PSKeyItem pTransmitKey = NULL;
2161
2162 pbyIVHead = (PBYTE)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
2163 pbyPayloadHead = (PBYTE)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
2164 do {
2165 if ((pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) &&
2166 (pDevice->bLinkPass == TRUE)) {
2167 pbyBSSID = pDevice->abyBSSID;
2168 // get pairwise key
2169 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) {
2170 // get group key
2171 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) {
2172 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
2173 break;
2174 }
2175 } else {
2176 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get PTK.\n");
2177 break;
2178 }
2179 }
2180 // get group key
2181 pbyBSSID = pDevice->abyBroadcastAddr;
2182 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
2183 pTransmitKey = NULL;
2184 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KEY is NULL. OP Mode[%d]\n", pDevice->eOPMode);
2185 } else {
2186 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
2187 }
2188 } while(FALSE);
2189 //Fill TXKEY
2190 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2191 (PBYTE)pMACHeader, (WORD)cbFrameBodySize, NULL);
2192
Jim Lieb3e362592009-08-12 14:54:11 -07002193 memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
2194 memcpy(pbyPayloadHead, ((PBYTE)(pPacket->p80211Header) + cbMacHdLen),
Forest Bond92b96792009-06-13 07:38:31 -04002195 cbFrameBodySize);
2196 }
2197 else {
2198 // Copy the Packet into a tx Buffer
Jim Lieb3e362592009-08-12 14:54:11 -07002199 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
Forest Bond92b96792009-06-13 07:38:31 -04002200 }
2201
2202 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2203 pDevice->wSeqCounter++ ;
2204 if (pDevice->wSeqCounter > 0x0fff)
2205 pDevice->wSeqCounter = 0;
2206
2207 if (bIsPSPOLL) {
2208 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2209 // of FIFO control header.
2210 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2211 // in the same place of other packet's Duration-field).
2212 // And it will cause Cisco-AP to issue Disassociation-packet
2213 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2214 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2215 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2216 } else {
2217 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
2218 }
2219 }
2220
2221
2222 pTX_Buffer->wTxByteCount = cpu_to_le16((WORD)(cbReqCount));
2223 pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2224 pTX_Buffer->byType = 0x00;
2225
2226 pContext->pPacket = NULL;
2227 pContext->Type = CONTEXT_MGMT_PACKET;
2228 pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
2229
2230 if (WLAN_GET_FC_TODS(pMACHeader->wFrameCtl) == 0) {
2231 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr1[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2232 }
2233 else {
2234 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr3[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2235 }
2236
2237 PIPEnsSendBulkOut(pDevice,pContext);
2238 return CMD_STATUS_PENDING;
2239}
2240
2241
2242CMD_STATUS
2243csBeacon_xmit(
Andres More592ccfe2010-04-17 12:07:42 -03002244 PSDevice pDevice,
2245 PSTxMgmtPacket pPacket
Forest Bond92b96792009-06-13 07:38:31 -04002246 )
2247{
2248
Andres Morecc856e62010-05-17 21:34:01 -03002249 unsigned int cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
2250 unsigned int cbHeaderSize = 0;
Forest Bond92b96792009-06-13 07:38:31 -04002251 WORD wTxBufSize = sizeof(STxShortBufHead);
2252 PSTxShortBufHead pTxBufHead;
2253 PS802_11Header pMACHeader;
2254 PSTxDataHead_ab pTxDataHead;
2255 WORD wCurrentRate;
Andres Morecc856e62010-05-17 21:34:01 -03002256 unsigned int cbFrameBodySize;
2257 unsigned int cbReqCount;
Forest Bond92b96792009-06-13 07:38:31 -04002258 PBEACON_BUFFER pTX_Buffer;
2259 PBYTE pbyTxBufferAddr;
2260 PUSB_SEND_CONTEXT pContext;
2261 CMD_STATUS status;
2262
2263
2264 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2265 if (NULL == pContext) {
2266 status = CMD_STATUS_RESOURCES;
2267 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n");
2268 return status ;
2269 }
2270 pTX_Buffer = (PBEACON_BUFFER) (&pContext->Data[0]);
2271 pbyTxBufferAddr = (PBYTE)&(pTX_Buffer->wFIFOCtl);
2272
2273 cbFrameBodySize = pPacket->cbPayloadLen;
2274
2275 pTxBufHead = (PSTxShortBufHead) pbyTxBufferAddr;
2276 wTxBufSize = sizeof(STxShortBufHead);
2277 memset(pTxBufHead, 0, wTxBufSize);
2278
2279 if (pDevice->byBBType == BB_TYPE_11A) {
2280 wCurrentRate = RATE_6M;
2281 pTxDataHead = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize);
2282 //Get SignalField,ServiceField,Length
2283 BBvCaculateParameter(pDevice, cbFrameSize, wCurrentRate, PK_TYPE_11A,
2284 (PWORD)&(pTxDataHead->wTransmitLength), (PBYTE)&(pTxDataHead->byServiceField), (PBYTE)&(pTxDataHead->bySignalField)
2285 );
2286 //Get Duration and TimeStampOff
2287 pTxDataHead->wDuration = cpu_to_le16((WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameSize, PK_TYPE_11A,
2288 wCurrentRate, FALSE, 0, 0, 1, AUTO_FB_NONE));
2289 pTxDataHead->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
2290 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2291 } else {
2292 wCurrentRate = RATE_1M;
2293 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2294 pTxDataHead = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize);
2295 //Get SignalField,ServiceField,Length
2296 BBvCaculateParameter(pDevice, cbFrameSize, wCurrentRate, PK_TYPE_11B,
2297 (PWORD)&(pTxDataHead->wTransmitLength), (PBYTE)&(pTxDataHead->byServiceField), (PBYTE)&(pTxDataHead->bySignalField)
2298 );
2299 //Get Duration and TimeStampOff
2300 pTxDataHead->wDuration = cpu_to_le16((WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameSize, PK_TYPE_11B,
2301 wCurrentRate, FALSE, 0, 0, 1, AUTO_FB_NONE));
2302 pTxDataHead->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
2303 cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
2304 }
2305
2306 //Generate Beacon Header
2307 pMACHeader = (PS802_11Header)(pbyTxBufferAddr + cbHeaderSize);
Jim Lieb3e362592009-08-12 14:54:11 -07002308 memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
Forest Bond92b96792009-06-13 07:38:31 -04002309
2310 pMACHeader->wDurationID = 0;
2311 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2312 pDevice->wSeqCounter++ ;
2313 if (pDevice->wSeqCounter > 0x0fff)
2314 pDevice->wSeqCounter = 0;
2315
2316 cbReqCount = cbHeaderSize + WLAN_HDR_ADDR3_LEN + cbFrameBodySize;
2317
2318 pTX_Buffer->wTxByteCount = (WORD)cbReqCount;
2319 pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2320 pTX_Buffer->byType = 0x01;
2321
2322 pContext->pPacket = NULL;
2323 pContext->Type = CONTEXT_MGMT_PACKET;
2324 pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
2325
2326 PIPEnsSendBulkOut(pDevice,pContext);
2327 return CMD_STATUS_PENDING;
2328
2329}
2330
2331
2332
2333
2334
Andres More8611a292010-05-01 14:25:00 -03002335void
Forest Bond92b96792009-06-13 07:38:31 -04002336vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb) {
2337
2338 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
2339 BYTE byPktType;
2340 PBYTE pbyTxBufferAddr;
Andres More8611a292010-05-01 14:25:00 -03002341 void *pvRTS;
2342 void *pvCTS;
2343 void *pvTxDataHd;
Andres Morecc856e62010-05-17 21:34:01 -03002344 unsigned int uDuration;
2345 unsigned int cbReqCount;
Forest Bond92b96792009-06-13 07:38:31 -04002346 PS802_11Header pMACHeader;
Andres Morecc856e62010-05-17 21:34:01 -03002347 unsigned int cbHeaderSize;
2348 unsigned int cbFrameBodySize;
Forest Bond92b96792009-06-13 07:38:31 -04002349 BOOL bNeedACK;
2350 BOOL bIsPSPOLL = FALSE;
2351 PSTxBufHead pTxBufHead;
Andres Morecc856e62010-05-17 21:34:01 -03002352 unsigned int cbFrameSize;
2353 unsigned int cbIVlen = 0;
2354 unsigned int cbICVlen = 0;
2355 unsigned int cbMIClen = 0;
2356 unsigned int cbFCSlen = 4;
2357 unsigned int uPadding = 0;
2358 unsigned int cbMICHDR = 0;
2359 unsigned int uLength = 0;
Forest Bond92b96792009-06-13 07:38:31 -04002360 DWORD dwMICKey0, dwMICKey1;
2361 DWORD dwMIC_Priority;
2362 PDWORD pdwMIC_L;
2363 PDWORD pdwMIC_R;
2364 WORD wTxBufSize;
Andres Morecc856e62010-05-17 21:34:01 -03002365 unsigned int cbMacHdLen;
Forest Bond92b96792009-06-13 07:38:31 -04002366 SEthernetHeader sEthHeader;
Andres More8611a292010-05-01 14:25:00 -03002367 void *pvRrvTime;
2368 void *pMICHDR;
Forest Bond92b96792009-06-13 07:38:31 -04002369 WORD wCurrentRate = RATE_1M;
2370 PUWLAN_80211HDR p80211Header;
Andres Morecc856e62010-05-17 21:34:01 -03002371 unsigned int uNodeIndex = 0;
Forest Bond92b96792009-06-13 07:38:31 -04002372 BOOL bNodeExist = FALSE;
2373 SKeyItem STempKey;
2374 PSKeyItem pTransmitKey = NULL;
2375 PBYTE pbyIVHead;
2376 PBYTE pbyPayloadHead;
2377 PBYTE pbyMacHdr;
Andres Morecc856e62010-05-17 21:34:01 -03002378 unsigned int cbExtSuppRate = 0;
Forest Bond92b96792009-06-13 07:38:31 -04002379 PTX_BUFFER pTX_Buffer;
2380 PUSB_SEND_CONTEXT pContext;
2381// PWLAN_IE pItem;
2382
2383
2384 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
2385
2386 if(skb->len <= WLAN_HDR_ADDR3_LEN) {
2387 cbFrameBodySize = 0;
2388 }
2389 else {
2390 cbFrameBodySize = skb->len - WLAN_HDR_ADDR3_LEN;
2391 }
2392 p80211Header = (PUWLAN_80211HDR)skb->data;
2393
2394 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2395
2396 if (NULL == pContext) {
2397 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0 TX...NO CONTEXT!\n");
2398 dev_kfree_skb_irq(skb);
2399 return ;
2400 }
2401
2402 pTX_Buffer = (PTX_BUFFER)(&pContext->Data[0]);
2403 pbyTxBufferAddr = (PBYTE)(&pTX_Buffer->adwTxKey[0]);
2404 pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
2405 wTxBufSize = sizeof(STxBufHead);
2406 memset(pTxBufHead, 0, wTxBufSize);
2407
2408 if (pDevice->byBBType == BB_TYPE_11A) {
2409 wCurrentRate = RATE_6M;
2410 byPktType = PK_TYPE_11A;
2411 } else {
2412 wCurrentRate = RATE_1M;
2413 byPktType = PK_TYPE_11B;
2414 }
2415
2416 // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
2417 // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
2418 // And cmd timer will wait data pkt TX finish before scanning so it's OK
2419 // to set power here.
2420 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
2421 RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
2422 } else {
2423 RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
2424 }
2425
2426 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x \n", p80211Header->sA3.wFrameCtl);
2427
2428 //Set packet type
2429 if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
2430 pTxBufHead->wFIFOCtl = 0;
2431 }
2432 else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
2433 pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
2434 }
2435 else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
2436 pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
2437 }
2438 else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
2439 pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
2440 }
2441
2442 pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
2443 pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
2444
2445
Andres More4b50fb42010-06-22 21:57:42 -03002446 if (is_multicast_ether_addr(&(p80211Header->sA3.abyAddr1[0])) ||
2447 is_broadcast_ether_addr(&(p80211Header->sA3.abyAddr1[0]))) {
Forest Bond92b96792009-06-13 07:38:31 -04002448 bNeedACK = FALSE;
2449 if (pDevice->bEnableHostWEP) {
2450 uNodeIndex = 0;
2451 bNodeExist = TRUE;
2452 };
2453 }
2454 else {
2455 if (pDevice->bEnableHostWEP) {
2456 if (BSSbIsSTAInNodeDB(pDevice, (PBYTE)(p80211Header->sA3.abyAddr1), &uNodeIndex))
2457 bNodeExist = TRUE;
2458 };
2459 bNeedACK = TRUE;
2460 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
2461 };
2462
2463 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
2464 (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
2465
2466 pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
2467 //Set Preamble type always long
2468 //pDevice->byPreambleType = PREAMBLE_LONG;
2469
2470 // probe-response don't retry
2471 //if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
2472 // bNeedACK = FALSE;
2473 // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
2474 //}
2475 }
2476
2477 pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
2478
2479 if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
2480 bIsPSPOLL = TRUE;
2481 cbMacHdLen = WLAN_HDR_ADDR2_LEN;
2482 } else {
2483 cbMacHdLen = WLAN_HDR_ADDR3_LEN;
2484 }
2485
2486 // hostapd deamon ext support rate patch
2487 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2488
2489 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0) {
2490 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
2491 }
2492
2493 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0) {
2494 cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
2495 }
2496
2497 if (cbExtSuppRate >0) {
2498 cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
2499 }
2500 }
2501
2502
2503 //Set FRAGCTL_MACHDCNT
2504 pTxBufHead->wFragCtl |= cpu_to_le16((WORD)cbMacHdLen << 10);
2505
2506 // Notes:
2507 // Although spec says MMPDU can be fragmented; In most case,
2508 // no one will send a MMPDU under fragmentation. With RTS may occur.
2509 pDevice->bAES = FALSE; //Set FRAGCTL_WEPTYP
2510
2511
2512 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2513 if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
2514 cbIVlen = 4;
2515 cbICVlen = 4;
2516 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
2517 }
2518 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
2519 cbIVlen = 8;//IV+ExtIV
2520 cbMIClen = 8;
2521 cbICVlen = 4;
2522 pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
2523 //We need to get seed here for filling TxKey entry.
2524 //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
2525 // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
2526 }
2527 else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
2528 cbIVlen = 8;//RSN Header
2529 cbICVlen = 8;//MIC
2530 cbMICHDR = sizeof(SMICHDRHead);
2531 pTxBufHead->wFragCtl |= FRAGCTL_AES;
2532 pDevice->bAES = TRUE;
2533 }
2534 //MAC Header should be padding 0 to DW alignment.
2535 uPadding = 4 - (cbMacHdLen%4);
2536 uPadding %= 4;
2537 }
2538
2539 cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
2540
2541 //Set FIFOCTL_GrpAckPolicy
2542 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
2543 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
2544 }
2545 //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
2546
2547
2548 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
2549
2550 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
2551 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
2552 pvRTS = NULL;
2553 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
2554 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
2555 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
2556
2557 }
2558 else {//802.11a/b packet
2559
2560 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
2561 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
2562 pvRTS = NULL;
2563 pvCTS = NULL;
2564 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
2565 cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
2566 }
Andres More8611a292010-05-01 14:25:00 -03002567 memset((void *)(pbyTxBufferAddr + wTxBufSize), 0,
2568 (cbHeaderSize - wTxBufSize));
Andres More9a0e7562010-04-13 21:54:48 -03002569 memcpy(&(sEthHeader.abyDstAddr[0]),
2570 &(p80211Header->sA3.abyAddr1[0]),
2571 ETH_ALEN);
2572 memcpy(&(sEthHeader.abySrcAddr[0]),
2573 &(p80211Header->sA3.abyAddr2[0]),
2574 ETH_ALEN);
Forest Bond92b96792009-06-13 07:38:31 -04002575 //=========================
2576 // No Fragmentation
2577 //=========================
2578 pTxBufHead->wFragCtl |= (WORD)FRAGCTL_NONFRAG;
2579
2580
2581 //Fill FIFO,RrvTime,RTS,and CTS
2582 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
2583 cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader);
2584
2585 //Fill DataHead
2586 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
2587 0, 0, 1, AUTO_FB_NONE);
2588
2589 pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
2590
2591 cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
2592
2593 pbyMacHdr = (PBYTE)(pbyTxBufferAddr + cbHeaderSize);
2594 pbyPayloadHead = (PBYTE)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
2595 pbyIVHead = (PBYTE)(pbyMacHdr + cbMacHdLen + uPadding);
2596
2597 // Copy the Packet into a tx Buffer
2598 memcpy(pbyMacHdr, skb->data, cbMacHdLen);
2599
2600 // version set to 0, patch for hostapd deamon
2601 pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
2602 memcpy(pbyPayloadHead, (skb->data + cbMacHdLen), cbFrameBodySize);
2603
2604 // replace support rate, patch for hostapd deamon( only support 11M)
2605 if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
2606 if (cbExtSuppRate != 0) {
2607 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
2608 memcpy((pbyPayloadHead + cbFrameBodySize),
2609 pMgmt->abyCurrSuppRates,
2610 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
2611 );
2612 if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
2613 memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
2614 pMgmt->abyCurrExtSuppRates,
2615 ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
2616 );
2617 }
2618 }
2619
2620 // Set wep
2621 if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
2622
2623 if (pDevice->bEnableHostWEP) {
2624 pTransmitKey = &STempKey;
2625 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2626 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2627 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2628 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2629 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2630 memcpy(pTransmitKey->abyKey,
2631 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2632 pTransmitKey->uKeyLength
2633 );
2634 }
2635
2636 if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
2637
2638 dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
2639 dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
2640
2641 // DO Software Michael
2642 MIC_vInit(dwMICKey0, dwMICKey1);
2643 MIC_vAppend((PBYTE)&(sEthHeader.abyDstAddr[0]), 12);
2644 dwMIC_Priority = 0;
2645 MIC_vAppend((PBYTE)&dwMIC_Priority, 4);
2646 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0_tx_8021:MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
2647
2648 uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
2649
2650 MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
2651
2652 pdwMIC_L = (PDWORD)(pbyTxBufferAddr + uLength + cbFrameBodySize);
2653 pdwMIC_R = (PDWORD)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
2654
2655 MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
2656 MIC_vUnInit();
2657
2658 if (pDevice->bTxMICFail == TRUE) {
2659 *pdwMIC_L = 0;
2660 *pdwMIC_R = 0;
2661 pDevice->bTxMICFail = FALSE;
2662 }
2663
2664 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
2665 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderSize, uPadding, cbIVlen);
2666 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lx, %lx\n", *pdwMIC_L, *pdwMIC_R);
2667
2668 }
2669
2670 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
2671 pbyMacHdr, (WORD)cbFrameBodySize, (PBYTE)pMICHDR);
2672
2673 if (pDevice->bEnableHostWEP) {
2674 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
2675 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
2676 }
2677
2678 if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
2679 s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (WORD)(cbFrameBodySize + cbMIClen));
2680 }
2681 }
2682
2683 pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
2684 pDevice->wSeqCounter++ ;
2685 if (pDevice->wSeqCounter > 0x0fff)
2686 pDevice->wSeqCounter = 0;
2687
2688
2689 if (bIsPSPOLL) {
2690 // The MAC will automatically replace the Duration-field of MAC header by Duration-field
2691 // of FIFO control header.
2692 // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
2693 // in the same place of other packet's Duration-field).
2694 // And it will cause Cisco-AP to issue Disassociation-packet
2695 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
2696 ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
2697 ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
2698 } else {
2699 ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(p80211Header->sA2.wDurationID);
2700 }
2701 }
2702
2703 pTX_Buffer->wTxByteCount = cpu_to_le16((WORD)(cbReqCount));
2704 pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
2705 pTX_Buffer->byType = 0x00;
2706
2707 pContext->pPacket = skb;
2708 pContext->Type = CONTEXT_MGMT_PACKET;
2709 pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
2710
2711 if (WLAN_GET_FC_TODS(pMACHeader->wFrameCtl) == 0) {
2712 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr1[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2713 }
2714 else {
2715 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr3[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
2716 }
2717 PIPEnsSendBulkOut(pDevice,pContext);
2718 return ;
2719
2720}
2721
2722
2723
2724
2725//TYPE_AC0DMA data tx
2726/*
2727 * Description:
2728 * Tx packet via AC0DMA(DMA1)
2729 *
2730 * Parameters:
2731 * In:
2732 * pDevice - Pointer to the adapter
2733 * skb - Pointer to tx skb packet
2734 * Out:
2735 * void
2736 *
2737 * Return Value: NULL
2738 */
2739
2740
2741
2742NTSTATUS
2743nsDMA_tx_packet(
Andres More592ccfe2010-04-17 12:07:42 -03002744 PSDevice pDevice,
Andres Morecc856e62010-05-17 21:34:01 -03002745 unsigned int uDMAIdx,
Andres More592ccfe2010-04-17 12:07:42 -03002746 struct sk_buff *skb
Forest Bond92b96792009-06-13 07:38:31 -04002747 )
2748{
2749 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
Andres Morecc856e62010-05-17 21:34:01 -03002750 unsigned int BytesToWrite = 0, uHeaderLen = 0;
2751 unsigned int uNodeIndex = 0;
Forest Bond92b96792009-06-13 07:38:31 -04002752 BYTE byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
2753 WORD wAID;
2754 BYTE byPktType;
2755 BOOL bNeedEncryption = FALSE;
2756 PSKeyItem pTransmitKey = NULL;
2757 SKeyItem STempKey;
Andres Morecc856e62010-05-17 21:34:01 -03002758 unsigned int ii;
Forest Bond92b96792009-06-13 07:38:31 -04002759 BOOL bTKIP_UseGTK = FALSE;
2760 BOOL bNeedDeAuth = FALSE;
2761 PBYTE pbyBSSID;
2762 BOOL bNodeExist = FALSE;
2763 PUSB_SEND_CONTEXT pContext;
2764 BOOL fConvertedPacket;
2765 PTX_BUFFER pTX_Buffer;
Andres Morecc856e62010-05-17 21:34:01 -03002766 unsigned int status;
Forest Bond92b96792009-06-13 07:38:31 -04002767 WORD wKeepRate = pDevice->wCurrentRate;
2768 struct net_device_stats* pStats = &pDevice->stats;
2769//#ifdef WPA_SM_Transtatus
2770 // extern SWPAResult wpa_Result;
2771//#endif
2772 BOOL bTxeapol_key = FALSE;
2773
2774
2775 if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
2776
2777 if (pDevice->uAssocCount == 0) {
2778 dev_kfree_skb_irq(skb);
2779 return 0;
2780 }
2781
Andres More4b50fb42010-06-22 21:57:42 -03002782 if (is_multicast_ether_addr((PBYTE)(skb->data))) {
Forest Bond92b96792009-06-13 07:38:31 -04002783 uNodeIndex = 0;
2784 bNodeExist = TRUE;
2785 if (pMgmt->sNodeDBTable[0].bPSEnable) {
2786
2787 skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skb);
2788 pMgmt->sNodeDBTable[0].wEnQueueCnt++;
2789 // set tx map
2790 pMgmt->abyPSTxMap[0] |= byMask[0];
2791 return 0;
2792 }
2793 // muticast/broadcast data rate
2794
2795 if (pDevice->byBBType != BB_TYPE_11A)
2796 pDevice->wCurrentRate = RATE_2M;
2797 else
2798 pDevice->wCurrentRate = RATE_24M;
2799 // long preamble type
2800 pDevice->byPreambleType = PREAMBLE_SHORT;
2801
2802 }else {
2803
2804 if (BSSbIsSTAInNodeDB(pDevice, (PBYTE)(skb->data), &uNodeIndex)) {
2805
2806 if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
2807
2808 skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
2809
2810 pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
2811 // set tx map
2812 wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
2813 pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
2814 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set:pMgmt->abyPSTxMap[%d]= %d\n",
2815 (wAID >> 3), pMgmt->abyPSTxMap[wAID >> 3]);
2816
2817 return 0;
2818 }
2819 // AP rate decided from node
2820 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2821 // tx preamble decided from node
2822
2823 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2824 pDevice->byPreambleType = pDevice->byShortPreamble;
2825
2826 }else {
2827 pDevice->byPreambleType = PREAMBLE_LONG;
2828 }
2829 bNodeExist = TRUE;
2830 }
2831 }
2832
2833 if (bNodeExist == FALSE) {
2834 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Unknown STA not found in node DB \n");
2835 dev_kfree_skb_irq(skb);
2836 return 0;
2837 }
2838 }
2839
2840 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
2841
2842 if (pContext == NULL) {
2843 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG" pContext == NULL\n");
2844 dev_kfree_skb_irq(skb);
2845 return STATUS_RESOURCES;
2846 }
2847
Charles Clément21ec51f2010-05-18 10:08:14 -07002848 memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)(skb->data), ETH_HLEN);
Forest Bond92b96792009-06-13 07:38:31 -04002849
2850//mike add:station mode check eapol-key challenge--->
2851{
2852 BYTE Protocol_Version; //802.1x Authentication
2853 BYTE Packet_Type; //802.1x Authentication
2854 BYTE Descriptor_type;
2855 WORD Key_info;
2856
Charles Clément21ec51f2010-05-18 10:08:14 -07002857 Protocol_Version = skb->data[ETH_HLEN];
2858 Packet_Type = skb->data[ETH_HLEN+1];
2859 Descriptor_type = skb->data[ETH_HLEN+1+1+2];
2860 Key_info = (skb->data[ETH_HLEN+1+1+2+1] << 8)|(skb->data[ETH_HLEN+1+1+2+2]);
Forest Bond92b96792009-06-13 07:38:31 -04002861 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
2862 if(((Protocol_Version==1) ||(Protocol_Version==2)) &&
2863 (Packet_Type==3)) { //802.1x OR eapol-key challenge frame transfer
2864 bTxeapol_key = TRUE;
2865 if(!(Key_info & BIT3) && //WPA or RSN group-key challenge
2866 (Key_info & BIT8) && (Key_info & BIT9)) { //send 2/2 key
2867 if(Descriptor_type==254) {
2868 pDevice->fWPA_Authened = TRUE;
2869 PRINT_K("WPA ");
2870 }
2871 else {
2872 pDevice->fWPA_Authened = TRUE;
2873 PRINT_K("WPA2(re-keying) ");
2874 }
2875 PRINT_K("Authentication completed!!\n");
2876 }
2877 else if((Key_info & BIT3) && (Descriptor_type==2) && //RSN pairse-key challenge
2878 (Key_info & BIT8) && (Key_info & BIT9)) {
2879 pDevice->fWPA_Authened = TRUE;
2880 PRINT_K("WPA2 Authentication completed!!\n");
2881 }
2882 }
2883 }
2884}
2885//mike add:station mode check eapol-key challenge<---
2886
2887 if (pDevice->bEncryptionEnable == TRUE) {
2888 bNeedEncryption = TRUE;
2889 // get Transmit key
2890 do {
2891 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
2892 (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
2893 pbyBSSID = pDevice->abyBSSID;
2894 // get pairwise key
2895 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) {
2896 // get group key
2897 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) {
2898 bTKIP_UseGTK = TRUE;
2899 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2900 break;
2901 }
2902 } else {
2903 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get PTK.\n");
2904 break;
2905 }
2906 }else if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2907
2908 pbyBSSID = pDevice->sTxEthHeader.abyDstAddr; //TO_DS = 0 and FROM_DS = 0 --> 802.11 MAC Address1
2909 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS Serach Key: \n");
2910 for (ii = 0; ii< 6; ii++)
2911 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"%x \n", *(pbyBSSID+ii));
2912 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"\n");
2913
2914 // get pairwise key
2915 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == TRUE)
2916 break;
2917 }
2918 // get group key
2919 pbyBSSID = pDevice->abyBroadcastAddr;
2920 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
2921 pTransmitKey = NULL;
2922 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
2923 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode);
2924 }
2925 else
2926 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"NOT IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode);
2927 } else {
2928 bTKIP_UseGTK = TRUE;
2929 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
2930 }
2931 } while(FALSE);
2932 }
2933
2934 if (pDevice->bEnableHostWEP) {
2935 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"acdma0: STA index %d\n", uNodeIndex);
2936 if (pDevice->bEncryptionEnable == TRUE) {
2937 pTransmitKey = &STempKey;
2938 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
2939 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
2940 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
2941 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
2942 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
2943 memcpy(pTransmitKey->abyKey,
2944 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
2945 pTransmitKey->uKeyLength
2946 );
2947 }
2948 }
2949
2950 byPktType = (BYTE)pDevice->byPacketType;
2951
2952 if (pDevice->bFixRate) {
2953 if (pDevice->byBBType == BB_TYPE_11B) {
2954 if (pDevice->uConnectionRate >= RATE_11M) {
2955 pDevice->wCurrentRate = RATE_11M;
2956 } else {
2957 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
2958 }
2959 } else {
2960 if ((pDevice->byBBType == BB_TYPE_11A) &&
2961 (pDevice->uConnectionRate <= RATE_6M)) {
2962 pDevice->wCurrentRate = RATE_6M;
2963 } else {
2964 if (pDevice->uConnectionRate >= RATE_54M)
2965 pDevice->wCurrentRate = RATE_54M;
2966 else
2967 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
2968 }
2969 }
2970 }
2971 else {
2972 if (pDevice->eOPMode == OP_MODE_ADHOC) {
2973 // Adhoc Tx rate decided from node DB
Andres More4b50fb42010-06-22 21:57:42 -03002974 if (is_multicast_ether_addr(&(pDevice->sTxEthHeader.abyDstAddr[0]))) {
Forest Bond92b96792009-06-13 07:38:31 -04002975 // Multicast use highest data rate
2976 pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate;
2977 // preamble type
2978 pDevice->byPreambleType = pDevice->byShortPreamble;
2979 }
2980 else {
2981 if(BSSbIsSTAInNodeDB(pDevice, &(pDevice->sTxEthHeader.abyDstAddr[0]), &uNodeIndex)) {
2982 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
2983 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
2984 pDevice->byPreambleType = pDevice->byShortPreamble;
2985
2986 }
2987 else {
2988 pDevice->byPreambleType = PREAMBLE_LONG;
2989 }
2990 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Found Node Index is [%d] Tx Data Rate:[%d]\n",uNodeIndex, pDevice->wCurrentRate);
2991 }
2992 else {
2993 if (pDevice->byBBType != BB_TYPE_11A)
2994 pDevice->wCurrentRate = RATE_2M;
2995 else
2996 pDevice->wCurrentRate = RATE_24M; // refer to vMgrCreateOwnIBSS()'s
2997 // abyCurrExtSuppRates[]
2998 pDevice->byPreambleType = PREAMBLE_SHORT;
2999 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Not Found Node use highest basic Rate.....\n");
3000 }
3001 }
3002 }
3003 if (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) {
3004 // Infra STA rate decided from AP Node, index = 0
3005 pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate;
3006 }
3007 }
3008
3009 if (pDevice->sTxEthHeader.wType == TYPE_PKT_802_1x) {
3010 if (pDevice->byBBType != BB_TYPE_11A) {
3011 pDevice->wCurrentRate = RATE_1M;
3012 pDevice->byACKRate = RATE_1M;
3013 pDevice->byTopCCKBasicRate = RATE_1M;
3014 pDevice->byTopOFDMBasicRate = RATE_6M;
3015 } else {
3016 pDevice->wCurrentRate = RATE_6M;
3017 pDevice->byACKRate = RATE_6M;
3018 pDevice->byTopCCKBasicRate = RATE_1M;
3019 pDevice->byTopOFDMBasicRate = RATE_6M;
3020 }
3021 }
3022
Andres More0cbd8d92010-05-06 20:34:29 -03003023 DBG_PRT(MSG_LEVEL_DEBUG,
3024 KERN_INFO "dma_tx: pDevice->wCurrentRate = %d\n",
3025 pDevice->wCurrentRate);
Forest Bond92b96792009-06-13 07:38:31 -04003026
3027 if (wKeepRate != pDevice->wCurrentRate) {
Andres More0cbd8d92010-05-06 20:34:29 -03003028 bScheduleCommand((void *) pDevice, WLAN_CMD_SETPOWER, NULL);
Forest Bond92b96792009-06-13 07:38:31 -04003029 }
3030
3031 if (pDevice->wCurrentRate <= RATE_11M) {
3032 byPktType = PK_TYPE_11B;
3033 }
3034
3035 if (bNeedEncryption == TRUE) {
3036 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType));
3037 if ((pDevice->sTxEthHeader.wType) == TYPE_PKT_802_1x) {
3038 bNeedEncryption = FALSE;
3039 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType));
3040 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
3041 if (pTransmitKey == NULL) {
3042 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Don't Find TX KEY\n");
3043 }
3044 else {
3045 if (bTKIP_UseGTK == TRUE) {
3046 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n");
3047 }
3048 else {
3049 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
3050 bNeedEncryption = TRUE;
3051 }
3052 }
3053 }
3054
3055 if (pDevice->byCntMeasure == 2) {
3056 bNeedDeAuth = TRUE;
3057 pDevice->s802_11Counter.TKIPCounterMeasuresInvoked++;
3058 }
3059
3060 if (pDevice->bEnableHostWEP) {
3061 if ((uNodeIndex != 0) &&
3062 (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) {
3063 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
3064 bNeedEncryption = TRUE;
3065 }
3066 }
3067 }
3068 else {
3069
Forest Bond92b96792009-06-13 07:38:31 -04003070 if (pTransmitKey == NULL) {
3071 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n");
3072 dev_kfree_skb_irq(skb);
3073 pStats->tx_dropped++;
3074 return STATUS_FAILURE;
3075 }
Forest Bond92b96792009-06-13 07:38:31 -04003076 }
3077 }
3078
3079 fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType,
3080 (PBYTE)(&pContext->Data[0]), bNeedEncryption,
3081 skb->len, uDMAIdx, &pDevice->sTxEthHeader,
3082 (PBYTE)skb->data, pTransmitKey, uNodeIndex,
3083 pDevice->wCurrentRate,
3084 &uHeaderLen, &BytesToWrite
3085 );
3086
3087 if (fConvertedPacket == FALSE) {
3088 pContext->bBoolInUse = FALSE;
3089 dev_kfree_skb_irq(skb);
3090 return STATUS_FAILURE;
3091 }
3092
3093 if ( pDevice->bEnablePSMode == TRUE ) {
3094 if ( !pDevice->bPSModeTxBurst ) {
Andres More0cbd8d92010-05-06 20:34:29 -03003095 bScheduleCommand((void *) pDevice,
3096 WLAN_CMD_MAC_DISPOWERSAVING,
3097 NULL);
Forest Bond92b96792009-06-13 07:38:31 -04003098 pDevice->bPSModeTxBurst = TRUE;
3099 }
3100 }
3101
3102 pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]);
3103 pTX_Buffer->byPKTNO = (BYTE) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
3104 pTX_Buffer->wTxByteCount = (WORD)BytesToWrite;
3105
3106 pContext->pPacket = skb;
3107 pContext->Type = CONTEXT_DATA_PACKET;
3108 pContext->uBufLen = (WORD)BytesToWrite + 4 ; //USB header
3109
3110 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.abyDstAddr[0]),(WORD) (BytesToWrite-uHeaderLen),pTX_Buffer->wFIFOCtl);
3111
3112 status = PIPEnsSendBulkOut(pDevice,pContext);
3113
3114 if (bNeedDeAuth == TRUE) {
3115 WORD wReason = WLAN_MGMT_REASON_MIC_FAILURE;
3116
Andres More0cbd8d92010-05-06 20:34:29 -03003117 bScheduleCommand((void *) pDevice, WLAN_CMD_DEAUTH, (PBYTE) &wReason);
Forest Bond92b96792009-06-13 07:38:31 -04003118 }
3119
3120 if(status!=STATUS_PENDING) {
3121 pContext->bBoolInUse = FALSE;
3122 dev_kfree_skb_irq(skb);
3123 return STATUS_FAILURE;
3124 }
3125 else
3126 return 0;
3127
3128}
3129
3130
3131
3132/*
3133 * Description:
3134 * Relay packet send (AC1DMA) from rx dpc.
3135 *
3136 * Parameters:
3137 * In:
3138 * pDevice - Pointer to the adapter
3139 * pPacket - Pointer to rx packet
3140 * cbPacketSize - rx ethernet frame size
3141 * Out:
3142 * TURE, FALSE
3143 *
3144 * Return Value: Return TRUE if packet is copy to dma1; otherwise FALSE
3145 */
3146
3147
3148BOOL
3149bRelayPacketSend (
Andres More592ccfe2010-04-17 12:07:42 -03003150 PSDevice pDevice,
3151 PBYTE pbySkbData,
Andres Morecc856e62010-05-17 21:34:01 -03003152 unsigned int uDataLen,
3153 unsigned int uNodeIndex
Forest Bond92b96792009-06-13 07:38:31 -04003154 )
3155{
3156 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
Andres Morecc856e62010-05-17 21:34:01 -03003157 unsigned int BytesToWrite = 0, uHeaderLen = 0;
Forest Bond92b96792009-06-13 07:38:31 -04003158 BYTE byPktType = PK_TYPE_11B;
3159 BOOL bNeedEncryption = FALSE;
3160 SKeyItem STempKey;
3161 PSKeyItem pTransmitKey = NULL;
3162 PBYTE pbyBSSID;
3163 PUSB_SEND_CONTEXT pContext;
3164 BYTE byPktTyp;
3165 BOOL fConvertedPacket;
3166 PTX_BUFFER pTX_Buffer;
Andres Morecc856e62010-05-17 21:34:01 -03003167 unsigned int status;
Forest Bond92b96792009-06-13 07:38:31 -04003168 WORD wKeepRate = pDevice->wCurrentRate;
3169
3170
3171
3172 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
3173
3174 if (NULL == pContext) {
3175 return FALSE;
3176 }
3177
Charles Clément21ec51f2010-05-18 10:08:14 -07003178 memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)pbySkbData, ETH_HLEN);
Forest Bond92b96792009-06-13 07:38:31 -04003179
3180 if (pDevice->bEncryptionEnable == TRUE) {
3181 bNeedEncryption = TRUE;
3182 // get group key
3183 pbyBSSID = pDevice->abyBroadcastAddr;
3184 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
3185 pTransmitKey = NULL;
3186 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"KEY is NULL. [%d]\n", pMgmt->eCurrMode);
3187 } else {
3188 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
3189 }
3190 }
3191
3192 if (pDevice->bEnableHostWEP) {
Roel Kluinee93e192009-10-16 20:17:57 +02003193 if (uNodeIndex < MAX_NODE_NUM + 1) {
Forest Bond92b96792009-06-13 07:38:31 -04003194 pTransmitKey = &STempKey;
3195 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
3196 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
3197 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
3198 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
3199 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
3200 memcpy(pTransmitKey->abyKey,
3201 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
3202 pTransmitKey->uKeyLength
3203 );
3204 }
3205 }
3206
3207 if ( bNeedEncryption && (pTransmitKey == NULL) ) {
3208 pContext->bBoolInUse = FALSE;
3209 return FALSE;
3210 }
3211
3212 byPktTyp = (BYTE)pDevice->byPacketType;
3213
3214 if (pDevice->bFixRate) {
3215 if (pDevice->byBBType == BB_TYPE_11B) {
3216 if (pDevice->uConnectionRate >= RATE_11M) {
3217 pDevice->wCurrentRate = RATE_11M;
3218 } else {
3219 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
3220 }
3221 } else {
3222 if ((pDevice->byBBType == BB_TYPE_11A) &&
3223 (pDevice->uConnectionRate <= RATE_6M)) {
3224 pDevice->wCurrentRate = RATE_6M;
3225 } else {
3226 if (pDevice->uConnectionRate >= RATE_54M)
3227 pDevice->wCurrentRate = RATE_54M;
3228 else
3229 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
3230 }
3231 }
3232 }
3233 else {
3234 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
3235 }
3236
Forest Bond92b96792009-06-13 07:38:31 -04003237 if (wKeepRate != pDevice->wCurrentRate) {
Andres More0cbd8d92010-05-06 20:34:29 -03003238 bScheduleCommand((void *) pDevice, WLAN_CMD_SETPOWER, NULL);
Forest Bond92b96792009-06-13 07:38:31 -04003239 }
3240
3241 if (pDevice->wCurrentRate <= RATE_11M)
3242 byPktType = PK_TYPE_11B;
3243
3244 BytesToWrite = uDataLen + U_CRC_LEN;
3245 // Convert the packet to an usb frame and copy into our buffer
3246 // and send the irp.
3247
3248 fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType,
3249 (PBYTE)(&pContext->Data[0]), bNeedEncryption,
3250 uDataLen, TYPE_AC0DMA, &pDevice->sTxEthHeader,
3251 pbySkbData, pTransmitKey, uNodeIndex,
3252 pDevice->wCurrentRate,
3253 &uHeaderLen, &BytesToWrite
3254 );
3255
3256 if (fConvertedPacket == FALSE) {
3257 pContext->bBoolInUse = FALSE;
3258 return FALSE;
3259 }
3260
3261 pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]);
3262 pTX_Buffer->byPKTNO = (BYTE) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
3263 pTX_Buffer->wTxByteCount = (WORD)BytesToWrite;
3264
3265 pContext->pPacket = NULL;
3266 pContext->Type = CONTEXT_DATA_PACKET;
3267 pContext->uBufLen = (WORD)BytesToWrite + 4 ; //USB header
3268
3269 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.abyDstAddr[0]),(WORD) (BytesToWrite-uHeaderLen),pTX_Buffer->wFIFOCtl);
3270
3271 status = PIPEnsSendBulkOut(pDevice,pContext);
3272
3273 return TRUE;
3274}
3275