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

📄 zdmmrx.c

📁 该代码为linux下通过usb驱动实现的无线网络驱动程序,在2.6.18的内核下调试通过
💻 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 + -