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_INFO; 72 73 /*--------------------- Static Functions --------------------------*/ 74 75 /*--------------------- Static Definitions -------------------------*/ 76 #define CRITICAL_PACKET_LEN 256 // if packet size < 256 -> in-direct send 77 // packet size >= 256 -> direct send 78 79 const WORD wTimeStampOff[2][MAX_RATE] = { 80 {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble 81 {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble 82 }; 83 84 const WORD wFB_Opt0[2][5] = { 85 {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0 86 {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1 87 }; 88 const WORD wFB_Opt1[2][5] = { 89 {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0 90 {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1 91 }; 92 93 94 #define RTSDUR_BB 0 95 #define RTSDUR_BA 1 96 #define RTSDUR_AA 2 97 #define CTSDUR_BA 3 98 #define RTSDUR_BA_F0 4 99 #define RTSDUR_AA_F0 5 100 #define RTSDUR_BA_F1 6 101 #define RTSDUR_AA_F1 7 102 #define CTSDUR_BA_F0 8 103 #define CTSDUR_BA_F1 9 104 #define DATADUR_B 10 105 #define DATADUR_A 11 106 #define DATADUR_A_F0 12 107 #define DATADUR_A_F1 13 108 109 /*--------------------- Static Functions --------------------------*/ 110 111 static 112 void 113 s_vSaveTxPktInfo( 114 PSDevice pDevice, 115 BYTE byPktNum, 116 PBYTE pbyDestAddr, 117 WORD wPktLength, 118 WORD wFIFOCtl 119 ); 120 121 static 122 void * 123 s_vGetFreeContext( 124 PSDevice pDevice 125 ); 126 127 128 static 129 void 130 s_vGenerateTxParameter( 131 PSDevice pDevice, 132 BYTE byPktType, 133 WORD wCurrentRate, 134 void *pTxBufHead, 135 void *pvRrvTime, 136 void *pvRTS, 137 void *pvCTS, 138 unsigned int cbFrameSize, 139 BOOL bNeedACK, 140 unsigned int uDMAIdx, 141 PSEthernetHeader psEthHeader 142 ); 143 144 145 static unsigned int s_uFillDataHead( 146 PSDevice pDevice, 147 BYTE byPktType, 148 WORD wCurrentRate, 149 void *pTxDataHead, 150 unsigned int cbFrameLength, 151 unsigned int uDMAIdx, 152 BOOL bNeedAck, 153 unsigned int uFragIdx, 154 unsigned int cbLastFragmentSize, 155 unsigned int uMACfragNum, 156 BYTE byFBOption 157 ); 158 159 160 161 162 static 163 void 164 s_vGenerateMACHeader ( 165 PSDevice pDevice, 166 PBYTE pbyBufferAddr, 167 WORD wDuration, 168 PSEthernetHeader psEthHeader, 169 BOOL bNeedEncrypt, 170 WORD wFragType, 171 unsigned int uDMAIdx, 172 unsigned int uFragIdx 173 ); 174 175 static 176 void 177 s_vFillTxKey( 178 PSDevice pDevice, 179 PBYTE pbyBuf, 180 PBYTE pbyIVHead, 181 PSKeyItem pTransmitKey, 182 PBYTE pbyHdrBuf, 183 WORD wPayloadLen, 184 PBYTE pMICHDR 185 ); 186 187 static 188 void 189 s_vSWencryption ( 190 PSDevice pDevice, 191 PSKeyItem pTransmitKey, 192 PBYTE pbyPayloadHead, 193 WORD wPayloadSize 194 ); 195 196 static unsigned int s_uGetTxRsvTime( 197 PSDevice pDevice, 198 BYTE byPktType, 199 unsigned int cbFrameLength, 200 WORD wRate, 201 BOOL bNeedAck 202 ); 203 204 205 static unsigned int s_uGetRTSCTSRsvTime( 206 PSDevice pDevice, 207 BYTE byRTSRsvType, 208 BYTE byPktType, 209 unsigned int cbFrameLength, 210 WORD wCurrentRate 211 ); 212 213 static 214 void 215 s_vFillCTSHead ( 216 PSDevice pDevice, 217 unsigned int uDMAIdx, 218 BYTE byPktType, 219 void *pvCTS, 220 unsigned int cbFrameLength, 221 BOOL bNeedAck, 222 BOOL bDisCRC, 223 WORD wCurrentRate, 224 BYTE byFBOption 225 ); 226 227 static 228 void 229 s_vFillRTSHead( 230 PSDevice pDevice, 231 BYTE byPktType, 232 void *pvRTS, 233 unsigned int cbFrameLength, 234 BOOL bNeedAck, 235 BOOL bDisCRC, 236 PSEthernetHeader psEthHeader, 237 WORD wCurrentRate, 238 BYTE byFBOption 239 ); 240 241 static unsigned int s_uGetDataDuration( 242 PSDevice pDevice, 243 BYTE byDurType, 244 unsigned int cbFrameLength, 245 BYTE byPktType, 246 WORD wRate, 247 BOOL bNeedAck, 248 unsigned int uFragIdx, 249 unsigned int cbLastFragmentSize, 250 unsigned int uMACfragNum, 251 BYTE byFBOption 252 ); 253 254 255 static 256 unsigned int 257 s_uGetRTSCTSDuration ( 258 PSDevice pDevice, 259 BYTE byDurType, 260 unsigned int cbFrameLength, 261 BYTE byPktType, 262 WORD wRate, 263 BOOL bNeedAck, 264 BYTE byFBOption 265 ); 266 267 268 /*--------------------- Export Variables --------------------------*/ 269 270 static 271 void * 272 s_vGetFreeContext( 273 PSDevice pDevice 274 ) 275 { 276 PUSB_SEND_CONTEXT pContext = NULL; 277 PUSB_SEND_CONTEXT pReturnContext = NULL; 278 unsigned int ii; 279 280 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GetFreeContext()\n"); 281 282 for (ii = 0; ii < pDevice->cbTD; ii++) { 283 pContext = pDevice->apTD[ii]; 284 if (pContext->bBoolInUse == FALSE) { 285 pContext->bBoolInUse = TRUE; 286 pReturnContext = pContext; 287 break; 288 } 289 } 290 if ( ii == pDevice->cbTD ) { 291 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Free Tx Context\n"); 292 } 293 return (void *) pReturnContext; 294 } 295 296 297 static 298 void 299 s_vSaveTxPktInfo(PSDevice pDevice, BYTE byPktNum, PBYTE pbyDestAddr, WORD wPktLength, WORD wFIFOCtl) 300 { 301 PSStatCounter pStatistic=&(pDevice->scStatistic); 302 303 if (is_broadcast_ether_addr(pbyDestAddr)) 304 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_BROAD; 305 else if (is_multicast_ether_addr(pbyDestAddr)) 306 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_MULTI; 307 else 308 pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_UNI; 309 310 pStatistic->abyTxPktInfo[byPktNum].wLength = wPktLength; 311 pStatistic->abyTxPktInfo[byPktNum].wFIFOCtl = wFIFOCtl; 312 memcpy(pStatistic->abyTxPktInfo[byPktNum].abyDestAddr, 313 pbyDestAddr, 314 ETH_ALEN); 315 } 316 317 static 318 void 319 s_vFillTxKey ( 320 PSDevice pDevice, 321 PBYTE pbyBuf, 322 PBYTE pbyIVHead, 323 PSKeyItem pTransmitKey, 324 PBYTE pbyHdrBuf, 325 WORD wPayloadLen, 326 PBYTE pMICHDR 327 ) 328 { 329 PDWORD pdwIV = (PDWORD) pbyIVHead; 330 PDWORD pdwExtIV = (PDWORD) ((PBYTE)pbyIVHead+4); 331 WORD wValue; 332 PS802_11Header pMACHeader = (PS802_11Header)pbyHdrBuf; 333 DWORD dwRevIVCounter; 334 335 336 337 //Fill TXKEY 338 if (pTransmitKey == NULL) 339 return; 340 341 dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter); 342 *pdwIV = pDevice->dwIVCounter; 343 pDevice->byKeyIndex = pTransmitKey->dwKeyIndex & 0xf; 344 345 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { 346 if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN ){ 347 memcpy(pDevice->abyPRNG, (PBYTE)&(dwRevIVCounter), 3); 348 memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength); 349 } else { 350 memcpy(pbyBuf, (PBYTE)&(dwRevIVCounter), 3); 351 memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength); 352 if(pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) { 353 memcpy(pbyBuf+8, (PBYTE)&(dwRevIVCounter), 3); 354 memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength); 355 } 356 memcpy(pDevice->abyPRNG, pbyBuf, 16); 357 } 358 // Append IV after Mac Header 359 *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111 360 *pdwIV |= (pDevice->byKeyIndex << 30); 361 *pdwIV = cpu_to_le32(*pdwIV); 362 pDevice->dwIVCounter++; 363 if (pDevice->dwIVCounter > WEP_IV_MASK) { 364 pDevice->dwIVCounter = 0; 365 } 366 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) { 367 pTransmitKey->wTSC15_0++; 368 if (pTransmitKey->wTSC15_0 == 0) { 369 pTransmitKey->dwTSC47_16++; 370 } 371 TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr, 372 pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG); 373 memcpy(pbyBuf, pDevice->abyPRNG, 16); 374 // Make IV 375 memcpy(pdwIV, pDevice->abyPRNG, 3); 376 377 *(pbyIVHead+3) = (BYTE)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV 378 // Append IV&ExtIV after Mac Header 379 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16); 380 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV); 381 382 } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { 383 pTransmitKey->wTSC15_0++; 384 if (pTransmitKey->wTSC15_0 == 0) { 385 pTransmitKey->dwTSC47_16++; 386 } 387 memcpy(pbyBuf, pTransmitKey->abyKey, 16); 388 389 // Make IV 390 *pdwIV = 0; 391 *(pbyIVHead+3) = (BYTE)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV 392 *pdwIV |= cpu_to_le16((WORD)(pTransmitKey->wTSC15_0)); 393 //Append IV&ExtIV after Mac Header 394 *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16); 395 396 //Fill MICHDR0 397 *pMICHDR = 0x59; 398 *((PBYTE)(pMICHDR+1)) = 0; // TxPriority 399 memcpy(pMICHDR+2, &(pMACHeader->abyAddr2[0]), 6); 400 *((PBYTE)(pMICHDR+8)) = HIBYTE(HIWORD(pTransmitKey->dwTSC47_16)); 401 *((PBYTE)(pMICHDR+9)) = LOBYTE(HIWORD(pTransmitKey->dwTSC47_16)); 402 *((PBYTE)(pMICHDR+10)) = HIBYTE(LOWORD(pTransmitKey->dwTSC47_16)); 403 *((PBYTE)(pMICHDR+11)) = LOBYTE(LOWORD(pTransmitKey->dwTSC47_16)); 404 *((PBYTE)(pMICHDR+12)) = HIBYTE(pTransmitKey->wTSC15_0); 405 *((PBYTE)(pMICHDR+13)) = LOBYTE(pTransmitKey->wTSC15_0); 406 *((PBYTE)(pMICHDR+14)) = HIBYTE(wPayloadLen); 407 *((PBYTE)(pMICHDR+15)) = LOBYTE(wPayloadLen); 408 409 //Fill MICHDR1 410 *((PBYTE)(pMICHDR+16)) = 0; // HLEN[15:8] 411 if (pDevice->bLongHeader) { 412 *((PBYTE)(pMICHDR+17)) = 28; // HLEN[7:0] 413 } else { 414 *((PBYTE)(pMICHDR+17)) = 22; // HLEN[7:0] 415 } 416 wValue = cpu_to_le16(pMACHeader->wFrameCtl & 0xC78F); 417 memcpy(pMICHDR+18, (PBYTE)&wValue, 2); // MSKFRACTL 418 memcpy(pMICHDR+20, &(pMACHeader->abyAddr1[0]), 6); 419 memcpy(pMICHDR+26, &(pMACHeader->abyAddr2[0]), 6); 420 421 //Fill MICHDR2 422 memcpy(pMICHDR+32, &(pMACHeader->abyAddr3[0]), 6); 423 wValue = pMACHeader->wSeqCtl; 424 wValue &= 0x000F; 425 wValue = cpu_to_le16(wValue); 426 memcpy(pMICHDR+38, (PBYTE)&wValue, 2); // MSKSEQCTL 427 if (pDevice->bLongHeader) { 428 memcpy(pMICHDR+40, &(pMACHeader->abyAddr4[0]), 6); 429 } 430 } 431 } 432 433 434 static 435 void 436 s_vSWencryption ( 437 PSDevice pDevice, 438 PSKeyItem pTransmitKey, 439 PBYTE pbyPayloadHead, 440 WORD wPayloadSize 441 ) 442 { 443 unsigned int cbICVlen = 4; 444 DWORD dwICV = 0xFFFFFFFFL; 445 PDWORD pdwICV; 446 447 if (pTransmitKey == NULL) 448 return; 449 450 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { 451 //======================================================================= 452 // Append ICV after payload 453 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload) 454 pdwICV = (PDWORD)(pbyPayloadHead + wPayloadSize); 455 // finally, we must invert dwCRC to get the correct answer 456 *pdwICV = cpu_to_le32(~dwICV); 457 // RC4 encryption 458 rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3); 459 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen); 460 //======================================================================= 461 } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) { 462 //======================================================================= 463 //Append ICV after payload 464 dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload) 465 pdwICV = (PDWORD)(pbyPayloadHead + wPayloadSize); 466 // finally, we must invert dwCRC to get the correct answer 467 *pdwICV = cpu_to_le32(~dwICV); 468 // RC4 encryption 469 rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN); 470 rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen); 471 //======================================================================= 472 } 473 } 474 475 476 477 478 /*byPktType : PK_TYPE_11A 0 479 PK_TYPE_11B 1 480 PK_TYPE_11GB 2 481 PK_TYPE_11GA 3 482 */ 483 static 484 unsigned int 485 s_uGetTxRsvTime ( 486 PSDevice pDevice, 487 BYTE byPktType, 488 unsigned int cbFrameLength, 489 WORD wRate, 490 BOOL bNeedAck 491 ) 492 { 493 unsigned int uDataTime, uAckTime; 494 495 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate); 496 if (byPktType == PK_TYPE_11B) {//llb,CCK mode 497 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (WORD)pDevice->byTopCCKBasicRate); 498 } else {//11g 2.4G OFDM mode & 11a 5G OFDM mode 499 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (WORD)pDevice->byTopOFDMBasicRate); 500 } 501 502 if (bNeedAck) { 503 return (uDataTime + pDevice->uSIFS + uAckTime); 504 } 505 else { 506 return uDataTime; 507 } 508 } 509 510 //byFreqType: 0=>5GHZ 1=>2.4GHZ 511 static 512 unsigned int 513 s_uGetRTSCTSRsvTime ( 514 PSDevice pDevice, 515 BYTE byRTSRsvType, 516 BYTE byPktType, 517 unsigned int cbFrameLength, 518 WORD wCurrentRate 519 ) 520 { 521 unsigned int uRrvTime , uRTSTime, uCTSTime, uAckTime, uDataTime; 522 523 uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0; 524 525 526 uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate); 527 if (byRTSRsvType == 0) { //RTSTxRrvTime_bb 528 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate); 529 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate); 530 } 531 else if (byRTSRsvType == 1){ //RTSTxRrvTime_ba, only in 2.4GHZ 532 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate); 533 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate); 534 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate); 535 } 536 else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa 537 uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate); 538 uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate); 539 } 540 else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ 541 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate); 542 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate); 543 uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS; 544 return uRrvTime; 545 } 546 547 //RTSRrvTime 548 uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS; 549 return uRrvTime; 550 } 551 552 //byFreqType 0: 5GHz, 1:2.4Ghz 553 static 554 unsigned int 555 s_uGetDataDuration ( 556 PSDevice pDevice, 557 BYTE byDurType, 558 unsigned int cbFrameLength, 559 BYTE byPktType, 560 WORD wRate, 561 BOOL bNeedAck, 562 unsigned int uFragIdx, 563 unsigned int cbLastFragmentSize, 564 unsigned int uMACfragNum, 565 BYTE byFBOption 566 ) 567 { 568 BOOL bLastFrag = 0; 569 unsigned int uAckTime = 0, uNextPktTime = 0; 570 571 if (uFragIdx == (uMACfragNum-1)) { 572 bLastFrag = 1; 573 } 574 575 switch (byDurType) { 576 577 case DATADUR_B: //DATADUR_B 578 if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag 579 if (bNeedAck) { 580 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate); 581 return (pDevice->uSIFS + uAckTime); 582 } else { 583 return 0; 584 } 585 } 586 else {//First Frag or Mid Frag 587 if (uFragIdx == (uMACfragNum-2)) { 588 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck); 589 } else { 590 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck); 591 } 592 if (bNeedAck) { 593 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate); 594 return (pDevice->uSIFS + uAckTime + uNextPktTime); 595 } else { 596 return (pDevice->uSIFS + uNextPktTime); 597 } 598 } 599 break; 600 601 602 case DATADUR_A: //DATADUR_A 603 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag 604 if(bNeedAck){ 605 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate); 606 return (pDevice->uSIFS + uAckTime); 607 } else { 608 return 0; 609 } 610 } 611 else {//First Frag or Mid Frag 612 if(uFragIdx == (uMACfragNum-2)){ 613 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck); 614 } else { 615 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck); 616 } 617 if(bNeedAck){ 618 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate); 619 return (pDevice->uSIFS + uAckTime + uNextPktTime); 620 } else { 621 return (pDevice->uSIFS + uNextPktTime); 622 } 623 } 624 break; 625 626 case DATADUR_A_F0: //DATADUR_A_F0 627 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag 628 if(bNeedAck){ 629 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate); 630 return (pDevice->uSIFS + uAckTime); 631 } else { 632 return 0; 633 } 634 } 635 else { //First Frag or Mid Frag 636 if (byFBOption == AUTO_FB_0) { 637 if (wRate < RATE_18M) 638 wRate = RATE_18M; 639 else if (wRate > RATE_54M) 640 wRate = RATE_54M; 641 642 if(uFragIdx == (uMACfragNum-2)){ 643 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck); 644 } else { 645 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck); 646 } 647 } else { // (byFBOption == AUTO_FB_1) 648 if (wRate < RATE_18M) 649 wRate = RATE_18M; 650 else if (wRate > RATE_54M) 651 wRate = RATE_54M; 652 653 if(uFragIdx == (uMACfragNum-2)){ 654 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck); 655 } else { 656 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck); 657 } 658 } 659 660 if(bNeedAck){ 661 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate); 662 return (pDevice->uSIFS + uAckTime + uNextPktTime); 663 } else { 664 return (pDevice->uSIFS + uNextPktTime); 665 } 666 } 667 break; 668 669 case DATADUR_A_F1: //DATADUR_A_F1 670 if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag 671 if(bNeedAck){ 672 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate); 673 return (pDevice->uSIFS + uAckTime); 674 } else { 675 return 0; 676 } 677 } 678 else { //First Frag or Mid Frag 679 if (byFBOption == AUTO_FB_0) { 680 if (wRate < RATE_18M) 681 wRate = RATE_18M; 682 else if (wRate > RATE_54M) 683 wRate = RATE_54M; 684 685 if(uFragIdx == (uMACfragNum-2)){ 686 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck); 687 } else { 688 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck); 689 } 690 691 } else { // (byFBOption == AUTO_FB_1) 692 if (wRate < RATE_18M) 693 wRate = RATE_18M; 694 else if (wRate > RATE_54M) 695 wRate = RATE_54M; 696 697 if(uFragIdx == (uMACfragNum-2)){ 698 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck); 699 } else { 700 uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck); 701 } 702 } 703 if(bNeedAck){ 704 uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate); 705 return (pDevice->uSIFS + uAckTime + uNextPktTime); 706 } else { 707 return (pDevice->uSIFS + uNextPktTime); 708 } 709 } 710 break; 711 712 default: 713 break; 714 } 715 716 ASSERT(FALSE); 717 return 0; 718 } 719 720 721 //byFreqType: 0=>5GHZ 1=>2.4GHZ 722 static 723 unsigned int 724 s_uGetRTSCTSDuration ( 725 PSDevice pDevice, 726 BYTE byDurType, 727 unsigned int cbFrameLength, 728 BYTE byPktType, 729 WORD wRate, 730 BOOL bNeedAck, 731 BYTE byFBOption 732 ) 733 { 734 unsigned int uCTSTime = 0, uDurTime = 0; 735 736 737 switch (byDurType) { 738 739 case RTSDUR_BB: //RTSDuration_bb 740 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate); 741 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck); 742 break; 743 744 case RTSDUR_BA: //RTSDuration_ba 745 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate); 746 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck); 747 break; 748 749 case RTSDUR_AA: //RTSDuration_aa 750 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate); 751 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck); 752 break; 753 754 case CTSDUR_BA: //CTSDuration_ba 755 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck); 756 break; 757 758 case RTSDUR_BA_F0: //RTSDuration_ba_f0 759 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate); 760 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) { 761 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck); 762 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) { 763 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck); 764 } 765 break; 766 767 case RTSDUR_AA_F0: //RTSDuration_aa_f0 768 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate); 769 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) { 770 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck); 771 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) { 772 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck); 773 } 774 break; 775 776 case RTSDUR_BA_F1: //RTSDuration_ba_f1 777 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate); 778 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) { 779 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck); 780 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) { 781 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck); 782 } 783 break; 784 785 case RTSDUR_AA_F1: //RTSDuration_aa_f1 786 uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate); 787 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) { 788 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck); 789 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) { 790 uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck); 791 } 792 break; 793 794 case CTSDUR_BA_F0: //CTSDuration_ba_f0 795 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) { 796 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck); 797 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) { 798 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck); 799 } 800 break; 801 802 case CTSDUR_BA_F1: //CTSDuration_ba_f1 803 if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) { 804 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck); 805 } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) { 806 uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck); 807 } 808 break; 809 810 default: 811 break; 812 } 813 814 return uDurTime; 815 816 } 817 818 819 820 821 static 822 unsigned int 823 s_uFillDataHead ( 824 PSDevice pDevice, 825 BYTE byPktType, 826 WORD wCurrentRate, 827 void *pTxDataHead, 828 unsigned int cbFrameLength, 829 unsigned int uDMAIdx, 830 BOOL bNeedAck, 831 unsigned int uFragIdx, 832 unsigned int cbLastFragmentSize, 833 unsigned int uMACfragNum, 834 BYTE byFBOption 835 ) 836 { 837 838 if (pTxDataHead == NULL) { 839 return 0; 840 } 841 842 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) { 843 if ((uDMAIdx == TYPE_ATIMDMA) || (uDMAIdx == TYPE_BEACONDMA)) { 844 PSTxDataHead_ab pBuf = (PSTxDataHead_ab) pTxDataHead; 845 //Get SignalField,ServiceField,Length 846 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType, 847 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField) 848 ); 849 //Get Duration and TimeStampOff 850 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType, 851 wCurrentRate, bNeedAck, uFragIdx, 852 cbLastFragmentSize, uMACfragNum, 853 byFBOption); //1: 2.4GHz 854 if(uDMAIdx!=TYPE_ATIMDMA) { 855 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]; 856 } 857 return (pBuf->wDuration); 858 } 859 else { // DATA & MANAGE Frame 860 if (byFBOption == AUTO_FB_NONE) { 861 PSTxDataHead_g pBuf = (PSTxDataHead_g)pTxDataHead; 862 //Get SignalField,ServiceField,Length 863 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType, 864 (PWORD)&(pBuf->wTransmitLength_a), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a) 865 ); 866 BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B, 867 (PWORD)&(pBuf->wTransmitLength_b), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b) 868 ); 869 //Get Duration and TimeStamp 870 pBuf->wDuration_a = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, 871 byPktType, wCurrentRate, bNeedAck, uFragIdx, 872 cbLastFragmentSize, uMACfragNum, 873 byFBOption); //1: 2.4GHz 874 pBuf->wDuration_b = (WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, 875 PK_TYPE_11B, pDevice->byTopCCKBasicRate, 876 bNeedAck, uFragIdx, cbLastFragmentSize, 877 uMACfragNum, byFBOption); //1: 2.4GHz 878 879 pBuf->wTimeStampOff_a = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]; 880 pBuf->wTimeStampOff_b = wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]; 881 return (pBuf->wDuration_a); 882 } else { 883 // Auto Fallback 884 PSTxDataHead_g_FB pBuf = (PSTxDataHead_g_FB)pTxDataHead; 885 //Get SignalField,ServiceField,Length 886 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType, 887 (PWORD)&(pBuf->wTransmitLength_a), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a) 888 ); 889 BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B, 890 (PWORD)&(pBuf->wTransmitLength_b), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b) 891 ); 892 //Get Duration and TimeStamp 893 pBuf->wDuration_a = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType, 894 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz 895 pBuf->wDuration_b = (WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B, 896 pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz 897 pBuf->wDuration_a_f0 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType, 898 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz 899 pBuf->wDuration_a_f1 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType, 900 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz 901 pBuf->wTimeStampOff_a = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]; 902 pBuf->wTimeStampOff_b = wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE]; 903 return (pBuf->wDuration_a); 904 } //if (byFBOption == AUTO_FB_NONE) 905 } 906 } 907 else if (byPktType == PK_TYPE_11A) { 908 if ((byFBOption != AUTO_FB_NONE) && (uDMAIdx != TYPE_ATIMDMA) && (uDMAIdx != TYPE_BEACONDMA)) { 909 // Auto Fallback 910 PSTxDataHead_a_FB pBuf = (PSTxDataHead_a_FB)pTxDataHead; 911 //Get SignalField,ServiceField,Length 912 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType, 913 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField) 914 ); 915 //Get Duration and TimeStampOff 916 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType, 917 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz 918 pBuf->wDuration_f0 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType, 919 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz 920 pBuf->wDuration_f1 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType, 921 wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz 922 if(uDMAIdx!=TYPE_ATIMDMA) { 923 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]; 924 } 925 return (pBuf->wDuration); 926 } else { 927 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead; 928 //Get SignalField,ServiceField,Length 929 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType, 930 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField) 931 ); 932 //Get Duration and TimeStampOff 933 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType, 934 wCurrentRate, bNeedAck, uFragIdx, 935 cbLastFragmentSize, uMACfragNum, 936 byFBOption); 937 938 if(uDMAIdx!=TYPE_ATIMDMA) { 939 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]; 940 } 941 return (pBuf->wDuration); 942 } 943 } 944 else if (byPktType == PK_TYPE_11B) { 945 PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead; 946 //Get SignalField,ServiceField,Length 947 BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType, 948 (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField) 949 ); 950 //Get Duration and TimeStampOff 951 pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType, 952 wCurrentRate, bNeedAck, uFragIdx, 953 cbLastFragmentSize, uMACfragNum, 954 byFBOption); 955 if (uDMAIdx != TYPE_ATIMDMA) { 956 pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE]; 957 } 958 return (pBuf->wDuration); 959 } 960 return 0; 961 } 962 963 964 965 966 static 967 void 968 s_vFillRTSHead ( 969 PSDevice pDevice, 970 BYTE byPktType, 971 void *pvRTS, 972 unsigned int cbFrameLength, 973 BOOL bNeedAck, 974 BOOL bDisCRC, 975 PSEthernetHeader psEthHeader, 976 WORD wCurrentRate, 977 BYTE byFBOption 978 ) 979 { 980 unsigned int uRTSFrameLen = 20; 981 WORD wLen = 0x0000; 982 983 if (pvRTS == NULL) 984 return; 985 986 if (bDisCRC) { 987 // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame, 988 // in this case we need to decrease its length by 4. 989 uRTSFrameLen -= 4; 990 } 991 992 // Note: So far RTSHead dosen't appear in ATIM & Beacom DMA, so we don't need to take them into account. 993 // Otherwise, we need to modified codes for them. 994 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) { 995 if (byFBOption == AUTO_FB_NONE) { 996 PSRTS_g pBuf = (PSRTS_g)pvRTS; 997 //Get SignalField,ServiceField,Length 998 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B, 999 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b) 1000 ); 1001 pBuf->wTransmitLength_b = cpu_to_le16(wLen); 1002 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType, 1003 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a) 1004 ); 1005 pBuf->wTransmitLength_a = cpu_to_le16(wLen); 1006 //Get Duration 1007 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 1008 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 1009 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 1010 1011 pBuf->Data.wDurationID = pBuf->wDuration_aa; 1012 //Get RTS Frame body 1013 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4 1014 1015 if ((pDevice->eOPMode == OP_MODE_ADHOC) || 1016 (pDevice->eOPMode == OP_MODE_AP)) { 1017 memcpy(&(pBuf->Data.abyRA[0]), 1018 &(psEthHeader->abyDstAddr[0]), 1019 ETH_ALEN); 1020 } 1021 else { 1022 memcpy(&(pBuf->Data.abyRA[0]), 1023 &(pDevice->abyBSSID[0]), 1024 ETH_ALEN); 1025 } 1026 if (pDevice->eOPMode == OP_MODE_AP) { 1027 memcpy(&(pBuf->Data.abyTA[0]), 1028 &(pDevice->abyBSSID[0]), 1029 ETH_ALEN); 1030 } 1031 else { 1032 memcpy(&(pBuf->Data.abyTA[0]), 1033 &(psEthHeader->abySrcAddr[0]), 1034 ETH_ALEN); 1035 } 1036 } 1037 else { 1038 PSRTS_g_FB pBuf = (PSRTS_g_FB)pvRTS; 1039 //Get SignalField,ServiceField,Length 1040 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B, 1041 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b) 1042 ); 1043 pBuf->wTransmitLength_b = cpu_to_le16(wLen); 1044 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType, 1045 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a) 1046 ); 1047 pBuf->wTransmitLength_a = cpu_to_le16(wLen); 1048 //Get Duration 1049 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 1050 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 1051 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 1052 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 1053 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 1054 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 1055 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 1056 pBuf->Data.wDurationID = pBuf->wDuration_aa; 1057 //Get RTS Frame body 1058 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4 1059 1060 if ((pDevice->eOPMode == OP_MODE_ADHOC) || 1061 (pDevice->eOPMode == OP_MODE_AP)) { 1062 memcpy(&(pBuf->Data.abyRA[0]), 1063 &(psEthHeader->abyDstAddr[0]), 1064 ETH_ALEN); 1065 } 1066 else { 1067 memcpy(&(pBuf->Data.abyRA[0]), 1068 &(pDevice->abyBSSID[0]), 1069 ETH_ALEN); 1070 } 1071 1072 if (pDevice->eOPMode == OP_MODE_AP) { 1073 memcpy(&(pBuf->Data.abyTA[0]), 1074 &(pDevice->abyBSSID[0]), 1075 ETH_ALEN); 1076 } 1077 else { 1078 memcpy(&(pBuf->Data.abyTA[0]), 1079 &(psEthHeader->abySrcAddr[0]), 1080 ETH_ALEN); 1081 } 1082 1083 } // if (byFBOption == AUTO_FB_NONE) 1084 } 1085 else if (byPktType == PK_TYPE_11A) { 1086 if (byFBOption == AUTO_FB_NONE) { 1087 PSRTS_ab pBuf = (PSRTS_ab)pvRTS; 1088 //Get SignalField,ServiceField,Length 1089 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType, 1090 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField) 1091 ); 1092 pBuf->wTransmitLength = cpu_to_le16(wLen); 1093 //Get Duration 1094 pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData 1095 pBuf->Data.wDurationID = pBuf->wDuration; 1096 //Get RTS Frame body 1097 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4 1098 1099 if ((pDevice->eOPMode == OP_MODE_ADHOC) || 1100 (pDevice->eOPMode == OP_MODE_AP)) { 1101 memcpy(&(pBuf->Data.abyRA[0]), 1102 &(psEthHeader->abyDstAddr[0]), 1103 ETH_ALEN); 1104 } else { 1105 memcpy(&(pBuf->Data.abyRA[0]), 1106 &(pDevice->abyBSSID[0]), 1107 ETH_ALEN); 1108 } 1109 1110 if (pDevice->eOPMode == OP_MODE_AP) { 1111 memcpy(&(pBuf->Data.abyTA[0]), 1112 &(pDevice->abyBSSID[0]), 1113 ETH_ALEN); 1114 } else { 1115 memcpy(&(pBuf->Data.abyTA[0]), 1116 &(psEthHeader->abySrcAddr[0]), 1117 ETH_ALEN); 1118 } 1119 1120 } 1121 else { 1122 PSRTS_a_FB pBuf = (PSRTS_a_FB)pvRTS; 1123 //Get SignalField,ServiceField,Length 1124 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType, 1125 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField) 1126 ); 1127 pBuf->wTransmitLength = cpu_to_le16(wLen); 1128 //Get Duration 1129 pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData 1130 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 1131 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: 1132 pBuf->Data.wDurationID = pBuf->wDuration; 1133 //Get RTS Frame body 1134 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4 1135 1136 if ((pDevice->eOPMode == OP_MODE_ADHOC) || 1137 (pDevice->eOPMode == OP_MODE_AP)) { 1138 memcpy(&(pBuf->Data.abyRA[0]), 1139 &(psEthHeader->abyDstAddr[0]), 1140 ETH_ALEN); 1141 } else { 1142 memcpy(&(pBuf->Data.abyRA[0]), 1143 &(pDevice->abyBSSID[0]), 1144 ETH_ALEN); 1145 } 1146 if (pDevice->eOPMode == OP_MODE_AP) { 1147 memcpy(&(pBuf->Data.abyTA[0]), 1148 &(pDevice->abyBSSID[0]), 1149 ETH_ALEN); 1150 } else { 1151 memcpy(&(pBuf->Data.abyTA[0]), 1152 &(psEthHeader->abySrcAddr[0]), 1153 ETH_ALEN); 1154 } 1155 } 1156 } 1157 else if (byPktType == PK_TYPE_11B) { 1158 PSRTS_ab pBuf = (PSRTS_ab)pvRTS; 1159 //Get SignalField,ServiceField,Length 1160 BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B, 1161 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField) 1162 ); 1163 pBuf->wTransmitLength = cpu_to_le16(wLen); 1164 //Get Duration 1165 pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData 1166 pBuf->Data.wDurationID = pBuf->wDuration; 1167 //Get RTS Frame body 1168 pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4 1169 1170 if ((pDevice->eOPMode == OP_MODE_ADHOC) || 1171 (pDevice->eOPMode == OP_MODE_AP)) { 1172 memcpy(&(pBuf->Data.abyRA[0]), 1173 &(psEthHeader->abyDstAddr[0]), 1174 ETH_ALEN); 1175 } 1176 else { 1177 memcpy(&(pBuf->Data.abyRA[0]), 1178 &(pDevice->abyBSSID[0]), 1179 ETH_ALEN); 1180 } 1181 1182 if (pDevice->eOPMode == OP_MODE_AP) { 1183 memcpy(&(pBuf->Data.abyTA[0]), 1184 &(pDevice->abyBSSID[0]), 1185 ETH_ALEN); 1186 } else { 1187 memcpy(&(pBuf->Data.abyTA[0]), 1188 &(psEthHeader->abySrcAddr[0]), 1189 ETH_ALEN); 1190 } 1191 } 1192 } 1193 1194 static 1195 void 1196 s_vFillCTSHead ( 1197 PSDevice pDevice, 1198 unsigned int uDMAIdx, 1199 BYTE byPktType, 1200 void *pvCTS, 1201 unsigned int cbFrameLength, 1202 BOOL bNeedAck, 1203 BOOL bDisCRC, 1204 WORD wCurrentRate, 1205 BYTE byFBOption 1206 ) 1207 { 1208 unsigned int uCTSFrameLen = 14; 1209 WORD wLen = 0x0000; 1210 1211 if (pvCTS == NULL) { 1212 return; 1213 } 1214 1215 if (bDisCRC) { 1216 // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame, 1217 // in this case we need to decrease its length by 4. 1218 uCTSFrameLen -= 4; 1219 } 1220 1221 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) { 1222 if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) { 1223 // Auto Fall back 1224 PSCTS_FB pBuf = (PSCTS_FB)pvCTS; 1225 //Get SignalField,ServiceField,Length 1226 BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B, 1227 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b) 1228 ); 1229 pBuf->wTransmitLength_b = cpu_to_le16(wLen); 1230 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 1231 pBuf->wDuration_ba += pDevice->wCTSDuration; 1232 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba); 1233 //Get CTSDuration_ba_f0 1234 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 1235 pBuf->wCTSDuration_ba_f0 += pDevice->wCTSDuration; 1236 pBuf->wCTSDuration_ba_f0 = cpu_to_le16(pBuf->wCTSDuration_ba_f0); 1237 //Get CTSDuration_ba_f1 1238 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 1239 pBuf->wCTSDuration_ba_f1 += pDevice->wCTSDuration; 1240 pBuf->wCTSDuration_ba_f1 = cpu_to_le16(pBuf->wCTSDuration_ba_f1); 1241 //Get CTS Frame body 1242 pBuf->Data.wDurationID = pBuf->wDuration_ba; 1243 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4 1244 pBuf->Data.wReserved = 0x0000; 1245 memcpy(&(pBuf->Data.abyRA[0]), 1246 &(pDevice->abyCurrentNetAddr[0]), 1247 ETH_ALEN); 1248 } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) 1249 PSCTS pBuf = (PSCTS)pvCTS; 1250 //Get SignalField,ServiceField,Length 1251 BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B, 1252 (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b) 1253 ); 1254 pBuf->wTransmitLength_b = cpu_to_le16(wLen); 1255 //Get CTSDuration_ba 1256 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 1257 pBuf->wDuration_ba += pDevice->wCTSDuration; 1258 pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba); 1259 1260 //Get CTS Frame body 1261 pBuf->Data.wDurationID = pBuf->wDuration_ba; 1262 pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4 1263 pBuf->Data.wReserved = 0x0000; 1264 memcpy(&(pBuf->Data.abyRA[0]), 1265 &(pDevice->abyCurrentNetAddr[0]), 1266 ETH_ALEN); 1267 } 1268 } 1269 } 1270 1271 /*+ 1272 * 1273 * Description: 1274 * Generate FIFO control for MAC & Baseband controller 1275 * 1276 * Parameters: 1277 * In: 1278 * pDevice - Pointer to adpater 1279 * pTxDataHead - Transmit Data Buffer 1280 * pTxBufHead - pTxBufHead 1281 * pvRrvTime - pvRrvTime 1282 * pvRTS - RTS Buffer 1283 * pCTS - CTS Buffer 1284 * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS) 1285 * bNeedACK - If need ACK 1286 * uDMAIdx - DMA Index 1287 * Out: 1288 * none 1289 * 1290 * Return Value: none 1291 * 1292 -*/ 1293 1294 static 1295 void 1296 s_vGenerateTxParameter ( 1297 PSDevice pDevice, 1298 BYTE byPktType, 1299 WORD wCurrentRate, 1300 void *pTxBufHead, 1301 void *pvRrvTime, 1302 void *pvRTS, 1303 void *pvCTS, 1304 unsigned int cbFrameSize, 1305 BOOL bNeedACK, 1306 unsigned int uDMAIdx, 1307 PSEthernetHeader psEthHeader 1308 ) 1309 { 1310 unsigned int cbMACHdLen = WLAN_HDR_ADDR3_LEN; /* 24 */ 1311 WORD wFifoCtl; 1312 BOOL bDisCRC = FALSE; 1313 BYTE byFBOption = AUTO_FB_NONE; 1314 // WORD wCurrentRate = pDevice->wCurrentRate; 1315 1316 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter...\n"); 1317 PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead; 1318 pFifoHead->wReserved = wCurrentRate; 1319 wFifoCtl = pFifoHead->wFIFOCtl; 1320 1321 if (wFifoCtl & FIFOCTL_CRCDIS) { 1322 bDisCRC = TRUE; 1323 } 1324 1325 if (wFifoCtl & FIFOCTL_AUTO_FB_0) { 1326 byFBOption = AUTO_FB_0; 1327 } 1328 else if (wFifoCtl & FIFOCTL_AUTO_FB_1) { 1329 byFBOption = AUTO_FB_1; 1330 } 1331 1332 if (pDevice->bLongHeader) 1333 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6; 1334 1335 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) { 1336 1337 if (pvRTS != NULL) { //RTS_need 1338 //Fill RsvTime 1339 if (pvRrvTime) { 1340 PSRrvTime_gRTS pBuf = (PSRrvTime_gRTS)pvRrvTime; 1341 pBuf->wRTSTxRrvTime_aa = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 1:2.4GHz 1342 pBuf->wRTSTxRrvTime_ba = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate));//1:RTSTxRrvTime_ba, 1:2.4GHz 1343 pBuf->wRTSTxRrvTime_bb = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz 1344 pBuf->wTxRrvTime_a = cpu_to_le16((WORD) s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM 1345 pBuf->wTxRrvTime_b = cpu_to_le16((WORD) s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK 1346 } 1347 //Fill RTS 1348 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption); 1349 } 1350 else {//RTS_needless, PCF mode 1351 1352 //Fill RsvTime 1353 if (pvRrvTime) { 1354 PSRrvTime_gCTS pBuf = (PSRrvTime_gCTS)pvRrvTime; 1355 pBuf->wTxRrvTime_a = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM 1356 pBuf->wTxRrvTime_b = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK 1357 pBuf->wCTSTxRrvTime_ba = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate));//3:CTSTxRrvTime_Ba, 1:2.4GHz 1358 } 1359 //Fill CTS 1360 s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption); 1361 } 1362 } 1363 else if (byPktType == PK_TYPE_11A) { 1364 1365 if (pvRTS != NULL) {//RTS_need, non PCF mode 1366 //Fill RsvTime 1367 if (pvRrvTime) { 1368 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime; 1369 pBuf->wRTSTxRrvTime = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 0:5GHz 1370 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//0:OFDM 1371 } 1372 //Fill RTS 1373 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption); 1374 } 1375 else if (pvRTS == NULL) {//RTS_needless, non PCF mode 1376 //Fill RsvTime 1377 if (pvRrvTime) { 1378 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime; 1379 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK)); //0:OFDM 1380 } 1381 } 1382 } 1383 else if (byPktType == PK_TYPE_11B) { 1384 1385 if ((pvRTS != NULL)) {//RTS_need, non PCF mode 1386 //Fill RsvTime 1387 if (pvRrvTime) { 1388 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime; 1389 pBuf->wRTSTxRrvTime = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz 1390 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK));//1:CCK 1391 } 1392 //Fill RTS 1393 s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption); 1394 } 1395 else { //RTS_needless, non PCF mode 1396 //Fill RsvTime 1397 if (pvRrvTime) { 1398 PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime; 1399 pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK)); //1:CCK 1400 } 1401 } 1402 } 1403 //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter END.\n"); 1404 } 1405 /* 1406 PBYTE pbyBuffer,//point to pTxBufHead 1407 WORD wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last 1408 unsigned int cbFragmentSize,//Hdr+payoad+FCS 1409 */ 1410 1411 1412 BOOL 1413 s_bPacketToWirelessUsb( 1414 PSDevice pDevice, 1415 BYTE byPktType, 1416 PBYTE usbPacketBuf, 1417 BOOL bNeedEncryption, 1418 unsigned int uSkbPacketLen, 1419 unsigned int uDMAIdx, 1420 PSEthernetHeader psEthHeader, 1421 PBYTE pPacket, 1422 PSKeyItem pTransmitKey, 1423 unsigned int uNodeIndex, 1424 WORD wCurrentRate, 1425 unsigned int *pcbHeaderLen, 1426 unsigned int *pcbTotalLen 1427 ) 1428 { 1429 PSMgmtObject pMgmt = &(pDevice->sMgmtObj); 1430 unsigned int cbFrameSize, cbFrameBodySize; 1431 PTX_BUFFER pTxBufHead; 1432 unsigned int cb802_1_H_len; 1433 unsigned int cbIVlen = 0, cbICVlen = 0, cbMIClen = 0, 1434 cbMACHdLen = 0, cbFCSlen = 4; 1435 unsigned int cbMICHDR = 0; 1436 BOOL bNeedACK,bRTS; 1437 PBYTE pbyType,pbyMacHdr,pbyIVHead,pbyPayloadHead,pbyTxBufferAddr; 1438 BYTE abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00}; 1439 BYTE abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8}; 1440 unsigned int uDuration; 1441 unsigned int cbHeaderLength = 0, uPadding = 0; 1442 void *pvRrvTime; 1443 PSMICHDRHead pMICHDR; 1444 void *pvRTS; 1445 void *pvCTS; 1446 void *pvTxDataHd; 1447 BYTE byFBOption = AUTO_FB_NONE,byFragType; 1448 WORD wTxBufSize; 1449 DWORD dwMICKey0,dwMICKey1,dwMIC_Priority,dwCRC; 1450 PDWORD pdwMIC_L,pdwMIC_R; 1451 BOOL bSoftWEP = FALSE; 1452 1453 1454 1455 1456 pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL; 1457 if ((bNeedEncryption) && (pTransmitKey != NULL)) { 1458 if (((PSKeyTable) (pTransmitKey->pvKeyTable))->bSoftWEP == TRUE) { 1459 // WEP 256 1460 bSoftWEP = TRUE; 1461 } 1462 } 1463 1464 pTxBufHead = (PTX_BUFFER) usbPacketBuf; 1465 memset(pTxBufHead, 0, sizeof(TX_BUFFER)); 1466 1467 // Get pkt type 1468 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) { 1469 if (pDevice->dwDiagRefCount == 0) { 1470 cb802_1_H_len = 8; 1471 } else { 1472 cb802_1_H_len = 2; 1473 } 1474 } else { 1475 cb802_1_H_len = 0; 1476 } 1477 1478 cbFrameBodySize = uSkbPacketLen - ETH_HLEN + cb802_1_H_len; 1479 1480 //Set packet type 1481 pTxBufHead->wFIFOCtl |= (WORD)(byPktType<<8); 1482 1483 if (pDevice->dwDiagRefCount != 0) { 1484 bNeedACK = FALSE; 1485 pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK); 1486 } else { //if (pDevice->dwDiagRefCount != 0) { 1487 if ((pDevice->eOPMode == OP_MODE_ADHOC) || 1488 (pDevice->eOPMode == OP_MODE_AP)) { 1489 if (is_multicast_ether_addr(psEthHeader->abyDstAddr)) { 1490 bNeedACK = FALSE; 1491 pTxBufHead->wFIFOCtl = 1492 pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK); 1493 } else { 1494 bNeedACK = TRUE; 1495 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK; 1496 } 1497 } 1498 else { 1499 // MSDUs in Infra mode always need ACK 1500 bNeedACK = TRUE; 1501 pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK; 1502 } 1503 } //if (pDevice->dwDiagRefCount != 0) { 1504 1505 pTxBufHead->wTimeStamp = DEFAULT_MSDU_LIFETIME_RES_64us; 1506 1507 //Set FIFOCTL_LHEAD 1508 if (pDevice->bLongHeader) 1509 pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD; 1510 1511 if (pDevice->bSoftwareGenCrcErr) { 1512 pTxBufHead->wFIFOCtl |= FIFOCTL_CRCDIS; // set tx descriptors to NO hardware CRC 1513 } 1514 1515 //Set FRAGCTL_MACHDCNT 1516 if (pDevice->bLongHeader) { 1517 cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6; 1518 } else { 1519 cbMACHdLen = WLAN_HDR_ADDR3_LEN; 1520 } 1521 pTxBufHead->wFragCtl |= (WORD)(cbMACHdLen << 10); 1522 1523 //Set FIFOCTL_GrpAckPolicy 1524 if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000 1525 pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK; 1526 } 1527 1528 //Set Auto Fallback Ctl 1529 if (wCurrentRate >= RATE_18M) { 1530 if (pDevice->byAutoFBCtrl == AUTO_FB_0) { 1531 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0; 1532 byFBOption = AUTO_FB_0; 1533 } else if (pDevice->byAutoFBCtrl == AUTO_FB_1) { 1534 pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1; 1535 byFBOption = AUTO_FB_1; 1536 } 1537 } 1538 1539 if (bSoftWEP != TRUE) { 1540 if ((bNeedEncryption) && (pTransmitKey != NULL)) { //WEP enabled 1541 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104 1542 pTxBufHead->wFragCtl |= FRAGCTL_LEGACY; 1543 } 1544 if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) { 1545 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Tx Set wFragCtl == FRAGCTL_TKIP\n"); 1546 pTxBufHead->wFragCtl |= FRAGCTL_TKIP; 1547 } 1548 else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP 1549 pTxBufHead->wFragCtl |= FRAGCTL_AES; 1550 } 1551 } 1552 } 1553 1554 1555 if ((bNeedEncryption) && (pTransmitKey != NULL)) { 1556 if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { 1557 cbIVlen = 4; 1558 cbICVlen = 4; 1559 } 1560 else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) { 1561 cbIVlen = 8;//IV+ExtIV 1562 cbMIClen = 8; 1563 cbICVlen = 4; 1564 } 1565 if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { 1566 cbIVlen = 8;//RSN Header 1567 cbICVlen = 8;//MIC 1568 cbMICHDR = sizeof(SMICHDRHead); 1569 } 1570 if (bSoftWEP == FALSE) { 1571 //MAC Header should be padding 0 to DW alignment. 1572 uPadding = 4 - (cbMACHdLen%4); 1573 uPadding %= 4; 1574 } 1575 } 1576 1577 cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen; 1578 1579 if ( (bNeedACK == FALSE) ||(cbFrameSize < pDevice->wRTSThreshold) ) { 1580 bRTS = FALSE; 1581 } else { 1582 bRTS = TRUE; 1583 pTxBufHead->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY); 1584 } 1585 1586 pbyTxBufferAddr = (PBYTE) &(pTxBufHead->adwTxKey[0]); 1587 wTxBufSize = sizeof(STxBufHead); 1588 if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet 1589 if (byFBOption == AUTO_FB_NONE) { 1590 if (bRTS == TRUE) {//RTS_need 1591 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize); 1592 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS)); 1593 pvRTS = (PSRTS_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR); 1594 pvCTS = NULL; 1595 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g)); 1596 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g) + sizeof(STxDataHead_g); 1597 } 1598 else { //RTS_needless 1599 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize); 1600 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS)); 1601 pvRTS = NULL; 1602 pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR); 1603 pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS)); 1604 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g); 1605 } 1606 } else { 1607 // Auto Fall Back 1608 if (bRTS == TRUE) {//RTS_need 1609 pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize); 1610 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS)); 1611 pvRTS = (PSRTS_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR); 1612 pvCTS = NULL; 1613 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB)); 1614 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB) + sizeof(STxDataHead_g_FB); 1615 } 1616 else if (bRTS == FALSE) { //RTS_needless 1617 pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize); 1618 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS)); 1619 pvRTS = NULL; 1620 pvCTS = (PSCTS_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR); 1621 pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB)); 1622 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB) + sizeof(STxDataHead_g_FB); 1623 } 1624 } // Auto Fall Back 1625 } 1626 else {//802.11a/b packet 1627 if (byFBOption == AUTO_FB_NONE) { 1628 if (bRTS == TRUE) {//RTS_need 1629 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize); 1630 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab)); 1631 pvRTS = (PSRTS_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR); 1632 pvCTS = NULL; 1633 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab)); 1634 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab) + sizeof(STxDataHead_ab); 1635 } 1636 else if (bRTS == FALSE) { //RTS_needless, no MICHDR 1637 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize); 1638 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab)); 1639 pvRTS = NULL; 1640 pvCTS = NULL; 1641 pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR); 1642 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab); 1643 } 1644 } else { 1645 // Auto Fall Back 1646 if (bRTS == TRUE) {//RTS_need 1647 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize); 1648 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab)); 1649 pvRTS = (PSRTS_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR); 1650 pvCTS = NULL; 1651 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB)); 1652 cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB) + sizeof(STxDataHead_a_FB); 1653 } 1654 else if (bRTS == FALSE) { //RTS_needless 1655 pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize); 1656 pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab)); 1657 pvRTS = NULL; 1658 pvCTS = NULL; 1659 pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR); 1660 cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_a_FB); 1661 } 1662 } // Auto Fall Back 1663 } 1664 1665 pbyMacHdr = (PBYTE)(pbyTxBufferAddr + cbHeaderLength); 1666 pbyIVHead = (PBYTE)(pbyMacHdr + cbMACHdLen + uPadding); 1667 pbyPayloadHead = (PBYTE)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen); 1668 1669 1670 //========================= 1671 // No Fragmentation 1672 //========================= 1673 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Fragmentation...\n"); 1674 byFragType = FRAGCTL_NONFRAG; 1675 //uDMAIdx = TYPE_AC0DMA; 1676 //pTxBufHead = (PSTxBufHead) &(pTxBufHead->adwTxKey[0]); 1677 1678 1679 //Fill FIFO,RrvTime,RTS,and CTS 1680 s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, 1681 (void *)pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS, 1682 cbFrameSize, bNeedACK, uDMAIdx, psEthHeader); 1683 //Fill DataHead 1684 uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK, 1685 0, 0, 1/*uMACfragNum*/, byFBOption); 1686 // Generate TX MAC Header 1687 s_vGenerateMACHeader(pDevice, pbyMacHdr, (WORD)uDuration, psEthHeader, bNeedEncryption, 1688 byFragType, uDMAIdx, 0); 1689 1690 if (bNeedEncryption == TRUE) { 1691 //Fill TXKEY 1692 s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey, 1693 pbyMacHdr, (WORD)cbFrameBodySize, (PBYTE)pMICHDR); 1694 1695 if (pDevice->bEnableHostWEP) { 1696 pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16; 1697 pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0; 1698 } 1699 } 1700 1701 // 802.1H 1702 if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) { 1703 if (pDevice->dwDiagRefCount == 0) { 1704 if ((psEthHeader->wType == cpu_to_le16(ETH_P_IPX)) || 1705 (psEthHeader->wType == cpu_to_le16(0xF380))) { 1706 memcpy((PBYTE) (pbyPayloadHead), 1707 abySNAP_Bridgetunnel, 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 1844 void 1845 s_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 available; otherwise FALSE 1942 * 1943 -*/ 1944 1945 CMD_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 2236 CMD_STATUS 2237 csBeacon_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 2329 void 2330 vDMA0_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 2732 int 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 == cpu_to_le16(ETH_P_PAE)) { 2844 /* 802.1x OR eapol-key challenge frame transfer */ 2845 if (((Protocol_Version == 1) || (Protocol_Version == 2)) && 2846 (Packet_Type == 3)) { 2847 bTxeapol_key = TRUE; 2848 if(!(Key_info & BIT3) && //WPA or RSN group-key challenge 2849 (Key_info & BIT8) && (Key_info & BIT9)) { //send 2/2 key 2850 if(Descriptor_type==254) { 2851 pDevice->fWPA_Authened = TRUE; 2852 PRINT_K("WPA "); 2853 } 2854 else { 2855 pDevice->fWPA_Authened = TRUE; 2856 PRINT_K("WPA2(re-keying) "); 2857 } 2858 PRINT_K("Authentication completed!!\n"); 2859 } 2860 else if((Key_info & BIT3) && (Descriptor_type==2) && //RSN pairse-key challenge 2861 (Key_info & BIT8) && (Key_info & BIT9)) { 2862 pDevice->fWPA_Authened = TRUE; 2863 PRINT_K("WPA2 Authentication completed!!\n"); 2864 } 2865 } 2866 } 2867 } 2868 //mike add:station mode check eapol-key challenge<--- 2869 2870 if (pDevice->bEncryptionEnable == TRUE) { 2871 bNeedEncryption = TRUE; 2872 // get Transmit key 2873 do { 2874 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && 2875 (pMgmt->eCurrState == WMAC_STATE_ASSOC)) { 2876 pbyBSSID = pDevice->abyBSSID; 2877 // get pairwise key 2878 if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) { 2879 // get group key 2880 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) { 2881 bTKIP_UseGTK = TRUE; 2882 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n"); 2883 break; 2884 } 2885 } else { 2886 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get PTK.\n"); 2887 break; 2888 } 2889 }else if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) { 2890 2891 pbyBSSID = pDevice->sTxEthHeader.abyDstAddr; //TO_DS = 0 and FROM_DS = 0 --> 802.11 MAC Address1 2892 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS Serach Key: \n"); 2893 for (ii = 0; ii< 6; ii++) 2894 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"%x \n", *(pbyBSSID+ii)); 2895 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"\n"); 2896 2897 // get pairwise key 2898 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == TRUE) 2899 break; 2900 } 2901 // get group key 2902 pbyBSSID = pDevice->abyBroadcastAddr; 2903 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) { 2904 pTransmitKey = NULL; 2905 if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) { 2906 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode); 2907 } 2908 else 2909 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"NOT IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode); 2910 } else { 2911 bTKIP_UseGTK = TRUE; 2912 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n"); 2913 } 2914 } while(FALSE); 2915 } 2916 2917 if (pDevice->bEnableHostWEP) { 2918 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"acdma0: STA index %d\n", uNodeIndex); 2919 if (pDevice->bEncryptionEnable == TRUE) { 2920 pTransmitKey = &STempKey; 2921 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite; 2922 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex; 2923 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength; 2924 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16; 2925 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0; 2926 memcpy(pTransmitKey->abyKey, 2927 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0], 2928 pTransmitKey->uKeyLength 2929 ); 2930 } 2931 } 2932 2933 byPktType = (BYTE)pDevice->byPacketType; 2934 2935 if (pDevice->bFixRate) { 2936 if (pDevice->byBBType == BB_TYPE_11B) { 2937 if (pDevice->uConnectionRate >= RATE_11M) { 2938 pDevice->wCurrentRate = RATE_11M; 2939 } else { 2940 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate; 2941 } 2942 } else { 2943 if ((pDevice->byBBType == BB_TYPE_11A) && 2944 (pDevice->uConnectionRate <= RATE_6M)) { 2945 pDevice->wCurrentRate = RATE_6M; 2946 } else { 2947 if (pDevice->uConnectionRate >= RATE_54M) 2948 pDevice->wCurrentRate = RATE_54M; 2949 else 2950 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate; 2951 } 2952 } 2953 } 2954 else { 2955 if (pDevice->eOPMode == OP_MODE_ADHOC) { 2956 // Adhoc Tx rate decided from node DB 2957 if (is_multicast_ether_addr(pDevice->sTxEthHeader.abyDstAddr)) { 2958 // Multicast use highest data rate 2959 pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate; 2960 // preamble type 2961 pDevice->byPreambleType = pDevice->byShortPreamble; 2962 } 2963 else { 2964 if(BSSbIsSTAInNodeDB(pDevice, &(pDevice->sTxEthHeader.abyDstAddr[0]), &uNodeIndex)) { 2965 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate; 2966 if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) { 2967 pDevice->byPreambleType = pDevice->byShortPreamble; 2968 2969 } 2970 else { 2971 pDevice->byPreambleType = PREAMBLE_LONG; 2972 } 2973 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Found Node Index is [%d] Tx Data Rate:[%d]\n",uNodeIndex, pDevice->wCurrentRate); 2974 } 2975 else { 2976 if (pDevice->byBBType != BB_TYPE_11A) 2977 pDevice->wCurrentRate = RATE_2M; 2978 else 2979 pDevice->wCurrentRate = RATE_24M; // refer to vMgrCreateOwnIBSS()'s 2980 // abyCurrExtSuppRates[] 2981 pDevice->byPreambleType = PREAMBLE_SHORT; 2982 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Not Found Node use highest basic Rate.....\n"); 2983 } 2984 } 2985 } 2986 if (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) { 2987 // Infra STA rate decided from AP Node, index = 0 2988 pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate; 2989 } 2990 } 2991 2992 if (pDevice->sTxEthHeader.wType == cpu_to_le16(ETH_P_PAE)) { 2993 if (pDevice->byBBType != BB_TYPE_11A) { 2994 pDevice->wCurrentRate = RATE_1M; 2995 pDevice->byACKRate = RATE_1M; 2996 pDevice->byTopCCKBasicRate = RATE_1M; 2997 pDevice->byTopOFDMBasicRate = RATE_6M; 2998 } else { 2999 pDevice->wCurrentRate = RATE_6M; 3000 pDevice->byACKRate = RATE_6M; 3001 pDevice->byTopCCKBasicRate = RATE_1M; 3002 pDevice->byTopOFDMBasicRate = RATE_6M; 3003 } 3004 } 3005 3006 DBG_PRT(MSG_LEVEL_DEBUG, 3007 KERN_INFO "dma_tx: pDevice->wCurrentRate = %d\n", 3008 pDevice->wCurrentRate); 3009 3010 if (wKeepRate != pDevice->wCurrentRate) { 3011 bScheduleCommand((void *) pDevice, WLAN_CMD_SETPOWER, NULL); 3012 } 3013 3014 if (pDevice->wCurrentRate <= RATE_11M) { 3015 byPktType = PK_TYPE_11B; 3016 } 3017 3018 if (bNeedEncryption == TRUE) { 3019 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType)); 3020 if ((pDevice->sTxEthHeader.wType) == cpu_to_le16(ETH_P_PAE)) { 3021 bNeedEncryption = FALSE; 3022 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType)); 3023 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) { 3024 if (pTransmitKey == NULL) { 3025 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Don't Find TX KEY\n"); 3026 } 3027 else { 3028 if (bTKIP_UseGTK == TRUE) { 3029 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n"); 3030 } 3031 else { 3032 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex); 3033 bNeedEncryption = TRUE; 3034 } 3035 } 3036 } 3037 3038 if (pDevice->byCntMeasure == 2) { 3039 bNeedDeAuth = TRUE; 3040 pDevice->s802_11Counter.TKIPCounterMeasuresInvoked++; 3041 } 3042 3043 if (pDevice->bEnableHostWEP) { 3044 if ((uNodeIndex != 0) && 3045 (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) { 3046 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex); 3047 bNeedEncryption = TRUE; 3048 } 3049 } 3050 } 3051 else { 3052 3053 if (pTransmitKey == NULL) { 3054 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n"); 3055 dev_kfree_skb_irq(skb); 3056 pStats->tx_dropped++; 3057 return STATUS_FAILURE; 3058 } 3059 } 3060 } 3061 3062 fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType, 3063 (PBYTE)(&pContext->Data[0]), bNeedEncryption, 3064 skb->len, uDMAIdx, &pDevice->sTxEthHeader, 3065 (PBYTE)skb->data, pTransmitKey, uNodeIndex, 3066 pDevice->wCurrentRate, 3067 &uHeaderLen, &BytesToWrite 3068 ); 3069 3070 if (fConvertedPacket == FALSE) { 3071 pContext->bBoolInUse = FALSE; 3072 dev_kfree_skb_irq(skb); 3073 return STATUS_FAILURE; 3074 } 3075 3076 if ( pDevice->bEnablePSMode == TRUE ) { 3077 if ( !pDevice->bPSModeTxBurst ) { 3078 bScheduleCommand((void *) pDevice, 3079 WLAN_CMD_MAC_DISPOWERSAVING, 3080 NULL); 3081 pDevice->bPSModeTxBurst = TRUE; 3082 } 3083 } 3084 3085 pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]); 3086 pTX_Buffer->byPKTNO = (BYTE) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F)); 3087 pTX_Buffer->wTxByteCount = (WORD)BytesToWrite; 3088 3089 pContext->pPacket = skb; 3090 pContext->Type = CONTEXT_DATA_PACKET; 3091 pContext->uBufLen = (WORD)BytesToWrite + 4 ; //USB header 3092 3093 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.abyDstAddr[0]),(WORD) (BytesToWrite-uHeaderLen),pTX_Buffer->wFIFOCtl); 3094 3095 status = PIPEnsSendBulkOut(pDevice,pContext); 3096 3097 if (bNeedDeAuth == TRUE) { 3098 WORD wReason = WLAN_MGMT_REASON_MIC_FAILURE; 3099 3100 bScheduleCommand((void *) pDevice, WLAN_CMD_DEAUTH, (PBYTE) &wReason); 3101 } 3102 3103 if(status!=STATUS_PENDING) { 3104 pContext->bBoolInUse = FALSE; 3105 dev_kfree_skb_irq(skb); 3106 return STATUS_FAILURE; 3107 } 3108 else 3109 return 0; 3110 3111 } 3112 3113 3114 3115 /* 3116 * Description: 3117 * Relay packet send (AC1DMA) from rx dpc. 3118 * 3119 * Parameters: 3120 * In: 3121 * pDevice - Pointer to the adapter 3122 * pPacket - Pointer to rx packet 3123 * cbPacketSize - rx ethernet frame size 3124 * Out: 3125 * TURE, FALSE 3126 * 3127 * Return Value: Return TRUE if packet is copy to dma1; otherwise FALSE 3128 */ 3129 3130 3131 BOOL 3132 bRelayPacketSend ( 3133 PSDevice pDevice, 3134 PBYTE pbySkbData, 3135 unsigned int uDataLen, 3136 unsigned int uNodeIndex 3137 ) 3138 { 3139 PSMgmtObject pMgmt = &(pDevice->sMgmtObj); 3140 unsigned int BytesToWrite = 0, uHeaderLen = 0; 3141 BYTE byPktType = PK_TYPE_11B; 3142 BOOL bNeedEncryption = FALSE; 3143 SKeyItem STempKey; 3144 PSKeyItem pTransmitKey = NULL; 3145 PBYTE pbyBSSID; 3146 PUSB_SEND_CONTEXT pContext; 3147 BYTE byPktTyp; 3148 BOOL fConvertedPacket; 3149 PTX_BUFFER pTX_Buffer; 3150 unsigned int status; 3151 WORD wKeepRate = pDevice->wCurrentRate; 3152 3153 3154 3155 pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice); 3156 3157 if (NULL == pContext) { 3158 return FALSE; 3159 } 3160 3161 memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)pbySkbData, ETH_HLEN); 3162 3163 if (pDevice->bEncryptionEnable == TRUE) { 3164 bNeedEncryption = TRUE; 3165 // get group key 3166 pbyBSSID = pDevice->abyBroadcastAddr; 3167 if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) { 3168 pTransmitKey = NULL; 3169 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"KEY is NULL. [%d]\n", pMgmt->eCurrMode); 3170 } else { 3171 DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n"); 3172 } 3173 } 3174 3175 if (pDevice->bEnableHostWEP) { 3176 if (uNodeIndex < MAX_NODE_NUM + 1) { 3177 pTransmitKey = &STempKey; 3178 pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite; 3179 pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex; 3180 pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength; 3181 pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16; 3182 pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0; 3183 memcpy(pTransmitKey->abyKey, 3184 &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0], 3185 pTransmitKey->uKeyLength 3186 ); 3187 } 3188 } 3189 3190 if ( bNeedEncryption && (pTransmitKey == NULL) ) { 3191 pContext->bBoolInUse = FALSE; 3192 return FALSE; 3193 } 3194 3195 byPktTyp = (BYTE)pDevice->byPacketType; 3196 3197 if (pDevice->bFixRate) { 3198 if (pDevice->byBBType == BB_TYPE_11B) { 3199 if (pDevice->uConnectionRate >= RATE_11M) { 3200 pDevice->wCurrentRate = RATE_11M; 3201 } else { 3202 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate; 3203 } 3204 } else { 3205 if ((pDevice->byBBType == BB_TYPE_11A) && 3206 (pDevice->uConnectionRate <= RATE_6M)) { 3207 pDevice->wCurrentRate = RATE_6M; 3208 } else { 3209 if (pDevice->uConnectionRate >= RATE_54M) 3210 pDevice->wCurrentRate = RATE_54M; 3211 else 3212 pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate; 3213 } 3214 } 3215 } 3216 else { 3217 pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate; 3218 } 3219 3220 if (wKeepRate != pDevice->wCurrentRate) { 3221 bScheduleCommand((void *) pDevice, WLAN_CMD_SETPOWER, NULL); 3222 } 3223 3224 if (pDevice->wCurrentRate <= RATE_11M) 3225 byPktType = PK_TYPE_11B; 3226 3227 BytesToWrite = uDataLen + ETH_FCS_LEN; 3228 3229 // Convert the packet to an usb frame and copy into our buffer 3230 // and send the irp. 3231 3232 fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType, 3233 (PBYTE)(&pContext->Data[0]), bNeedEncryption, 3234 uDataLen, TYPE_AC0DMA, &pDevice->sTxEthHeader, 3235 pbySkbData, pTransmitKey, uNodeIndex, 3236 pDevice->wCurrentRate, 3237 &uHeaderLen, &BytesToWrite 3238 ); 3239 3240 if (fConvertedPacket == FALSE) { 3241 pContext->bBoolInUse = FALSE; 3242 return FALSE; 3243 } 3244 3245 pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]); 3246 pTX_Buffer->byPKTNO = (BYTE) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F)); 3247 pTX_Buffer->wTxByteCount = (WORD)BytesToWrite; 3248 3249 pContext->pPacket = NULL; 3250 pContext->Type = CONTEXT_DATA_PACKET; 3251 pContext->uBufLen = (WORD)BytesToWrite + 4 ; //USB header 3252 3253 s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.abyDstAddr[0]),(WORD) (BytesToWrite-uHeaderLen),pTX_Buffer->wFIFOCtl); 3254 3255 status = PIPEnsSendBulkOut(pDevice,pContext); 3256 3257 return TRUE; 3258 } 3259 3260