⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dpc.c

📁 VIA VT6656 USB linux source code.
💻 C
📖 第 1 页 / 共 4 页
字号:
    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"AES:%d %d %d\n", pMgmt->byCSSPK, pMgmt->byCSSGK, byDecMode);    if (pKey == NULL) {        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey == NULL\n");        if (byDecMode == KEY_CTL_WEP) {//            pDevice->s802_11Counter.WEPUndecryptableCount.QuadPart++;        } else if (pDevice->bLinkPass == TRUE) {//            pDevice->s802_11Counter.DecryptFailureCount.QuadPart++;        }        return FALSE;    }    if (byDecMode != pKey->byCipherSuite) {        if (byDecMode == KEY_CTL_WEP) {//            pDevice->s802_11Counter.WEPUndecryptableCount.QuadPart++;        } else if (pDevice->bLinkPass == TRUE) {//            pDevice->s802_11Counter.DecryptFailureCount.QuadPart++;        }        *pKeyOut = NULL;        return FALSE;    }    if (byDecMode == KEY_CTL_WEP) {        // handle WEP        if ((pDevice->byLocalID <= REV_ID_VT3253_A1) ||            (((PSKeyTable)(pKey->pvKeyTable))->bSoftWEP == TRUE)) {             // Software WEP            // 1. 3253A            // 2. WEP 256            PayloadLen -= (WLAN_HDR_ADDR3_LEN + 4 + 4); // 24 is 802.11 header,4 is IV, 4 is crc            MEMvCopy(pDevice->abyPRNG, pbyIV, 3);            MEMvCopy(pDevice->abyPRNG + 3, pKey->abyKey, pKey->uKeyLength);            rc4_init(&pDevice->SBox, pDevice->abyPRNG, pKey->uKeyLength + 3);            rc4_encrypt(&pDevice->SBox, pbyIV+4, pbyIV+4, PayloadLen);                                    if (ETHbIsBufferCrc32Ok(pbyIV+4, PayloadLen)) {                *pbyNewRsr |= NEWRSR_DECRYPTOK;            }        }    } else if ((byDecMode == KEY_CTL_TKIP) ||               (byDecMode == KEY_CTL_CCMP)) {        // TKIP/AES        PayloadLen -= (WLAN_HDR_ADDR3_LEN + 8 + 4); // 24 is 802.11 header, 8 is IV&ExtIV, 4 is crc        *pdwRxTSC47_16 = cpu_to_le32(*(PDWORD)(pbyIV + 4));        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ExtIV: %lx\n",*pdwRxTSC47_16);        if (byDecMode == KEY_CTL_TKIP) {            *pwRxTSC15_0 = cpu_to_le16(MAKEWORD(*(pbyIV+2), *pbyIV));        } else {            *pwRxTSC15_0 = cpu_to_le16(*(PWORD)pbyIV);        }        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"TSC0_15: %x\n", *pwRxTSC15_0);        if ((byDecMode == KEY_CTL_TKIP) &&            (pDevice->byLocalID <= REV_ID_VT3253_A1)) {            // Software TKIP            // 1. 3253 A            PS802_11Header  pMACHeader = (PS802_11Header) (pbyFrame);            TKIPvMixKey(pKey->abyKey, pMACHeader->abyAddr2, *pwRxTSC15_0, *pdwRxTSC47_16, pDevice->abyPRNG);            rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);            rc4_encrypt(&pDevice->SBox, pbyIV+8, pbyIV+8, PayloadLen);            if (ETHbIsBufferCrc32Ok(pbyIV+8, PayloadLen)) {                *pbyNewRsr |= NEWRSR_DECRYPTOK;                DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ICV OK!\n");            } else {                DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ICV FAIL!!!\n");                DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"PayloadLen = %d\n", PayloadLen);            }        }    }// end of TKIP/AES    if ((*(pbyIV+3) & 0x20) != 0)        *pbExtIV = TRUE;    return TRUE;}static BOOL s_bHostWepRxEncryption (    IN PSDevice     pDevice,    IN PBYTE        pbyFrame,    IN UINT         FrameSize,    IN PBYTE        pbyRsr,    IN BOOL         bOnFly,    IN PSKeyItem    pKey,    OUT PBYTE       pbyNewRsr,    OUT PBOOL       pbExtIV,    OUT PWORD       pwRxTSC15_0,    OUT PDWORD      pdwRxTSC47_16    ){    PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);        UINT            PayloadLen = FrameSize;    PBYTE           pbyIV;    BYTE            byKeyIdx;    BYTE            byDecMode = KEY_CTL_WEP;    PS802_11Header  pMACHeader;        *pwRxTSC15_0 = 0;    *pdwRxTSC47_16 = 0;    pbyIV = pbyFrame + WLAN_HDR_ADDR3_LEN;    if ( WLAN_GET_FC_TODS(*(PWORD)pbyFrame) &&         WLAN_GET_FC_FROMDS(*(PWORD)pbyFrame) ) {         pbyIV += 6;             // 6 is 802.11 address4         PayloadLen -= 6;    }    byKeyIdx = (*(pbyIV+3) & 0xc0);    byKeyIdx >>= 6;    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\nKeyIdx: %d\n", byKeyIdx);    if (pMgmt->byCSSGK == KEY_CTL_TKIP)        byDecMode = KEY_CTL_TKIP;    else if (pMgmt->byCSSGK == KEY_CTL_CCMP)        byDecMode = KEY_CTL_CCMP;    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"AES:%d %d %d\n", pMgmt->byCSSPK, pMgmt->byCSSGK, byDecMode);    if (byDecMode != pKey->byCipherSuite) {        if (byDecMode == KEY_CTL_WEP) {//            pDevice->s802_11Counter.WEPUndecryptableCount.QuadPart++;        } else if (pDevice->bLinkPass == TRUE) {//            pDevice->s802_11Counter.DecryptFailureCount.QuadPart++;        }        return FALSE;    }        if (byDecMode == KEY_CTL_WEP) {        // handle WEP        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"byDecMode == KEY_CTL_WEP \n");        if ((pDevice->byLocalID <= REV_ID_VT3253_A1) ||            (((PSKeyTable)(pKey->pvKeyTable))->bSoftWEP == TRUE) ||            (bOnFly == FALSE)) {             // Software WEP            // 1. 3253A            // 2. WEP 256            // 3. NotOnFly            PayloadLen -= (WLAN_HDR_ADDR3_LEN + 4 + 4); // 24 is 802.11 header,4 is IV, 4 is crc            MEMvCopy(pDevice->abyPRNG, pbyIV, 3);            MEMvCopy(pDevice->abyPRNG + 3, pKey->abyKey, pKey->uKeyLength);            rc4_init(&pDevice->SBox, pDevice->abyPRNG, pKey->uKeyLength + 3);            rc4_encrypt(&pDevice->SBox, pbyIV+4, pbyIV+4, PayloadLen);                        if (ETHbIsBufferCrc32Ok(pbyIV+4, PayloadLen)) {                *pbyNewRsr |= NEWRSR_DECRYPTOK;            }        }    } else if ((byDecMode == KEY_CTL_TKIP) ||               (byDecMode == KEY_CTL_CCMP)) {        // TKIP/AES        PayloadLen -= (WLAN_HDR_ADDR3_LEN + 8 + 4); // 24 is 802.11 header, 8 is IV&ExtIV, 4 is crc        *pdwRxTSC47_16 = cpu_to_le32(*(PDWORD)(pbyIV + 4));        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ExtIV: %lx\n",*pdwRxTSC47_16);        if (byDecMode == KEY_CTL_TKIP) {            *pwRxTSC15_0 = cpu_to_le16(MAKEWORD(*(pbyIV+2), *pbyIV));        } else {            *pwRxTSC15_0 = cpu_to_le16(*(PWORD)pbyIV);        }        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"TSC0_15: %x\n", *pwRxTSC15_0);                if (byDecMode == KEY_CTL_TKIP) {                        if ((pDevice->byLocalID <= REV_ID_VT3253_A1) || (bOnFly == FALSE)) {                // Software TKIP                // 1. 3253 A                // 2. NotOnFly                DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"soft KEY_CTL_TKIP \n");                pMACHeader = (PS802_11Header) (pbyFrame);                TKIPvMixKey(pKey->abyKey, pMACHeader->abyAddr2, *pwRxTSC15_0, *pdwRxTSC47_16, pDevice->abyPRNG);                rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);                rc4_encrypt(&pDevice->SBox, pbyIV+8, pbyIV+8, PayloadLen);                if (ETHbIsBufferCrc32Ok(pbyIV+8, PayloadLen)) {                    *pbyNewRsr |= NEWRSR_DECRYPTOK;                    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ICV OK!\n");                } else {                    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ICV FAIL!!!\n");                    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"PayloadLen = %d\n", PayloadLen);                }            }            }                if (byDecMode == KEY_CTL_CCMP) {            if (bOnFly == FALSE) {                // Software CCMP                // NotOnFly                DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"soft KEY_CTL_CCMP\n");                                if (AESbGenCCMP(pKey->abyKey, pbyFrame, FrameSize)) {                    *pbyNewRsr |= NEWRSR_DECRYPTOK;                                       DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"CCMP MIC compare OK!\n");                 } else {                        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"CCMP MIC fail!\n");                }                }            }                    }// end of TKIP/AES    if ((*(pbyIV+3) & 0x20) != 0)        *pbExtIV = TRUE;    return TRUE;}static BOOL s_bAPModeRxData (    IN PSDevice pDevice,    IN struct sk_buff* skb,    IN UINT     FrameSize,    IN UINT     cbHeaderOffset,        IN INT      iSANodeIndex,    IN INT      iDANodeIndex    ){    PSMgmtObject        pMgmt = &(pDevice->sMgmtObj);    BOOL                bRelayAndForward = FALSE;    BOOL                bRelayOnly = FALSE;    BYTE                byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};    WORD                wAID;        struct sk_buff* skbcpy = NULL;    if (FrameSize > CB_MAX_BUF_SIZE)        return FALSE;    // check DA    if(IS_MULTICAST_ADDRESS((PBYTE)(skb->data+cbHeaderOffset))) {       if (pMgmt->sNodeDBTable[0].bPSEnable) {                   skbcpy = dev_alloc_skb((int)pDevice->rx_buf_sz);        // if any node in PS mode, buffer packet until DTIM.           if (skbcpy == NULL) {               DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "relay multicast no skb available \n");           }            else {               skbcpy->dev = pDevice->dev;               skbcpy->len = FrameSize;               memcpy(skbcpy->data, skb->data+cbHeaderOffset, FrameSize);               skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skbcpy);               pMgmt->sNodeDBTable[0].wEnQueueCnt++;               // set tx map               pMgmt->abyPSTxMap[0] |= byMask[0];           }               }       else {           bRelayAndForward = TRUE;       }        }    else {        // check if relay         if (BSSbIsSTAInNodeDB(pDevice, (PBYTE)(skb->data+cbHeaderOffset), &iDANodeIndex)) {            if (pMgmt->sNodeDBTable[iDANodeIndex].eNodeState >= NODE_ASSOC) {                if (pMgmt->sNodeDBTable[iDANodeIndex].bPSEnable) {                    // queue this skb until next PS tx, and then release.                    	                skb->data += cbHeaderOffset;	                skb->tail += cbHeaderOffset;                    skb_put(skb, FrameSize);                    skb_queue_tail(&pMgmt->sNodeDBTable[iDANodeIndex].sTxPSQueue, skb);                                            pMgmt->sNodeDBTable[iDANodeIndex].wEnQueueCnt++;                    wAID = pMgmt->sNodeDBTable[iDANodeIndex].wAID;                     pMgmt->abyPSTxMap[wAID >> 3] |=  byMask[wAID & 7];                    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "relay: index= %d, pMgmt->abyPSTxMap[%d]= %d\n",                               iDANodeIndex, (wAID >> 3), pMgmt->abyPSTxMap[wAID >> 3]);                    return TRUE;                }                else {                    bRelayOnly = TRUE;                }            }            };    }         if (bRelayOnly || bRelayAndForward) {        // relay this packet right now        if (bRelayAndForward)            iDANodeIndex = 0;                if ((pDevice->uAssocCount > 1) && (iDANodeIndex >= 0)) {            bRelayPacketSend(pDevice, (PBYTE)(skb->data + cbHeaderOffset), FrameSize, (UINT)iDANodeIndex);        }            if (bRelayOnly)             return FALSE;    }    // none associate, don't forward    if (pDevice->uAssocCount == 0)        return FALSE;            return TRUE;    }VOIDRXvWorkItem(    PVOID Context    ){    PSDevice pDevice = (PSDevice) Context;    NTSTATUS        ntStatus;    PRCB            pRCB=NULL;    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->Rx Polling Thread\n");    spin_lock_irq(&pDevice->lock);    while ( MP_TEST_FLAG(pDevice, fMP_POST_READS) &&             MP_IS_READY(pDevice) &&             (pDevice->NumRecvFreeList != 0) ) {        pRCB = pDevice->FirstRecvFreeList;        pDevice->NumRecvFreeList--;        ASSERT(pRCB);// cannot be NULL                DequeueRCB(pDevice->FirstRecvFreeList, pDevice->LastRecvFreeList);        ntStatus = PIPEnsBulkInUsbRead(pDevice, pRCB);    }    pDevice->bIsRxWorkItemQueued = FALSE;    spin_unlock_irq(&pDevice->lock);}VOID RXvFreeRCB(    IN PRCB pRCB,    IN BOOL bReAllocSkb    ){    PSDevice pDevice = (PSDevice)pRCB->pDevice;        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->RXvFreeRCB\n");        ASSERT(!pRCB->Ref);     // should be 0    ASSERT(pRCB->pDevice);  // shouldn't be NULL        if (bReAllocSkb == TRUE) {        pRCB->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);        // todo error handling        if (pRCB->skb == NULL) {            DBG_PRT(MSG_LEVEL_ERR,KERN_ERR" Failed to re-alloc rx skb\n");        }else {            pRCB->skb->dev = pDevice->dev;        }    }        //    // Insert the RCB back in the Recv free list         //    EnqueueRCB(pDevice->FirstRecvFreeList, pDevice->LastRecvFreeList, pRCB);    pDevice->NumRecvFreeList++;        if (MP_TEST_FLAG(pDevice, fMP_POST_READS) && MP_IS_READY(pDevice) &&        (pDevice->bIsRxWorkItemQueued == FALSE) ) {                    pDevice->bIsRxWorkItemQueued = TRUE;        tasklet_schedule(&pDevice->ReadWorkItem);    }    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"<----RXFreeRCB %d %d\n",pDevice->NumRecvFreeList, pDevice->NumRecvMngList); }VOIDRXvMngWorkItem(    PVOID Context    ){    PSDevice pDevice = (PSDevice) Context;    PRCB            pRCB=NULL;    PSRxMgmtPacket  pRxPacket;    BOOL            bReAllocSkb = FALSE;    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->Rx Mng Thread\n");        spin_lock_irq(&pDevice->lock);        while (pDevice->NumRecvMngList!=0)    {        pRCB = pDevice->FirstRecvMngList;        pDevice->NumRecvMngList--;        DequeueRCB(pDevice->FirstRecvMngList, pDevice->LastRecvMngList);        if(!pRCB){            break;        }        ASSERT(pRCB);// cannot be NULL        pRxPacket = &(pRCB->sMngPacket);        vMgrRxManagePacket((HANDLE)pDevice, &(pDevice->sMgmtObj), pRxPacket);        pRCB->Ref--;        if(pRCB->Ref == 0) {            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"RxvFreeMng %d %d\n",pDevice->NumRecvFreeList, pDevice->NumRecvMngList);             RXvFreeRCB(pRCB, bReAllocSkb);        } else {            DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Rx Mng Only we have the right to free RCB\n");        }    }        pDevice->bIsRxMngWorkItemQueued = FALSE;    spin_unlock_irq(&pDevice->lock);    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -