added 2.6.29.6 aldebaran kernel
[nao-ulib.git] / kernel / 2.6.29.6-aldebaran-rt / drivers / staging / otus / 80211core / coid.c
blob6007f3131f8fcc0ad632ee75a7cc371dec44fce2
1 /*
2 * Copyright (c) 2007-2008 Atheros Communications Inc.
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 /* */
17 /* Module Name : iod.c */
18 /* */
19 /* Abstract */
20 /* This module contains OID functions. */
21 /* */
22 /* NOTES */
23 /* None */
24 /* */
25 /************************************************************************/
26 #include "cprecomp.h"
27 #include "../hal/hpreg.h"
29 /************************************************************************/
30 /* */
31 /* FUNCTION DESCRIPTION zfiWlanQueryMacAddress */
32 /* Query OWN MAC address. */
33 /* */
34 /* INPUTS */
35 /* addr : for return MAC address */
36 /* */
37 /* OUTPUTS */
38 /* None */
39 /* */
40 /* AUTHOR */
41 /* Stephen Chen ZyDAS Technology Corporation 2005.10 */
42 /* */
43 /************************************************************************/
44 void zfiWlanQueryMacAddress(zdev_t* dev, u8_t* addr)
46 u16_t vapId = 0;
47 zmw_get_wlan_dev(dev);
49 vapId = zfwGetVapId(dev);
51 addr[0] = (u8_t)(wd->macAddr[0] & 0xff);
52 addr[1] = (u8_t)(wd->macAddr[0] >> 8);
53 addr[2] = (u8_t)(wd->macAddr[1] & 0xff);
54 addr[3] = (u8_t)(wd->macAddr[1] >> 8);
55 addr[4] = (u8_t)(wd->macAddr[2] & 0xff);
56 if (vapId == 0xffff)
57 addr[5] = (u8_t)(wd->macAddr[2] >> 8);
58 else
60 #ifdef ZM_VAPMODE_MULTILE_SSID
61 addr[5] = (u8_t)(wd->macAddr[2] >> 8); // Multiple SSID
62 #else
63 addr[5] = vapId + 1 + (u8_t)(wd->macAddr[2] >> 8); //VAP
64 #endif
67 return;
70 void zfiWlanQueryBssList(zdev_t* dev, struct zsBssList* pBssList)
72 struct zsBssInfo* pBssInfo;
73 struct zsBssInfo* pDstBssInfo;
74 u8_t i;
75 u8_t* pMemList;
76 u8_t* pMemInfo;
78 zmw_get_wlan_dev(dev);
80 zmw_declare_for_critical_section();
82 pMemList = (u8_t*) pBssList;
83 pMemInfo = pMemList + sizeof(struct zsBssList);
84 pBssList->head = (struct zsBssInfo*) pMemInfo;
86 zmw_enter_critical_section(dev);
88 pBssInfo = wd->sta.bssList.head;
89 pDstBssInfo = (struct zsBssInfo*) pMemInfo;
90 pBssList->bssCount = wd->sta.bssList.bssCount;
92 for( i=0; i<wd->sta.bssList.bssCount; i++ )
94 zfMemoryCopy((u8_t*)pDstBssInfo, (u8_t*)pBssInfo,
95 sizeof(struct zsBssInfo));
97 if ( pBssInfo->next != NULL )
99 pBssInfo = pBssInfo->next;
100 pDstBssInfo->next = pDstBssInfo + 1;
101 pDstBssInfo++;
103 else
105 zm_assert(i==(wd->sta.bssList.bssCount-1));
109 zmw_leave_critical_section(dev);
111 zfScanMgrScanAck(dev);
114 void zfiWlanQueryBssListV1(zdev_t* dev, struct zsBssListV1* bssListV1)
116 struct zsBssInfo* pBssInfo;
117 //struct zsBssInfo* pDstBssInfo;
118 u8_t i, j, bdrop = 0, k = 0, Same_Count = 0;
119 u8_t bssid[6];
120 //u8_t* pMemList;
121 //u8_t* pMemInfo;
122 zmw_get_wlan_dev(dev);
123 zmw_declare_for_critical_section();
125 zmw_enter_critical_section(dev);
127 bssListV1->bssCount = wd->sta.bssList.bssCount;
129 pBssInfo = wd->sta.bssList.head;
130 ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid);
132 for( i=0; i<wd->sta.bssList.bssCount; i++ )
134 bdrop = 0;
135 if ( zfStaIsConnected(dev)
136 && (wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) )
138 for (j = 0; j < 6; j++)
140 if ( pBssInfo->bssid[j] != bssid[j] )
142 break;
146 if ( (j == 6)
147 &&((pBssInfo->ssid[1] == wd->sta.ssidLen) || (pBssInfo->ssid[1] == 0) )&& (pBssInfo->frequency == wd->frequency) )
149 if(pBssInfo->ssid[1] == 0)
150 pBssInfo->ssid[1] = wd->sta.ssidLen;
152 if(Same_Count == 0)
153 {//First meet
154 Same_Count++;
156 else
157 {//same one
158 bdrop = 1;
159 bssListV1->bssCount--;
165 if (bdrop == 0)
167 zfMemoryCopy((u8_t*)(&bssListV1->bssInfo[k]), (u8_t*)pBssInfo,
168 sizeof(struct zsBssInfo));
170 if(Same_Count == 1)
172 zfMemoryCopy(&(bssListV1->bssInfo[k].ssid[2]), wd->sta.ssid, wd->sta.ssidLen);
173 Same_Count++;
176 k++;
179 if ( pBssInfo->next != NULL )
181 pBssInfo = pBssInfo->next;
183 else
185 zm_assert(i==(wd->sta.bssList.bssCount-1));
189 zmw_leave_critical_section(dev);
191 zfScanMgrScanAck(dev);
194 void zfiWlanQueryAdHocCreatedBssDesc(zdev_t* dev, struct zsBssInfo *pBssInfo)
196 zmw_get_wlan_dev(dev);
198 zfMemoryCopy((u8_t *)pBssInfo, (u8_t *)&wd->sta.ibssBssDesc, sizeof(struct zsBssInfo));
201 u8_t zfiWlanQueryAdHocIsCreator(zdev_t* dev)
203 zmw_get_wlan_dev(dev);
205 return wd->sta.ibssBssIsCreator;
208 u32_t zfiWlanQuerySupportMode(zdev_t* dev)
210 zmw_get_wlan_dev(dev);
212 return wd->supportMode;
215 u32_t zfiWlanQueryTransmitPower(zdev_t* dev)
217 zmw_get_wlan_dev(dev);
219 u32_t ret = 0;
221 if (zfStaIsConnected(dev)) {
222 ret = wd->sta.connPowerInHalfDbm;
223 } else {
224 ret = zfHpGetTransmitPower(dev);
227 return ret;
230 /************************************************************************/
231 /* */
232 /* FUNCTION DESCRIPTION zfiWlanFlushBssList */
233 /* Flush BSSID List. */
234 /* */
235 /* INPUTS */
236 /* dev : device pointer */
237 /* */
238 /* OUTPUTS */
239 /* none */
240 /* */
241 /* AUTHOR */
242 /* Stephen Chen Atheros Communications, INC. 2006.12 */
243 /* */
244 /************************************************************************/
245 void zfiWlanFlushBssList(zdev_t* dev)
247 zmw_declare_for_critical_section();
249 zmw_enter_critical_section(dev);
250 /* Call zfBssInfoRefresh() twice to remove all entry */
251 zfBssInfoRefresh(dev, 1);
252 zmw_leave_critical_section(dev);
255 void zfiWlanSetWlanMode(zdev_t* dev, u8_t wlanMode)
257 zmw_get_wlan_dev(dev);
259 zmw_declare_for_critical_section();
261 zmw_enter_critical_section(dev);
262 wd->ws.wlanMode = wlanMode;
263 zmw_leave_critical_section(dev);
266 void zfiWlanSetAuthenticationMode(zdev_t* dev, u8_t authMode)
268 zmw_get_wlan_dev(dev);
270 zmw_declare_for_critical_section();
272 zmw_enter_critical_section(dev);
273 wd->ws.authMode = authMode;
274 zmw_leave_critical_section(dev);
277 void zfiWlanSetWepStatus(zdev_t* dev, u8_t wepStatus)
279 zmw_get_wlan_dev(dev);
281 zmw_declare_for_critical_section();
283 zmw_enter_critical_section(dev);
284 wd->ws.wepStatus = wepStatus;
285 zmw_leave_critical_section(dev);
289 void zfiWlanSetSSID(zdev_t* dev, u8_t* ssid, u8_t ssidLength)
291 u16_t i;
292 zmw_get_wlan_dev(dev);
294 zmw_declare_for_critical_section();
296 if ( ssidLength <= 32 )
298 zmw_enter_critical_section(dev);
300 wd->ws.ssidLen = ssidLength;
301 zfMemoryCopy(wd->ws.ssid, ssid, ssidLength);
303 if ( ssidLength < 32 )
305 wd->ws.ssid[ssidLength] = 0;
308 wd->ws.probingSsidList[0].ssidLen = ssidLength;
309 zfMemoryCopy(wd->ws.probingSsidList[0].ssid, ssid, ssidLength);
310 for (i=1; i<ZM_MAX_PROBE_HIDDEN_SSID_SIZE; i++)
312 wd->ws.probingSsidList[i].ssidLen = 0;
315 zmw_leave_critical_section(dev);
319 void zfiWlanSetFragThreshold(zdev_t* dev, u16_t fragThreshold)
321 zmw_get_wlan_dev(dev);
323 zmw_declare_for_critical_section();
325 zmw_enter_critical_section(dev);
327 if (fragThreshold == 0)
328 { /* fragmentation is disabled */
329 wd->fragThreshold = 32767;
331 else if (fragThreshold < 256)
333 /* Minimum fragment threshold */
334 wd->fragThreshold = 256;
336 else if (fragThreshold > 2346)
338 wd->fragThreshold = 2346;
340 else
342 wd->fragThreshold = fragThreshold & 0xfffe;
345 zmw_leave_critical_section(dev);
348 void zfiWlanSetRtsThreshold(zdev_t* dev, u16_t rtsThreshold)
350 zmw_get_wlan_dev(dev);
352 zmw_declare_for_critical_section();
354 zmw_enter_critical_section(dev);
355 wd->rtsThreshold = rtsThreshold;
356 zmw_leave_critical_section(dev);
359 void zfiWlanSetFrequency(zdev_t* dev, u32_t frequency, u8_t bImmediate)
361 zmw_get_wlan_dev(dev);
363 zmw_declare_for_critical_section();
365 if ( bImmediate )
367 zmw_enter_critical_section(dev);
368 wd->frequency = (u16_t) (frequency/1000);
369 zmw_leave_critical_section(dev);
370 zfCoreSetFrequency(dev, wd->frequency);
372 else
374 zmw_enter_critical_section(dev);
375 if( frequency == 0 )
376 { // Auto select clean channel depend on wireless environment !
377 wd->ws.autoSetFrequency = 0;
379 wd->ws.frequency = (u16_t) (frequency/1000);
380 zmw_leave_critical_section(dev);
384 void zfiWlanSetBssid(zdev_t* dev, u8_t* bssid)
386 u16_t i;
387 zmw_get_wlan_dev(dev);
389 zmw_declare_for_critical_section();
391 zmw_enter_critical_section(dev);
392 for (i=0; i<6; i++)
394 wd->ws.desiredBssid[i] = bssid[i];
396 wd->ws.bDesiredBssid = TRUE;
397 zmw_leave_critical_section(dev);
401 void zfiWlanSetBeaconInterval(zdev_t* dev,
402 u16_t beaconInterval,
403 u8_t bImmediate)
405 zmw_get_wlan_dev(dev);
407 zmw_declare_for_critical_section();
409 if ( bImmediate )
411 zmw_enter_critical_section(dev);
412 wd->beaconInterval = beaconInterval;
413 zmw_leave_critical_section(dev);
415 /* update beacon interval here */
417 else
419 zmw_enter_critical_section(dev);
420 wd->ws.beaconInterval = beaconInterval;
421 zmw_leave_critical_section(dev);
426 void zfiWlanSetDtimCount(zdev_t* dev, u8_t dtim)
428 zmw_get_wlan_dev(dev);
430 zmw_declare_for_critical_section();
432 zmw_enter_critical_section(dev);
433 if (dtim > 0)
435 wd->ws.dtim = dtim;
437 zmw_leave_critical_section(dev);
441 void zfiWlanSetAtimWindow(zdev_t* dev, u16_t atimWindow, u8_t bImmediate)
443 zmw_get_wlan_dev(dev);
445 zmw_declare_for_critical_section();
447 if ( bImmediate )
449 zmw_enter_critical_section(dev);
450 wd->sta.atimWindow = atimWindow;
451 zmw_leave_critical_section(dev);
453 /* atim window here */
455 else
457 zmw_enter_critical_section(dev);
458 wd->ws.atimWindow = atimWindow;
459 zmw_leave_critical_section(dev);
464 void zfiWlanSetEncryMode(zdev_t* dev, u8_t encryMode)
466 zmw_get_wlan_dev(dev);
468 zmw_declare_for_critical_section();
470 zmw_enter_critical_section(dev);
471 if (wd->wlanMode == ZM_MODE_AP)
473 /* Hostapd Issue */
474 if ((wd->ws.encryMode != ZM_AES) && (wd->ws.encryMode != ZM_TKIP))
475 wd->ws.encryMode = encryMode;
477 else
478 wd->ws.encryMode = encryMode;
479 zmw_leave_critical_section(dev);
482 void zfiWlanSetDefaultKeyId(zdev_t* dev, u8_t keyId)
484 zmw_get_wlan_dev(dev);
486 wd->sta.keyId = keyId;
489 u8_t zfiWlanQueryIsPKInstalled(zdev_t *dev, u8_t *staMacAddr)
491 u8_t isInstalled = 0;
493 #if 1
494 //#ifdef ZM_ENABLE_IBSS_WPA2PSK
495 u8_t res, peerIdx;
497 zmw_get_wlan_dev(dev);
499 zmw_declare_for_critical_section();
501 zmw_enter_critical_section(dev);
502 res = zfStaFindOppositeByMACAddr(dev, (u16_t *)staMacAddr, &peerIdx);
503 if( res == 0 )
505 isInstalled = wd->sta.oppositeInfo[peerIdx].pkInstalled;
507 zmw_leave_critical_section(dev);
508 //#endif
509 #endif
511 return isInstalled;
514 u8_t zfiWlanSetKey(zdev_t* dev, struct zsKeyInfo keyInfo)
516 u16_t broadcast[3] = {0xffff, 0xffff, 0xffff};
517 u32_t* key;
518 u8_t encryMode = ZM_NO_WEP;
519 #ifdef ZM_ENABLE_IBSS_WPA2PSK
520 u8_t encryType = ZM_NO_WEP;
521 #endif
522 u8_t micKey[16];
523 u16_t id = 0;
524 u8_t vapId, i, addr[6];
525 u8_t userIdx=0;
527 #ifdef ZM_ENABLE_IBSS_WPA2PSK
528 /* Determine opposite exist or not */
529 u8_t res, peerIdx;
530 // u8_t userIdx=0;
532 zmw_get_wlan_dev(dev);
534 if ( wd->sta.ibssWpa2Psk == 1 )
536 zmw_enter_critical_section(dev);
537 res = zfStaFindOppositeByMACAddr(dev, (u16_t*)keyInfo.macAddr, &peerIdx);
538 if( res == 0 )
540 userIdx = peerIdx;
541 if ( wd->sta.oppositeInfo[userIdx].camIdx == 0xff )
542 wd->sta.oppositeInfo[userIdx].camIdx = userIdx;
544 zmw_leave_critical_section(dev);
546 #else
547 zmw_get_wlan_dev(dev);
548 #endif
550 if ( keyInfo.flag & ZM_KEY_FLAG_AUTHENTICATOR )
551 { /* set key by authenticator */
552 /* set pairwise key */
553 if (keyInfo.flag & ZM_KEY_FLAG_PK)
555 /* Find STA's information */
556 if ((id = zfApFindSta(dev, keyInfo.macAddr)) == 0xffff)
558 /* Can't STA in the staTable */
559 return ZM_STATUS_FAILURE;
562 wd->ap.staTable[id].iv16 = 0;
563 wd->ap.staTable[id].iv32 = 0;
565 if (keyInfo.keyLength == 32)
566 { /* TKIP */
567 //u8_t KeyRsc[6] = {0, 0, 0, 0, 0, 0};
569 /* In the current AP mode, we set KeyRsc to zero */
570 //zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
571 // &(wd->ap.staTable[id].txSeed), KeyRsc);
572 //zfTkipInit(keyInfo.key, (u8_t*) keyInfo.macAddr,
573 // &(wd->ap.staTable[id].rxSeed), KeyRsc);
574 #ifdef ZM_ENABLE_CENC
575 if (keyInfo.flag & ZM_KEY_FLAG_CENC)
577 zm_debug_msg0("Set CENC pairwise Key");
579 wd->ap.staTable[id].encryMode = ZM_CENC;
581 /* Reset txiv and rxiv */
582 wd->ap.staTable[id].txiv[0] = 0x5c365c37;
583 wd->ap.staTable[id].txiv[1] = 0x5c365c36;
584 wd->ap.staTable[id].txiv[2] = 0x5c365c36;
585 wd->ap.staTable[id].txiv[3] = 0x5c365c36;
587 wd->ap.staTable[id].rxiv[0] = 0x5c365c36;
588 wd->ap.staTable[id].rxiv[1] = 0x5c365c36;
589 wd->ap.staTable[id].rxiv[2] = 0x5c365c36;
590 wd->ap.staTable[id].rxiv[3] = 0x5c365c36;
592 /* Set Key Index */
593 wd->ap.staTable[id].cencKeyIdx = keyInfo.keyIndex;
595 //zfCoreSetKey(dev, id+1, 1, ZM_CENC, (u16_t *)keyInfo.macAddr,
596 // (u32_t*) &keyInfo.key[16]);
598 else
599 #endif //ZM_ENABLE_CENC
601 wd->ap.staTable[id].encryMode = ZM_TKIP;
603 zfMemoryCopy(micKey, &keyInfo.key[16], 8);
604 zfMemoryCopy(&micKey[8], &keyInfo.key[24], 8);
606 //zfCoreSetKey(dev, id+1, 1, ZM_TKIP, (u16_t *)keyInfo.macAddr,
607 // (u32_t*) micKey);
609 /* For fragmentation, we use software MIC */
610 zfMemoryCopy((u8_t *)&(wd->ap.staTable[id].txMicKey), &(keyInfo.key[16]), 8);
611 zfMemoryCopy((u8_t *)&(wd->ap.staTable[id].rxMicKey), &(keyInfo.key[24]), 8);
615 else if (keyInfo.keyLength == 16)
616 { /* AES */
617 wd->ap.staTable[id].encryMode = ZM_AES;
619 else if (keyInfo.keyLength == 0)
621 /* Clear Key Info */
622 zfApClearStaKey(dev, (u16_t *)keyInfo.macAddr);
624 return ZM_STATUS_SUCCESS;
626 else
628 return ZM_STATUS_FAILURE;
631 //zfCoreSetKey(dev, id+1, 0, wd->ap.staTable[id].encryMode,
632 // (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
633 zfHpSetApPairwiseKey(dev, (u16_t *)keyInfo.macAddr,
634 wd->ap.staTable[id].encryMode, (u32_t*) keyInfo.key,
635 (u32_t*) &keyInfo.key[16], id+1);
636 wd->ap.staTable[id].keyIdx = id + 1 + 4;
638 else if (keyInfo.flag & ZM_KEY_FLAG_GK)
640 vapId = keyInfo.vapId;
642 wd->ap.iv16[vapId] = 0;
643 wd->ap.iv32[vapId] = 0;
645 if (keyInfo.keyLength == 32)
646 { /* TKIP */
647 //u8_t KeyRsc[6] = {0, 0, 0, 0, 0, 0};
649 //zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
650 // &(wd->ap.bcSeed), KeyRsc);
651 #ifdef ZM_ENABLE_CENC
652 if (keyInfo.flag & ZM_KEY_FLAG_CENC)
654 encryMode = ZM_CENC;
655 zm_debug_msg0("Set CENC group Key");
657 /* Reset txiv and rxiv */
658 wd->ap.txiv[vapId][0] = 0x5c365c36;
659 wd->ap.txiv[vapId][1] = 0x5c365c36;
660 wd->ap.txiv[vapId][2] = 0x5c365c36;
661 wd->ap.txiv[vapId][3] = 0x5c365c36;
663 //zfCoreSetKey(dev, 0, 1, ZM_CENC, keyInfo.vapAddr,
664 // (u32_t*) &keyInfo.key[16]);
665 key = (u32_t*) keyInfo.key;
667 else
668 #endif //ZM_ENABLE_CENC
670 encryMode = ZM_TKIP;
671 key = (u32_t *)keyInfo.key;
673 /* set MIC key to HMAC */
674 //zfCoreSetKey(dev, 0, 1, ZM_TKIP, broadcast,
675 // (u32_t*) (&keyInfo.key[16]));
676 //zfCoreSetKey(dev, 0, 1, ZM_TKIP, keyInfo.vapAddr,
677 // (u32_t*) (&keyInfo.key[16]));
679 zfMicSetKey(&(keyInfo.key[16]), &(wd->ap.bcMicKey[0]));
680 key = (u32_t*) keyInfo.key;
683 else if (keyInfo.keyLength == 16)
684 { /* AES */
685 encryMode = ZM_AES;
686 key = (u32_t *)keyInfo.key;
687 zm_debug_msg0("CWY - Set AES Group Key");
689 else if (keyInfo.keyLength == 0)
691 /* Clear Key Info */
692 zfApClearStaKey(dev, broadcast);
694 /* Turn off WEP bit in the capability field */
695 wd->ap.capab[vapId] &= 0xffef;
697 return ZM_STATUS_SUCCESS;
699 else
700 { /* WEP */
701 if (keyInfo.keyLength == 5)
703 encryMode = ZM_WEP64;
705 else if (keyInfo.keyLength == 13)
707 encryMode = ZM_WEP128;
709 else if (keyInfo.keyLength == 29)
711 encryMode = ZM_WEP256;
714 key = (u32_t*) keyInfo.key;
717 // Modification for CAM not support VAP search
718 //zfCoreSetKey(dev, 0, 0, encryMode, broadcast, key);
719 //zfCoreSetKey(dev, 0, 0, encryMode, wd->macAddr, key);
720 //zfCoreSetKey(dev, 0, 0, encryMode, keyInfo.vapAddr, key);
721 zfHpSetApGroupKey(dev, wd->macAddr, encryMode,
722 key, (u32_t*) &keyInfo.key[16], vapId);
724 //zfiWlanSetEncryMode(dev, encryMode);
725 wd->ws.encryMode = encryMode;
727 /* set the multicast address encryption type */
728 wd->ap.encryMode[vapId] = encryMode;
730 /* set the multicast key index */
731 wd->ap.bcKeyIndex[vapId] = keyInfo.keyIndex;
732 wd->ap.bcHalKeyIdx[vapId] = vapId + 60;
734 /* Turn on WEP bit in the capability field */
735 wd->ap.capab[vapId] |= 0x10;
738 else
739 { /* set by supplicant */
741 if ( keyInfo.flag & ZM_KEY_FLAG_PK )
742 { /* set pairwise key */
744 //zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
745 // &wd->sta.txSeed, keyInfo.initIv);
746 //zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
747 // &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
749 #ifdef ZM_ENABLE_IBSS_WPA2PSK
750 if ( wd->sta.ibssWpa2Psk == 1 )
752 /* unicast -- > pairwise key */
753 wd->sta.oppositeInfo[userIdx].iv16 = 0;
754 wd->sta.oppositeInfo[userIdx].iv32 = 0;
756 else
758 wd->sta.iv16 = 0;
759 wd->sta.iv32 = 0;
762 wd->sta.oppositeInfo[userIdx].pkInstalled = 1;
763 #else
764 wd->sta.iv16 = 0;
765 wd->sta.iv32 = 0;
767 wd->sta.oppositeInfo[userIdx].pkInstalled = 1;
768 #endif
770 if ( keyInfo.keyLength == 32 )
771 { /* TKIP */
772 zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
773 &wd->sta.txSeed, keyInfo.initIv);
774 zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
775 &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
777 #ifdef ZM_ENABLE_CENC
778 if (keyInfo.flag & ZM_KEY_FLAG_CENC)
780 zm_debug_msg0("Set CENC pairwise Key");
782 wd->sta.encryMode = ZM_CENC;
784 /* Reset txiv and rxiv */
785 wd->sta.txiv[0] = 0x5c365c36;
786 wd->sta.txiv[1] = 0x5c365c36;
787 wd->sta.txiv[2] = 0x5c365c36;
788 wd->sta.txiv[3] = 0x5c365c36;
790 wd->sta.rxiv[0] = 0x5c365c37;
791 wd->sta.rxiv[1] = 0x5c365c36;
792 wd->sta.rxiv[2] = 0x5c365c36;
793 wd->sta.rxiv[3] = 0x5c365c36;
795 /* Set Key Index */
796 wd->sta.cencKeyId = keyInfo.keyIndex;
798 //zfCoreSetKey(dev, id+1, 1, ZM_CENC, (u16_t *)keyInfo.macAddr,
799 // (u32_t*) &keyInfo.key[16]);
801 else
802 #endif //ZM_ENABLE_CENC
804 wd->sta.encryMode = ZM_TKIP;
806 //zfCoreSetKey(dev, 0, 1, ZM_TKIP, wd->sta.bssid,
807 // (u32_t*) &keyInfo.key[16]);
809 zfMicSetKey(&keyInfo.key[16], &wd->sta.txMicKey);
810 zfMicSetKey(&keyInfo.key[24],
811 &wd->sta.rxMicKey[keyInfo.keyIndex]);
814 else if ( keyInfo.keyLength == 16 )
815 { /* AES */
816 #ifdef ZM_ENABLE_IBSS_WPA2PSK
817 if ( wd->sta.ibssWpa2Psk == 1 )
819 wd->sta.oppositeInfo[userIdx].encryMode = ZM_AES;
820 encryType = wd->sta.oppositeInfo[userIdx].encryMode;
822 else
824 wd->sta.encryMode = ZM_AES;
825 encryType = wd->sta.encryMode;
827 #else
828 wd->sta.encryMode = ZM_AES;
829 #endif
831 else
833 return ZM_STATUS_FAILURE;
836 /* user 0 */
837 //zfCoreSetKey(dev, 0, 0, wd->sta.encryMode,
838 // wd->sta.bssid, (u32_t*) keyInfo.key);
839 //zfHpSetStaPairwiseKey(dev, wd->sta.bssid, wd->sta.encryMode,
840 // (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
842 #ifdef ZM_ENABLE_IBSS_WPA2PSK
843 if ( (keyInfo.keyLength==16) && (wd->sta.ibssWpa2Psk==1) )
844 { /* If not AES-CCMP and ibss network , use traditional */
845 zfHpSetPerUserKey(dev,
846 userIdx,
847 keyInfo.keyIndex, // key id == 0 ( Pairwise key = 0 )
848 (u8_t*)keyInfo.macAddr, // RX need Source Address ( Address 2 )
849 encryType,
850 // wd->sta.encryMode,
851 (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
853 wd->sta.oppositeInfo[userIdx].wpaState = ZM_STA_WPA_STATE_PK_OK ;
855 else
856 {/* Big Endian and Little Endian Compatibility */
857 for (i = 0; i < 3; i++)
859 addr[2 * i] = wd->sta.bssid[i] & 0xff;
860 addr[2 * i + 1] = wd->sta.bssid[i] >> 8;
862 zfHpSetPerUserKey(dev,
863 ZM_USER_KEY_PK, // user id
864 0, // key id
865 addr,//(u8_t *)wd->sta.bssid,
866 wd->sta.encryMode,
867 (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
869 wd->sta.keyId = 4;
871 #else
872 /* Big Endian and Little Endian Compatibility */
873 for (i = 0; i < 3; i++)
875 addr[2 * i] = wd->sta.bssid[i] & 0xff;
876 addr[2 * i + 1] = wd->sta.bssid[i] >> 8;
878 zfHpSetPerUserKey(dev,
879 ZM_USER_KEY_PK, // user id
880 0, // key id
881 addr,//(u8_t *)wd->sta.bssid,
882 wd->sta.encryMode,
883 (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
885 wd->sta.keyId = 4;
886 #endif
888 wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
890 else if ( keyInfo.flag & ZM_KEY_FLAG_GK )
891 { /* set group key */
893 zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
894 &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
896 if ( keyInfo.keyLength == 32 )
897 { /* TKIP */
898 #ifdef ZM_ENABLE_CENC
899 if (keyInfo.flag & ZM_KEY_FLAG_CENC)
901 encryMode = ZM_CENC;
902 zm_debug_msg0("Set CENC group Key");
904 /* Reset txiv and rxiv */
905 wd->sta.rxivGK[0] = 0x5c365c36;
906 wd->sta.rxivGK[1] = 0x5c365c36;
907 wd->sta.rxivGK[2] = 0x5c365c36;
908 wd->sta.rxivGK[3] = 0x5c365c36;
910 //zfCoreSetKey(dev, 0, 1, ZM_CENC, keyInfo.vapAddr,
911 // (u32_t*) &keyInfo.key[16]);
912 key = (u32_t*) keyInfo.key;
914 else
915 #endif //ZM_ENABLE_CENC
917 encryMode = ZM_TKIP;
918 key = (u32_t*) wd->sta.rxSeed[keyInfo.keyIndex].tk;
920 if ( !(keyInfo.flag & ZM_KEY_FLAG_INIT_IV) )
922 wd->sta.rxSeed[keyInfo.keyIndex].iv16 = 0;
923 wd->sta.rxSeed[keyInfo.keyIndex].iv32 = 0;
926 /* set MIC key to HMAC */
927 //zfCoreSetKey(dev, 8, 1, ZM_TKIP, broadcast,
928 // (u32_t*) (&keyInfo.key[16]));
930 zfMicSetKey(&keyInfo.key[24],
931 &wd->sta.rxMicKey[keyInfo.keyIndex]);
934 else if ( keyInfo.keyLength == 16 )
935 { /* AES */
936 encryMode = ZM_AES;
937 //key = (u32_t*) wd->sta.rxSeed[keyInfo.keyIndex].tk;
939 else
940 { /* WEP */
941 if ( keyInfo.keyLength == 5 )
943 encryMode = ZM_WEP64;
945 else if ( keyInfo.keyLength == 13 )
947 encryMode = ZM_WEP128;
949 else if ( keyInfo.keyLength == 29 )
951 encryMode = ZM_WEP256;
954 key = (u32_t*) keyInfo.key;
957 /* user 8 */
958 //zfCoreSetKey(dev, 8, 0, encryMode, broadcast, key);
959 //zfHpSetStaGroupKey(dev, broadcast, encryMode,
960 // (u32_t*) keyInfo.key, (u32_t*) (&keyInfo.key[16]));
962 #ifdef ZM_ENABLE_IBSS_WPA2PSK
963 if ( (keyInfo.keyLength==16) && (wd->sta.ibssWpa2Psk==1) )
964 {/* If not AES-CCMP and ibss network , use traditional */
965 zfHpSetPerUserKey(dev,
966 userIdx,
967 keyInfo.keyIndex, // key id
968 // (u8_t *)broadcast, // for only 2 stations IBSS netwrl ( A2 )
969 (u8_t*)keyInfo.macAddr, // for multiple ( > 2 ) stations IBSS network ( A2 )
970 encryMode,
971 (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
973 else
975 zfHpSetPerUserKey(dev,
976 ZM_USER_KEY_GK, // user id
977 0, // key id
978 (u8_t *)broadcast,
979 encryMode,
980 (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
982 wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
984 #else
985 zfHpSetPerUserKey(dev,
986 ZM_USER_KEY_GK, // user id
987 0, // key id
988 (u8_t *)broadcast,
989 encryMode,
990 (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
992 wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
993 #endif
995 else
996 { /* legacy WEP */
997 zm_debug_msg0("legacy WEP");
999 if ( keyInfo.keyIndex >= 4 )
1001 return ZM_STATUS_FAILURE;
1004 if ( keyInfo.keyLength == 5 )
1006 zm_debug_msg0("WEP 64");
1008 encryMode = ZM_WEP64;
1010 else if ( keyInfo.keyLength == 13 )
1012 zm_debug_msg0("WEP 128");
1014 encryMode = ZM_WEP128;
1016 else if ( keyInfo.keyLength == 32 )
1018 /* TKIP */
1019 #if 0
1020 // Don't reset the IV since some AP would fail in IV check and drop our connection
1021 if ( wd->sta.wpaState != ZM_STA_WPA_STATE_PK_OK )
1023 wd->sta.iv16 = 0;
1024 wd->sta.iv32 = 0;
1026 #endif
1028 encryMode = ZM_TKIP;
1030 zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
1031 &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
1032 zfMicSetKey(&keyInfo.key[24],
1033 &wd->sta.rxMicKey[keyInfo.keyIndex]);
1035 else if ( keyInfo.keyLength == 16 )
1037 /* AES */
1038 #if 0
1039 // Don't reset the IV since some AP would fail in IV check and drop our connection
1040 if ( wd->sta.wpaState != ZM_STA_WPA_STATE_PK_OK )
1042 /* broadcast -- > group key */
1043 /* Only initialize when set our default key ! */
1044 wd->sta.iv16 = 0;
1045 wd->sta.iv32 = 0;
1047 #endif
1049 encryMode = ZM_AES;
1051 else if ( keyInfo.keyLength == 29 )
1053 zm_debug_msg0("WEP 256");
1055 encryMode = ZM_WEP256;
1056 //zfCoreSetKey(dev, 64, 1, wd->sta.encryMode,
1057 // wd->sta.bssid, (u32_t*) (&keyInfo.key[16]));
1059 else
1061 return ZM_STATUS_FAILURE;
1065 u8_t i;
1067 zm_debug_msg0("key = ");
1068 for(i = 0; i < keyInfo.keyLength; i++)
1070 zm_debug_msg2("", keyInfo.key[i]);
1074 if ( keyInfo.flag & ZM_KEY_FLAG_DEFAULT_KEY )
1076 //for WEP default key 1~3 and ATOM platform--CWYang(+)
1077 vapId = 0;
1078 wd->ap.bcHalKeyIdx[vapId] = keyInfo.keyIndex;
1079 wd->ap.bcKeyIndex[vapId] = keyInfo.keyIndex;
1080 wd->sta.keyId = keyInfo.keyIndex;
1083 if(encryMode == ZM_TKIP)
1085 if(wd->TKIP_Group_KeyChanging == 0x1)
1087 zm_debug_msg0("Countermeasure : Cancel Old Timer ");
1088 zfTimerCancel(dev, ZM_EVENT_SKIP_COUNTERMEASURE);
1090 else
1092 zm_debug_msg0("Countermeasure : Create New Timer ");
1095 wd->TKIP_Group_KeyChanging = 0x1;
1096 zfTimerSchedule(dev, ZM_EVENT_SKIP_COUNTERMEASURE, 150);
1101 //------------------------------------------------------------------------
1103 /* use default key */
1104 //zfCoreSetKey(dev, ZM_USER_KEY_DEFAULT+keyInfo.keyIndex, 0,
1105 // wd->sta.encryMode, wd->sta.bssid, (u32_t*) keyInfo.key);
1107 if ( encryMode == ZM_TKIP ||
1108 encryMode == ZM_AES )
1110 zfHpSetDefaultKey(dev, keyInfo.keyIndex, encryMode,
1111 (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
1113 #ifdef ZM_ENABLE_IBSS_WPA2PSK
1114 if ( (keyInfo.keyLength==16) && (wd->sta.ibssWpa2Psk==1) )
1115 {/* If not AES-CCMP and ibss network , use traditional */
1116 wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
1118 else
1120 if (wd->sta.wpaState == ZM_STA_WPA_STATE_PK_OK)
1121 wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
1122 else
1124 wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
1125 wd->sta.encryMode = encryMode;
1126 wd->ws.encryMode = encryMode;
1129 #else
1130 if (wd->sta.wpaState == ZM_STA_WPA_STATE_PK_OK)
1131 wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
1132 else if ( wd->sta.wpaState == ZM_STA_WPA_STATE_INIT )
1134 wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
1135 wd->sta.encryMode = encryMode;
1136 wd->ws.encryMode = encryMode;
1138 #endif
1140 else
1142 zfHpSetDefaultKey(dev, keyInfo.keyIndex, encryMode,
1143 (u32_t*) keyInfo.key, NULL);
1145 /* Save key for software WEP */
1146 zfMemoryCopy(wd->sta.wepKey[keyInfo.keyIndex], keyInfo.key,
1147 keyInfo.keyLength);
1149 /* TODO: Check whether we need to save the SWEncryMode */
1150 wd->sta.SWEncryMode[keyInfo.keyIndex] = encryMode;
1152 wd->sta.encryMode = encryMode;
1153 wd->ws.encryMode = encryMode;
1158 // wd->sta.flagKeyChanging = 1;
1159 return ZM_STATUS_SUCCESS;
1162 /* PSEUDO test */
1163 u8_t zfiWlanPSEUDOSetKey(zdev_t* dev, struct zsKeyInfo keyInfo)
1165 //u16_t broadcast[3] = {0xffff, 0xffff, 0xffff};
1166 //u32_t* key;
1167 u8_t micKey[16];
1169 zmw_get_wlan_dev(dev);
1171 switch (keyInfo.keyLength)
1173 case 5:
1174 wd->sta.encryMode = ZM_WEP64;
1175 /* use default key */
1176 zfCoreSetKey(dev, 64, 0, ZM_WEP64, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
1177 break;
1179 case 13:
1180 wd->sta.encryMode = ZM_WEP128;
1181 /* use default key */
1182 zfCoreSetKey(dev, 64, 0, ZM_WEP128, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
1183 break;
1185 case 29:
1186 wd->sta.encryMode = ZM_WEP256;
1187 /* use default key */
1188 zfCoreSetKey(dev, 64, 1, ZM_WEP256, (u16_t *)keyInfo.macAddr, (u32_t*) (&keyInfo.key[16]));
1189 zfCoreSetKey(dev, 64, 0, ZM_WEP256, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
1190 break;
1192 case 16:
1193 wd->sta.encryMode = ZM_AES;
1194 //zfCoreSetKey(dev, 0, 0, ZM_AES, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
1195 zfCoreSetKey(dev, 64, 0, ZM_AES, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
1196 break;
1198 case 32:
1199 #ifdef ZM_ENABLE_CENC
1200 if (keyInfo.flag & ZM_KEY_FLAG_CENC)
1202 u16_t boardcastAddr[3] = {0xffff, 0xffff, 0xffff};
1203 u16_t Addr_a[] = { 0x0000, 0x0080, 0x0901};
1204 u16_t Addr_b[] = { 0x0000, 0x0080, 0x0902};
1205 /* CENC test: user0,1 and user2 for boardcast */
1206 wd->sta.encryMode = ZM_CENC;
1207 zfCoreSetKey(dev, 0, 1, ZM_CENC, (u16_t *)Addr_a, (u32_t*) (&keyInfo.key[16]));
1208 zfCoreSetKey(dev, 0, 0, ZM_CENC, (u16_t *)Addr_a, (u32_t*) keyInfo.key);
1210 zfCoreSetKey(dev, 1, 1, ZM_CENC, (u16_t *)Addr_b, (u32_t*) (&keyInfo.key[16]));
1211 zfCoreSetKey(dev, 1, 0, ZM_CENC, (u16_t *)Addr_b, (u32_t*) keyInfo.key);
1213 zfCoreSetKey(dev, 2, 1, ZM_CENC, (u16_t *)boardcastAddr, (u32_t*) (&keyInfo.key[16]));
1214 zfCoreSetKey(dev, 2, 0, ZM_CENC, (u16_t *)boardcastAddr, (u32_t*) keyInfo.key);
1216 /* Initialize PN sequence */
1217 wd->sta.txiv[0] = 0x5c365c36;
1218 wd->sta.txiv[1] = 0x5c365c36;
1219 wd->sta.txiv[2] = 0x5c365c36;
1220 wd->sta.txiv[3] = 0x5c365c36;
1222 else
1223 #endif //ZM_ENABLE_CENC
1225 wd->sta.encryMode = ZM_TKIP;
1226 zfCoreSetKey(dev, 64, 1, ZM_TKIP, (u16_t *)keyInfo.macAddr, (u32_t*) micKey);
1227 zfCoreSetKey(dev, 64, 0, ZM_TKIP, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
1229 break;
1230 default:
1231 wd->sta.encryMode = ZM_NO_WEP;
1234 return ZM_STATUS_SUCCESS;
1237 void zfiWlanSetPowerSaveMode(zdev_t* dev, u8_t mode)
1239 #if 0
1240 zmw_get_wlan_dev(dev);
1242 wd->sta.powerSaveMode = mode;
1244 /* send null data with PwrBit to inform AP */
1245 if ( mode > ZM_STA_PS_NONE )
1247 if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
1249 zfSendNullData(dev, 1);
1252 /* device into PS mode */
1253 zfPSDeviceSleep(dev);
1255 #endif
1257 zfPowerSavingMgrSetMode(dev, mode);
1260 void zfiWlanSetMacAddress(zdev_t* dev, u16_t* mac)
1262 zmw_get_wlan_dev(dev);
1264 wd->macAddr[0] = mac[0];
1265 wd->macAddr[1] = mac[1];
1266 wd->macAddr[2] = mac[2];
1268 zfHpSetMacAddress(dev, mac, 0);
1271 u8_t zfiWlanQueryWlanMode(zdev_t* dev)
1273 zmw_get_wlan_dev(dev);
1275 return wd->wlanMode;
1278 u8_t zfiWlanQueryAdapterState(zdev_t* dev)
1280 zmw_get_wlan_dev(dev);
1282 return wd->state;
1285 u8_t zfiWlanQueryAuthenticationMode(zdev_t* dev, u8_t bWrapper)
1287 u8_t authMode;
1289 zmw_get_wlan_dev(dev);
1291 if ( bWrapper )
1293 authMode = wd->ws.authMode;
1295 else
1297 //authMode = wd->sta.authMode;
1298 authMode = wd->sta.currentAuthMode;
1301 return authMode;
1304 u8_t zfiWlanQueryWepStatus(zdev_t* dev, u8_t bWrapper)
1306 u8_t wepStatus;
1308 zmw_get_wlan_dev(dev);
1310 if ( bWrapper )
1312 wepStatus = wd->ws.wepStatus;
1314 else
1316 wepStatus = wd->sta.wepStatus;
1319 return wepStatus;
1322 void zfiWlanQuerySSID(zdev_t* dev, u8_t* ssid, u8_t* pSsidLength)
1324 u16_t vapId = 0;
1325 zmw_get_wlan_dev(dev);
1327 if (wd->wlanMode == ZM_MODE_AP)
1329 vapId = zfwGetVapId(dev);
1331 if (vapId == 0xffff)
1333 *pSsidLength = wd->ap.ssidLen[0];
1334 zfMemoryCopy(ssid, wd->ap.ssid[0], wd->ap.ssidLen[0]);
1336 else
1338 *pSsidLength = wd->ap.ssidLen[vapId + 1];
1339 zfMemoryCopy(ssid, wd->ap.ssid[vapId + 1], wd->ap.ssidLen[vapId + 1]);
1342 else
1344 *pSsidLength = wd->sta.ssidLen;
1345 zfMemoryCopy(ssid, wd->sta.ssid, wd->sta.ssidLen);
1349 u16_t zfiWlanQueryFragThreshold(zdev_t* dev)
1351 zmw_get_wlan_dev(dev);
1353 return wd->fragThreshold;
1356 u16_t zfiWlanQueryRtsThreshold(zdev_t* dev)
1358 zmw_get_wlan_dev(dev);
1360 return wd->rtsThreshold;
1363 u32_t zfiWlanQueryFrequency(zdev_t* dev)
1365 zmw_get_wlan_dev(dev);
1367 return (wd->frequency*1000);
1370 /***********************************************************
1371 * Function: zfiWlanQueryCurrentFrequency
1372 * Return value:
1373 * - 0 : no validate current frequency
1374 * - (>0): current frequency depend on "qmode"
1375 * Input:
1376 * - qmode:
1377 * 0: return value depend on the support mode, this
1378 qmode is use to solve the bug #31223
1379 * 1: return the actually current frequency
1380 ***********************************************************/
1381 u32_t zfiWlanQueryCurrentFrequency(zdev_t* dev, u8_t qmode)
1383 u32_t frequency;
1385 zmw_get_wlan_dev(dev);
1387 switch (qmode)
1389 case 0:
1390 if (wd->sta.currentFrequency > 3000)
1392 if (wd->supportMode & ZM_WIRELESS_MODE_5)
1394 frequency = wd->sta.currentFrequency;
1396 else if (wd->supportMode & ZM_WIRELESS_MODE_24)
1398 frequency = zfChGetFirst2GhzChannel(dev);
1400 else
1402 frequency = 0;
1405 else
1407 if (wd->supportMode & ZM_WIRELESS_MODE_24)
1409 frequency = wd->sta.currentFrequency;
1411 else if (wd->supportMode & ZM_WIRELESS_MODE_5)
1413 frequency = zfChGetLast5GhzChannel(dev);
1415 else
1417 frequency = 0;
1420 break;
1422 case 1:
1423 frequency = wd->sta.currentFrequency;
1424 break;
1426 default:
1427 frequency = 0;
1430 return (frequency*1000);
1433 u32_t zfiWlanQueryFrequencyAttribute(zdev_t* dev, u32_t freq)
1435 zmw_get_wlan_dev(dev);
1437 u8_t i;
1438 u16_t frequency = (u16_t) (freq/1000);
1439 u32_t ret = 0;
1441 for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
1443 if ( wd->regulationTable.allowChannel[i].channel == frequency )
1445 ret = wd->regulationTable.allowChannel[i].channelFlags;
1449 return ret;
1452 /* BandWidth 0=>20 1=>40 */
1453 /* ExtOffset 0=>20 1=>high control 40 3=>low control 40 */
1454 void zfiWlanQueryFrequencyHT(zdev_t* dev, u32_t *bandWidth, u32_t *extOffset)
1456 zmw_get_wlan_dev(dev);
1458 *bandWidth = wd->BandWidth40;
1459 *extOffset = wd->ExtOffset;
1462 u8_t zfiWlanQueryCWMode(zdev_t* dev)
1464 zmw_get_wlan_dev(dev);
1466 return wd->cwm.cw_mode;
1469 u32_t zfiWlanQueryCWEnable(zdev_t* dev)
1471 zmw_get_wlan_dev(dev);
1473 return wd->cwm.cw_enable;
1476 void zfiWlanQueryBssid(zdev_t* dev, u8_t* bssid)
1478 u8_t addr[6];
1480 zmw_get_wlan_dev(dev);
1482 ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, addr);
1483 zfMemoryCopy(bssid, addr, 6);
1486 u16_t zfiWlanQueryBeaconInterval(zdev_t* dev)
1488 zmw_get_wlan_dev(dev);
1490 return wd->beaconInterval;
1493 u32_t zfiWlanQueryRxBeaconTotal(zdev_t* dev)
1495 zmw_get_wlan_dev(dev);
1496 wd->sta.rxBeaconTotal += wd->sta.rxBeaconCount;
1498 return wd->sta.rxBeaconTotal;
1501 u16_t zfiWlanQueryAtimWindow(zdev_t* dev)
1503 u16_t atimWindow;
1505 zmw_get_wlan_dev(dev);
1507 atimWindow = wd->sta.atimWindow;
1509 return atimWindow;
1512 u8_t zfiWlanQueryEncryMode(zdev_t* dev)
1514 zmw_get_wlan_dev(dev);
1516 if (wd->wlanMode == ZM_MODE_AP)
1517 return wd->ap.encryMode[0];
1518 else
1519 return wd->sta.encryMode;
1522 u16_t zfiWlanQueryCapability(zdev_t* dev)
1524 u16_t capability;
1526 zmw_get_wlan_dev(dev);
1528 capability = wd->sta.capability[0] +
1529 (((u16_t) wd->sta.capability[1]) << 8);
1531 return capability;
1535 u16_t zfiWlanQueryAid(zdev_t* dev)
1537 zmw_get_wlan_dev(dev);
1539 return wd->sta.aid;
1542 void zfiWlanQuerySupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength)
1544 u8_t i, j=0;
1546 zmw_get_wlan_dev(dev);
1548 for( i=0; i<4; i++ )
1550 if ( wd->bRate & (0x1 << i) )
1552 rateArray[j] = zg11bRateTbl[i] +
1553 ((wd->bRateBasic & (0x1<<i))<<(7-i));
1554 j++;
1558 *pLength = j;
1561 void zfiWlanQueryExtSupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength)
1563 u8_t i, j=0;
1565 zmw_get_wlan_dev(dev);
1567 for( i=0; i<8; i++ )
1569 if ( wd->gRate & (0x1 << i) )
1571 rateArray[j] = zg11gRateTbl[i] +
1572 ((wd->gRateBasic & (0x1<<i))<<(7-i));
1573 j++;
1577 *pLength = j;
1580 void zfiWlanQueryRsnIe(zdev_t* dev, u8_t* ie, u8_t* pLength)
1582 u8_t len;
1584 zmw_get_wlan_dev(dev);
1586 len = wd->sta.rsnIe[1] + 2;
1587 zfMemoryCopy(ie, wd->sta.rsnIe, len);
1588 *pLength = len;
1591 void zfiWlanQueryWpaIe(zdev_t* dev, u8_t* ie, u8_t* pLength)
1593 u8_t len;
1595 zmw_get_wlan_dev(dev);
1597 len = wd->sta.wpaIe[1] + 2;
1598 zfMemoryCopy(ie, wd->sta.wpaIe, len);
1599 *pLength = len;
1603 u8_t zfiWlanQueryMulticastCipherAlgo(zdev_t *dev)
1605 zmw_get_wlan_dev(dev);
1607 switch( wd->sta.currentAuthMode )
1609 case ZM_AUTH_MODE_WPA2PSK:
1610 case ZM_AUTH_MODE_WPA2:
1611 if ( wd->sta.rsnIe[7] == 2 )
1613 return ZM_TKIP;
1615 else
1617 return ZM_AES;
1619 break;
1621 case ZM_AUTH_MODE_WPAPSK:
1622 case ZM_AUTH_MODE_WPA:
1623 if ( wd->sta.rsnIe[11] == 2 )
1625 return ZM_TKIP;
1627 else
1629 return ZM_AES;
1631 break;
1633 default:
1634 return wd->sta.encryMode;
1638 u8_t zfiWlanQueryHTMode(zdev_t* dev)
1640 zmw_get_wlan_dev(dev);
1641 // 0:Legancy, 1:N
1642 return wd->sta.EnableHT;
1645 u8_t zfiWlanQueryBandWidth40(zdev_t* dev)
1647 zmw_get_wlan_dev(dev);
1648 // 0:20M, 1:40M
1649 return wd->BandWidth40;
1652 u16_t zfiWlanQueryRegionCode(zdev_t* dev)
1654 zmw_get_wlan_dev(dev);
1656 return wd->regulationTable.regionCode;
1658 void zfiWlanSetWpaIe(zdev_t* dev, u8_t* ie, u8_t Length)
1660 u16_t vapId = 0;
1661 zmw_get_wlan_dev(dev);
1663 if (wd->wlanMode == ZM_MODE_AP) // AP Mode
1665 vapId = zfwGetVapId(dev);
1667 if (vapId == 0xffff)
1668 vapId = 0;
1669 else
1670 vapId++;
1672 zm_assert(Length < ZM_MAX_WPAIE_SIZE);
1673 if (Length < ZM_MAX_WPAIE_SIZE)
1675 wd->ap.wpaLen[vapId] = Length;
1676 zfMemoryCopy(wd->ap.wpaIe[vapId], ie, wd->ap.wpaLen[vapId]);
1680 else
1682 wd->sta.wpaLen = Length;
1683 zfMemoryCopy(wd->sta.wpaIe, ie, wd->sta.wpaLen);
1685 //zfiWlanSetWpaSupport(dev, 1);
1686 if (wd->wlanMode == ZM_MODE_AP) // AP Mode
1688 wd->ap.wpaSupport[vapId] = 1;
1690 else
1692 wd->sta.wpaSupport = 1;
1697 void zfiWlanSetWpaSupport(zdev_t* dev, u8_t WpaSupport)
1699 u16_t vapId = 0;
1700 zmw_get_wlan_dev(dev);
1702 if (wd->wlanMode == ZM_MODE_AP) // AP Mode
1704 vapId = zfwGetVapId(dev);
1706 if (vapId == 0xffff)
1707 vapId = 0;
1708 else
1709 vapId++;
1711 wd->ap.wpaSupport[vapId] = WpaSupport;
1713 else
1715 wd->sta.wpaSupport = WpaSupport;
1720 void zfiWlanSetProtectionMode(zdev_t* dev, u8_t mode)
1722 zmw_get_wlan_dev(dev);
1724 wd->sta.bProtectionMode = mode;
1725 if (wd->sta.bProtectionMode == TRUE)
1727 zfHpSetSlotTime(dev, 0);
1729 else
1731 zfHpSetSlotTime(dev, 1);
1734 zm_msg1_mm(ZM_LV_1, "wd->protectionMode=", wd->sta.bProtectionMode);
1737 void zfiWlanSetBasicRate(zdev_t* dev, u8_t bRateSet, u8_t gRateSet,
1738 u32_t nRateSet)
1740 zmw_get_wlan_dev(dev);
1742 wd->ws.bRateBasic = bRateSet;
1743 wd->ws.gRateBasic = gRateSet;
1744 wd->ws.nRateBasic = nRateSet;
1747 void zfiWlanSetBGMode(zdev_t* dev, u8_t mode)
1749 zmw_get_wlan_dev(dev);
1751 wd->ws.bgMode = mode;
1754 void zfiWlanSetpreambleType(zdev_t* dev, u8_t type)
1756 zmw_get_wlan_dev(dev);
1758 wd->ws.preambleType = type;
1761 u8_t zfiWlanQuerypreambleType(zdev_t* dev)
1763 zmw_get_wlan_dev(dev);
1765 return wd->ws.preambleType;
1768 u8_t zfiWlanQueryPowerSaveMode(zdev_t* dev)
1770 zmw_get_wlan_dev(dev);
1772 return wd->sta.powerSaveMode;
1775 u8_t zfiWlanSetPmkidInfo(zdev_t* dev, u16_t* bssid, u8_t* pmkid)
1777 u32_t i;
1779 zmw_get_wlan_dev(dev);
1781 for(i=0; i<wd->sta.pmkidInfo.bssidCount; i++)
1783 if ( zfMemoryIsEqual((u8_t*) wd->sta.pmkidInfo.bssidInfo[i].bssid,
1784 (u8_t*) bssid, 6) )
1786 /* matched */
1787 break;
1791 if ( i < wd->sta.pmkidInfo.bssidCount )
1793 /* overwrite the original one */
1794 zfMemoryCopy(wd->sta.pmkidInfo.bssidInfo[i].pmkid, pmkid, 16);
1796 else
1798 if ( i < ZM_PMKID_MAX_BSS_CNT )
1800 wd->sta.pmkidInfo.bssidInfo[i].bssid[0] = bssid[0];
1801 wd->sta.pmkidInfo.bssidInfo[i].bssid[1] = bssid[1];
1802 wd->sta.pmkidInfo.bssidInfo[i].bssid[2] = bssid[2];
1804 zfMemoryCopy(wd->sta.pmkidInfo.bssidInfo[i].pmkid, pmkid, 16);
1805 wd->sta.pmkidInfo.bssidCount++;
1809 return 0;
1812 u32_t zfiWlanQueryPmkidInfo(zdev_t* dev, u8_t* buf, u32_t len)
1814 //struct zsPmkidInfo* pPmkidInfo = ( struct zsPmkidInfo* ) buf;
1815 u32_t size;
1817 zmw_get_wlan_dev(dev);
1819 size = sizeof(u32_t) +
1820 wd->sta.pmkidInfo.bssidCount * sizeof(struct zsPmkidBssidInfo);
1822 if ( len < size )
1824 return wd->sta.pmkidInfo.bssidCount;
1827 zfMemoryCopy(buf, (u8_t*) &wd->sta.pmkidInfo, (u16_t) size);
1829 return 0;
1832 void zfiWlanSetMulticastList(zdev_t* dev, u8_t size, u8_t* pList)
1834 struct zsMulticastAddr* pMacList = (struct zsMulticastAddr*) pList;
1835 u8_t i;
1836 u8_t bAllMulticast = 0;
1837 //u32_t value;
1839 zmw_get_wlan_dev(dev);
1841 wd->sta.multicastList.size = size;
1842 for(i=0; i<size; i++)
1844 zfMemoryCopy(wd->sta.multicastList.macAddr[i].addr,
1845 pMacList[i].addr, 6);
1848 if ( wd->sta.osRxFilter & ZM_PACKET_TYPE_ALL_MULTICAST )
1849 bAllMulticast = 1;
1850 zfHpSetMulticastList(dev, size, pList, bAllMulticast);
1854 void zfiWlanRemoveKey(zdev_t* dev, u8_t keyType, u8_t keyId)
1856 u16_t fakeMacAddr[3] = {0, 0, 0};
1857 u32_t fakeKey[4] = {0, 0, 0, 0};
1859 zmw_get_wlan_dev(dev);
1861 if ( keyType == 0 )
1863 /* remove WEP key */
1864 zm_debug_msg0("remove WEP key");
1865 zfCoreSetKey(dev, ZM_USER_KEY_DEFAULT+keyId, 0,
1866 ZM_NO_WEP, fakeMacAddr, fakeKey);
1867 wd->sta.encryMode = ZM_NO_WEP;
1869 else if ( keyType == 1 )
1871 /* remove pairwise key */
1872 zm_debug_msg0("remove pairwise key");
1873 zfHpRemoveKey(dev, ZM_USER_KEY_PK);
1874 wd->sta.encryMode = ZM_NO_WEP;
1876 else
1878 /* remove group key */
1879 zm_debug_msg0("remove group key");
1880 zfHpRemoveKey(dev, ZM_USER_KEY_GK);
1885 void zfiWlanQueryRegulationTable(zdev_t* dev, struct zsRegulationTable* pEntry)
1887 zmw_get_wlan_dev(dev);
1889 zfMemoryCopy((u8_t*) pEntry, (u8_t*) &wd->regulationTable,
1890 sizeof(struct zsRegulationTable));
1893 /* parameter "time" is specified in ms */
1894 void zfiWlanSetScanTimerPerChannel(zdev_t* dev, u16_t time)
1896 zmw_get_wlan_dev(dev);
1898 zm_debug_msg1("scan time (ms) = ", time);
1900 wd->sta.activescanTickPerChannel = time / ZM_MS_PER_TICK;
1903 void zfiWlanSetAutoReconnect(zdev_t* dev, u8_t enable)
1905 zmw_get_wlan_dev(dev);
1907 wd->sta.bAutoReconnect = enable;
1908 //wd->sta.bAutoReconnectEnabled = enable;
1911 void zfiWlanSetStaWme(zdev_t* dev, u8_t enable, u8_t uapsdInfo)
1913 zmw_get_wlan_dev(dev);
1915 wd->ws.staWmeEnabled = enable & 0x3;
1916 if ((enable & 0x2) != 0)
1918 wd->ws.staWmeQosInfo = uapsdInfo & 0x6f;
1920 else
1922 wd->ws.staWmeQosInfo = 0;
1926 void zfiWlanSetApWme(zdev_t* dev, u8_t enable)
1928 zmw_get_wlan_dev(dev);
1930 wd->ws.apWmeEnabled = enable;
1933 u8_t zfiWlanQuerywmeEnable(zdev_t* dev)
1935 zmw_get_wlan_dev(dev);
1937 return wd->ws.staWmeEnabled;
1940 void zfiWlanSetProbingHiddenSsid(zdev_t* dev, u8_t* ssid, u8_t ssidLen,
1941 u16_t entry)
1943 zmw_get_wlan_dev(dev);
1944 zmw_declare_for_critical_section();
1947 if ((ssidLen <= 32) && (entry < ZM_MAX_PROBE_HIDDEN_SSID_SIZE))
1949 zmw_enter_critical_section(dev);
1950 wd->ws.probingSsidList[entry].ssidLen = ssidLen;
1951 zfMemoryCopy(wd->ws.probingSsidList[entry].ssid, ssid, ssidLen);
1952 zmw_leave_critical_section(dev);
1955 return;
1958 void zfiWlanSetDisableProbingWithSsid(zdev_t* dev, u8_t mode)
1960 zmw_get_wlan_dev(dev);
1962 wd->sta.disableProbingWithSsid = mode;
1964 return;
1967 void zfiWlanSetDropUnencryptedPackets(zdev_t* dev, u8_t enable)
1969 zmw_get_wlan_dev(dev);
1971 wd->ws.dropUnencryptedPkts = enable;
1974 void zfiWlanSetStaRxSecurityCheckCb(zdev_t* dev, zfpStaRxSecurityCheckCb pStaRxSecurityCheckCb)
1976 zmw_get_wlan_dev(dev);
1978 wd->sta.pStaRxSecurityCheckCb = pStaRxSecurityCheckCb;
1981 void zfiWlanSetIBSSJoinOnly(zdev_t* dev, u8_t joinOnly)
1983 zmw_get_wlan_dev(dev);
1985 wd->ws.ibssJoinOnly = joinOnly;
1988 /************************************************************************/
1989 /* */
1990 /* FUNCTION DESCRIPTION zfiConfigWdsPort */
1991 /* Configure WDS port. */
1992 /* */
1993 /* INPUTS */
1994 /* dev : device pointer */
1995 /* wdsPortId : WDS port ID, start from 0 */
1996 /* flag : 0=>disable WDS port, 1=>enable WDS port */
1997 /* wdsAddr : WDS neighbor MAC address */
1998 /* encType : encryption type for WDS port */
1999 /* wdsKey : encryption key for WDS port */
2000 /* */
2001 /* OUTPUTS */
2002 /* Error code */
2003 /* */
2004 /* AUTHOR */
2005 /* Stephen Chen ZyDAS Technology Corporation 2006.6 */
2006 /* */
2007 /************************************************************************/
2008 u16_t zfiConfigWdsPort(zdev_t* dev, u8_t wdsPortId, u16_t flag, u16_t* wdsAddr,
2009 u16_t encType, u32_t* wdsKey)
2011 u16_t addr[3];
2012 u32_t key[4];
2014 zmw_get_wlan_dev(dev);
2016 if (wdsPortId > ZM_MAX_WDS_SUPPORT)
2018 return ZM_ERR_WDS_PORT_ID;
2021 if (flag == 1)
2023 /* Enable WDS port */
2024 wd->ap.wds.macAddr[wdsPortId][0] = wdsAddr[0];
2025 wd->ap.wds.macAddr[wdsPortId][1] = wdsAddr[1];
2026 wd->ap.wds.macAddr[wdsPortId][2] = wdsAddr[2];
2028 wd->ap.wds.wdsBitmap |= (1 << wdsPortId);
2029 wd->ap.wds.encryMode[wdsPortId] = (u8_t) encType;
2031 zfCoreSetKey(dev, 10+ZM_MAX_WDS_SUPPORT, 0, (u8_t) encType, wdsAddr, wdsKey);
2033 else
2035 /* Disable WDS port */
2036 addr[0] = addr[1] = addr[2] = 0;
2037 key[0] = key[1] = key[2] = key[3] = 0;
2038 wd->ap.wds.wdsBitmap &= (~(1 << wdsPortId));
2039 zfCoreSetKey(dev, 10+ZM_MAX_WDS_SUPPORT, 0, ZM_NO_WEP, addr, key);
2042 return ZM_SUCCESS;
2044 #ifdef ZM_ENABLE_CENC
2045 /* CENC */
2046 void zfiWlanQueryGSN(zdev_t* dev, u8_t *gsn, u16_t vapId)
2048 //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
2049 u32_t txiv[4];
2050 zmw_get_wlan_dev(dev);
2052 /* convert little endian to big endian for 32 bits */
2053 txiv[3] = wd->ap.txiv[vapId][0];
2054 txiv[2] = wd->ap.txiv[vapId][1];
2055 txiv[1] = wd->ap.txiv[vapId][2];
2056 txiv[0] = wd->ap.txiv[vapId][3];
2058 zfMemoryCopy(gsn, (u8_t*)txiv, 16);
2060 #endif //ZM_ENABLE_CENC
2061 //CWYang(+)
2062 void zfiWlanQuerySignalInfo(zdev_t* dev, u8_t *buffer)
2064 zmw_get_wlan_dev(dev);
2066 /*Change Signal Strength/Quality Value to Human Sense Here*/
2068 buffer[0] = wd->SignalStrength;
2069 buffer[1] = wd->SignalQuality;
2072 /* OS-XP */
2073 u16_t zfiStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType)
2075 return zfStaAddIeWpaRsn(dev, buf, offset, frameType);
2078 /* zfiDebugCmd */
2079 /* cmd value-description */
2080 /* 0 schedule timer */
2081 /* 1 cancel timer */
2082 /* 2 clear timer */
2083 /* 3 test timer */
2084 /* 4 */
2085 /* 5 */
2086 /* 6 checksum test 0/1 */
2087 /* 7 enableProtectionMode */
2088 /* 8 rx packet content dump 0/1 */
2090 u32_t zfiDebugCmd(zdev_t* dev, u32_t cmd, u32_t value)
2092 u16_t event;
2093 u32_t tick;
2094 zmw_get_wlan_dev(dev);
2096 zmw_declare_for_critical_section();
2099 zmw_enter_critical_section(dev);
2101 if ( cmd == 0 )
2102 { /* schedule timer */
2103 event = (u16_t) ((value >> 16) & 0xffff);
2104 tick = value & 0xffff;
2105 zfTimerSchedule(dev, event, tick);
2107 else if ( cmd == 1 )
2108 { /* cancel timer */
2109 event = (u16_t) (value & 0xffff);
2110 zfTimerCancel(dev, event);
2112 else if ( cmd == 2 )
2113 { /* clear timer */
2114 zfTimerClear(dev);
2116 else if ( cmd == 3 )
2117 { /* test timer */
2118 zfTimerSchedule(dev, 1, 500);
2119 zfTimerSchedule(dev, 2, 1000);
2120 zfTimerSchedule(dev, 3, 1000);
2121 zfTimerSchedule(dev, 4, 1000);
2122 zfTimerSchedule(dev, 5, 1500);
2123 zfTimerSchedule(dev, 6, 2000);
2124 zfTimerSchedule(dev, 7, 2200);
2125 zfTimerSchedule(dev, 6, 2500);
2126 zfTimerSchedule(dev, 8, 2800);
2128 else if ( cmd == 4)
2130 zfTimerSchedule(dev, 1, 500);
2131 zfTimerSchedule(dev, 2, 1000);
2132 zfTimerSchedule(dev, 3, 1000);
2133 zfTimerSchedule(dev, 4, 1000);
2134 zfTimerSchedule(dev, 5, 1500);
2135 zfTimerSchedule(dev, 6, 2000);
2136 zfTimerSchedule(dev, 7, 2200);
2137 zfTimerSchedule(dev, 6, 2500);
2138 zfTimerSchedule(dev, 8, 2800);
2139 zfTimerCancel(dev, 1);
2140 zfTimerCancel(dev, 3);
2141 zfTimerCancel(dev, 6);
2143 else if ( cmd == 5 )
2145 wd->sta.keyId = (u8_t) value;
2147 else if ( cmd == 6 )
2149 /* 0: normal 1: always set TCP/UDP checksum zero */
2150 wd->checksumTest = value;
2152 else if ( cmd == 7 )
2154 wd->enableProtectionMode = value;
2155 zm_msg1_mm(ZM_LV_1, "wd->enableProtectionMode=", wd->enableProtectionMode);
2157 else if ( cmd == 8 )
2159 /* rx packet content dump */
2160 if (value)
2162 wd->rxPacketDump = 1;
2164 else
2166 wd->rxPacketDump = 0;
2171 zmw_leave_critical_section(dev);
2173 return 0;
2176 #ifdef ZM_ENABLE_CENC
2177 u8_t zfiWlanSetCencPairwiseKey(zdev_t* dev, u8_t keyid, u32_t *txiv, u32_t *rxiv,
2178 u8_t *key, u8_t *mic)
2180 struct zsKeyInfo keyInfo;
2181 u8_t cencKey[32];
2182 u8_t i;
2183 u16_t macAddr[3];
2185 zmw_get_wlan_dev(dev);
2187 for (i = 0; i < 16; i++)
2188 cencKey[i] = key[i];
2189 for (i = 0; i < 16; i++)
2190 cencKey[i + 16] = mic[i];
2191 keyInfo.key = cencKey;
2192 keyInfo.keyLength = 32;
2193 keyInfo.keyIndex = keyid;
2194 keyInfo.flag = ZM_KEY_FLAG_CENC | ZM_KEY_FLAG_PK;
2195 for (i = 0; i < 3; i++)
2196 macAddr[i] = wd->sta.bssid[i];
2197 keyInfo.macAddr = macAddr;
2199 zfiWlanSetKey(dev, keyInfo);
2201 /* Reset txiv and rxiv */
2202 //wd->sta.txiv[0] = txiv[0];
2203 //wd->sta.txiv[1] = txiv[1];
2204 //wd->sta.txiv[2] = txiv[2];
2205 //wd->sta.txiv[3] = txiv[3];
2207 //wd->sta.rxiv[0] = rxiv[0];
2208 //wd->sta.rxiv[1] = rxiv[1];
2209 //wd->sta.rxiv[2] = rxiv[2];
2210 //wd->sta.rxiv[3] = rxiv[3];
2212 return 0;
2215 u8_t zfiWlanSetCencGroupKey(zdev_t* dev, u8_t keyid, u32_t *rxiv,
2216 u8_t *key, u8_t *mic)
2218 struct zsKeyInfo keyInfo;
2219 u8_t cencKey[32];
2220 u8_t i;
2221 u16_t macAddr[6] = {0xffff, 0xffff, 0xffff};
2223 zmw_get_wlan_dev(dev);
2225 for (i = 0; i < 16; i++)
2226 cencKey[i] = key[i];
2227 for (i = 0; i < 16; i++)
2228 cencKey[i + 16] = mic[i];
2229 keyInfo.key = cencKey;
2230 keyInfo.keyLength = 32;
2231 keyInfo.keyIndex = keyid;
2232 keyInfo.flag = ZM_KEY_FLAG_CENC | ZM_KEY_FLAG_GK;
2233 keyInfo.vapId = 0;
2234 for (i = 0; i < 3; i++)
2235 keyInfo.vapAddr[i] = wd->macAddr[i];
2236 keyInfo.macAddr = macAddr;
2238 zfiWlanSetKey(dev, keyInfo);
2240 /* Reset txiv and rxiv */
2241 wd->sta.rxivGK[0] = ((rxiv[3] >> 24) & 0xFF)
2242 + (((rxiv[3] >> 16) & 0xFF) << 8)
2243 + (((rxiv[3] >> 8) & 0xFF) << 16)
2244 + ((rxiv[3] & 0xFF) << 24);
2245 wd->sta.rxivGK[1] = ((rxiv[2] >> 24) & 0xFF)
2246 + (((rxiv[2] >> 16) & 0xFF) << 8)
2247 + (((rxiv[2] >> 8) & 0xFF) << 16)
2248 + ((rxiv[2] & 0xFF) << 24);
2249 wd->sta.rxivGK[2] = ((rxiv[1] >> 24) & 0xFF)
2250 + (((rxiv[1] >> 16) & 0xFF) << 8)
2251 + (((rxiv[1] >> 8) & 0xFF) << 16)
2252 + ((rxiv[1] & 0xFF) << 24);
2253 wd->sta.rxivGK[3] = ((rxiv[0] >> 24) & 0xFF)
2254 + (((rxiv[0] >> 16) & 0xFF) << 8)
2255 + (((rxiv[0] >> 8) & 0xFF) << 16)
2256 + ((rxiv[0] & 0xFF) << 24);
2258 wd->sta.authMode = ZM_AUTH_MODE_CENC;
2259 wd->sta.currentAuthMode = ZM_AUTH_MODE_CENC;
2261 return 0;
2263 #endif //ZM_ENABLE_CENC
2265 u8_t zfiWlanSetDot11DMode(zdev_t* dev, u8_t mode)
2267 u8_t i;
2269 zmw_get_wlan_dev(dev);
2271 wd->sta.b802_11D = mode;
2272 if (mode) //Enable 802.11d
2274 wd->regulationTable.regionCode = NO_ENUMRD;
2275 for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
2276 wd->regulationTable.allowChannel[i].channelFlags |= ZM_REG_FLAG_CHANNEL_PASSIVE;
2278 else //Disable
2280 for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
2281 wd->regulationTable.allowChannel[i].channelFlags &= ~ZM_REG_FLAG_CHANNEL_PASSIVE;
2284 return 0;
2287 u8_t zfiWlanSetDot11HDFSMode(zdev_t* dev, u8_t mode)
2289 zmw_get_wlan_dev(dev);
2291 //zm_debug_msg0("CWY - Enable 802.11h DFS");
2293 // TODO : DFS Enable in 5250 to 5350 MHz and 5470 to 5725 MHz .
2294 //if ( Adapter->ZD80211HSupport &&
2295 // Adapter->CardSetting.NetworkTypeInUse == Ndis802_11OFDM5 &&
2296 // ((ChannelNo >=52 && ChannelNo <= 64) || //5250~5350 MHZ
2297 // (ChannelNo >=100 && ChannelNo <= 140))) //5470~5725 MHZ
2299 // Adapter->ZD80211HSetting.DFSEnable=TRUE;
2301 //else
2303 // Adapter->ZD80211HSetting.DFSEnable=FALSE;
2306 wd->sta.DFSEnable = mode;
2307 if (mode)
2308 wd->sta.capability[1] |= ZM_BIT_0;
2309 else
2310 wd->sta.capability[1] &= (~ZM_BIT_0);
2312 return 0;
2315 u8_t zfiWlanSetDot11HTPCMode(zdev_t* dev, u8_t mode)
2317 zmw_get_wlan_dev(dev);
2319 // TODO : TPC Enable in 5150~5350 MHz and 5470~5725MHz.
2320 //if ( Adapter->ZD80211HSupport &&
2321 // Adapter->CardSetting.NetworkTypeInUse == Ndis802_11OFDM5 &&
2322 // ((ChannelNo == 36 || ChannelNo == 40 || ChannelNo == 44 || ChannelNo == 48) || //5150~5250 MHZ , Not Japan
2323 // (ChannelNo >=52 && ChannelNo <= 64) || //5250~5350 MHZ
2324 // (ChannelNo >=100 && ChannelNo <= 140))) //5470~5725 MHZ
2326 // Adapter->ZD80211HSetting.TPCEnable=TRUE;
2328 //else
2330 // Adapter->ZD80211HSetting.TPCEnable=FALSE;
2333 wd->sta.TPCEnable = mode;
2334 if (mode)
2335 wd->sta.capability[1] |= ZM_BIT_0;
2336 else
2337 wd->sta.capability[1] &= (~ZM_BIT_0);
2339 return 0;
2342 u8_t zfiWlanSetAniMode(zdev_t* dev, u8_t mode)
2344 zmw_get_wlan_dev(dev);
2346 wd->aniEnable = mode;
2347 if (mode)
2348 zfHpAniAttach(dev);
2350 return 0;
2353 #ifdef ZM_OS_LINUX_FUNC
2354 void zfiWlanShowTally(zdev_t* dev)
2356 zmw_get_wlan_dev(dev);
2358 zm_msg1_mm(ZM_LV_0, "Hw_UnderrunCnt = ", wd->commTally.Hw_UnderrunCnt);
2359 zm_msg1_mm(ZM_LV_0, "Hw_TotalRxFrm = ", wd->commTally.Hw_TotalRxFrm);
2360 zm_msg1_mm(ZM_LV_0, "Hw_CRC32Cnt = ", wd->commTally.Hw_CRC32Cnt);
2361 zm_msg1_mm(ZM_LV_0, "Hw_CRC16Cnt = ", wd->commTally.Hw_CRC16Cnt);
2362 zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_UNI = ", wd->commTally.Hw_DecrypErr_UNI);
2363 zm_msg1_mm(ZM_LV_0, "Hw_RxFIFOOverrun = ", wd->commTally.Hw_RxFIFOOverrun);
2364 zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_Mul = ", wd->commTally.Hw_DecrypErr_Mul);
2365 zm_msg1_mm(ZM_LV_1, "Hw_RetryCnt = ", wd->commTally.Hw_RetryCnt);
2366 zm_msg1_mm(ZM_LV_0, "Hw_TotalTxFrm = ", wd->commTally.Hw_TotalTxFrm);
2367 zm_msg1_mm(ZM_LV_0, "Hw_RxTimeOut = ", wd->commTally.Hw_RxTimeOut);
2368 zm_msg1_mm(ZM_LV_0, "Tx_MPDU = ", wd->commTally.Tx_MPDU);
2369 zm_msg1_mm(ZM_LV_0, "BA_Fail = ", wd->commTally.BA_Fail);
2370 zm_msg1_mm(ZM_LV_0, "Hw_Tx_AMPDU = ", wd->commTally.Hw_Tx_AMPDU);
2371 zm_msg1_mm(ZM_LV_0, "Hw_Tx_MPDU = ", wd->commTally.Hw_Tx_MPDU);
2373 zm_msg1_mm(ZM_LV_1, "Hw_RxMPDU = ", wd->commTally.Hw_RxMPDU);
2374 zm_msg1_mm(ZM_LV_1, "Hw_RxDropMPDU = ", wd->commTally.Hw_RxDropMPDU);
2375 zm_msg1_mm(ZM_LV_1, "Hw_RxDelMPDU = ", wd->commTally.Hw_RxDelMPDU);
2376 zm_msg1_mm(ZM_LV_1, "Hw_RxPhyMiscError = ", wd->commTally.Hw_RxPhyMiscError);
2377 zm_msg1_mm(ZM_LV_1, "Hw_RxPhyXRError = ", wd->commTally.Hw_RxPhyXRError);
2378 zm_msg1_mm(ZM_LV_1, "Hw_RxPhyOFDMError = ", wd->commTally.Hw_RxPhyOFDMError);
2379 zm_msg1_mm(ZM_LV_1, "Hw_RxPhyCCKError = ", wd->commTally.Hw_RxPhyCCKError);
2380 zm_msg1_mm(ZM_LV_1, "Hw_RxPhyHTError = ", wd->commTally.Hw_RxPhyHTError);
2381 zm_msg1_mm(ZM_LV_1, "Hw_RxPhyTotalCount = ", wd->commTally.Hw_RxPhyTotalCount);
2383 if (!((wd->commTally.Tx_MPDU == 0) && (wd->commTally.BA_Fail == 0)))
2385 zm_debug_msg_p("BA Fail Ratio(%) = ", wd->commTally.BA_Fail * 100,
2386 (wd->commTally.BA_Fail + wd->commTally.Tx_MPDU));
2389 if (!((wd->commTally.Hw_Tx_MPDU == 0) && (wd->commTally.Hw_Tx_AMPDU == 0)))
2391 zm_debug_msg_p("Avg Agg Number = ",
2392 wd->commTally.Hw_Tx_MPDU, wd->commTally.Hw_Tx_AMPDU);
2395 #endif
2397 void zfiWlanSetMaxTxPower(zdev_t* dev, u8_t power2, u8_t power5)
2399 zmw_get_wlan_dev(dev);
2401 zmw_declare_for_critical_section();
2403 zmw_enter_critical_section(dev);
2404 wd->maxTxPower2 = power2;
2405 wd->maxTxPower5 = power5;
2406 zmw_leave_critical_section(dev);
2409 void zfiWlanQueryMaxTxPower(zdev_t* dev, u8_t *power2, u8_t *power5)
2411 zmw_get_wlan_dev(dev);
2413 *power2 = wd->maxTxPower2;
2414 *power5 = wd->maxTxPower5;
2417 void zfiWlanSetConnectMode(zdev_t* dev, u8_t mode)
2419 zmw_get_wlan_dev(dev);
2421 zmw_declare_for_critical_section();
2423 zmw_enter_critical_section(dev);
2424 wd->connectMode = mode;
2425 zmw_leave_critical_section(dev);
2428 void zfiWlanSetSupportMode(zdev_t* dev, u32_t mode)
2430 zmw_get_wlan_dev(dev);
2432 zmw_declare_for_critical_section();
2434 zmw_enter_critical_section(dev);
2435 wd->supportMode = mode;
2436 zmw_leave_critical_section(dev);
2439 void zfiWlanSetAdhocMode(zdev_t* dev, u32_t mode)
2441 zmw_get_wlan_dev(dev);
2443 wd->ws.adhocMode = mode;
2446 u32_t zfiWlanQueryAdhocMode(zdev_t* dev, u8_t bWrapper)
2448 u32_t adhocMode;
2450 zmw_get_wlan_dev(dev);
2452 if ( bWrapper )
2454 adhocMode = wd->ws.adhocMode;
2456 else
2458 adhocMode = wd->wfc.bIbssGMode;
2461 return adhocMode;
2465 u8_t zfiWlanSetCountryIsoName(zdev_t* dev, u8_t *countryIsoName, u8_t length)
2467 u8_t buf[5];
2468 zmw_get_wlan_dev(dev);
2470 if (length == 4)
2472 buf[2] = wd->ws.countryIsoName[0] = countryIsoName[2];
2473 buf[3] = wd->ws.countryIsoName[1] = countryIsoName[1];
2474 buf[4] = wd->ws.countryIsoName[2] = countryIsoName[0];
2476 else if (length == 3)
2478 buf[2] = wd->ws.countryIsoName[0] = countryIsoName[1];
2479 buf[3] = wd->ws.countryIsoName[1] = countryIsoName[0];
2480 buf[4] = wd->ws.countryIsoName[2] = '\0';
2482 else
2484 return 1;
2487 return zfHpGetRegulationTablefromISO(dev, buf, length);
2491 const char* zfiWlanQueryCountryIsoName(zdev_t* dev)
2493 zmw_get_wlan_dev(dev);
2495 return wd->ws.countryIsoName;
2500 void zfiWlanSetRegulatory(zdev_t* dev, u8_t CCS, u16_t Code, u8_t bfirstChannel)
2502 zmw_get_wlan_dev(dev);
2504 zmw_declare_for_critical_section();
2506 if (CCS)
2508 /* Reset Regulation Table by Country Code */
2509 zfHpGetRegulationTablefromCountry(dev, Code);
2511 else
2513 /* Reset Regulation Table by Region Code */
2514 zfHpGetRegulationTablefromRegionCode(dev, Code);
2517 if (bfirstChannel) {
2518 zmw_enter_critical_section(dev);
2519 wd->frequency = zfChGetFirstChannel(dev, NULL);
2520 zmw_leave_critical_section(dev);
2521 zfCoreSetFrequency(dev, wd->frequency);
2526 const char* zfiHpGetisoNamefromregionCode(zdev_t* dev, u16_t regionCode)
2528 return zfHpGetisoNamefromregionCode(dev, regionCode);
2531 u16_t zfiWlanChannelToFrequency(zdev_t* dev, u8_t channel)
2533 return zfChNumToFreq(dev, channel, 0);
2536 u8_t zfiWlanFrequencyToChannel(zdev_t* dev, u16_t freq)
2538 u8_t is5GBand = 0;
2540 return zfChFreqToNum(freq, &is5GBand);
2543 void zfiWlanDisableDfsChannel(zdev_t* dev, u8_t disableFlag)
2545 zfHpDisableDfsChannel(dev, disableFlag);
2546 return;
2549 void zfiWlanSetLEDCtrlParam(zdev_t* dev, u8_t type, u8_t flag)
2551 zmw_get_wlan_dev(dev);
2553 zmw_declare_for_critical_section();
2555 zmw_enter_critical_section(dev);
2556 wd->ledStruct.LEDCtrlType = type;
2557 wd->ledStruct.LEDCtrlFlagFromReg = flag;
2558 zmw_leave_critical_section(dev);
2561 void zfiWlanEnableLeapConfig(zdev_t* dev, u8_t leapEnabled)
2563 zmw_get_wlan_dev(dev);
2565 wd->sta.leapEnabled = leapEnabled;
2568 u32_t zfiWlanQueryHwCapability(zdev_t* dev)
2570 return zfHpCapability(dev);
2573 u32_t zfiWlanQueryReceivedPacket(zdev_t* dev)
2575 zmw_get_wlan_dev(dev);
2577 return wd->sta.ReceivedPktRatePerSecond;
2580 void zfiWlanCheckSWEncryption(zdev_t* dev)
2582 zmw_get_wlan_dev(dev);
2584 if (wd->sta.SWEncryptEnable != 0)
2586 zfHpSWDecrypt(dev, 1);
2590 u16_t zfiWlanQueryAllowChannels(zdev_t* dev, u16_t *channels)
2592 u16_t ii;
2593 zmw_get_wlan_dev(dev);
2595 for (ii = 0; ii < wd->regulationTable.allowChannelCnt; ii++)
2597 channels[ii] = wd->regulationTable.allowChannel[ii].channel;
2600 return wd->regulationTable.allowChannelCnt;
2603 void zfiWlanSetDynamicSIFSParam(zdev_t* dev, u8_t val)
2605 zmw_get_wlan_dev(dev);
2607 wd->dynamicSIFSEnable = val;
2609 zm_debug_msg1("wd->dynamicSIFSEnable = ", wd->dynamicSIFSEnable)
2612 u16_t zfiWlanGetMulticastAddressCount(zdev_t* dev)
2614 zmw_get_wlan_dev(dev);
2616 return wd->sta.multicastList.size;
2619 void zfiWlanGetMulticastList(zdev_t* dev, u8_t* pMCList)
2621 struct zsMulticastAddr* pMacList = (struct zsMulticastAddr*) pMCList;
2622 u8_t i;
2624 zmw_get_wlan_dev(dev);
2626 for ( i=0; i<wd->sta.multicastList.size; i++ )
2628 zfMemoryCopy(pMacList[i].addr, wd->sta.multicastList.macAddr[i].addr, 6);
2632 void zfiWlanSetPacketFilter(zdev_t* dev, u32_t PacketFilter)
2634 u8_t bAllMulticast = 0;
2635 u32_t oldFilter;
2637 zmw_get_wlan_dev(dev);
2639 oldFilter = wd->sta.osRxFilter;
2641 wd->sta.osRxFilter = PacketFilter;
2643 if ((oldFilter & ZM_PACKET_TYPE_ALL_MULTICAST) !=
2644 (wd->sta.osRxFilter & ZM_PACKET_TYPE_ALL_MULTICAST))
2646 if ( wd->sta.osRxFilter & ZM_PACKET_TYPE_ALL_MULTICAST )
2647 bAllMulticast = 1;
2648 zfHpSetMulticastList(dev, wd->sta.multicastList.size,
2649 (u8_t*)wd->sta.multicastList.macAddr, bAllMulticast);
2653 u8_t zfiCompareWithMulticastListAddress(zdev_t* dev, u16_t* dstMacAddr)
2655 u8_t i;
2656 u8_t bIsInMCListAddr = 0;
2658 zmw_get_wlan_dev(dev);
2660 for ( i=0; i<wd->sta.multicastList.size; i++ )
2662 if ( zfwMemoryIsEqual((u8_t*)dstMacAddr, (u8_t*)wd->sta.multicastList.macAddr[i].addr, 6) )
2664 bIsInMCListAddr = 1;
2665 break;
2669 return bIsInMCListAddr;
2672 void zfiWlanSetSafeModeEnabled(zdev_t* dev, u8_t safeMode)
2674 zmw_get_wlan_dev(dev);
2676 wd->sta.bSafeMode = safeMode;
2678 if ( safeMode )
2679 zfStaEnableSWEncryption(dev, 1);
2680 else
2681 zfStaDisableSWEncryption(dev);
2684 void zfiWlanSetIBSSAdditionalIELength(zdev_t* dev, u32_t ibssAdditionalIESize, u8_t* ibssAdditionalIE)
2686 zmw_get_wlan_dev(dev);
2688 if ( ibssAdditionalIESize )
2690 wd->sta.ibssAdditionalIESize = ibssAdditionalIESize;
2691 zfMemoryCopy(wd->sta.ibssAdditionalIE, ibssAdditionalIE, (u16_t)ibssAdditionalIESize);
2693 else
2694 wd->sta.ibssAdditionalIESize = 0;