7 #define GetEntry(pMac) (((pMac->mac[3]) ^ (pMac->mac[4]) ^ (pMac->mac[5])) & (MAX_AID-1))
10 Hash_t HashBuf
[MAX_RECORD
];
11 Hash_t
*HashTbl
[MAX_RECORD
];
12 Hash_t
*sstByAid
[MAX_RECORD
];
15 extern void zd1205_config_dyn_key(u8 DynKeyMode
, u8
*pkey
, int idx
);
16 Hash_t
*HashInsert(MacAddr_t
*pMac
);
18 void CleanupHash(Hash_t
*hash
)
20 memset(hash
->mac
, 0, 6);
21 hash
->asoc
= STATION_STATE_DIS_ASOC
;
22 hash
->auth
= STATION_STATE_NOT_AUTH
;
23 hash
->psm
= PSMODE_STA_ACTIVE
;
24 hash
->encryMode
= WEP_NOT_USED
;
26 hash
->pkInstalled
= 0;
28 hash
->ContSuccFrames
= 0;
34 memset(hash
->wepIv
, 0, 4);
35 memset(&hash
->TxSeed
, 0, sizeof(Seedvar
));
36 memset(&hash
->RxSeed
, 0, sizeof(Seedvar
));
37 memset(&hash
->TxMicKey
, 0, sizeof(MICvar
));
38 memset(&hash
->RxMicKey
, 0, sizeof(MICvar
));
39 hash
->SuccessFrames
= 0;
40 hash
->FailedFrames
= 0;
41 hash
->bJustRiseRate
= FALSE
;
42 hash
->RiseConditionCount
= 0;
43 hash
->DownConditionCount
= 0;
48 hash
->bErpSta
= FALSE
;
53 void CleanupKeyInfo(Hash_t
*hash
)
55 hash
->encryMode
= WEP_NOT_USED
;
56 hash
->pkInstalled
= 0;
59 memset(hash
->wepIv
, 0, 4);
60 memset(&hash
->TxSeed
, 0, sizeof(Seedvar
));
61 memset(&hash
->RxSeed
, 0, sizeof(Seedvar
));
62 memset(&hash
->TxMicKey
, 0, sizeof(MICvar
));
63 memset(&hash
->RxMicKey
, 0, sizeof(MICvar
));
67 void initHashBuf(void)
71 freeHashCount
= MAX_RECORD
;
73 for (i
=0; i
<MAX_AID
; i
++){ //from 0 to 31
74 HashBuf
[i
].pNext
= &HashBuf
[i
+1];
75 sstByAid
[i
] = &HashBuf
[i
];
77 CleanupHash(&HashBuf
[i
]);
81 HashBuf
[MAX_AID
].pNext
= NULL
;
82 sstByAid
[MAX_AID
] = &HashBuf
[MAX_AID
];
83 HashBuf
[MAX_AID
].aid
= MAX_AID
;
84 CleanupHash(&HashBuf
[MAX_AID
]);
86 FreeHashList
= &HashBuf
[1]; //by pass aid = 0
89 HashBuf
[0].pNext
= NULL
;
93 Hash_t
*allocHashBuf(void)
98 //HSDEBUG("*****allocHashBuf*****");
99 flags
= pdot11Obj
->EnterCS();
100 if (FreeHashList
!= NULL
){
102 FreeHashList
= FreeHashList
->pNext
;
106 pdot11Obj
->ExitCS(flags
);
112 void freeHashBuf(Hash_t
*hash
)
116 //HSDEBUG("*****freeHashBuf*****");
117 flags
= pdot11Obj
->EnterCS();
118 if (hash
->AlreadyIn
){
119 if (mCurrConnUser
> 0)
121 if (hash
->bErpSta
== FALSE
&& mNumBOnlySta
> 0)
126 pdot11Obj
->ConfigFlag
&= ~NON_ERP_PRESENT_SET
;
127 mErp
.buf
[2] &= ~NON_ERP_PRESENT
;
132 if (hash
->psm
== PSMODE_POWER_SAVE
){
138 HW_CAM_ClearRollTbl(pdot11Obj
, hash
->aid
);
142 hash
->pNext
= FreeHashList
;
145 pdot11Obj
->ExitCS(flags
);
149 void InitHashTbl(void)
153 for (i
=0; i
<MAX_RECORD
; i
++){
159 Hash_t
*HashSearch(MacAddr_t
*pMac
)
166 if (mBssType
== INFRASTRUCTURE_BSS
){
167 if (memcmp(&mBssId
, pMac
, 6) != 0){
174 //HSDEBUG("HashSearch");
175 entry
= GetEntry(pMac
);
176 flags
= pdot11Obj
->EnterCS();
177 if (HashTbl
[entry
] == NULL
) {
181 hash
= HashTbl
[entry
];
183 //to prevent hash->pNext equals to its self
184 if(loopCheck
++ > 100)
186 printk("infinite loop occurs in %s\n", __FUNCTION__
);
191 if (memcmp(hash
->mac
, (U8
*)pMac
, 6) == 0){
192 //HSDEBUG("Search got one");
198 }while(hash
!= NULL
);
202 pdot11Obj
->ExitCS(flags
);
205 printf("macaddr = %02x:%02x:%02x:%02x:%02x:%02x\n",
206 hash
->mac
[0], hash
->mac
[1], hash
->mac
[2],
207 hash
->mac
[3], hash
->mac
[4], hash
->mac
[5]);
208 printf("asoc = %x\n", hash
->asoc
);
209 printf("auth = %x\n", hash
->auth
);
210 printf("psm = %x\n", hash
->psm
);
211 printf("aid = %x\n", hash
->aid
);
212 printf("lsInterval = %x\n", hash
->lsInterval
);
216 ;//HSDEBUG("Search no one");
226 Hash_t
*HashInsert(MacAddr_t
*pMac
)
232 HSDEBUG("HashInsert");
234 if (mBssType
== INFRASTRUCTURE_BSS
){
236 memcpy(hash
->mac
, (U8
*)pMac
, 6);
237 hash
->ttl
= HW_GetNow(pdot11Obj
);
242 hash
= allocHashBuf();
244 HSDEBUG("No free one");
247 return NULL
; // no free one
250 entry
= GetEntry(pMac
);
251 HSDEBUG_V("entry", entry
);
253 if (HashTbl
[entry
] == NULL
){ //entry is null
254 HashTbl
[entry
] = hash
;
255 HSDEBUG("Entry is null");
257 else{ //insert list head
258 flags
= pdot11Obj
->EnterCS();
259 hash
->pNext
= HashTbl
[entry
];
260 HashTbl
[entry
] = hash
;
261 pdot11Obj
->ExitCS(flags
);
262 HSDEBUG("Insert to list head");
265 memcpy(hash
->mac
, (U8
*)pMac
, 6);
266 hash
->ttl
= HW_GetNow(pdot11Obj
);
273 BOOLEAN
AgeHashTbl(void)
275 U32 now
, ttl
, idleTime
;
276 U8 entry
, firstLayer
;
281 Hash_t
*hash
, *preHash
= NULL
;
284 HSDEBUG("*****AgeHashTbl*****");
285 now
= HW_GetNow(pdot11Obj
);
287 for (i
=1; i
<(MAX_AID
+1); i
++){
288 ttl
= sstByAid
[i
]->ttl
;
290 idleTime
= now
- ttl
;
292 idleTime
= (0xffffffff - ttl
) + now
;
295 if (sstByAid
[i
]->bValid
){
296 if (idleTime
> IDLE_TIMEOUT
){
297 HSDEBUG("*****Age one*****");
299 HSDEBUG_V("now", now
);
300 HSDEBUG_V("ttl", ttl
);
301 HSDEBUG_V("idleTime", idleTime
);
303 pMac
= (MacAddr_t
*)&sstByAid
[i
]->mac
[0];
304 entry
= GetEntry(pMac
);
305 HSDEBUG_V("entry", entry
);
306 hash
= HashTbl
[entry
];
310 if(loopCheck
++ > 100)
312 printk("infinite loop occurs in %s\n", __FUNCTION__
);
317 if (hash
== sstByAid
[i
]){
318 if (firstLayer
== 1){
319 HSDEBUG("*****firstLayer*****");
320 if (hash
->pNext
!= NULL
)
321 HashTbl
[entry
] = hash
->pNext
;
323 HashTbl
[entry
] = NULL
;
326 HSDEBUG("*****Not firstLayer*****");
327 preHash
->pNext
= hash
->pNext
;
329 zd_CmdProcess(CMD_DISASOC
, &hash
->mac
[0], ZD_INACTIVITY
);
338 }while(hash
!= NULL
);
342 if (sstByAid
[i
]->ZydasMode
== 1)
343 mZyDasModeClient
= TRUE
;
345 if (sstByAid
[i
]->bErpSta
== FALSE
&& mMacMode
!= PURE_A_MODE
){
346 pdot11Obj
->ConfigFlag
|= NON_ERP_PRESENT_SET
;
347 pdot11Obj
->ConfigFlag
|= ENABLE_PROTECTION_SET
;
348 if (sstByAid
[i
]->Preamble
== 0){ //long preamble
349 pdot11Obj
->ConfigFlag
|= BARKER_PREAMBLE_SET
;
357 //HSDEBUG_V("ret", ret);
362 void ResetPSMonitor(void)
364 ZDEBUG("ResetPSMonitor");
371 Hash_t
*RxInfoIndicate(MacAddr_t
*sta
, PsMode psm
, U8 rate
)
375 ZDEBUG("RxInfoIndicate");
380 pHash
= HashSearch(sta
);
382 if (mBssType
== PSEUDO_IBSS
){
383 pHash
= HashInsert(sta
);
387 pHash
->asoc
= STATION_STATE_ASOC
;
388 zd1205_dump_data(" HashInsert macAddr = ", (U8
*)&pHash
->mac
[0], 6);
396 PsMode oldPsm
= pHash
->psm
;
397 StationState asoc
= pHash
->asoc
;
400 if (rate
> pHash
->MaxRate
)
401 pHash
->MaxRate
= rate
;
403 pHash
->RxRate
= rate
;
404 pHash
->ttl
= HW_GetNow(pdot11Obj
);
406 if (mBssType
== AP_BSS
){
407 if (psm
== PSMODE_STA_ACTIVE
){
408 if (oldPsm
== PSMODE_POWER_SAVE
){
410 if (asoc
== STATION_STATE_ASOC
){
418 if (oldPsm
== PSMODE_STA_ACTIVE
){
419 if (asoc
== STATION_STATE_ASOC
){
420 if (mPsStaCnt
< MAX_AID
){
425 else if (oldPsm
== PSMODE_POWER_SAVE
){
426 if (asoc
== STATION_STATE_ASOC
){
441 void RxInfoUpdate(Hash_t
*pHash
, PsMode psm
, U8 rate
)
443 PsMode oldPsm
= pHash
->psm
;
444 StationState asoc
= pHash
->asoc
;
446 if (rate
> pHash
->MaxRate
)
447 pHash
->MaxRate
= rate
;
449 pHash
->RxRate
= rate
;
450 pHash
->ttl
= HW_GetNow(pdot11Obj
);
452 if (psm
== PSMODE_STA_ACTIVE
){
453 if (oldPsm
== PSMODE_POWER_SAVE
){
454 StaWakeup((MacAddr_t
*)pHash
->mac
);
455 if (asoc
== STATION_STATE_ASOC
){
463 if (oldPsm
== PSMODE_STA_ACTIVE
){
464 if (asoc
== STATION_STATE_ASOC
){
465 if (mPsStaCnt
< MAX_AID
){
470 else if (oldPsm
== PSMODE_POWER_SAVE
){
471 if (asoc
== STATION_STATE_ASOC
){
484 BOOLEAN
UpdateStaStatus(MacAddr_t
*sta
, StationState staSte
, U8 vapId
)
489 ZDEBUG("UpdateStaStatus");
491 if (mBssType
== AP_BSS
){
492 pHash
= HashSearch(sta
);
496 if ((STATION_STATE_AUTH_OPEN
== staSte
) || (STATION_STATE_AUTH_KEY
== staSte
)){
497 if ((mCurrConnUser
+ 1) > mLimitedUser
){
502 pHash
= HashInsert(sta
);
511 else if (mBssType
== INFRASTRUCTURE_BSS
){
512 if ((STATION_STATE_AUTH_OPEN
== staSte
) || (STATION_STATE_AUTH_KEY
== staSte
)){
513 CleanupHash(sstByAid
[0]);
514 pHash
= HashInsert(sta
);
516 pHash
= sstByAid
[0]; //use aid = 0 to store AP's info
519 else if (mBssType
== INDEPENDENT_BSS
){
520 pHash
= HashSearch(sta
);
524 pHash
= HashInsert(sta
);
528 zd1205_dump_data(" HashInsert macAddr = ", (U8
*)&pHash
->mac
[0], 6);
536 case STATION_STATE_AUTH_OPEN
:
537 case STATION_STATE_AUTH_KEY
:
538 pHash
->auth
= staSte
;
541 case STATION_STATE_ASOC
:
542 if (mBssType
== AP_BSS
){
543 if (((mCurrConnUser
+ 1) > mLimitedUser
) && (!pHash
->AlreadyIn
)){
547 if (pHash
->psm
== PSMODE_POWER_SAVE
){
554 pHash
->asoc
= STATION_STATE_ASOC
;
555 /*if (!pHash->AlreadyIn){
556 pHash->AlreadyIn = 1;
560 pHash
->asoc
= STATION_STATE_ASOC
;
563 if (mBssType
!= INDEPENDENT_BSS
)
564 CleanupKeyInfo(pHash
);
566 memcpy(&pdot11Obj
->CurrSsid
[0], (U8
*)&mSsid
, mSsid
.buf
[1]+2);
569 case STATION_STATE_NOT_AUTH
:
570 case STATION_STATE_DIS_ASOC
:
571 if (mBssType
== AP_BSS
){
572 if (pHash
->asoc
== STATION_STATE_ASOC
){
573 if (pHash
->psm
== PSMODE_POWER_SAVE
){
574 FlushQ(pPsQ
[pHash
->aid
]);
583 /*if (pHash->AlreadyIn){
584 pHash->AlreadyIn = 0;
590 pHash
->auth
= STATION_STATE_NOT_AUTH
;
591 pHash
->asoc
= STATION_STATE_DIS_ASOC
;
592 CleanupKeyInfo(pHash
);
593 //for Rx-Retry filter
594 HW_CAM_ClearRollTbl(pdot11Obj
, pHash
->aid
);
599 pMac
= (MacAddr_t
*) pHash
->mac
;
600 entry
= GetEntry(pMac
);
601 sta_info
=HashTbl
[entry
];
604 if (memcmp(sta_info
->mac
, pHash
->mac
, 6)==0)
606 HashTbl
[entry
]=sta_info
->pNext
;
611 while (sta_info
->pNext
!= NULL
&& memcmp(sta_info
->pNext
->mac
, pHash
->mac
, 6) != 0)
613 // To prevent self-link
614 if(loopCheck
++ > 100)
616 printk("infinite loop occurs in %s\n", __FUNCTION__
);
621 sta_info
= sta_info
->pNext
;
623 if (sta_info
->pNext
!= NULL
)
626 sta_info1
= sta_info
->pNext
;
627 sta_info
->pNext
= sta_info
->pNext
->pNext
;
628 freeHashBuf(sta_info1
);
632 printk(KERN_DEBUG
"Could not remove STA:" MACSTR
"\n", MAC2STR(pHash
->mac
));
646 void SsInquiry(MacAddr_t
*sta
, StationState
*sst
, StationState
*asst
)
650 *asst
= STATION_STATE_NOT_AUTH
;
651 *sst
= STATION_STATE_DIS_ASOC
;
655 pHash
= HashSearch(sta
);
658 *asst
= STATION_STATE_NOT_AUTH
;
659 *sst
= STATION_STATE_DIS_ASOC
;
663 if ((*asst
== STATION_STATE_AUTH_OPEN
) || (*asst
== STATION_STATE_AUTH_KEY
))
666 *sst
= STATION_STATE_DIS_ASOC
;
673 U16
AIdLookup(MacAddr_t
*sta
)
678 pHash
= HashSearch(sta
);
686 void AssocInfoUpdate(MacAddr_t
*sta
, U8 MaxRate
, U8 lsInterval
, U8 ZydasMode
, U8 Preamble
, BOOLEAN bErpSta
, U8 Burst
, U8 AMSDU
, U8 AMSDU_LEN
, U8 vapId
)
691 ZDEBUG("AssocInfoUpdate");
695 pHash
= HashSearch(sta
);
699 pHash
->MaxRate
= MaxRate
;
700 pHash
->CurrTxRate
= MaxRate
;
701 pHash
->lsInterval
= lsInterval
;
702 pHash
->ZydasMode
= ZydasMode
;
703 pHash
->Preamble
= Preamble
;
704 pHash
->bErpSta
= bErpSta
;
705 pHash
->vapId
= vapId
;
706 #if ZDCONF_LP_SUPPORT == 1
707 pHash
->Turbo_Burst
= Burst
;
708 pHash
->Turbo_AMSDU
= AMSDU
;
709 pHash
->Turbo_AMSDU_LEN
= AMSDU_LEN
;
715 int zd_SetKeyInfo(U8
*addr
, U8 encryMode
, U8 keyLength
, U8 key_id
, U8
*pKeyContent
)
718 MacAddr_t
*sta
= (MacAddr_t
*)addr
;
720 U8 bcAddr
[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
721 U8 ZeroAddr
[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
724 U8 bTxKey
= key_id
& BIT_7
;
725 U8 bClrRollTable
= key_id
& BIT_6
;
726 U8 KeyId
= key_id
& 0xF;
752 { // No entry chance.
753 WPADEBUG("Clear Group key RollTbl (aid0)\n");
754 HW_CAM_ClearRollTbl(pdot11Obj
, 0);//Clear group key.(aid0)
757 if (mWpaBcKeyLen
== keyLength
&& mGkInstalled
== 1)
758 change_enc
= 0; // Nonfirst time group key update.
759 mWpaBcKeyLen
= keyLength
;
763 if (encryMode
== WEP64
|| encryMode
== WEP128
|| encryMode
== WEP256
)
765 if (mOperationMode
!= CAM_AP_VAP
)
769 HW_ConfigDynaKey(pdot11Obj
, 32, &bcAddr
[0], pKeyContent
, keyLength
, encryMode
, change_enc
);
774 HW_CAM_ResetRollTbl(pdot11Obj
);// Reset all.
777 // Also set default key for Multicast case to avoid Tx-underrun.
778 HW_CAM_Write(pdot11Obj
, DEFAULT_ENCRY_TYPE
, encryMode
);
779 HW_ConfigStatKey(pdot11Obj
, pKeyContent
, keyLength
, STA_KEY_START_ADDR
+(KeyId
* 8));
782 HW_ConfigDynaKey(pdot11Obj
, CAM_VAP_START_AID
, (U8
*)&dot11MacAddress
, pKeyContent
, keyLength
, encryMode
,change_enc
);
786 else if (encryMode
== TKIP
)
788 if (mWpaBcKeyLen
== 32)
790 if (mOperationMode
!= CAM_AP_VAP
)
792 //Tmep key(16), Tx Mic Key(8), Rx Mic Key(8)
793 HW_ConfigDynaKey(pdot11Obj
, 32, &bcAddr
[0], pKeyContent
, keyLength
, encryMode
, change_enc
);
794 // Also set default key for Multicast case to avoid Tx-underrun.
795 //if ((mDebugFlag & BIT_1)==0)
797 HW_CAM_Write(pdot11Obj
, DEFAULT_ENCRY_TYPE
, encryMode
);
798 HW_ConfigStatKey(pdot11Obj
, pKeyContent
, keyLength
, STA_KEY_START_ADDR
+(KeyId
* 8));
803 HW_ConfigDynaKey(pdot11Obj
, CAM_VAP_START_AID
, (U8
*)&dot11MacAddress
, pKeyContent
, keyLength
, encryMode
, change_enc
);
805 if (mBssType
== INFRASTRUCTURE_BSS
)
806 MICsetKey(&pKeyContent
[24], &mBcMicKey
); //Tx Mic key
808 MICsetKey(&pKeyContent
[16], &mBcMicKey
);// For Infra-STA mode.
812 else if (encryMode
== AES
)
814 if (mWpaBcKeyLen
== 16)
816 if (mOperationMode
!= CAM_AP_VAP
)
818 HW_ConfigDynaKey(pdot11Obj
, 32, &bcAddr
[0], pKeyContent
, keyLength
, encryMode
, change_enc
);
819 // Also set default key for Multicast case to avoid Tx-underrun.
820 HW_CAM_Write(pdot11Obj
, DEFAULT_ENCRY_TYPE
, encryMode
);
821 HW_ConfigStatKey(pdot11Obj
, pKeyContent
, keyLength
, STA_KEY_START_ADDR
+(KeyId
* 8));
825 HW_ConfigDynaKey(pdot11Obj
, CAM_VAP_START_AID
, (U8
*)&dot11MacAddress
, pKeyContent
, keyLength
, encryMode
, change_enc
);
833 }// End of Group key setting.
835 // Start of Pairwise key setting.
836 pHash
= HashSearch(sta
);
839 if (!memcmp(&sta
->mac
[0], ZeroAddr
, 6))
842 HW_CAM_ResetRollTbl(pdot11Obj
);
845 HW_CAM_UpdateRollTbl(pdot11Obj
,0);//ReEnable group key.
847 if (mBssType
!= INFRASTRUCTURE_BSS
)
849 WPADEBUG("clear all tx key\n");
850 for (i
=0; i
<MAX_RECORD
; i
++)
851 HashBuf
[i
].pkInstalled
=0;
855 WPADEBUG("clear key of aid %d\n",sstByAid
[0]->aid
);
856 sstByAid
[0]->pkInstalled
=0;
862 pHash
->keyLength
= keyLength
;
863 if (pHash
->encryMode
!= encryMode
)
865 pHash
->encryMode
= encryMode
;
868 if (encryMode
!= NO_WEP
)
869 WPADEBUG("********* Set key%s for aid:%d\n",DbgStrEncryType
[encryMode
& 7],aid
);
871 WPADEBUG("********* Clear key for aid:%d\n",aid
);
872 if (encryMode
== NO_WEP
)
873 {// Clear pairwise key
874 pHash
->pkInstalled
= 0;
875 if (mBssType
== INFRASTRUCTURE_BSS
)
876 HW_CAM_ClearRollTbl(pdot11Obj
, 8);
878 HW_CAM_ClearRollTbl(pdot11Obj
, aid
);
880 else if (encryMode
== TKIP
)
882 if (mBssType
== INFRASTRUCTURE_BSS
)
884 // zd1205_dump_data("key:", (u8*)pKeyContent, 32);
885 HW_ConfigDynaKey(pdot11Obj
, 8, addr
, pKeyContent
, 32, encryMode
, change_enc
);
888 HW_ConfigDynaKey(pdot11Obj
, aid
, addr
, pKeyContent
, 32, encryMode
, change_enc
);
890 MICsetKey(&pKeyContent
[16], &pHash
->TxMicKey
);
891 MICsetKey(&pKeyContent
[24], &pHash
->RxMicKey
);
892 pHash
->KeyId
= KeyId
;
893 pHash
->pkInstalled
= 1;
895 else //if (encryMode == AES)
897 if (mBssType
== INFRASTRUCTURE_BSS
)
899 WPADEBUG("********* setAESkey\n");
900 HW_ConfigDynaKey(pdot11Obj
, 8, addr
, pKeyContent
, keyLength
, encryMode
, change_enc
);
903 HW_ConfigDynaKey(pdot11Obj
, aid
, addr
, pKeyContent
, keyLength
, encryMode
, change_enc
);
904 pHash
->KeyId
= KeyId
;
905 pHash
->pkInstalled
= 1;
912 BOOLEAN
zd_GetKeyInfo(U8
*addr
, U8
*encryMode
, U8
*keyLength
, U8
*pKeyContent
)
915 MacAddr_t
*sta
= (MacAddr_t
*)addr
;
917 ZDEBUG("zd_GetKeyInfo");
922 pHash
= HashSearch(sta
);
929 *encryMode
= pHash
->encryMode
;
930 *keyLength
= pHash
->keyLength
;
931 memcpy(pKeyContent
, &pHash
->keyContent
[0], pHash
->keyLength
);
937 * zd_SetKeyContext - Set Key context to CAM (used for WPA/WPA2)
938 * @addr: MAC address of AP we associated with
939 * @encryMode: Encryption mode
940 * @keyLength: Length of key context
942 * @pKeyContent: Context of key
946 int zd_SetKeyContext(U8
*addr
, U8 encryMode
, U8 keyLength
, U8 KeyId
, U8
*pKeyContent
)
951 mWpaBcKeyLen
= keyLength
;
954 if (encryMode
== DYN_KEY_TKIP
) {
955 if (keyLength
== 32) {
956 zd1205_config_dyn_key(encryMode
, pKeyContent
, KeyId
);
957 MICsetKey(&pKeyContent
[24], &mBcMicKey
);
963 else if (encryMode
== DYN_KEY_AES
) {
964 printk(KERN_ERR
"***** set group key ID: %d\n",KeyId
);
965 zd1205_config_dyn_key(encryMode
, pKeyContent
, KeyId
);
970 WPADEBUG("zd_SetKeyContext: encryMode: %d not support\n", encryMode
);
976 pHash
= HashSearch((MacAddr_t
*)addr
);
979 WPADEBUG("Can't find AP's MAC address in the hash table\n");
983 pHash
->encryMode
= encryMode
;
985 if (encryMode
== DYN_KEY_TKIP
) {
986 zd1205_config_dyn_key(encryMode
, pKeyContent
, KeyId
);
988 MICsetKey(&pKeyContent
[16], &pHash
->TxMicKey
);
989 MICsetKey(&pKeyContent
[24], &pHash
->RxMicKey
);
990 pHash
->KeyId
= KeyId
;
991 pHash
->pkInstalled
= 1;
993 else if (encryMode
== DYN_KEY_AES
) {
994 zd1205_config_dyn_key(encryMode
, pKeyContent
, KeyId
);
995 pHash
->KeyId
= KeyId
;
996 pHash
->pkInstalled
= 1;
1000 WPADEBUG("zd_SetKeyContext: encryMode: %d not support\n", encryMode
);
1008 #if defined(PHY_1202)
1009 int zd_GetKeyInfo_ext(U8
*addr
, U8
*encryMode
, U8
*keyLength
, U8
*pKeyContent
, U16 iv16
, U32 iv32
)
1012 MacAddr_t
*sta
= (MacAddr_t
*)addr
;
1014 ZDEBUG("zd_GetKeyInfo_ext");
1019 if (mDynKeyMode
!= DYN_KEY_TKIP
)
1022 pHash
= HashSearch(sta
);
1029 if (pHash
->pkInstalled
== 0)
1032 if ((iv16
== pHash
->RxSeed
.IV16
) && (iv32
== pHash
->RxSeed
.IV32
)){
1033 // iv out of sequence
1034 //FPRINT_V("iv16", iv16);
1035 //FPRINT_V("iv32", iv32);
1039 *encryMode
= pHash
->encryMode
;
1040 *keyLength
= pHash
->keyLength
;
1042 Tkip_phase1_key_mix(iv32
, &pHash
->RxSeed
);
1043 Tkip_phase2_key_mix(iv16
, &pHash
->RxSeed
);
1044 Tkip_getseeds(iv16
, pKeyContent
, &pHash
->RxSeed
);
1045 pHash
->RxSeed
.IV16
= iv16
;
1046 pHash
->RxSeed
.IV32
= iv32
;
1052 int zd_SetTsc(U8
*addr
, U8 KeyId
, U8 direction
, U32 tscHigh
, U16 tscLow
)
1055 MacAddr_t
*sta
= (MacAddr_t
*)addr
;
1057 ZDEBUG("zd_SetTsc");
1062 pHash
= HashSearch(sta
);
1066 pHash
->KeyId
= KeyId
;
1067 if (direction
== 0){ //Tx
1068 pHash
->TxSeed
.IV16
= tscLow
;
1069 pHash
->TxSeed
.IV32
= tscHigh
;
1071 else if (direction
== 1){ //Rx
1072 pHash
->RxSeed
.IV16
= tscLow
;
1073 pHash
->RxSeed
.IV32
= tscHigh
;
1080 int zd_GetTsc(U8
*addr
, U8 KeyId
, U8 direction
, U32
*tscHigh
, U16
*tscLow
)
1083 MacAddr_t
*sta
= (MacAddr_t
*)addr
;
1085 ZDEBUG("zd_GetTsc");
1090 pHash
= HashSearch(sta
);
1094 if (direction
== 0){ //Tx
1095 *tscLow
= pHash
->TxSeed
.IV16
;
1096 *tscHigh
= pHash
->TxSeed
.IV32
;
1098 else if (direction
== 1){ //Rx
1099 *tscLow
= pHash
->RxSeed
.IV16
;
1100 *tscHigh
= pHash
->RxSeed
.IV32
;
1108 BOOLEAN
zd_CheckIvSeq(U8 aid
, U16 iv16
, U32 iv32
)
1110 Hash_t
*pHash
= NULL
;
1115 ZDEBUG("zd_CheckIvSeq");
1117 if (mDynKeyMode
!= DYN_KEY_TKIP
){
1118 FPRINT("Not in DYN_KEY_TKIP mode");
1122 pHash
= sstByAid
[aid
];
1124 FPRINT("zd_CheckIvSeq failed");
1128 if (pHash
->pkInstalled
== 0){
1129 FPRINT("pkInstalled == 0");
1133 oldIv16
= pHash
->RxSeed
.IV16
;
1134 oldIv32
= pHash
->RxSeed
.IV32
;
1137 if ((oldIv16
== iv16
) && (oldIv32
== iv32
)){
1138 // iv out of sequence
1139 FPRINT("iv out of sequence");
1140 FPRINT_V("iv16", iv16
);
1141 FPRINT_V("iv32", iv32
);
1145 #else //If fifo overrun, this will failed
1146 if (iv32
== oldIv32
){
1147 if (iv16
!= oldIv16
+1){
1148 // iv out of sequence
1149 FPRINT("iv out of sequence");
1150 FPRINT_V("iv16", iv16
);
1151 FPRINT_V("iv32", iv32
);
1156 if ((iv16
!= 0) || (oldIv16
!= 0xffff)){
1157 // iv out of sequence
1158 FPRINT("iv out of sequence");
1159 FPRINT_V("iv16", iv16
);
1160 FPRINT_V("iv32", iv32
);
1166 pHash
->RxSeed
.IV16
= iv16
;
1167 pHash
->RxSeed
.IV32
= iv32
;