📄 dpc.c
字号:
/* * 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 + -