Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

staging: vt6655: dpc.c/h remove dead functions

s_byGetRateIdx
s_vGetDASA
s_vProcessRxMACHeader
s_bAPModeRxCtl
s_bAPModeRxData
s_bHandleRxEncryption
s_bHostWepRxEncryption
s_vProcessRxMACHeader
s_byGetRateIdx
s_vGetDASA
device_receive_frame
s_bAPModeRxCtl

Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Malcolm Priestley and committed by
Greg Kroah-Hartman
01b89792 2759e217

-1294
-1286
drivers/staging/vt6655/dpc.c
··· 25 25 * Date: May 20, 2003 26 26 * 27 27 * Functions: 28 - * device_receive_frame - Rcv 802.11 frame function 29 - * s_bAPModeRxCtl- AP Rcv frame filer Ctl. 30 - * s_bAPModeRxData- AP Rcv data frame handle 31 - * s_bHandleRxEncryption- Rcv decrypted data via on-fly 32 - * s_bHostWepRxEncryption- Rcv encrypted data via host 33 - * s_byGetRateIdx- get rate index 34 - * s_vGetDASA- get data offset 35 - * s_vProcessRxMACHeader- Rcv 802.11 and translate to 802.3 36 28 * 37 29 * Revision History: 38 30 * 39 31 */ 40 32 41 33 #include "device.h" 42 - #include "rxtx.h" 43 - #include "tether.h" 44 - #include "card.h" 45 - #include "bssdb.h" 46 - #include "mac.h" 47 34 #include "baseband.h" 48 - #include "michael.h" 49 - #include "tkip.h" 50 - #include "tcrc.h" 51 - #include "wctl.h" 52 - #include "wroute.h" 53 35 #include "rf.h" 54 - #include "iowpa.h" 55 - #include "aes_ccmp.h" 56 36 #include "dpc.h" 57 - 58 - /*--------------------- Static Definitions -------------------------*/ 59 - 60 - /*--------------------- Static Classes ----------------------------*/ 61 - 62 - /*--------------------- Static Variables --------------------------*/ 63 - static const unsigned char acbyRxRate[MAX_RATE] = 64 - {2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108}; 65 - 66 - /*--------------------- Static Functions --------------------------*/ 67 - 68 - /*--------------------- Static Definitions -------------------------*/ 69 - 70 - /*--------------------- Static Functions --------------------------*/ 71 - 72 - static unsigned char s_byGetRateIdx(unsigned char byRate); 73 - 74 - static void 75 - s_vGetDASA(unsigned char *pbyRxBufferAddr, unsigned int *pcbHeaderSize, 76 - PSEthernetHeader psEthHeader); 77 - 78 - static void 79 - s_vProcessRxMACHeader(struct vnt_private *pDevice, unsigned char *pbyRxBufferAddr, 80 - unsigned int cbPacketSize, bool bIsWEP, bool bExtIV, 81 - unsigned int *pcbHeadSize); 82 - 83 - static bool s_bAPModeRxCtl( 84 - struct vnt_private *pDevice, 85 - unsigned char *pbyFrame, 86 - int iSANodeIndex 87 - ); 88 - 89 - static bool s_bAPModeRxData( 90 - struct vnt_private *pDevice, 91 - struct sk_buff *skb, 92 - unsigned int FrameSize, 93 - unsigned int cbHeaderOffset, 94 - int iSANodeIndex, 95 - int iDANodeIndex 96 - ); 97 - 98 - static bool s_bHandleRxEncryption( 99 - struct vnt_private *pDevice, 100 - unsigned char *pbyFrame, 101 - unsigned int FrameSize, 102 - unsigned char *pbyRsr, 103 - unsigned char *pbyNewRsr, 104 - PSKeyItem *pKeyOut, 105 - bool *pbExtIV, 106 - unsigned short *pwRxTSC15_0, 107 - unsigned long *pdwRxTSC47_16 108 - ); 109 - 110 - static bool s_bHostWepRxEncryption( 111 - 112 - struct vnt_private *pDevice, 113 - unsigned char *pbyFrame, 114 - unsigned int FrameSize, 115 - unsigned char *pbyRsr, 116 - bool bOnFly, 117 - PSKeyItem pKey, 118 - unsigned char *pbyNewRsr, 119 - bool *pbExtIV, 120 - unsigned short *pwRxTSC15_0, 121 - unsigned long *pdwRxTSC47_16 122 - 123 - ); 124 - 125 - /*--------------------- Export Variables --------------------------*/ 126 - 127 - /*+ 128 - * 129 - * Description: 130 - * Translate Rcv 802.11 header to 802.3 header with Rx buffer 131 - * 132 - * Parameters: 133 - * In: 134 - * pDevice 135 - * dwRxBufferAddr - Address of Rcv Buffer 136 - * cbPacketSize - Rcv Packet size 137 - * bIsWEP - If Rcv with WEP 138 - * Out: 139 - * pcbHeaderSize - 802.11 header size 140 - * 141 - * Return Value: None 142 - * 143 - -*/ 144 - static void 145 - s_vProcessRxMACHeader(struct vnt_private *pDevice, 146 - unsigned char *pbyRxBufferAddr, 147 - unsigned int cbPacketSize, bool bIsWEP, bool bExtIV, 148 - unsigned int *pcbHeadSize) 149 - { 150 - unsigned char *pbyRxBuffer; 151 - unsigned int cbHeaderSize = 0; 152 - unsigned short *pwType; 153 - PS802_11Header pMACHeader; 154 - int ii; 155 - 156 - pMACHeader = (PS802_11Header) (pbyRxBufferAddr + cbHeaderSize); 157 - 158 - s_vGetDASA((unsigned char *)pMACHeader, &cbHeaderSize, &pDevice->sRxEthHeader); 159 - 160 - if (bIsWEP) { 161 - if (bExtIV) { 162 - /* strip IV&ExtIV, add 8 byte */ 163 - cbHeaderSize += (WLAN_HDR_ADDR3_LEN + 8); 164 - } else { 165 - /* strip IV, add 4 byte */ 166 - cbHeaderSize += (WLAN_HDR_ADDR3_LEN + 4); 167 - } 168 - } else { 169 - cbHeaderSize += WLAN_HDR_ADDR3_LEN; 170 - } 171 - 172 - pbyRxBuffer = (unsigned char *)(pbyRxBufferAddr + cbHeaderSize); 173 - if (ether_addr_equal(pbyRxBuffer, pDevice->abySNAP_Bridgetunnel)) { 174 - cbHeaderSize += 6; 175 - } else if (ether_addr_equal(pbyRxBuffer, pDevice->abySNAP_RFC1042)) { 176 - cbHeaderSize += 6; 177 - pwType = (unsigned short *)(pbyRxBufferAddr + cbHeaderSize); 178 - if ((*pwType != TYPE_PKT_IPX) && (*pwType != cpu_to_le16(0xF380))) { 179 - } else { 180 - cbHeaderSize -= 8; 181 - pwType = (unsigned short *)(pbyRxBufferAddr + cbHeaderSize); 182 - if (bIsWEP) { 183 - if (bExtIV) 184 - *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 8); /* 8 is IV&ExtIV */ 185 - else 186 - *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 4); /* 4 is IV */ 187 - 188 - } else { 189 - *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN); 190 - } 191 - } 192 - } else { 193 - cbHeaderSize -= 2; 194 - pwType = (unsigned short *)(pbyRxBufferAddr + cbHeaderSize); 195 - if (bIsWEP) { 196 - if (bExtIV) 197 - *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 8); /* 8 is IV&ExtIV */ 198 - else 199 - *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 4); /* 4 is IV */ 200 - 201 - } else { 202 - *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN); 203 - } 204 - } 205 - 206 - cbHeaderSize -= (ETH_ALEN * 2); 207 - pbyRxBuffer = (unsigned char *)(pbyRxBufferAddr + cbHeaderSize); 208 - for (ii = 0; ii < ETH_ALEN; ii++) 209 - *pbyRxBuffer++ = pDevice->sRxEthHeader.abyDstAddr[ii]; 210 - for (ii = 0; ii < ETH_ALEN; ii++) 211 - *pbyRxBuffer++ = pDevice->sRxEthHeader.abySrcAddr[ii]; 212 - 213 - *pcbHeadSize = cbHeaderSize; 214 - } 215 - 216 - static unsigned char s_byGetRateIdx(unsigned char byRate) 217 - { 218 - unsigned char byRateIdx; 219 - 220 - for (byRateIdx = 0; byRateIdx < MAX_RATE; byRateIdx++) { 221 - if (acbyRxRate[byRateIdx % MAX_RATE] == byRate) 222 - return byRateIdx; 223 - } 224 - 225 - return 0; 226 - } 227 - 228 - static void 229 - s_vGetDASA(unsigned char *pbyRxBufferAddr, unsigned int *pcbHeaderSize, 230 - PSEthernetHeader psEthHeader) 231 - { 232 - unsigned int cbHeaderSize = 0; 233 - PS802_11Header pMACHeader; 234 - int ii; 235 - 236 - pMACHeader = (PS802_11Header) (pbyRxBufferAddr + cbHeaderSize); 237 - 238 - if ((pMACHeader->wFrameCtl & FC_TODS) == 0) { 239 - if (pMACHeader->wFrameCtl & FC_FROMDS) { 240 - for (ii = 0; ii < ETH_ALEN; ii++) { 241 - psEthHeader->abyDstAddr[ii] = pMACHeader->abyAddr1[ii]; 242 - psEthHeader->abySrcAddr[ii] = pMACHeader->abyAddr3[ii]; 243 - } 244 - } else { 245 - /* IBSS mode */ 246 - for (ii = 0; ii < ETH_ALEN; ii++) { 247 - psEthHeader->abyDstAddr[ii] = pMACHeader->abyAddr1[ii]; 248 - psEthHeader->abySrcAddr[ii] = pMACHeader->abyAddr2[ii]; 249 - } 250 - } 251 - } else { 252 - /* Is AP mode.. */ 253 - if (pMACHeader->wFrameCtl & FC_FROMDS) { 254 - for (ii = 0; ii < ETH_ALEN; ii++) { 255 - psEthHeader->abyDstAddr[ii] = pMACHeader->abyAddr3[ii]; 256 - psEthHeader->abySrcAddr[ii] = pMACHeader->abyAddr4[ii]; 257 - cbHeaderSize += 6; 258 - } 259 - } else { 260 - for (ii = 0; ii < ETH_ALEN; ii++) { 261 - psEthHeader->abyDstAddr[ii] = pMACHeader->abyAddr3[ii]; 262 - psEthHeader->abySrcAddr[ii] = pMACHeader->abyAddr2[ii]; 263 - } 264 - } 265 - } 266 - *pcbHeaderSize = cbHeaderSize; 267 - } 268 - 269 - bool 270 - device_receive_frame( 271 - struct vnt_private *pDevice, 272 - PSRxDesc pCurrRD 273 - ) 274 - { 275 - PDEVICE_RD_INFO pRDInfo = pCurrRD->pRDInfo; 276 - struct net_device_stats *pStats = &pDevice->dev->stats; 277 - struct sk_buff *skb; 278 - PSMgmtObject pMgmt = pDevice->pMgmt; 279 - PSRxMgmtPacket pRxPacket = &(pDevice->pMgmt->sRxPacket); 280 - PS802_11Header p802_11Header; 281 - unsigned char *pbyRsr; 282 - unsigned char *pbyNewRsr; 283 - unsigned char *pbyRSSI; 284 - __le64 *pqwTSFTime; 285 - unsigned short *pwFrameSize; 286 - unsigned char *pbyFrame; 287 - bool bDeFragRx = false; 288 - bool bIsWEP = false; 289 - unsigned int cbHeaderOffset; 290 - unsigned int FrameSize; 291 - unsigned short wEtherType = 0; 292 - int iSANodeIndex = -1; 293 - int iDANodeIndex = -1; 294 - unsigned int ii; 295 - unsigned int cbIVOffset; 296 - bool bExtIV = false; 297 - unsigned char *pbyRxSts; 298 - unsigned char *pbyRxRate; 299 - unsigned char *pbySQ; 300 - unsigned int cbHeaderSize; 301 - PSKeyItem pKey = NULL; 302 - unsigned short wRxTSC15_0 = 0; 303 - unsigned long dwRxTSC47_16 = 0; 304 - SKeyItem STempKey; 305 - /* 802.11h RPI */ 306 - unsigned long dwDuration = 0; 307 - long ldBm = 0; 308 - long ldBmThreshold = 0; 309 - PS802_11Header pMACHeader; 310 - bool bRxeapol_key = false; 311 - 312 - skb = pRDInfo->skb; 313 - 314 - pci_unmap_single(pDevice->pcid, pRDInfo->skb_dma, 315 - pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE); 316 - 317 - pwFrameSize = (unsigned short *)(skb->data + 2); 318 - FrameSize = cpu_to_le16(pCurrRD->m_rd1RD1.wReqCount) - cpu_to_le16(pCurrRD->m_rd0RD0.wResCount); 319 - 320 - /* 321 - * Max: 2312Payload + 30HD +4CRC + 2Padding + 4Len + 8TSF + 4RSR 322 - * Min (ACK): 10HD +4CRC + 2Padding + 4Len + 8TSF + 4RSR 323 - */ 324 - if ((FrameSize > 2364) || (FrameSize <= 32)) { 325 - /* Frame Size error drop this packet. */ 326 - pr_debug("---------- WRONG Length 1\n"); 327 - return false; 328 - } 329 - 330 - pbyRxSts = (unsigned char *)(skb->data); 331 - pbyRxRate = (unsigned char *)(skb->data + 1); 332 - pbyRsr = (unsigned char *)(skb->data + FrameSize - 1); 333 - pbyRSSI = (unsigned char *)(skb->data + FrameSize - 2); 334 - pbyNewRsr = (unsigned char *)(skb->data + FrameSize - 3); 335 - pbySQ = (unsigned char *)(skb->data + FrameSize - 4); 336 - pqwTSFTime = (__le64 *)(skb->data + FrameSize - 12); 337 - pbyFrame = (unsigned char *)(skb->data + 4); 338 - 339 - /* get packet size */ 340 - FrameSize = cpu_to_le16(*pwFrameSize); 341 - 342 - if ((FrameSize > 2346)|(FrameSize < 14)) { /* 343 - * Max: 2312Payload + 30HD +4CRC 344 - * Min: 14 bytes ACK 345 - */ 346 - pr_debug("---------- WRONG Length 2\n"); 347 - return false; 348 - } 349 - 350 - /* update receive statistic counter */ 351 - STAvUpdateRDStatCounter(&pDevice->scStatistic, 352 - *pbyRsr, 353 - *pbyNewRsr, 354 - *pbyRxRate, 355 - pbyFrame, 356 - FrameSize); 357 - 358 - pMACHeader = (PS802_11Header)((unsigned char *)(skb->data) + 8); 359 - 360 - if (pDevice->bMeasureInProgress) { 361 - if ((*pbyRsr & RSR_CRCOK) != 0) 362 - pDevice->byBasicMap |= 0x01; 363 - 364 - dwDuration = FrameSize << 4; 365 - dwDuration /= acbyRxRate[*pbyRxRate%MAX_RATE]; 366 - if (*pbyRxRate <= RATE_11M) { 367 - if (*pbyRxSts & 0x01) { 368 - /* long preamble */ 369 - dwDuration += 192; 370 - } else { 371 - /* short preamble */ 372 - dwDuration += 96; 373 - } 374 - } else { 375 - dwDuration += 16; 376 - } 377 - RFvRSSITodBm(pDevice, *pbyRSSI, &ldBm); 378 - ldBmThreshold = -57; 379 - for (ii = 7; ii > 0;) { 380 - if (ldBm > ldBmThreshold) 381 - break; 382 - 383 - ldBmThreshold -= 5; 384 - ii--; 385 - } 386 - pDevice->dwRPIs[ii] += dwDuration; 387 - return false; 388 - } 389 - 390 - if (!is_multicast_ether_addr(pbyFrame)) { 391 - if (WCTLbIsDuplicate(&(pDevice->sDupRxCache), (PS802_11Header)(skb->data + 4))) { 392 - pDevice->s802_11Counter.FrameDuplicateCount++; 393 - return false; 394 - } 395 - } 396 - 397 - /* Use for TKIP MIC */ 398 - s_vGetDASA(skb->data+4, &cbHeaderSize, &pDevice->sRxEthHeader); 399 - 400 - /* filter packet send from myself */ 401 - if (ether_addr_equal(pDevice->sRxEthHeader.abySrcAddr, 402 - pDevice->abyCurrentNetAddr)) 403 - return false; 404 - 405 - if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) || (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) { 406 - if (IS_CTL_PSPOLL(pbyFrame) || !IS_TYPE_CONTROL(pbyFrame)) { 407 - p802_11Header = (PS802_11Header)(pbyFrame); 408 - /* get SA NodeIndex */ 409 - if (BSSDBbIsSTAInNodeDB(pMgmt, (unsigned char *)(p802_11Header->abyAddr2), &iSANodeIndex)) { 410 - pMgmt->sNodeDBTable[iSANodeIndex].ulLastRxJiffer = jiffies; 411 - pMgmt->sNodeDBTable[iSANodeIndex].uInActiveCount = 0; 412 - } 413 - } 414 - } 415 - 416 - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) { 417 - if (s_bAPModeRxCtl(pDevice, pbyFrame, iSANodeIndex)) 418 - return false; 419 - } 420 - 421 - if (IS_FC_WEP(pbyFrame)) { 422 - bool bRxDecryOK = false; 423 - 424 - pr_debug("rx WEP pkt\n"); 425 - bIsWEP = true; 426 - if ((pDevice->bEnableHostWEP) && (iSANodeIndex >= 0)) { 427 - pKey = &STempKey; 428 - pKey->byCipherSuite = pMgmt->sNodeDBTable[iSANodeIndex].byCipherSuite; 429 - pKey->dwKeyIndex = pMgmt->sNodeDBTable[iSANodeIndex].dwKeyIndex; 430 - pKey->uKeyLength = pMgmt->sNodeDBTable[iSANodeIndex].uWepKeyLength; 431 - pKey->dwTSC47_16 = pMgmt->sNodeDBTable[iSANodeIndex].dwTSC47_16; 432 - pKey->wTSC15_0 = pMgmt->sNodeDBTable[iSANodeIndex].wTSC15_0; 433 - memcpy(pKey->abyKey, 434 - &pMgmt->sNodeDBTable[iSANodeIndex].abyWepKey[0], 435 - pKey->uKeyLength 436 - ); 437 - 438 - bRxDecryOK = s_bHostWepRxEncryption(pDevice, 439 - pbyFrame, 440 - FrameSize, 441 - pbyRsr, 442 - pMgmt->sNodeDBTable[iSANodeIndex].bOnFly, 443 - pKey, 444 - pbyNewRsr, 445 - &bExtIV, 446 - &wRxTSC15_0, 447 - &dwRxTSC47_16); 448 - } else { 449 - bRxDecryOK = s_bHandleRxEncryption(pDevice, 450 - pbyFrame, 451 - FrameSize, 452 - pbyRsr, 453 - pbyNewRsr, 454 - &pKey, 455 - &bExtIV, 456 - &wRxTSC15_0, 457 - &dwRxTSC47_16); 458 - } 459 - 460 - if (bRxDecryOK) { 461 - if ((*pbyNewRsr & NEWRSR_DECRYPTOK) == 0) { 462 - pr_debug("ICV Fail\n"); 463 - if ((pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPA) || 464 - (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) || 465 - (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) || 466 - (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPA2) || 467 - (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) { 468 - if ((pKey != NULL) && (pKey->byCipherSuite == KEY_CTL_TKIP)) 469 - pDevice->s802_11Counter.TKIPICVErrors++; 470 - else if ((pKey != NULL) && (pKey->byCipherSuite == KEY_CTL_CCMP)) 471 - pDevice->s802_11Counter.CCMPDecryptErrors++; 472 - } 473 - return false; 474 - } 475 - } else { 476 - pr_debug("WEP Func Fail\n"); 477 - return false; 478 - } 479 - if ((pKey != NULL) && (pKey->byCipherSuite == KEY_CTL_CCMP)) 480 - FrameSize -= 8; /* Message Integrity Code */ 481 - else 482 - FrameSize -= 4; /* 4 is ICV */ 483 - } 484 - 485 - /* RX OK, remove the CRC length */ 486 - FrameSize -= ETH_FCS_LEN; 487 - 488 - if ((!(*pbyRsr & (RSR_ADDRBROAD | RSR_ADDRMULTI))) && /* unicast address */ 489 - (IS_FRAGMENT_PKT((skb->data+4))) 490 - ) { 491 - /* defragment */ 492 - bDeFragRx = WCTLbHandleFragment(pDevice, (PS802_11Header)(skb->data+4), FrameSize, bIsWEP, bExtIV); 493 - pDevice->s802_11Counter.ReceivedFragmentCount++; 494 - if (bDeFragRx) { 495 - /* defrag complete */ 496 - skb = pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].skb; 497 - FrameSize = pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].cbFrameLength; 498 - 499 - } else { 500 - return false; 501 - } 502 - } 503 - 504 - /* Management & Control frame Handle */ 505 - if ((IS_TYPE_DATA((skb->data+4))) == false) { 506 - /* Handle Control & Manage Frame */ 507 - 508 - if (IS_TYPE_MGMT((skb->data+4))) { 509 - unsigned char *pbyData1; 510 - unsigned char *pbyData2; 511 - 512 - pRxPacket->p80211Header = (PUWLAN_80211HDR)(skb->data+4); 513 - pRxPacket->cbMPDULen = FrameSize; 514 - pRxPacket->uRSSI = *pbyRSSI; 515 - pRxPacket->bySQ = *pbySQ; 516 - pRxPacket->qwLocalTSF = le64_to_cpu(*pqwTSFTime); 517 - if (bIsWEP) { 518 - /* strip IV */ 519 - pbyData1 = WLAN_HDR_A3_DATA_PTR(skb->data+4); 520 - pbyData2 = WLAN_HDR_A3_DATA_PTR(skb->data+4) + 4; 521 - for (ii = 0; ii < (FrameSize - 4); ii++) { 522 - *pbyData1 = *pbyData2; 523 - pbyData1++; 524 - pbyData2++; 525 - } 526 - } 527 - pRxPacket->byRxRate = s_byGetRateIdx(*pbyRxRate); 528 - pRxPacket->byRxChannel = (*pbyRxSts) >> 2; 529 - 530 - vMgrRxManagePacket((void *)pDevice, pDevice->pMgmt, pRxPacket); 531 - 532 - /* hostap Deamon handle 802.11 management */ 533 - if (pDevice->bEnableHostapd) { 534 - skb->dev = pDevice->apdev; 535 - skb->data += 4; 536 - skb->tail += 4; 537 - skb_put(skb, FrameSize); 538 - skb_reset_mac_header(skb); 539 - skb->pkt_type = PACKET_OTHERHOST; 540 - skb->protocol = htons(ETH_P_802_2); 541 - memset(skb->cb, 0, sizeof(skb->cb)); 542 - netif_rx(skb); 543 - return true; 544 - } 545 - } 546 - 547 - return false; 548 - } else { 549 - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) { 550 - /* In AP mode, hw only check addr1(BSSID or RA) if equal to local MAC. */ 551 - if (!(*pbyRsr & RSR_BSSIDOK)) { 552 - if (bDeFragRx) { 553 - if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) { 554 - pr_err("%s: can not alloc more frag bufs\n", 555 - pDevice->dev->name); 556 - } 557 - } 558 - return false; 559 - } 560 - } else { 561 - /* discard DATA packet while not associate || BSSID error */ 562 - if (!pDevice->bLinkPass || !(*pbyRsr & RSR_BSSIDOK)) { 563 - if (bDeFragRx) { 564 - if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) { 565 - pr_err("%s: can not alloc more frag bufs\n", 566 - pDevice->dev->name); 567 - } 568 - } 569 - return false; 570 - } 571 - { 572 - unsigned char Protocol_Version; /* 802.1x Authentication */ 573 - unsigned char Packet_Type; /* 802.1x Authentication */ 574 - 575 - if (bIsWEP) 576 - cbIVOffset = 8; 577 - else 578 - cbIVOffset = 0; 579 - wEtherType = (skb->data[cbIVOffset + 8 + 24 + 6] << 8) | 580 - skb->data[cbIVOffset + 8 + 24 + 6 + 1]; 581 - Protocol_Version = skb->data[cbIVOffset + 8 + 24 + 6 + 1 + 1]; 582 - Packet_Type = skb->data[cbIVOffset + 8 + 24 + 6 + 1 + 1 + 1]; 583 - if (wEtherType == ETH_P_PAE) { /* Protocol Type in LLC-Header */ 584 - if (((Protocol_Version == 1) || (Protocol_Version == 2)) && 585 - (Packet_Type == 3)) { /*802.1x OR eapol-key challenge frame receive */ 586 - bRxeapol_key = true; 587 - } 588 - } 589 - } 590 - } 591 - } 592 - 593 - /* Data frame Handle */ 594 - 595 - if (pDevice->bEnablePSMode) { 596 - if (!IS_FC_MOREDATA((skb->data+4))) { 597 - if (pDevice->pMgmt->bInTIMWake == true) 598 - pDevice->pMgmt->bInTIMWake = false; 599 - } 600 - } 601 - 602 - /* Now it only supports 802.11g Infrastructure Mode, and support rate must up to 54 Mbps */ 603 - if (pDevice->bDiversityEnable && (FrameSize > 50) && 604 - (pDevice->op_mode == NL80211_IFTYPE_STATION) && 605 - pDevice->bLinkPass) { 606 - BBvAntennaDiversity(pDevice, s_byGetRateIdx(*pbyRxRate), 0); 607 - } 608 - 609 - if (pDevice->byLocalID != REV_ID_VT3253_B1) 610 - pDevice->uCurrRSSI = *pbyRSSI; 611 - 612 - pDevice->byCurrSQ = *pbySQ; 613 - 614 - if ((*pbyRSSI != 0) && 615 - (pMgmt->pCurrBSS != NULL)) { 616 - RFvRSSITodBm(pDevice, *pbyRSSI, &ldBm); 617 - /* Monitor if RSSI is too strong. */ 618 - pMgmt->pCurrBSS->byRSSIStatCnt++; 619 - pMgmt->pCurrBSS->byRSSIStatCnt %= RSSI_STAT_COUNT; 620 - pMgmt->pCurrBSS->ldBmAverage[pMgmt->pCurrBSS->byRSSIStatCnt] = ldBm; 621 - for (ii = 0; ii < RSSI_STAT_COUNT; ii++) 622 - if (pMgmt->pCurrBSS->ldBmAverage[ii] != 0) 623 - pMgmt->pCurrBSS->ldBmMAX = max(pMgmt->pCurrBSS->ldBmAverage[ii], ldBm); 624 - 625 - } 626 - 627 - if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && pDevice->bEnable8021x) { 628 - unsigned char abyMacHdr[24]; 629 - 630 - /* Only 802.1x packet incoming allowed */ 631 - if (bIsWEP) 632 - cbIVOffset = 8; 633 - else 634 - cbIVOffset = 0; 635 - wEtherType = (skb->data[cbIVOffset + 4 + 24 + 6] << 8) | 636 - skb->data[cbIVOffset + 4 + 24 + 6 + 1]; 637 - 638 - pr_debug("wEtherType = %04x\n", wEtherType); 639 - if (wEtherType == ETH_P_PAE) { 640 - skb->dev = pDevice->apdev; 641 - 642 - if (bIsWEP) { 643 - /* strip IV header(8) */ 644 - memcpy(&abyMacHdr[0], (skb->data + 4), 24); 645 - memcpy((skb->data + 4 + cbIVOffset), &abyMacHdr[0], 24); 646 - } 647 - skb->data += (cbIVOffset + 4); 648 - skb->tail += (cbIVOffset + 4); 649 - skb_put(skb, FrameSize); 650 - skb_reset_mac_header(skb); 651 - 652 - skb->pkt_type = PACKET_OTHERHOST; 653 - skb->protocol = htons(ETH_P_802_2); 654 - memset(skb->cb, 0, sizeof(skb->cb)); 655 - netif_rx(skb); 656 - return true; 657 - 658 - } 659 - /* check if 802.1x authorized */ 660 - if (!(pMgmt->sNodeDBTable[iSANodeIndex].dwFlags & WLAN_STA_AUTHORIZED)) 661 - return false; 662 - } 663 - 664 - if ((pKey != NULL) && (pKey->byCipherSuite == KEY_CTL_TKIP)) { 665 - if (bIsWEP) 666 - FrameSize -= 8; /* MIC */ 667 - } 668 - 669 - /* Soft MIC */ 670 - if ((pKey != NULL) && (pKey->byCipherSuite == KEY_CTL_TKIP)) { 671 - if (bIsWEP) { 672 - __le32 *pdwMIC_L; 673 - __le32 *pdwMIC_R; 674 - __le32 dwMIC_Priority; 675 - __le32 dwMICKey0 = 0, dwMICKey1 = 0; 676 - u32 dwLocalMIC_L = 0; 677 - u32 dwLocalMIC_R = 0; 678 - viawget_wpa_header *wpahdr; 679 - 680 - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) { 681 - dwMICKey0 = cpu_to_le32(*(u32 *)(&pKey->abyKey[24])); 682 - dwMICKey1 = cpu_to_le32(*(u32 *)(&pKey->abyKey[28])); 683 - } else { 684 - if (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) { 685 - dwMICKey0 = cpu_to_le32(*(u32 *)(&pKey->abyKey[16])); 686 - dwMICKey1 = cpu_to_le32(*(u32 *)(&pKey->abyKey[20])); 687 - } else if ((pKey->dwKeyIndex & BIT28) == 0) { 688 - dwMICKey0 = cpu_to_le32(*(u32 *)(&pKey->abyKey[16])); 689 - dwMICKey1 = cpu_to_le32(*(u32 *)(&pKey->abyKey[20])); 690 - } else { 691 - dwMICKey0 = cpu_to_le32(*(u32 *)(&pKey->abyKey[24])); 692 - dwMICKey1 = cpu_to_le32(*(u32 *)(&pKey->abyKey[28])); 693 - } 694 - } 695 - 696 - MIC_vInit(dwMICKey0, dwMICKey1); 697 - MIC_vAppend((unsigned char *)&(pDevice->sRxEthHeader.abyDstAddr[0]), 12); 698 - dwMIC_Priority = 0; 699 - MIC_vAppend((unsigned char *)&dwMIC_Priority, 4); 700 - /* 4 is Rcv buffer header, 24 is MAC Header, and 8 is IV and Ext IV. */ 701 - MIC_vAppend((unsigned char *)(skb->data + 4 + WLAN_HDR_ADDR3_LEN + 8), 702 - FrameSize - WLAN_HDR_ADDR3_LEN - 8); 703 - MIC_vGetMIC(&dwLocalMIC_L, &dwLocalMIC_R); 704 - MIC_vUnInit(); 705 - 706 - pdwMIC_L = (__le32 *)(skb->data + 4 + FrameSize); 707 - pdwMIC_R = (__le32 *)(skb->data + 4 + FrameSize + 4); 708 - 709 - if ((le32_to_cpu(*pdwMIC_L) != dwLocalMIC_L) || 710 - (le32_to_cpu(*pdwMIC_R) != dwLocalMIC_R) || 711 - pDevice->bRxMICFail) { 712 - pr_debug("MIC comparison is fail!\n"); 713 - pDevice->bRxMICFail = false; 714 - pDevice->s802_11Counter.TKIPLocalMICFailures++; 715 - if (bDeFragRx) { 716 - if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) { 717 - pr_err("%s: can not alloc more frag bufs\n", 718 - pDevice->dev->name); 719 - } 720 - } 721 - #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT 722 - /* send event to wpa_supplicant */ 723 - { 724 - union iwreq_data wrqu; 725 - struct iw_michaelmicfailure ev; 726 - int keyidx = pbyFrame[cbHeaderSize+3] >> 6; /* top two-bits */ 727 - 728 - memset(&ev, 0, sizeof(ev)); 729 - ev.flags = keyidx & IW_MICFAILURE_KEY_ID; 730 - if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && 731 - (pMgmt->eCurrState == WMAC_STATE_ASSOC) && 732 - (*pbyRsr & (RSR_ADDRBROAD | RSR_ADDRMULTI)) == 0) { 733 - ev.flags |= IW_MICFAILURE_PAIRWISE; 734 - } else { 735 - ev.flags |= IW_MICFAILURE_GROUP; 736 - } 737 - 738 - ev.src_addr.sa_family = ARPHRD_ETHER; 739 - ether_addr_copy(ev.src_addr.sa_data, 740 - pMACHeader->abyAddr2); 741 - memset(&wrqu, 0, sizeof(wrqu)); 742 - wrqu.data.length = sizeof(ev); 743 - wireless_send_event(pDevice->dev, IWEVMICHAELMICFAILURE, &wrqu, (char *)&ev); 744 - 745 - } 746 - #endif 747 - 748 - if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) { 749 - wpahdr = (viawget_wpa_header *)pDevice->skb->data; 750 - if ((pDevice->pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && 751 - (pDevice->pMgmt->eCurrState == WMAC_STATE_ASSOC) && 752 - (*pbyRsr & (RSR_ADDRBROAD | RSR_ADDRMULTI)) == 0) { 753 - wpahdr->type = VIAWGET_PTK_MIC_MSG; 754 - } else { 755 - wpahdr->type = VIAWGET_GTK_MIC_MSG; 756 - } 757 - wpahdr->resp_ie_len = 0; 758 - wpahdr->req_ie_len = 0; 759 - skb_put(pDevice->skb, sizeof(viawget_wpa_header)); 760 - pDevice->skb->dev = pDevice->wpadev; 761 - skb_reset_mac_header(pDevice->skb); 762 - pDevice->skb->pkt_type = PACKET_HOST; 763 - pDevice->skb->protocol = htons(ETH_P_802_2); 764 - memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb)); 765 - netif_rx(pDevice->skb); 766 - pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz); 767 - } 768 - 769 - return false; 770 - 771 - } 772 - } 773 - } 774 - 775 - /* ++++++++++ Reply Counter Check +++++++++++++ */ 776 - if ((pKey != NULL) && ((pKey->byCipherSuite == KEY_CTL_TKIP) || 777 - (pKey->byCipherSuite == KEY_CTL_CCMP))) { 778 - if (bIsWEP) { 779 - unsigned short wLocalTSC15_0 = 0; 780 - unsigned long dwLocalTSC47_16 = 0; 781 - unsigned long long RSC = 0; 782 - /* endian issues */ 783 - RSC = *((unsigned long long *)&(pKey->KeyRSC)); 784 - wLocalTSC15_0 = (unsigned short)RSC; 785 - dwLocalTSC47_16 = (unsigned long)(RSC>>16); 786 - 787 - RSC = dwRxTSC47_16; 788 - RSC <<= 16; 789 - RSC += wRxTSC15_0; 790 - pKey->KeyRSC = RSC; 791 - 792 - if ((pDevice->sMgmtObj.eCurrMode == WMAC_MODE_ESS_STA) && 793 - (pDevice->sMgmtObj.eCurrState == WMAC_STATE_ASSOC)) { 794 - /* check RSC */ 795 - if ((wRxTSC15_0 < wLocalTSC15_0) && 796 - (dwRxTSC47_16 <= dwLocalTSC47_16) && 797 - !((dwRxTSC47_16 == 0) && (dwLocalTSC47_16 == 0xFFFFFFFF))) { 798 - pr_debug("TSC is illegal~~!\n "); 799 - if (pKey->byCipherSuite == KEY_CTL_TKIP) 800 - pDevice->s802_11Counter.TKIPReplays++; 801 - else 802 - pDevice->s802_11Counter.CCMPReplays++; 803 - 804 - if (bDeFragRx) { 805 - if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) { 806 - pr_err("%s: can not alloc more frag bufs\n", 807 - pDevice->dev->name); 808 - } 809 - } 810 - return false; 811 - } 812 - } 813 - } 814 - } 815 - 816 - s_vProcessRxMACHeader(pDevice, (unsigned char *)(skb->data+4), FrameSize, bIsWEP, bExtIV, &cbHeaderOffset); 817 - FrameSize -= cbHeaderOffset; 818 - cbHeaderOffset += 4; /* 4 is Rcv buffer header */ 819 - 820 - /* Null data, framesize = 14 */ 821 - if (FrameSize < 15) 822 - return false; 823 - 824 - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) { 825 - if (!s_bAPModeRxData(pDevice, 826 - skb, 827 - FrameSize, 828 - cbHeaderOffset, 829 - iSANodeIndex, 830 - iDANodeIndex 831 - )) { 832 - if (bDeFragRx) { 833 - if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) { 834 - pr_err("%s: can not alloc more frag bufs\n", 835 - pDevice->dev->name); 836 - } 837 - } 838 - return false; 839 - } 840 - } 841 - 842 - skb->data += cbHeaderOffset; 843 - skb->tail += cbHeaderOffset; 844 - skb_put(skb, FrameSize); 845 - skb->protocol = eth_type_trans(skb, skb->dev); 846 - 847 - /* drop frame not met IEEE 802.3 */ 848 - 849 - skb->ip_summed = CHECKSUM_NONE; 850 - pStats->rx_bytes += skb->len; 851 - pStats->rx_packets++; 852 - netif_rx(skb); 853 - 854 - if (bDeFragRx) { 855 - if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) { 856 - pr_err("%s: can not alloc more frag bufs\n", 857 - pDevice->dev->name); 858 - } 859 - return false; 860 - } 861 - 862 - return true; 863 - } 864 - 865 - static bool s_bAPModeRxCtl( 866 - struct vnt_private *pDevice, 867 - unsigned char *pbyFrame, 868 - int iSANodeIndex 869 - ) 870 - { 871 - PS802_11Header p802_11Header; 872 - CMD_STATUS Status; 873 - PSMgmtObject pMgmt = pDevice->pMgmt; 874 - 875 - if (IS_CTL_PSPOLL(pbyFrame) || !IS_TYPE_CONTROL(pbyFrame)) { 876 - p802_11Header = (PS802_11Header)(pbyFrame); 877 - if (!IS_TYPE_MGMT(pbyFrame)) { 878 - /* Data & PS-Poll packet, check frame class */ 879 - if (iSANodeIndex > 0) { 880 - /* frame class 3 fliter & checking */ 881 - if (pMgmt->sNodeDBTable[iSANodeIndex].eNodeState < NODE_AUTH) { 882 - /* 883 - * send deauth notification 884 - * reason = (6) class 2 received from nonauth sta 885 - */ 886 - vMgrDeAuthenBeginSta(pDevice, 887 - pMgmt, 888 - (unsigned char *)(p802_11Header->abyAddr2), 889 - (WLAN_MGMT_REASON_CLASS2_NONAUTH), 890 - &Status 891 - ); 892 - pr_debug("dpc: send vMgrDeAuthenBeginSta 1\n"); 893 - return true; 894 - } 895 - if (pMgmt->sNodeDBTable[iSANodeIndex].eNodeState < NODE_ASSOC) { 896 - /* 897 - * send deassoc notification 898 - * reason = (7) class 3 received from nonassoc sta 899 - */ 900 - vMgrDisassocBeginSta(pDevice, 901 - pMgmt, 902 - (unsigned char *)(p802_11Header->abyAddr2), 903 - (WLAN_MGMT_REASON_CLASS3_NONASSOC), 904 - &Status 905 - ); 906 - pr_debug("dpc: send vMgrDisassocBeginSta 2\n"); 907 - return true; 908 - } 909 - 910 - if (pMgmt->sNodeDBTable[iSANodeIndex].bPSEnable) { 911 - /* delcare received ps-poll event */ 912 - if (IS_CTL_PSPOLL(pbyFrame)) { 913 - pMgmt->sNodeDBTable[iSANodeIndex].bRxPSPoll = true; 914 - bScheduleCommand((void *)pDevice, WLAN_CMD_RX_PSPOLL, NULL); 915 - pr_debug("dpc: WLAN_CMD_RX_PSPOLL 1\n"); 916 - } else { 917 - /* 918 - * check Data PS state 919 - * if PW bit off, send out all PS bufferring packets. 920 - */ 921 - if (!IS_FC_POWERMGT(pbyFrame)) { 922 - pMgmt->sNodeDBTable[iSANodeIndex].bPSEnable = false; 923 - pMgmt->sNodeDBTable[iSANodeIndex].bRxPSPoll = true; 924 - bScheduleCommand((void *)pDevice, WLAN_CMD_RX_PSPOLL, NULL); 925 - pr_debug("dpc: WLAN_CMD_RX_PSPOLL 2\n"); 926 - } 927 - } 928 - } else { 929 - if (IS_FC_POWERMGT(pbyFrame)) { 930 - pMgmt->sNodeDBTable[iSANodeIndex].bPSEnable = true; 931 - /* Once if STA in PS state, enable multicast bufferring */ 932 - pMgmt->sNodeDBTable[0].bPSEnable = true; 933 - } else { 934 - /* clear all pending PS frame. */ 935 - if (pMgmt->sNodeDBTable[iSANodeIndex].wEnQueueCnt > 0) { 936 - pMgmt->sNodeDBTable[iSANodeIndex].bPSEnable = false; 937 - pMgmt->sNodeDBTable[iSANodeIndex].bRxPSPoll = true; 938 - bScheduleCommand((void *)pDevice, WLAN_CMD_RX_PSPOLL, NULL); 939 - pr_debug("dpc: WLAN_CMD_RX_PSPOLL 3\n"); 940 - 941 - } 942 - } 943 - } 944 - } else { 945 - vMgrDeAuthenBeginSta(pDevice, 946 - pMgmt, 947 - (unsigned char *)(p802_11Header->abyAddr2), 948 - (WLAN_MGMT_REASON_CLASS2_NONAUTH), 949 - &Status 950 - ); 951 - pr_debug("dpc: send vMgrDeAuthenBeginSta 3\n"); 952 - pr_debug("BSSID:%pM\n", 953 - p802_11Header->abyAddr3); 954 - pr_debug("ADDR2:%pM\n", 955 - p802_11Header->abyAddr2); 956 - pr_debug("ADDR1:%pM\n", 957 - p802_11Header->abyAddr1); 958 - pr_debug("dpc: wFrameCtl= %x\n", 959 - p802_11Header->wFrameCtl); 960 - VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byRxMode)); 961 - pr_debug("dpc:pDevice->byRxMode = %x\n", 962 - pDevice->byRxMode); 963 - return true; 964 - } 965 - } 966 - } 967 - return false; 968 - } 969 - 970 - static bool s_bHandleRxEncryption( 971 - struct vnt_private *pDevice, 972 - unsigned char *pbyFrame, 973 - unsigned int FrameSize, 974 - unsigned char *pbyRsr, 975 - unsigned char *pbyNewRsr, 976 - PSKeyItem *pKeyOut, 977 - bool *pbExtIV, 978 - unsigned short *pwRxTSC15_0, 979 - unsigned long *pdwRxTSC47_16 980 - ) 981 - { 982 - unsigned int PayloadLen = FrameSize; 983 - unsigned char *pbyIV; 984 - unsigned char byKeyIdx; 985 - PSKeyItem pKey = NULL; 986 - unsigned char byDecMode = KEY_CTL_WEP; 987 - PSMgmtObject pMgmt = pDevice->pMgmt; 988 - 989 - *pwRxTSC15_0 = 0; 990 - *pdwRxTSC47_16 = 0; 991 - 992 - pbyIV = pbyFrame + WLAN_HDR_ADDR3_LEN; 993 - if (WLAN_GET_FC_TODS(*(unsigned short *)pbyFrame) && 994 - WLAN_GET_FC_FROMDS(*(unsigned short *)pbyFrame)) { 995 - pbyIV += 6; /* 6 is 802.11 address4 */ 996 - PayloadLen -= 6; 997 - } 998 - byKeyIdx = (*(pbyIV+3) & 0xc0); 999 - byKeyIdx >>= 6; 1000 - pr_debug("\nKeyIdx: %d\n", byKeyIdx); 1001 - 1002 - if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA) || 1003 - (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) || 1004 - (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) || 1005 - (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) || 1006 - (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) { 1007 - if (((*pbyRsr & (RSR_ADDRBROAD | RSR_ADDRMULTI)) == 0) && 1008 - (pDevice->pMgmt->byCSSPK != KEY_CTL_NONE)) { 1009 - /* unicast pkt use pairwise key */ 1010 - pr_debug("unicast pkt\n"); 1011 - if (KeybGetKey(&(pDevice->sKey), pDevice->abyBSSID, 0xFFFFFFFF, &pKey) == true) { 1012 - if (pDevice->pMgmt->byCSSPK == KEY_CTL_TKIP) 1013 - byDecMode = KEY_CTL_TKIP; 1014 - else if (pDevice->pMgmt->byCSSPK == KEY_CTL_CCMP) 1015 - byDecMode = KEY_CTL_CCMP; 1016 - } 1017 - pr_debug("unicast pkt: %d, %p\n", byDecMode, pKey); 1018 - } else { 1019 - /* use group key */ 1020 - KeybGetKey(&(pDevice->sKey), pDevice->abyBSSID, byKeyIdx, &pKey); 1021 - if (pDevice->pMgmt->byCSSGK == KEY_CTL_TKIP) 1022 - byDecMode = KEY_CTL_TKIP; 1023 - else if (pDevice->pMgmt->byCSSGK == KEY_CTL_CCMP) 1024 - byDecMode = KEY_CTL_CCMP; 1025 - pr_debug("group pkt: %d, %d, %p\n", 1026 - byKeyIdx, byDecMode, pKey); 1027 - } 1028 - } 1029 - /* our WEP only support Default Key */ 1030 - if (pKey == NULL) { 1031 - /* use default group key */ 1032 - KeybGetKey(&(pDevice->sKey), pDevice->abyBroadcastAddr, byKeyIdx, &pKey); 1033 - if (pDevice->pMgmt->byCSSGK == KEY_CTL_TKIP) 1034 - byDecMode = KEY_CTL_TKIP; 1035 - else if (pDevice->pMgmt->byCSSGK == KEY_CTL_CCMP) 1036 - byDecMode = KEY_CTL_CCMP; 1037 - } 1038 - *pKeyOut = pKey; 1039 - 1040 - pr_debug("AES:%d %d %d\n", 1041 - pDevice->pMgmt->byCSSPK, pDevice->pMgmt->byCSSGK, byDecMode); 1042 - 1043 - if (pKey == NULL) { 1044 - pr_debug("pKey == NULL\n"); 1045 - 1046 - return false; 1047 - } 1048 - if (byDecMode != pKey->byCipherSuite) { 1049 - 1050 - *pKeyOut = NULL; 1051 - return false; 1052 - } 1053 - if (byDecMode == KEY_CTL_WEP) { 1054 - /* handle WEP */ 1055 - if ((pDevice->byLocalID <= REV_ID_VT3253_A1) || 1056 - (((PSKeyTable)(pKey->pvKeyTable))->bSoftWEP == true)) { 1057 - /* 1058 - * Software WEP 1059 - * 1. 3253A 1060 - * 2. WEP 256 1061 - */ 1062 - 1063 - PayloadLen -= (WLAN_HDR_ADDR3_LEN + 4 + 4); /* 24 is 802.11 header,4 is IV, 4 is crc */ 1064 - memcpy(pDevice->abyPRNG, pbyIV, 3); 1065 - memcpy(pDevice->abyPRNG + 3, pKey->abyKey, pKey->uKeyLength); 1066 - rc4_init(&pDevice->SBox, pDevice->abyPRNG, pKey->uKeyLength + 3); 1067 - rc4_encrypt(&pDevice->SBox, pbyIV+4, pbyIV+4, PayloadLen); 1068 - 1069 - if (ETHbIsBufferCrc32Ok(pbyIV+4, PayloadLen)) 1070 - *pbyNewRsr |= NEWRSR_DECRYPTOK; 1071 - 1072 - } 1073 - } else if ((byDecMode == KEY_CTL_TKIP) || 1074 - (byDecMode == KEY_CTL_CCMP)) { 1075 - /* TKIP/AES */ 1076 - 1077 - PayloadLen -= (WLAN_HDR_ADDR3_LEN + 8 + 4); /* 24 is 802.11 header, 8 is IV&ExtIV, 4 is crc */ 1078 - *pdwRxTSC47_16 = cpu_to_le32(*(unsigned long *)(pbyIV + 4)); 1079 - pr_debug("ExtIV: %lx\n", *pdwRxTSC47_16); 1080 - if (byDecMode == KEY_CTL_TKIP) 1081 - *pwRxTSC15_0 = cpu_to_le16(MAKEWORD(*(pbyIV + 2), *pbyIV)); 1082 - else 1083 - *pwRxTSC15_0 = cpu_to_le16(*(unsigned short *)pbyIV); 1084 - 1085 - pr_debug("TSC0_15: %x\n", *pwRxTSC15_0); 1086 - 1087 - if ((byDecMode == KEY_CTL_TKIP) && 1088 - (pDevice->byLocalID <= REV_ID_VT3253_A1)) { 1089 - /* 1090 - * Software TKIP 1091 - * 1. 3253 A 1092 - */ 1093 - PS802_11Header pMACHeader = (PS802_11Header)(pbyFrame); 1094 - 1095 - TKIPvMixKey(pKey->abyKey, pMACHeader->abyAddr2, *pwRxTSC15_0, *pdwRxTSC47_16, pDevice->abyPRNG); 1096 - rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN); 1097 - rc4_encrypt(&pDevice->SBox, pbyIV+8, pbyIV+8, PayloadLen); 1098 - if (ETHbIsBufferCrc32Ok(pbyIV+8, PayloadLen)) { 1099 - *pbyNewRsr |= NEWRSR_DECRYPTOK; 1100 - pr_debug("ICV OK!\n"); 1101 - } else { 1102 - pr_debug("ICV FAIL!!!\n"); 1103 - pr_debug("PayloadLen = %d\n", PayloadLen); 1104 - } 1105 - } 1106 - } 1107 - 1108 - if ((*(pbyIV+3) & 0x20) != 0) 1109 - *pbExtIV = true; 1110 - return true; 1111 - } 1112 - 1113 - static bool s_bHostWepRxEncryption( 1114 - struct vnt_private *pDevice, 1115 - unsigned char *pbyFrame, 1116 - unsigned int FrameSize, 1117 - unsigned char *pbyRsr, 1118 - bool bOnFly, 1119 - PSKeyItem pKey, 1120 - unsigned char *pbyNewRsr, 1121 - bool *pbExtIV, 1122 - unsigned short *pwRxTSC15_0, 1123 - unsigned long *pdwRxTSC47_16 1124 - ) 1125 - { 1126 - unsigned int PayloadLen = FrameSize; 1127 - unsigned char *pbyIV; 1128 - unsigned char byKeyIdx; 1129 - unsigned char byDecMode = KEY_CTL_WEP; 1130 - PS802_11Header pMACHeader; 1131 - 1132 - *pwRxTSC15_0 = 0; 1133 - *pdwRxTSC47_16 = 0; 1134 - 1135 - pbyIV = pbyFrame + WLAN_HDR_ADDR3_LEN; 1136 - if (WLAN_GET_FC_TODS(*(unsigned short *)pbyFrame) && 1137 - WLAN_GET_FC_FROMDS(*(unsigned short *)pbyFrame)) { 1138 - pbyIV += 6; /* 6 is 802.11 address4 */ 1139 - PayloadLen -= 6; 1140 - } 1141 - byKeyIdx = (*(pbyIV+3) & 0xc0); 1142 - byKeyIdx >>= 6; 1143 - pr_debug("\nKeyIdx: %d\n", byKeyIdx); 1144 - 1145 - if (pDevice->pMgmt->byCSSGK == KEY_CTL_TKIP) 1146 - byDecMode = KEY_CTL_TKIP; 1147 - else if (pDevice->pMgmt->byCSSGK == KEY_CTL_CCMP) 1148 - byDecMode = KEY_CTL_CCMP; 1149 - 1150 - pr_debug("AES:%d %d %d\n", 1151 - pDevice->pMgmt->byCSSPK, pDevice->pMgmt->byCSSGK, byDecMode); 1152 - 1153 - if (byDecMode != pKey->byCipherSuite) 1154 - return false; 1155 - 1156 - if (byDecMode == KEY_CTL_WEP) { 1157 - /* handle WEP */ 1158 - pr_debug("byDecMode == KEY_CTL_WEP\n"); 1159 - 1160 - if ((pDevice->byLocalID <= REV_ID_VT3253_A1) || 1161 - (((PSKeyTable)(pKey->pvKeyTable))->bSoftWEP == true) || 1162 - !bOnFly) { 1163 - /* 1164 - * Software WEP 1165 - * 1. 3253A 1166 - * 2. WEP 256 1167 - * 3. NotOnFly 1168 - */ 1169 - 1170 - PayloadLen -= (WLAN_HDR_ADDR3_LEN + 4 + 4); /* 24 is 802.11 header,4 is IV, 4 is crc */ 1171 - memcpy(pDevice->abyPRNG, pbyIV, 3); 1172 - memcpy(pDevice->abyPRNG + 3, pKey->abyKey, pKey->uKeyLength); 1173 - rc4_init(&pDevice->SBox, pDevice->abyPRNG, pKey->uKeyLength + 3); 1174 - rc4_encrypt(&pDevice->SBox, pbyIV+4, pbyIV+4, PayloadLen); 1175 - 1176 - if (ETHbIsBufferCrc32Ok(pbyIV+4, PayloadLen)) 1177 - *pbyNewRsr |= NEWRSR_DECRYPTOK; 1178 - 1179 - } 1180 - } else if ((byDecMode == KEY_CTL_TKIP) || 1181 - (byDecMode == KEY_CTL_CCMP)) { 1182 - /* TKIP/AES */ 1183 - 1184 - PayloadLen -= (WLAN_HDR_ADDR3_LEN + 8 + 4); /* 24 is 802.11 header, 8 is IV&ExtIV, 4 is crc */ 1185 - *pdwRxTSC47_16 = cpu_to_le32(*(unsigned long *)(pbyIV + 4)); 1186 - pr_debug("ExtIV: %lx\n", *pdwRxTSC47_16); 1187 - 1188 - if (byDecMode == KEY_CTL_TKIP) 1189 - *pwRxTSC15_0 = cpu_to_le16(MAKEWORD(*(pbyIV+2), *pbyIV)); 1190 - else 1191 - *pwRxTSC15_0 = cpu_to_le16(*(unsigned short *)pbyIV); 1192 - 1193 - pr_debug("TSC0_15: %x\n", *pwRxTSC15_0); 1194 - 1195 - if (byDecMode == KEY_CTL_TKIP) { 1196 - if ((pDevice->byLocalID <= REV_ID_VT3253_A1) || !bOnFly) { 1197 - /* 1198 - * Software TKIP 1199 - * 1. 3253 A 1200 - * 2. NotOnFly 1201 - */ 1202 - pr_debug("soft KEY_CTL_TKIP\n"); 1203 - pMACHeader = (PS802_11Header)(pbyFrame); 1204 - TKIPvMixKey(pKey->abyKey, pMACHeader->abyAddr2, *pwRxTSC15_0, *pdwRxTSC47_16, pDevice->abyPRNG); 1205 - rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN); 1206 - rc4_encrypt(&pDevice->SBox, pbyIV+8, pbyIV+8, PayloadLen); 1207 - if (ETHbIsBufferCrc32Ok(pbyIV+8, PayloadLen)) { 1208 - *pbyNewRsr |= NEWRSR_DECRYPTOK; 1209 - pr_debug("ICV OK!\n"); 1210 - } else { 1211 - pr_debug("ICV FAIL!!!\n"); 1212 - pr_debug("PayloadLen = %d\n", 1213 - PayloadLen); 1214 - } 1215 - } 1216 - } 1217 - 1218 - if (byDecMode == KEY_CTL_CCMP) { 1219 - if (!bOnFly) { 1220 - /* 1221 - * Software CCMP 1222 - * NotOnFly 1223 - */ 1224 - pr_debug("soft KEY_CTL_CCMP\n"); 1225 - if (AESbGenCCMP(pKey->abyKey, pbyFrame, FrameSize)) { 1226 - *pbyNewRsr |= NEWRSR_DECRYPTOK; 1227 - pr_debug("CCMP MIC compare OK!\n"); 1228 - } else { 1229 - pr_debug("CCMP MIC fail!\n"); 1230 - } 1231 - } 1232 - } 1233 - 1234 - } 1235 - 1236 - if ((*(pbyIV+3) & 0x20) != 0) 1237 - *pbExtIV = true; 1238 - return true; 1239 - } 1240 - 1241 - static bool s_bAPModeRxData( 1242 - struct vnt_private *pDevice, 1243 - struct sk_buff *skb, 1244 - unsigned int FrameSize, 1245 - unsigned int cbHeaderOffset, 1246 - int iSANodeIndex, 1247 - int iDANodeIndex 1248 - ) 1249 - { 1250 - PSMgmtObject pMgmt = pDevice->pMgmt; 1251 - bool bRelayAndForward = false; 1252 - bool bRelayOnly = false; 1253 - unsigned char byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80}; 1254 - unsigned short wAID; 1255 - 1256 - struct sk_buff *skbcpy = NULL; 1257 - 1258 - if (FrameSize > CB_MAX_BUF_SIZE) 1259 - return false; 1260 - /* check DA */ 1261 - if (is_multicast_ether_addr((unsigned char *)(skb->data+cbHeaderOffset))) { 1262 - if (pMgmt->sNodeDBTable[0].bPSEnable) { 1263 - skbcpy = dev_alloc_skb((int)pDevice->rx_buf_sz); 1264 - 1265 - /* if any node in PS mode, buffer packet until DTIM. */ 1266 - if (skbcpy == NULL) { 1267 - pr_info("relay multicast no skb available\n"); 1268 - } else { 1269 - skbcpy->dev = pDevice->dev; 1270 - skbcpy->len = FrameSize; 1271 - memcpy(skbcpy->data, skb->data+cbHeaderOffset, FrameSize); 1272 - skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skbcpy); 1273 - 1274 - pMgmt->sNodeDBTable[0].wEnQueueCnt++; 1275 - /* set tx map */ 1276 - pMgmt->abyPSTxMap[0] |= byMask[0]; 1277 - } 1278 - } else { 1279 - bRelayAndForward = true; 1280 - } 1281 - } else { 1282 - /* check if relay */ 1283 - if (BSSDBbIsSTAInNodeDB(pMgmt, (unsigned char *)(skb->data+cbHeaderOffset), &iDANodeIndex)) { 1284 - if (pMgmt->sNodeDBTable[iDANodeIndex].eNodeState >= NODE_ASSOC) { 1285 - if (pMgmt->sNodeDBTable[iDANodeIndex].bPSEnable) { 1286 - /* queue this skb until next PS tx, and then release. */ 1287 - 1288 - skb->data += cbHeaderOffset; 1289 - skb->tail += cbHeaderOffset; 1290 - skb_put(skb, FrameSize); 1291 - skb_queue_tail(&pMgmt->sNodeDBTable[iDANodeIndex].sTxPSQueue, skb); 1292 - pMgmt->sNodeDBTable[iDANodeIndex].wEnQueueCnt++; 1293 - wAID = pMgmt->sNodeDBTable[iDANodeIndex].wAID; 1294 - pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7]; 1295 - pr_debug("relay: index= %d, pMgmt->abyPSTxMap[%d]= %d\n", 1296 - iDANodeIndex, (wAID >> 3), 1297 - pMgmt->abyPSTxMap[wAID >> 3]); 1298 - return true; 1299 - } else { 1300 - bRelayOnly = true; 1301 - } 1302 - } 1303 - } 1304 - } 1305 - 1306 - if (bRelayOnly || bRelayAndForward) { 1307 - /* relay this packet right now */ 1308 - if (bRelayAndForward) 1309 - iDANodeIndex = 0; 1310 - 1311 - if ((pDevice->uAssocCount > 1) && (iDANodeIndex >= 0)) 1312 - ROUTEbRelay(pDevice, (unsigned char *)(skb->data + cbHeaderOffset), FrameSize, (unsigned int)iDANodeIndex); 1313 - 1314 - if (bRelayOnly) 1315 - return false; 1316 - } 1317 - /* none associate, don't forward */ 1318 - if (pDevice->uAssocCount == 0) 1319 - return false; 1320 - 1321 - return true; 1322 - } 1323 37 1324 38 static bool vnt_rx_data(struct vnt_private *priv, struct sk_buff *skb, 1325 39 u16 bytes_received)
-8
drivers/staging/vt6655/dpc.h
··· 29 29 #ifndef __DPC_H__ 30 30 #define __DPC_H__ 31 31 32 - #include "ttype.h" 33 32 #include "device.h" 34 - #include "wcmd.h" 35 - 36 - bool 37 - device_receive_frame( 38 - struct vnt_private *, 39 - PSRxDesc pCurrRD 40 - ); 41 33 42 34 bool vnt_receive_frame(struct vnt_private *priv, PSRxDesc curr_rd); 43 35