📄 zdpsmon.c
字号:
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 bcAddr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
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, &bcAddr[0], 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);
HW_ConfigStatKey(pdot11Obj, pKeyContent, keyLength, STA_KEY_START_ADDR+(KeyId * 8));
}
else
HW_ConfigDynaKey(pdot11Obj, CAM_VAP_START_AID, (U8 *)&dot11MacAddress, pKeyContent, keyLength, encryMode,change_enc);
return 0;
}
else if (encryMode == TKIP)
{
if (mWpaBcKeyLen == 32)
{
if (mOperationMode != CAM_AP_VAP)
{
//Tmep key(16), Tx Mic Key(8), Rx Mic Key(8)
HW_ConfigDynaKey(pdot11Obj, 32, &bcAddr[0], pKeyContent, keyLength, encryMode, change_enc);
// Also set default key for Multicast case to avoid Tx-underrun.
//if ((mDebugFlag & BIT_1)==0)
{
HW_CAM_Write(pdot11Obj, DEFAULT_ENCRY_TYPE, encryMode);
HW_ConfigStatKey(pdot11Obj, pKeyContent, keyLength, STA_KEY_START_ADDR+(KeyId * 8));
}
}
else
{
HW_ConfigDynaKey(pdot11Obj, CAM_VAP_START_AID, (U8 *)&dot11MacAddress, pKeyContent, keyLength, encryMode, change_enc);
}
if (mBssType == INFRASTRUCTURE_BSS)
MICsetKey(&pKeyContent[24], &mBcMicKey); //Tx Mic key
else
MICsetKey(&pKeyContent[16], &mBcMicKey);// For Infra-STA mode.
}
return 0;
}
else if (encryMode == AES)
{
if (mWpaBcKeyLen == 16)
{
if (mOperationMode != CAM_AP_VAP)
{
HW_ConfigDynaKey(pdot11Obj, 32, &bcAddr[0], pKeyContent, keyLength, encryMode, change_enc);
// Also set default key for Multicast case to avoid Tx-underrun.
HW_CAM_Write(pdot11Obj, DEFAULT_ENCRY_TYPE, encryMode);
HW_ConfigStatKey(pdot11Obj, pKeyContent, keyLength, STA_KEY_START_ADDR+(KeyId * 8));
}
else
{
HW_ConfigDynaKey(pdot11Obj, CAM_VAP_START_AID, (U8 *)&dot11MacAddress, pKeyContent, keyLength, encryMode, change_enc);
}
}
return 0;
}
else{
return -1;
}
}// End of Group key setting.
// Start of Pairwise key setting.
pHash = HashSearch(sta);
if (!pHash)
{
if (!memcmp(&sta->mac[0], ZeroAddr, 6))
{
int i;
HW_CAM_ResetRollTbl(pdot11Obj);
if (mGkInstalled)
{
HW_CAM_UpdateRollTbl(pdot11Obj,0);//ReEnable group key.
}
if (mBssType != INFRASTRUCTURE_BSS)
{//AP mode.
WPADEBUG("clear all tx key\n");
for (i=0; i<MAX_RECORD; i++)
HashBuf[i].pkInstalled=0;
}
else
{// STA mode.
WPADEBUG("clear key of aid %d\n",sstByAid[0]->aid);
sstByAid[0]->pkInstalled=0;
}
}
return -1;
}
else{
pHash->keyLength = keyLength;
if (pHash->encryMode != encryMode)
change_enc = 1;
pHash->encryMode = encryMode;
aid = pHash->aid;
if (encryMode != NO_WEP)
WPADEBUG("********* Set key%s for aid:%d\n",DbgStrEncryType[encryMode & 7],aid);
else
WPADEBUG("********* Clear key for aid:%d\n",aid);
if (encryMode == NO_WEP)
{// Clear pairwise key
pHash->pkInstalled = 0;
if (mBssType == INFRASTRUCTURE_BSS)
HW_CAM_ClearRollTbl(pdot11Obj, 8);
else
HW_CAM_ClearRollTbl(pdot11Obj, aid);
}
else if (encryMode == TKIP)
{
if (mBssType == INFRASTRUCTURE_BSS)
{
// zd1205_dump_data("key:", (u8*)pKeyContent, 32);
HW_ConfigDynaKey(pdot11Obj, 8, addr, pKeyContent, 32, encryMode, change_enc);
}
else
HW_ConfigDynaKey(pdot11Obj, aid, addr, pKeyContent, 32, encryMode, change_enc);
MICsetKey(&pKeyContent[16], &pHash->TxMicKey);
MICsetKey(&pKeyContent[24], &pHash->RxMicKey);
pHash->KeyId = KeyId;
pHash->pkInstalled = 1;
}
else //if (encryMode == AES)
{
if (mBssType == INFRASTRUCTURE_BSS)
{
WPADEBUG("********* setAESkey\n");
HW_ConfigDynaKey(pdot11Obj, 8, addr, pKeyContent, keyLength, encryMode, change_enc);
}
else
HW_ConfigDynaKey(pdot11Obj, aid, addr, pKeyContent, keyLength, encryMode, change_enc);
pHash->KeyId = KeyId;
pHash->pkInstalled = 1;
}
return 0;
}
}
BOOLEAN zd_GetKeyInfo(U8 *addr, U8 *encryMode, U8 *keyLength, U8 *pKeyContent)
{
Hash_t *pHash;
MacAddr_t *sta = (MacAddr_t *)addr;
ZDEBUG("zd_GetKeyInfo");
if (isGroup(sta)){
return FALSE;
}
pHash = HashSearch(sta);
if (!pHash){
*encryMode = 0;
*keyLength = 0;
return FALSE;
}
else{
*encryMode = pHash->encryMode;
*keyLength = pHash->keyLength;
memcpy(pKeyContent, &pHash->keyContent[0], pHash->keyLength);
return TRUE;
}
}
/**
* zd_SetKeyContext - Set Key context to CAM (used for WPA/WPA2)
* @addr: MAC address of AP we associated with
* @encryMode: Encryption mode
* @keyLength: Length of key context
* @keyId: Key index
* @pKeyContent: Context of key
*/
#if 0
int zd_SetKeyContext(U8 *addr, U8 encryMode, U8 keyLength, U8 KeyId, U8 *pKeyContent)
{
Hash_t *pHash;
if (isGroup(addr)) {
mWpaBcKeyLen = keyLength;
mWpaBcKeyId = KeyId;
if (encryMode == DYN_KEY_TKIP) {
if (keyLength == 32) {
zd1205_config_dyn_key(encryMode, pKeyContent, KeyId);
MICsetKey(&pKeyContent[24], &mBcMicKey);
}
mGkInstalled = 1;
return 0;
}
else if (encryMode == DYN_KEY_AES) {
printk(KERN_ERR "***** set group key ID: %d\n",KeyId);
zd1205_config_dyn_key(encryMode, pKeyContent, KeyId);
mGkInstalled = 1;
return 0;
}
else {
WPADEBUG("zd_SetKeyContext: encryMode: %d not support\n", encryMode);
return -1;
}
}
pHash = HashSearch((MacAddr_t*)addr);
if(!pHash) {
WPADEBUG("Can't find AP's MAC address in the hash table\n");
return -1;
}
else {
pHash->encryMode = encryMode;
if (encryMode == DYN_KEY_TKIP) {
zd1205_config_dyn_key(encryMode, pKeyContent, KeyId);
MICsetKey(&pKeyContent[16], &pHash->TxMicKey);
MICsetKey(&pKeyContent[24], &pHash->RxMicKey);
pHash->KeyId = KeyId;
pHash->pkInstalled = 1;
}
else if (encryMode == DYN_KEY_AES) {
zd1205_config_dyn_key(encryMode, pKeyContent, KeyId);
pHash->KeyId = KeyId;
pHash->pkInstalled = 1;
}
else {
WPADEBUG("zd_SetKeyContext: encryMode: %d not support\n", encryMode);
}
}
return 0;
}
#endif
#if defined(PHY_1202)
int zd_GetKeyInfo_ext(U8 *addr, U8 *encryMode, U8 *keyLength, U8 *pKeyContent, U16 iv16, U32 iv32)
{
Hash_t *pHash;
MacAddr_t *sta = (MacAddr_t *)addr;
ZDEBUG("zd_GetKeyInfo_ext");
if (isGroup(sta)){
return -1;
}
if (mDynKeyMode != DYN_KEY_TKIP)
return -1;
pHash = HashSearch(sta);
if (!pHash){
*encryMode = 0;
*keyLength = 0;
return -1;
}
else{
if (pHash->pkInstalled == 0)
return -2;
if ((iv16 == pHash->RxSeed.IV16) && (iv32 == pHash->RxSeed.IV32)){
// iv out of sequence
//FPRINT_V("iv16", iv16);
//FPRINT_V("iv32", iv32);
//return -3;
}
*encryMode = pHash->encryMode;
*keyLength = pHash->keyLength;
//do key mixing
Tkip_phase1_key_mix(iv32, &pHash->RxSeed);
Tkip_phase2_key_mix(iv16, &pHash->RxSeed);
Tkip_getseeds(iv16, pKeyContent, &pHash->RxSeed);
pHash->RxSeed.IV16 = iv16;
pHash->RxSeed.IV32 = iv32;
return pHash->aid;
}
}
int zd_SetTsc(U8 *addr, U8 KeyId, U8 direction, U32 tscHigh, U16 tscLow)
{
Hash_t *pHash;
MacAddr_t *sta = (MacAddr_t *)addr;
ZDEBUG("zd_SetTsc");
if (isGroup(sta)){
return -1;
}
pHash = HashSearch(sta);
if (!pHash)
return -1;
else{
pHash->KeyId = KeyId;
if (direction == 0){ //Tx
pHash->TxSeed.IV16 = tscLow;
pHash->TxSeed.IV32 = tscHigh;
}
else if (direction == 1){ //Rx
pHash->RxSeed.IV16 = tscLow;
pHash->RxSeed.IV32 = tscHigh;
}
return 0;
}
}
int zd_GetTsc(U8 *addr, U8 KeyId, U8 direction, U32 *tscHigh, U16 *tscLow)
{
Hash_t *pHash;
MacAddr_t *sta = (MacAddr_t *)addr;
ZDEBUG("zd_GetTsc");
if (isGroup(sta)){
return -1;
}
pHash = HashSearch(sta);
if (!pHash)
return -1;
else{
if (direction == 0){ //Tx
*tscLow = pHash->TxSeed.IV16;
*tscHigh = pHash->TxSeed.IV32;
}
else if (direction == 1){ //Rx
*tscLow = pHash->RxSeed.IV16;
*tscHigh = pHash->RxSeed.IV32;
}
return 0;
}
}
#endif
BOOLEAN zd_CheckIvSeq(U8 aid, U16 iv16, U32 iv32)
{
Hash_t *pHash = NULL;
U16 oldIv16;
U32 oldIv32;
ZDEBUG("zd_CheckIvSeq");
if (mDynKeyMode != DYN_KEY_TKIP){
FPRINT("Not in DYN_KEY_TKIP mode");
return FALSE;
}
pHash = sstByAid[aid];
if (!pHash){
FPRINT("zd_CheckIvSeq failed");
return FALSE;
}
else{
if (pHash->pkInstalled == 0){
FPRINT("pkInstalled == 0");
return FALSE;
}
oldIv16 = pHash->RxSeed.IV16;
oldIv32 = pHash->RxSeed.IV32;
#if 1
if ((oldIv16 == iv16) && (oldIv32 == iv32)){
// iv out of sequence
FPRINT("iv out of sequence");
FPRINT_V("iv16", iv16);
FPRINT_V("iv32", iv32);
return FALSE;
}
#else //If fifo overrun, this will failed
if (iv32 == oldIv32){
if (iv16 != oldIv16+1){
// iv out of sequence
FPRINT("iv out of sequence");
FPRINT_V("iv16", iv16);
FPRINT_V("iv32", iv32);
return FALSE;
}
}
else {
if ((iv16 != 0) || (oldIv16 != 0xffff)){
// iv out of sequence
FPRINT("iv out of sequence");
FPRINT_V("iv16", iv16);
FPRINT_V("iv32", iv32);
return FALSE;
}
}
#endif
pHash->RxSeed.IV16 = iv16;
pHash->RxSeed.IV32 = iv32;
return TRUE;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -