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

📄 zdpmfilter.c

📁 ZYDAS zd1211b driver for Linux2.4
💻 C
📖 第 1 页 / 共 3 页
字号:
        aid = AIdLookup(sta);        if ((aid == 0) || (aid > MAX_AID))                return;        while((signal = sigDeque(pPsQ[aid])) != NULL) {                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;        U8	Len;        //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) {                                while(1) {                                        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;        while(pPsQ[0]->cnt > 0) {                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;                /* ath_desc: fix AP_BSS crash */                if ((mBssType != AP_BSS) || (!pHash))                        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                        /* ath_desc: fix mem leak */                        freeFdesc(pfrmDesc);                        pdot11Obj->ReleaseBuffer(signal->buf);                        freeSignal(signal);                        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 + -