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

📄 rxtx.c

📁 VIA VT6656 USB linux source code.
💻 C
📖 第 1 页 / 共 5 页
字号:
 * * Description: *      Generate FIFO control for MAC & Baseband controller * * Parameters: *  In: *      pDevice         - Pointer to adpater *      pTxDataHead     - Transmit Data Buffer *      pTxBufHead      - pTxBufHead *      pvRrvTime        - pvRrvTime *      pvRTS            - RTS Buffer *      pCTS            - CTS Buffer *      cbFrameSize     - Transmit Data Length (Hdr+Payload+FCS) *      bNeedACK        - If need ACK *      uDMAIdx         - DMA Index *  Out: *      none * * Return Value: none *-*/// UINT            cbFrameSize,//Hdr+Payload+FCSstaticVOIDs_vGenerateTxParameter (    IN PSDevice         pDevice,    IN BYTE             byPktType,    IN WORD             wCurrentRate,        IN PVOID            pTxBufHead,    IN PVOID            pvRrvTime,    IN PVOID            pvRTS,    IN PVOID            pvCTS,    IN UINT             cbFrameSize,    IN BOOL             bNeedACK,    IN UINT             uDMAIdx,    IN PSEthernetHeader psEthHeader    ){    UINT cbMACHdLen = WLAN_HDR_ADDR3_LEN; //24    WORD wFifoCtl;    BOOL bDisCRC = FALSE;    BYTE byFBOption = AUTO_FB_NONE;//    WORD wCurrentRate = pDevice->wCurrentRate;        //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter...\n");    PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;    pFifoHead->wReserved = wCurrentRate;            wFifoCtl = pFifoHead->wFIFOCtl;    if (wFifoCtl & FIFOCTL_CRCDIS) {        bDisCRC = TRUE;    }    if (wFifoCtl & FIFOCTL_AUTO_FB_0) {        byFBOption = AUTO_FB_0;    }     else if (wFifoCtl & FIFOCTL_AUTO_FB_1) {        byFBOption = AUTO_FB_1;    }    if (pDevice->bLongHeader)        cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;    if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {        if (pvRTS != NULL) { //RTS_need            //Fill RsvTime            if (pvRrvTime) {                PSRrvTime_gRTS pBuf = (PSRrvTime_gRTS)pvRrvTime;                pBuf->wRTSTxRrvTime_aa = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 1:2.4GHz                pBuf->wRTSTxRrvTime_ba = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate));//1:RTSTxRrvTime_ba, 1:2.4GHz                pBuf->wRTSTxRrvTime_bb = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz                                pBuf->wTxRrvTime_a = cpu_to_le16((WORD) s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM                pBuf->wTxRrvTime_b = cpu_to_le16((WORD) s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK            }            //Fill RTS            s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);        }        else {//RTS_needless, PCF mode                        //Fill RsvTime            if (pvRrvTime) {                PSRrvTime_gCTS pBuf = (PSRrvTime_gCTS)pvRrvTime;                pBuf->wTxRrvTime_a = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM                pBuf->wTxRrvTime_b = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK                pBuf->wCTSTxRrvTime_ba = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate));//3:CTSTxRrvTime_Ba, 1:2.4GHz                           }            //Fill CTS            s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);        }    }    else if (byPktType == PK_TYPE_11A) {                if (pvRTS != NULL) {//RTS_need, non PCF mode            //Fill RsvTime            if (pvRrvTime) {                PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;                pBuf->wRTSTxRrvTime = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 0:5GHz                                                pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//0:OFDM            }            //Fill RTS            s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);        }        else if (pvRTS == NULL) {//RTS_needless, non PCF mode            //Fill RsvTime            if (pvRrvTime) {                PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;                pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK)); //0:OFDM            }        }    }    else if (byPktType == PK_TYPE_11B) {        if ((pvRTS != NULL)) {//RTS_need, non PCF mode            //Fill RsvTime            if (pvRrvTime) {                PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;                pBuf->wRTSTxRrvTime = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz                                pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK));//1:CCK            }            //Fill RTS            s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);        }        else { //RTS_needless, non PCF mode            //Fill RsvTime            if (pvRrvTime) {                PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;                pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK)); //1:CCK            }        }    }    //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter END.\n");}/*    PBYTE pbyBuffer,//point to pTxBufHead    WORD  wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last    UINT  cbFragmentSize,//Hdr+payoad+FCS*/BOOLs_bPacketToWirelessUsb(    IN  PSDevice         pDevice,    IN  BYTE             byPktType,    IN  PBYTE            usbPacketBuf,    IN  BOOL             bNeedEncryption,    IN  UINT             uSkbPacketLen,    IN  UINT             uDMAIdx,    IN  PSEthernetHeader psEthHeader,    IN  PBYTE            pPacket,    IN  PSKeyItem        pTransmitKey,    IN  UINT             uNodeIndex,    IN  WORD             wCurrentRate,    OUT UINT             *pcbHeaderLen,    OUT UINT             *pcbTotalLen        ){    PSMgmtObject        pMgmt = &(pDevice->sMgmtObj);    UINT                cbFrameSize,cbFrameBodySize;    PTX_BUFFER          pTxBufHead;    UINT                cb802_1_H_len;    UINT                cbIVlen=0,cbICVlen=0,cbMIClen=0,cbMACHdLen=0,cbFCSlen=4;    UINT                cbMICHDR = 0;    BOOL                bNeedACK,bRTS;    PBYTE               pbyType,pbyMacHdr,pbyIVHead,pbyPayloadHead,pbyTxBufferAddr;    BYTE                abySNAP_RFC1042[6] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};    BYTE                abySNAP_Bridgetunnel[6] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};    UINT                uDuration;    UINT                cbHeaderLength= 0,uPadding = 0;    PVOID               pvRrvTime;    PSMICHDRHead        pMICHDR;    PVOID               pvRTS;    PVOID               pvCTS;    PVOID               pvTxDataHd;    BYTE                byFBOption = AUTO_FB_NONE,byFragType;    WORD                wTxBufSize;    DWORD               dwMICKey0,dwMICKey1,dwMIC_Priority,dwCRC;    PDWORD              pdwMIC_L,pdwMIC_R;    BOOL                bSoftWEP = FALSE;    pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;        if ((bNeedEncryption) && (pTransmitKey != NULL))  {        if (((PSKeyTable) (pTransmitKey->pvKeyTable))->bSoftWEP == TRUE) {            // WEP 256            bSoftWEP = TRUE;        }    }        pTxBufHead = (PTX_BUFFER) usbPacketBuf;    ZERO_MEMORY(pTxBufHead, sizeof(TX_BUFFER));    // Get pkt type    if (ntohs(psEthHeader->wType) > MAX_DATA_LEN) {        if (pDevice->dwDiagRefCount == 0) {            cb802_1_H_len = 8;        } else {            cb802_1_H_len = 2;        }    } else {        cb802_1_H_len = 0;    }        cbFrameBodySize = uSkbPacketLen - U_HEADER_LEN + cb802_1_H_len;       //Set packet type    pTxBufHead->wFIFOCtl |= (WORD)(byPktType<<8);        if (pDevice->dwDiagRefCount != 0) {        bNeedACK = FALSE;        pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);    } else { //if (pDevice->dwDiagRefCount != 0) {        if ((pDevice->eOPMode == OP_MODE_ADHOC) ||            (pDevice->eOPMode == OP_MODE_AP)) {            if (IS_MULTICAST_ADDRESS(&(psEthHeader->abyDstAddr[0])) ||                IS_BROADCAST_ADDRESS(&(psEthHeader->abyDstAddr[0]))) {                bNeedACK = FALSE;                pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);            }            else {                bNeedACK = TRUE;                pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;            }        }        else {            // MSDUs in Infra mode always need ACK            bNeedACK = TRUE;            pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;        }    } //if (pDevice->dwDiagRefCount != 0) {        pTxBufHead->wTimeStamp = DEFAULT_MSDU_LIFETIME_RES_64us;        //Set FIFOCTL_LHEAD    if (pDevice->bLongHeader)        pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;            if (pDevice->bSoftwareGenCrcErr) {        pTxBufHead->wFIFOCtl |= FIFOCTL_CRCDIS; // set tx descriptors to NO hardware CRC    }        //Set FRAGCTL_MACHDCNT    if (pDevice->bLongHeader) {        cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;    } else {        cbMACHdLen = WLAN_HDR_ADDR3_LEN;    }    pTxBufHead->wFragCtl |= (WORD)(cbMACHdLen << 10);        //Set FIFOCTL_GrpAckPolicy    if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000        pTxBufHead->wFIFOCtl |=	FIFOCTL_GRPACK;    }    //Set Auto Fallback Ctl    if (wCurrentRate >= RATE_18M) {        if (pDevice->byAutoFBCtrl == AUTO_FB_0) {            pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;            byFBOption = AUTO_FB_0;        } else if (pDevice->byAutoFBCtrl == AUTO_FB_1) {            pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;            byFBOption = AUTO_FB_1;        }    }    if (bSoftWEP != TRUE) {        if ((bNeedEncryption) && (pTransmitKey != NULL))  { //WEP enabled            if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104                pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;            }            if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {                DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Tx Set wFragCtl == FRAGCTL_TKIP\n");                pTxBufHead->wFragCtl |= FRAGCTL_TKIP;            }            else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP                pTxBufHead->wFragCtl |= FRAGCTL_AES;            }        }    }           if ((bNeedEncryption) && (pTransmitKey != NULL))  {        if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {            cbIVlen = 4;            cbICVlen = 4;        }        else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {            cbIVlen = 8;//IV+ExtIV            cbMIClen = 8;            cbICVlen = 4;        }        if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {            cbIVlen = 8;//RSN Header            cbICVlen = 8;//MIC            cbMICHDR = sizeof(SMICHDRHead);        }        if (bSoftWEP == FALSE) {            //MAC Header should be padding 0 to DW alignment.            uPadding = 4 - (cbMACHdLen%4);            uPadding %= 4;        }    }        cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;    if ( (bNeedACK == FALSE) ||(cbFrameSize < pDevice->wRTSThreshold) ) {        bRTS = FALSE;    } else {        bRTS = TRUE;        pTxBufHead->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);    }        pbyTxBufferAddr = (PBYTE) &(pTxBufHead->adwTxKey[0]);    wTxBufSize = sizeof(STxBufHead);    if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet        if (byFBOption == AUTO_FB_NONE) {            if (bRTS == TRUE) {//RTS_need                pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);                pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));                pvRTS 

⌨️ 快捷键说明

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