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

📄 zdhci.c

📁 该代码为linux下通过usb驱动实现的无线网络驱动程序,在2.6.18的内核下调试通过
💻 C
📖 第 1 页 / 共 5 页
字号:
	memcpy(&signal->frmInfo.Sta, sta, 6);
	signal->frmInfo.rCode = (ReasonCode)rCode;
	sigEnque(pMgtQ, (signal));
	
	return TRUE;
}	

BOOLEAN zd_PassiveScan(void)
{
	void *reg = pdot11Obj->reg;
	
	//FPRINT("zd_PassiveScan");
	
	if (pdot11Obj->ConfigFlag & PASSIVE_CHANNEL_SCAN_SET)
		return FALSE;
		
	pdot11Obj->ConfigFlag |= PASSIVE_CHANNEL_SCAN_SET;
	pdot11Obj->SetReg(reg, ZD_Rx_Filter, 0x100); //only accept beacon frame 
	if(mMacMode != PURE_A_MODE) {
//		printk("HW_SetRfChannel:%s(%d)\n",__FILE__,__LINE__);
		HW_SetRfChannel(pdot11Obj, CurrScanCH, 1,mMacMode);
	}
	else {
//		printk("HW_SetRfChannel:%s(%d)\n",__FILE__,__LINE__);
		HW_SetRfChannel(pdot11Obj,dot11A_Channel[CurrScanCH-1],1 ,mMacMode); 
	}

	pdot11Obj->StartTimer(SCAN_TIMEOUT, DO_SCAN);
	
	return TRUE;
}	

BOOLEAN zd_DisasocAll(U8 rCode)
{
	int i;
	MacAddr_t *sta;
	if (mBssType == AP_BSS){
		for (i=1; i<(MAX_AID+1); i++){
			if (sstByAid[i]->asoc == STATION_STATE_ASOC){
				sta = (MacAddr_t *)&sstByAid[i]->mac[0];
				zd_CmdDisasoc(sta, rCode);
			}
		}
		
		FlushQ(pTxQ);
	}
	else if (mBssType == INFRASTRUCTURE_BSS){
		if (mAssoc)
			zd_CmdDisasoc(&mBssId, rCode);
	}
	return TRUE;

}

BOOLEAN zd_ChooseAP(BOOLEAN bUseBssid)
{
    U8 i;
    U16 cap;
    U16 quality = 10000;
	BOOLEAN found = FALSE;

    mBssIndex = 0xff;
    for (i=0; i<mBssCnt; i++)
    {
		if (bUseBssid)
		{
			if (memcmp(&dot11DesiredBssid, &mBssInfo[i].bssid.mac[0], ETH_ALEN) == 0 && memcmp(&dot11DesiredBssid, zeroMacAddress, ETH_ALEN)!=0) 
			{
				//ZD1211DEBUG(0, "zd_ChooseAP: Bssid" MACSTR "matched to index:%d\n",MAC2STR(dot11DesiredBssid), i);
				mBssIndex = i;
				break;
			}
		}		

    	cap = mBssInfo[i].cap;
        if ((memcmp(&dot11DesiredSsid, &mBssInfo[i].ssid, dot11DesiredSsid.buf[1]+2) == 0) 
        	|| (!mProbeWithSsid) ) {
                            
			if(1) 
				;
			else if ((mMacMode == PURE_B_MODE) && (mBssInfo[i].apMode == PURE_G_AP))
				continue;
            else if ((mMacMode == PURE_B_MODE) && (mBssInfo[i].apMode == PURE_A_AP))
				continue; 
			else if ((mMacMode == PURE_G_MODE) && (mBssInfo[i].apMode == PURE_B_AP))
				continue;
			else if ((mMacMode == PURE_G_MODE) && (mBssInfo[i].apMode == PURE_A_AP))
				continue;
			
			else if ((mMacMode == PURE_A_MODE) && (mBssInfo[i].apMode != PURE_A_AP))
				continue;

			else if ((mMacMode == MIXED_MODE) && (mBssInfo[i].apMode == PURE_A_AP))
				continue;

            //check capability ...
            if (cap & CAP_PRIVACY){
			    if (!mPrivacyInvoked)
				    continue;
    		}
		    else {
			    if (mPrivacyInvoked)
				    continue;
			}
            if (!pdot11Obj->IsUSB2_0){ //host is usb 1.1
                if (mBssInfo[i].apMode == PURE_G_AP)
                    continue;
            }    
			
			if (cap & CAP_ESS){
				if (mBssInfo[i].signalQuality < quality ){
                    quality = mBssInfo[i].signalQuality;
					mBssIndex = i;
                    //FPRINT_V("cap", cap);
				}
			}
				
            //break; 
        }
    }
    if (mBssIndex< mBssCnt){
	found = TRUE;
        //FPRINT_V("Desired AP Found, Bss Index", mBssIndex);
        if (pdot11Obj->ConfigFlag & SCAN_AND_CONNECT_SET){
	    //printk("zd_ChooseAP: set mRequestFlag.BSS_CONNECT_SET\n");
            mRequestFlag |= BSS_CONNECT_SET;
            pdot11Obj->ConfigFlag &= ~SCAN_AND_CONNECT_SET;
        }    
    }
    else{
        //printk(" \n");
        //printk(KERN_ERR "****** Can't find desiredSSID:");
        //for (i=0; i<dot11DesiredSsid.buf[1]; i++) {
		//	printk("%c", dot11DesiredSsid.buf[2+i]);
		//}
        //printk(" \n");
    }     
//	int j;
//	if(0xff != mBssIndex) {
//		for(j=0;j<mBssInfo[mBssIndex].ssid.buf[1];j++)
//			printk("%c",mBssInfo[mBssIndex].ssid.buf[2+j]);
//		printk("  ChooseAP(Mac=%d,Ch:%d)\n",mBssInfo[mBssIndex].apMode,mBssInfo[mBssIndex].Phpm.buf[2]);
//	}

    return found;              
}
BOOLEAN zd_InfraConnect(U8 index)
{
	Signal_t *signal;
	struct zd1205_private *macp = (struct zd1205_private *)g_dev->priv;

	MacAddr_t *pBssid;
	Element *pSsid = NULL;
	U32 tmpvalue;
	BOOLEAN	bChooseAPResult;
	void *reg = pdot11Obj->reg;
	//FPRINT("zd_InfraConnect");
	if (mBssNum == 0)
		return FALSE;
		
	if ((signal = allocSignal()) == NULL)
		return FALSE;
	if(mCounterMeasureState) {
		mRequestFlag &= ~BSS_CONNECT_SET;
        freeSignal(signal);
		return FALSE;
	}
	// look up global scan result table according to desired ssid,
	// because mBssInfo order may be different from macp->BSSInfo[].
	/*if (mBssCnt)
	{
	    U8	ssidLength;
	    for(i=0; i<mBssCnt; i++)
	    {
	        ssidLength=dot11DesiredSsid.buf[1]+2;
		if (mBssInfo[i].cap & CAP_ESS)
		{
		    if (memcmp((U8*)&dot11DesiredSsid,(U8*)&mBssInfo[i].ssid,ssidLength)==0)
		    {
			break;
		    }
		}
	    }		
	} */
	// Use zd_ChooseAP instead of above code
	bChooseAPResult=zd_ChooseAP(0);
	if (!bChooseAPResult || 1)
	{// dot11DesiredSsid can't be found in table mBssInfo[]
	    if ((index+1) <= mBssCnt)
	    {
		//printk(KERN_ERR "Desired SSID can't be found in current table\n");
	    	mBssIndex=index; // Can't found in the latest scan result table, use the old index.
	    }
	    else
	    {
            freeSignal(signal);
	    	return FALSE; // The index exceed mBssInfo[].
	    }
	}
	else
	{
	    //printk(KERN_ERR "Desired SSID found in location %d\n",mBssIndex);
	}
	//Disable IBSS mode
    if(pdot11Obj->bDeviceInSleep)
    {
        printk("In SLLLLLLLLLLLLLLLLLLP @ %s\n", __FUNCTION__);
        return FALSE;
    }
	tmpvalue = pdot11Obj->GetReg(reg, ZD_BCNInterval);
	tmpvalue &= ~BIT_25;
	pdot11Obj->SetReg(reg, ZD_BCNInterval, tmpvalue);
	mCap |= BIT_0;
	mCap &= ~BIT_1;	
	
	// For IBSS Connect
	if (mBssInfo[index].cap & CAP_IBSS)
	{
		
	}
	//mBssIndex = index;
	//update beacon interval
	HW_UpdateBcnInterval(pdot11Obj, mBssInfo[mBssIndex].bcnInterval);
	
	pSsid = &mBssInfo[mBssIndex].ssid;
	memcpy((U8 *)&mSsid, (U8 *)pSsid, pSsid->buf[1]+2); 	
	pBssid = &mBssInfo[mBssIndex].bssid;	
	memcpy((U8 *)&mBssId, (U8 *)pBssid, 6);
    
	//update Bssid
	pdot11Obj->SetReg(reg, ZD_BSSID_P1, zd_cpu_to_le32(*(U32 *)&mBssId.mac[0]));
	pdot11Obj->SetReg(reg, ZD_BSSID_P2, zd_cpu_to_le32(*(U32 *)&mBssId.mac[4]));
	// Update channel number contained in the DS Parameter Set element of the received probe response or beacon frame. 
	mRfChannel = mBssInfo[mBssIndex].Phpm.buf[2];

	if(PURE_A_AP == mBssInfo[mBssIndex].apMode) {
		ChangeMacMode(PURE_A_MODE,mRfChannel);
		zd_UpdateCardSetting(&(macp->cardSetting));
		pdot11Obj->DelayUs(1000);
		HW_SetRfChannel(pdot11Obj, mRfChannel, 1, PURE_A_MODE);
		
	}
	else {
		if(PURE_A_MODE == mMacMode)
			mMacMode = MIXED_MODE;
		ChangeMacMode(mMacMode,mRfChannel);
		zd_UpdateCardSetting(&(macp->cardSetting));
		pdot11Obj->DelayUs(1000);
		HW_SetRfChannel(pdot11Obj, mRfChannel, 1, MIXED_MODE);
	}

	signal->id = SIG_AUTH_REQ;
	signal->block = BLOCK_AUTH_REQ;
	memcpy(&signal->frmInfo.Sta, (U8 *)&mBssId, 6);
	sigEnque(pMgtQ, (signal));
	
	if (mRequestFlag & CONNECT_TOUT_SET)
		mRequestFlag &= ~CONNECT_TOUT_SET;
	if (mRequestFlag & BSS_CONNECT_SET)
		mRequestFlag &= ~BSS_CONNECT_SET;    
		
	return TRUE;
}

BOOLEAN zd_IbssConnect(void)
{
        struct zd1205_private *macp=g_dev->priv;
	int i,j;
	U8 Length;
	BOOLEAN bBSSFound = FALSE;	
	MacAddr_t *pBssid;
	BssInfo_t *pBssInfo;
	void *reg = pdot11Obj->reg;
	U32 tmpvalue;
	//FPRINT("zd_IbssConnect");
#if defined(OFDM) 
	pdot11Obj->SetReg(reg, ZD_CWmin_CWmax, CW_NORMAL_SLOT);
	// not to use short slot time
	mCap &= ~BIT_10;
	pdot11Obj->ConfigFlag &= ~SHORT_SLOT_TIME_SET;

	if (mMacMode == PURE_G_MODE){
		// not use protection mechanism
		pdot11Obj->ConfigFlag &= ~ENABLE_PROTECTION_SET;
	}
	else if(mMacMode != PURE_A_MODE) {
		// force use protection mechanism
		pdot11Obj->ConfigFlag |= ENABLE_PROTECTION_SET;
	}

#endif

	
	// Recover the EIFS to 0x200.
	// We need not use SleepResetDevice. In IBSS mode, we can easily
	// get others traffic. (not less of Rx-Frame)
 	pdot11Obj->SetReg(reg, ZD_IFS_Value, 0x5200032);
	if (mATIMWindow != 0){
		// Do not set macp->PwrState = PSM, otherwise
		// throughput with Cirrus card (in PS mode) will down.
		//macp->PwrState = PSM;
		// PwrMgt = 1
        if(pdot11Obj->bDeviceInSleep)
        {
            printk("In SLLLLLLLLLLLLLLLLLLP @ %s\n", __FUNCTION__);
            return FALSE;
        }

		tmpvalue = pdot11Obj->GetReg(reg, ZD_BCNInterval);
		tmpvalue |= BIT_26;
		pdot11Obj->SetReg(reg, ZD_BCNInterval, tmpvalue);
	}
	else{
		//macp->PwrState = CAM;
		// PwrMgt = 0;
        if(pdot11Obj->bDeviceInSleep)
        {
            printk("In SLLLLLLLLLLLLLLLLLLP @ %s\n", __FUNCTION__);
            return FALSE;
        }

		tmpvalue = pdot11Obj->GetReg(reg, ZD_BCNInterval);
		tmpvalue &= ~BIT_26;
		pdot11Obj->SetReg(reg, ZD_BCNInterval, tmpvalue);
	}
						
						
	mCap &= ~BIT_0;
	mCap |= BIT_1;	

    mTimeBeforeAdhocRoaming = (jiffies + dot11MacAddress.mac[0] + 3) & 0x1F;
	if (mBssCnt ){	// IBSS found
		for (i=0; i<mBssCnt; i++){
			Length = dot11DesiredSsid.buf[1]+2;
			if (mBssInfo[i].cap & CAP_IBSS){
				if (memcmp((U8 *)&dot11DesiredSsid, (U8 *)&mBssInfo[i].ssid, Length) == 0){
					break;
				}	
			}	
		}	
		if (i < mBssCnt){
			bBSSFound = TRUE;
			mBssIndex = i;

		pBssInfo = &mBssInfo[mBssIndex];
		mBssId.mac[0] = pBssInfo->bssid.mac[0];
		mBssId.mac[1] = pBssInfo->bssid.mac[1];
		mBssId.mac[2] = pBssInfo->bssid.mac[2];
		mBssId.mac[3] = pBssInfo->bssid.mac[3];
		mBssId.mac[4] = pBssInfo->bssid.mac[4];
		mBssId.mac[5] = pBssInfo->bssid.mac[5];
		//zd1205_dump_data("mBssId = ", (U8 *)&mBssId, 6);
		//update Bssid	
		pdot11Obj->SetReg(reg, ZD_BSSID_P1, zd_cpu_to_le32(*(U32 *)&mBssId.mac[0]));
		pdot11Obj->SetReg(reg, ZD_BSSID_P2, zd_cpu_to_le32(*(U32 *)&mBssId.mac[4]));

        if(pBssInfo->apMode == PURE_A_AP)
            ChangeMacMode(PURE_A_MODE, pBssInfo->Phpm.buf[2]);
        else 
            ChangeMacMode(MIXED_MODE, pBssInfo->Phpm.buf[2]);

        zd1205_SetRatesInfo(macp);
        mMacMode = macp->cardSetting.MacMode;
        mRfChannel = macp->cardSetting.Channel;
        mPhpm.buf[0] = EID_DSPARMS;
        mPhpm.buf[1] = 1;
        mPhpm.buf[2] = mRfChannel;

        printk("Ibss Join, MAC_MODE:%d, CHANNEL:%d\n", mMacMode,mRfChannel);
		HW_SetRfChannel(pdot11Obj, mRfChannel, 1, mMacMode);
		//FPRINT_V("mRfChannel", mRfChannel);
		
		//update beacon interval
        mBeaconPeriod = pBssInfo->bcnInterval; //MZCai
		HW_UpdateBcnInterval(pdot11Obj, mBeaconPeriod);
		//FPRINT_V("mBeaconPeriod", mBeaconPeriod);
		
		//update supported rated
        memcpy((U8 *)&mBrates, (U8 *)&pBssInfo->supRates, pBssInfo->supRates.buf[1]+2); //MZCAI
        HW_SetSupportedRate(pdot11Obj, (U8 *)&mBrates);
		//zd1205_dump_data("mBrates = ", (U8 *)&mBrates, mBrates.buf[1]+2);
#if defined(OFDM)		
		if(mMacMode != PURE_A_MODE && mMacMode != PURE_B_MODE) //MZCai
        {
            if(pBssInfo->extRates.buf[0] == EID_EXT_RATES)
            {
                //if(pdot11Obj->IsUSB2_0) //MZCAI
                memcpy((U8 *)&mExtRates, (U8 *)&pBssInfo->extRates, pBssInfo->extRates.buf[1]+2); //MZCai
                HW_SetSupportedRate(pdot11Obj, (U8 *)&mExtRates);
            }
        }

			//zd1205_dump_data("mExtRates = ", (U8 *)&mExtRates, mExtRates.buf[1]+2);
#endif
		//update ATIM Window
        mATIMWindow = pBssInfo->IbssParms.buf[2]+(((U16)pBssInfo->IbssParms.buf[3]) << 8); //MZCai
        memcpy((U8 *)&mIbssParms, (U8 *)&pBssInfo->IbssParms, pBssInfo->IbssParms.buf[1]+2); //MZCai
		HW_UpdateATIMWindow(pdot11Obj, mATIMWindow);
		//FPRINT_V("mATIMWindow", mATIMWindow);
		
		ConfigBcnFIFO();
		HW_EnableBeacon(pdot11Obj, mBeaconPeriod, 0, INDEPENDENT_BSS);
		HW_RadioOnOff(pdot11Obj, mRadioOn);
		mRequestFlag &= ~IBSS_CONNECT_SET;
		mAssoc = TRUE;
		memcpy(&pdot11Obj->CurrSsid[0], (U8 *)&mSsid, mSsid.buf[1]+2); 
		pdot11Obj->StatusNotify(STA_ASSOCIATED, (U8 *)&mBssId);
        return TRUE;
        }
	}
	else {
		//if (!(pdot11Obj->ConfigFlag & IBSS_CHANNEL_SCAN_SET)){ 
		//	pdot11Obj->ConfigFlag |= IBSS_CHANNEL_SCAN_SET;
		//	zd_CmdProbeReq(1);
		//}	
		//return FALSE;
        printk("We found no IBSS, and we ignore the above code");
        printk("without confirm\n");
	}	
	
	if (!bBSSFound){
		//FPRINT("IBSS not found, create it !!!");
		/****************************************************/
		/* We generate an IBSS								*/
		/****************************************************/
        if(pdot11Obj->bDeviceInSleep)
        {
            printk("In SLLLLLLLLLLLLLLLLLLP @ %s\n", __FUNCTION__);
            return FALSE;
        }
		U32 seed = pdot11Obj->GetReg(reg, ZD_TSF_LowPart);
		mBssIndex = 0xff;
		//generate random BSSID
		mBssId.mac[0] = (U8)((pdot11Obj->Rand(seed) & ~0x3) | 0x2); // I/G = 0, U/L = 1
		mBssId.mac[1] = (U8)pdot11Obj->Rand(seed);
		mBssId.mac[2] = (U8)pdot11Obj->Rand(seed);
		mBssId.mac[3] = (U8)pdot11Obj->Rand(seed);
		mBssId.mac[4] = (U8)pdot11Obj->Rand(seed);
		mBssId.mac[5] = (U8)pdot11Obj->Rand(seed);
		//zd1205_dump_data("mBssId = ", (U8 *)&mBssId, 6);
		//update Bssid	
		pdot11Obj->SetReg(reg, ZD_BSSID_P1, zd_cpu_to_le32(*(U32 *)&mBssId.mac[0]));
		pdot11Obj->SetReg(reg, ZD_BSSID_P2, zd_cpu_to_le32(*(U32 *)&mBssId.mac[4]));
        ChangeMacMode(macp->IBSS_DesiredMacMode, macp->IBSS_DesiredChannel);

        mMacMode = macp->cardSetting.MacMode;
        mRfChannel = macp->cardSetting.Channel;
        mPhpm.buf[0] = EID_DSPARMS;
        mPhpm.buf[1] = 1;
        mPhpm.buf[2] = mRfChannel;

        printk("Ibss Create, MAC_MODE:%d, CHANNEL:%d\n", mMacMode,mRfChannel);
		HW_SetRfChannel(pdot11Obj, mRfChannel, 1, mMacMode);
		//FPRINT_V("mRfChannel", mRfChannel);
		
		//update beacon interval
		HW_UpdateBcnInterval(pdot11Obj, mBeaconPeriod);
		//FPRINT_V("mBeaconPeriod", mBeaconPeriod);
		
		//update supported rated
		HW_SetSupportedRate(pdot11Obj, (U8 *)&mBrates);
		//zd1205_dump_data("mBrates = ", (U8 *)&mBrates, mBrates.buf[1]+2);
#if defined(OFDM)		
		if(mMacMode != PURE_A_MODE && mMacMode != PURE_B_MODE)
			if (pdot11Obj->IsUSB2_0)
				HW_SetSupportedRate(pdot11Obj, (U8 *)&mExtRates);

			//zd1205_dump_data("mExtRates = ", (U8 *)&mExtRates, mExtRates.buf[1]+2);
#endif
		//update ATIM Window
		HW_UpdateATIMWindow(pdot11Obj, mATIMWindow);
		//FPRINT_V("mATIMWindow", mATIMWindow);
		
		ConfigBcnFIFO();
		HW_EnableBeacon(pdot11Obj, mBeaconPeriod, 0, INDEPENDENT_BSS);
		HW_RadioOnOff(pdot11Obj, mRadioOn);
		mRequestFlag &= ~IBSS_CONNECT_SET;
		mAssoc = TRUE;
		memcpy(&pdot11Obj->CurrSsid[0], (U8 *)&mSsid, mSsid.buf[1]+2); 

⌨️ 快捷键说明

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