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

📄 zdpsmon.c

📁 ZD1211 source code, based on linux 2.44 or linux 2.
💻 C
📖 第 1 页 / 共 3 页
字号:
	else{
		PsMode oldPsm = pHash->psm;
		StationState asoc = pHash->asoc;

updateInfo:		
		if (rate > pHash->MaxRate)
			pHash->MaxRate = rate;
            
		pHash->RxRate = rate;
		pHash->ttl = HW_GetNow(pdot11Obj);
		
#if ZDCONF_AP_SUPPORT == 1
		if (mBssType == AP_BSS)
        {
			if (psm == PSMODE_STA_ACTIVE){
				if (oldPsm == PSMODE_POWER_SAVE){
					StaWakeup(sta);
					if (asoc == STATION_STATE_ASOC){
						if (mPsStaCnt >0){ 
							mPsStaCnt--;
						}	
					}
				}		
			}
			else {
				if (oldPsm == PSMODE_STA_ACTIVE){
					if (asoc == STATION_STATE_ASOC){
						if (mPsStaCnt < MAX_AID){ 
							mPsStaCnt++;
						}	
					}	
				}
				else if (oldPsm == PSMODE_POWER_SAVE){
					if (asoc == STATION_STATE_ASOC){
						if (mPsStaCnt == 0) 
							mPsStaCnt++;
					}	
				}		
			}	
		}	
#endif
		
		pHash->psm = psm;
	}
	
	return pHash;
}

#if ZDCONF_AP_SUPPORT == 1
void RxInfoUpdate(Hash_t *pHash, PsMode psm, U8 rate)
{
	PsMode oldPsm = pHash->psm;
	StationState asoc = pHash->asoc;
		
	if (rate > pHash->MaxRate)
		pHash->MaxRate = rate;
			
	pHash->RxRate = rate;
	pHash->ttl = HW_GetNow(pdot11Obj);
		
	if (psm == PSMODE_STA_ACTIVE){
		if (oldPsm == PSMODE_POWER_SAVE){
			StaWakeup((MacAddr_t *)pHash->mac);
			if (asoc == STATION_STATE_ASOC){
				if (mPsStaCnt >0){ 
					mPsStaCnt--;
				}	
			}
		}		
	}
	else {
		if (oldPsm == PSMODE_STA_ACTIVE){
			if (asoc == STATION_STATE_ASOC){
				if (mPsStaCnt < MAX_AID){ 
					mPsStaCnt++;
				}	
			}	
		}
		else if (oldPsm == PSMODE_POWER_SAVE){
			if (asoc == STATION_STATE_ASOC){
				if (mPsStaCnt == 0) 
					mPsStaCnt++;
			}	

		}		
	}	

	
	pHash->psm = psm;
}
#endif


BOOLEAN UpdateStaStatus(MacAddr_t *sta, StationState staSte, U8 vapId)
{
	Hash_t *pHash;
    U16 loopCheck = 0;
	
	ZDEBUG("UpdateStaStatus");
	
#if ZDCONF_AP_SUPPORT == 1
	if (mBssType == AP_BSS){
		pHash = HashSearch(sta);
		if (pHash)
			goto UpdateStatus;
		else{	
			if ((STATION_STATE_AUTH_OPEN == staSte) || (STATION_STATE_AUTH_KEY == staSte)){
				if ((mCurrConnUser + 1) > mLimitedUser){
					//AgeHashTbl();
					return FALSE;
				}	
				else{	
					pHash = HashInsert(sta);
					if (!pHash)
						return FALSE; 
				}		
			}	
			else
				return FALSE; 
		}
	}
#endif
	if (mBssType == INFRASTRUCTURE_BSS){
		if ((STATION_STATE_AUTH_OPEN == staSte) || (STATION_STATE_AUTH_KEY == staSte)){
            if (mWPAIe.buf[1] != 0)
            {
                HW_CAM_SetMAC(pdot11Obj, PAIRWISE_USER_ID_STA, (U8*) sta);
                HW_CAM_SetMAC(pdot11Obj, GROUP_USER_ID_STA, (U8*) &dot11BCAddress);
                WPADEBUG("-----State:%d mWPAIeLen(SetMAC)=%d\n", staSte, mWPAIe.buf[1]);
                
            }
            else
            {
                WPADEBUG("-----State:%d mWPAIeLen(NonWPA)=%d\n", staSte, mWPAIe.buf[1]);
            }
			CleanupHash(sstByAid[0]);
			pHash = HashInsert(sta);
		} else {	
			pHash = sstByAid[0]; //use aid = 0 to store AP's info
		}	
	}	
#if ZDCONF_ADHOC_SUPPORT == 1
	else if (mBssType == INDEPENDENT_BSS){	
		pHash = HashSearch(sta);
		if (pHash)
			goto UpdateStatus;
		else {
			pHash = HashInsert(sta);
            if (!pHash)
				return FALSE;
            else
                zd1205_dump_data(" HashInsert macAddr = ", (U8 *)&pHash->mac[0], 6);
		}	
	}
#endif
    else
        return FALSE;	

UpdateStatus:	
	switch(staSte){
		case STATION_STATE_AUTH_OPEN:
		case STATION_STATE_AUTH_KEY:
			pHash->auth = staSte;
			break;

		case STATION_STATE_ASOC:
#if ZDCONF_AP_SUPPORT == 1
			if (mBssType == AP_BSS)
            {
				if (((mCurrConnUser + 1) > mLimitedUser) && (!pHash->AlreadyIn)){
					return FALSE; 
				}
				
				if (pHash->psm == PSMODE_POWER_SAVE){
					if (mPsStaCnt > 0){ 
						mPsStaCnt--;
					}	

				}	
						
				pHash->asoc = STATION_STATE_ASOC;
				/*if (!pHash->AlreadyIn){
					pHash->AlreadyIn = 1;
					mCurrConnUser++;
				}*/
			}
            else
#endif
            {
				pHash->asoc = STATION_STATE_ASOC;
			}		

            if (mBssType != INDEPENDENT_BSS)
			    CleanupKeyInfo(pHash);

            memcpy(&pdot11Obj->CurrSsid[0], (U8 *)&mSsid, mSsid.buf[1]+2);   
			break;

		case STATION_STATE_NOT_AUTH:
		case STATION_STATE_DIS_ASOC:
#if ZDCONF_AP_SUPPORT == 1
			if (mBssType == AP_BSS)
            {
				if (pHash->asoc == STATION_STATE_ASOC){
					if (pHash->psm == PSMODE_POWER_SAVE){
						FlushQ(pPsQ[pHash->aid]);
						if (mPsStaCnt > 0){ 
							mPsStaCnt--;
							if (mPsStaCnt == 0){
								FlushQ(pAwakeQ);
								FlushQ(pPsQ[0]);
							}	
						}	
					}
					/*if (pHash->AlreadyIn){
						pHash->AlreadyIn = 0;
						mCurrConnUser--;	
					}*/	
				}
			}			
#endif
			
			pHash->auth = STATION_STATE_NOT_AUTH;
			pHash->asoc = STATION_STATE_DIS_ASOC;
			CleanupKeyInfo(pHash);
			//for Rx-Retry filter
			HW_CAM_ClearRollTbl(pdot11Obj, pHash->aid);
			{
				MacAddr_t	*pMac;
				Hash_t 		*sta_info;
				U8 			entry;
				pMac = (MacAddr_t *) pHash->mac;
				entry = GetEntry(pMac);
				sta_info=HashTbl[entry];
				if (sta_info)
				{
					if (memcmp(sta_info->mac, pHash->mac, 6)==0)
					{
						HashTbl[entry]=sta_info->pNext;
						freeHashBuf(pHash);
					}
					else
					{
						while (sta_info->pNext != NULL && memcmp(sta_info->pNext->mac, pHash->mac, 6) != 0)
                        {
                            // To prevent self-link
                            if(loopCheck++ > 100)
                            {
                                printk("infinite loop occurs in %s\n", __FUNCTION__);
                                loopCheck = 0;
                                break;
                            }

                            sta_info = sta_info->pNext;
                        }
                        if (sta_info->pNext != NULL)
                        {
                            Hash_t	*sta_info1;
                            sta_info1 = sta_info->pNext;
                            sta_info->pNext =  sta_info->pNext->pNext;
                            freeHashBuf(sta_info1);	
                        }
                        else
                        {
                            printk(KERN_DEBUG "Could not remove STA:" MACSTR "\n", MAC2STR(pHash->mac));
                        }
					}
				}
			}

			break;

	}
	
	return TRUE;
}


void SsInquiry(MacAddr_t *sta, StationState *sst, StationState *asst)
{
	ZDEBUG("SsInquiry");
	if (isGroup(sta)){
		*asst = STATION_STATE_NOT_AUTH;
		*sst = STATION_STATE_DIS_ASOC;
	}
	else{
		Hash_t *pHash;
		pHash = HashSearch(sta);

		if (!pHash){
			*asst = STATION_STATE_NOT_AUTH;
			*sst = STATION_STATE_DIS_ASOC;
		}
		else{
			*asst = pHash->auth;
			if ((*asst == STATION_STATE_AUTH_OPEN) || (*asst == STATION_STATE_AUTH_KEY))
				*sst = pHash->asoc;
			else
				*sst = STATION_STATE_DIS_ASOC;
		}	
	}

}


U16 AIdLookup(MacAddr_t *sta)
{
	Hash_t *pHash;
	
	ZDEBUG("AIdLookup");
	pHash = HashSearch(sta);
	if (!pHash)
		return (U16)0;
	else
		return pHash->aid;
}


void AssocInfoUpdate(MacAddr_t *sta, U8 MaxRate, U8 lsInterval, U8 ZydasMode, U8 Preamble, BOOLEAN bErpSta, U8 Burst, U8 AMSDU, U8 AMSDU_LEN, U8 vapId)

{
	Hash_t *pHash;
	
	ZDEBUG("AssocInfoUpdate");
	if (isGroup(sta))
		return;

	pHash = HashSearch(sta);
	if (!pHash)
		return;	
	else{
		pHash->MaxRate = MaxRate;
		pHash->CurrTxRate = MaxRate;
		pHash->lsInterval = lsInterval;
		pHash->ZydasMode = ZydasMode;
		pHash->Preamble = Preamble;
		pHash->bErpSta = bErpSta;
		pHash->vapId = vapId;
#if ZDCONF_LP_SUPPORT == 1
        pHash->Turbo_Burst = Burst;
        pHash->Turbo_AMSDU = AMSDU;
        pHash->Turbo_AMSDU_LEN = AMSDU_LEN;
#endif

	}
}
int zd_SetKeyInfo(U8 *addr, U8 encryMode, U8 keyLength, U8 key_id, U8 *pKeyContent)
{
    Hash_t *pHash;
    MacAddr_t *sta = (MacAddr_t *)addr;

    U8 ZeroAddr[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00};    
    U16 aid;
    U8 change_enc = 0;
    U8 bTxKey = key_id & BIT_7;
    U8 bClrRollTable = key_id & BIT_6;
    U8 KeyId = key_id & 0xF;

    switch (encryMode)
    {
    case WEP64:
        keyLength = 5;
        break;
    case WEP128:
        keyLength = 13;
        break;
    case WEP256:
        keyLength = 29;
        break;
    case TKIP:
        keyLength = 32;
        break;
    case AES:
        keyLength = 16;
        break;
    default:
        return 0;
    }   
    if (isGroup(sta))
    {
        change_enc = 1;
        if (keyLength == 0)
        { // No entry chance.
            WPADEBUG("Clear Group key RollTbl (aid0)\n");
            HW_CAM_ClearRollTbl(pdot11Obj, 0);//Clear group key.(aid0)
            return 0;
        }   
        if (mWpaBcKeyLen == keyLength && mGkInstalled == 1)
            change_enc = 0; // Nonfirst time group key update.
        mWpaBcKeyLen = keyLength;
        mBcKeyId = KeyId;
        mGkInstalled = 1;

        if (encryMode == WEP64 || encryMode == WEP128 || encryMode == WEP256)
        {
            if (mOperationMode != CAM_AP_VAP)
            {
                if (0)
                {
                    HW_ConfigDynaKey(pdot11Obj, 32, (U8*)&dot11BCAddress, pKeyContent, keyLength, encryMode, change_enc);
                }
                else if (bTxKey)
                {
                    if (bClrRollTable)
                        HW_CAM_ResetRollTbl(pdot11Obj);// Reset all.
                    mKeyId = KeyId;
                }
                // Also set default key for Multicast case to avoid Tx-underrun.
                HW_CAM_Write(pdot11Obj, DEFAULT_ENCRY_TYPE, encryMode);

⌨️ 快捷键说明

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