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