📄 zdmmrx.c
字号:
#ifndef __ZDMMRX_C__
#define __ZDMMRX_C__
#include "zd80211.h"
void RxPsPoll(Frame_t *rdu)
{
U16 aid;
U8 vapId = 0;
Hash_t *pHash;
MacAddr_t *sta;
//PSDEBUG("RxPsPoll");
aid = durId(rdu) & 0x3FFF;
sta = addr2(rdu);
if (isGroup(sta))
return;
if ((aid > MAX_AID) || (aid == 0)){
zd_SendClass3ErrorFrame(sta, vapId);
return;
}
else {
pHash = sstByAid[aid];
if (pHash->asoc == STATION_STATE_ASOC)
PsPolled(sta, aid);
else
zd_SendClass3ErrorFrame(sta, vapId);
}
}
BOOLEAN RxMgtMpdu(Signal_t *signal)
{
StationState sas, sau;
FrmDesc_t *pfrmDesc;
Frame_t *rdu;
U8 FrmType;
U16 authSeq = 0;
ZDEBUG("MgtRxMpdu");
pfrmDesc = signal->frmInfo.frmDesc;
rdu = pfrmDesc->mpdu;
FrmType = frmType(rdu);
ZDEBUG_V("FrmType", FrmType);
switch (FrmType){
case ST_PROBE_REQ:
signal->id = SIG_PROBE;
signal->block = BLOCK_SYNCH;
goto rx_indicate;
case ST_DEAUTH:
if (isGroup(addr1(rdu)))
goto rx_release;
else{
if ((memcmp(&mBssId.mac[0],addr2(rdu),6)==0 && mBssType==INFRASTRUCTURE_BSS))
{
#ifdef WPA_DEBUG
printk(KERN_ERR "Rx Deauth,Reason:%u\n",reason(rdu));
#endif
signal->id = SIG_DEAUTH;
signal->block = BLOCK_AUTH_RSP;
goto rx_indicate;
}
else if ((memcmp(&mBssId.mac[0],addr1(rdu),6)==0 && mBssType==AP_BSS))
{
#ifdef WPA_DEBUG
u8 *pCh=(u8*)addr2(rdu);
u8 i;
printk(KERN_ERR "Rx Deauth from station:");
for (i=0; i<6; i++)
{
printk("%02X ", *pCh++);
}
printk("\n");
#endif
signal->id = SIG_DEAUTH;
signal->block = BLOCK_AUTH_RSP;
goto rx_indicate;
}
else
{
#ifdef WPA_DEBUG
u8 *pCh=(u8*)addr2(rdu);
u8 i;
printk(KERN_ERR "Rx Deauth from unknown station:");
for (i=0; i<6; i++)
{
printk("%02X ", *pCh++);
}
printk("\n");
#endif
goto rx_release;
}
}
case ST_AUTH:
if (isGroup(addr1(rdu)))
goto rx_release;
else{
authSeq = authSeqNum(rdu);
if ((authSeq == 1) || ((authSeq == 3) && wepBit(rdu))){ //Seqence 1 or 3
signal->id = SIG_AUTH_ODD;
signal->block = BLOCK_AUTH_RSP;
goto rx_indicate;
}
else if ((authSeq == 2) || (authSeq == 4)){ //Seqence 2 or 4
signal->id = SIG_AUTH_EVEN;
signal->block = BLOCK_AUTH_REQ;
goto rx_indicate;
}
else{
goto rx_release;
}
}
case ST_DISASOC:
SsInquiry(addr2(rdu), &sas, &sau);
if ((memcmp(&mBssId.mac[0],addr2(rdu),6)==0 && mBssType==INFRASTRUCTURE_BSS))
{
#ifdef WPA_DEBUG
printk(KERN_ERR "Rx DeAssoc,Reason:%u\n",reason(rdu));
#endif
}
if(sau == STATION_STATE_NOT_AUTH){
goto class2_err;
}
else{
signal->id = SIG_DISASSOC;
signal->block = BLOCK_ASOC;
goto rx_indicate;
}
case ST_ASOC_REQ:
SsInquiry(addr2(rdu), &sas, &sau);
if (sau == STATION_STATE_NOT_AUTH){
goto class2_err;
}
else {
signal->id = SIG_ASSOC;
signal->block = BLOCK_ASOC;
goto rx_indicate;
}
case ST_REASOC_REQ:
SsInquiry(addr2(rdu), &sas, &sau);
if (sau == STATION_STATE_NOT_AUTH){
goto class2_err;
}
else {
signal->id = SIG_REASSOC;
signal->block = BLOCK_ASOC;
goto rx_indicate;
}
case ST_BEACON:
case ST_PROBE_RSP:
if (mBssType == AP_BSS)
goto rx_release;
signal->id = SIQ_PROBE_RSP_BEACON;
signal->block = BLOCK_SYNCH;
goto rx_indicate;
case ST_ASOC_RSP:
if (mBssType == AP_BSS)
goto rx_release;
signal->id = SIG_ASSOC_RSP;
signal->block = BLOCK_ASOC;
goto rx_indicate;
case ST_REASOC_RSP:
if (mBssType == AP_BSS)
goto rx_release;
signal->id = SIG_REASSOC_RSP;
signal->block = BLOCK_ASOC;
goto rx_indicate;
default:
goto rx_release;
}
rx_release:
ZDEBUG("goto rx_release");
return FALSE;
rx_indicate:
signal->frmInfo.frmDesc = pfrmDesc;
sigEnque(pMgtQ, (signal));
return TRUE;
class2_err:
ZDEBUG("goto class2_err");
signal->id = SIG_DEAUTH_REQ;
signal->block = BLOCK_AUTH_REQ;
memcpy((U8 *)&signal->frmInfo.Sta, (U8 *)(addr2(rdu)), 6);
signal->frmInfo.rCode = RC_CLASS2_ERROR;
freeFdesc(pfrmDesc);
sigEnque(pMgtQ, (signal));
return TRUE;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -