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

📄 zdsynch.c

📁 该代码为linux下通过usb驱动实现的无线网络驱动程序,在2.6.18的内核下调试通过
💻 C
字号:
#ifndef __ZDSYNCH_C__
#define __ZDSYNCH_C__

#include "zd80211.h"
extern u8 LastMacMode;
extern u8 mMacMode;
//extern CurrScanCH;
extern const U16 dot11A_Channel[];
extern u8 LastSetChannel;

void zd_makeRateInfoMAP(U8 *pRates, U16 *basicRateMap, U16 *supRateMap)
{
	int j;
	U8 rate;
	U8 eleLen = *(pRates+1);

	for (j=0; j<eleLen; j++){
		rate =  *(pRates+2+j);
		switch (rate & 0x7f){
			case SR_1M:
				*supRateMap |= BIT_0;
				if (rate & 0x80)
					*basicRateMap |= BIT_0;
				break;
                
			case SR_2M:
				*supRateMap |= BIT_1;
				if (rate & 0x80)
					*basicRateMap |= BIT_1;
				break;
                
			case SR_5_5M:
				*supRateMap |= BIT_2;
				if (rate & 0x80)
					*basicRateMap |= BIT_2;
				break;
                
			case SR_11M:
				*supRateMap |= BIT_3;
				if (rate & 0x80)
					*basicRateMap |= BIT_3;
				break;

			case SR_6M:
				*supRateMap |= BIT_4;
				if (rate & 0x80)
					*basicRateMap |= BIT_4;
				break;

			case SR_9M:
				*supRateMap |= BIT_5;
				if (rate & 0x80)
					*basicRateMap |= BIT_5;
				break;

			case SR_12M:
				*supRateMap |= BIT_6;
				if (rate & 0x80)
					*basicRateMap |= BIT_6;
				break;

			case SR_18M:
				*supRateMap |= BIT_7;
				if (rate & 0x80)
					*basicRateMap |= BIT_7;
				break;

			case SR_24M:
				*supRateMap |= BIT_8;
				if (rate & 0x80)
					*basicRateMap |= BIT_8;
				break;

			case SR_36M:
				*supRateMap |= BIT_9;
				if (rate & 0x80)
					*basicRateMap |= BIT_9;
				break;

			case SR_48M:
				*supRateMap |= BIT_10;
				if (rate & 0x80)
					*basicRateMap |= BIT_10;
				break;

			case SR_54M:
				*supRateMap |= BIT_11;
				if (rate & 0x80)
					*basicRateMap |= BIT_11;
				break;

#if 0
			case SR_16_5M:
				*supRateMap |= BIT_12;
				if (rate & 0x80)
					*basicRateMap |= BIT_12;
				break;

			case SR_27_5M:
				*supRateMap |= BIT_13;
				if (rate & 0x80)
					*basicRateMap |= BIT_13;
				break;
#endif
			default:

				break;                                                                              
		}
	}
}

BOOLEAN Probe(Signal_t *signal)
{
	FrmDesc_t *pfrmDesc;
	Frame_t *rdu;
	MacAddr_t sta;
	Element rSsid;
	Element *pWPA = NULL;
	U8 vapId = 0;
	Element *pExtRate = NULL;

	ZDEBUG("Probe");
	
	pfrmDesc = signal->frmInfo.frmDesc;
	rdu = pfrmDesc->mpdu;
	
	if (mBssType == INFRASTRUCTURE_BSS){
		goto release;
	}		
	
	if (!getElem(rdu, EID_SSID, &rSsid,1))
		goto release;
	
	if (mHiddenSSID){ //discard broadcast ssid
		if (eLen(&rSsid) == 0){
			goto release;
		}
	}	

	memcpy((U8*)&sta, (U8*)addr2(rdu), 6);
	pExtRate = &mExtRates;

	if (eLen(&rSsid) == 0){
		//WPA
		if (mDynKeyMode == DYN_KEY_TKIP || mDynKeyMode==DYN_KEY_AES)	
			pWPA = &mWPAIe;

		mkProbeRspFrm(pfrmDesc, &sta, mBeaconPeriod, mCap, &dot11DesiredSsid, &mBrates, &mPhpm, pExtRate, (Element *)pWPA, vapId);		
		return sendMgtFrame(signal, pfrmDesc);	
	}
	else{
	 	if (memcmp(&rSsid, &dot11DesiredSsid, eLen(&dot11DesiredSsid)+2) == 0){
			//WPA
		    if ((mDynKeyMode == DYN_KEY_TKIP) || (mDynKeyMode == DYN_KEY_AES))	
				pWPA = &mWPAIe;
			
			mkProbeRspFrm(pfrmDesc, &sta, mBeaconPeriod, mCap, &dot11DesiredSsid, &mBrates, &mPhpm, pExtRate, (Element *)pWPA, vapId);		
			return sendMgtFrame(signal, pfrmDesc);
		}	
	}
	
release:
   	ZDEBUG("goto release");
	freeFdesc(pfrmDesc);
	return TRUE;
}

BOOLEAN ProbeReq(Signal_t *signal)
{
	FrmDesc_t *pfrmDesc;
	Element	BCSsid;
	U8 vapId = 0;
	Element *pSsid = NULL;
	Element *pExtRate = NULL;
	
	ZDEBUG("ProbeReq");
	//FPRINT("ProbeReq");
	
	pfrmDesc = allocFdesc();
	if(!pfrmDesc){
		sigEnque(pMgtQ, (signal));
		return FALSE;
	}
	
	BCSsid.buf[0] = EID_SSID;
	BCSsid.buf[1] = 0;
	
	if (mProbeWithSsid){
		//pSsid = &mSsid;
		pSsid = &dot11DesiredSsid;
	} else {	
		pSsid = &BCSsid;
	}
    
	pExtRate = &mExtRates;

	mkProbeReqFrm(pfrmDesc, &dot11BCAddress, pSsid, &mBrates, pExtRate, NULL, vapId);	
	if (signal->vapId == 0)
	    pdot11Obj->StartTimer(SCAN_TIMEOUT, DO_SCAN);	
	//mProbeWithSsid = FALSE;
	return sendMgtFrame(signal, pfrmDesc);
}	

BOOLEAN ProbeRsp_Beacon(Signal_t *signal)
{
	FrmDesc_t *pfrmDesc;
	Frame_t *rdu;
	MacAddr_t *pBssid = NULL;
	//Element *pWPA = NULL;
	U16 Cap = 0;
	U16 BcnInterval = 0;
	int i;
	U8 FrmType;
	BOOLEAN bUpdateInfo = FALSE;
	U8 index;
    U8 elemIdx=1;
#if ZDCONF_LP_SUPPORT == 1
    Element tmpElement ;
#endif
#if ZDCONF_SES_SUPPORT == 1
    U8 SES_OUI[] = { 0x00, 0x90, 0x4C };
#endif
    u8 WPA_OUI[4]={0x00, 0x50, 0xF2, 0x01};
    U16 loopCheck = 0;
    U8  *pAddr2ForIBSS;



	BssInfo_t *pCurrBssInfo;

	ZDEBUG("ProbeRsp_Beacon");
	pfrmDesc = signal->frmInfo.frmDesc;
	rdu = pfrmDesc->mpdu;
	
	FrmType = frmType(rdu);
	
	if (pdot11Obj->ConfigFlag & ACTIVE_CHANNEL_SCAN_SET){
		Cap = cap1(rdu);
		//FPRINT_V("Cap", Cap);
		BcnInterval = beaconInt(rdu);

        pAddr2ForIBSS =  (u8*) addr2(rdu);
		if (Cap & CAP_IBSS){
			pBssid = addr3(rdu);
		}
		else
			pBssid = addr3(rdu);

		index = mBssNum;
		//The following if-statements is used to filter existing AP Info.
		//The rule is:
		//1. The bssid is seen before. 
		//2. The old Info.apMode equals to LastMacMode
		//The meaning is if the incoming ap's bssid == old's bssid and
		// ap's apMode(judged by LastMacMode) == old's apMode then Drop It.
		for (i=0; i<mBssNum; i++){
			if ((memcmp((U8 *)&mBssInfo[i].bssid, (U8 *)pBssid, 6) == 0) &&
				((PURE_A_AP==mBssInfo[i].apMode&& PURE_A_MODE==LastMacMode) ||
                 (PURE_A_AP!=mBssInfo[i].apMode&& PURE_A_MODE!=LastMacMode) 
				)
			   ) {
				if (FrmType == ST_BEACON) {
					goto release;
				}
				else {
					bUpdateInfo = TRUE;
					index = i;
				}
			}
		}

		pCurrBssInfo =  &mBssInfo[index];
		pCurrBssInfo->basicRateMap = 0;
		pCurrBssInfo->supRateMap = 0;

		/* Reset supRates, extRates */
		memset(&pCurrBssInfo->supRates, 0, NUM_SUPPORTED_RATE);
		memset(&pCurrBssInfo->extRates, 0, NUM_SUPPORTED_RATE);
#if ZDCONF_LP_SUPPORT == 1
        memset(&pCurrBssInfo->zdIE_BURST,0, sizeof(Element));
        memset(&pCurrBssInfo->zdIE_AMSDU,0, sizeof(Element));
        memset(&tmpElement,0, sizeof(Element));
#endif    
#if ZDCONF_SES_SUPPORT == 1
        memset(&pCurrBssInfo->SES_Element,0, sizeof(Element));
        pCurrBssInfo->SES_Element_Valid = FALSE;
#endif
        
		//get bssid
		memcpy((U8 *)&pCurrBssInfo->bssid, (U8 *)pBssid, 6);
	
		//get beacon interval
		pCurrBssInfo->bcnInterval = BcnInterval;
	
		//get capability	
		pCurrBssInfo->cap = Cap;
	
		if (!getElem(rdu, EID_SSID, &pCurrBssInfo->ssid,1)){
 			goto release;
		}    
	
		if (!getElem(rdu, EID_SUPRATES, &pCurrBssInfo->supRates,1)){
			goto release;	
		}	
	
		if (!getElem(rdu, EID_DSPARMS, &pCurrBssInfo->Phpm,1)){
			pCurrBssInfo->Phpm.buf[0]=0x3;// DS Parameter Set
			pCurrBssInfo->Phpm.buf[1]=1;
            if (!(Cap & CAP_IBSS)) // In IBSS use the ch carried in Beacon/Rsp
                pCurrBssInfo->Phpm.buf[2]=LastSetChannel;
			//goto release;	
		}		
#if ZDCONF_LP_SUPPORT == 1
        elemIdx = 1;
        while(getElem(rdu, EID_ZYDAS, &tmpElement,elemIdx))
        {
            //If elemIdx++ doesn't execute, there would be endless loop.
            if(loopCheck++ > 100)
            {
                printk("infinite loop occurs in %s\n", __FUNCTION__);
                loopCheck = 0;
                break;
            }

            elemIdx++;
            if(tmpElement.buf[2] == (U8)ZDOUI_AMSDU &&
               tmpElement.buf[3] == (U8)(ZDOUI_AMSDU >> 8) &&
               tmpElement.buf[4] == (U8)(ZDOUI_AMSDU >> 16) )
            {
                memcpy(&pCurrBssInfo->zdIE_AMSDU, &tmpElement, sizeof(Element));
            }
            else if(tmpElement.buf[2] == (U8)ZDOUI_BURST &&
               tmpElement.buf[3] == (U8)(ZDOUI_BURST >> 8) &&
               tmpElement.buf[4] == (U8)(ZDOUI_BURST >> 16) )
            {
                memcpy(&pCurrBssInfo->zdIE_BURST, &tmpElement, sizeof(Element));
            }
        }
#endif
#if ZDCONF_SES_SUPPORT
        elemIdx=1;
        while(getElem(rdu, EID_WPA, &(pCurrBssInfo->SES_Element), elemIdx))
        {
            //if elemIdx++ doesn't execute, endless loop occur
            if(loopCheck++ > 100)
            {
                printk("infinite loop occurs in %s\n", __FUNCTION__);
                loopCheck = 0;
                break;
            }

            if(pCurrBssInfo->SES_Element.buf[1] >= 3)
            {
                if(memcmp(pCurrBssInfo->SES_Element.buf+2, SES_OUI, sizeof(SES_OUI)) == 0)
                {
                    pCurrBssInfo->SES_Element_Valid = TRUE;
                    break;
                }
            }
            elemIdx++;
        }
#endif

		//This is used to filter non-allowed channel beacons
		if (!((1 << (pCurrBssInfo->Phpm.buf[2]-1)) & pdot11Obj->AllowedChannel)){
			if(PURE_A_MODE != mMacMode)
				goto release;
		}
	
		if (Cap & CAP_IBSS){
			if (!getElem(rdu, EID_IBPARMS, &pCurrBssInfo->IbssParms,1)){
				goto release;	
			}
		}
		
		if (getElem(rdu, EID_EXT_RATES, &pCurrBssInfo->extRates,1)){
			//zd1205_dump_data("Ext Rates", &pCurrBssInfo->extRates.buf[2], pCurrBssInfo->extRates.buf[1]);
		}
           
		if (getElem(rdu, EID_ERP, &pCurrBssInfo->erp,1)){
			//zd1205_dump_data("ERP Info", &pCurrBssInfo->erp.buf[2], pCurrBssInfo->erp.buf[1]);
		}
		getElem(rdu, EID_COUNTRY, &pCurrBssInfo->country,1);

		zd_makeRateInfoMAP((U8 *)&pCurrBssInfo->supRates, &pCurrBssInfo->basicRateMap, &pCurrBssInfo->supRateMap);
		zd_makeRateInfoMAP((U8 *)&pCurrBssInfo->extRates, &pCurrBssInfo->basicRateMap, &pCurrBssInfo->supRateMap);
		//FPRINT_V("basicRateMap", pCurrBssInfo->basicRateMap);
		//FPRINT_V("supRateMap", pCurrBssInfo->supRateMap);

		if (LastMacMode != PURE_A_MODE && pCurrBssInfo->supRateMap > 0x0f){  //support rates include OFDM rates
			if (pCurrBssInfo->basicRateMap & ~0xf){ // basic rates include OFDM rates
				pCurrBssInfo->apMode = PURE_G_AP;
				//FPRINT("PURE_G_AP");
			}
			else {
				pCurrBssInfo->apMode = MIXED_AP;
				//FPRINT("MIXED_AP");
			}   
		}
		else if(LastMacMode == PURE_A_MODE) {
			pCurrBssInfo->apMode = PURE_A_AP;	
		}
		else {
			pCurrBssInfo->apMode = PURE_B_AP;
			//FPRINT("PURE_B_AP");
		}

		/* Get WPA IE Information */
		//getElem(rdu, EID_WPA, (Element *)&pCurrBssInfo->WPAIe);
		
	    memset(&pCurrBssInfo->WPAIe,0x00, sizeof(pCurrBssInfo->WPAIe));
        elemIdx=1;
	    while(getElem(rdu, EID_WPA, (Element*)&pCurrBssInfo->WPAIe,elemIdx))
        {
            //if elemIdx++ doesn't execute, endless loop occur
            if(loopCheck++ > 100)
            {
                printk("infinite loop occurs in %s\n", __FUNCTION__);
                loopCheck = 0;
                break;
            }

            if((memcmp(pCurrBssInfo->WPAIe+2,WPA_OUI, sizeof(WPA_OUI)) != 0) ||
               (pCurrBssInfo->WPAIe[1] < 20) )
            {
                memset(&pCurrBssInfo->WPAIe,0x00, sizeof(pCurrBssInfo->WPAIe)); 
            }
            else
                break;

            elemIdx++;
        }

        memset(&pCurrBssInfo->RSNIe,0x00, sizeof(pCurrBssInfo->RSNIe));
	    getElem(rdu, EID_RSN, (Element*)&pCurrBssInfo->RSNIe,1);


		#if 0
		/* Dump WPA IE */
		if(pCurrBssInfo->WPAIe[1] != 0) {
			int ii;
			u8 SSID[34];
			
			memcpy(SSID, (u8 *)(&pCurrBssInfo->ssid.buf[2]), pCurrBssInfo->ssid.buf[1]);
			SSID[pCurrBssInfo->ssid.buf[1]] = '\0';
			
			printk(KERN_ERR "WPA IE found in site survey, SSID: %s\n", SSID);

			for(ii = 0; ii < pCurrBssInfo->WPAIe[1]+2; ) {
				printk(KERN_ERR "0x%02x ", pCurrBssInfo->WPAIe[ii]);
				ii++;
			}

			printk(KERN_ERR "\n");
		}
		#endif
		
		pCurrBssInfo->signalStrength = pfrmDesc->signalStrength;
		pCurrBssInfo->signalQuality = pfrmDesc->signalQuality;
		
		if (mBssNum < 63){
			if (!bUpdateInfo)
				mBssNum++;
		}
	}
	
release:
   	ZDEBUG("goto release");
	freeFdesc(pfrmDesc);
	return TRUE;	
}	


BOOLEAN SynchEntry(Signal_t *signal)
{
	FrmDesc_t *pfrmDesc;
	
	switch(signal->id){
		case SIG_PROBE:
			return Probe(signal);
			
		case SIG_PROBE_REQ:
			return ProbeReq(signal);
			
		case SIQ_PROBE_RSP_BEACON:
			return ProbeRsp_Beacon(signal);		
			
		default:
			goto sync_discard; 		
	}
		
sync_discard:
	pfrmDesc = signal->frmInfo.frmDesc;	
	freeFdesc(pfrmDesc);
	return TRUE;	
}
#endif

⌨️ 快捷键说明

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