GUI: Fix Tomato RAF theme for all builds. Compilation typo.
[tomato.git] / release / src-rt-6.x.4708 / linux / linux-2.6.36 / drivers / staging / otus / 80211core / cfunc.c
blob106554b37bdc3e960330f27308afbc365180c354
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.
17 #include "cprecomp.h"
19 u8_t zfQueryOppositeRate(zdev_t* dev, u8_t dst_mac[6], u8_t frameType)
21 zmw_get_wlan_dev(dev);
23 /* For AP's rate adaption */
24 if ( wd->wlanMode == ZM_MODE_AP )
26 return 0;
29 /* For STA's rate adaption */
30 if ( (frameType & 0x0c) == ZM_WLAN_DATA_FRAME )
32 if ( ZM_IS_MULTICAST(dst_mac) )
34 return wd->sta.mTxRate;
36 else
38 return wd->sta.uTxRate;
42 return wd->sta.mmTxRate;
45 void zfCopyToIntTxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* src,
46 u16_t offset, u16_t length)
48 u16_t i;
50 for(i=0; i<length;i++)
52 zmw_tx_buf_writeb(dev, buf, offset+i, src[i]);
56 void zfCopyToRxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* src,
57 u16_t offset, u16_t length)
59 u16_t i;
61 for(i=0; i<length;i++)
63 zmw_rx_buf_writeb(dev, buf, offset+i, src[i]);
67 void zfCopyFromIntTxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* dst,
68 u16_t offset, u16_t length)
70 u16_t i;
72 for(i=0; i<length; i++)
74 dst[i] = zmw_tx_buf_readb(dev, buf, offset+i);
78 void zfCopyFromRxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* dst,
79 u16_t offset, u16_t length)
81 u16_t i;
83 for(i=0; i<length; i++)
85 dst[i] = zmw_rx_buf_readb(dev, buf, offset+i);
89 void zfMemoryCopy(u8_t* dst, u8_t* src, u16_t length)
91 zfwMemoryCopy(dst, src, length);
94 void zfMemoryMove(u8_t* dst, u8_t* src, u16_t length)
96 zfwMemoryMove(dst, src, length);
99 void zfZeroMemory(u8_t* va, u16_t length)
101 zfwZeroMemory(va, length);
104 u8_t zfMemoryIsEqual(u8_t* m1, u8_t* m2, u16_t length)
106 return zfwMemoryIsEqual(m1, m2, length);
109 u8_t zfRxBufferEqualToStr(zdev_t* dev, zbuf_t* buf,
110 const u8_t* str, u16_t offset, u16_t length)
112 u16_t i;
113 u8_t ch;
115 for(i=0; i<length; i++)
117 ch = zmw_rx_buf_readb(dev, buf, offset+i);
118 if ( ch != str[i] )
120 return FALSE;
124 return TRUE;
127 void zfTxBufferCopy(zdev_t*dev, zbuf_t* dst, zbuf_t* src,
128 u16_t dstOffset, u16_t srcOffset, u16_t length)
130 u16_t i;
132 for(i=0; i<length; i++)
134 zmw_tx_buf_writeb(dev, dst, dstOffset+i,
135 zmw_tx_buf_readb(dev, src, srcOffset+i));
139 void zfRxBufferCopy(zdev_t*dev, zbuf_t* dst, zbuf_t* src,
140 u16_t dstOffset, u16_t srcOffset, u16_t length)
142 u16_t i;
144 for(i=0; i<length; i++)
146 zmw_rx_buf_writeb(dev, dst, dstOffset+i,
147 zmw_rx_buf_readb(dev, src, srcOffset+i));
152 void zfCollectHWTally(zdev_t*dev, u32_t* rsp, u8_t id)
154 zmw_get_wlan_dev(dev);
156 zmw_declare_for_critical_section();
158 zmw_enter_critical_section(dev);
160 if (id == 0)
162 wd->commTally.Hw_UnderrunCnt += (0xFFFF & rsp[1]);
163 wd->commTally.Hw_TotalRxFrm += rsp[2];
164 wd->commTally.Hw_CRC32Cnt += rsp[3];
165 wd->commTally.Hw_CRC16Cnt += rsp[4];
166 #ifdef ZM_ENABLE_NATIVE_WIFI
167 /* These code are here to satisfy Vista DTM */
168 wd->commTally.Hw_DecrypErr_UNI += ((rsp[5]>50) && (rsp[5]<60))?50:rsp[5];
169 #else
170 wd->commTally.Hw_DecrypErr_UNI += rsp[5];
171 #endif
172 wd->commTally.Hw_RxFIFOOverrun += rsp[6];
173 wd->commTally.Hw_DecrypErr_Mul += rsp[7];
174 wd->commTally.Hw_RetryCnt += rsp[8];
175 wd->commTally.Hw_TotalTxFrm += rsp[9];
176 wd->commTally.Hw_RxTimeOut +=rsp[10];
178 wd->commTally.Tx_MPDU += rsp[11];
179 wd->commTally.BA_Fail += rsp[12];
180 wd->commTally.Hw_Tx_AMPDU += rsp[13];
181 wd->commTally.Hw_Tx_MPDU += rsp[14];
182 wd->commTally.RateCtrlTxMPDU += rsp[11];
183 wd->commTally.RateCtrlBAFail += rsp[12];
185 else
187 wd->commTally.Hw_RxMPDU += rsp[1];
188 wd->commTally.Hw_RxDropMPDU += rsp[2];
189 wd->commTally.Hw_RxDelMPDU += rsp[3];
191 wd->commTally.Hw_RxPhyMiscError += rsp[4];
192 wd->commTally.Hw_RxPhyXRError += rsp[5];
193 wd->commTally.Hw_RxPhyOFDMError += rsp[6];
194 wd->commTally.Hw_RxPhyCCKError += rsp[7];
195 wd->commTally.Hw_RxPhyHTError += rsp[8];
196 wd->commTally.Hw_RxPhyTotalCount += rsp[9];
199 zmw_leave_critical_section(dev);
201 if (id == 0)
203 zm_msg1_mm(ZM_LV_1, "rsplen =", rsp[0]);
204 zm_msg1_mm(ZM_LV_1, "Hw_UnderrunCnt = ", (0xFFFF & rsp[1]));
205 zm_msg1_mm(ZM_LV_1, "Hw_TotalRxFrm = ", rsp[2]);
206 zm_msg1_mm(ZM_LV_1, "Hw_CRC32Cnt = ", rsp[3]);
207 zm_msg1_mm(ZM_LV_1, "Hw_CRC16Cnt = ", rsp[4]);
208 zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_UNI = ", rsp[5]);
209 zm_msg1_mm(ZM_LV_1, "Hw_RxFIFOOverrun = ", rsp[6]);
210 zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_Mul = ", rsp[7]);
211 zm_msg1_mm(ZM_LV_1, "Hw_RetryCnt = ", rsp[8]);
212 zm_msg1_mm(ZM_LV_1, "Hw_TotalTxFrm = ", rsp[9]);
213 zm_msg1_mm(ZM_LV_1, "Hw_RxTimeOut = ", rsp[10]);
214 zm_msg1_mm(ZM_LV_1, "Tx_MPDU = ", rsp[11]);
215 zm_msg1_mm(ZM_LV_1, "BA_Fail = ", rsp[12]);
216 zm_msg1_mm(ZM_LV_1, "Hw_Tx_AMPDU = ", rsp[13]);
217 zm_msg1_mm(ZM_LV_1, "Hw_Tx_MPDU = ", rsp[14]);
219 else
221 zm_msg1_mm(ZM_LV_1, "rsplen = ", rsp[0]);
222 zm_msg1_mm(ZM_LV_1, "Hw_RxMPDU = ", (0xFFFF & rsp[1]));
223 zm_msg1_mm(ZM_LV_1, "Hw_RxDropMPDU = ", rsp[2]);
224 zm_msg1_mm(ZM_LV_1, "Hw_RxDelMPDU = ", rsp[3]);
225 zm_msg1_mm(ZM_LV_1, "Hw_RxPhyMiscError = ", rsp[4]);
226 zm_msg1_mm(ZM_LV_1, "Hw_RxPhyXRError = ", rsp[5]);
227 zm_msg1_mm(ZM_LV_1, "Hw_RxPhyOFDMError = ", rsp[6]);
228 zm_msg1_mm(ZM_LV_1, "Hw_RxPhyCCKError = ", rsp[7]);
229 zm_msg1_mm(ZM_LV_1, "Hw_RxPhyHTError = ", rsp[8]);
230 zm_msg1_mm(ZM_LV_1, "Hw_RxPhyTotalCount = ", rsp[9]);
235 /* Timer related functions */
236 void zfTimerInit(zdev_t* dev)
238 u8_t i;
240 zmw_get_wlan_dev(dev);
242 zm_debug_msg0("");
244 wd->timerList.freeCount = ZM_MAX_TIMER_COUNT;
245 wd->timerList.head = &(wd->timerList.list[0]);
246 wd->timerList.tail = &(wd->timerList.list[ZM_MAX_TIMER_COUNT-1]);
247 wd->timerList.head->pre = NULL;
248 wd->timerList.head->next = &(wd->timerList.list[1]);
249 wd->timerList.tail->pre = &(wd->timerList.list[ZM_MAX_TIMER_COUNT-2]);
250 wd->timerList.tail->next = NULL;
252 for( i=1; i<(ZM_MAX_TIMER_COUNT-1); i++ )
254 wd->timerList.list[i].pre = &(wd->timerList.list[i-1]);
255 wd->timerList.list[i].next = &(wd->timerList.list[i+1]);
258 wd->bTimerReady = TRUE;
262 u16_t zfTimerSchedule(zdev_t* dev, u16_t event, u32_t tick)
264 struct zsTimerEntry *pFreeEntry;
265 struct zsTimerEntry *pEntry;
266 u8_t i, count;
268 zmw_get_wlan_dev(dev);
270 if ( wd->timerList.freeCount == 0 )
272 zm_debug_msg0("no more timer");
273 return 1;
276 //zm_debug_msg2("event = ", event);
277 //zm_debug_msg1("target tick = ", wd->tick + tick);
279 count = ZM_MAX_TIMER_COUNT - wd->timerList.freeCount;
281 if ( count == 0 )
283 wd->timerList.freeCount--;
284 wd->timerList.head->event = event;
285 wd->timerList.head->timer = wd->tick + tick;
286 //zm_debug_msg1("free timer count = ", wd->timerList.freeCount);
288 return 0;
291 pFreeEntry = wd->timerList.tail;
292 pFreeEntry->timer = wd->tick + tick;
293 pFreeEntry->event = event;
294 wd->timerList.tail = pFreeEntry->pre;
295 pEntry = wd->timerList.head;
297 for( i=0; i<count; i++ )
299 // prevent from the case of tick overflow
300 if ( ( pEntry->timer > pFreeEntry->timer )&&
301 ((pEntry->timer - pFreeEntry->timer) < 1000000000) )
303 if ( i != 0 )
305 pFreeEntry->pre = pEntry->pre;
306 pFreeEntry->pre->next = pFreeEntry;
308 else
310 pFreeEntry->pre = NULL;
313 pEntry->pre = pFreeEntry;
314 pFreeEntry->next = pEntry;
315 break;
318 pEntry = pEntry->next;
321 if ( i == 0 )
323 wd->timerList.head = pFreeEntry;
326 if ( i == count )
328 pFreeEntry->pre = pEntry->pre;
329 pFreeEntry->pre->next = pFreeEntry;
330 pEntry->pre = pFreeEntry;
331 pFreeEntry->next = pEntry;
334 wd->timerList.freeCount--;
335 //zm_debug_msg1("free timer count = ", wd->timerList.freeCount);
337 return 0;
340 u16_t zfTimerCancel(zdev_t* dev, u16_t event)
342 struct zsTimerEntry *pEntry;
343 u8_t i, count;
345 zmw_get_wlan_dev(dev);
347 //zm_debug_msg2("event = ", event);
348 //zm_debug_msg1("free timer count(b) = ", wd->timerList.freeCount);
350 pEntry = wd->timerList.head;
351 count = ZM_MAX_TIMER_COUNT - wd->timerList.freeCount;
353 for( i=0; i<count; i++ )
355 if ( pEntry->event == event )
357 if ( pEntry == wd->timerList.head )
358 { /* remove head entry */
359 wd->timerList.head = pEntry->next;
360 wd->timerList.tail->next = pEntry;
361 pEntry->pre = wd->timerList.tail;
362 wd->timerList.tail = pEntry;
363 pEntry = wd->timerList.head;
365 else
366 { /* remove non-head entry */
367 pEntry->pre->next = pEntry->next;
368 pEntry->next->pre = pEntry->pre;
369 wd->timerList.tail->next = pEntry;
370 pEntry->pre = wd->timerList.tail;
371 wd->timerList.tail = pEntry;
372 pEntry = pEntry->next;
375 wd->timerList.freeCount++;
377 else
379 pEntry = pEntry->next;
383 //zm_debug_msg1("free timer count(a) = ", wd->timerList.freeCount);
385 return 0;
388 void zfTimerClear(zdev_t* dev)
390 zmw_get_wlan_dev(dev);
392 wd->timerList.freeCount = ZM_MAX_TIMER_COUNT;
395 u16_t zfTimerCheckAndHandle(zdev_t* dev)
397 struct zsTimerEntry *pEntry;
398 struct zsTimerEntry *pTheLastEntry = NULL;
399 u16_t event[ZM_MAX_TIMER_COUNT];
400 u8_t i, j=0, count;
402 zmw_get_wlan_dev(dev);
404 zmw_declare_for_critical_section();
406 if ( !wd->bTimerReady )
408 return 0;
411 zmw_enter_critical_section(dev);
413 pEntry = wd->timerList.head;
414 count = ZM_MAX_TIMER_COUNT - wd->timerList.freeCount;
416 for( i=0; i<count; i++ )
418 // prevent from the case of tick overflow
419 if ( ( pEntry->timer > wd->tick )&&
420 ((pEntry->timer - wd->tick) < 1000000000) )
422 break;
425 event[j++] = pEntry->event;
426 pTheLastEntry = pEntry;
427 pEntry = pEntry->next;
430 if ( j > 0 )
432 wd->timerList.tail->next = wd->timerList.head;
433 wd->timerList.head->pre = wd->timerList.tail;
434 wd->timerList.head = pEntry;
435 wd->timerList.tail = pTheLastEntry;
436 wd->timerList.freeCount += j;
437 //zm_debug_msg1("free timer count = ", wd->timerList.freeCount);
440 zmw_leave_critical_section(dev);
442 zfProcessEvent(dev, event, j);
444 return 0;
447 u32_t zfCoreSetKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t type,
448 u16_t* mac, u32_t* key)
450 u32_t ret;
452 zmw_get_wlan_dev(dev);
453 zmw_declare_for_critical_section();
455 zmw_enter_critical_section(dev);
456 wd->sta.flagKeyChanging++;
457 zm_debug_msg1(" zfCoreSetKey++++ ", wd->sta.flagKeyChanging);
458 zmw_leave_critical_section(dev);
460 ret = zfHpSetKey(dev, user, keyId, type, mac, key);
461 return ret;
464 void zfCoreSetKeyComplete(zdev_t* dev)
466 zmw_get_wlan_dev(dev);
467 zmw_declare_for_critical_section();
469 if(wd->sta.flagKeyChanging)
471 zmw_enter_critical_section(dev);
472 wd->sta.flagKeyChanging--;
473 zmw_leave_critical_section(dev);
475 zm_debug_msg1(" zfCoreSetKeyComplete--- ", wd->sta.flagKeyChanging);
477 zfPushVtxq(dev);
480 void zfCoreHalInitComplete(zdev_t* dev)
482 zmw_get_wlan_dev(dev);
483 zmw_declare_for_critical_section();
485 zmw_enter_critical_section(dev);
486 wd->halState = ZM_HAL_STATE_RUNNING;
487 zmw_leave_critical_section(dev);
489 zfPushVtxq(dev);
492 void zfCoreMacAddressNotify(zdev_t* dev, u8_t* addr)
494 zmw_get_wlan_dev(dev);
496 wd->macAddr[0] = addr[0] | ((u16_t)addr[1]<<8);
497 wd->macAddr[1] = addr[2] | ((u16_t)addr[3]<<8);
498 wd->macAddr[2] = addr[4] | ((u16_t)addr[5]<<8);
501 //zfHpSetMacAddress(dev, wd->macAddr, 0);
502 if (wd->zfcbMacAddressNotify != NULL)
504 wd->zfcbMacAddressNotify(dev, addr);
508 void zfCoreSetIsoName(zdev_t* dev, u8_t* isoName)
510 zmw_get_wlan_dev(dev);
512 wd->ws.countryIsoName[0] = isoName[0];
513 wd->ws.countryIsoName[1] = isoName[1];
514 wd->ws.countryIsoName[2] = '\0';
518 extern void zfScanMgrScanEventStart(zdev_t* dev);
519 extern u8_t zfScanMgrScanEventTimeout(zdev_t* dev);
520 extern void zfScanMgrScanEventRetry(zdev_t* dev);
522 void zfProcessEvent(zdev_t* dev, u16_t* eventArray, u8_t eventCount)
524 u8_t i, j, bypass = FALSE;
525 u16_t eventBypass[32];
526 u8_t eventBypassCount = 0;
528 zmw_get_wlan_dev(dev);
530 zmw_declare_for_critical_section();
532 zfZeroMemory((u8_t*) eventBypass, 64);
534 for( i=0; i<eventCount; i++ )
536 for( j=0; j<eventBypassCount; j++ )
538 if ( eventBypass[j] == eventArray[i] )
540 bypass = TRUE;
541 break;
545 if ( bypass )
547 continue;
550 switch( eventArray[i] )
552 case ZM_EVENT_SCAN:
554 zfScanMgrScanEventStart(dev);
555 eventBypass[eventBypassCount++] = ZM_EVENT_IN_SCAN;
556 eventBypass[eventBypassCount++] = ZM_EVENT_TIMEOUT_SCAN;
558 break;
560 case ZM_EVENT_TIMEOUT_SCAN:
562 u8_t res;
564 res = zfScanMgrScanEventTimeout(dev);
565 if ( res == 0 )
567 eventBypass[eventBypassCount++] = ZM_EVENT_TIMEOUT_SCAN;
569 else if ( res == 1 )
571 eventBypass[eventBypassCount++] = ZM_EVENT_IN_SCAN;
574 break;
576 case ZM_EVENT_IBSS_MONITOR:
578 zfStaIbssMonitoring(dev, 0);
580 break;
582 case ZM_EVENT_IN_SCAN:
584 zfScanMgrScanEventRetry(dev);
586 break;
588 case ZM_EVENT_CM_TIMER:
590 zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_TIMER");
592 wd->sta.cmMicFailureCount = 0;
594 break;
596 case ZM_EVENT_CM_DISCONNECT:
598 zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_DISCONNECT");
600 zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT);
602 zmw_enter_critical_section(dev);
603 //zfTimerSchedule(dev, ZM_EVENT_CM_BLOCK_TIMER,
604 // ZM_TICK_CM_BLOCK_TIMEOUT);
606 /* Timer Resolution on WinXP is 15/16 ms */
607 /* Decrease Time offset for <XP> Counter Measure */
608 zfTimerSchedule(dev, ZM_EVENT_CM_BLOCK_TIMER,
609 ZM_TICK_CM_BLOCK_TIMEOUT - ZM_TICK_CM_BLOCK_TIMEOUT_OFFSET);
611 zmw_leave_critical_section(dev);
612 wd->sta.cmMicFailureCount = 0;
613 //zfiWlanDisable(dev);
614 zfHpResetKeyCache(dev);
615 if (wd->zfcbConnectNotify != NULL)
617 wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_DISCONNECT_MIC_FAIL,
618 wd->sta.bssid);
621 break;
623 case ZM_EVENT_CM_BLOCK_TIMER:
625 zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_BLOCK_TIMER");
627 //zmw_enter_critical_section(dev);
628 wd->sta.cmDisallowSsidLength = 0;
629 if ( wd->sta.bAutoReconnect )
631 zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_BLOCK_TIMER:bAutoReconnect!=0");
632 zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
633 zfScanMgrScanStart(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
635 //zmw_leave_critical_section(dev);
637 break;
639 case ZM_EVENT_TIMEOUT_ADDBA:
641 if (!wd->addbaComplete && (wd->addbaCount < 5))
643 zfAggSendAddbaRequest(dev, wd->sta.bssid, 0, 0);
644 wd->addbaCount++;
645 zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_ADDBA, 100);
647 else
649 zfTimerCancel(dev, ZM_EVENT_TIMEOUT_ADDBA);
652 break;
654 #ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
655 case ZM_EVENT_TIMEOUT_PERFORMANCE:
657 zfiPerformanceRefresh(dev);
659 break;
660 #endif
661 case ZM_EVENT_SKIP_COUNTERMEASURE:
662 //enable the Countermeasure
664 zm_debug_msg0("Countermeasure : Enable MIC Check ");
665 wd->TKIP_Group_KeyChanging = 0x0;
667 break;
669 default:
670 break;
675 void zfBssInfoCreate(zdev_t* dev)
677 u8_t i;
679 zmw_get_wlan_dev(dev);
681 zmw_declare_for_critical_section();
683 zmw_enter_critical_section(dev);
685 wd->sta.bssList.bssCount = 0;
686 wd->sta.bssList.head = NULL;
687 wd->sta.bssList.tail = NULL;
688 wd->sta.bssInfoArrayHead = 0;
689 wd->sta.bssInfoArrayTail = 0;
690 wd->sta.bssInfoFreeCount = ZM_MAX_BSS;
692 for( i=0; i< ZM_MAX_BSS; i++ )
694 //wd->sta.bssInfoArray[i] = &(wd->sta.bssInfoPool[i]);
695 wd->sta.bssInfoArray[i] = zfwMemAllocate(dev, sizeof(struct zsBssInfo));
699 zmw_leave_critical_section(dev);
702 void zfBssInfoDestroy(zdev_t* dev)
704 u8_t i;
705 zmw_get_wlan_dev(dev);
707 zfBssInfoRefresh(dev, 1);
709 for( i=0; i< ZM_MAX_BSS; i++ )
711 if (wd->sta.bssInfoArray[i] != NULL)
713 zfwMemFree(dev, wd->sta.bssInfoArray[i], sizeof(struct zsBssInfo));
715 else
717 zm_assert(0);
720 return;
723 struct zsBssInfo* zfBssInfoAllocate(zdev_t* dev)
725 struct zsBssInfo* pBssInfo;
727 zmw_get_wlan_dev(dev);
729 if (wd->sta.bssInfoFreeCount == 0)
730 return NULL;
732 pBssInfo = wd->sta.bssInfoArray[wd->sta.bssInfoArrayHead];
733 wd->sta.bssInfoArray[wd->sta.bssInfoArrayHead] = NULL;
734 wd->sta.bssInfoArrayHead = (wd->sta.bssInfoArrayHead + 1) & (ZM_MAX_BSS - 1);
735 wd->sta.bssInfoFreeCount--;
737 zfZeroMemory((u8_t*)pBssInfo, sizeof(struct zsBssInfo));
739 return pBssInfo;
742 void zfBssInfoFree(zdev_t* dev, struct zsBssInfo* pBssInfo)
744 zmw_get_wlan_dev(dev);
746 zm_assert(wd->sta.bssInfoArray[wd->sta.bssInfoArrayTail] == NULL);
748 pBssInfo->signalStrength = pBssInfo->signalQuality = 0;
749 pBssInfo->sortValue = 0;
751 wd->sta.bssInfoArray[wd->sta.bssInfoArrayTail] = pBssInfo;
752 wd->sta.bssInfoArrayTail = (wd->sta.bssInfoArrayTail + 1) & (ZM_MAX_BSS - 1);
753 wd->sta.bssInfoFreeCount++;
756 void zfBssInfoReorderList(zdev_t* dev)
758 struct zsBssInfo* pBssInfo = NULL;
759 struct zsBssInfo* pInsBssInfo = NULL;
760 struct zsBssInfo* pNextBssInfo = NULL;
761 struct zsBssInfo* pPreBssInfo = NULL;
762 u8_t i = 0;
764 zmw_get_wlan_dev(dev);
766 zmw_declare_for_critical_section();
768 zmw_enter_critical_section(dev);
770 if (wd->sta.bssList.bssCount > 1)
772 pInsBssInfo = wd->sta.bssList.head;
773 wd->sta.bssList.tail = pInsBssInfo;
774 pBssInfo = pInsBssInfo->next;
775 pInsBssInfo->next = NULL;
776 while (pBssInfo != NULL)
778 i = 0;
779 while (1)
781 // if (pBssInfo->signalStrength >= pInsBssInfo->signalStrength)
782 if( pBssInfo->sortValue >= pInsBssInfo->sortValue)
784 if (i==0)
786 //Insert BssInfo to head
787 wd->sta.bssList.head = pBssInfo;
788 pNextBssInfo = pBssInfo->next;
789 pBssInfo->next = pInsBssInfo;
790 break;
792 else
794 //Insert BssInfo to neither head nor tail
795 pPreBssInfo->next = pBssInfo;
796 pNextBssInfo = pBssInfo->next;
797 pBssInfo->next = pInsBssInfo;
798 break;
801 else
803 if (pInsBssInfo->next != NULL)
805 //Signal strength smaller than current BssInfo, check next
806 pPreBssInfo = pInsBssInfo;
807 pInsBssInfo = pInsBssInfo->next;
809 else
811 //Insert BssInfo to tail
812 pInsBssInfo->next = pBssInfo;
813 pNextBssInfo = pBssInfo->next;
814 wd->sta.bssList.tail = pBssInfo;
815 pBssInfo->next = NULL;
816 break;
819 i++;
821 pBssInfo = pNextBssInfo;
822 pInsBssInfo = wd->sta.bssList.head;
824 } //if (wd->sta.bssList.bssCount > 1)
826 zmw_leave_critical_section(dev);
829 void zfBssInfoInsertToList(zdev_t* dev, struct zsBssInfo* pBssInfo)
831 zmw_get_wlan_dev(dev);
833 zm_assert(pBssInfo);
835 //zm_debug_msg2("pBssInfo = ", pBssInfo);
837 if ( wd->sta.bssList.bssCount == 0 )
839 wd->sta.bssList.head = pBssInfo;
840 wd->sta.bssList.tail = pBssInfo;
842 else
844 wd->sta.bssList.tail->next = pBssInfo;
845 wd->sta.bssList.tail = pBssInfo;
848 pBssInfo->next = NULL;
849 wd->sta.bssList.bssCount++;
851 //zm_debug_msg2("bss count = ", wd->sta.bssList.bssCount);
854 void zfBssInfoRemoveFromList(zdev_t* dev, struct zsBssInfo* pBssInfo)
856 struct zsBssInfo* pNowBssInfo;
857 struct zsBssInfo* pPreBssInfo = NULL;
858 u8_t i;
860 zmw_get_wlan_dev(dev);
862 zm_assert(pBssInfo);
863 zm_assert(wd->sta.bssList.bssCount);
865 //zm_debug_msg2("pBssInfo = ", pBssInfo);
867 pNowBssInfo = wd->sta.bssList.head;
869 for( i=0; i<wd->sta.bssList.bssCount; i++ )
871 if ( pNowBssInfo == pBssInfo )
873 if ( i == 0 )
874 { /* remove head */
875 wd->sta.bssList.head = pBssInfo->next;
877 else
879 pPreBssInfo->next = pBssInfo->next;
882 if ( i == (wd->sta.bssList.bssCount - 1) )
883 { /* remove tail */
884 wd->sta.bssList.tail = pPreBssInfo;
887 break;
890 pPreBssInfo = pNowBssInfo;
891 pNowBssInfo = pNowBssInfo->next;
894 zm_assert(i != wd->sta.bssList.bssCount);
895 wd->sta.bssList.bssCount--;
897 //zm_debug_msg2("bss count = ", wd->sta.bssList.bssCount);
900 void zfBssInfoRefresh(zdev_t* dev, u16_t mode)
902 struct zsBssInfo* pBssInfo;
903 struct zsBssInfo* pNextBssInfo;
904 u8_t i, bssCount;
906 zmw_get_wlan_dev(dev);
908 pBssInfo = wd->sta.bssList.head;
909 bssCount = wd->sta.bssList.bssCount;
911 for( i=0; i<bssCount; i++ )
913 if (mode == 1)
915 pNextBssInfo = pBssInfo->next;
916 zfBssInfoRemoveFromList(dev, pBssInfo);
917 zfBssInfoFree(dev, pBssInfo);
918 pBssInfo = pNextBssInfo;
920 else
922 if ( pBssInfo->flag & ZM_BSS_INFO_VALID_BIT )
923 { /* this one must be kept */
924 pBssInfo->flag &= ~ZM_BSS_INFO_VALID_BIT;
925 pBssInfo = pBssInfo->next;
927 else
929 #define ZM_BSS_CACHE_TIME_IN_MS 20000
930 if ((wd->tick - pBssInfo->tick) > (ZM_BSS_CACHE_TIME_IN_MS/ZM_MS_PER_TICK))
932 pNextBssInfo = pBssInfo->next;
933 zfBssInfoRemoveFromList(dev, pBssInfo);
934 zfBssInfoFree(dev, pBssInfo);
935 pBssInfo = pNextBssInfo;
937 else
939 pBssInfo = pBssInfo->next;
943 } //for( i=0; i<bssCount; i++ )
944 return;
947 void zfDumpSSID(u8_t length, u8_t *value)
949 u8_t buf[50];
950 u8_t tmpLength = length;
952 if ( tmpLength > 49 )
954 tmpLength = 49;
957 zfMemoryCopy(buf, value, tmpLength);
958 buf[tmpLength] = '\0';
959 //printk("SSID: %s\n", buf);
960 //zm_debug_msg_s("ssid = ", value);
963 void zfCoreReinit(zdev_t* dev)
965 zmw_get_wlan_dev(dev);
967 wd->sta.flagKeyChanging = 0;
968 wd->sta.flagFreqChanging = 0;
971 void zfGenerateRandomBSSID(zdev_t* dev, u8_t *MACAddr, u8_t *BSSID)
973 //ULONGLONG time;
974 u32_t time;
976 zmw_get_wlan_dev(dev);
978 time = wd->tick;
981 // Initialize the random BSSID to be the same as MAC address.
984 // RtlCopyMemory(BSSID, MACAddr, sizeof(DOT11_MAC_ADDRESS));
985 zfMemoryCopy(BSSID, MACAddr, 6);
988 // Get the system time in 10 millisecond.
991 // NdisGetCurrentSystemTime((PLARGE_INTEGER)&time);
992 // time /= 100000;
995 // Randomize the first 4 bytes of BSSID.
998 BSSID[0] ^= (u8_t)(time & 0xff);
999 BSSID[0] &= ~0x01; // Turn off multicast bit
1000 BSSID[0] |= 0x02; // Turn on local bit
1002 time >>= 8;
1003 BSSID[1] ^= (u8_t)(time & 0xff);
1005 time >>= 8;
1006 BSSID[2] ^= (u8_t)(time & 0xff);
1008 time >>= 8;
1009 BSSID[3] ^= (u8_t)(time & 0xff);
1012 u8_t zfiWlanGetDestAddrFromBuf(zdev_t *dev, zbuf_t *buf, u16_t *macAddr)
1014 #ifdef ZM_ENABLE_NATIVE_WIFI
1015 zmw_get_wlan_dev(dev);
1017 if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
1019 /* DA */
1020 macAddr[0] = zmw_tx_buf_readh(dev, buf, 16);
1021 macAddr[1] = zmw_tx_buf_readh(dev, buf, 18);
1022 macAddr[2] = zmw_tx_buf_readh(dev, buf, 20);
1024 else if ( wd->wlanMode == ZM_MODE_IBSS )
1026 /* DA */
1027 macAddr[0] = zmw_tx_buf_readh(dev, buf, 4);
1028 macAddr[1] = zmw_tx_buf_readh(dev, buf, 6);
1029 macAddr[2] = zmw_tx_buf_readh(dev, buf, 8);
1031 else if ( wd->wlanMode == ZM_MODE_AP )
1033 /* DA */
1034 macAddr[0] = zmw_tx_buf_readh(dev, buf, 4);
1035 macAddr[1] = zmw_tx_buf_readh(dev, buf, 6);
1036 macAddr[2] = zmw_tx_buf_readh(dev, buf, 8);
1038 else
1040 return 1;
1042 #else
1043 /* DA */
1044 macAddr[0] = zmw_tx_buf_readh(dev, buf, 0);
1045 macAddr[1] = zmw_tx_buf_readh(dev, buf, 2);
1046 macAddr[2] = zmw_tx_buf_readh(dev, buf, 4);
1047 #endif
1049 return 0;
1052 /* Leave an empty line below to remove warning message on some compiler */
1054 u16_t zfFindCleanFrequency(zdev_t* dev, u32_t adhocMode)
1056 u8_t i, j;
1057 u16_t returnChannel;
1058 u16_t count_24G = 0, min24GIndex = 0;
1059 u16_t count_5G = 0, min5GIndex = 0;
1060 u16_t CombinationBssNumberIn24G[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
1061 u16_t BssNumberIn24G[17] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
1062 u16_t Array_24G[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
1063 u16_t BssNumberIn5G[31] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
1064 u16_t Array_5G[31] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
1065 struct zsBssInfo* pBssInfo;
1067 zmw_get_wlan_dev(dev);
1069 pBssInfo = wd->sta.bssList.head;
1070 if (pBssInfo == NULL)
1072 if( adhocMode == ZM_ADHOCBAND_B || adhocMode == ZM_ADHOCBAND_G ||
1073 adhocMode == ZM_ADHOCBAND_BG || adhocMode == ZM_ADHOCBAND_ABG )
1075 returnChannel = zfChGetFirst2GhzChannel(dev);
1077 else
1079 returnChannel = zfChGetFirst5GhzChannel(dev);
1082 return returnChannel;
1085 /* #1 Get Allowed Channel following Country Code ! */
1086 zmw_declare_for_critical_section();
1087 zmw_enter_critical_section(dev);
1088 for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
1090 if (wd->regulationTable.allowChannel[i].channel < 3000)
1091 { // 2.4GHz
1092 Array_24G[count_24G] = wd->regulationTable.allowChannel[i].channel;
1093 count_24G++;
1095 else
1096 { // 5GHz
1097 count_5G++;
1098 Array_5G[i] = wd->regulationTable.allowChannel[i].channel;
1101 zmw_leave_critical_section(dev);
1103 while( pBssInfo != NULL )
1105 /* #2_1 Count BSS number in some specificed frequency in 2.4GHz band ! */
1106 if( adhocMode == ZM_ADHOCBAND_B || adhocMode == ZM_ADHOCBAND_G ||
1107 adhocMode == ZM_ADHOCBAND_BG || adhocMode == ZM_ADHOCBAND_ABG )
1109 for( i=0; i<=(count_24G+3); i++ )
1111 if( pBssInfo->frequency == Array_24G[i] )
1112 { // Array_24G[0] correspond to BssNumberIn24G[2]
1113 BssNumberIn24G[pBssInfo->channel+1]++;
1118 /* #2_2 Count BSS number in some specificed frequency in 5GHz band ! */
1119 if( adhocMode == ZM_ADHOCBAND_A || adhocMode == ZM_ADHOCBAND_ABG )
1121 for( i=0; i<count_5G; i++ )
1122 { // 5GHz channel is not equal to array index
1123 if( pBssInfo->frequency == Array_5G[i] )
1124 { // Array_5G[0] correspond to BssNumberIn5G[0]
1125 BssNumberIn5G[i]++;
1130 pBssInfo = pBssInfo->next;
1134 if( adhocMode == ZM_ADHOCBAND_B || adhocMode == ZM_ADHOCBAND_G ||
1135 adhocMode == ZM_ADHOCBAND_BG || adhocMode == ZM_ADHOCBAND_ABG )
1137 /* #3_1 Count BSS number that influence the specificed frequency in 2.4GHz ! */
1138 for( j=0; j<count_24G; j++ )
1140 CombinationBssNumberIn24G[j] = BssNumberIn24G[j] + BssNumberIn24G[j+1] +
1141 BssNumberIn24G[j+2] + BssNumberIn24G[j+3] +
1142 BssNumberIn24G[j+4];
1143 //printk("After combine, the number of BSS network channel %d is %d",
1144 // j , CombinationBssNumberIn24G[j]);
1147 /* #4_1 Find the less utilized frequency in 2.4GHz band ! */
1148 min24GIndex = zfFindMinimumUtilizationChannelIndex(dev, CombinationBssNumberIn24G, count_24G);
1151 /* #4_2 Find the less utilized frequency in 5GHz band ! */
1152 if( adhocMode == ZM_ADHOCBAND_A || adhocMode == ZM_ADHOCBAND_ABG )
1154 min5GIndex = zfFindMinimumUtilizationChannelIndex(dev, BssNumberIn5G, count_5G);
1157 if( adhocMode == ZM_ADHOCBAND_B || adhocMode == ZM_ADHOCBAND_G || adhocMode == ZM_ADHOCBAND_BG )
1159 return Array_24G[min24GIndex];
1161 else if( adhocMode == ZM_ADHOCBAND_A )
1163 return Array_5G[min5GIndex];
1165 else if( adhocMode == ZM_ADHOCBAND_ABG )
1167 if ( CombinationBssNumberIn24G[min24GIndex] <= BssNumberIn5G[min5GIndex] )
1168 return Array_24G[min24GIndex];
1169 else
1170 return Array_5G[min5GIndex];
1172 else
1173 return 2412;
1176 u16_t zfFindMinimumUtilizationChannelIndex(zdev_t* dev, u16_t* array, u16_t count)
1178 u8_t i;
1179 u16_t tempMinIndex, tempMinValue;
1181 i = 1;
1182 tempMinIndex = 0;
1183 tempMinValue = array[tempMinIndex];
1184 while( i< count )
1186 if( array[i] < tempMinValue )
1188 tempMinValue = array[i];
1189 tempMinIndex = i;
1191 i++;
1194 return tempMinIndex;
1197 u8_t zfCompareWithBssid(zdev_t* dev, u16_t* bssid)
1199 zmw_get_wlan_dev(dev);
1201 if ( zfMemoryIsEqual((u8_t*)bssid, (u8_t*)wd->sta.bssid, 6) )
1203 return 1;
1205 else
1207 return 0;