📄 zdpmfilter.c
字号:
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 + -