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

📄 zdpmfilter.c

📁 该代码为linux下通过usb驱动实现的无线网络驱动程序,在2.6.18的内核下调试通过
💻 C
📖 第 1 页 / 共 2 页
字号:
	if (pTxQ->cnt > 0){
 		signal = pTxQ->first;
 		if (!signal)
 			return FALSE;
	 			
 		pfrmInfo = &signal->frmInfo;
 		pfrmDesc = pfrmInfo->frmDesc;

        if (!pdot11Obj->CheckTCBAvail(pfrmInfo->fTot))
          	return FALSE;
            	
 		signal = sigDeque(pTxQ);
		goto send_PduReq;
	}
	
	return FALSE;


send_PduReq:
    TxSend(signal, pfrmDesc);
    return TRUE;
}



BOOLEAN CleanupAwakeQ(void)
{
	Signal_t *signal;
	FrmInfo_t *pfrmInfo;
	FrmDesc_t *pfrmDesc;

	//PSDEBUG("CleanupAwakeQ");
 	if (pAwakeQ->cnt > 0){
        signal = pAwakeQ->first;
        if (!signal)
			return FALSE;
	 			
        pfrmInfo = &signal->frmInfo;

        pfrmDesc = pfrmInfo->frmDesc;
        if (!pdot11Obj->CheckTCBAvail(pfrmInfo->fTot))
          	return FALSE;
            	
 		signal = sigDeque(pAwakeQ);
		//PSDEBUG("===== Queue out awakeQ");	
		//PSDEBUG_V("pAwakeQ->cnt", pAwakeQ->cnt);	
 		goto send_PduReq;
	}
	
	return FALSE;


send_PduReq:
    TxSend(signal, pfrmDesc);
    return TRUE;
}


void AgePsQ(U16 aid)
{
	Signal_t *psSignal;
	U16 interval;
    FrmDesc_t *pfrmDesc;
    U32 eol;
    FrmInfo_t *pfrmInfo;
    U16 loopCheck = 0;

	if ((aid == 0) || (aid > MAX_AID))	//Invalid AID
		return;
	

	while (pPsQ[aid]->cnt){ 
        // General Loop Check only. For future hidden bug
        if(loopCheck++ > 100)
        {
            printk("infinite loop occurs in %s\n", __FUNCTION__);
            loopCheck = 0;
            break;
        }

		interval = sstByAid[aid]->lsInterval; 
		if (interval == 0)
			interval = 1;
			
		psSignal = pPsQ[aid]->first;
		
		if (!psSignal)
			break;
			
		pfrmInfo = &psSignal->frmInfo;
		eol = pfrmInfo->eol;
#ifndef HOST_IF_USB 		
		if ((HW_GetNow(pdot11Obj) - eol) < (2*interval*mBeaconPeriod*1024)) //us
			break;
		
		if ((HW_GetNow(pdot11Obj) - eol) < (1024*1024)) //us
			break;	
#else
        if ((HW_GetNow(pdot11Obj) - eol) < (2*interval*mBeaconPeriod/10)) //10ms
			break;

		if ((HW_GetNow(pdot11Obj) - eol) < (100)) //10ms
			break;	
#endif		
		//Data life time-out
		psSignal = sigDeque(pPsQ[aid]); 
		if (!psSignal)	
			break;
			
		PSDEBUG_V("*****Data life time-out, AID", aid);	
        pfrmDesc = pfrmInfo->frmDesc;

        freeFdesc(pfrmDesc);
       	pdot11Obj->ReleaseBuffer(psSignal->buf);
        freeSignal(psSignal);
	}

	
	if (!pPsQ[aid]->cnt)
		TimMapSet(TimBitMap, aid, FALSE);
		
	return;
}	


void PsPolled(MacAddr_t *sta, U16 aid)
{
	Signal_t *signal;
	FrmInfo_t *pfrmInfo;
	FrmDesc_t *pfrmDesc;
	Frame_t	*frame; 
	int i;
	U8 Num;

	//PSDEBUG("PsPolled");

	signal = sigDeque(pPsQ[aid]);
	if (!signal){
		PSDEBUG("No Queue data for PS-POLL!!!");	
		TimMapSet(TimBitMap, aid, FALSE);
		return;
	}
	else{

		PSDEBUG_V("Queue out psQ, AID ", aid);	
		PSDEBUG_V("cnt ", pPsQ[aid]->cnt);
		pfrmInfo = &signal->frmInfo;
		pfrmDesc = pfrmInfo->frmDesc;

		Num = pfrmInfo->fTot;
		for (i=0; i<Num; i++){
			frame = &pfrmDesc->mpdu[i];
			//PSDEBUG_V("pfrmInfo ", (U32)pfrmInfo);
			//PSDEBUG_V("eol ", (U32)pfrmInfo->eol);
			PSDEBUG_V("pfrmDesc ", (U32)pfrmDesc);
			//PSDEBUG_V("frame ", (U32)frame);
			if (!pPsQ[aid]->cnt){
				frame->header[1] &= ~MORE_DATA_BIT;
				PSDEBUG("More bit 0");
			}	
			else {	
				frame->header[1] |= MORE_DATA_BIT;
				PSDEBUG("More bit 1");
			}	

			PSDEBUG_V("bodyLen ", frame->bodyLen);	
		}	

	
		if (!pdot11Obj->CheckTCBAvail(Num)){
            PSDEBUG("*****Fail to send out!!!");	
			PSDEBUG_V("Queue in psQ, AID", aid);
			sigEnqueFirst(pPsQ[aid], signal);
			return;
    	}
		else
			sigEnque(pTxQ, signal);
			return;
	}	
}	


void StaWakeup(MacAddr_t *sta)
{
	U16 aid;
    Signal_t *signal;
    U16 loopCheck = 0;

	aid = AIdLookup(sta);
	if ((aid == 0) || (aid > MAX_AID))
		return;

	while((signal = sigDeque(pPsQ[aid])) != NULL){
        // General Loop Check only. For future hidden bug
        if(loopCheck++ > 100)
        {
            printk("infinite loop occurs in %s\n", __FUNCTION__);
            loopCheck = 0;
            break;
        }

		sigEnque(pTxQ, signal); 
	}
}


void InitPMFilterQ(void)
{
	U8	i;
	static	BOOLEAN bFirstTime = TRUE;
	
	if (bFirstTime){
		bFirstTime = FALSE;
 		for (i=0; i < MAX_RECORD; i++){
			pPsQ[i] = &psQ[i];
			initSigQue(pPsQ[i]);
		}	
		pTxQ = &txQ;
		pAwakeQ = &awakeQ;
		initSigQue(pTxQ);
		initSigQue(pAwakeQ);
	}
	else{
		for (i=0; i < MAX_RECORD; i++)
			FlushQ(pPsQ[i]);
		FlushQ(pTxQ);
		FlushQ(pAwakeQ);
	}
	
	memset(TimBitMap, 0, sizeof(TimBitMap));
}


void ConfigBcnFIFO(void)
{
	int i, j;	
	BOOLEAN	bcst = FALSE;
    struct zd1205_private *macp=g_dev->priv;	
	Signal_t *signal;
	U8 tim[256];
	U8 Beacon[256];
	U16 BcnIndex = 0;
	U16	Len;
    U16 loopCheck = 0;

    //FPRINT("ConfigBcnFIFO");

	if (mBssType == AP_BSS){
		if (mPsStaCnt > 0) {
			HW_SetSTA_PS(pdot11Obj, 1);
			for (i=1; i < (MAX_AID+1); i++){
				AgePsQ(i);
				if (pPsQ[i]->cnt){
					TimMapSet(TimBitMap, i, TRUE);
					PSDEBUG_V("TimMapSet Aid", i);	
				}	
			}	
		}
		else{
			HW_SetSTA_PS(pdot11Obj, 0);
			//send McQ
			if (pPsQ[0]->cnt){
                //General loop check only. For future hidden bug 
				while(1){
                    if(loopCheck++ > 100)
                    {
                        printk("infinite loop occurs in %s\n", __FUNCTION__);
                        loopCheck = 0;
                        break;
                    }

					signal = sigDeque(pPsQ[0]);
					if (!signal)
						break;
				
					sigEnque(pTxQ, signal); 
				}
			}
		}
	}		
		
	/* make beacon frame */
	/* Frame control */
	Beacon[BcnIndex++] = 0x80;	
	Beacon[BcnIndex++] = 0x00; 
	
	/* Duration HMAC will fill this field */
	Beacon[BcnIndex++] = 0x00;	
	Beacon[BcnIndex++] = 0x00;
	
	/* Address1 */
	Beacon[BcnIndex++] = 0xff;	
	Beacon[BcnIndex++] = 0xff;
	Beacon[BcnIndex++] = 0xff;
	Beacon[BcnIndex++] = 0xff;
	Beacon[BcnIndex++] = 0xff;
	Beacon[BcnIndex++] = 0xff;
	
	/* Address2 */
	for (j=0; j<6; j++)
		//Beacon[BcnIndex++] = mBssId.mac[j];	
		Beacon[BcnIndex++] = dot11MacAddress.mac[j];	
	
	/* Address3 */
	for (j=0; j<6; j++)

		Beacon[BcnIndex++] = mBssId.mac[j];
	
	/* Sequence control	HMAC will fill this field */
	//Beacon[BcnIndex++] = 0x00;	
	//Beacon[BcnIndex++] = 0x00;
	BcnIndex += 2;
	
	/* Timestamp	HMAC will fill this field */
	//for (j=0; j<8; j++)
		//Beacon[BcnIndex++] = 0x00;
	BcnIndex += 8;	
	
	/* BeaconInterval */
	Beacon[BcnIndex++] = mBeaconPeriod;
	Beacon[BcnIndex++] = mBeaconPeriod >> 8;

	/* Display the Capability */
	if(pdot11Obj->dbg_cmd & DBG_CMD_BEACON)
		printk(KERN_ERR "mCap: 0x%04x\n", mCap);

	/* Capability */
	Beacon[BcnIndex++] = mCap;
	Beacon[BcnIndex++] = mCap >> 8;
	
	/* SSID */
	Len = eLen(&mSsid)+2;
	for (j=0; j<Len; j++)
		Beacon[BcnIndex++] = mSsid.buf[j];
	
	/* Supported rates */
	Len = eLen(&mBrates)+2;
	for (j=0; j<Len; j++)
		Beacon[BcnIndex++] = mBrates.buf[j];
	
	/* DS parameter */
	Beacon[BcnIndex++] = mPhpm.buf[0];	
	Beacon[BcnIndex++] = mPhpm.buf[1];	
	Beacon[BcnIndex++] = mPhpm.buf[2];	

	if (mBssType == INDEPENDENT_BSS){
		Beacon[BcnIndex++] = EID_IBPARMS;
		Beacon[BcnIndex++] = 0x2;
		Beacon[BcnIndex++] = mATIMWindow;
		Beacon[BcnIndex++] = mATIMWindow >> 8;
	}
		
	/* Tim */
	//if ((mDtimCount == 0) && (pPsQ[0]->cnt > 0)){ //dtim and buffer for mc
	if (mBssType == AP_BSS){
		if ((mDtimCount == 0) && mcBuffered){
			bcst = TRUE;
		}	
		
		mkTim((Element*)tim, (TrafficMap_t *)&TimBitMap, mDtimCount, mDtimPeriod, 1, MAX_AID, bcst);
		Len = tim[1]+2;
		for (j=0; j<Len; j++)
			Beacon[BcnIndex++] = tim[j];
	}
    	
#if defined(OFDM)
	if (mMacMode != PURE_B_MODE && mMacMode != PURE_A_MODE)
	{

		//ERP element

		Beacon[BcnIndex++] = mErp.buf[0];
		Beacon[BcnIndex++] = mErp.buf[1];
		Beacon[BcnIndex] = mErp.buf[2];
		/*if (pdot11Obj->bDisProtection==1)
		{//Disable protection
			Beacon[BcnIndex] &= ~USE_PROTECTION;
		}*/
		BcnIndex++;

		//Extended supported rates
		Len = mExtRates.buf[1]+2;;
		for (j=0; j<Len; j++)
			Beacon[BcnIndex++] = mExtRates.buf[j];
	}		
#endif		
	
	//WPA IE
/*	if ((mDynKeyMode == DYN_KEY_TKIP) || (mDynKeyMode == DYN_KEY_AES)){
		Len = mWPAIe.buf[1]+2;
		for (j=0; j<Len; j++)
			Beacon[BcnIndex++] = mWPAIe.buf[j];
	}	*/
	Len  = macp->cardSetting.WPAIeLen;
	if (Len)
	{ 
		memcpy(&Beacon[BcnIndex], &mWPAIe, Len);
		BcnIndex += Len; 
	}	
		
	/* CRC32 HMAC will calucate this value */
	//for (j=0; j<4; j++)
	//	Beacon[BcnIndex++] = 0x00;
	BcnIndex += 4;

	
	HW_SetBeaconFIFO(pdot11Obj, &Beacon[0], BcnIndex);	
	memset(TimBitMap, 0, sizeof(TimBitMap));
}


void SendMcPkt(void)
{
	Signal_t *signal;
    U16 loopCheck = 0;

	while(pPsQ[0]->cnt > 0){
        //General loop check only. For future hidden bug check
        if(loopCheck++ > 100)
        {
            printk("infinite loop occurs in %s\n", __FUNCTION__);
            loopCheck = 0;
            break;
        }

		signal = pPsQ[0]->first;
		if (!signal) 
			break;

		signal = sigDeque(pPsQ[0]);
		//PSDEBUG("Queue in awakeQ");	
		sigEnque(pAwakeQ, signal);
		//PSDEBUG_V("pAwakeQ->cnt", pAwakeQ->cnt);
	}
		
	if (pAwakeQ->cnt > 0){
		mcBuffered = TRUE;
	}
	else
		mcBuffered = FALSE;
}	


void ResetPMFilter(void)
{
	int i;
	
	for (i=0; i<BURST_NUM; i++)
		txRequest[i] = NULL;
		
	InitPMFilterQ();
}


BOOLEAN SendPkt(Signal_t* signal, FrmDesc_t *pfrmDesc, BOOLEAN bImmediate)
{
	FrmInfo_t *pfrmInfo;
	Frame_t	*frame;
	int i;
	Hash_t *pHash;
	U8	Num;

	//PSDEBUG("SendPkt");
	pfrmInfo = &signal->frmInfo;
	frame = pfrmDesc->mpdu;
	pHash = pfrmDesc->pHash;
	Num = pfrmInfo->fTot;

	if (!signal->bDataFrm) {
		//if (!pfrmDesc->bDataFrm){
		goto direct_send;
	}
    
	if (!isGroup(addr1(frame))) { //unicast
		PsMode dpsm;
		U16 aid;

		if (mBssType != AP_BSS)
			goto direct_send;
            
		//PsInquiry(addr1(frame), &dpsm, &aid);
		dpsm = pHash->psm;
		aid = pHash->aid;

		if ((dpsm == PSMODE_POWER_SAVE) && (aid > 0) && (aid <(MAX_AID+1))) {
			AgePsQ(aid);

			if (zd_CheckTotalQueCnt() > TXQ_THRESHOLD) {
				PSDEBUG("*****Drop PS packet*****");
				freeFdesc(pfrmDesc);
				pdot11Obj->ReleaseBuffer(signal->buf);
				freeSignal(signal);
				return FALSE;
			}
			else {
				//for (i=0; i<Num; i++){
				//	setMoreData((&pfrmDesc->mpdu[i]), 1);
				//  pfrmDesc->mpdu[i].header[i] |= MORE_DATA_BIT;
				//}	
				pfrmInfo->eol = HW_GetNow(pdot11Obj);	//Set timestamp

				sigEnque(pPsQ[aid], signal);			//Queue in PS Queue
				PSDEBUG_V("Queue in PS Queue, AID ", aid);
				PSDEBUG_V("cnt ", pPsQ[aid]->cnt);
				//PSDEBUG_V("pfrmInfo ", (U32)pfrmInfo);
				//PSDEBUG_V("eol ", (U32)pfrmInfo->eol);
				PSDEBUG_V("pfrmDesc ", (U32)pfrmDesc);
				//PSDEBUG_V("frame ", (U32)frame);
				PSDEBUG_V("bodyLen ", frame->bodyLen);
				TimMapSet(TimBitMap, aid, TRUE);
				return FALSE;
			}
		}
		else {			
			goto direct_send;
        	}
	}
	else{   //group address
		if ((orderBit(frame) == 0) && (mPsStaCnt > 0)){
			if ((zd_CheckTotalQueCnt() > TXQ_THRESHOLD) || (pPsQ[0]->cnt > MCQ_THRESHOLD)){
				PSDEBUG("*****Drop MC packet*****");
				freeFdesc(pfrmDesc);
				pdot11Obj->ReleaseBuffer(signal->buf);
				freeSignal(signal);
				return FALSE;
			}
			else{
				for (i=0; i<Num; i++){
					pfrmDesc->mpdu[i].header[1] |= MORE_DATA_BIT;
				}	

				sigEnque(pPsQ[0], signal);	// psQ[0] is for mcQ
				//PSDEBUG("+++++ Queue in mcQ");
				//PSDEBUG_V("mcQ->cnt", pPsQ[0]->cnt);
				return FALSE;
			}
		}
		else{
			goto direct_send;
		}
	}


direct_send:
	if (!bImmediate){
		sigEnque(pTxQ, signal);
		return FALSE;
	}
	else{	
		if (!pdot11Obj->CheckTCBAvail(Num)){
		#if 1  //727
			freeSignal(signal);
			freeFdesc(pfrmDesc);
			return TRUE;
		#else
			sigEnque(pTxQ, signal);
			return FALSE;
		#endif 
			//PSDEBUG("Queue in TxQ");
			//PSDEBUG_V("Cnt of TxQ", pTxQ->cnt);
    		}
		return TxSend(signal, pfrmDesc); //14 us
	}
}

#endif

⌨️ 快捷键说明

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