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