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

📄 zdpsmon.c

📁 ZD1211 source code, based on linux 2.44 or linux 2.
💻 C
📖 第 1 页 / 共 3 页
字号:
                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)
                {
                    // To speed up install GTK, use the following 3 statments instead of using HW_ConfigDynaKey(...)
                    HW_CAM_Write(pdot11Obj, ENCRY_TYPE_START_ADDR+1, encryMode);// The encryption type of user 8 is set in bit[0-3] of CAM location 61 
	            HW_CAM_SetKey(pdot11Obj, GROUP_USER_ID_STA, 16, pKeyContent);// For ZD1211B, use software to calculate MIC, no need setup MIC key into CAM.
                    pdot11Obj->SetReg(pdot11Obj->reg, ZD_CAM_ROLL_TB_LOW, 0x101);// Enable both user 0 and user 8 for Pairwise key and Group key.
                    //Tmep key(16), Tx Mic Key(8), Rx Mic Key(8)
                    //HW_ConfigDynaKey(pdot11Obj, GROUP_USER_ID_STA, (U8*)&dot11BCAddress, 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)); 
                    HW_ConfigStatKey(pdot11Obj, pKeyContent, 16, STA_KEY_START_ADDR+(KeyId * 8)); // ZD1211B use software to calculate MIC, no need to setup MIC key into the CAM.
                }
                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)
                {
                    // To speed up install GTK, use the following 3 statments instead of using HW_ConfigDynaKey(...)
                    HW_CAM_Write(pdot11Obj, ENCRY_TYPE_START_ADDR+1, encryMode);// The encryption type of user 8 is set in bit[0-3] of CAM location 61 
	            HW_CAM_SetKey(pdot11Obj, GROUP_USER_ID_STA, 16, pKeyContent);
                    pdot11Obj->SetReg(pdot11Obj->reg, ZD_CAM_ROLL_TB_LOW, 0x101);// Enable both user 0 and user 8 for Pairwise key and Group key.
                    //HW_ConfigDynaKey(pdot11Obj, GROUP_USER_ID_STA, (U8*)&dot11BCAddress, 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)
            {   
                // To improve the performence of install PTK, use the following 3 lines instead of using HW_ConfigDynaKey(..)
                HW_CAM_Write(pdot11Obj, ENCRY_TYPE_START_ADDR, encryMode);
	        HW_CAM_SetKey(pdot11Obj, PAIRWISE_USER_ID_STA, 16, pKeyContent);
                pdot11Obj->SetReg(pdot11Obj->reg, ZD_CAM_ROLL_TB_LOW, 1);
                //HW_ConfigDynaKey(pdot11Obj, PAIRWISE_USER_ID_STA, 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)
            {
                // To improve the performence of install PTK, use the following 3 lines instead of using HW_ConfigDynaKey(..)
                HW_CAM_Write(pdot11Obj, ENCRY_TYPE_START_ADDR, encryMode);
	        HW_CAM_SetKey(pdot11Obj, PAIRWISE_USER_ID_STA, 16, pKeyContent);
                pdot11Obj->SetReg(pdot11Obj->reg, ZD_CAM_ROLL_TB_LOW, 1);
                //HW_ConfigDynaKey(pdot11Obj, PAIRWISE_USER_ID_STA, 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 + -