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.
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
)
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
;
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
)
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
)
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
)
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
)
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
)
115 for(i
=0; i
<length
; i
++)
117 ch
= zmw_rx_buf_readb(dev
, buf
, offset
+i
);
127 void zfTxBufferCopy(zdev_t
*dev
, zbuf_t
* dst
, zbuf_t
* src
,
128 u16_t dstOffset
, u16_t srcOffset
, u16_t length
)
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
)
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
);
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];
170 wd
->commTally
.Hw_DecrypErr_UNI
+= rsp
[5];
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];
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
);
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]);
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
)
240 zmw_get_wlan_dev(dev
);
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
;
268 zmw_get_wlan_dev(dev
);
270 if ( wd
->timerList
.freeCount
== 0 )
272 zm_debug_msg0("no more timer");
276 //zm_debug_msg2("event = ", event);
277 //zm_debug_msg1("target tick = ", wd->tick + tick);
279 count
= ZM_MAX_TIMER_COUNT
- wd
->timerList
.freeCount
;
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);
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) )
305 pFreeEntry
->pre
= pEntry
->pre
;
306 pFreeEntry
->pre
->next
= pFreeEntry
;
310 pFreeEntry
->pre
= NULL
;
313 pEntry
->pre
= pFreeEntry
;
314 pFreeEntry
->next
= pEntry
;
318 pEntry
= pEntry
->next
;
323 wd
->timerList
.head
= pFreeEntry
;
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);
340 u16_t
zfTimerCancel(zdev_t
* dev
, u16_t event
)
342 struct zsTimerEntry
*pEntry
;
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
;
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
++;
379 pEntry
= pEntry
->next
;
383 //zm_debug_msg1("free timer count(a) = ", wd->timerList.freeCount);
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
];
402 zmw_get_wlan_dev(dev
);
404 zmw_declare_for_critical_section();
406 if ( !wd
->bTimerReady
)
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) )
425 event
[j
++] = pEntry
->event
;
426 pTheLastEntry
= pEntry
;
427 pEntry
= pEntry
->next
;
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
);
447 u32_t
zfCoreSetKey(zdev_t
* dev
, u8_t user
, u8_t keyId
, u8_t type
,
448 u16_t
* mac
, u32_t
* key
)
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
);
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
);
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
);
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
] )
550 switch( eventArray
[i
] )
554 zfScanMgrScanEventStart(dev
);
555 eventBypass
[eventBypassCount
++] = ZM_EVENT_IN_SCAN
;
556 eventBypass
[eventBypassCount
++] = ZM_EVENT_TIMEOUT_SCAN
;
560 case ZM_EVENT_TIMEOUT_SCAN
:
564 res
= zfScanMgrScanEventTimeout(dev
);
567 eventBypass
[eventBypassCount
++] = ZM_EVENT_TIMEOUT_SCAN
;
571 eventBypass
[eventBypassCount
++] = ZM_EVENT_IN_SCAN
;
576 case ZM_EVENT_IBSS_MONITOR
:
578 zfStaIbssMonitoring(dev
, 0);
582 case ZM_EVENT_IN_SCAN
:
584 zfScanMgrScanEventRetry(dev
);
588 case ZM_EVENT_CM_TIMER
:
590 zm_msg0_mm(ZM_LV_0
, "ZM_EVENT_CM_TIMER");
592 wd
->sta
.cmMicFailureCount
= 0;
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
,
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);
639 case ZM_EVENT_TIMEOUT_ADDBA
:
641 if (!wd
->addbaComplete
&& (wd
->addbaCount
< 5))
643 zfAggSendAddbaRequest(dev
, wd
->sta
.bssid
, 0, 0);
645 zfTimerSchedule(dev
, ZM_EVENT_TIMEOUT_ADDBA
, 100);
649 zfTimerCancel(dev
, ZM_EVENT_TIMEOUT_ADDBA
);
654 #ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
655 case ZM_EVENT_TIMEOUT_PERFORMANCE
:
657 zfiPerformanceRefresh(dev
);
661 case ZM_EVENT_SKIP_COUNTERMEASURE
:
662 //enable the Countermeasure
664 zm_debug_msg0("Countermeasure : Enable MIC Check ");
665 wd
->TKIP_Group_KeyChanging
= 0x0;
675 void zfBssInfoCreate(zdev_t
* dev
)
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
)
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
));
723 struct zsBssInfo
* zfBssInfoAllocate(zdev_t
* dev
)
725 struct zsBssInfo
* pBssInfo
;
727 zmw_get_wlan_dev(dev
);
729 if (wd
->sta
.bssInfoFreeCount
== 0)
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
));
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
;
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
)
781 // if (pBssInfo->signalStrength >= pInsBssInfo->signalStrength)
782 if( pBssInfo
->sortValue
>= pInsBssInfo
->sortValue
)
786 //Insert BssInfo to head
787 wd
->sta
.bssList
.head
= pBssInfo
;
788 pNextBssInfo
= pBssInfo
->next
;
789 pBssInfo
->next
= pInsBssInfo
;
794 //Insert BssInfo to neither head nor tail
795 pPreBssInfo
->next
= pBssInfo
;
796 pNextBssInfo
= pBssInfo
->next
;
797 pBssInfo
->next
= pInsBssInfo
;
803 if (pInsBssInfo
->next
!= NULL
)
805 //Signal strength smaller than current BssInfo, check next
806 pPreBssInfo
= pInsBssInfo
;
807 pInsBssInfo
= pInsBssInfo
->next
;
811 //Insert BssInfo to tail
812 pInsBssInfo
->next
= pBssInfo
;
813 pNextBssInfo
= pBssInfo
->next
;
814 wd
->sta
.bssList
.tail
= pBssInfo
;
815 pBssInfo
->next
= NULL
;
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
);
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
;
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
;
860 zmw_get_wlan_dev(dev
);
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
)
875 wd
->sta
.bssList
.head
= pBssInfo
->next
;
879 pPreBssInfo
->next
= pBssInfo
->next
;
882 if ( i
== (wd
->sta
.bssList
.bssCount
- 1) )
884 wd
->sta
.bssList
.tail
= pPreBssInfo
;
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
;
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
++ )
915 pNextBssInfo
= pBssInfo
->next
;
916 zfBssInfoRemoveFromList(dev
, pBssInfo
);
917 zfBssInfoFree(dev
, pBssInfo
);
918 pBssInfo
= pNextBssInfo
;
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
;
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
;
939 pBssInfo
= pBssInfo
->next
;
943 } //for( i=0; i<bssCount; i++ )
947 void zfDumpSSID(u8_t length
, u8_t
*value
)
950 u8_t tmpLength
= length
;
952 if ( 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
)
976 zmw_get_wlan_dev(dev
);
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);
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
1003 BSSID
[1] ^= (u8_t
)(time
& 0xff);
1006 BSSID
[2] ^= (u8_t
)(time
& 0xff);
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
)
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
)
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
)
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);
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);
1052 /* Leave an empty line below to remove warning message on some compiler */
1054 u16_t
zfFindCleanFrequency(zdev_t
* dev
, u32_t adhocMode
)
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
);
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)
1092 Array_24G
[count_24G
] = wd
->regulationTable
.allowChannel
[i
].channel
;
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]
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
];
1170 return Array_5G
[min5GIndex
];
1176 u16_t
zfFindMinimumUtilizationChannelIndex(zdev_t
* dev
, u16_t
* array
, u16_t count
)
1179 u16_t tempMinIndex
, tempMinValue
;
1183 tempMinValue
= array
[tempMinIndex
];
1186 if( array
[i
] < tempMinValue
)
1188 tempMinValue
= array
[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) )