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

📄 zdpsmon.c

📁 该代码为linux下通过usb驱动实现的无线网络驱动程序,在2.6.18的内核下调试通过
💻 C
📖 第 1 页 / 共 2 页
字号:
			
			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 + -