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