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