📄 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(__WROUTE_H__)
#include "wroute.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
/*--------------------- 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);
static
VOID
s_vGetDASA(
IN PBYTE pbyRxBufferAddr,
OUT PUINT pcbHeaderSize,
OUT PSEthernetHeader psEthHeader
);
static
VOID
s_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
);
#ifdef PRIVATE_OBJ
static BOOL s_bAPModeRxData (
IN PSDevice pDevice,
IN ref_sk_buff* skb,
IN UINT FrameSize,
IN UINT cbHeaderOffset,
IN INT iSANodeIndex,
IN INT iDANodeIndex
);
#else
static BOOL s_bAPModeRxData (
IN PSDevice pDevice,
IN struct sk_buff* skb,
IN UINT FrameSize,
IN UINT cbHeaderOffset,
IN INT iSANodeIndex,
IN INT iDANodeIndex
);
#endif
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
*
-*/
static
VOID
s_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;
}
static
VOID
s_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;
}
BOOL
device_receive_frame (
IN PSDevice pDevice,
IN PSRxDesc pCurrRD
)
{
PDEVICE_RD_INFO pRDInfo = pCurrRD->pRDInfo;
struct net_device_stats* pStats=&pDevice->stats;
#ifdef PRIVATE_OBJ
ref_sk_buff* skb;
#else
struct sk_buff* skb;
#endif
PSMgmtObject pMgmt = pDevice->pMgmt;
PSRxMgmtPacket pRxPacket = &(pDevice->pMgmt->sRxPacket);
PS802_11Header p802_11Header;
PBYTE pbyRsr;
PBYTE pbyNewRsr;
PBYTE pbyRSSI;
PQWORD pqwTSFTime;
PWORD pwFrameSize;
PBYTE pbyFrame;
BOOL bDeFragRx = FALSE;
BOOL bIsWEP = FALSE;
UINT cbHeaderOffset;
UINT FrameSize;
WORD wEtherType = 0;
INT iSANodeIndex = -1;
INT iDANodeIndex = -1;
UINT ii;
UINT cbIVOffset;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -