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

📄 dpc.c

📁 VIA VT6656 USB linux source code.
💻 C
📖 第 1 页 / 共 4 页
字号:
/* * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. * All rights reserved. * * This software is copyrighted by and is the sole property of * VIA Networking Technologies, Inc. This software may only be used * in accordance with the corresponding license agreement. Any unauthorized * use, duplication, transmission, distribution, or disclosure of this * software is expressly forbidden. * * This software is provided by VIA Networking Technologies, Inc. "as is" * and any express or implied warranties, including, but not limited to, the * implied warranties of merchantability and fitness for a particular purpose * are disclaimed. In no event shall VIA Networking Technologies, Inc. * be liable for any direct, indirect, incidental, special, exemplary, or * consequential damages. * * File: dpc.c * * Purpose: handle dpc rx functions  * * Author: Lyndon Chen * * Date: May 20, 2003 * * Functions:  *      device_receive_frame - Rcv 802.11 frame function  *      s_bAPModeRxCtl- AP Rcv frame filer Ctl. *      s_bAPModeRxData- AP Rcv data frame handle *      s_bHandleRxEncryption- Rcv decrypted data via on-fly *      s_bHostWepRxEncryption- Rcv encrypted data via host   *      s_byGetRateIdx- get rate index *      s_vGetDASA- get data offset *      s_vProcessRxMACHeader- Rcv 802.11 and translate to 802.3  * * Revision History: * */ #if !defined(__DEVICE_H__)#include "device.h"#endif#if !defined(__RXTX_H__)#include "rxtx.h"#endif#if !defined(__TETHER_H__)#include "tether.h"#endif#if !defined(__CARD_H__)#include "card.h"#endif#if !defined(__BSSDB_H__)#include "bssdb.h"#endif#if !defined(__MAC_H__)#include "mac.h"#endif#if !defined(__BASEBAND_H__)#include "baseband.h"#endif#if !defined(__UMEM_H__)#include "umem.h"#endif#if !defined(__MICHAEL_H__)#include "michael.h"#endif#if !defined(__TKIP_H__)#include "tkip.h"#endif#if !defined(__TCRC_H__)#include "tcrc.h"#endif#if !defined(__WCTL_H__)#include "wctl.h"#endif#if !defined(__TBIT_H__)#include "tbit.h"#endif#if !defined(__HOSTAP_H__)#include "hostap.h"#endif#if !defined(__RF_H__)#include "rf.h"#endif#if !defined(__IOWPA_H__)#include "iowpa.h"#endif#if !defined(__AES_H__)#include "aes_ccmp.h"#endif#if !defined(__DATARATE_H__)#include "datarate.h"#endif#if !defined(__USBPIPE_H__)#include "usbpipe.h"#endif/*---------------------  Static Definitions -------------------------*//*---------------------  Static Classes  ----------------------------*//*---------------------  Static Variables  --------------------------*///static int          msglevel                =MSG_LEVEL_DEBUG;static int          msglevel                =MSG_LEVEL_INFO;const BYTE acbyRxRate[MAX_RATE] ={2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108};/*---------------------  Static Functions  --------------------------*//*---------------------  Static Definitions -------------------------*//*---------------------  Static Functions  --------------------------*/static BYTE s_byGetRateIdx(IN BYTE byRate);staticVOIDs_vGetDASA(    IN  PBYTE pbyRxBufferAddr,    OUT PUINT pcbHeaderSize,    OUT PSEthernetHeader psEthHeader    );staticVOIDs_vProcessRxMACHeader (    IN  PSDevice pDevice,    IN  PBYTE pbyRxBufferAddr,    IN  UINT cbPacketSize,    IN  BOOL bIsWEP,    IN  BOOL bExtIV,    OUT PUINT pcbHeadSize    );    static BOOL s_bAPModeRxCtl(    IN PSDevice pDevice,    IN PBYTE    pbyFrame,    IN INT      iSANodeIndex    );static BOOL s_bAPModeRxData (    IN PSDevice pDevice,    IN struct sk_buff* skb,    IN UINT     FrameSize,    IN UINT     cbHeaderOffset,        IN INT      iSANodeIndex,    IN INT      iDANodeIndex    );        static BOOL s_bHandleRxEncryption(    IN PSDevice     pDevice,    IN PBYTE        pbyFrame,    IN UINT         FrameSize,    IN PBYTE        pbyRsr,    OUT PBYTE       pbyNewRsr,    OUT PSKeyItem   *pKeyOut,    OUT PBOOL       pbExtIV,    OUT PWORD       pwRxTSC15_0,    OUT PDWORD      pdwRxTSC47_16    );        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            );        /*---------------------  Export Variables  --------------------------*//*+ * * Description: *    Translate Rcv 802.11 header to 802.3 header with Rx buffer * * Parameters: *  In: *      pDevice *      dwRxBufferAddr  - Address of Rcv Buffer *      cbPacketSize    - Rcv Packet size *      bIsWEP          - If Rcv with WEP *  Out: *      pcbHeaderSize   - 802.11 header size * * Return Value: None *-*/staticVOIDs_vProcessRxMACHeader (    IN  PSDevice pDevice,    IN  PBYTE pbyRxBufferAddr,    IN  UINT cbPacketSize,    IN  BOOL bIsWEP,    IN  BOOL bExtIV,    OUT PUINT pcbHeadSize    ){    PBYTE           pbyRxBuffer;    UINT            cbHeaderSize = 0;    PWORD           pwType;    PS802_11Header  pMACHeader;    int             ii;    pMACHeader = (PS802_11Header) (pbyRxBufferAddr + cbHeaderSize);    s_vGetDASA((PBYTE)pMACHeader, &cbHeaderSize, &pDevice->sRxEthHeader);    if (bIsWEP) {        if (bExtIV) {            // strip IV&ExtIV , add 8 byte            cbHeaderSize += (WLAN_HDR_ADDR3_LEN + 8);        } else {            // strip IV , add 4 byte            cbHeaderSize += (WLAN_HDR_ADDR3_LEN + 4);        }    }    else {        cbHeaderSize += WLAN_HDR_ADDR3_LEN;    };    pbyRxBuffer = (PBYTE) (pbyRxBufferAddr + cbHeaderSize);    if (IS_ETH_ADDRESS_EQUAL(pbyRxBuffer, &pDevice->abySNAP_Bridgetunnel[0])) {        cbHeaderSize += 6;    }    else if (IS_ETH_ADDRESS_EQUAL(pbyRxBuffer, &pDevice->abySNAP_RFC1042[0])) {        cbHeaderSize += 6;        pwType = (PWORD) (pbyRxBufferAddr + cbHeaderSize);        if ((*pwType!= TYPE_PKT_IPX) && (*pwType != cpu_to_le16(0xF380))) {        }        else {            cbHeaderSize -= 8;            pwType = (PWORD) (pbyRxBufferAddr + cbHeaderSize);            if (bIsWEP) {                if (bExtIV) {                    *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 8);    // 8 is IV&ExtIV                } else {                    *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 4);    // 4 is IV                }            }            else {                *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN);            }        }    }    else {        cbHeaderSize -= 2;        pwType = (PWORD) (pbyRxBufferAddr + cbHeaderSize);        if (bIsWEP) {            if (bExtIV) {                *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 8);    // 8 is IV&ExtIV            } else {                *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 4);    // 4 is IV            }        }        else {            *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN);        }    }    cbHeaderSize -= (U_ETHER_ADDR_LEN * 2);    pbyRxBuffer = (PBYTE) (pbyRxBufferAddr + cbHeaderSize);    for(ii=0;ii<U_ETHER_ADDR_LEN;ii++)        *pbyRxBuffer++ = pDevice->sRxEthHeader.abyDstAddr[ii];    for(ii=0;ii<U_ETHER_ADDR_LEN;ii++)        *pbyRxBuffer++ = pDevice->sRxEthHeader.abySrcAddr[ii];    *pcbHeadSize = cbHeaderSize;}static BYTE s_byGetRateIdx (IN BYTE byRate){    BYTE    byRateIdx;    for (byRateIdx = 0; byRateIdx <MAX_RATE ; byRateIdx++) {        if (acbyRxRate[byRateIdx%MAX_RATE] == byRate)            return byRateIdx;    }    return 0;}staticVOIDs_vGetDASA (    IN  PBYTE pbyRxBufferAddr,    OUT PUINT pcbHeaderSize,    OUT PSEthernetHeader psEthHeader    ){    UINT            cbHeaderSize = 0;    PS802_11Header  pMACHeader;    int             ii;    pMACHeader = (PS802_11Header) (pbyRxBufferAddr + cbHeaderSize);    if ((pMACHeader->wFrameCtl & FC_TODS) == 0) {        if (pMACHeader->wFrameCtl & FC_FROMDS) {            for(ii=0;ii<U_ETHER_ADDR_LEN;ii++) {                psEthHeader->abyDstAddr[ii] = pMACHeader->abyAddr1[ii];                psEthHeader->abySrcAddr[ii] = pMACHeader->abyAddr3[ii];            }        }        else {            // IBSS mode            for(ii=0;ii<U_ETHER_ADDR_LEN;ii++) {                psEthHeader->abyDstAddr[ii] = pMACHeader->abyAddr1[ii];                psEthHeader->abySrcAddr[ii] = pMACHeader->abyAddr2[ii];            }        }    }    else {        // Is AP mode..        if (pMACHeader->wFrameCtl & FC_FROMDS) {            for(ii=0;ii<U_ETHER_ADDR_LEN;ii++) {                psEthHeader->abyDstAddr[ii] = pMACHeader->abyAddr3[ii];                psEthHeader->abySrcAddr[ii] = pMACHeader->abyAddr4[ii];                cbHeaderSize += 6;            }        }        else {            for(ii=0;ii<U_ETHER_ADDR_LEN;ii++) {                psEthHeader->abyDstAddr[ii] = pMACHeader->abyAddr3[ii];                psEthHeader->abySrcAddr[ii] = pMACHeader->abyAddr2[ii];            }        }    };    *pcbHeaderSize = cbHeaderSize;}BOOLRXbBulkInProcessData (    IN PSDevice         pDevice,    IN PRCB             pRCB,    IN ULONG            BytesToIndicate    ){        struct net_device_stats* pStats=&pDevice->stats;    struct sk_buff* skb;    PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);    PSRxMgmtPacket  pRxPacket = &(pMgmt->sRxPacket);     PS802_11Header  p802_11Header;    PBYTE           pbyRsr;    PBYTE           pbyNewRsr;    PBYTE           pbyRSSI;    PQWORD          pqwTSFTime;    PBYTE           pbyFrame;    BOOL            bDeFragRx = FALSE;    UINT            cbHeaderOffset;    UINT            FrameSize;    WORD            wEtherType = 0;    INT             iSANodeIndex = -1;    INT             iDANodeIndex = -1;        UINT            ii;    UINT            cbIVOffset;    PBYTE           pbyRxSts;    PBYTE           pbyRxRate;    PBYTE           pbySQ; #ifdef Calcu_LinkQual    PBYTE           pby3SQ;#endif    UINT            cbHeaderSize;        PSKeyItem       pKey = NULL;    WORD            wRxTSC15_0 = 0;    DWORD           dwRxTSC47_16 = 0;            SKeyItem        STempKey;      // 802.11h RPI    //LONG            ldBm = 0;    BOOL            bIsWEP = FALSE;        BOOL            bExtIV = FALSE;     DWORD           dwWbkStatus;    PRCB            pRCBIndicate = pRCB;               PBYTE           pbyDAddress;        PWORD           pwPLCP_Length;    BYTE            abyVaildRate[MAX_RATE] = {2,4,11,22,12,18,24,36,48,72,96,108};    WORD            wPLCPwithPadding;    PS802_11Header  pMACHeader;                                DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---------- RXbBulkInProcessData---\n");    skb = pRCB->skb;

⌨️ 快捷键说明

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