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 #include "../hal/hpreg.h"
21 /* TODO : change global variable to constant */
22 u8_t zgWpaRadiusOui[] = { 0x00, 0x50, 0xf2, 0x01 };
23 u8_t zgWpaAesOui[] = { 0x00, 0x50, 0xf2, 0x04 };
24 u8_t zgWpa2RadiusOui[] = { 0x00, 0x0f, 0xac, 0x01 };
25 u8_t zgWpa2AesOui[] = { 0x00, 0x0f, 0xac, 0x04 };
27 const u16_t zcCwTlb[16] = { 0, 1, 3, 7, 15, 31, 63, 127,
28 255, 511, 1023, 2047, 4095, 4095, 4095, 4095};
30 void zfStaStartConnectCb(zdev_t* dev);
32 /************************************************************************/
34 /* FUNCTION DESCRIPTION zfStaPutApIntoBlockingList */
35 /* Put AP into blocking AP list. */
38 /* dev : device pointer */
39 /* bssid : AP's BSSID */
40 /* weight : weight of AP */
46 /* Stephen Chen Atheros Communications, INC. 2006.12 */
48 /************************************************************************/
49 void zfStaPutApIntoBlockingList(zdev_t* dev, u8_t* bssid, u8_t weight)
52 zmw_get_wlan_dev(dev);
53 zmw_declare_for_critical_section();
57 zmw_enter_critical_section(dev);
58 /*Find same bssid entry first*/
59 for (i=0; i<ZM_MAX_BLOCKING_AP_LIST_SIZE; i++)
63 if(wd->sta.blockingApList[i].addr[j]!= bssid[j])
74 /*This bssid doesn't have old record.Find an empty entry*/
75 if (i == ZM_MAX_BLOCKING_AP_LIST_SIZE)
77 for (i=0; i<ZM_MAX_BLOCKING_AP_LIST_SIZE; i++)
79 if (wd->sta.blockingApList[i].weight == 0)
86 /* If the list is full, pick one entry for replacement */
87 if (i == ZM_MAX_BLOCKING_AP_LIST_SIZE)
89 i = bssid[5] & (ZM_MAX_BLOCKING_AP_LIST_SIZE-1);
92 /* Update AP address and weight */
95 wd->sta.blockingApList[i].addr[j] = bssid[j];
98 wd->sta.blockingApList[i].weight = weight;
99 zmw_leave_critical_section(dev);
106 /************************************************************************/
108 /* FUNCTION DESCRIPTION zfStaIsApInBlockingList */
109 /* Is AP in blocking list. */
112 /* dev : device pointer */
113 /* bssid : AP's BSSID */
116 /* TRUE : AP in blocking list */
117 /* FALSE : AP not in blocking list */
120 /* Stephen Chen Atheros Communications, INC. 2006.12 */
122 /************************************************************************/
123 u16_t zfStaIsApInBlockingList(zdev_t* dev, u8_t* bssid)
126 zmw_get_wlan_dev(dev);
127 //zmw_declare_for_critical_section();
129 //zmw_enter_critical_section(dev);
130 for (i=0; i<ZM_MAX_BLOCKING_AP_LIST_SIZE; i++)
132 if (wd->sta.blockingApList[i].weight != 0)
136 if (wd->sta.blockingApList[i].addr[j] != bssid[j])
143 //zmw_leave_critical_section(dev);
148 //zmw_leave_critical_section(dev);
153 /************************************************************************/
155 /* FUNCTION DESCRIPTION zfStaRefreshBlockList */
156 /* Is AP in blocking list. */
159 /* dev : device pointer */
160 /* flushFlag : flush whole blocking list */
166 /* Stephen Chen Atheros Communications, INC. 2006.12 */
168 /************************************************************************/
169 void zfStaRefreshBlockList(zdev_t* dev, u16_t flushFlag)
172 zmw_get_wlan_dev(dev);
173 zmw_declare_for_critical_section();
175 zmw_enter_critical_section(dev);
176 for (i=0; i<ZM_MAX_BLOCKING_AP_LIST_SIZE; i++)
178 if (wd->sta.blockingApList[i].weight != 0)
182 wd->sta.blockingApList[i].weight = 0;
186 wd->sta.blockingApList[i].weight--;
190 zmw_leave_critical_section(dev);
195 /************************************************************************/
197 /* FUNCTION DESCRIPTION zfStaConnectFail */
198 /* Handle Connect failure. */
201 /* dev : device pointer */
203 /* reason : reason of failure */
209 /* Stephen Chen Atheros Communications, INC. 2006.12 */
211 /************************************************************************/
212 void zfStaConnectFail(zdev_t* dev, u16_t reason, u16_t* bssid, u8_t weight)
214 zmw_get_wlan_dev(dev);
216 /* Change internal state */
217 zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT);
219 /* Improve WEP/TKIP performance with HT AP, detail information please look bug#32495 */
220 //zfHpSetTTSIFSTime(dev, 0x8);
222 /* Notify wrapper of connection status changes */
223 if (wd->zfcbConnectNotify != NULL)
225 wd->zfcbConnectNotify(dev, reason, bssid);
228 /* Put AP into internal blocking list */
229 zfStaPutApIntoBlockingList(dev, (u8_t *)bssid, weight);
231 /* Issue another SCAN */
232 if ( wd->sta.bAutoReconnect )
234 zm_debug_msg0("Start internal scan...");
235 zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
236 zfScanMgrScanStart(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
240 u8_t zfiWlanIBSSGetPeerStationsCount(zdev_t* dev)
242 zmw_get_wlan_dev(dev);
244 return wd->sta.oppositeCount;
247 u8_t zfiWlanIBSSIteratePeerStations(zdev_t* dev, u8_t numToIterate, zfpIBSSIteratePeerStationCb callback, void *ctx)
253 zmw_get_wlan_dev(dev);
255 zmw_declare_for_critical_section();
257 zmw_enter_critical_section(dev);
259 oppositeCount = wd->sta.oppositeCount;
260 if ( oppositeCount > numToIterate )
262 oppositeCount = numToIterate;
265 for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++)
267 if ( oppositeCount == 0 )
272 if ( wd->sta.oppositeInfo[i].valid == 0 )
277 callback(dev, &wd->sta.oppositeInfo[i], ctx, index++);
282 zmw_leave_critical_section(dev);
288 s8_t zfStaFindFreeOpposite(zdev_t* dev, u16_t *sa, int *pFoundIdx)
293 zmw_get_wlan_dev(dev);
295 oppositeCount = wd->sta.oppositeCount;
297 for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++)
299 if ( oppositeCount == 0 )
304 if ( wd->sta.oppositeInfo[i].valid == 0 )
310 if ( zfMemoryIsEqual((u8_t*) sa, wd->sta.oppositeInfo[i].macAddr, 6) )
312 //wd->sta.oppositeInfo[i].aliveCounter++;
313 wd->sta.oppositeInfo[i].aliveCounter = ZM_IBSS_PEER_ALIVE_COUNTER;
315 /* it is already stored */
320 // Check if there's still space for new comer
321 if ( wd->sta.oppositeCount == ZM_MAX_OPPOSITE_COUNT )
326 // Find an unused slot for new peer station
327 for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++)
329 if ( wd->sta.oppositeInfo[i].valid == 0 )
339 s8_t zfStaFindOppositeByMACAddr(zdev_t* dev, u16_t *sa, u8_t *pFoundIdx)
344 zmw_get_wlan_dev(dev);
346 oppositeCount = wd->sta.oppositeCount;
348 for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++)
350 if ( oppositeCount == 0 )
355 if ( wd->sta.oppositeInfo[i].valid == 0 )
361 if ( zfMemoryIsEqual((u8_t*) sa, wd->sta.oppositeInfo[i].macAddr, 6) )
363 *pFoundIdx = (u8_t)i;
373 static void zfStaInitCommonOppositeInfo(zdev_t* dev, int i)
375 zmw_get_wlan_dev(dev);
377 /* set the default rate to the highest rate */
378 wd->sta.oppositeInfo[i].valid = 1;
379 wd->sta.oppositeInfo[i].aliveCounter = ZM_IBSS_PEER_ALIVE_COUNTER;
380 wd->sta.oppositeCount++;
382 #ifdef ZM_ENABLE_IBSS_WPA2PSK
383 /* Set parameters for new opposite peer station !!! */
384 wd->sta.oppositeInfo[i].camIdx = 0xff; // Not set key in this location
385 wd->sta.oppositeInfo[i].pkInstalled = 0;
386 wd->sta.oppositeInfo[i].wpaState = ZM_STA_WPA_STATE_INIT ; // No encryption
390 int zfStaSetOppositeInfoFromBSSInfo(zdev_t* dev, struct zsBssInfo* pBssInfo)
396 u32_t oneTxStreamCap;
398 zmw_get_wlan_dev(dev);
400 zfMemoryCopy((u8_t*) sa, pBssInfo->macaddr, 6);
402 res = zfStaFindFreeOpposite(dev, sa, &i);
408 dst = wd->sta.oppositeInfo[i].macAddr;
409 zfMemoryCopy(dst, (u8_t *)sa, 6);
411 oneTxStreamCap = (zfHpCapability(dev) & ZM_HP_CAP_11N_ONE_TX_STREAM);
413 if (pBssInfo->extSupportedRates[1] != 0)
415 /* TODO : Handle 11n */
416 if (pBssInfo->frequency < 3000)
419 if (pBssInfo->EnableHT == 1)
420 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, pBssInfo->SG40);
422 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 1, pBssInfo->SG40);
427 if (pBssInfo->EnableHT == 1)
428 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, pBssInfo->SG40);
430 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, pBssInfo->SG40);
435 /* TODO : Handle 11n */
436 if (pBssInfo->frequency < 3000)
439 if (pBssInfo->EnableHT == 1)
440 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, pBssInfo->SG40);
442 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 0, 1, pBssInfo->SG40);
447 if (pBssInfo->EnableHT == 1)
448 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, pBssInfo->SG40);
450 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, pBssInfo->SG40);
455 zfStaInitCommonOppositeInfo(dev, i);
460 int zfStaSetOppositeInfoFromRxBuf(zdev_t* dev, zbuf_t* buf)
467 u8_t bSupportExtRate;
468 u32_t rtsctsRate = 0xffffffff; /* CTS:OFDM 6M, RTS:OFDM 6M */
469 u32_t oneTxStreamCap;
471 zmw_get_wlan_dev(dev);
472 zmw_declare_for_critical_section();
474 sa[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
475 sa[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+2);
476 sa[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+4);
478 zmw_enter_critical_section(dev);
480 res = zfStaFindFreeOpposite(dev, sa, &i);
486 dst = wd->sta.oppositeInfo[i].macAddr;
487 zfCopyFromRxBuffer(dev, buf, dst, ZM_WLAN_HEADER_A2_OFFSET, 6);
489 if ( (wd->sta.currentFrequency < 3000) && !(wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) )
496 if ( (bSupportExtRate == 1)
497 && (wd->sta.currentFrequency < 3000)
498 && (wd->wlanMode == ZM_MODE_IBSS)
499 && (wd->wfc.bIbssGMode == 0) )
504 wd->sta.connection_11b = 0;
505 oneTxStreamCap = (zfHpCapability(dev) & ZM_HP_CAP_11N_ONE_TX_STREAM);
507 if ( ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_RATE)) != 0xffff)
508 && (bSupportExtRate == 1) )
510 /* TODO : Handle 11n */
511 if (wd->sta.currentFrequency < 3000)
514 if (wd->sta.EnableHT == 1)
517 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, wd->sta.SG40);
522 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 1, wd->sta.SG40);
524 rtsctsRate = 0x00001bb; /* CTS:CCK 1M, RTS:OFDM 6M */
529 if (wd->sta.EnableHT == 1)
532 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, wd->sta.SG40);
537 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, wd->sta.SG40);
539 rtsctsRate = 0x10b01bb; /* CTS:OFDM 6M, RTS:OFDM 6M */
544 /* TODO : Handle 11n */
545 if (wd->sta.currentFrequency < 3000)
548 if (wd->sta.EnableHT == 1)
551 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, wd->sta.SG40);
552 rtsctsRate = 0x00001bb; /* CTS:CCK 1M, RTS:OFDM 6M */
557 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 0, 1, wd->sta.SG40);
558 rtsctsRate = 0x0; /* CTS:CCK 1M, RTS:CCK 1M */
559 wd->sta.connection_11b = 1;
565 if (wd->sta.EnableHT == 1)
568 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, wd->sta.SG40);
573 zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, wd->sta.SG40);
575 rtsctsRate = 0x10b01bb; /* CTS:OFDM 6M, RTS:OFDM 6M */
579 zfStaInitCommonOppositeInfo(dev, i);
582 zmw_leave_critical_section(dev);
584 if (rtsctsRate != 0xffffffff)
586 zfHpSetRTSCTSRate(dev, rtsctsRate);
591 void zfStaProtErpMonitor(zdev_t* dev, zbuf_t* buf)
597 zmw_get_wlan_dev(dev);
599 if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)&&(zfStaIsConnected(dev)) )
601 ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid);
603 if (zfRxBufferEqualToStr(dev, buf, bssid, ZM_WLAN_HEADER_A2_OFFSET, 6))
605 if ( (offset=zfFindElement(dev, buf, ZM_WLAN_EID_ERP)) != 0xffff )
607 erp = zmw_rx_buf_readb(dev, buf, offset+2);
609 if ( erp & ZM_BIT_1 )
611 //zm_debug_msg0("protection mode on");
612 if (wd->sta.bProtectionMode == FALSE)
614 wd->sta.bProtectionMode = TRUE;
615 zfHpSetSlotTime(dev, 0);
620 //zm_debug_msg0("protection mode off");
621 if (wd->sta.bProtectionMode == TRUE)
623 wd->sta.bProtectionMode = FALSE;
624 zfHpSetSlotTime(dev, 1);
629 //Check the existence of Non-N AP
630 //Follow the check the "pBssInfo->EnableHT"
631 if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY)) != 0xffff)
633 else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTCAPABILITY)) != 0xffff)
636 {wd->sta.NonNAPcount++;}
640 void zfStaUpdateWmeParameter(zdev_t* dev, zbuf_t* buf)
652 u8_t rxWmeParameterSetCount;
654 zmw_get_wlan_dev(dev);
656 /* Update if WME parameter set count is changed */
657 /* If connect to WME AP */
658 if (wd->sta.wmeConnected != 0)
660 /* Find WME parameter element */
661 if ((offset = zfFindWifiElement(dev, buf, 2, 1)) != 0xffff)
663 if ((len = zmw_rx_buf_readb(dev, buf, offset+1)) >= 7)
665 rxWmeParameterSetCount=zmw_rx_buf_readb(dev, buf, offset+8);
666 if (rxWmeParameterSetCount != wd->sta.wmeParameterSetCount)
668 zm_msg0_mm(ZM_LV_0, "wmeParameterSetCount changed!");
669 wd->sta.wmeParameterSetCount = rxWmeParameterSetCount;
670 /* retrieve WME parameter and update TxQ parameters */
674 if (len >= (8+(i*4)+4))
676 tmp=zmw_rx_buf_readb(dev, buf, offset+10+i*4);
677 ac = (tmp >> 5) & 0x3;
678 if ((tmp & 0x10) == 0)
682 aifs[ac] = ((tmp & 0xf) * 9) + 10;
683 tmp=zmw_rx_buf_readb(dev, buf, offset+11+i*4);
685 cwmin[ac] = zcCwTlb[(tmp & 0xf)];
686 cwmax[ac] = zcCwTlb[(tmp >> 4)];
687 txop[ac]=zmw_rx_buf_readh(dev, buf,
692 if ((acm & 0x4) != 0)
699 if ((acm & 0x8) != 0)
710 if ((cwmin[2]+aifs[2]) > ((cwmin[0]+aifs[0])+1))
712 wd->sta.ac0PriorityHigherThanAc2 = 1;
716 wd->sta.ac0PriorityHigherThanAc2 = 0;
718 zfHpUpdateQosParameter(dev, cwmin, cwmax, aifs, txop);
722 } //if (wd->sta.wmeConnected != 0)
724 /* process 802.11h Dynamic Frequency Selection */
725 void zfStaUpdateDot11HDFS(zdev_t* dev, zbuf_t* buf)
727 //u8_t length, channel, is5G;
730 zmw_get_wlan_dev(dev);
733 Channel Switch Announcement Element Format
734 +------+----------+------+-------------------+------------------+--------------------+
735 |Format|Element ID|Length|Channel Switch Mode|New Channel Number|Channel Switch Count|
736 +------+----------+------+-------------------+------------------+--------------------+
737 |Bytes | 1 | 1 | 1 | 1 | 1 |
738 +------+----------+------+-------------------+------------------+--------------------+
739 |Value | 37 | 3 | 0 or 1 |unsigned integer |unsigned integer |
740 +------+----------+------+-------------------+------------------+--------------------+
743 /* get EID(Channel Switch Announcement) */
744 if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_CHANNEL_SWITCH_ANNOUNCE)) == 0xffff )
746 //zm_debug_msg0("EID(Channel Switch Announcement) not found");
749 else if ( zmw_rx_buf_readb(dev, buf, offset+1) == 0x3 )
751 zm_debug_msg0("EID(Channel Switch Announcement) found");
753 //length = zmw_rx_buf_readb(dev, buf, offset+1);
754 //zfCopyFromRxBuffer(dev, buf, pBssInfo->supportedRates, offset, length+2);
756 //Chanell Switch Mode set to 1, driver should disable transmit immediate
757 //we do this by poll CCA high
758 if (zmw_rx_buf_readb(dev, buf, offset+2) == 0x1 )
760 //use ZM_OID_INTERNAL_WRITE,ZM_CMD_RESET to notice firmware flush quene and stop dma,
761 //then restart rx dma but not tx dma
762 if (wd->sta.DFSDisableTx != TRUE)
764 /* TODO : zfHpResetTxRx would cause Rx hang */
765 //zfHpResetTxRx(dev);
766 wd->sta.DFSDisableTx = TRUE;
770 //Adapter->ZD80211HSetting.DisableTxBy80211H=TRUE;
771 //AcquireCtrOfPhyReg(Adapter);
772 //ZD1205_WRITE_REGISTER(Adapter,CR24, 0x0);
773 //ReleaseDoNotSleep(Adapter);
776 if (zmw_rx_buf_readb(dev, buf, offset+4) <= 0x2 )
779 //if Channel Switch Count = 0 , STA should change channel immediately.
780 //if Channel Switch Count > 0 , STA should change channel after TBTT*count
781 //But it won't be accurate to let driver calculate TBTT*count, and the value of
782 //Channel Switch Count will decrease by one each when continue receving beacon
783 //So we change channel here when we receive count <=2.
785 zfHpDeleteAllowChannel(dev, wd->sta.currentFrequency);
786 wd->frequency = zfChNumToFreq(dev, zmw_rx_buf_readb(dev, buf, offset+3), 0);
787 //zfHpAddAllowChannel(dev, wd->frequency);
788 zm_debug_msg1("CWY - jump to frequency = ", wd->frequency);
789 zfCoreSetFrequency(dev, wd->frequency);
790 wd->sta.DFSDisableTx = FALSE;
791 /* Increase rxBeaconCount to prevent beacon lost */
792 if (zfStaIsConnected(dev))
794 wd->sta.rxBeaconCount = 1 << 6; // 2 times of check would pass
796 //start tx dma to transmit packet
798 //if (zmw_rx_buf_readb(dev, buf, offset+3) != wd->frequency)
800 // //ZDDbgPrint(("Radar Detect by AP\n"));
801 // zfCoreSetFrequency();
802 // ProcessRadarDetectEvent(Adapter);
803 // Set_RF_Channel(Adapter, SwRfd->Rfd->RxBuffer[index+3], (UCHAR)Adapter->RF_Mode, 1);
804 // Adapter->CardSetting.Channel = SwRfd->Rfd->RxBuffer[index+3];
805 // Adapter->SaveChannel = Adapter->CardSetting.Channel;
806 // Adapter->UtilityChannel = Adapter->CardSetting.Channel;
812 /* TODO : process 802.11h Transmission Power Control */
813 void zfStaUpdateDot11HTPC(zdev_t* dev, zbuf_t* buf)
817 /* IBSS power-saving mode */
818 void zfStaIbssPSCheckState(zdev_t* dev, zbuf_t* buf)
822 zmw_get_wlan_dev(dev);
824 if ( !zfStaIsConnected(dev) )
829 if ( wd->wlanMode != ZM_MODE_IBSS )
835 if ( !zfRxBufferEqualToStr(dev, buf, (u8_t*) wd->sta.bssid,
836 ZM_WLAN_HEADER_A3_OFFSET, 6) )
841 frameCtrl = zmw_rx_buf_readb(dev, buf, 1);
843 /* check power management bit */
844 if ( frameCtrl & ZM_BIT_4 )
846 for(i=1; i<ZM_MAX_PS_STA; i++)
848 if ( !wd->sta.staPSList.entity[i].bUsed )
853 /* check source address */
854 if ( zfRxBufferEqualToStr(dev, buf,
855 wd->sta.staPSList.entity[i].macAddr,
856 ZM_WLAN_HEADER_A2_OFFSET, 6) )
862 for(i=1; i<ZM_MAX_PS_STA; i++)
864 if ( !wd->sta.staPSList.entity[i].bUsed )
866 wd->sta.staPSList.entity[i].bUsed = TRUE;
867 wd->sta.staPSList.entity[i].bDataQueued = FALSE;
872 if ( i == ZM_MAX_PS_STA )
874 /* STA list is full */
878 zfCopyFromRxBuffer(dev, buf, wd->sta.staPSList.entity[i].macAddr,
879 ZM_WLAN_HEADER_A2_OFFSET, 6);
881 if ( wd->sta.staPSList.count == 0 )
883 // enable ATIM window
884 //zfEnableAtimWindow(dev);
887 wd->sta.staPSList.count++;
889 else if ( wd->sta.staPSList.count )
891 for(i=1; i<ZM_MAX_PS_STA; i++)
893 if ( wd->sta.staPSList.entity[i].bUsed )
895 if ( zfRxBufferEqualToStr(dev, buf,
896 wd->sta.staPSList.entity[i].macAddr,
897 ZM_WLAN_HEADER_A2_OFFSET, 6) )
899 wd->sta.staPSList.entity[i].bUsed = FALSE;
900 wd->sta.staPSList.count--;
902 if ( wd->sta.staPSList.entity[i].bDataQueued )
904 /* send queued data */
910 if ( wd->sta.staPSList.count == 0 )
912 /* disable ATIM window */
913 //zfDisableAtimWindow(dev);
919 /* IBSS power-saving mode */
920 u8_t zfStaIbssPSQueueData(zdev_t* dev, zbuf_t* buf)
925 zmw_get_wlan_dev(dev);
927 if ( !zfStaIsConnected(dev) )
932 if ( wd->wlanMode != ZM_MODE_IBSS )
937 if ( wd->sta.staPSList.count == 0 && wd->sta.powerSaveMode <= ZM_STA_PS_NONE )
943 #ifdef ZM_ENABLE_NATIVE_WIFI
944 da[0] = zmw_tx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
945 da[1] = zmw_tx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET + 2);
946 da[2] = zmw_tx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET + 4);
948 da[0] = zmw_tx_buf_readh(dev, buf, 0);
949 da[1] = zmw_tx_buf_readh(dev, buf, 2);
950 da[2] = zmw_tx_buf_readh(dev, buf, 4);
953 if ( ZM_IS_MULTICAST_OR_BROADCAST(da) )
955 wd->sta.staPSList.entity[0].bDataQueued = TRUE;
956 wd->sta.ibssPSDataQueue[wd->sta.ibssPSDataCount++] = buf;
962 for(i=1; i<ZM_MAX_PS_STA; i++)
964 if ( zfMemoryIsEqual(wd->sta.staPSList.entity[i].macAddr,
967 wd->sta.staPSList.entity[i].bDataQueued = TRUE;
968 wd->sta.ibssPSDataQueue[wd->sta.ibssPSDataCount++] = buf;
975 if ( wd->sta.powerSaveMode > ZM_STA_PS_NONE )
977 wd->sta.staPSDataQueue[wd->sta.staPSDataCount++] = buf;
986 /* IBSS power-saving mode */
987 void zfStaIbssPSSend(zdev_t* dev)
990 u16_t bcastAddr[3] = {0xffff, 0xffff, 0xffff};
992 zmw_get_wlan_dev(dev);
994 if ( !zfStaIsConnected(dev) )
999 if ( wd->wlanMode != ZM_MODE_IBSS )
1004 for(i=0; i<ZM_MAX_PS_STA; i++)
1006 if ( wd->sta.staPSList.entity[i].bDataQueued )
1010 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ATIM,
1014 else if ( wd->sta.staPSList.entity[i].bUsed )
1016 // Send ATIM to prevent the peer to go to sleep
1017 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ATIM,
1018 (u16_t*) wd->sta.staPSList.entity[i].macAddr,
1022 wd->sta.staPSList.entity[i].bDataQueued = FALSE;
1026 for(i=0; i<wd->sta.ibssPSDataCount; i++)
1028 zfTxSendEth(dev, wd->sta.ibssPSDataQueue[i], 0,
1029 ZM_EXTERNAL_ALLOC_BUF, 0);
1032 wd->sta.ibssPrevPSDataCount = wd->sta.ibssPSDataCount;
1033 wd->sta.ibssPSDataCount = 0;
1037 void zfStaReconnect(zdev_t* dev)
1039 zmw_get_wlan_dev(dev);
1040 zmw_declare_for_critical_section();
1042 if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE &&
1043 wd->wlanMode != ZM_MODE_IBSS )
1048 if ( (zfStaIsConnected(dev))||(zfStaIsConnecting(dev)) )
1053 if ( wd->sta.bChannelScan )
1058 /* Recover zero SSID length */
1059 if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) && (wd->ws.ssidLen == 0))
1061 zm_debug_msg0("zfStaReconnect: NOT Support!! Set SSID to any BSS");
1063 zmw_enter_critical_section(dev);
1064 wd->sta.ssid[0] = 0;
1065 wd->sta.ssidLen = 0;
1066 zmw_leave_critical_section(dev);
1069 // RAY: To ensure no TX pending before re-connecting
1072 zfScanMgrScanAck(dev);
1075 void zfStaTimer100ms(zdev_t* dev)
1077 zmw_get_wlan_dev(dev);
1079 if ( (wd->tick % 10) == 0 )
1082 // zfPowerSavingMgrMain(dev);
1087 void zfStaCheckRxBeacon(zdev_t* dev)
1089 zmw_get_wlan_dev(dev);
1091 if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) && (zfStaIsConnected(dev)))
1093 if (wd->beaconInterval == 0)
1095 wd->beaconInterval = 100;
1097 if ( (wd->tick % ((wd->beaconInterval * 10) / ZM_MS_PER_TICK)) == 0 )
1099 /* Check rxBeaconCount */
1100 if (wd->sta.rxBeaconCount == 0)
1102 if (wd->sta.beaconMissState == 1)
1104 /*notify AP that we left*/
1105 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, wd->sta.bssid, 3, 0, 0);
1107 zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_BEACON_MISS,
1112 wd->sta.beaconMissState = 1;
1114 zfCoreSetFrequencyExV2(dev, wd->frequency, wd->BandWidth40,
1115 wd->ExtOffset, NULL, 1);
1120 wd->sta.beaconMissState = 0;
1122 wd->sta.rxBeaconCount = 0;
1129 void zfStaCheckConnectTimeout(zdev_t* dev)
1131 zmw_get_wlan_dev(dev);
1132 zmw_declare_for_critical_section();
1134 if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE )
1139 if ( !zfStaIsConnecting(dev) )
1144 zmw_enter_critical_section(dev);
1145 if ( (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_OPEN)||
1146 (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_1)||
1147 (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_2)||
1148 (wd->sta.connectState == ZM_STA_CONN_STATE_ASSOCIATE) )
1150 if ( (wd->tick - wd->sta.connectTimer) > ZM_INTERVAL_CONNECT_TIMEOUT )
1152 if ( wd->sta.connectByReasso )
1154 wd->sta.failCntOfReasso++;
1155 if ( wd->sta.failCntOfReasso > 2 )
1157 wd->sta.connectByReasso = FALSE;
1161 wd->sta.connectState = ZM_STA_CONN_STATE_NONE;
1162 zm_debug_msg1("connect timeout, state = ", wd->sta.connectState);
1163 //zfiWlanDisable(dev);
1168 zmw_leave_critical_section(dev);
1172 zmw_leave_critical_section(dev);
1173 if(wd->sta.authMode == ZM_AUTH_MODE_AUTO)
1174 { // Fix some AP not send authentication failed message to sta and lead to connect timeout !
1175 wd->sta.connectTimeoutCount++;
1177 zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_TIMEOUT, wd->sta.bssid, 2);
1181 void zfMmStaTimeTick(zdev_t* dev)
1183 zmw_get_wlan_dev(dev);
1186 if (wd->wlanMode != ZM_MODE_AP && !wd->swSniffer)
1190 zfTimerCheckAndHandle(dev);
1193 zfStaCheckRxBeacon(dev);
1194 zfStaTimer100ms(dev);
1195 zfStaCheckConnectTimeout(dev);
1196 zfPowerSavingMgrMain(dev);
1199 #ifdef ZM_ENABLE_AGGREGATION
1203 zfAggScanAndClear(dev, wd->tick);
1207 void zfStaSendBeacon(zdev_t* dev)
1212 zmw_get_wlan_dev(dev);
1214 zmw_declare_for_critical_section();
1216 //zm_debug_msg0("\n");
1218 /* TBD : Maximum size of beacon */
1219 if ((buf = zfwBufAllocate(dev, 1024)) == NULL)
1221 zm_debug_msg0("Allocate beacon buffer failed");
1228 zmw_tx_buf_writeh(dev, buf, offset, 0x0080);
1231 zmw_tx_buf_writeh(dev, buf, offset, 0x0000);
1234 zmw_tx_buf_writeh(dev, buf, offset, 0xffff);
1236 zmw_tx_buf_writeh(dev, buf, offset, 0xffff);
1238 zmw_tx_buf_writeh(dev, buf, offset, 0xffff);
1241 zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[0]);
1243 zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[1]);
1245 zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[2]);
1248 zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[0]);
1250 zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[1]);
1252 zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[2]);
1255 /* Sequence number */
1256 zmw_enter_critical_section(dev);
1257 seq = ((wd->mmseq++)<<4);
1258 zmw_leave_critical_section(dev);
1259 zmw_tx_buf_writeh(dev, buf, offset, seq);
1262 /* 24-31 Time Stamp : hardware will fill this field */
1265 /* Beacon Interval */
1266 zmw_tx_buf_writeh(dev, buf, offset, wd->beaconInterval);
1270 zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[0]);
1271 zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[1]);
1274 offset = zfStaAddIeSsid(dev, buf, offset);
1276 if(wd->frequency <= ZM_CH_G_14) // 2.4 GHz b+g
1280 offset = zfMmAddIeSupportRate(dev, buf, offset,
1281 ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
1283 /* DS parameter set */
1284 offset = zfMmAddIeDs(dev, buf, offset);
1286 offset = zfStaAddIeIbss(dev, buf, offset);
1288 if( wd->wfc.bIbssGMode
1289 && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) ) // Only accompany with enabling a mode .
1291 /* ERP Information */
1293 offset = zfMmAddIeErp(dev, buf, offset);
1296 /* TODO : country information */
1298 if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK )
1300 offset = zfwStaAddIeWpaRsn(dev, buf, offset, ZM_WLAN_FRAME_TYPE_AUTH);
1303 if( wd->wfc.bIbssGMode
1304 && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) ) // Only accompany with enabling a mode .
1307 /* Extended Supported Rates */
1308 offset = zfMmAddIeSupportRate(dev, buf, offset,
1309 ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
1314 /* Support Rate a Mode */
1315 offset = zfMmAddIeSupportRate(dev, buf, offset,
1316 ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
1318 /* DS parameter set */
1319 offset = zfMmAddIeDs(dev, buf, offset);
1321 offset = zfStaAddIeIbss(dev, buf, offset);
1323 /* TODO : country information */
1325 if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK )
1327 offset = zfwStaAddIeWpaRsn(dev, buf, offset, ZM_WLAN_FRAME_TYPE_AUTH);
1331 if ( wd->wlanMode != ZM_MODE_IBSS )
1333 /* TODO : Need to check if it is ok */
1334 /* HT Capabilities Info */
1335 offset = zfMmAddHTCapability(dev, buf, offset);
1337 /* Extended HT Capabilities Info */
1338 offset = zfMmAddExtendedHTCapability(dev, buf, offset);
1341 if ( wd->sta.ibssAdditionalIESize )
1342 offset = zfStaAddIbssAdditionalIE(dev, buf, offset);
1344 /* 1212 : write to beacon fifo */
1345 /* 1221 : write to share memory */
1346 zfHpSendBeacon(dev, buf, offset);
1348 /* Free beacon buffer */
1349 //zfwBufFree(dev, buf, 0);
1352 void zfStaSignalStatistic(zdev_t* dev, u8_t SignalStrength, u8_t SignalQuality) //CWYang(+)
1354 zmw_get_wlan_dev(dev);
1356 /* Add Your Code to Do Works Like Moving Average Here */
1357 wd->SignalStrength = (wd->SignalStrength * 7 + SignalStrength * 3)/10;
1358 wd->SignalQuality = (wd->SignalQuality * 7 + SignalQuality * 3)/10;
1362 struct zsBssInfo* zfStaFindBssInfo(zdev_t* dev, zbuf_t* buf, struct zsWlanProbeRspFrameHeader *pProbeRspHeader)
1367 u8_t isMatched, length, channel;
1368 u16_t offset, frequency;
1369 struct zsBssInfo* pBssInfo;
1371 zmw_get_wlan_dev(dev);
1373 if ((pBssInfo = wd->sta.bssList.head) == NULL)
1378 for( i=0; i<wd->sta.bssList.bssCount; i++ )
1380 //zm_debug_msg2("check pBssInfo = ", pBssInfo);
1383 for( j=0; j<6; j++ )
1385 if ( pBssInfo->bssid[j] != pProbeRspHeader->bssid[j] )
1394 if (pProbeRspHeader->ssid[1] <= 32)
1396 /* compare length and ssid */
1398 if((pProbeRspHeader->ssid[1] != 0) && (pBssInfo->ssid[1] != 0))
1400 for( k=1; k<pProbeRspHeader->ssid[1] + 1; k++ )
1402 if ( pBssInfo->ssid[k] != pProbeRspHeader->ssid[k] )
1421 /* Add check channel to solve the bug #31222 */
1423 if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_DS)) != 0xffff) {
1424 if ((length = zmw_rx_buf_readb(dev, buf, offset+1)) == 1) {
1425 channel = zmw_rx_buf_readb(dev, buf, offset+2);
1426 if (zfHpIsAllowedChannel(dev, zfChNumToFreq(dev, channel, 0)) == 0) {
1429 frequency = zfChNumToFreq(dev, channel, 0);;
1435 frequency = wd->sta.currentFrequency;
1438 if (frequency != 0) {
1439 if ( ((frequency > 3000) && (pBssInfo->frequency > 3000))
1440 || ((frequency < 3000) && (pBssInfo->frequency < 3000)) ) {
1447 pBssInfo = pBssInfo->next;
1450 if ( i == wd->sta.bssList.bssCount )
1458 u8_t zfStaInitBssInfo(zdev_t* dev, zbuf_t* buf,
1459 struct zsWlanProbeRspFrameHeader *pProbeRspHeader,
1460 struct zsBssInfo* pBssInfo, struct zsAdditionInfo* AddInfo, u8_t type)
1462 u8_t length, channel, is5G;
1465 u16_t eachIElength = 0;
1466 u16_t accumulateLen = 0;
1468 zmw_get_wlan_dev(dev);
1470 if ((type == 1) && ((pBssInfo->flag & ZM_BSS_INFO_VALID_BIT) != 0))
1476 if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID)) == 0xffff )
1478 zm_debug_msg0("EID(SSID) not found");
1482 length = zmw_rx_buf_readb(dev, buf, offset+1);
1486 zfwGetShowZeroLengthSSID(dev, &Show_Flag);
1490 if (length > ZM_MAX_SSID_LENGTH )
1492 zm_debug_msg0("EID(SSID) is invalid");
1498 if ( length == 0 || length > ZM_MAX_SSID_LENGTH )
1500 zm_debug_msg0("EID(SSID) is invalid");
1506 zfCopyFromRxBuffer(dev, buf, pBssInfo->ssid, offset, length+2);
1508 /* get DS parameter */
1509 if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_DS)) != 0xffff )
1511 length = zmw_rx_buf_readb(dev, buf, offset+1);
1514 zm_msg0_mm(ZM_LV_0, "Abnormal DS Param Set IE");
1517 channel = zmw_rx_buf_readb(dev, buf, offset+2);
1519 if (zfHpIsAllowedChannel(dev, zfChNumToFreq(dev, channel, 0)) == 0)
1524 pBssInfo->frequency = zfChNumToFreq(dev, channel, 0); // auto check
1525 pBssInfo->channel = channel;
1531 /* DS parameter not found */
1532 pBssInfo->frequency = wd->sta.currentFrequency;
1533 pBssInfo->channel = zfChFreqToNum(wd->sta.currentFrequency, &is5G);
1536 /* initialize security type */
1537 pBssInfo->securityType = ZM_SECURITY_TYPE_NONE;
1540 for( i=0; i<6; i++ )
1542 pBssInfo->macaddr[i] = pProbeRspHeader->sa[i];
1546 for( i=0; i<6; i++ )
1548 pBssInfo->bssid[i] = pProbeRspHeader->bssid[i];
1552 for( i=0; i<8; i++ )
1554 pBssInfo->timeStamp[i] = pProbeRspHeader->timeStamp[i];
1557 /* get beacon interval */
1558 pBssInfo->beaconInterval[0] = pProbeRspHeader->beaconInterval[0];
1559 pBssInfo->beaconInterval[1] = pProbeRspHeader->beaconInterval[1];
1561 /* get capability */
1562 pBssInfo->capability[0] = pProbeRspHeader->capability[0];
1563 pBssInfo->capability[1] = pProbeRspHeader->capability[1];
1565 /* Copy frame body */
1566 offset = 36; // Copy from the start of variable IE
1567 pBssInfo->frameBodysize = zfwBufGetSize(dev, buf)-offset;
1568 if (pBssInfo->frameBodysize > (ZM_MAX_PROBE_FRAME_BODY_SIZE-1))
1570 pBssInfo->frameBodysize = ZM_MAX_PROBE_FRAME_BODY_SIZE-1;
1575 eachIElength = zmw_rx_buf_readb(dev, buf, offset + accumulateLen+1) + 2; //Len+(EID+Data)
1577 if ( (eachIElength >= 2)
1578 && ((accumulateLen + eachIElength) <= pBssInfo->frameBodysize) )
1580 zfCopyFromRxBuffer(dev, buf, pBssInfo->frameBody+accumulateLen, offset+accumulateLen, eachIElength);
1581 accumulateLen+=(u16_t)eachIElength;
1585 zm_msg0_mm(ZM_LV_1, "probersp frameBodysize abnormal");
1589 while(accumulateLen < pBssInfo->frameBodysize);
1590 pBssInfo->frameBodysize = accumulateLen;
1592 /* get supported rates */
1593 if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_SUPPORT_RATE)) == 0xffff )
1595 zm_debug_msg0("EID(supported rates) not found");
1599 length = zmw_rx_buf_readb(dev, buf, offset+1);
1600 if ( length == 0 || length > ZM_MAX_SUPP_RATES_IE_SIZE)
1602 zm_msg0_mm(ZM_LV_0, "Supported rates IE length abnormal");
1605 zfCopyFromRxBuffer(dev, buf, pBssInfo->supportedRates, offset, length+2);
1609 /* get Country information */
1610 if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_COUNTRY)) != 0xffff )
1612 length = zmw_rx_buf_readb(dev, buf, offset+1);
1613 if (length > ZM_MAX_COUNTRY_INFO_SIZE)
1615 length = ZM_MAX_COUNTRY_INFO_SIZE;
1617 zfCopyFromRxBuffer(dev, buf, pBssInfo->countryInfo, offset, length+2);
1618 /* check 802.11d support data */
1619 if (wd->sta.b802_11D)
1621 zfHpGetRegulationTablefromISO(dev, (u8_t *)&pBssInfo->countryInfo, 3);
1622 /* only set regulatory one time */
1623 wd->sta.b802_11D = 0;
1627 /* get ERP information */
1628 if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_ERP)) != 0xffff )
1630 pBssInfo->erp = zmw_rx_buf_readb(dev, buf, offset+2);
1633 /* get extended supported rates */
1634 if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_RATE)) != 0xffff )
1636 length = zmw_rx_buf_readb(dev, buf, offset+1);
1637 if (length > ZM_MAX_SUPP_RATES_IE_SIZE)
1639 zm_msg0_mm(ZM_LV_0, "Extended rates IE length abnormal");
1642 zfCopyFromRxBuffer(dev, buf, pBssInfo->extSupportedRates, offset, length+2);
1646 pBssInfo->extSupportedRates[0] = 0;
1647 pBssInfo->extSupportedRates[1] = 0;
1651 if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_WPA_IE)) != 0xffff )
1653 length = zmw_rx_buf_readb(dev, buf, offset+1);
1654 if (length > ZM_MAX_IE_SIZE)
1656 length = ZM_MAX_IE_SIZE;
1658 zfCopyFromRxBuffer(dev, buf, pBssInfo->wpaIe, offset, length+2);
1659 pBssInfo->securityType = ZM_SECURITY_TYPE_WPA;
1663 pBssInfo->wpaIe[1] = 0;
1667 if ((offset = zfFindWifiElement(dev, buf, 4, 0xff)) != 0xffff)
1669 length = zmw_rx_buf_readb(dev, buf, offset+1);
1670 if (length > ZM_MAX_WPS_IE_SIZE )
1672 length = ZM_MAX_WPS_IE_SIZE;
1674 zfCopyFromRxBuffer(dev, buf, pBssInfo->wscIe, offset, length+2);
1678 pBssInfo->wscIe[1] = 0;
1682 if ((offset = zfFindSuperGElement(dev, buf, ZM_WLAN_EID_VENDOR_PRIVATE)) != 0xffff)
1684 pBssInfo->apCap |= ZM_SuperG_AP;
1688 if ((offset = zfFindXRElement(dev, buf, ZM_WLAN_EID_VENDOR_PRIVATE)) != 0xffff)
1690 pBssInfo->apCap |= ZM_XR_AP;
1694 if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_RSN_IE)) != 0xffff )
1696 length = zmw_rx_buf_readb(dev, buf, offset+1);
1697 if (length > ZM_MAX_IE_SIZE)
1699 length = ZM_MAX_IE_SIZE;
1701 zfCopyFromRxBuffer(dev, buf, pBssInfo->rsnIe, offset, length+2);
1702 pBssInfo->securityType = ZM_SECURITY_TYPE_WPA;
1706 pBssInfo->rsnIe[1] = 0;
1708 #ifdef ZM_ENABLE_CENC
1710 if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_CENC_IE)) != 0xffff )
1712 length = zmw_rx_buf_readb(dev, buf, offset+1);
1713 if (length > ZM_MAX_IE_SIZE )
1715 length = ZM_MAX_IE_SIZE;
1717 zfCopyFromRxBuffer(dev, buf, pBssInfo->cencIe, offset, length+2);
1718 pBssInfo->securityType = ZM_SECURITY_TYPE_CENC;
1719 pBssInfo->capability[0] &= 0xffef;
1723 pBssInfo->cencIe[1] = 0;
1725 #endif //ZM_ENABLE_CENC
1726 /* get WME Parameter IE, probe rsp may contain WME parameter element */
1727 //if ( wd->bQoSEnable )
1729 if ((offset = zfFindWifiElement(dev, buf, 2, 1)) != 0xffff)
1731 apQosInfo = zmw_rx_buf_readb(dev, buf, offset+8) & 0x80;
1732 pBssInfo->wmeSupport = 1 | apQosInfo;
1734 else if ((offset = zfFindWifiElement(dev, buf, 2, 0)) != 0xffff)
1736 apQosInfo = zmw_rx_buf_readb(dev, buf, offset+8) & 0x80;
1737 pBssInfo->wmeSupport = 1 | apQosInfo;
1741 pBssInfo->wmeSupport = 0;
1745 if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY)) != 0xffff)
1748 pBssInfo->EnableHT = 1;
1749 if (zmw_rx_buf_readb(dev, buf, offset+1) & 0x02)
1751 pBssInfo->enableHT40 = 1;
1755 pBssInfo->enableHT40 = 0;
1758 if (zmw_rx_buf_readb(dev, buf, offset+1) & 0x40)
1767 else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTCAPABILITY)) != 0xffff)
1770 pBssInfo->EnableHT = 1;
1771 pBssInfo->apCap |= ZM_All11N_AP;
1772 if (zmw_rx_buf_readb(dev, buf, offset+2) & 0x02)
1774 pBssInfo->enableHT40 = 1;
1778 pBssInfo->enableHT40 = 0;
1781 if (zmw_rx_buf_readb(dev, buf, offset+2) & 0x40)
1792 pBssInfo->EnableHT = 0;
1794 /* HT information */
1795 if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY)) != 0xffff)
1798 pBssInfo->extChOffset = zmw_rx_buf_readb(dev, buf, offset+2) & 0x03;
1800 else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTINFORMATION)) != 0xffff)
1802 /* pre n 2.0 standard */
1803 pBssInfo->extChOffset = zmw_rx_buf_readb(dev, buf, offset+3) & 0x03;
1807 pBssInfo->extChOffset = 0;
1810 if ( (pBssInfo->enableHT40 == 1)
1811 && ((pBssInfo->extChOffset != 1) && (pBssInfo->extChOffset != 3)) )
1813 pBssInfo->enableHT40 = 0;
1816 if (pBssInfo->enableHT40 == 1)
1818 if (zfHpIsAllowedChannel(dev, pBssInfo->frequency+((pBssInfo->extChOffset==1)?20:-20)) == 0)
1820 /* if extension channel is not an allowed channel, treat AP as non-HT mode */
1821 pBssInfo->EnableHT = 0;
1822 pBssInfo->enableHT40 = 0;
1823 pBssInfo->extChOffset = 0;
1827 /* get ATH Extended Capability */
1828 if ( ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY)) != 0xffff)&&
1829 ((offset = zfFindBrdcmMrvlRlnkExtCap(dev, buf)) == 0xffff))
1832 pBssInfo->athOwlAp = 1;
1836 pBssInfo->athOwlAp = 0;
1839 /* get Broadcom Extended Capability */
1840 if ( (pBssInfo->EnableHT == 1) //((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY)) != 0xffff)
1841 && ((offset = zfFindBroadcomExtCap(dev, buf)) != 0xffff) )
1843 pBssInfo->broadcomHTAp = 1;
1847 pBssInfo->broadcomHTAp = 0;
1850 /* get Marvel Extended Capability */
1851 if ((offset = zfFindMarvelExtCap(dev, buf)) != 0xffff)
1853 pBssInfo->marvelAp = 1;
1857 pBssInfo->marvelAp = 0;
1860 /* get ATIM window */
1861 if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_IBSS)) != 0xffff )
1863 pBssInfo->atimWindow = zmw_rx_buf_readh(dev, buf,offset+2);
1866 /* Fit for support mode */
1867 if (pBssInfo->frequency > 3000) {
1868 if (wd->supportMode & ZM_WIRELESS_MODE_5_N) {
1870 if (wd->supportMode & ZM_WIRELESS_MODE_5_54) {
1871 /* support mode: a, n */
1874 /* support mode: n */
1875 /* reject non-n bss info */
1876 if (!pBssInfo->EnableHT) {
1882 if (wd->supportMode & ZM_WIRELESS_MODE_5_54) {
1883 /* support mode: a */
1884 /* delete n mode information */
1885 pBssInfo->EnableHT = 0;
1886 pBssInfo->enableHT40 = 0;
1887 pBssInfo->apCap &= (~ZM_All11N_AP);
1888 pBssInfo->extChOffset = 0;
1889 pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
1890 pBssInfo->frameBodysize, ZM_WLAN_EID_HT_CAPABILITY);
1891 pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
1892 pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTCAPABILITY);
1893 pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
1894 pBssInfo->frameBodysize, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY);
1895 pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
1896 pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTINFORMATION);
1898 /* support mode: none */
1903 if (wd->supportMode & ZM_WIRELESS_MODE_24_N) {
1905 if (wd->supportMode & ZM_WIRELESS_MODE_24_54) {
1906 if (wd->supportMode & ZM_WIRELESS_MODE_24_11) {
1907 /* support mode: b, g, n */
1910 /* support mode: g, n */
1911 /* reject b-only bss info */
1912 if ( (!pBssInfo->EnableHT)
1913 && (pBssInfo->extSupportedRates[1] == 0) ) {
1918 if (wd->supportMode & ZM_WIRELESS_MODE_24_11) {
1919 /* support mode: b, n */
1920 /* 1. reject g-only bss info
1921 * 2. if non g-only, delete g mode information
1923 if ( !pBssInfo->EnableHT ) {
1924 if ( zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->supportedRates)
1925 || zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->extSupportedRates) ) {
1928 zfGatherBMode(dev, pBssInfo->supportedRates,
1929 pBssInfo->extSupportedRates);
1932 pBssInfo->frameBodysize = zfRemoveElement(dev,
1933 pBssInfo->frameBody, pBssInfo->frameBodysize,
1935 pBssInfo->frameBodysize = zfRemoveElement(dev,
1936 pBssInfo->frameBody, pBssInfo->frameBodysize,
1937 ZM_WLAN_EID_EXTENDED_RATE);
1939 pBssInfo->frameBodysize = zfUpdateElement(dev,
1940 pBssInfo->frameBody, pBssInfo->frameBodysize,
1941 pBssInfo->supportedRates);
1945 /* support mode: n */
1946 /* reject non-n bss info */
1947 if (!pBssInfo->EnableHT) {
1954 /* delete n mode information */
1955 pBssInfo->EnableHT = 0;
1956 pBssInfo->enableHT40 = 0;
1957 pBssInfo->apCap &= (~ZM_All11N_AP);
1958 pBssInfo->extChOffset = 0;
1959 pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
1960 pBssInfo->frameBodysize, ZM_WLAN_EID_HT_CAPABILITY);
1961 pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
1962 pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTCAPABILITY);
1963 pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
1964 pBssInfo->frameBodysize, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY);
1965 pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
1966 pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTINFORMATION);
1968 if (wd->supportMode & ZM_WIRELESS_MODE_24_54) {
1970 if (wd->supportMode & ZM_WIRELESS_MODE_24_11) {
1971 /* support mode: b, g */
1972 /* delete n mode information */
1974 /* support mode: g */
1975 /* delete n mode information */
1976 /* reject b-only bss info */
1977 if (pBssInfo->extSupportedRates[1] == 0) {
1983 if (wd->supportMode & ZM_WIRELESS_MODE_24_11) {
1984 /* support mode: b */
1985 /* delete n mode information */
1986 if ( zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->supportedRates)
1987 || zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->extSupportedRates) ) {
1990 zfGatherBMode(dev, pBssInfo->supportedRates,
1991 pBssInfo->extSupportedRates);
1994 pBssInfo->frameBodysize = zfRemoveElement(dev,
1995 pBssInfo->frameBody, pBssInfo->frameBodysize,
1997 pBssInfo->frameBodysize = zfRemoveElement(dev,
1998 pBssInfo->frameBody, pBssInfo->frameBodysize,
1999 ZM_WLAN_EID_EXTENDED_RATE);
2001 pBssInfo->frameBodysize = zfUpdateElement(dev,
2002 pBssInfo->frameBody, pBssInfo->frameBodysize,
2003 pBssInfo->supportedRates);
2006 /* support mode: none */
2013 pBssInfo->flag |= ZM_BSS_INFO_VALID_BIT;
2016 /* Update Timer information */
2017 pBssInfo->tick = wd->tick;
2019 /* Update ERP information */
2020 if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_ERP)) != 0xffff )
2022 pBssInfo->erp = zmw_rx_buf_readb(dev, buf, offset+2);
2025 if( (s8_t)pBssInfo->signalStrength < (s8_t)AddInfo->Tail.Data.SignalStrength1 )
2027 /* Update signal strength */
2028 pBssInfo->signalStrength = (u8_t)AddInfo->Tail.Data.SignalStrength1;
2029 /* Update signal quality */
2030 pBssInfo->signalQuality = (u8_t)(AddInfo->Tail.Data.SignalStrength1 * 2);
2032 /* Update the sorting value */
2033 pBssInfo->sortValue = zfComputeBssInfoWeightValue(dev,
2034 (pBssInfo->supportedRates[6] + pBssInfo->extSupportedRates[0]),
2036 pBssInfo->enableHT40,
2037 pBssInfo->signalStrength);
2051 void zfStaProcessBeacon(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo) //CWYang(m)
2053 /* Parse TIM and send PS-POLL in power saving mode */
2054 struct zsWlanBeaconFrameHeader* pBeaconHeader;
2055 struct zsBssInfo* pBssInfo;
2056 u8_t pBuf[sizeof(struct zsWlanBeaconFrameHeader)];
2060 zmw_get_wlan_dev(dev);
2062 zmw_declare_for_critical_section();
2064 /* sta routine jobs */
2065 zfStaProtErpMonitor(dev, buf); /* check protection mode */
2067 if (zfStaIsConnected(dev))
2069 ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid);
2071 if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
2073 if ( zfRxBufferEqualToStr(dev, buf, bssid, ZM_WLAN_HEADER_A2_OFFSET, 6) )
2075 zfPowerSavingMgrProcessBeacon(dev, buf);
2076 zfStaUpdateWmeParameter(dev, buf);
2077 if (wd->sta.DFSEnable)
2078 zfStaUpdateDot11HDFS(dev, buf);
2079 if (wd->sta.TPCEnable)
2080 zfStaUpdateDot11HTPC(dev, buf);
2081 /* update signal strength and signal quality */
2082 zfStaSignalStatistic(dev, AddInfo->Tail.Data.SignalStrength1,
2083 AddInfo->Tail.Data.SignalQuality); //CWYang(+)
2084 wd->sta.rxBeaconCount++;
2087 else if ( wd->wlanMode == ZM_MODE_IBSS )
2089 if ( zfRxBufferEqualToStr(dev, buf, bssid, ZM_WLAN_HEADER_A3_OFFSET, 6) )
2092 struct zsPartnerNotifyEvent event;
2094 zm_debug_msg0("20070916 Receive opposite Beacon!");
2095 zmw_enter_critical_section(dev);
2096 wd->sta.ibssReceiveBeaconCount++;
2097 zmw_leave_critical_section(dev);
2099 res = zfStaSetOppositeInfoFromRxBuf(dev, buf);
2102 // New peer station found. Notify the wrapper now
2103 zfInitPartnerNotifyEvent(dev, buf, &event);
2104 if (wd->zfcbIbssPartnerNotify != NULL)
2106 wd->zfcbIbssPartnerNotify(dev, 1, &event);
2109 /* update signal strength and signal quality */
2110 zfStaSignalStatistic(dev, AddInfo->Tail.Data.SignalStrength1,
2111 AddInfo->Tail.Data.SignalQuality); //CWYang(+)
2113 //else if ( wd->sta.ibssPartnerStatus == ZM_IBSS_PARTNER_LOST )
2114 // Why does this happen in IBSS?? The impact of Vista since
2115 // we need to tell it the BSSID
2117 else if ( wd->sta.oppositeCount == 0 )
2118 { /* IBSS merge if SSID matched */
2119 if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID)) != 0xffff )
2121 if ( (wd->sta.ssidLen == zmw_buf_readb(dev, buf, offset+1))&&
2122 (zfRxBufferEqualToStr(dev, buf, wd->sta.ssid,
2123 offset+2, wd->sta.ssidLen)) )
2125 capabilityInfo = zmw_buf_readh(dev, buf, 34);
2127 if ( capabilityInfo & ZM_BIT_1 )
2129 if ( (wd->sta.capability[0] & ZM_BIT_4) ==
2130 (capabilityInfo & ZM_BIT_4) )
2132 zm_debug_msg0("IBSS merge");
2133 zfCopyFromRxBuffer(dev, buf, bssid,
2134 ZM_WLAN_HEADER_A3_OFFSET, 6);
2135 zfUpdateBssid(dev, bssid);
2145 /* return if not channel scan */
2146 if ( !wd->sta.bChannelScan )
2151 zfCopyFromRxBuffer(dev, buf, pBuf, 0, sizeof(struct zsWlanBeaconFrameHeader));
2152 pBeaconHeader = (struct zsWlanBeaconFrameHeader*) pBuf;
2154 zmw_enter_critical_section(dev);
2156 //zm_debug_msg1("bss count = ", wd->sta.bssList.bssCount);
2158 pBssInfo = zfStaFindBssInfo(dev, buf, pBeaconHeader);
2160 if ( pBssInfo == NULL )
2162 /* Allocate a new entry if BSS not in the scan list */
2163 pBssInfo = zfBssInfoAllocate(dev);
2164 if (pBssInfo != NULL)
2166 res = zfStaInitBssInfo(dev, buf, pBeaconHeader, pBssInfo, AddInfo, 0);
2167 //zfDumpSSID(pBssInfo->ssid[1], &(pBssInfo->ssid[2]));
2170 zfBssInfoFree(dev, pBssInfo);
2174 zfBssInfoInsertToList(dev, pBssInfo);
2180 res = zfStaInitBssInfo(dev, buf, pBeaconHeader, pBssInfo, AddInfo, 1);
2183 zfBssInfoRemoveFromList(dev, pBssInfo);
2184 zfBssInfoFree(dev, pBssInfo);
2186 else if ( wd->wlanMode == ZM_MODE_IBSS )
2190 // It would reset the alive counter if the peer station is found!
2191 zfStaFindFreeOpposite(dev, (u16_t *)pBssInfo->macaddr, &idx);
2195 zmw_leave_critical_section(dev);
2203 void zfAuthFreqCompleteCb(zdev_t* dev)
2205 zmw_get_wlan_dev(dev);
2206 zmw_declare_for_critical_section();
2208 zmw_enter_critical_section(dev);
2210 if (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_COMPLETED)
2212 zm_debug_msg0("ZM_STA_CONN_STATE_ASSOCIATE");
2213 wd->sta.connectTimer = wd->tick;
2214 wd->sta.connectState = ZM_STA_CONN_STATE_ASSOCIATE;
2217 zmw_leave_critical_section(dev);
2221 /************************************************************************/
2223 /* FUNCTION DESCRIPTION zfProcessAuth */
2224 /* Process authenticate management frame. */
2227 /* dev : device pointer */
2228 /* buf : auth frame buffer */
2234 /* Stephen Chen ZyDAS Technology Corporation 2005.10 */
2236 /************************************************************************/
2237 /* Note : AP allows one authenticating STA at a time, does not */
2238 /* support multiple authentication process. Make sure */
2239 /* authentication state machine will not be blocked due */
2240 /* to incompleted authentication handshake. */
2241 void zfStaProcessAuth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId)
2243 struct zsWlanAuthFrameHeader* pAuthFrame;
2244 u8_t pBuf[sizeof(struct zsWlanAuthFrameHeader)];
2247 zmw_get_wlan_dev(dev);
2248 zmw_declare_for_critical_section();
2250 if ( !zfStaIsConnecting(dev) )
2255 pAuthFrame = (struct zsWlanAuthFrameHeader*) pBuf;
2256 zfCopyFromRxBuffer(dev, buf, pBuf, 0, sizeof(struct zsWlanAuthFrameHeader));
2258 if ( wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_OPEN )
2260 if ( (zmw_le16_to_cpu(pAuthFrame->seq) == 2)&&
2261 (zmw_le16_to_cpu(pAuthFrame->algo) == 0)&&
2262 (zmw_le16_to_cpu(pAuthFrame->status) == 0) )
2265 zmw_enter_critical_section(dev);
2266 wd->sta.connectTimer = wd->tick;
2267 zm_debug_msg0("ZM_STA_CONN_STATE_AUTH_COMPLETED");
2268 wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_COMPLETED;
2269 zmw_leave_critical_section(dev);
2271 //Set channel according to AP's configuration
2272 //Move to here because of Cisco 11n AP feature
2273 zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
2274 wd->ExtOffset, zfAuthFreqCompleteCb);
2276 /* send association frame */
2277 if ( wd->sta.connectByReasso )
2279 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_REASOCREQ,
2280 wd->sta.bssid, 0, 0, 0);
2284 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ASOCREQ,
2285 wd->sta.bssid, 0, 0, 0);
2292 zm_debug_msg1("authentication failed, status = ",
2293 pAuthFrame->status);
2295 if (wd->sta.authMode == ZM_AUTH_MODE_AUTO)
2297 wd->sta.bIsSharedKey = 1;
2298 zfStaStartConnect(dev, wd->sta.bIsSharedKey);
2302 zm_debug_msg0("ZM_STA_STATE_DISCONNECT");
2303 zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3);
2307 else if ( wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_1 )
2309 if ( (zmw_le16_to_cpu(pAuthFrame->algo) == 1) &&
2310 (zmw_le16_to_cpu(pAuthFrame->seq) == 2) &&
2311 (zmw_le16_to_cpu(pAuthFrame->status) == 0))
2312 //&& (pAuthFrame->challengeText[1] <= 255) )
2314 zfMemoryCopy(wd->sta.challengeText, pAuthFrame->challengeText,
2315 pAuthFrame->challengeText[1]+2);
2317 /* send the 3rd authentication frame */
2320 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_AUTH,
2321 wd->sta.bssid, p1, p2, 0);
2323 zmw_enter_critical_section(dev);
2324 wd->sta.connectTimer = wd->tick;
2326 zm_debug_msg0("ZM_STA_SUB_STATE_AUTH_SHARE_2");
2327 wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_SHARE_2;
2328 zmw_leave_critical_section(dev);
2332 zm_debug_msg1("authentication failed, status = ",
2333 pAuthFrame->status);
2335 zm_debug_msg0("ZM_STA_STATE_DISCONNECT");
2336 zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3);
2339 else if ( wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_2 )
2341 if ( (zmw_le16_to_cpu(pAuthFrame->algo) == 1)&&
2342 (zmw_le16_to_cpu(pAuthFrame->seq) == 4)&&
2343 (zmw_le16_to_cpu(pAuthFrame->status) == 0) )
2345 //Set channel according to AP's configuration
2346 //Move to here because of Cisco 11n AP feature
2347 zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
2348 wd->ExtOffset, NULL);
2350 /* send association frame */
2351 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ASOCREQ,
2352 wd->sta.bssid, 0, 0, 0);
2354 zmw_enter_critical_section(dev);
2355 wd->sta.connectTimer = wd->tick;
2357 zm_debug_msg0("ZM_STA_SUB_STATE_ASSOCIATE");
2358 wd->sta.connectState = ZM_STA_CONN_STATE_ASSOCIATE;
2359 zmw_leave_critical_section(dev);
2363 zm_debug_msg1("authentication failed, status = ",
2364 pAuthFrame->status);
2366 zm_debug_msg0("ZM_STA_STATE_DISCONNECT");
2367 zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3);
2372 zm_debug_msg0("unknown case");
2376 void zfStaProcessAsocReq(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId)
2382 void zfStaProcessAsocRsp(zdev_t* dev, zbuf_t* buf)
2384 struct zsWlanAssoFrameHeader* pAssoFrame;
2385 u8_t pBuf[sizeof(struct zsWlanAssoFrameHeader)];
2388 u32_t oneTxStreamCap;
2390 zmw_get_wlan_dev(dev);
2392 if ( !zfStaIsConnecting(dev) )
2397 pAssoFrame = (struct zsWlanAssoFrameHeader*) pBuf;
2398 zfCopyFromRxBuffer(dev, buf, pBuf, 0, sizeof(struct zsWlanAssoFrameHeader));
2400 if ( wd->sta.connectState == ZM_STA_CONN_STATE_ASSOCIATE )
2402 if ( pAssoFrame->status == 0 )
2404 zm_debug_msg0("ZM_STA_STATE_CONNECTED");
2406 if (wd->sta.EnableHT == 1)
2408 wd->sta.wmeConnected = 1;
2410 if ((wd->sta.wmeEnabled & ZM_STA_WME_ENABLE_BIT) != 0) //WME enabled
2412 /* Asoc rsp may contain WME parameter element */
2413 if ((offset = zfFindWifiElement(dev, buf, 2, 1)) != 0xffff)
2415 zm_debug_msg0("WME enable");
2416 wd->sta.wmeConnected = 1;
2417 if ((wd->sta.wmeEnabled & ZM_STA_UAPSD_ENABLE_BIT) != 0)
2419 if ((zmw_rx_buf_readb(dev, buf, offset+8) & 0x80) != 0)
2421 zm_debug_msg0("UAPSD enable");
2422 wd->sta.qosInfo = wd->sta.wmeQosInfo;
2426 zfStaUpdateWmeParameter(dev, buf);
2431 //Store asoc response frame body, for VISTA only
2432 wd->sta.asocRspFrameBodySize = zfwBufGetSize(dev, buf)-24;
2433 if (wd->sta.asocRspFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE)
2435 wd->sta.asocRspFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE;
2437 for (i=0; i<wd->sta.asocRspFrameBodySize; i++)
2439 wd->sta.asocRspFrameBody[i] = zmw_rx_buf_readb(dev, buf, i+24);
2442 zfStaStoreAsocRspIe(dev, buf);
2443 if (wd->sta.EnableHT &&
2444 ((wd->sta.ie.HtCap.HtCapInfo & HTCAP_SupChannelWidthSet) != 0) &&
2445 (wd->ExtOffset != 0))
2447 wd->sta.htCtrlBandwidth = 1;
2451 wd->sta.htCtrlBandwidth = 0;
2454 //Set channel according to AP's configuration
2455 //zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
2456 // wd->ExtOffset, NULL);
2458 if (wd->sta.EnableHT == 1)
2460 wd->addbaComplete = 0;
2462 if ((wd->sta.SWEncryptEnable & ZM_SW_TKIP_ENCRY_EN) == 0 &&
2463 (wd->sta.SWEncryptEnable & ZM_SW_WEP_ENCRY_EN) == 0)
2466 zfAggSendAddbaRequest(dev, wd->sta.bssid, 0, 0);
2467 zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_ADDBA, 100);
2471 /* set RIFS support */
2472 if(wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_RIFSMode)
2475 // zfHpSetRifs(dev, wd->sta.EnableHT, 1, (wd->sta.currentFrequency < 3000)? 1:0);
2478 wd->sta.aid = pAssoFrame->aid & 0x3fff;
2479 wd->sta.oppositeCount = 0; /* reset opposite count */
2480 zfStaSetOppositeInfoFromRxBuf(dev, buf);
2482 wd->sta.rxBeaconCount = 16;
2484 zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED);
2485 wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev);
2486 if (wd->zfcbConnectNotify != NULL)
2488 if (wd->sta.EnableHT != 0) /* 11n */
2490 oneTxStreamCap = (zfHpCapability(dev) & ZM_HP_CAP_11N_ONE_TX_STREAM);
2491 if (wd->sta.htCtrlBandwidth == 1) /* HT40*/
2493 if(oneTxStreamCap) /* one Tx stream */
2497 wd->CurrentTxRateKbps = 150000;
2498 wd->CurrentRxRateKbps = 300000;
2502 wd->CurrentTxRateKbps = 135000;
2503 wd->CurrentRxRateKbps = 270000;
2506 else /* Two Tx streams */
2510 wd->CurrentTxRateKbps = 300000;
2511 wd->CurrentRxRateKbps = 300000;
2515 wd->CurrentTxRateKbps = 270000;
2516 wd->CurrentRxRateKbps = 270000;
2522 if(oneTxStreamCap) /* one Tx stream */
2524 wd->CurrentTxRateKbps = 650000;
2525 wd->CurrentRxRateKbps = 130000;
2527 else /* Two Tx streams */
2529 wd->CurrentTxRateKbps = 130000;
2530 wd->CurrentRxRateKbps = 130000;
2536 if (wd->sta.connection_11b != 0)
2538 wd->CurrentTxRateKbps = 11000;
2539 wd->CurrentRxRateKbps = 11000;
2543 wd->CurrentTxRateKbps = 54000;
2544 wd->CurrentRxRateKbps = 54000;
2549 wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT, wd->sta.bssid);
2551 wd->sta.connectByReasso = TRUE;
2552 wd->sta.failCntOfReasso = 0;
2554 zfPowerSavingMgrConnectNotify(dev);
2556 /* Disable here because fixed rate is only for test, TBD. */
2557 //if (wd->sta.EnableHT)
2559 // wd->txMCS = 7; //Rate = 65Mbps
2560 // wd->txMT = 2; // Ht rate
2561 // wd->enableAggregation = 2; // Enable Aggregation
2566 zm_debug_msg1("association failed, status = ",
2567 pAssoFrame->status);
2569 zm_debug_msg0("ZM_STA_STATE_DISCONNECT");
2570 wd->sta.connectByReasso = FALSE;
2571 zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_ASOC_FAILED, wd->sta.bssid, 3);
2577 void zfStaStoreAsocRspIe(zdev_t* dev, zbuf_t* buf)
2584 u8_t asocExtOffset = 0;
2586 zmw_get_wlan_dev(dev);
2588 for (i=0; i<wd->sta.asocRspFrameBodySize; i++)
2590 wd->sta.asocRspFrameBody[i] = zmw_rx_buf_readb(dev, buf, i+24);
2593 /* HT capabilities: 28 octets */
2594 if ( ((wd->sta.currentFrequency > 3000) && !(wd->supportMode & ZM_WIRELESS_MODE_5_N))
2595 || ((wd->sta.currentFrequency < 3000) && !(wd->supportMode & ZM_WIRELESS_MODE_24_N)) )
2598 htcap = (u8_t *)&wd->sta.ie.HtCap;
2599 for (i=0; i<28; i++)
2603 wd->BandWidth40 = 0;
2608 if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY)) != 0xffff)
2611 zm_debug_msg0("atheros pre n");
2612 htcap = (u8_t *)&wd->sta.ie.HtCap;
2613 htcap[0] = zmw_rx_buf_readb(dev, buf, offset);
2615 for (i=1; i<=26; i++)
2617 htcap[i+1] = zmw_rx_buf_readb(dev, buf, offset + i);
2618 zm_msg2_mm(ZM_LV_1, "ASOC: HT Capabilities, htcap=", htcap[i+1]);
2621 else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTCAPABILITY)) != 0xffff)
2623 /* pre n 2.0 standard */
2624 zm_debug_msg0("pre n 2.0 standard");
2625 htcap = (u8_t *)&wd->sta.ie.HtCap;
2626 for (i=0; i<28; i++)
2628 htcap[i] = zmw_rx_buf_readb(dev, buf, offset + i);
2629 zm_msg2_mm(ZM_LV_1, "ASOC: HT Capabilities, htcap=", htcap[i]);
2635 htcap = (u8_t *)&wd->sta.ie.HtCap;
2636 for (i=0; i<28; i++)
2640 wd->BandWidth40 = 0;
2645 asocBw40 = (u8_t)((wd->sta.ie.HtCap.HtCapInfo & HTCAP_SupChannelWidthSet) >> 1);
2647 /* HT information */
2648 if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY)) != 0xffff)
2651 zm_debug_msg0("atheros pre n HTINFO");
2653 htcap = (u8_t *)&wd->sta.ie.HtInfo;
2654 htcap[0] = zmw_rx_buf_readb(dev, buf, offset);
2656 for (i=1; i<=22; i++)
2658 htcap[i+1] = zmw_rx_buf_readb(dev, buf, offset + i);
2659 zm_msg2_mm(ZM_LV_1, "ASOC: HT Info, htinfo=", htcap[i+1]);
2662 else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTINFORMATION)) != 0xffff)
2664 /* pre n 2.0 standard */
2665 zm_debug_msg0("pre n 2.0 standard HTINFO");
2666 length = zmw_rx_buf_readb(dev, buf, offset + 1);
2667 htcap = (u8_t *)&wd->sta.ie.HtInfo;
2668 for (i=0; i<24; i++)
2670 htcap[i] = zmw_rx_buf_readb(dev, buf, offset + i);
2671 zm_msg2_mm(ZM_LV_1, "ASOC: HT Info, htinfo=", htcap[i]);
2676 zm_debug_msg0("no HTINFO");
2677 htcap = (u8_t *)&wd->sta.ie.HtInfo;
2678 for (i=0; i<24; i++)
2683 asocExtOffset = wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_ExtChannelOffsetBelow;
2685 if ((wd->sta.EnableHT == 1) && (asocBw40 == 1) && ((asocExtOffset == 1) || (asocExtOffset == 3)))
2687 wd->BandWidth40 = asocBw40;
2688 wd->ExtOffset = asocExtOffset;
2692 wd->BandWidth40 = 0;
2699 void zfStaProcessDeauth(zdev_t* dev, zbuf_t* buf)
2703 zmw_get_wlan_dev(dev);
2704 zmw_declare_for_critical_section();
2706 /* STA : if SA=connected AP then disconnect with AP */
2707 if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
2709 apMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET);
2710 apMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+2);
2711 apMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+4);
2712 if ((apMacAddr[0] == wd->sta.bssid[0]) && (apMacAddr[1] == wd->sta.bssid[1]) && (apMacAddr[2] == wd->sta.bssid[2]))
2714 if (zfwBufGetSize(dev, buf) >= 24+2) //not a malformed frame
2716 if ( zfStaIsConnected(dev) )
2718 zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_DEAUTH, wd->sta.bssid, 2);
2720 else if (zfStaIsConnecting(dev))
2722 zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3);
2730 else if ( wd->wlanMode == ZM_MODE_IBSS )
2732 u16_t peerMacAddr[3];
2736 if ( zfStaIsConnected(dev) )
2738 peerMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
2739 peerMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+2);
2740 peerMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+4);
2742 zmw_enter_critical_section(dev);
2743 res = zfStaFindOppositeByMACAddr(dev, peerMacAddr, &peerIdx);
2746 wd->sta.oppositeInfo[peerIdx].aliveCounter = 0;
2748 zmw_leave_critical_section(dev);
2753 void zfStaProcessDisasoc(zdev_t* dev, zbuf_t* buf)
2757 zmw_get_wlan_dev(dev);
2759 /* STA : if SA=connected AP then disconnect with AP */
2760 if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
2762 apMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET);
2763 apMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+2);
2764 apMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+4);
2766 if ((apMacAddr[0] == wd->sta.bssid[0]) && (apMacAddr[1] == wd->sta.bssid[1]) && (apMacAddr[2] == wd->sta.bssid[2]))
2768 if (zfwBufGetSize(dev, buf) >= 24+2) //not a malformed frame
2770 if ( zfStaIsConnected(dev) )
2772 zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_DISASOC, wd->sta.bssid, 2);
2776 zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_ASOC_FAILED, wd->sta.bssid, 3);
2785 /************************************************************************/
2787 /* FUNCTION DESCRIPTION zfProcessProbeReq */
2788 /* Process probe request management frame. */
2791 /* dev : device pointer */
2792 /* buf : auth frame buffer */
2798 /* Stephen Chen ZyDAS Technology Corporation 2005.10 */
2800 /************************************************************************/
2801 void zfStaProcessProbeReq(zdev_t* dev, zbuf_t* buf, u16_t* src)
2808 zmw_get_wlan_dev(dev);
2810 /* check mode : AP/IBSS */
2811 if ((wd->wlanMode != ZM_MODE_AP) && (wd->wlanMode != ZM_MODE_IBSS))
2813 zm_msg0_mm(ZM_LV_3, "Ignore probe req");
2818 if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID)) == 0xffff)
2820 zm_msg0_mm(ZM_LV_3, "probe req SSID not found");
2824 len = zmw_rx_buf_readb(dev, buf, offset+1);
2826 for (i=0; i<ZM_MAX_AP_SUPPORT; i++)
2828 if ((wd->ap.apBitmap & (i<<i)) != 0)
2831 /* boardcast SSID */
2832 if ((len == 0) && (wd->ap.hideSsid[i] == 0))
2836 /* Not broadcast SSID */
2837 else if (wd->ap.ssidLen[i] == len)
2839 for (j=0; j<len; j++)
2841 if (zmw_rx_buf_readb(dev, buf, offset+1+j)
2842 != wd->ap.ssid[i][j])
2854 /* Send probe response */
2855 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBERSP, src, i, 0, 0);
2861 void zfStaProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo)
2863 /* return if not channel scan */
2864 // Probe response is sent with unicast. Is this required?
2865 // IBSS would send probe request and the code below would prevent
2866 // the probe response from handling.
2868 zmw_get_wlan_dev(dev);
2870 if ( !wd->sta.bChannelScan )
2876 zfProcessProbeRsp(dev, buf, AddInfo);
2879 void zfIBSSSetupBssDesc(zdev_t *dev)
2881 #ifdef ZM_ENABLE_IBSS_WPA2PSK
2884 struct zsBssInfo *pBssInfo;
2887 zmw_get_wlan_dev(dev);
2889 pBssInfo = &wd->sta.ibssBssDesc;
2890 zfZeroMemory((u8_t *)pBssInfo, sizeof(struct zsBssInfo));
2892 pBssInfo->signalStrength = 100;
2894 zfMemoryCopy((u8_t *)pBssInfo->macaddr, (u8_t *)wd->macAddr,6);
2895 zfMemoryCopy((u8_t *)pBssInfo->bssid, (u8_t *)wd->sta.bssid, 6);
2897 pBssInfo->beaconInterval[0] = (u8_t)(wd->beaconInterval) ;
2898 pBssInfo->beaconInterval[1] = (u8_t)((wd->beaconInterval) >> 8) ;
2900 pBssInfo->capability[0] = wd->sta.capability[0];
2901 pBssInfo->capability[1] = wd->sta.capability[1];
2903 pBssInfo->ssid[0] = ZM_WLAN_EID_SSID;
2904 pBssInfo->ssid[1] = wd->sta.ssidLen;
2905 zfMemoryCopy((u8_t *)&pBssInfo->ssid[2], (u8_t *)wd->sta.ssid, wd->sta.ssidLen);
2906 zfMemoryCopy((u8_t *)&pBssInfo->frameBody[offset], (u8_t *)pBssInfo->ssid,
2907 wd->sta.ssidLen + 2);
2908 offset += wd->sta.ssidLen + 2;
2912 /* DS parameter set */
2913 pBssInfo->channel = zfChFreqToNum(wd->frequency, NULL);
2914 pBssInfo->frequency = wd->frequency;
2915 pBssInfo->atimWindow = wd->sta.atimWindow;
2917 #ifdef ZM_ENABLE_IBSS_WPA2PSK
2918 if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK )
2928 /* Group Cipher Suite, default=TKIP */
2929 0x00, 0x0f, 0xac, 0x04,
2930 /* Pairwise Cipher Suite Count */
2932 /* Pairwise Cipher Suite, default=TKIP */
2933 0x00, 0x0f, 0xac, 0x02,
2934 /* Authentication and Key Management Suite Count */
2936 /* Authentication type, default=PSK */
2937 0x00, 0x0f, 0xac, 0x02,
2938 /* RSN capability */
2942 /* Overwrite Group Cipher Suite by AP's setting */
2943 zfMemoryCopy(rsn+4, zgWpa2AesOui, 4);
2945 if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
2947 /* Overwrite Pairwise Cipher Suite by AES */
2948 zfMemoryCopy(rsn+10, zgWpa2AesOui, 4);
2952 pBssInfo->frameBody[offset++] = ZM_WLAN_EID_RSN_IE ;
2955 pBssInfo->frameBody[offset++] = rsn[1] ;
2958 for(i=0; i<rsn[1]; i++)
2960 pBssInfo->frameBody[offset++] = rsn[i+2] ;
2963 zfMemoryCopy(pBssInfo->rsnIe, rsn, rsn[1]+2);
2968 void zfIbssConnectNetwork(zdev_t* dev)
2970 struct zsBssInfo* pBssInfo;
2971 struct zsBssInfo tmpBssInfo;
2972 u8_t macAddr[6], bssid[6], bssNotFound = TRUE;
2975 struct zsPartnerNotifyEvent event;
2977 u16_t oppositeWepStatus;
2979 zmw_get_wlan_dev(dev);
2981 zmw_declare_for_critical_section();
2983 /* change state to CONNECTING and stop the channel scanning */
2984 zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTING);
2985 zfPowerSavingMgrWakeup(dev);
2987 /* Set TxQs CWMIN, CWMAX, AIFS and TXO to WME STA default. */
2988 zfUpdateDefaultQosParameter(dev, 0);
2990 wd->sta.bProtectionMode = FALSE;
2991 zfHpSetSlotTime(dev, 1);
2994 wd->sta.capability[0] &= ~ZM_BIT_0;
2996 wd->sta.capability[0] |= ZM_BIT_1;
2997 /* not not use short slot time */
2998 wd->sta.capability[1] &= ~ZM_BIT_2;
3000 wd->sta.wmeConnected = 0;
3001 wd->sta.psMgr.tempWakeUp = 0;
3002 wd->sta.qosInfo = 0;
3003 wd->sta.EnableHT = 0;
3004 wd->BandWidth40 = 0;
3007 if ( wd->sta.bssList.bssCount )
3009 //Reorder BssList by RSSI--CWYang(+)
3010 zfBssInfoReorderList(dev);
3012 zmw_enter_critical_section(dev);
3014 pBssInfo = wd->sta.bssList.head;
3016 for(i=0; i<wd->sta.bssList.bssCount; i++)
3018 // 20070806 #1 Privacy bit
3019 if ( pBssInfo->capability[0] & ZM_BIT_4 )
3020 { // Privacy Ibss network
3021 // zm_debug_msg0("Privacy bit on");
3022 oppositeWepStatus = ZM_ENCRYPTION_WEP_ENABLED;
3024 if ( pBssInfo->rsnIe[1] != 0 )
3026 if ( (pBssInfo->rsnIe[7] == 0x01) || (pBssInfo->rsnIe[7] == 0x05) )
3027 { // WEP-40 & WEP-104
3028 // zm_debug_msg0("WEP40 or WEP104");
3029 oppositeWepStatus = ZM_ENCRYPTION_WEP_ENABLED;
3031 else if ( pBssInfo->rsnIe[7] == 0x02 )
3033 // zm_debug_msg0("TKIP");
3034 oppositeWepStatus = ZM_ENCRYPTION_TKIP;
3036 else if ( pBssInfo->rsnIe[7] == 0x04 )
3038 // zm_debug_msg0("CCMP-AES");
3039 oppositeWepStatus = ZM_ENCRYPTION_AES;
3045 // zm_debug_msg0("Privacy bit off");
3046 oppositeWepStatus = ZM_ENCRYPTION_WEP_DISABLED;
3049 if ( (zfMemoryIsEqual(&(pBssInfo->ssid[2]), wd->sta.ssid,
3051 (wd->sta.ssidLen == pBssInfo->ssid[1])&&
3052 (oppositeWepStatus == wd->sta.wepStatus) )
3054 /* Check support mode */
3055 if (pBssInfo->frequency > 3000) {
3056 if ( (pBssInfo->EnableHT == 1)
3057 || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP
3059 channelFlags = CHANNEL_A_HT;
3060 if (pBssInfo->enableHT40 == 1) {
3061 channelFlags |= CHANNEL_HT40;
3064 channelFlags = CHANNEL_A;
3067 if ( (pBssInfo->EnableHT == 1)
3068 || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP
3070 channelFlags = CHANNEL_G_HT;
3071 if(pBssInfo->enableHT40 == 1) {
3072 channelFlags |= CHANNEL_HT40;
3075 if (pBssInfo->extSupportedRates[1] == 0) {
3076 channelFlags = CHANNEL_B;
3078 channelFlags = CHANNEL_G;
3083 if ( ((channelFlags == CHANNEL_B) && (wd->connectMode & ZM_BIT_0))
3084 || ((channelFlags == CHANNEL_G) && (wd->connectMode & ZM_BIT_1))
3085 || ((channelFlags == CHANNEL_A) && (wd->connectMode & ZM_BIT_2))
3086 || ((channelFlags & CHANNEL_HT20) && (wd->connectMode & ZM_BIT_3)) )
3088 pBssInfo = pBssInfo->next;
3092 /* Bypass DFS channel */
3093 if (zfHpIsDfsChannelNCS(dev, pBssInfo->frequency))
3095 zm_debug_msg0("Bypass DFS channel");
3099 /* check IBSS bit */
3100 if ( pBssInfo->capability[0] & ZM_BIT_1 )
3102 /* may check timestamp here */
3108 pBssInfo = pBssInfo->next;
3111 if ((j < wd->sta.bssList.bssCount) && (pBssInfo != NULL))
3113 zfwMemoryCopy((u8_t*)&tmpBssInfo, (u8_t*)(pBssInfo), sizeof(struct zsBssInfo));
3114 pBssInfo = &tmpBssInfo;
3121 zmw_leave_critical_section(dev);
3123 //if ( j < wd->sta.bssList.bssCount )
3124 if (pBssInfo != NULL)
3128 zm_debug_msg0("IBSS found");
3130 /* Found IBSS, reset bssNotFoundCount */
3131 zmw_enter_critical_section(dev);
3132 wd->sta.bssNotFoundCount = 0;
3133 zmw_leave_critical_section(dev);
3135 bssNotFound = FALSE;
3136 wd->sta.atimWindow = pBssInfo->atimWindow;
3137 wd->frequency = pBssInfo->frequency;
3138 //wd->sta.flagFreqChanging = 1;
3139 zfCoreSetFrequency(dev, wd->frequency);
3140 zfUpdateBssid(dev, pBssInfo->bssid);
3141 zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_ZERO);
3142 zfUpdateSupportRate(dev, pBssInfo->supportedRates);
3143 zfUpdateSupportRate(dev, pBssInfo->extSupportedRates);
3144 wd->beaconInterval = pBssInfo->beaconInterval[0] +
3145 (((u16_t) pBssInfo->beaconInterval[1]) << 8);
3147 if (wd->beaconInterval == 0)
3149 wd->beaconInterval = 100;
3152 /* rsn information element */
3153 if ( pBssInfo->rsnIe[1] != 0 )
3155 zfMemoryCopy(wd->sta.rsnIe, pBssInfo->rsnIe,
3156 pBssInfo->rsnIe[1]+2);
3158 #ifdef ZM_ENABLE_IBSS_WPA2PSK
3159 /* If not use RSNA , run traditional */
3160 zmw_enter_critical_section(dev);
3161 wd->sta.ibssWpa2Psk = 1;
3162 zmw_leave_critical_section(dev);
3167 wd->sta.rsnIe[1] = 0;
3171 if ( pBssInfo->capability[0] & ZM_BIT_4 )
3173 wd->sta.capability[0] |= ZM_BIT_4;
3177 wd->sta.capability[0] &= ~ZM_BIT_4;
3181 wd->preambleTypeInUsed = wd->preambleType;
3182 if ( wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_AUTO )
3184 if (pBssInfo->capability[0] & ZM_BIT_5)
3186 wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT;
3190 wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_LONG;
3194 if (wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_LONG)
3196 wd->sta.capability[0] &= ~ZM_BIT_5;
3200 wd->sta.capability[0] |= ZM_BIT_5;
3203 wd->sta.beaconFrameBodySize = pBssInfo->frameBodysize + 12;
3205 if (wd->sta.beaconFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE)
3207 wd->sta.beaconFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE;
3212 wd->sta.beaconFrameBody[k] = pBssInfo->timeStamp[k];
3214 wd->sta.beaconFrameBody[8] = pBssInfo->beaconInterval[0];
3215 wd->sta.beaconFrameBody[9] = pBssInfo->beaconInterval[1];
3216 wd->sta.beaconFrameBody[10] = pBssInfo->capability[0];
3217 wd->sta.beaconFrameBody[11] = pBssInfo->capability[1];
3218 //for (k=12; k<wd->sta.beaconFrameBodySize; k++)
3219 for (k=0; k<pBssInfo->frameBodysize; k++)
3221 wd->sta.beaconFrameBody[k+12] = pBssInfo->frameBody[k];
3224 zmw_enter_critical_section(dev);
3225 res = zfStaSetOppositeInfoFromBSSInfo(dev, pBssInfo);
3228 zfMemoryCopy(event.bssid, (u8_t *)(pBssInfo->bssid), 6);
3229 zfMemoryCopy(event.peerMacAddr, (u8_t *)(pBssInfo->macaddr), 6);
3231 zmw_leave_critical_section(dev);
3233 //zfwIbssPartnerNotify(dev, 1, &event);
3238 /* IBSS not found */
3241 #ifdef ZM_ENABLE_IBSS_WPA2PSK
3244 if ( wd->sta.ibssJoinOnly )
3246 zm_debug_msg0("IBSS join only...retry...");
3250 if(wd->sta.bssNotFoundCount<2)
3252 zmw_enter_critical_section(dev);
3253 zm_debug_msg1("IBSS not found, do sitesurvey!! bssNotFoundCount=", wd->sta.bssNotFoundCount);
3254 wd->sta.bssNotFoundCount++;
3255 zmw_leave_critical_section(dev);
3260 zmw_enter_critical_section(dev);
3261 /* Fail IBSS found, TODO create IBSS */
3262 wd->sta.bssNotFoundCount = 0;
3263 zmw_leave_critical_section(dev);
3267 if (zfHpIsDfsChannel(dev, wd->frequency))
3269 wd->frequency = zfHpFindFirstNonDfsChannel(dev, wd->frequency > 3000);
3272 if( wd->ws.autoSetFrequency == 0 )
3273 { /* Auto set frequency */
3274 zm_debug_msg1("Create Ad Hoc Network Band ", wd->ws.adhocMode);
3275 wd->frequency = zfFindCleanFrequency(dev, wd->ws.adhocMode);
3276 wd->ws.autoSetFrequency = 0xff;
3278 zm_debug_msg1("IBSS not found, created one in channel ", wd->frequency);
3280 wd->sta.ibssBssIsCreator = 1;
3282 //wd->sta.flagFreqChanging = 1;
3283 zfCoreSetFrequency(dev, wd->frequency);
3284 if (wd->sta.bDesiredBssid == TRUE)
3288 bssid[k] = wd->sta.desiredBssid[k];
3294 macAddr[0] = (wd->macAddr[0] & 0xff);
3295 macAddr[1] = (wd->macAddr[0] >> 8);
3296 macAddr[2] = (wd->macAddr[1] & 0xff);
3297 macAddr[3] = (wd->macAddr[1] >> 8);
3298 macAddr[4] = (wd->macAddr[2] & 0xff);
3299 macAddr[5] = (wd->macAddr[2] >> 8);
3300 zfGenerateRandomBSSID(dev, (u8_t *)wd->macAddr, (u8_t *)bssid);
3304 bssid[k] = (u8_t) zfGetRandomNumber(dev, 0);
3306 bssid[0] &= ~ZM_BIT_0;
3307 bssid[0] |= ZM_BIT_1;
3311 zfUpdateBssid(dev, bssid);
3312 //wd->sta.atimWindow = 0x0a;
3314 /* rate information */
3315 if(wd->frequency <= ZM_CH_G_14) // 2.4 GHz b+g
3317 if ( wd->wfc.bIbssGMode
3318 && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) )
3320 zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_IBSS_AG);
3324 zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_IBSS_B);
3327 zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_IBSS_AG);
3330 if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED )
3332 wd->sta.capability[0] &= ~ZM_BIT_4;
3336 wd->sta.capability[0] |= ZM_BIT_4;
3339 wd->preambleTypeInUsed = wd->preambleType;
3340 if (wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_LONG)
3342 wd->sta.capability[0] &= ~ZM_BIT_5;
3346 wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT;
3347 wd->sta.capability[0] |= ZM_BIT_5;
3350 zfIBSSSetupBssDesc(dev);
3352 #ifdef ZM_ENABLE_IBSS_WPA2PSK
3354 // 20070411 Add WPA2PSK information to its IBSS network !!!
3360 /* beacon interval */
3361 wd->sta.beaconFrameBody[offset++] = (u8_t)(wd->beaconInterval) ;
3362 wd->sta.beaconFrameBody[offset++] = (u8_t)((wd->beaconInterval) >> 8) ;
3364 /* capability information */
3365 wd->sta.beaconFrameBody[offset++] = wd->sta.capability[0] ;
3366 wd->sta.beaconFrameBody[offset++] = wd->sta.capability[1] ;
3370 wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_SSID ;
3372 wd->sta.beaconFrameBody[offset++] = wd->sta.ssidLen ;
3374 for(i=0; i<wd->sta.ssidLen; i++)
3376 wd->sta.beaconFrameBody[offset++] = wd->sta.ssid[i] ;
3380 rateSet = ZM_RATE_SET_CCK ;
3381 if ( (rateSet == ZM_RATE_SET_OFDM)&&((wd->gRate & 0xff) == 0) )
3387 // support rate element id
3388 wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_SUPPORT_RATE ;
3390 // support rate length
3391 lenOffset = offset++;
3393 // support rate information
3396 if ((wd->bRate & (0x1<<i)) == (0x1<<i))
3398 wd->sta.beaconFrameBody[offset++] =
3399 zg11bRateTbl[i]+((wd->bRateBasic & (0x1<<i))<<(7-i)) ;
3404 // support rate length
3405 wd->sta.beaconFrameBody[lenOffset] = len ;
3408 /* DS parameter set */
3409 // DS parameter set elemet id
3410 wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_DS ;
3412 // DS parameter set length
3413 wd->sta.beaconFrameBody[offset++] = 1 ;
3415 // DS parameter set information
3416 wd->sta.beaconFrameBody[offset++] =
3417 zfChFreqToNum(wd->frequency, NULL) ;
3419 /* IBSS parameter set */
3420 // IBSS parameter set element id
3421 wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_IBSS ;
3423 // IBSS parameter set length
3424 wd->sta.beaconFrameBody[offset++] = 2 ;
3426 // IBSS parameter set information
3427 wd->sta.beaconFrameBody[offset] = wd->sta.atimWindow ;
3430 /* ERP Information and Extended Supported Rates */
3431 if ( wd->wfc.bIbssGMode
3432 && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) )
3434 /* ERP Information */
3437 wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_ERP ;
3440 wd->sta.beaconFrameBody[offset++] = 1 ;
3443 wd->sta.beaconFrameBody[offset++] = wd->erpElement ;
3445 /* Extended Supported Rates */
3446 if ( (rateSet == ZM_RATE_SET_OFDM)&&((wd->gRate & 0xff) == 0) )
3454 // Extended Supported Rates element id
3455 wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_EXTENDED_RATE ;
3457 // Extended Supported Rates length
3458 lenOffset = offset++ ;
3460 // Extended Supported Rates information
3463 if ((wd->gRate & (0x1<<i)) == (0x1<<i))
3465 wd->sta.beaconFrameBody[offset++] =
3466 zg11gRateTbl[i]+((wd->gRateBasic & (0x1<<i))<<(7-i));
3471 // extended support rate length
3472 wd->sta.beaconFrameBody[lenOffset] = len ;
3477 /* RSN : important information influence the result of creating an IBSS network */
3478 if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK )
3480 u8_t frameType = ZM_WLAN_FRAME_TYPE_AUTH ;
3489 /* Group Cipher Suite, default=TKIP */
3490 0x00, 0x0f, 0xac, 0x04,
3491 /* Pairwise Cipher Suite Count */
3493 /* Pairwise Cipher Suite, default=TKIP */
3494 0x00, 0x0f, 0xac, 0x02,
3495 /* Authentication and Key Management Suite Count */
3497 /* Authentication type, default=PSK */
3498 0x00, 0x0f, 0xac, 0x02,
3499 /* RSN capability */
3503 /* Overwrite Group Cipher Suite by AP's setting */
3504 zfMemoryCopy(rsn+4, zgWpa2AesOui, 4);
3506 if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
3508 /* Overwrite Pairwise Cipher Suite by AES */
3509 zfMemoryCopy(rsn+10, zgWpa2AesOui, 4);
3513 wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_RSN_IE ;
3516 wd->sta.beaconFrameBody[offset++] = rsn[1] ;
3519 for(i=0; i<rsn[1]; i++)
3520 wd->sta.beaconFrameBody[offset++] = rsn[i+2] ;
3522 zfMemoryCopy(wd->sta.rsnIe, rsn, rsn[1]+2);
3524 #ifdef ZM_ENABLE_IBSS_WPA2PSK
3525 /* If not use RSNA , run traditional */
3526 zmw_enter_critical_section(dev);
3527 wd->sta.ibssWpa2Psk = 1;
3528 zmw_leave_critical_section(dev);
3533 /* HT Capabilities Info */
3535 u8_t OUI[3] = { 0x0 , 0x90 , 0x4C } ;
3537 wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_WPA_IE ;
3539 wd->sta.beaconFrameBody[offset++] = wd->sta.HTCap.Data.Length + 4 ;
3541 for (i = 0; i < 3; i++)
3543 wd->sta.beaconFrameBody[offset++] = OUI[i] ;
3546 wd->sta.beaconFrameBody[offset++] = wd->sta.HTCap.Data.ElementID ;
3548 for (i = 0; i < 26; i++)
3550 wd->sta.beaconFrameBody[offset++] = wd->sta.HTCap.Byte[i+2] ;
3554 /* Extended HT Capabilities Info */
3556 u8_t OUI[3] = { 0x0 , 0x90 , 0x4C } ;
3558 wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_WPA_IE ;
3560 wd->sta.beaconFrameBody[offset++] = wd->sta.ExtHTCap.Data.Length + 4 ;
3562 for (i = 0; i < 3; i++)
3564 wd->sta.beaconFrameBody[offset++] = OUI[i] ;
3567 wd->sta.beaconFrameBody[offset++] = wd->sta.ExtHTCap.Data.ElementID ;
3569 for (i = 0; i < 22; i++)
3571 wd->sta.beaconFrameBody[offset++] = wd->sta.ExtHTCap.Byte[i+2] ;
3576 wd->sta.beaconFrameBodySize = offset ;
3578 if (wd->sta.beaconFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE)
3580 wd->sta.beaconFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE;
3583 // 20070416 Let Create IBSS network could enter the zfwIbssPartnerNotify function
3584 // bssNotFound = FALSE ;
3586 printk("The capability info 1 = %02x\n", wd->sta.capability[0]) ;
3587 printk("The capability info 2 = %02x\n", wd->sta.capability[1]) ;
3588 for(k=0; k<wd->sta.beaconFrameBodySize; k++)
3590 printk("%02x ", wd->sta.beaconFrameBody[k]) ;
3593 zmw_enter_critical_section(dev);
3594 zfMemoryCopy(event.bssid, (u8_t *)bssid, 6);
3595 zfMemoryCopy(event.peerMacAddr, (u8_t *)wd->macAddr, 6);
3596 zmw_leave_critical_section(dev);
3600 //zmw_enter_critical_section(dev);
3601 //wd->sta.ibssPartnerStatus = ZM_IBSS_PARTNER_LOST;
3602 //zmw_leave_critical_section(dev);
3606 wd->sta.ibssBssIsCreator = 0;
3610 zfHpEnableBeacon(dev, ZM_MODE_IBSS, wd->beaconInterval, wd->dtim, (u8_t)wd->sta.atimWindow);
3611 zfStaSendBeacon(dev); // Refresh Beacon content for ZD1211B HalPlus
3612 zfHpSetAtimWindow(dev, wd->sta.atimWindow);
3614 // Start the IBSS timer to monitor for new stations
3615 zmw_enter_critical_section(dev);
3616 zfTimerSchedule(dev, ZM_EVENT_IBSS_MONITOR, ZM_TICK_IBSS_MONITOR);
3617 zmw_leave_critical_section(dev);
3620 if (wd->zfcbConnectNotify != NULL)
3622 wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT, wd->sta.bssid);
3624 zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED);
3625 wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev);
3627 #ifdef ZM_ENABLE_IBSS_DELAYED_JOIN_INDICATION
3630 wd->sta.ibssDelayedInd = 1;
3631 zfMemoryCopy((u8_t *)&wd->sta.ibssDelayedIndEvent, (u8_t *)&event, sizeof(struct zsPartnerNotifyEvent));
3636 if (wd->zfcbIbssPartnerNotify != NULL)
3638 wd->zfcbIbssPartnerNotify(dev, 1, &event);
3646 zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTING);
3647 zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_NOT_FOUND, wd->sta.bssid, 0);
3651 void zfStaProcessAtim(zdev_t* dev, zbuf_t* buf)
3653 zmw_get_wlan_dev(dev);
3655 zm_debug_msg0("Receiving Atim window notification");
3657 wd->sta.recvAtim = 1;
3660 static struct zsBssInfo* zfInfraFindAPToConnect(zdev_t* dev,
3661 struct zsBssInfo* candidateBss)
3663 struct zsBssInfo* pBssInfo;
3664 struct zsBssInfo* pNowBssInfo=NULL;
3666 u16_t ret, apWepStatus;
3670 zmw_get_wlan_dev(dev);
3671 zmw_declare_for_critical_section();
3673 zmw_enter_critical_section(dev);
3675 pBssInfo = wd->sta.bssList.head;
3677 for(i=0; i<wd->sta.bssList.bssCount; i++)
3679 if ( pBssInfo->capability[0] & ZM_BIT_4 )
3681 apWepStatus = ZM_ENCRYPTION_WEP_ENABLED;
3685 apWepStatus = ZM_ENCRYPTION_WEP_DISABLED;
3688 if ( ((zfMemoryIsEqual(&(pBssInfo->ssid[2]), wd->sta.ssid,
3690 (wd->sta.ssidLen == pBssInfo->ssid[1]))||
3691 ((wd->sta.ssidLen == 0)&&
3692 /* connect to any BSS: AP's ans STA's WEP status must match */
3693 (wd->sta.wepStatus == apWepStatus )&&
3694 (pBssInfo->securityType != ZM_SECURITY_TYPE_WPA) ))
3696 if ( wd->sta.ssidLen == 0 )
3698 zm_debug_msg0("ANY BSS found");
3701 if ( ((wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED && apWepStatus == ZM_ENCRYPTION_WEP_ENABLED) ||
3702 (wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED &&
3703 (apWepStatus == ZM_ENCRYPTION_WEP_DISABLED && wd->sta.dropUnencryptedPkts == 1))) &&
3704 (wd->sta.authMode >= ZM_AUTH_MODE_OPEN && wd->sta.authMode <= ZM_AUTH_MODE_AUTO) )
3706 zm_debug_msg0("Privacy policy is inconsistent");
3707 pBssInfo = pBssInfo->next;
3711 /* for WPA negative test */
3712 if ( !zfCheckAuthentication(dev, pBssInfo) )
3714 pBssInfo = pBssInfo->next;
3719 if (wd->sta.bDesiredBssid == TRUE)
3723 if (wd->sta.desiredBssid[k] != pBssInfo->bssid[k])
3725 zm_msg0_mm(ZM_LV_1, "desired bssid not matched 1");
3732 zm_msg0_mm(ZM_LV_1, "desired bssid not matched 2");
3733 pBssInfo = pBssInfo->next;
3738 /* Check support mode */
3739 if (pBssInfo->frequency > 3000) {
3740 if ( (pBssInfo->EnableHT == 1)
3741 || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP
3743 channelFlags = CHANNEL_A_HT;
3744 if (pBssInfo->enableHT40 == 1) {
3745 channelFlags |= CHANNEL_HT40;
3748 channelFlags = CHANNEL_A;
3751 if ( (pBssInfo->EnableHT == 1)
3752 || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP
3754 channelFlags = CHANNEL_G_HT;
3755 if(pBssInfo->enableHT40 == 1) {
3756 channelFlags |= CHANNEL_HT40;
3759 if (pBssInfo->extSupportedRates[1] == 0) {
3760 channelFlags = CHANNEL_B;
3762 channelFlags = CHANNEL_G;
3767 if ( ((channelFlags == CHANNEL_B) && (wd->connectMode & ZM_BIT_0))
3768 || ((channelFlags == CHANNEL_G) && (wd->connectMode & ZM_BIT_1))
3769 || ((channelFlags == CHANNEL_A) && (wd->connectMode & ZM_BIT_2))
3770 || ((channelFlags & CHANNEL_HT20) && (wd->connectMode & ZM_BIT_3)) )
3772 pBssInfo = pBssInfo->next;
3776 /* Skip if AP in blocking list */
3777 if ((ret = zfStaIsApInBlockingList(dev, pBssInfo->bssid)) == TRUE)
3779 zm_msg0_mm(ZM_LV_0, "Candidate AP in blocking List, skip if there's stilla choice!");
3780 pNowBssInfo = pBssInfo;
3781 pBssInfo = pBssInfo->next;
3785 if ( pBssInfo->capability[0] & ZM_BIT_0 ) // check if infra-BSS
3787 pNowBssInfo = pBssInfo;
3788 wd->sta.apWmeCapability = pBssInfo->wmeSupport;
3795 pBssInfo = pBssInfo->next;
3799 if (pNowBssInfo != NULL)
3801 zfwMemoryCopy((void*)candidateBss, (void*)pNowBssInfo, sizeof(struct zsBssInfo));
3802 pNowBssInfo = candidateBss;
3805 zmw_leave_critical_section(dev);
3811 void zfInfraConnectNetwork(zdev_t* dev)
3813 struct zsBssInfo* pBssInfo;
3814 struct zsBssInfo* pNowBssInfo=NULL;
3815 struct zsBssInfo candidateBss;
3816 //u16_t i, j=100, quality=10000;
3817 //u8_t ret=FALSE, apWepStatus;
3820 u8_t density = ZM_MPDU_DENSITY_NONE;
3822 zmw_get_wlan_dev(dev);
3823 zmw_declare_for_critical_section();
3825 /* Reset bssNotFoundCount for Ad-Hoc:IBSS */
3826 /* Need review : IbssConn -> InfraConn -> IbssConn etc, flag/counter reset? */
3827 zmw_enter_critical_section(dev);
3828 wd->sta.bssNotFoundCount = 0;
3829 zmw_leave_critical_section(dev);
3831 /* Set TxQs CWMIN, CWMAX, AIFS and TXO to WME STA default. */
3832 zfUpdateDefaultQosParameter(dev, 0);
3834 zfStaRefreshBlockList(dev, 0);
3836 /* change state to CONNECTING and stop the channel scanning */
3837 zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTING);
3838 zfPowerSavingMgrWakeup(dev);
3840 wd->sta.wmeConnected = 0;
3841 wd->sta.psMgr.tempWakeUp = 0;
3842 wd->sta.qosInfo = 0;
3843 zfQueueFlush(dev, wd->sta.uapsdQ);
3845 wd->sta.connectState = ZM_STA_CONN_STATE_NONE;
3847 //Reorder BssList by RSSI--CWYang(+)
3848 zfBssInfoReorderList(dev);
3850 pNowBssInfo = zfInfraFindAPToConnect(dev, &candidateBss);
3852 if (wd->sta.SWEncryptEnable != 0)
3854 if (wd->sta.bSafeMode == 0)
3856 zfStaDisableSWEncryption(dev);//Quickly reboot
3859 if ( pNowBssInfo != NULL )
3861 //zm_assert(pNowBssInfo != NULL);
3863 pBssInfo = pNowBssInfo;
3864 wd->sta.ssidLen = pBssInfo->ssid[1];
3865 zfMemoryCopy(wd->sta.ssid, &(pBssInfo->ssid[2]), pBssInfo->ssid[1]);
3866 wd->frequency = pBssInfo->frequency;
3867 //wd->sta.flagFreqChanging = 1;
3869 //zfCoreSetFrequency(dev, wd->frequency);
3870 zfUpdateBssid(dev, pBssInfo->bssid);
3871 zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_ZERO);
3872 zfUpdateSupportRate(dev, pBssInfo->supportedRates);
3873 zfUpdateSupportRate(dev, pBssInfo->extSupportedRates);
3875 wd->beaconInterval = pBssInfo->beaconInterval[0] +
3876 (((u16_t) pBssInfo->beaconInterval[1]) << 8);
3877 if (wd->beaconInterval == 0)
3879 wd->beaconInterval = 100;
3883 wd->sta.capability[0] |= ZM_BIT_0;
3885 wd->sta.capability[0] &= ~ZM_BIT_1;
3888 wd->sta.EnableHT = pBssInfo->EnableHT;
3889 wd->sta.SG40 = pBssInfo->SG40;
3890 #ifdef ZM_ENABLE_CENC
3891 if ( pBssInfo->securityType == ZM_SECURITY_TYPE_CENC )
3893 wd->sta.wmeEnabled = 0; //Disable WMM in CENC
3895 cencSetCENCMode(dev, NdisCENC_PSK);
3896 wd->sta.wpaState = ZM_STA_WPA_STATE_INIT;
3898 if ( pBssInfo->cencIe[1] != 0 )
3900 //wd->sta.wepStatus = ZM_ENCRYPTION_CENC;
3901 //wd->sta.encryMode = ZM_CENC;
3902 zfwCencHandleBeaconProbrespon(dev, (u8_t *)&pBssInfo->cencIe,
3903 (u8_t *)&pBssInfo->ssid, (u8_t *)&pBssInfo->macaddr);
3904 zfMemoryCopy(wd->sta.cencIe, pBssInfo->cencIe,
3905 pBssInfo->cencIe[1]+2);
3909 wd->sta.cencIe[1] = 0;
3912 #endif //ZM_ENABLE_CENC
3913 if ( pBssInfo->securityType == ZM_SECURITY_TYPE_WPA )
3915 wd->sta.wpaState = ZM_STA_WPA_STATE_INIT;
3917 if ( wd->sta.wepStatus == ZM_ENCRYPTION_TKIP )
3919 wd->sta.encryMode = ZM_TKIP;
3921 /* Turn on software encryption/decryption for TKIP */
3922 if (wd->sta.EnableHT == 1)
3924 zfStaEnableSWEncryption(dev, (ZM_SW_TKIP_ENCRY_EN|ZM_SW_TKIP_DECRY_EN));
3927 /* Do not support TKIP in 11n mode */
3928 //wd->sta.EnableHT = 0;
3929 //pBssInfo->enableHT40 = 0;
3931 else if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
3933 wd->sta.encryMode = ZM_AES;
3935 /* If AP supports HT mode */
3936 if (wd->sta.EnableHT)
3938 /* Set MPDU density to 8 us*/
3939 density = ZM_MPDU_DENSITY_8US;
3943 if ( pBssInfo->wpaIe[1] != 0 )
3945 zfMemoryCopy(wd->sta.wpaIe, pBssInfo->wpaIe,
3946 pBssInfo->wpaIe[1]+2);
3950 wd->sta.wpaIe[1] = 0;
3953 if ( pBssInfo->rsnIe[1] != 0 )
3955 zfMemoryCopy(wd->sta.rsnIe, pBssInfo->rsnIe,
3956 pBssInfo->rsnIe[1]+2);
3960 wd->sta.rsnIe[1] = 0;
3966 /* check preamble bit */
3967 wd->preambleTypeInUsed = wd->preambleType;
3968 if ( wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_AUTO )
3970 if (pBssInfo->capability[0] & ZM_BIT_5)
3972 wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT;
3976 wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_LONG;
3980 if (wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_LONG)
3982 wd->sta.capability[0] &= ~ZM_BIT_5;
3986 wd->sta.capability[0] |= ZM_BIT_5;
3989 /* check 802.11n 40MHz Setting */
3990 if ((pBssInfo->enableHT40 == 1) &&
3991 ((pBssInfo->extChOffset == 1) || (pBssInfo->extChOffset == 3)))
3993 wd->BandWidth40 = pBssInfo->enableHT40;
3994 wd->ExtOffset = pBssInfo->extChOffset;
3998 wd->BandWidth40 = 0;
4002 /* check 802.11H support bit */
4005 if ( pBssInfo->athOwlAp & ZM_BIT_0 )
4007 /* In this function, FW retry will be enable, ZM_MAC_REG_RETRY_MAX
4010 zfHpDisableHwRetry(dev);
4011 wd->sta.athOwlAp = 1;
4012 /* Set MPDU density to 8 us*/
4013 density = ZM_MPDU_DENSITY_8US;
4017 /* In this function, FW retry will be disable, ZM_MAC_REG_RETRY_MAX
4020 zfHpEnableHwRetry(dev);
4021 wd->sta.athOwlAp = 0;
4025 /* Set MPDU density */
4026 zfHpSetMPDUDensity(dev, density);
4028 /* check short slot time bit */
4029 if ( pBssInfo->capability[1] & ZM_BIT_2 )
4031 wd->sta.capability[1] |= ZM_BIT_2;
4034 if ( pBssInfo->erp & ZM_BIT_1 )
4036 //zm_debug_msg0("protection mode on");
4037 wd->sta.bProtectionMode = TRUE;
4038 zfHpSetSlotTime(dev, 0);
4042 //zm_debug_msg0("protection mode off");
4043 wd->sta.bProtectionMode = FALSE;
4044 zfHpSetSlotTime(dev, 1);
4047 if (pBssInfo->marvelAp == 1)
4049 wd->sta.enableDrvBA = 0;
4051 * 8701 : NetGear 3500 (MARVELL)
4052 * Downlink issue : set slottime to 20.
4054 zfHpSetSlotTimeRegister(dev, 0);
4058 wd->sta.enableDrvBA = 1;
4061 * This is not good for here do reset slot time.
4062 * I think it should reset when leave MARVELL ap
4063 * or enter disconnect state etc.
4065 zfHpSetSlotTimeRegister(dev, 1);
4068 //Store probe response frame body, for VISTA only
4069 wd->sta.beaconFrameBodySize = pBssInfo->frameBodysize + 12;
4070 if (wd->sta.beaconFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE)
4072 wd->sta.beaconFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE;
4076 wd->sta.beaconFrameBody[k] = pBssInfo->timeStamp[k];
4078 wd->sta.beaconFrameBody[8] = pBssInfo->beaconInterval[0];
4079 wd->sta.beaconFrameBody[9] = pBssInfo->beaconInterval[1];
4080 wd->sta.beaconFrameBody[10] = pBssInfo->capability[0];
4081 wd->sta.beaconFrameBody[11] = pBssInfo->capability[1];
4082 for (k=0; k<(wd->sta.beaconFrameBodySize - 12); k++)
4084 wd->sta.beaconFrameBody[k+12] = pBssInfo->frameBody[k];
4087 if ( ( pBssInfo->capability[0] & ZM_BIT_4 )&&
4088 (( wd->sta.authMode == ZM_AUTH_MODE_OPEN )||
4089 ( wd->sta.authMode == ZM_AUTH_MODE_SHARED_KEY)||
4090 (wd->sta.authMode == ZM_AUTH_MODE_AUTO)) )
4091 { /* privacy enabled */
4093 if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED )
4095 zm_debug_msg0("Adapter is no WEP, try to connect to WEP AP");
4099 /* Do not support WEP in 11n mode */
4100 if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED )
4102 /* Turn on software encryption/decryption for WEP */
4103 if (wd->sta.EnableHT == 1)
4105 zfStaEnableSWEncryption(dev, (ZM_SW_WEP_ENCRY_EN|ZM_SW_WEP_DECRY_EN));
4108 //wd->sta.EnableHT = 0;
4109 //wd->BandWidth40 = 0;
4110 //wd->ExtOffset = 0;
4113 wd->sta.capability[0] |= ZM_BIT_4;
4115 if ( wd->sta.authMode == ZM_AUTH_MODE_AUTO )
4116 { /* Try to use open and shared-key authehtication alternatively */
4117 if ( (wd->sta.connectTimeoutCount % 2) == 0 )
4118 wd->sta.bIsSharedKey = 0;
4120 wd->sta.bIsSharedKey = 1;
4122 else if ( wd->sta.authMode != ZM_AUTH_MODE_SHARED_KEY )
4123 { /* open or auto */
4124 //zfStaStartConnect(dev, 0);
4125 wd->sta.bIsSharedKey = 0;
4127 else if ( wd->sta.authMode != ZM_AUTH_MODE_OPEN )
4129 //zfStaStartConnect(dev, 1) ;
4130 wd->sta.bIsSharedKey = 1;
4135 if ( (pBssInfo->securityType == ZM_SECURITY_TYPE_WPA)||
4136 (pBssInfo->capability[0] & ZM_BIT_4) )
4138 wd->sta.capability[0] |= ZM_BIT_4;
4139 /* initialize WPA related parameters */
4143 wd->sta.capability[0] &= (~ZM_BIT_4);
4146 /* authentication with open system */
4147 //zfStaStartConnect(dev, 0);
4148 wd->sta.bIsSharedKey = 0;
4151 /* Improve WEP/TKIP performance with HT AP, detail information please look bug#32495 */
4153 if ( (pBssInfo->broadcomHTAp == 1)
4154 && (wd->sta.SWEncryptEnable != 0) )
4156 zfHpSetTTSIFSTime(dev, 0xa);
4160 zfHpSetTTSIFSTime(dev, 0x8);
4166 zm_debug_msg0("Desired SSID not found");
4167 goto zlConnectFailed;
4171 zfCoreSetFrequencyV2(dev, wd->frequency, zfStaStartConnectCb);
4175 zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_NOT_FOUND, wd->sta.bssid, 0);
4179 u8_t zfCheckWPAAuth(zdev_t* dev, struct zsBssInfo* pBssInfo)
4184 u16_t encAlgoType = 0;
4186 zmw_get_wlan_dev(dev);
4188 if ( wd->sta.wepStatus == ZM_ENCRYPTION_TKIP )
4190 encAlgoType = ZM_TKIP;
4192 else if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
4194 encAlgoType = ZM_AES;
4197 switch(wd->sta.authMode)
4199 case ZM_AUTH_MODE_WPA:
4200 case ZM_AUTH_MODE_WPAPSK:
4201 if ( pBssInfo->wpaIe[1] == 0 )
4207 pmkCount = pBssInfo->wpaIe[12];
4208 for(i=0; i < pmkCount; i++)
4210 if ( pBssInfo->wpaIe[17 + 4*i] == encAlgoType )
4220 case ZM_AUTH_MODE_WPA2:
4221 case ZM_AUTH_MODE_WPA2PSK:
4222 if ( pBssInfo->rsnIe[1] == 0 )
4228 pmkCount = pBssInfo->rsnIe[8];
4229 for(i=0; i < pmkCount; i++)
4231 if ( pBssInfo->rsnIe[13 + 4*i] == encAlgoType )
4246 u8_t zfCheckAuthentication(zdev_t* dev, struct zsBssInfo* pBssInfo)
4250 u16_t UnicastCipherNum;
4252 zmw_get_wlan_dev(dev);
4254 /* Connecting to ANY has been checked */
4255 if ( wd->sta.ssidLen == 0 )
4261 switch(wd->sta.authMode)
4262 //switch(wd->ws.authMode)//Quickly reboot
4264 case ZM_AUTH_MODE_WPA_AUTO:
4265 case ZM_AUTH_MODE_WPAPSK_AUTO:
4267 if(pBssInfo->rsnIe[1] != 0)
4269 UnicastCipherNum = (pBssInfo->rsnIe[8]) +
4270 (pBssInfo->rsnIe[9] << 8);
4272 /* If there is only one unicast cipher */
4273 if (UnicastCipherNum == 1)
4275 encAlgoType = pBssInfo->rsnIe[13];
4276 //encAlgoType = pBssInfo->rsnIe[7];
4281 u16_t desiredCipher = 0;
4282 u16_t IEOffSet = 13;
4284 /* Enumerate all the supported unicast cipher */
4285 for (ii = 0; ii < UnicastCipherNum; ii++)
4287 if (pBssInfo->rsnIe[IEOffSet+ii*4] > desiredCipher)
4289 desiredCipher = pBssInfo->rsnIe[IEOffSet+ii*4];
4293 encAlgoType = desiredCipher;
4296 if ( encAlgoType == 0x02 )
4298 wd->sta.wepStatus = ZM_ENCRYPTION_TKIP;
4300 if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO )
4302 wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2;
4304 else //ZM_AUTH_MODE_WPAPSK_AUTO
4306 wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2PSK;
4309 else if ( encAlgoType == 0x04 )
4311 wd->sta.wepStatus = ZM_ENCRYPTION_AES;
4313 if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO )
4315 wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2;
4317 else //ZM_AUTH_MODE_WPAPSK_AUTO
4319 wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2PSK;
4327 else if(pBssInfo->wpaIe[1] != 0)
4329 UnicastCipherNum = (pBssInfo->wpaIe[12]) +
4330 (pBssInfo->wpaIe[13] << 8);
4332 /* If there is only one unicast cipher */
4333 if (UnicastCipherNum == 1)
4335 encAlgoType = pBssInfo->wpaIe[17];
4336 //encAlgoType = pBssInfo->wpaIe[11];
4341 u16_t desiredCipher = 0;
4342 u16_t IEOffSet = 17;
4344 /* Enumerate all the supported unicast cipher */
4345 for (ii = 0; ii < UnicastCipherNum; ii++)
4347 if (pBssInfo->wpaIe[IEOffSet+ii*4] > desiredCipher)
4349 desiredCipher = pBssInfo->wpaIe[IEOffSet+ii*4];
4353 encAlgoType = desiredCipher;
4356 if ( encAlgoType == 0x02 )
4358 wd->sta.wepStatus = ZM_ENCRYPTION_TKIP;
4360 if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO )
4362 wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA;
4364 else //ZM_AUTH_MODE_WPAPSK_AUTO
4366 wd->sta.currentAuthMode = ZM_AUTH_MODE_WPAPSK;
4369 else if ( encAlgoType == 0x04 )
4371 wd->sta.wepStatus = ZM_ENCRYPTION_AES;
4373 if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO )
4375 wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA;
4377 else //ZM_AUTH_MODE_WPAPSK_AUTO
4379 wd->sta.currentAuthMode = ZM_AUTH_MODE_WPAPSK;
4396 case ZM_AUTH_MODE_WPA:
4397 case ZM_AUTH_MODE_WPAPSK:
4398 case ZM_AUTH_MODE_WPA_NONE:
4399 case ZM_AUTH_MODE_WPA2:
4400 case ZM_AUTH_MODE_WPA2PSK:
4402 if ( pBssInfo->securityType != ZM_SECURITY_TYPE_WPA )
4407 ret = zfCheckWPAAuth(dev, pBssInfo);
4411 case ZM_AUTH_MODE_OPEN:
4412 case ZM_AUTH_MODE_SHARED_KEY:
4413 case ZM_AUTH_MODE_AUTO:
4415 if ( pBssInfo->wscIe[1] )
4417 // If the AP is a Jumpstart AP, it's ok!! Ray
4420 else if ( pBssInfo->securityType == ZM_SECURITY_TYPE_WPA )
4434 u8_t zfStaIsConnected(zdev_t* dev)
4436 zmw_get_wlan_dev(dev);
4438 if ( wd->sta.adapterState == ZM_STA_STATE_CONNECTED )
4446 u8_t zfStaIsConnecting(zdev_t* dev)
4448 zmw_get_wlan_dev(dev);
4450 if ( wd->sta.adapterState == ZM_STA_STATE_CONNECTING )
4458 u8_t zfStaIsDisconnect(zdev_t* dev)
4460 zmw_get_wlan_dev(dev);
4462 if ( wd->sta.adapterState == ZM_STA_STATE_DISCONNECT )
4470 u8_t zfChangeAdapterState(zdev_t* dev, u8_t newState)
4474 zmw_get_wlan_dev(dev);
4476 zmw_declare_for_critical_section();
4478 //if ( newState == wd->sta.adapterState )
4485 case ZM_STA_STATE_DISCONNECT:
4486 zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_DISCONNECT);
4489 zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
4491 if ( wd->sta.bChannelScan )
4493 /* stop the action of channel scanning */
4494 wd->sta.bChannelScan = FALSE;
4501 case ZM_STA_STATE_CONNECTING:
4503 zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
4505 if ( wd->sta.bChannelScan )
4507 /* stop the action of channel scanning */
4508 wd->sta.bChannelScan = FALSE;
4515 case ZM_STA_STATE_CONNECTED:
4523 zmw_enter_critical_section(dev);
4524 wd->sta.adapterState = newState;
4525 zmw_leave_critical_section(dev);
4527 zm_debug_msg1("change adapter state = ", newState);
4533 /************************************************************************/
4535 /* FUNCTION DESCRIPTION zfStaMmAddIeSsid */
4536 /* Add information element SSID to buffer. */
4539 /* dev : device pointer */
4540 /* buf : buffer to add information element */
4541 /* offset : add information element from this offset */
4544 /* buffer offset after adding information element */
4547 /* Ji-Huang Lee ZyDAS Technology Corporation 2005.11 */
4549 /************************************************************************/
4550 u16_t zfStaAddIeSsid(zdev_t* dev, zbuf_t* buf, u16_t offset)
4554 zmw_get_wlan_dev(dev);
4557 zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
4559 /* Element Length */
4560 zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.ssidLen);
4562 /* Information : SSID */
4563 for (i=0; i<wd->sta.ssidLen; i++)
4565 zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.ssid[i]);
4571 /************************************************************************/
4573 /* FUNCTION DESCRIPTION zfStaMmAddIeWpa */
4574 /* Add information element SSID to buffer. */
4577 /* dev : device pointer */
4578 /* buf : buffer to add information element */
4579 /* offset : add information element from this offset */
4582 /* buffer offset after adding information element */
4585 /* Ji-Huang Lee ZyDAS Technology Corporation 2006.01 */
4587 /************************************************************************/
4588 u16_t zfStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType)
4597 0x00, 0x50, 0xf2, 0x01,
4600 /* Group Cipher Suite, default=TKIP */
4601 0x00, 0x50, 0xf2, 0x02,
4602 /* Pairwise Cipher Suite Count */
4604 /* Pairwise Cipher Suite, default=TKIP */
4605 0x00, 0x50, 0xf2, 0x02,
4606 /* Authentication and Key Management Suite Count */
4608 /* Authentication type, default=PSK */
4609 0x00, 0x50, 0xf2, 0x02,
4610 /* WPA capability */
4621 /* Group Cipher Suite, default=TKIP */
4622 0x00, 0x0f, 0xac, 0x02,
4623 /* Pairwise Cipher Suite Count */
4625 /* Pairwise Cipher Suite, default=TKIP */
4626 0x00, 0x0f, 0xac, 0x02,
4627 /* Authentication and Key Management Suite Count */
4629 /* Authentication type, default=PSK */
4630 0x00, 0x0f, 0xac, 0x02,
4631 /* RSN capability */
4635 zmw_get_wlan_dev(dev);
4637 if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPAPSK )
4639 /* Overwrite Group Cipher Suite by AP's setting */
4640 zfMemoryCopy(ssn+8, wd->sta.wpaIe+8, 4);
4642 if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
4644 /* Overwrite Pairwise Cipher Suite by AES */
4645 zfMemoryCopy(ssn+14, zgWpaAesOui, 4);
4648 zfCopyToIntTxBuffer(dev, buf, ssn, offset, ssn[1]+2);
4649 zfMemoryCopy(wd->sta.wpaIe, ssn, ssn[1]+2);
4650 offset += (ssn[1]+2);
4652 else if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPA )
4654 /* Overwrite Group Cipher Suite by AP's setting */
4655 zfMemoryCopy(ssn+8, wd->sta.wpaIe+8, 4);
4656 /* Overwrite Key Management Suite by WPA-Radius */
4657 zfMemoryCopy(ssn+20, zgWpaRadiusOui, 4);
4659 if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
4661 /* Overwrite Pairwise Cipher Suite by AES */
4662 zfMemoryCopy(ssn+14, zgWpaAesOui, 4);
4665 zfCopyToIntTxBuffer(dev, buf, ssn, offset, ssn[1]+2);
4666 zfMemoryCopy(wd->sta.wpaIe, ssn, ssn[1]+2);
4667 offset += (ssn[1]+2);
4669 else if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPA2PSK )
4671 /* Overwrite Group Cipher Suite by AP's setting */
4672 zfMemoryCopy(rsn+4, wd->sta.rsnIe+4, 4);
4674 if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
4676 /* Overwrite Pairwise Cipher Suite by AES */
4677 zfMemoryCopy(rsn+10, zgWpa2AesOui, 4);
4680 if ( frameType == ZM_WLAN_FRAME_TYPE_REASOCREQ )
4682 for(i=0; i<wd->sta.pmkidInfo.bssidCount; i++)
4684 if ( zfMemoryIsEqual((u8_t*) wd->sta.pmkidInfo.bssidInfo[i].bssid,
4685 (u8_t*) wd->sta.bssid, 6) )
4691 if ( i < wd->sta.pmkidInfo.bssidCount )
4693 // Fill PMKID Count in RSN information element
4697 // Fill PMKID in RSN information element
4698 zfMemoryCopy(rsn+24,
4699 wd->sta.pmkidInfo.bssidInfo[i].pmkid, 16);
4705 zfCopyToIntTxBuffer(dev, buf, rsn, offset, rsn[1]+2);
4706 zfMemoryCopy(wd->sta.rsnIe, rsn, rsn[1]+2);
4707 offset += (rsn[1]+2);
4709 else if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPA2 )
4711 /* Overwrite Group Cipher Suite by AP's setting */
4712 zfMemoryCopy(rsn+4, wd->sta.rsnIe+4, 4);
4713 /* Overwrite Key Management Suite by WPA2-Radius */
4714 zfMemoryCopy(rsn+16, zgWpa2RadiusOui, 4);
4716 if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
4718 /* Overwrite Pairwise Cipher Suite by AES */
4719 zfMemoryCopy(rsn+10, zgWpa2AesOui, 4);
4722 if (( frameType == ZM_WLAN_FRAME_TYPE_REASOCREQ || ( frameType == ZM_WLAN_FRAME_TYPE_ASOCREQ )))
4725 if (wd->sta.pmkidInfo.bssidCount != 0) {
4726 // Fill PMKID Count in RSN information element
4730 * The caller is respnsible to give us the relevant PMKID.
4731 * We'll only accept 1 PMKID for now.
4733 for(i=0; i<wd->sta.pmkidInfo.bssidCount; i++)
4735 if ( zfMemoryIsEqual((u8_t*) wd->sta.pmkidInfo.bssidInfo[i].bssid, (u8_t*) wd->sta.bssid, 6) )
4737 zfMemoryCopy(rsn+24, wd->sta.pmkidInfo.bssidInfo[i].pmkid, 16);
4746 zfCopyToIntTxBuffer(dev, buf, rsn, offset, rsn[1]+2);
4747 zfMemoryCopy(wd->sta.rsnIe, rsn, rsn[1]+2);
4748 offset += (rsn[1]+2);
4754 /************************************************************************/
4756 /* FUNCTION DESCRIPTION zfStaAddIeIbss */
4757 /* Add information element IBSS parameter to buffer. */
4760 /* dev : device pointer */
4761 /* buf : buffer to add information element */
4762 /* offset : add information element from this offset */
4765 /* buffer offset after adding information element */
4768 /* Ji-Huang Lee ZyDAS Technology Corporation 2005.12 */
4770 /************************************************************************/
4771 u16_t zfStaAddIeIbss(zdev_t* dev, zbuf_t* buf, u16_t offset)
4773 zmw_get_wlan_dev(dev);
4776 zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_IBSS);
4778 /* Element Length */
4779 zmw_tx_buf_writeb(dev, buf, offset++, 2);
4782 zmw_tx_buf_writeh(dev, buf, offset, wd->sta.atimWindow);
4790 /************************************************************************/
4792 /* FUNCTION DESCRIPTION zfStaAddIeWmeInfo */
4793 /* Add WME Information Element to buffer. */
4796 /* dev : device pointer */
4797 /* buf : buffer to add information element */
4798 /* offset : add information element from this offset */
4801 /* buffer offset after adding information element */
4804 /* Stephen Chen ZyDAS Technology Corporation 2006.6 */
4806 /************************************************************************/
4807 u16_t zfStaAddIeWmeInfo(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t qosInfo)
4810 zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WIFI_IE);
4812 /* Element Length */
4813 zmw_tx_buf_writeb(dev, buf, offset++, 7);
4816 zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
4817 zmw_tx_buf_writeb(dev, buf, offset++, 0x50);
4818 zmw_tx_buf_writeb(dev, buf, offset++, 0xF2);
4819 zmw_tx_buf_writeb(dev, buf, offset++, 0x02);
4820 zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
4821 zmw_tx_buf_writeb(dev, buf, offset++, 0x01);
4824 zmw_tx_buf_writeb(dev, buf, offset++, qosInfo);
4829 /************************************************************************/
4831 /* FUNCTION DESCRIPTION zfStaAddIePowerCap */
4832 /* Add information element Power capability to buffer. */
4835 /* dev : device pointer */
4836 /* buf : buffer to add information element */
4837 /* offset : add information element from this offset */
4840 /* buffer offset after adding information element */
4843 /* Sharon 2007.12 */
4845 /************************************************************************/
4846 u16_t zfStaAddIePowerCap(zdev_t* dev, zbuf_t* buf, u16_t offset)
4851 zmw_get_wlan_dev(dev);
4854 zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_POWER_CAPABILITY);
4856 /* Element Length */
4857 zmw_tx_buf_writeb(dev, buf, offset++, 2);
4859 MinTxPower = (u8_t)(zfHpGetMinTxPower(dev)/2);
4860 MaxTxPower = (u8_t)(zfHpGetMaxTxPower(dev)/2);
4862 /* Min Transmit Power Cap */
4863 zmw_tx_buf_writeh(dev, buf, offset++, MinTxPower);
4865 /* Max Transmit Power Cap */
4866 zmw_tx_buf_writeh(dev, buf, offset++, MaxTxPower);
4870 /************************************************************************/
4872 /* FUNCTION DESCRIPTION zfStaAddIeSupportCh */
4873 /* Add information element supported channels to buffer. */
4876 /* dev : device pointer */
4877 /* buf : buffer to add information element */
4878 /* offset : add information element from this offset */
4881 /* buffer offset after adding information element */
4884 /* Sharon 2007.12 */
4886 /************************************************************************/
4887 u16_t zfStaAddIeSupportCh(zdev_t* dev, zbuf_t* buf, u16_t offset)
4891 u16_t count_24G = 0;
4896 zmw_get_wlan_dev(dev);
4898 zmw_declare_for_critical_section();
4899 zmw_enter_critical_section(dev);
4901 for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
4903 if (wd->regulationTable.allowChannel[i].channel < 3000)
4913 length = (u8_t)(count_5G * 2 + 2); //5G fill by pair, 2,4G (continuous channels) fill 2 bytes
4916 zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SUPPORTED_CHANNELS );
4918 /* Element Length */
4919 zmw_tx_buf_writeb(dev, buf, offset++, length);
4921 // 2.4GHz (continuous channels)
4922 /* First channel number */
4923 zmw_tx_buf_writeh(dev, buf, offset++, 1); //Start from channle 1
4924 /* Number of channels */
4925 zmw_tx_buf_writeh(dev, buf, offset++, count_24G);
4927 for (i = 0; i < wd->regulationTable.allowChannelCnt ; i++)
4929 if (wd->regulationTable.allowChannel[i].channel > 4000 && wd->regulationTable.allowChannel[i].channel < 5000)
4930 { // 5GHz 4000 -5000Mhz
4931 channelNum = (wd->regulationTable.allowChannel[i].channel-4000)/5;
4932 /* First channel number */
4933 zmw_tx_buf_writeh(dev, buf, offset++, channelNum);
4934 /* Number of channels */
4935 zmw_tx_buf_writeh(dev, buf, offset++, 1);
4937 else if (wd->regulationTable.allowChannel[i].channel >= 5000)
4939 channelNum = (wd->regulationTable.allowChannel[i].channel-5000)/5;
4940 /* First channel number */
4941 zmw_tx_buf_writeh(dev, buf, offset++, channelNum);
4942 /* Number of channels */
4943 zmw_tx_buf_writeh(dev, buf, offset++, 1);
4946 zmw_leave_critical_section(dev);
4951 void zfStaStartConnectCb(zdev_t* dev)
4953 zmw_get_wlan_dev(dev);
4955 zfStaStartConnect(dev, wd->sta.bIsSharedKey);
4958 void zfStaStartConnect(zdev_t* dev, u8_t bIsSharedKey)
4963 zmw_get_wlan_dev(dev);
4964 zmw_declare_for_critical_section();
4966 /* p1_low = algorithm number, p1_high = transaction sequence number */
4969 //wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_SHARE_1;
4970 newConnState = ZM_STA_CONN_STATE_AUTH_SHARE_1;
4971 zm_debug_msg0("ZM_STA_CONN_STATE_AUTH_SHARE_1");
4972 p1 = ZM_AUTH_ALGO_SHARED_KEY;
4976 //wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_OPEN;
4977 newConnState = ZM_STA_CONN_STATE_AUTH_OPEN;
4978 zm_debug_msg0("ZM_STA_CONN_STATE_AUTH_OPEN");
4979 if( wd->sta.leapEnabled )
4980 p1 = ZM_AUTH_ALGO_LEAP;
4982 p1 = ZM_AUTH_ALGO_OPEN_SYSTEM;
4988 zmw_enter_critical_section(dev);
4989 wd->sta.connectTimer = wd->tick;
4990 wd->sta.connectState = newConnState;
4991 zmw_leave_critical_section(dev);
4993 /* send the 1st authentication frame */
4994 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_AUTH, wd->sta.bssid, p1, p2, 0);
4999 void zfSendNullData(zdev_t* dev, u8_t type)
5002 //u16_t addrTblSize;
5003 //struct zsAddrTbl addrTbl;
5006 u16_t header[(34+8+1)/2];
5007 u16_t bcastAddr[3] = {0xffff,0xffff,0xffff};
5010 zmw_get_wlan_dev(dev);
5012 if ((buf = zfwBufAllocate(dev, 1024)) == NULL)
5014 zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
5018 zfwBufSetSize(dev, buf, 0);
5020 //zm_msg2_mm(ZM_LV_2, "buf->len=", buf->len);
5022 if ( wd->wlanMode == ZM_MODE_IBSS)
5024 dstAddr = bcastAddr;
5028 dstAddr = wd->sta.bssid;
5031 if (wd->sta.wmeConnected != 0)
5033 /* If connect to a WMM AP, Send QoS Null data */
5034 hlen = zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_QOS_NULL, dstAddr, header, 0, buf, 0, 0);
5038 hlen = zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_NULL, dstAddr, header, 0, buf, 0, 0);
5041 if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
5043 header[4] |= 0x0100; //TODS bit
5048 header[4] |= 0x1000;
5051 /* Get buffer DMA address */
5052 //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0)
5053 //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0)
5058 /*increase unicast frame counter*/
5059 wd->commTally.txUnicastFrm++;
5061 if ((err = zfHpSend(dev, header, hlen, NULL, 0, NULL, 0, buf, 0,
5062 ZM_INTERNAL_ALLOC_BUF, 0, 0xff)) != ZM_SUCCESS)
5072 zfwBufFree(dev, buf, 0);
5077 void zfSendPSPoll(zdev_t* dev)
5080 //u16_t addrTblSize;
5081 //struct zsAddrTbl addrTbl;
5084 u16_t header[(8+24+1)/2];
5086 zmw_get_wlan_dev(dev);
5088 if ((buf = zfwBufAllocate(dev, 1024)) == NULL)
5090 zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
5094 zfwBufSetSize(dev, buf, 0);
5096 //zm_msg2_mm(ZM_LV_2, "buf->len=", buf->len);
5098 zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_PSPOLL, wd->sta.bssid, header, 0, buf, 0, 0);
5101 header[4] |= 0x1000;
5102 header[5] = wd->sta.aid | 0xc000; //Both bit-14 and bit-15 are 1
5105 /* Get buffer DMA address */
5106 //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0)
5107 //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0)
5112 if ((err = zfHpSend(dev, header, hlen, NULL, 0, NULL, 0, buf, 0,
5113 ZM_INTERNAL_ALLOC_BUF, 0, 0xff)) != ZM_SUCCESS)
5122 zfwBufFree(dev, buf, 0);
5127 void zfSendBA(zdev_t* dev, u16_t start_seq, u8_t *bitmap)
5130 //u16_t addrTblSize;
5131 //struct zsAddrTbl addrTbl;
5134 u16_t header[(8+24+1)/2];
5135 u16_t i, offset = 0;
5137 zmw_get_wlan_dev(dev);
5139 if ((buf = zfwBufAllocate(dev, 1024)) == NULL)
5141 zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
5145 zfwBufSetSize(dev, buf, 12); // 28 = FC 2 + DU 2 + RA 6 + TA 6 + BAC 2 + SEQ 2 + BitMap 8
5146 // 12 = BAC 2 + SEQ 2 + BitMap 8
5148 //zm_msg2_mm(ZM_LV_2, "buf->len=", buf->len);
5150 zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_BA, wd->sta.bssid, header, 0, buf, 0, 0);
5152 header[0] = 32; /* MAC header 16 + BA control 2 + BA info 10 + FCS 4*/
5153 header[1] = 0x4; /* No ACK */
5155 /* send by OFDM 6M */
5156 header[2] = (u16_t)(zcRateToPhyCtrl[4] & 0xffff);
5157 header[3] = (u16_t)(zcRateToPhyCtrl[4]>>16) & 0xffff;
5159 hlen = 16 + 8; /* MAC header 16 + control 8*/
5161 zmw_tx_buf_writeh(dev, buf, offset, 0x05); /*compressed bitmap on*/
5163 zmw_tx_buf_writeh(dev, buf, offset, start_seq);
5166 for (i=0; i<8; i++) {
5167 zmw_tx_buf_writeb(dev, buf, offset, bitmap[i]);
5171 if ((err = zfHpSend(dev, header, hlen, NULL, 0, NULL, 0, buf, 0,
5172 ZM_INTERNAL_ALLOC_BUF, 0, 0xff)) != ZM_SUCCESS)
5181 zfwBufFree(dev, buf, 0);
5186 void zfStaGetTxRate(zdev_t* dev, u16_t* macAddr, u32_t* phyCtrl,
5187 u16_t* rcProbingFlag)
5191 zmw_get_wlan_dev(dev);
5192 zmw_declare_for_critical_section();
5194 ZM_MAC_WORD_TO_BYTE(macAddr, addr);
5197 if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
5199 zmw_enter_critical_section(dev);
5200 rate = (u8_t)zfRateCtrlGetTxRate(dev, &wd->sta.oppositeInfo[0].rcCell, rcProbingFlag);
5204 *phyCtrl = zcRateToPhyCtrl[rate];
5205 zmw_leave_critical_section(dev);
5209 zmw_enter_critical_section(dev);
5210 for(i=0; i<wd->sta.oppositeCount; i++)
5212 if ( addr[0] && 0x01 == 1 ) // The default beacon transmitted rate is CCK and 1 Mbps , but the a mode should use
5213 // OFDM modulation and 6Mbps to transmit beacon.
5215 //rate = (u8_t)zfRateCtrlGetTxRate(dev, &wd->sta.oppositeInfo[i].rcCell, rcProbingFlag);
5216 rate = wd->sta.oppositeInfo[i].rcCell.operationRateSet[0];
5217 *phyCtrl = zcRateToPhyCtrl[rate];
5220 else if ( zfMemoryIsEqual(addr, wd->sta.oppositeInfo[i].macAddr, 6) )
5222 rate = (u8_t)zfRateCtrlGetTxRate(dev, &wd->sta.oppositeInfo[i].rcCell, rcProbingFlag);
5223 *phyCtrl = zcRateToPhyCtrl[rate];
5227 zmw_leave_critical_section(dev);
5233 struct zsMicVar* zfStaGetRxMicKey(zdev_t* dev, zbuf_t* buf)
5238 zmw_get_wlan_dev(dev);
5240 /* if need not check MIC, return NULL */
5241 if ( ((wd->sta.encryMode != ZM_TKIP)&&(wd->sta.encryMode != ZM_AES))||
5242 (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) )
5247 da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
5249 if ((zmw_rx_buf_readb(dev, buf, 0) & 0x80) == 0x80)
5250 keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+5); /* Qos Packet*/
5252 keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+3); /* normal Packet*/
5253 keyIndex = (keyIndex & 0xc0) >> 6;
5255 return (&wd->sta.rxMicKey[keyIndex]);
5258 struct zsMicVar* zfStaGetTxMicKey(zdev_t* dev, zbuf_t* buf)
5260 zmw_get_wlan_dev(dev);
5262 /* if need not check MIC, return NULL */
5263 //if ( ((wd->sta.encryMode != ZM_TKIP)&&(wd->sta.encryMode != ZM_AES))||
5264 // (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) )
5265 if ( (wd->sta.encryMode != ZM_TKIP) || (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) )
5270 return (&wd->sta.txMicKey);
5273 u16_t zfStaRxValidateFrame(zdev_t* dev, zbuf_t* buf)
5275 u8_t frameType, frameCtrl;
5282 zmw_get_wlan_dev(dev);
5284 frameType = zmw_rx_buf_readb(dev, buf, 0);
5285 da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
5286 //sa0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
5288 if ( (!zfStaIsConnected(dev))&&((frameType & 0xf) == ZM_WLAN_DATA_FRAME) )
5290 return ZM_ERR_DATA_BEFORE_CONNECTED;
5294 if ( (zfStaIsConnected(dev))&&((frameType & 0xf) == ZM_WLAN_DATA_FRAME) )
5297 if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
5299 /* Big Endian and Little Endian Compatibility */
5301 mac[0] = zmw_cpu_to_le16(wd->sta.bssid[0]);
5302 mac[1] = zmw_cpu_to_le16(wd->sta.bssid[1]);
5303 mac[2] = zmw_cpu_to_le16(wd->sta.bssid[2]);
5304 if ( !zfRxBufferEqualToStr(dev, buf, (u8_t *)mac,
5305 ZM_WLAN_HEADER_A2_OFFSET, 6) )
5307 /*We will get lots of garbage data, especially in AES mode.*/
5308 /*To avoid sending too many deauthentication frames in STA mode, mark it.*/
5310 /* If unicast frame, send deauth to the transmitter */
5311 if (( da0 & 0x01 ) == 0)
5315 sa[i] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+(i*2));
5317 /* If mutilcast address, don't send deauthentication*/
5318 if (( sa0 & 0x01 ) == 0)
5319 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, sa, 7, 0, 0);
5322 return ZM_ERR_DATA_BSSID_NOT_MATCHED;
5325 else if ( wd->wlanMode == ZM_MODE_IBSS )
5327 /* Big Endian and Little Endian Compatibility */
5329 mac[0] = zmw_cpu_to_le16(wd->sta.bssid[0]);
5330 mac[1] = zmw_cpu_to_le16(wd->sta.bssid[1]);
5331 mac[2] = zmw_cpu_to_le16(wd->sta.bssid[2]);
5332 if ( !zfRxBufferEqualToStr(dev, buf, (u8_t *)mac,
5333 ZM_WLAN_HEADER_A3_OFFSET, 6) )
5335 return ZM_ERR_DATA_BSSID_NOT_MATCHED;
5339 frameCtrl = zmw_rx_buf_readb(dev, buf, 1);
5341 /* check security bit */
5342 if ( wd->sta.dropUnencryptedPkts &&
5343 (wd->sta.wepStatus != ZM_ENCRYPTION_WEP_DISABLED )&&
5344 ( !(frameCtrl & ZM_BIT_6) ) )
5345 { /* security on, but got data without encryption */
5348 ret = ZM_ERR_DATA_NOT_ENCRYPTED;
5349 if ( wd->sta.pStaRxSecurityCheckCb != NULL )
5351 ret = wd->sta.pStaRxSecurityCheckCb(dev, buf);
5355 ret = ZM_ERR_DATA_NOT_ENCRYPTED;
5357 if (ret == ZM_ERR_DATA_NOT_ENCRYPTED)
5359 wd->commTally.swRxDropUnencryptedCount++;
5363 if ( (wd->sta.wepStatus != ZM_ENCRYPTION_TKIP)&&
5364 (wd->sta.wepStatus != ZM_ENCRYPTION_AES) )
5366 return ZM_ERR_DATA_NOT_ENCRYPTED;
5375 void zfStaMicFailureHandling(zdev_t* dev, zbuf_t* buf)
5380 zmw_get_wlan_dev(dev);
5382 zmw_declare_for_critical_section();
5384 if ( wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK )
5389 zmw_enter_critical_section(dev);
5391 wd->sta.cmMicFailureCount++;
5393 if ( wd->sta.cmMicFailureCount == 1 )
5395 zm_debug_msg0("get the first MIC failure");
5396 //zfTimerSchedule(dev, ZM_EVENT_CM_TIMER, ZM_TICK_CM_TIMEOUT);
5398 /* Timer Resolution on WinXP is 15/16 ms */
5399 /* Decrease Time offset for <XP> Counter Measure */
5400 zfTimerSchedule(dev, ZM_EVENT_CM_TIMER, ZM_TICK_CM_TIMEOUT - ZM_TICK_CM_TIMEOUT_OFFSET);
5402 else if ( wd->sta.cmMicFailureCount == 2 )
5404 zm_debug_msg0("get the second MIC failure");
5405 /* reserve 2 second for OS to send MIC failure report to AP */
5406 wd->sta.cmDisallowSsidLength = wd->sta.ssidLen;
5407 zfMemoryCopy(wd->sta.cmDisallowSsid, wd->sta.ssid, wd->sta.ssidLen);
5408 //wd->sta.cmMicFailureCount = 0;
5409 zfTimerCancel(dev, ZM_EVENT_CM_TIMER);
5410 //zfTimerSchedule(dev, ZM_EVENT_CM_DISCONNECT, ZM_TICK_CM_DISCONNECT);
5412 /* Timer Resolution on WinXP is 15/16 ms */
5413 /* Decrease Time offset for <XP> Counter Measure */
5414 zfTimerSchedule(dev, ZM_EVENT_CM_DISCONNECT, ZM_TICK_CM_DISCONNECT - ZM_TICK_CM_DISCONNECT_OFFSET);
5421 zmw_leave_critical_section(dev);
5425 da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
5428 if (wd->zfcbMicFailureNotify != NULL)
5430 wd->zfcbMicFailureNotify(dev, wd->sta.bssid, ZM_MIC_GROUP_ERROR);
5435 if (wd->zfcbMicFailureNotify != NULL)
5437 wd->zfcbMicFailureNotify(dev, wd->sta.bssid, ZM_MIC_PAIRWISE_ERROR);
5444 u8_t zfStaBlockWlanScan(zdev_t* dev)
5448 zmw_get_wlan_dev(dev);
5450 if ( wd->sta.bChannelScan )
5458 void zfStaResetStatus(zdev_t* dev, u8_t bInit)
5462 zmw_get_wlan_dev(dev);
5464 zfHpDisableBeacon(dev);
5467 wd->sta.capability[0] = 0x01;
5468 wd->sta.capability[1] = 0x00;
5470 if (wd->sta.DFSEnable || wd->sta.TPCEnable)
5471 wd->sta.capability[1] |= ZM_BIT_0;
5473 /* release queued packets */
5474 for(i=0; i<wd->sta.ibssPSDataCount; i++)
5476 zfwBufFree(dev, wd->sta.ibssPSDataQueue[i], 0);
5479 for(i=0; i<wd->sta.staPSDataCount; i++)
5481 zfwBufFree(dev, wd->sta.staPSDataQueue[i], 0);
5484 wd->sta.ibssPSDataCount = 0;
5485 wd->sta.staPSDataCount = 0;
5486 zfZeroMemory((u8_t*) &wd->sta.staPSList, sizeof(struct zsStaPSList));
5488 wd->sta.wmeConnected = 0;
5489 wd->sta.psMgr.tempWakeUp = 0;
5490 wd->sta.qosInfo = 0;
5491 zfQueueFlush(dev, wd->sta.uapsdQ);
5497 void zfStaIbssMonitoring(zdev_t* dev, u8_t reset)
5500 u16_t oppositeCount;
5501 struct zsPartnerNotifyEvent event;
5503 zmw_get_wlan_dev(dev);
5505 zmw_declare_for_critical_section();
5507 //zm_debug_msg1("zfStaIbssMonitoring %d", wd->sta.oppositeCount);
5509 zmw_enter_critical_section(dev);
5511 if ( wd->sta.oppositeCount == 0 )
5516 if ( wd->sta.bChannelScan )
5521 oppositeCount = wd->sta.oppositeCount;
5523 for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++)
5525 if ( oppositeCount == 0 )
5532 wd->sta.oppositeInfo[i].valid = 0;
5535 if ( wd->sta.oppositeInfo[i].valid == 0 )
5542 if ( wd->sta.oppositeInfo[i].aliveCounter )
5544 zm_debug_msg1("Setting alive to ", wd->sta.oppositeInfo[i].aliveCounter);
5546 zmw_leave_critical_section(dev);
5548 if ( wd->sta.oppositeInfo[i].aliveCounter != ZM_IBSS_PEER_ALIVE_COUNTER )
5550 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBEREQ,
5551 (u16_t*)wd->sta.oppositeInfo[i].macAddr, 1, 0, 0);
5554 zmw_enter_critical_section(dev);
5555 wd->sta.oppositeInfo[i].aliveCounter--;
5559 zm_debug_msg0("zfStaIbssMonitoring remove the peer station");
5560 zfMemoryCopy(event.bssid, (u8_t *)(wd->sta.bssid), 6);
5561 zfMemoryCopy(event.peerMacAddr, wd->sta.oppositeInfo[i].macAddr, 6);
5563 wd->sta.oppositeInfo[i].valid = 0;
5564 wd->sta.oppositeCount--;
5565 if (wd->zfcbIbssPartnerNotify != NULL)
5567 zmw_leave_critical_section(dev);
5568 wd->zfcbIbssPartnerNotify(dev, 0, &event);
5569 zmw_enter_critical_section(dev);
5577 zfTimerSchedule(dev, ZM_EVENT_IBSS_MONITOR, ZM_TICK_IBSS_MONITOR);
5580 zmw_leave_critical_section(dev);
5583 void zfInitPartnerNotifyEvent(zdev_t* dev, zbuf_t* buf, struct zsPartnerNotifyEvent *event)
5587 zmw_get_wlan_dev(dev);
5589 peerMacAddr = (u16_t *)event->peerMacAddr;
5591 zfMemoryCopy(event->bssid, (u8_t *)(wd->sta.bssid), 6);
5592 peerMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
5593 peerMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET + 2);
5594 peerMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET + 4);
5597 void zfStaInitOppositeInfo(zdev_t* dev)
5601 zmw_get_wlan_dev(dev);
5603 for(i=0; i<ZM_MAX_OPPOSITE_COUNT; i++)
5605 wd->sta.oppositeInfo[i].valid = 0;
5606 wd->sta.oppositeInfo[i].aliveCounter = ZM_IBSS_PEER_ALIVE_COUNTER;
5609 #ifdef ZM_ENABLE_CENC
5610 u16_t zfStaAddIeCenc(zdev_t* dev, zbuf_t* buf, u16_t offset)
5612 zmw_get_wlan_dev(dev);
5614 if (wd->sta.cencIe[1] != 0)
5616 zfCopyToIntTxBuffer(dev, buf, wd->sta.cencIe, offset, wd->sta.cencIe[1]+2);
5617 offset += (wd->sta.cencIe[1]+2);
5621 #endif //ZM_ENABLE_CENC
5622 u16_t zfStaProcessAction(zdev_t* dev, zbuf_t* buf)
5624 u8_t category, actionDetails;
5625 zmw_get_wlan_dev(dev);
5627 category = zmw_rx_buf_readb(dev, buf, 24);
5628 actionDetails = zmw_rx_buf_readb(dev, buf, 25);
5631 case 0: //Spectrum Management
5632 switch(actionDetails)
5634 case 0: //Measurement Request
5636 case 1: //Measurement Report
5637 //ProcessActionSpectrumFrame_MeasurementReport(Adapter,pActionBody+3);
5639 case 2: //TPC request
5640 //if (wd->sta.TPCEnable)
5641 // zfStaUpdateDot11HTPC(dev, buf);
5643 case 3: //TPC report
5644 //if (wd->sta.TPCEnable)
5645 // zfStaUpdateDot11HTPC(dev, buf);
5647 case 4: //Channel Switch Announcement
5648 if (wd->sta.DFSEnable)
5649 zfStaUpdateDot11HDFS(dev, buf);
5652 zm_debug_msg1("Action Frame contain not support action field ", actionDetails);
5656 case ZM_WLAN_BLOCK_ACK_ACTION_FRAME:
5657 zfAggBlockAckActionFrame(dev, buf);
5659 case 17: //Qos Management
5666 /* Determine the time not send beacon , if more than some value ,
5667 re-write the beacon start address */
5668 void zfReWriteBeaconStartAddress(zdev_t* dev)
5670 zmw_get_wlan_dev(dev);
5672 zmw_declare_for_critical_section();
5674 zmw_enter_critical_section(dev);
5675 wd->tickIbssSendBeacon++; // Increase 1 per 10ms .
5676 zmw_leave_critical_section(dev);
5678 if ( wd->tickIbssSendBeacon == 40 )
5680 // DbgPrint("20070727");
5681 zfHpEnableBeacon(dev, ZM_MODE_IBSS, wd->beaconInterval, wd->dtim, (u8_t)wd->sta.atimWindow);
5682 zmw_enter_critical_section(dev);
5683 wd->tickIbssSendBeacon = 0;
5684 zmw_leave_critical_section(dev);
5688 struct zsTkipSeed* zfStaGetRxSeed(zdev_t* dev, zbuf_t* buf)
5693 zmw_get_wlan_dev(dev);
5695 /* if need not check MIC, return NULL */
5696 if ( ((wd->sta.encryMode != ZM_TKIP)&&(wd->sta.encryMode != ZM_AES))||
5697 (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) )
5702 da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
5704 if ((zmw_rx_buf_readb(dev, buf, 0) & 0x80) == 0x80)
5705 keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+5); /* Qos Packet*/
5707 keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+3); /* normal Packet*/
5708 keyIndex = (keyIndex & 0xc0) >> 6;
5710 return (&wd->sta.rxSeed[keyIndex]);
5713 void zfStaEnableSWEncryption(zdev_t *dev, u8_t value)
5715 zmw_get_wlan_dev(dev);
5717 wd->sta.SWEncryptEnable = value;
5718 zfHpSWDecrypt(dev, 1);
5719 zfHpSWEncrypt(dev, 1);
5722 void zfStaDisableSWEncryption(zdev_t *dev)
5724 zmw_get_wlan_dev(dev);
5726 wd->sta.SWEncryptEnable = 0;
5727 zfHpSWDecrypt(dev, 0);
5728 zfHpSWEncrypt(dev, 0);
5731 u16_t zfComputeBssInfoWeightValue(zdev_t *dev, u8_t isBMode, u8_t isHT, u8_t isHT40, u8_t signalStrength)
5734 u8_t weightOfAGBelowThr = 0;
5735 u8_t weightOfAGUpThr = 15;
5736 u8_t weightOfN20BelowThr = 15;
5737 u8_t weightOfN20UpThr = 30;
5738 u8_t weightOfN40BelowThr = 16;
5739 u8_t weightOfN40UpThr = 32;
5741 zmw_get_wlan_dev(dev);
5744 return (signalStrength + weightOfB); // pure b mode , do not add the weight value for this AP !
5747 if( isHT == 0 && isHT40 == 0 )
5748 { // a , g , b/g mode ! add the weight value 15 for this AP if it's signal strength is more than some value !
5749 if( signalStrength < 18 ) // -77 dBm
5750 return signalStrength + weightOfAGBelowThr;
5752 return (signalStrength + weightOfAGUpThr);
5754 else if( isHT == 1 && isHT40 == 0 )
5755 { // 80211n mode use 20MHz
5756 if( signalStrength < 23 ) // -72 dBm
5757 return (signalStrength + weightOfN20BelowThr);
5759 return (signalStrength + weightOfN20UpThr);
5761 else // isHT == 1 && isHT40 == 1
5762 { // 80211n mode use 40MHz
5763 if( signalStrength < 16 ) // -79 dBm
5764 return (signalStrength + weightOfN40BelowThr);
5766 return (signalStrength + weightOfN40UpThr);
5771 u16_t zfStaAddIbssAdditionalIE(zdev_t* dev, zbuf_t* buf, u16_t offset)
5775 zmw_get_wlan_dev(dev);
5777 for (i=0; i<wd->sta.ibssAdditionalIESize; i++)
5779 zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.ibssAdditionalIE[i]);