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

📄 rxtx.c

📁 VIA VT6656 USB linux source code.
💻 C
📖 第 1 页 / 共 5 页
字号:
{    PUSB_SEND_CONTEXT   pContext = NULL;    PUSB_SEND_CONTEXT   pReturnContext = NULL;    UINT                ii;    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GetFreeContext()\n");    for (ii = 0; ii < pDevice->cbTD; ii++) {        pContext = pDevice->apTD[ii];        if (pContext->bBoolInUse == FALSE) {            pContext->bBoolInUse = TRUE;            pReturnContext = pContext;            break;        }    }    if ( ii == pDevice->cbTD ) {        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Free Tx Context\n");    }    return ((PVOID) pReturnContext);}staticVOID s_vSaveTxPktInfo(PSDevice pDevice, BYTE byPktNum, PBYTE pbyDestAddr, WORD wPktLength, WORD wFIFOCtl){    PSStatCounter           pStatistic=&(pDevice->scStatistic);            if (IS_BROADCAST_ADDRESS(pbyDestAddr))        pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_BROAD;    else if (IS_MULTICAST_ADDRESS(pbyDestAddr))        pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_MULTI;    else        pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_UNI;            pStatistic->abyTxPktInfo[byPktNum].wLength = wPktLength;    pStatistic->abyTxPktInfo[byPktNum].wFIFOCtl = wFIFOCtl;    MEMvCopy(pStatistic->abyTxPktInfo[byPktNum].abyDestAddr, pbyDestAddr, U_ETHER_ADDR_LEN);}staticVOIDs_vFillTxKey (    IN  PSDevice   pDevice,    IN  PBYTE      pbyBuf,    IN  PBYTE      pbyIVHead,    IN  PSKeyItem  pTransmitKey,    IN  PBYTE      pbyHdrBuf,    IN  WORD       wPayloadLen,    OUT PBYTE      pMICHDR    ){    PDWORD          pdwIV = (PDWORD) pbyIVHead;    PDWORD          pdwExtIV = (PDWORD) ((PBYTE)pbyIVHead+4);    WORD            wValue;    PS802_11Header  pMACHeader = (PS802_11Header)pbyHdrBuf;    DWORD           dwRevIVCounter;        //Fill TXKEY    if (pTransmitKey == NULL)        return;    dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);     *pdwIV = pDevice->dwIVCounter;    pDevice->byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;    if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {        if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN ){            MEMvCopy(pDevice->abyPRNG, (PBYTE)&(dwRevIVCounter), 3);            MEMvCopy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);        } else {            MEMvCopy(pbyBuf, (PBYTE)&(dwRevIVCounter), 3);            MEMvCopy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);            if(pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {                MEMvCopy(pbyBuf+8, (PBYTE)&(dwRevIVCounter), 3);                MEMvCopy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);            }            MEMvCopy(pDevice->abyPRNG, pbyBuf, 16);        }        // Append IV after Mac Header        *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111        *pdwIV |= (pDevice->byKeyIndex << 30);        *pdwIV = cpu_to_le32(*pdwIV);        pDevice->dwIVCounter++;        if (pDevice->dwIVCounter > WEP_IV_MASK) {            pDevice->dwIVCounter = 0;        }    } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {        pTransmitKey->wTSC15_0++;        if (pTransmitKey->wTSC15_0 == 0) {            pTransmitKey->dwTSC47_16++;        }        TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,                    pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);        MEMvCopy(pbyBuf, pDevice->abyPRNG, 16);        // Make IV        MEMvCopy(pdwIV, pDevice->abyPRNG, 3);                        *(pbyIVHead+3) = (BYTE)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV        // Append IV&ExtIV after Mac Header        *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV);    } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {        pTransmitKey->wTSC15_0++;        if (pTransmitKey->wTSC15_0 == 0) {            pTransmitKey->dwTSC47_16++;        }        MEMvCopy(pbyBuf, pTransmitKey->abyKey, 16);        // Make IV        *pdwIV = 0;        *(pbyIVHead+3) = (BYTE)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV        *pdwIV |= cpu_to_le16((WORD)(pTransmitKey->wTSC15_0));        //Append IV&ExtIV after Mac Header        *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);        //Fill MICHDR0        *pMICHDR = 0x59;        *((PBYTE)(pMICHDR+1)) = 0; // TxPriority        MEMvCopy(pMICHDR+2, &(pMACHeader->abyAddr2[0]), 6);        *((PBYTE)(pMICHDR+8)) = HIBYTE(HIWORD(pTransmitKey->dwTSC47_16));        *((PBYTE)(pMICHDR+9)) = LOBYTE(HIWORD(pTransmitKey->dwTSC47_16));        *((PBYTE)(pMICHDR+10)) = HIBYTE(LOWORD(pTransmitKey->dwTSC47_16));        *((PBYTE)(pMICHDR+11)) = LOBYTE(LOWORD(pTransmitKey->dwTSC47_16));        *((PBYTE)(pMICHDR+12)) = HIBYTE(pTransmitKey->wTSC15_0);        *((PBYTE)(pMICHDR+13)) = LOBYTE(pTransmitKey->wTSC15_0);        *((PBYTE)(pMICHDR+14)) = HIBYTE(wPayloadLen);        *((PBYTE)(pMICHDR+15)) = LOBYTE(wPayloadLen);        //Fill MICHDR1        *((PBYTE)(pMICHDR+16)) = 0; // HLEN[15:8]        if (pDevice->bLongHeader) {            *((PBYTE)(pMICHDR+17)) = 28; // HLEN[7:0]        } else {            *((PBYTE)(pMICHDR+17)) = 22; // HLEN[7:0]        }        wValue = cpu_to_le16(pMACHeader->wFrameCtl & 0xC78F);        MEMvCopy(pMICHDR+18, (PBYTE)&wValue, 2); // MSKFRACTL        MEMvCopy(pMICHDR+20, &(pMACHeader->abyAddr1[0]), 6);        MEMvCopy(pMICHDR+26, &(pMACHeader->abyAddr2[0]), 6);        //Fill MICHDR2        MEMvCopy(pMICHDR+32, &(pMACHeader->abyAddr3[0]), 6);        wValue = pMACHeader->wSeqCtl;        wValue &= 0x000F;        wValue = cpu_to_le16(wValue);        MEMvCopy(pMICHDR+38, (PBYTE)&wValue, 2); // MSKSEQCTL        if (pDevice->bLongHeader) {            MEMvCopy(pMICHDR+40, &(pMACHeader->abyAddr4[0]), 6);        }    }}staticVOIDs_vSWencryption (    IN  PSDevice            pDevice,    IN  PSKeyItem           pTransmitKey,    IN  PBYTE               pbyPayloadHead,    IN  WORD                wPayloadSize    ){    UINT   cbICVlen = 4;    DWORD  dwICV = 0xFFFFFFFFL;    PDWORD pdwICV;    if (pTransmitKey == NULL)        return;    if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {        //=======================================================================        // Append ICV after payload        dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)        pdwICV = (PDWORD)(pbyPayloadHead + wPayloadSize);        // finally, we must invert dwCRC to get the correct answer        *pdwICV = cpu_to_le32(~dwICV);        // RC4 encryption        rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3);        rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);        //=======================================================================    } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {        //=======================================================================        //Append ICV after payload        dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)        pdwICV = (PDWORD)(pbyPayloadHead + wPayloadSize);        // finally, we must invert dwCRC to get the correct answer        *pdwICV = cpu_to_le32(~dwICV);        // RC4 encryption        rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);        rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);        //=======================================================================    }}/*byPktType : PK_TYPE_11A     0             PK_TYPE_11B     1             PK_TYPE_11GB    2             PK_TYPE_11GA    3*/                            staticUINTs_uGetTxRsvTime (    IN PSDevice pDevice,    IN BYTE     byPktType,    IN UINT     cbFrameLength,    IN WORD     wRate,    IN BOOL     bNeedAck    ){    UINT uDataTime, uAckTime;    uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate);    if (byPktType == PK_TYPE_11B) {//llb,CCK mode        uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (WORD)pDevice->byTopCCKBasicRate);    } else {//11g 2.4G OFDM mode & 11a 5G OFDM mode        uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (WORD)pDevice->byTopOFDMBasicRate);    }    if (bNeedAck) {        return (uDataTime + pDevice->uSIFS + uAckTime);    }    else {        return uDataTime;    }}//byFreqType: 0=>5GHZ 1=>2.4GHZstaticUINTs_uGetRTSCTSRsvTime (    IN PSDevice pDevice,    IN BYTE byRTSRsvType,    IN BYTE byPktType,        IN UINT cbFrameLength,    IN WORD wCurrentRate    ){    UINT uRrvTime  , uRTSTime, uCTSTime, uAckTime, uDataTime;    uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0;            uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate);    if (byRTSRsvType == 0) { //RTSTxRrvTime_bb        uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);        uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);    }    else if (byRTSRsvType == 1){ //RTSTxRrvTime_ba, only in 2.4GHZ        uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);        uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);        uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);    }    else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa        uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate);        uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);    }    else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ        uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);        uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);        uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS;        return uRrvTime;    }    //RTSRrvTime    uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS;    return uRrvTime;}//byFreqType 0: 5GHz, 1:2.4GhzstaticUINTs_uGetDataDuration (    IN PSDevice pDevice,    IN BYTE     byDurType,        IN UINT     cbFrameLength,    IN BYTE     byPktType,    IN WORD     wRate,    IN BOOL     bNeedAck,    IN UINT     uFragIdx,    IN UINT     cbLastFragmentSize,    IN UINT     uMACfragNum,    IN BYTE     byFBOption    ){    BOOL bLastFrag = 0;    UINT uAckTime =0, uNextPktTime = 0;        if (uFragIdx == (uMACfragNum-1)) {        bLastFrag = 1;    }        switch (byDurType) {    case DATADUR_B:    //DATADUR_B        if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag            if (bNeedAck) {            	uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);                return (pDevice->uSIFS + uAckTime);            } else {                return 0;            }        }        else {//First Frag or Mid Frag            if (uFragIdx == (uMACfragNum-2)) {            	uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);            } else {                uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);            }            if (bNeedAck) {            	uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);                return (pDevice->uSIFS + uAckTime + uNextPktTime);

⌨️ 快捷键说明

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