2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/ais_fsm.c#1 $
6 \brief This file defines the FSM for SAA and AAA MODULE.
8 This file defines the FSM for SAA and AAA MODULE.
17 ** [ALPS00382763] N820_JB:[WIFI]N820JB WLAN ±K???,«ÝÉó?¬y¥\¯Ó¤j
18 ** do not try reconnecting when being disconnected by the peer
21 * [WCXRP00000913] [MT6620 Wi-Fi] create repository of source code dedicated for MT6620 E6 ASIC
25 * [MT6620 Wi-Fi][Driver] API and behavior modification for preferred band configuration with corresponding network configuration
26 * add wlanSetPreferBandByNetwork() for glue layer to invoke for setting preferred band configuration corresponding to network type.
29 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
30 * Adjust code for DBG and CONFIG_XLOG.
33 * [WCXRP00001120] [MT6620 Wi-Fi][Driver] Modify roaming to AIS state transition from synchronous to asynchronous approach to avoid incomplete state termination
34 * 1. change RDD related compile option brace position.
35 * 2. when roaming is triggered, ask AIS to transit immediately only when AIS is in Normal TR state without join timeout timer ticking
36 * 3. otherwise, insert AIS_REQUEST into pending request queue
39 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
40 * modify the xlog related code.
43 * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT for REASSOCIATED cases as an explicit trigger for Android framework
44 * correct reference to BSSID field in Association-Response frame.
47 * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT for REASSOCIATED cases as an explicit trigger for Android framework
48 * 1. for DEAUTH/DISASSOC cases, indicate for DISCONNECTION immediately.
49 * 2. (Android only) when reassociation-and-non-roaming cases happened, indicate an extra DISCONNECT indication to Android Wi-Fi framework
52 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
53 * adding the code for XLOG.
55 * 10 26 2011 tsaiyuan.hsu
56 * [WCXRP00001064] [MT6620 Wi-Fi][DRV]] add code with roaming awareness when disconnecting AIS network
57 * be aware roaming when disconnecting AIS network.
60 * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
61 * STA_REC shall be NULL for Beacon's MSDU
64 * [MT6620 Wi-Fi][Driver] Reduce join failure count limit to 2 for faster re-join for other BSS
65 * 1. short join failure count limit to 2
66 * 2. treat join timeout as kind of join failure as well
69 * [WCXRP00001036] [MT6620 Wi-Fi][Driver][FW] Adding the 802.11w code for MFP
70 * adding the 802.11w related function and define .
73 * [WCXRP00001020] [MT6620 Wi-Fi][Driver] Handle secondary channel offset of AP in 5GHz band
76 * 09 20 2011 tsaiyuan.hsu
77 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
78 * change window registry of driver for roaming.
81 * [WCXRP00000997] [MT6620 Wi-Fi][Driver][FW] Handle change of BSS preamble type and slot time
82 * Handle client mode about preamble type and slot time
84 * 09 08 2011 tsaiyuan.hsu
85 * [WCXRP00000972] [MT6620 Wi-Fi][DRV]] check if roaming occurs after join failure to avoid state incosistence.
86 * check if roaming occurs after join failure to avoid deactivation of network.
88 * 08 24 2011 chinghwa.yu
89 * [WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
90 * Update RDD test mode cases.
92 * 08 16 2011 tsaiyuan.hsu
93 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
94 * EnableRoaming in registry is deprecated.
96 * 08 16 2011 tsaiyuan.hsu
97 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
98 * use registry to enable or disable roaming.
101 * [WCXRP00000840] [MT6620 Wi-Fi][Driver][AIS] Stop timer for joining when channel is released due to join failure count exceeding limit
102 * stop timer when joining operation is failed due to try count exceeds limitation
105 * [WCXRP00000815] [MT6620 Wi-Fi][Driver] allow single BSSID with multiple SSID settings to work around some tricky AP which use space character as hidden SSID
106 * do not handle SCAN request immediately after connected to increase the probability of receiving 1st beacon frame.
109 * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
110 * change parameter name from PeerAddr to BSSID
113 * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
114 * 1. specify target's BSSID when requesting channel privilege.
115 * 2. pass BSSID information to firmware domain
118 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
119 * ensure DEAUTH is always sent before establish a new connection
122 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
123 * typo fix: a right brace is missed.
126 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
127 * When RECONNECT request is identified as disconnected, it is necessary to check for pending scan request.
130 * [WCXRP00000757] [MT6620 Wi-Fi][Driver][SCN] take use of RLM API to filter out BSS in disallowed channels
131 * mark fgIsTransition as TRUE for state rolling.
134 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
135 * always check for pending scan after switched into NORMAL_TR state.
138 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
139 * always treat connection request at higher priority over scanning request
141 * 06 09 2011 tsaiyuan.hsu
142 * [WCXRP00000760] [MT5931 Wi-Fi][FW] Refine rxmHandleMacRxDone to reduce code size
143 * move send_auth at rxmHandleMacRxDone in firmware to driver to reduce code size.
146 * [WCXRP00000681] [MT5931][Firmware] HIF code size reduction
147 * eliminate unused parameters for SAA-FSM
150 * [WCXRP00000732] [MT6620 Wi-Fi][AIS] No need to switch back to IDLE state when DEAUTH frame is dropped due to bss disconnection
151 * change SCAN handling behavior when followed by a CONNECT/DISCONNECT requests by pending instead of dropping.
154 * [WCXRP00000732] [MT6620 Wi-Fi][AIS] No need to switch back to IDLE state when DEAUTH frame is dropped due to bss disconnection
155 * when TX DONE status is TX_RESULT_DROPPED_IN_DRIVER, no need to switch back to IDLE state.
157 * 04 14 2011 cm.chang
158 * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
161 * 04 13 2011 george.huang
162 * [WCXRP00000628] [MT6620 Wi-Fi][FW][Driver] Modify U-APSD setting to default OFF
166 * [WCXRP00000575] [MT6620 Wi-Fi][Driver][AIS] reduce memory usage when generating mailbox message for scan request
167 * when there is no IE needed for probe request, then request a smaller memory for mailbox message
169 * 03 17 2011 chinglan.wang
170 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
173 * 03 17 2011 chinglan.wang
174 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
177 * 03 16 2011 tsaiyuan.hsu
178 * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
179 * remove obsolete definition and unused variables.
182 * [WCXRP00000535] [MT6620 Wi-Fi][Driver] Fixed channel operation when AIS and Tethering are operating concurrently
183 * When fixed channel operation is necessary, AIS-FSM would scan and only connect for BSS on the specific channel
185 * 03 09 2011 tsaiyuan.hsu
186 * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
187 * avoid clearing fgIsScanReqIssued so as to add scan results.
189 * 03 07 2011 terry.wu
190 * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
191 * Toggle non-standard debug messages to comments.
193 * 03 04 2011 tsaiyuan.hsu
194 * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
195 * reset retry conter of attemp to connect to ap after completion of join.
198 * [WCXRP00000515] [MT6620 Wi-Fi][Driver] Surpress compiler warning which is identified by GNU compiler collection
199 * surpress compile warning occured when compiled by GNU compiler collection.
202 * [WCXRP00000503] [MT6620 Wi-Fi][Driver] Take RCPI brought by association response as initial RSSI right after connection is built.
203 * use RCPI brought by ASSOC-RESP after connection is built as initial RCPI to avoid using a uninitialized MAC-RX RCPI.
205 * 02 26 2011 tsaiyuan.hsu
206 * [WCXRP00000391] [MT6620 Wi-Fi][FW] Add Roaming Support
207 * not send disassoc or deauth to leaving AP so as to improve performace of roaming.
210 * [WCXRP00000487] [MT6620 Wi-Fi][Driver][AIS] Serve scan and connect request with a queue-based approach to improve response time for scanning request
211 * when handling reconnect request, set fgTryScan as TRUE
214 * [WCXRP00000487] [MT6620 Wi-Fi][Driver][AIS] Serve scan and connect request with a queue-based approach to improve response time for scanning request
215 * handle SCAN and RECONNECT with a FIFO approach.
217 * 02 09 2011 tsaiyuan.hsu
218 * [WCXRP00000392] [MT6620 Wi-Fi][Driver] Add Roaming Support
219 * Check if prRegInfo is null or not before initializing roaming parameters.
222 * [WCXRP00000416] [MT6620 Wi-Fi][Driver] treat "unable to find BSS" as connection trial to prevent infinite reconnection trials
223 * treat "unable to find BSS" as connection trial to prevent infinite reconnection trials.
225 * 01 27 2011 tsaiyuan.hsu
226 * [WCXRP00000392] [MT6620 Wi-Fi][Driver] Add Roaming Support
228 * 1. not support 11r, only use strength of signal to determine roaming.
229 * 2. not enable CFG_SUPPORT_ROAMING until completion of full test.
230 * 3. in 6620, adopt work-around to avoid sign extension problem of cck of hw
231 * 4. assume that change of link quality in smooth way.
233 * 01 26 2011 yuche.tsai
234 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
237 * 01 25 2011 yuche.tsai
238 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
239 * Fix Compile Error when DBG is disabled.
241 * 01 25 2011 yuche.tsai
242 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
243 * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
246 * [WCXRP00000359] [MT6620 Wi-Fi][Driver] add an extra state to ensure DEAUTH frame is always sent
247 * Add an extra state to guarantee DEAUTH frame is sent then connect to new BSS.
248 * This change is due to WAPI AP needs DEAUTH frame as a necessary step in handshaking protocol.
251 * [WCXRP00000307] [MT6620 Wi-Fi][SQA]WHQL test .2c_wlan_adhoc case fail.
252 * [IBSS] when merged in, the bss state should be updated to firmware to pass WHQL adhoc failed item
255 * [WCXRP00000351] [MT6620 Wi-Fi][Driver] remove from scanning result in OID handling layer when the corresponding BSS is disconnected due to beacon timeout
256 * remove from scanning result when the BSS is disconnected due to beacon timeout.
259 * [WCXRP00000337] [MT6620 Wi-FI][Driver] AIS-FSM not to invoke cnmStaRecResetStatus directly 'cause it frees all belonging STA-RECs
260 * do not invoke cnmStaRecResetStatus() directly, nicUpdateBss will do the things after bss is disconnected
263 * [WCXRP00000270] [MT6620 Wi-Fi][Driver] Clear issues after concurrent networking support has been merged
264 * do not need to manipulate prStaRec after indicating BSS disconnection to firmware, 'cause all STA-RECs belongs to BSS has been freed already
267 * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
268 * add DEBUGFUNC() macro invoking for more detailed debugging information
270 * 12 23 2010 george.huang
271 * [WCXRP00000152] [MT6620 Wi-Fi] AP mode power saving function
272 * 1. update WMM IE parsing, with ASSOC REQ handling
273 * 2. extend U-APSD parameter passing from driver to FW
276 * [WCXRP00000270] [MT6620 Wi-Fi][Driver] Clear issues after concurrent networking support has been merged
277 * before BSS disconnection is indicated to firmware, all correlated peer should be cleared and freed
279 * 12 07 2010 cm.chang
280 * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
281 * 1. BSSINFO include RLM parameter
282 * 2. free all sta records when network is disconnected
284 * 11 25 2010 yuche.tsai
286 * Update SLT Function for QoS Support and not be affected by fixed rate function.
289 * [WCXRP00000208] [MT6620 Wi-Fi][Driver] Add scanning with specified SSID to AIS FSM
290 * add scanning with specified SSID facility to AIS-FSM
293 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000150] [MT6620 Wi-Fi][Driver] Add implementation for querying current TX rate from firmware auto rate module
294 * 1) Query link speed (TX rate) from firmware directly with buffering mechanism to reduce overhead
295 * 2) Remove CNM CH-RECOVER event handling
296 * 3) cfg read/write API renamed with kal prefix for unified naming rules.
299 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000137] [MT6620 Wi-Fi] [FW] Support NIC capability query command
300 * 1) update NVRAM content template to ver 1.02
301 * 2) add compile option for querying NIC capability (default: off)
302 * 3) modify AIS 5GHz support to run-time option, which could be turned on by registry or NVRAM setting
303 * 4) correct auto-rate compiler error under linux (treat warning as error)
304 * 5) simplify usage of NVRAM and REG_INFO_T
305 * 6) add version checking between driver and firmware
308 * [WCXRP00000097] [MT6620 Wi-Fi] [Driver] Fixed the P2P not setting the fgIsChannelExt value make scan not abort
309 * initial the fgIsChannelExt value.
312 * [WCXRP00000087] [MT6620 Wi-Fi][Driver] Cannot connect to 5GHz AP, driver will cause FW assert.
313 * correct erroneous logic: specifying eBand with incompatible eSco
316 * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and replaced by ENUM_NETWORK_TYPE_INDEX_T only
317 * remove ENUM_NETWORK_TYPE_T definitions
319 * 09 27 2010 chinghwa.yu
320 * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000065] Update BoW design and settings
321 * Update BCM/BoW design and settings.
324 * [WCXRP00000049] [MT6620 Wi-Fi][Driver] Adhoc cannot be created successfully.
325 * keep IBSS-ALONE state retrying until further instruction is received
328 * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete and might leads to BSOD when entering RF test with AIS associated
329 * Do a complete reset with STA-REC null checking for RF test re-entry
331 * 09 09 2010 yuche.tsai
333 * Fix NULL IE Beacon issue. Sync Beacon Content to FW before enable beacon.
334 * Both in IBSS Create & IBSS Merge
338 * frequency is in unit of KHz thus no need to divide 1000 once more.
342 * 1) initialize for correct parameter even for disassociation.
343 * 2) AIS-FSM should have a limit on trials to build connection
345 * 09 03 2010 kevin.huang
347 * Refine #include sequence and solve recursive/nested #include issue
351 * eliminate klockwork errors
353 * 08 29 2010 yuche.tsai
355 * Finish SLT TX/RX & Rate Changing Support.
359 * add option for enabling AIS 5GHz scan
363 * [AIS-FSM] IBSS no longer needs to acquire channel for beaconing, RLM/CNM will handle the channel switching when BSS information is updated
365 * 08 25 2010 george.huang
367 * update OID/ registry control path for PM related settings
369 * 08 24 2010 cm.chang
371 * Support RLM initail channel of Ad-hoc, P2P and BOW
373 * 08 20 2010 cm.chang
375 * Migrate RLM code to host from FW
379 * check-in missed files.
381 * 08 12 2010 kevin.huang
383 * Refine bssProcessProbeRequest() and bssSendBeaconProbeResponse()
387 * reset fgIsScanReqIssued when abort request is received right after join completion.
391 * surpress compilation warning.
395 * comment out deprecated members in BSS_INFO, which are only used by firmware rather than driver.
399 * 1) BoW wrapper: use definitions instead of hard-coded constant for error code
400 * 2) AIS-FSM: eliminate use of desired RF parameters, use prTargetBssDesc instead
401 * 3) add handling for RX_PKT_DESTINATION_HOST_WITH_FORWARD for GO-broadcast frames
405 * eliminate u4FreqInKHz usage, combined into rConnections.ucAdHoc*
409 * allocate on MGMT packet for IBSS beaconing.
413 * [AIS-FSM] fix: when join failed, release channel privilege as well
417 * reuse join-abort sub-procedure to reduce code size.
421 * 1) eliminate redundant variable eOPMode in prAdapter->rWlanInfo
422 * 2) change nicMediaStateChange() API prototype
426 * AIS-FSM: when scan request is coming in the 1st 5 seconds of channel privilege period, just pend it til 5-sec. period finishes
430 * AIS-FSM FIX: return channel privilege even when the privilege is not granted yet
431 * QM: qmGetFrameAction() won't assert when corresponding STA-REC index is not found
435 * re-commit code logic being overwriten.
439 * .support the Wi-Fi RSN
443 * 1) re-enable AIS-FSM beacon timeout handling.
444 * 2) scan done API revised
449 * 2) disable beacon timeout handling temporally due to unexpected beacon timeout event.
453 * indicate scan done for linux wireless extension
457 * add AIS-FSM handling for beacon timeout event.
461 * 1) refine AIS-FSM indent.
462 * 2) when entering RF Test mode, flush 802.1X frames as well
463 * 3) when entering D3 state, flush 802.1X frames as well
467 * separate AIS-FSM states into different cases of channel request.
471 * 1) change BG_SCAN to ONLINE_SCAN for consistent term
472 * 2) only clear scanning result when scan is permitted to do
476 * 1) [AIS] when new scan is issued, clear currently available scanning result except the connected one
477 * 2) refine disconnection behaviour when issued during BG-SCAN process
481 * 1) bugfix: do not stop timer for join after switched into normal_tr state, for providing chance for DHCP handshasking
482 * 2) modify rsnPerformPolicySelection() invoking
486 * 1) init AIS_BSS_INFO as channel number = 1 with band = 2.4GHz
491 * update for security supporting.
495 * [WPD00003833] [MT6620 and MT5931] Driver migration.
496 * when IBSS is being merged-in, send command packet to PM for connected indication
500 * [WPD00003833] [MT6620 and MT5931] Driver migration.
501 * Add Ad-Hoc support to AIS-FSM
503 * 07 19 2010 jeffrey.chang
505 * Linux port modification
509 * [WPD00003833] [MT6620 and MT5931] Driver migration.
510 * bugfix for SCN migration
511 * 1) modify QUEUE_CONCATENATE_QUEUES() so it could be used to concatence with an empty queue
512 * 2) before AIS issues scan request, network(BSS) needs to be activated first
513 * 3) only invoke COPY_SSID when using specified SSID for scan
517 * [WPD00003833] [MT6620 and MT5931] Driver migration.
518 * for AIS scanning, driver specifies no extra IE for probe request
522 * [WPD00003833] [MT6620 and MT5931] Driver migration.
523 * driver no longer generates probe request frames
525 * 07 14 2010 yarco.yang
527 * Remove CFG_MQM_MIGRATION
531 * [WPD00003833] [MT6620 and MT5931] Driver migration.
532 * Refine AIS-FSM by divided into more states
534 * 07 13 2010 cm.chang
536 * Rename MSG_CH_RELEASE_T to MSG_CH_ABORT_T
540 * 1) separate AIS_FSM state for two kinds of scanning. (OID triggered scan, and scan-for-connection)
541 * 2) eliminate PRE_BSS_DESC_T, Beacon/PrebResp is now parsed in single pass
542 * 3) implment DRV-SCN module, currently only accepts single scan request, other request will be directly dropped by returning BUSY
544 * 07 09 2010 george.huang
546 * [WPD00001556] Migrate PM variables from FW to driver: for composing QoS Info
550 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
553 * [WPD00003833][MT6620 and MT5931] Driver migration
554 * take use of RLM module for parsing/generating HT IEs for 11n capability
556 * 07 08 2010 cm.chang
557 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
558 * Rename MID_MNY_CNM_CH_RELEASE to MID_MNY_CNM_CH_ABORT
561 * [WPD00003833][MT6620 and MT5931] Driver migration
562 * for first connection, if connecting failed do not enter into scan state.
565 * [WPD00003833][MT6620 and MT5931] Driver migration
566 * once STA-REC is allocated and updated, invoke cnmStaRecChangeState() to sync. with firmware.
568 * 07 06 2010 george.huang
569 * [WPD00001556]Basic power managemenet function
570 * Update arguments for nicUpdateBeaconIETemplate()
573 * [WPD00003833][MT6620 and MT5931] Driver migration
574 * STA-REC is maintained by CNM only.
577 * [WPD00003833][MT6620 and MT5931] Driver migration
578 * remove unused definitions.
581 * [WPD00003833][MT6620 and MT5931] Driver migration
582 * AIS-FSM integration with CNM channel request messages
585 * [WPD00003833][MT6620 and MT5931] Driver migration
586 * implementation of DRV-SCN and related mailbox message handling.
589 * [WPD00003833][MT6620 and MT5931] Driver migration
590 * sync. with CMD/EVENT document ver0.07.
593 * [WPD00003833][MT6620 and MT5931] Driver migration
594 * 1) sync to. CMD/EVENT document v0.03
595 * 2) simplify DTIM period parsing in scan.c only, bss.c no longer parses it again.
596 * 3) send command packet to indicate FW-PM after
597 * a) 1st beacon is received after AIS has connected to an AP
598 * b) IBSS-ALONE has been created
599 * c) IBSS-MERGE has occured
602 * [WPD00003833][MT6620 and MT5931] Driver migration
603 * modify Beacon/ProbeResp to complete parsing,
604 * because host software has looser memory usage restriction
607 * [WPD00003833][MT6620 and MT5931] Driver migration
611 * [WPD00003833][MT6620 and MT5931] Driver migration
612 * comment out RLM APIs by CFG_RLM_MIGRATION.
615 * [WPD00003833][MT6620 and MT5931] Driver migration
616 * 1) add command warpper for STA-REC/BSS-INFO sync.
617 * 2) enhance command packet sending procedure for non-oid part
618 * 3) add command packet definitions for STA-REC/BSS-INFO sync.
620 * 06 21 2010 yarco.yang
621 * [WPD00003837][MT6620]Data Path Refine
622 * Support CFG_MQM_MIGRATION flag
625 * [WPD00003833][MT6620 and MT5931] Driver migration
626 * add scan_fsm into building.
629 * [WPD00003833][MT6620 and MT5931] Driver migration
630 * RSN/PRIVACY compilation flag awareness correction
632 * 06 18 2010 cm.chang
633 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
634 * Provide cnmMgtPktAlloc() and alloc/free function of msg/buf
637 * [WPD00003840][MT6620 5931] Security migration
638 * migration from MT6620 firmware.
641 * [WPD00003833][MT6620 and MT5931] Driver migration
645 * [WPD00003833][MT6620 and MT5931] Driver migration
646 * restore utility function invoking via hem_mbox to direct calls
649 * [WPD00003833][MT6620 and MT5931] Driver migration
650 * auth.c is migrated.
653 * [WPD00003833][MT6620 and MT5931] Driver migration
657 * [WPD00003833][MT6620 and MT5931] Driver migration
658 * 1) migrate assoc.c.
659 * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
660 * 3) add configuration options for CNM_MEM and RSN modules
661 * 4) add data path for management frames
662 * 5) eliminate rPacketInfo of MSDU_INFO_T
665 * [WPD00003833][MT6620 and MT5931] Driver migration
666 * change to enqueue TX frame infinitely.
669 * [WPD00003833][MT6620 and MT5931] Driver migration
670 * 1) eliminate CFG_CMD_EVENT_VERSION_0_9
671 * 2) when disconnected, indicate nic directly (no event is needed)
674 * [WPD00003833][MT6620 and MT5931] Driver migration
675 * add buildable & linkable ais_fsm.c
677 * related reference are still waiting to be resolved
679 * 06 01 2010 cm.chang
680 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
681 * Add conditionial compiling flag to choose default available bandwidth
683 * 05 28 2010 kevin.huang
684 * [BORA00000794][WIFISYS][New Feature]Power Management Support
685 * Add ClientList handling API - bssClearClientList, bssAddStaRecToClientList
687 * 05 24 2010 kevin.huang
688 * [BORA00000794][WIFISYS][New Feature]Power Management Support
689 * Refine authSendAuthFrame() for NULL STA_RECORD_T case and minimum deauth interval.
691 * 05 21 2010 kevin.huang
692 * [BORA00000794][WIFISYS][New Feature]Power Management Support
693 * Fix compile error if CFG_CMD_EVENT_VER_009 == 0 for prEventConnStatus->ucNetworkType.
695 * 05 21 2010 kevin.huang
696 * [BORA00000794][WIFISYS][New Feature]Power Management Support
697 * Refine txmInitWtblTxRateTable() - set TX initial rate according to AP's operation rate set
699 * 05 17 2010 kevin.huang
700 * [BORA00000794][WIFISYS][New Feature]Power Management Support
701 * Call pmAbort() and add ucNetworkType field in EVENT_CONNECTION_STATUS
703 * 05 14 2010 kevin.huang
704 * [BORA00000794][WIFISYS][New Feature]Power Management Support
705 * Fix compile warning - define of MQM_WMM_PARSING was removed
707 * 05 12 2010 kevin.huang
708 * [BORA00000794][WIFISYS][New Feature]Power Management Support
709 * Add Power Management - Legacy PS-POLL support.
711 * 04 28 2010 tehuang.liu
712 * [BORA00000605][WIFISYS] Phase3 Integration
713 * Removed the use of compiling flag MQM_WMM_PARSING
715 * 04 27 2010 kevin.huang
716 * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
720 * 04 27 2010 kevin.huang
721 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
722 * Add Set Slot Time and Beacon Timeout Support for AdHoc Mode
724 * 04 19 2010 kevin.huang
725 * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
726 * Add Send Deauth for Class 3 Error and Leave Network Support
729 * [BORA00000680][MT6620] Support the statistic for Microsoft os query
730 * fixed the protected bit at cap info for ad-hoc.
732 * 04 13 2010 kevin.huang
733 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
734 * Add new HW CH macro support
736 * 04 07 2010 chinghwa.yu
737 * [BORA00000563]Add WiFi CoEx BCM module
738 * Add TX Power Control RCPI function.
741 * [BORA00000605][WIFISYS] Phase3 Integration
742 * move the wlan table alloc / free to change state function.
745 * [BORA00000676][MT6620] Support the frequency setting and query at build connection / connection event
746 * modify the build connection and status event structure bu CMD_EVENT doc 0.09 draft, default is disable.
749 * [BORA00000605][WIFISYS] Phase3 Integration
750 * fixed some WHQL testing error.
752 * 03 24 2010 kevin.huang
753 * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
754 * Add Set / Unset POWER STATE in AIS Network
756 * 03 16 2010 kevin.huang
757 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
760 * 03 10 2010 kevin.huang
761 * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
762 * Add Channel Manager for arbitration of JOIN and SCAN Req
764 * 03 03 2010 kevin.huang
765 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
766 * Add PHY_CONFIG to change Phy Type
768 * 03 03 2010 chinghwa.yu
769 * [BORA00000563]Add WiFi CoEx BCM module
770 * Use bcmWiFiNotify to replace wifi_send_msg to pass infomation to BCM module.
772 * 03 03 2010 chinghwa.yu
773 * [BORA00000563]Add WiFi CoEx BCM module
774 * Remove wmt_task definition and add PTA function.
776 * 03 02 2010 tehuang.liu
777 * [BORA00000569][WIFISYS] Phase 2 Integration Test
778 * Init TXM and MQM testing procedures in aisFsmRunEventJoinComplete()
780 * 03 01 2010 tehuang.liu
781 * [BORA00000569][WIFISYS] Phase 2 Integration Test
782 * Modified aisUpdateBssInfo() to call TXM's functions for setting WTBL TX parameters
785 * [BORA00000605][WIFISYS] Phase3 Integration
786 * clear the pmkid cache while indicate media disconnect.
788 * 02 26 2010 tehuang.liu
789 * [BORA00000569][WIFISYS] Phase 2 Integration Test
792 * 02 26 2010 tehuang.liu
793 * [BORA00000569][WIFISYS] Phase 2 Integration Test
794 * Enabled MQM parsing WMM IEs for non-AP mode
796 * 02 26 2010 kevin.huang
797 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
798 * Remove CFG_TEST_VIRTUAL_CMD and add support of Driver STA_RECORD_T activation
801 * [BORA00000605][WIFISYS] Phase3 Integration
802 * use the Rx0 dor event indicate.
804 * 02 23 2010 kevin.huang
805 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
806 * Support dynamic channel selection
809 * [BORA00000621][MT6620 Wi-Fi] Add the RSSI indicate to avoid XP stalled for query rssi value
810 * Adding the RSSI event support, using the HAL function to get the rcpi value and tranlsate to RSSI and indicate to driver
812 * 02 12 2010 cm.chang
813 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
814 * Use bss info array for concurrent handle
816 * 02 05 2010 kevin.huang
817 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
818 * Revise data structure to share the same BSS_INFO_T for avoiding coding error
820 * 02 04 2010 kevin.huang
821 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
822 * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
824 * 01 27 2010 tehuang.liu
825 * [BORA00000569][WIFISYS] Phase 2 Integration Test
826 * Set max AMDPU size supported by the peer to 64 KB, removed mqmInit() and mqmTxSendAddBaReq() function calls in aisUpdateBssInfo()
829 * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
830 * add and fixed some security function.
832 * 01 22 2010 cm.chang
833 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
834 * Support protection and bandwidth switch
836 * 01 20 2010 kevin.huang
837 * [BORA00000569][WIFISYS] Phase 2 Integration Test
838 * Add PHASE_2_INTEGRATION_WORK_AROUND and CFG_SUPPORT_BCM flags
840 * 01 15 2010 tehuang.liu
841 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
842 * Configured the AMPDU factor to 3 for the APu1rwduu`wvpghlqg|q`mpdkb+ilp
844 * 01 14 2010 chinghwa.yu
845 * [BORA00000563]Add WiFi CoEx BCM module
846 * Add WiFi BCM module for the 1st time.
848 * 01 11 2010 kevin.huang
849 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
850 * Add Deauth and Disassoc Handler
852 * 01 07 2010 kevin.huang
853 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
854 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
856 * Refine JOIN Complete and seperate the function of Media State indication
858 * 01 04 2010 tehuang.liu
859 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
860 * For working out the first connection Chariot-verified version
862 * 12 18 2009 cm.chang
863 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
866 * Dec 10 2009 mtk01088
867 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
868 * adding the sample code to update the wlan table rate,
870 * Dec 10 2009 mtk01104
871 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
872 * Different function prototype of wifi_send_msg()
874 * Dec 9 2009 mtk01104
875 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
876 * Call rlm related function to process HT info when join complete
878 * Dec 9 2009 mtk01088
879 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
880 * default the acquired wlan table entry code off
882 * Dec 9 2009 mtk01088
883 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
884 * adding the code to acquired the wlan table entry, and a sample code to update the BA bit at table
886 * Dec 7 2009 mtk01461
887 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
888 * Fix the problem of prSwRfb overwrited by event packet in aisFsmRunEventJoinComplete()
890 * Dec 4 2009 mtk01088
891 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
892 * adding the code to integrate the security related code
894 * Dec 3 2009 mtk01461
895 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
896 * Remove redundant declaration
898 * Dec 3 2009 mtk01461
899 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
900 * Add code for JOIN init and JOIN complete
902 * Nov 30 2009 mtk01461
903 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
904 * Rename u4RSSI to i4RSSI
906 * Nov 30 2009 mtk01461
907 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
908 * Revise ENUM_MEDIA_STATE to ENUM_PARAM_MEDIA_STATE
910 * Nov 30 2009 mtk01461
911 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
912 * Add fgIsScanReqIssued to CONNECTION_SETTINGS_T
914 * Nov 26 2009 mtk01461
915 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
916 * Revise Virtual CMD handler due to structure changed
918 * Nov 25 2009 mtk01461
919 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
920 * Add Virtual CMD & RESP for testing CMD PATH
922 * Nov 23 2009 mtk01461
923 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
924 * Add aisFsmInitializeConnectionSettings()
926 * Nov 20 2009 mtk01461
927 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
928 * Add CFG_TEST_MGMT_FSM flag for aisFsmTest()
930 * Nov 16 2009 mtk01461
931 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
935 /*******************************************************************************
936 * C O M P I L E R F L A G S
937 ********************************************************************************
940 /*******************************************************************************
941 * E X T E R N A L R E F E R E N C E S
942 ********************************************************************************
946 /*******************************************************************************
948 ********************************************************************************
950 #define AIS_ROAMING_CONNECTION_TRIAL_LIMIT 2
952 /*******************************************************************************
954 ********************************************************************************
957 /*******************************************************************************
958 * P U B L I C D A T A
959 ********************************************************************************
962 /*******************************************************************************
963 * P R I V A T E D A T A
964 ********************************************************************************
967 /*lint -save -e64 Type mismatch */
968 static PUINT_8 apucDebugAisState[AIS_STATE_NUM] = {
969 (PUINT_8)DISP_STRING("AIS_STATE_IDLE"),
970 (PUINT_8)DISP_STRING("AIS_STATE_SEARCH"),
971 (PUINT_8)DISP_STRING("AIS_STATE_SCAN"),
972 (PUINT_8)DISP_STRING("AIS_STATE_ONLINE_SCAN"),
973 (PUINT_8)DISP_STRING("AIS_STATE_LOOKING_FOR"),
974 (PUINT_8)DISP_STRING("AIS_STATE_WAIT_FOR_NEXT_SCAN"),
975 (PUINT_8)DISP_STRING("AIS_STATE_REQ_CHANNEL_JOIN"),
976 (PUINT_8)DISP_STRING("AIS_STATE_JOIN"),
977 (PUINT_8)DISP_STRING("AIS_STATE_IBSS_ALONE"),
978 (PUINT_8)DISP_STRING("AIS_STATE_IBSS_MERGE"),
979 (PUINT_8)DISP_STRING("AIS_STATE_NORMAL_TR"),
980 (PUINT_8)DISP_STRING("AIS_STATE_DISCONNECTING")
985 /*******************************************************************************
987 ********************************************************************************
990 /*******************************************************************************
991 * F U N C T I O N D E C L A R A T I O N S
992 ********************************************************************************
995 /*******************************************************************************
997 ********************************************************************************
999 /*----------------------------------------------------------------------------*/
1001 * @brief the function is used to initialize the value of the connection settings for
1008 /*----------------------------------------------------------------------------*/
1010 aisInitializeConnectionSettings (
1011 IN P_ADAPTER_T prAdapter,
1012 IN P_REG_INFO_T prRegInfo
1015 P_CONNECTION_SETTINGS_T prConnSettings;
1016 UINT_8 aucAnyBSSID[] = BC_BSSID;
1017 UINT_8 aucZeroMacAddr[] = NULL_MAC_ADDR;
1020 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1022 /* Setup default values for operation */
1023 COPY_MAC_ADDR(prConnSettings->aucMacAddress, aucZeroMacAddr);
1025 prConnSettings->ucDelayTimeOfDisconnectEvent = AIS_DELAY_TIME_OF_DISCONNECT_SEC;
1027 COPY_MAC_ADDR(prConnSettings->aucBSSID, aucAnyBSSID);
1028 prConnSettings->fgIsConnByBssidIssued = FALSE;
1030 prConnSettings->fgIsConnReqIssued = FALSE;
1031 prConnSettings->fgIsDisconnectedByNonRequest = FALSE;
1033 prConnSettings->ucSSIDLen = 0;
1035 prConnSettings->eOPMode = NET_TYPE_INFRA;
1037 prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
1040 prConnSettings->ucAdHocChannelNum = (UINT_8) nicFreq2ChannelNum(prRegInfo->u4StartFreq);
1041 prConnSettings->eAdHocBand = prRegInfo->u4StartFreq < 5000000 ? BAND_2G4 : BAND_5G;
1042 prConnSettings->eAdHocMode = (ENUM_PARAM_AD_HOC_MODE_T) (prRegInfo->u4AdhocMode);
1045 prConnSettings->eAuthMode = AUTH_MODE_OPEN;
1047 prConnSettings->eEncStatus = ENUM_ENCRYPTION_DISABLED;
1049 prConnSettings->fgIsScanReqIssued = FALSE;
1051 /* MIB attributes */
1052 prConnSettings->u2BeaconPeriod = DOT11_BEACON_PERIOD_DEFAULT;
1054 prConnSettings->u2RTSThreshold = DOT11_RTS_THRESHOLD_DEFAULT;
1056 prConnSettings->u2DesiredNonHTRateSet = RATE_SET_ALL_ABG;
1058 //prConnSettings->u4FreqInKHz; /* Center frequency */
1062 prConnSettings->bmfgApsdEnAc = PM_UAPSD_NONE;
1064 secInit(prAdapter, NETWORK_TYPE_AIS_INDEX);
1067 prConnSettings->fgIsEnableRoaming = FALSE;
1068 #if CFG_SUPPORT_ROAMING
1070 prConnSettings->fgIsEnableRoaming = ((prRegInfo->fgDisRoaming > 0)?(FALSE):(TRUE));
1072 #endif /* CFG_SUPPORT_ROAMING */
1074 prConnSettings->fgIsAdHocQoSEnable = FALSE;
1076 prConnSettings->eDesiredPhyConfig = PHY_CONFIG_802_11ABGN;
1078 /* Set default bandwidth modes */
1079 prConnSettings->uc2G4BandwidthMode = CONFIG_BW_20M;
1080 prConnSettings->uc5GBandwidthMode = CONFIG_BW_20_40M;
1082 prConnSettings->rRsnInfo.ucElemId = 0x30;
1083 prConnSettings->rRsnInfo.u2Version = 0x0001;
1084 prConnSettings->rRsnInfo.u4GroupKeyCipherSuite = 0;
1085 prConnSettings->rRsnInfo.u4PairwiseKeyCipherSuiteCount = 0;
1086 for (i = 0; i < MAX_NUM_SUPPORTED_CIPHER_SUITES; i++)
1087 prConnSettings->rRsnInfo.au4PairwiseKeyCipherSuite[i] = 0;
1088 prConnSettings->rRsnInfo.u4AuthKeyMgtSuiteCount = 0;
1089 for (i = 0; i < MAX_NUM_SUPPORTED_AKM_SUITES; i++)
1090 prConnSettings->rRsnInfo.au4AuthKeyMgtSuite[i] = 0;
1091 prConnSettings->rRsnInfo.u2RsnCap = 0;
1092 prConnSettings->rRsnInfo.fgRsnCapPresent = FALSE;
1095 } /* end of aisFsmInitializeConnectionSettings() */
1098 /*----------------------------------------------------------------------------*/
1100 * @brief the function is used to initialize the value in AIS_FSM_INFO_T for
1107 /*----------------------------------------------------------------------------*/
1110 IN P_ADAPTER_T prAdapter
1113 P_AIS_FSM_INFO_T prAisFsmInfo;
1114 P_BSS_INFO_T prAisBssInfo;
1115 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1117 DEBUGFUNC("aisFsmInit()");
1118 DBGLOG(SW1, INFO, ("->aisFsmInit()\n"));
1120 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1121 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1122 prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1124 //4 <1> Initiate FSM
1125 prAisFsmInfo->ePreviousState = AIS_STATE_IDLE;
1126 prAisFsmInfo->eCurrentState = AIS_STATE_IDLE;
1128 prAisFsmInfo->ucAvailableAuthTypes = 0;
1130 prAisFsmInfo->prTargetBssDesc = (P_BSS_DESC_T)NULL;
1132 prAisFsmInfo->ucSeqNumOfReqMsg = 0;
1133 prAisFsmInfo->ucSeqNumOfChReq = 0;
1134 prAisFsmInfo->ucSeqNumOfScanReq = 0;
1136 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1137 #if CFG_SUPPORT_ROAMING
1138 prAisFsmInfo->fgIsRoamingScanPending = FALSE;
1139 #endif /* CFG_SUPPORT_ROAMING */
1140 prAisFsmInfo->fgIsChannelRequested = FALSE;
1141 prAisFsmInfo->fgIsChannelGranted = FALSE;
1143 //4 <1.1> Initiate FSM - Timer INIT
1144 cnmTimerInitTimer(prAdapter,
1145 &prAisFsmInfo->rBGScanTimer,
1146 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventBGSleepTimeOut,
1149 cnmTimerInitTimer(prAdapter,
1150 &prAisFsmInfo->rIbssAloneTimer,
1151 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventIbssAloneTimeOut,
1154 cnmTimerInitTimer(prAdapter,
1155 &prAisFsmInfo->rIndicationOfDisconnectTimer,
1156 (PFN_MGMT_TIMEOUT_FUNC)aisPostponedEventOfDisconnTimeout,
1159 cnmTimerInitTimer(prAdapter,
1160 &prAisFsmInfo->rJoinTimeoutTimer,
1161 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventJoinTimeout,
1164 cnmTimerInitTimer(prAdapter,
1165 &prAisFsmInfo->rScanDoneTimer,
1166 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventScanDoneTimeOut,
1169 //4 <1.2> Initiate PWR STATE
1170 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1173 //4 <2> Initiate BSS_INFO_T - common part
1174 BSS_INFO_INIT(prAdapter, NETWORK_TYPE_AIS_INDEX);
1175 COPY_MAC_ADDR(prAisBssInfo->aucOwnMacAddr, prAdapter->rWifiVar.aucMacAddress);
1177 //4 <3> Initiate BSS_INFO_T - private part
1179 prAisBssInfo->eBand = BAND_2G4;
1180 prAisBssInfo->ucPrimaryChannel = 1;
1181 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
1183 //4 <4> Allocate MSDU_INFO_T for Beacon
1184 prAisBssInfo->prBeacon = cnmMgtPktAlloc(prAdapter,
1185 OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem[0]) + MAX_IE_LENGTH);
1187 if (prAisBssInfo->prBeacon) {
1188 prAisBssInfo->prBeacon->eSrc = TX_PACKET_MGMT;
1189 prAisBssInfo->prBeacon->ucStaRecIndex = 0xFF; /* NULL STA_REC */
1196 prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = PM_UAPSD_ALL;
1197 prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC = PM_UAPSD_ALL;
1198 prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = WMM_MAX_SP_LENGTH_2;
1200 if (prAdapter->u4UapsdAcBmp == 0) {
1201 prAdapter->u4UapsdAcBmp = CFG_INIT_UAPSD_AC_BMP;
1202 //ASSERT(prAdapter->u4UapsdAcBmp);
1204 prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = (UINT_8)prAdapter->u4UapsdAcBmp;
1205 prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC =(UINT_8) prAdapter->u4UapsdAcBmp;
1206 prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = (UINT_8)prAdapter->u4MaxSpLen;
1209 /* request list initialization */
1210 LINK_INITIALIZE(&prAisFsmInfo->rPendingReqList);
1212 //DBGPRINTF("[2] ucBmpDeliveryAC:0x%x, ucBmpTriggerAC:0x%x, ucUapsdSp:0x%x",
1213 //prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC,
1214 //prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC,
1215 //prAisBssInfo->rPmProfSetupInfo.ucUapsdSp);
1218 } /* end of aisFsmInit() */
1220 /*----------------------------------------------------------------------------*/
1222 * @brief the function is used to uninitialize the value in AIS_FSM_INFO_T for
1229 /*----------------------------------------------------------------------------*/
1232 IN P_ADAPTER_T prAdapter
1235 P_AIS_FSM_INFO_T prAisFsmInfo;
1236 P_BSS_INFO_T prAisBssInfo;
1237 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1239 DEBUGFUNC("aisFsmUninit()");
1240 DBGLOG(SW1, INFO, ("->aisFsmUninit()\n"));
1242 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1243 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1244 prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1246 //4 <1> Stop all timers
1247 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
1248 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
1249 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
1250 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1251 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rScanDoneTimer); //Add by Enlai
1253 //4 <2> flush pending request
1254 aisFsmFlushRequest(prAdapter);
1256 //4 <3> Reset driver-domain BSS-INFO
1257 if(prAisBssInfo->prBeacon) {
1258 cnmMgtPktFree(prAdapter, prAisBssInfo->prBeacon);
1259 prAisBssInfo->prBeacon = NULL;
1262 #if CFG_SUPPORT_802_11W
1263 rsnStopSaQuery(prAdapter);
1267 } /* end of aisFsmUninit() */
1270 /*----------------------------------------------------------------------------*/
1272 * @brief Initialization of JOIN STATE
1274 * @param[in] prBssDesc The pointer of BSS_DESC_T which is the BSS we will try to join with.
1278 /*----------------------------------------------------------------------------*/
1280 aisFsmStateInit_JOIN (
1281 IN P_ADAPTER_T prAdapter,
1282 P_BSS_DESC_T prBssDesc
1285 P_AIS_FSM_INFO_T prAisFsmInfo;
1286 P_BSS_INFO_T prAisBssInfo;
1287 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1288 P_CONNECTION_SETTINGS_T prConnSettings;
1289 P_STA_RECORD_T prStaRec;
1290 P_MSG_JOIN_REQ_T prJoinReqMsg;
1292 DEBUGFUNC("aisFsmStateInit_JOIN()");
1294 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1295 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1296 prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1297 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1301 //4 <1> We are going to connect to this BSS.
1302 prBssDesc->fgIsConnecting = TRUE;
1305 //4 <2> Setup corresponding STA_RECORD_T
1306 prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1308 NETWORK_TYPE_AIS_INDEX,
1311 prAisFsmInfo->prTargetStaRec = prStaRec;
1313 //4 <2.1> sync. to firmware domain
1314 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1316 //4 <3> Update ucAvailableAuthTypes which we can choice during SAA
1317 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1319 prStaRec->fgIsReAssoc = FALSE;
1321 switch (prConnSettings->eAuthMode) {
1322 case AUTH_MODE_OPEN: /* Note: Omit break here. */
1324 case AUTH_MODE_WPA_PSK:
1325 case AUTH_MODE_WPA2:
1326 case AUTH_MODE_WPA2_PSK:
1327 prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_OPEN_SYSTEM;
1331 case AUTH_MODE_SHARED:
1332 prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_SHARED_KEY;
1336 case AUTH_MODE_AUTO_SWITCH:
1337 DBGLOG(AIS, LOUD, ("JOIN INIT: eAuthMode == AUTH_MODE_AUTO_SWITCH\n"));
1338 prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)(AUTH_TYPE_OPEN_SYSTEM |
1339 AUTH_TYPE_SHARED_KEY);
1343 ASSERT(!(prConnSettings->eAuthMode == AUTH_MODE_WPA_NONE));
1344 DBGLOG(AIS, ERROR, ("JOIN INIT: Auth Algorithm : %d was not supported by JOIN\n",
1345 prConnSettings->eAuthMode));
1346 /* TODO(Kevin): error handling ? */
1350 /* TODO(tyhsu): Assume that Roaming Auth Type is equal to ConnSettings eAuthMode */
1351 prAisSpecificBssInfo->ucRoamingAuthTypes = prAisFsmInfo->ucAvailableAuthTypes;
1353 prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT;
1357 ASSERT(prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE);
1358 ASSERT(!prBssDesc->fgIsConnected);
1360 DBGLOG(AIS, LOUD, ("JOIN INIT: AUTH TYPE = %d for Roaming\n",
1361 prAisSpecificBssInfo->ucRoamingAuthTypes));
1364 prStaRec->fgIsReAssoc = TRUE; /* We do roaming while the medium is connected */
1366 /* TODO(Kevin): We may call a sub function to acquire the Roaming Auth Type */
1367 prAisFsmInfo->ucAvailableAuthTypes = prAisSpecificBssInfo->ucRoamingAuthTypes;
1369 prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT_FOR_ROAMING;
1373 //4 <4> Use an appropriate Authentication Algorithm Number among the ucAvailableAuthTypes
1374 if (prAisFsmInfo->ucAvailableAuthTypes &
1375 (UINT_8)AUTH_TYPE_OPEN_SYSTEM) {
1377 DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == OPEN_SYSTEM.\n"));
1378 prAisFsmInfo->ucAvailableAuthTypes &=
1379 ~(UINT_8)AUTH_TYPE_OPEN_SYSTEM;
1381 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_OPEN_SYSTEM;
1383 else if (prAisFsmInfo->ucAvailableAuthTypes &
1384 (UINT_8)AUTH_TYPE_SHARED_KEY) {
1386 DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == SHARED_KEY.\n"));
1388 prAisFsmInfo->ucAvailableAuthTypes &=
1389 ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1391 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1393 else if (prAisFsmInfo->ucAvailableAuthTypes &
1394 (UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION) {
1396 DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == FAST_BSS_TRANSITION.\n"));
1398 prAisFsmInfo->ucAvailableAuthTypes &=
1399 ~(UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION;
1401 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_FAST_BSS_TRANSITION;
1407 //4 <5> Overwrite Connection Setting for eConnectionPolicy == ANY (Used by Assoc Req)
1408 if (prConnSettings->eConnectionPolicy == CONNECT_BY_SSID_ANY) {
1410 if (prBssDesc->ucSSIDLen) {
1411 COPY_SSID(prConnSettings->aucSSID,
1412 prConnSettings->ucSSIDLen,
1414 prBssDesc->ucSSIDLen);
1418 //4 <6> Send a Msg to trigger SAA to start JOIN process.
1419 prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
1420 if (!prJoinReqMsg) {
1422 ASSERT(0); // Can't trigger SAA FSM
1426 prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1427 prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1428 prJoinReqMsg->prStaRec = prStaRec;
1432 P_FRAG_INFO_T prFragInfo;
1433 for (j = 0; j < MAX_NUM_CONCURRENT_FRAGMENTED_MSDUS; j++) {
1434 prFragInfo = &prStaRec->rFragInfo[j];
1436 if (prFragInfo->pr1stFrag) {
1437 //nicRxReturnRFB(prAdapter, prFragInfo->pr1stFrag);
1438 prFragInfo->pr1stFrag = (P_SW_RFB_T)NULL;
1443 mboxSendMsg(prAdapter,
1445 (P_MSG_HDR_T) prJoinReqMsg,
1446 MSG_SEND_METHOD_BUF);
1449 } /* end of aisFsmInit_JOIN() */
1452 /*----------------------------------------------------------------------------*/
1454 * @brief Retry JOIN for AUTH_MODE_AUTO_SWITCH
1456 * @param[in] prStaRec Pointer to the STA_RECORD_T
1458 * @retval TRUE We will retry JOIN
1459 * @retval FALSE We will not retry JOIN
1461 /*----------------------------------------------------------------------------*/
1463 aisFsmStateInit_RetryJOIN (
1464 IN P_ADAPTER_T prAdapter,
1465 P_STA_RECORD_T prStaRec
1468 P_AIS_FSM_INFO_T prAisFsmInfo;
1469 P_MSG_JOIN_REQ_T prJoinReqMsg;
1471 DEBUGFUNC("aisFsmStateInit_RetryJOIN()");
1473 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1475 /* Retry other AuthType if possible */
1476 if (!prAisFsmInfo->ucAvailableAuthTypes) {
1480 if (prAisFsmInfo->ucAvailableAuthTypes &
1481 (UINT_8)AUTH_TYPE_SHARED_KEY) {
1483 DBGLOG(AIS, INFO, ("RETRY JOIN INIT: Retry Authentication with AuthType == SHARED_KEY.\n"));
1485 prAisFsmInfo->ucAvailableAuthTypes &=
1486 ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1488 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1491 DBGLOG(AIS, ERROR, ("RETRY JOIN INIT: Retry Authentication with Unexpected AuthType.\n"));
1495 prAisFsmInfo->ucAvailableAuthTypes = 0; /* No more available Auth Types */
1497 /* Trigger SAA to start JOIN process. */
1498 prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
1499 if (!prJoinReqMsg) {
1501 ASSERT(0); // Can't trigger SAA FSM
1505 prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1506 prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1507 prJoinReqMsg->prStaRec = prStaRec;
1509 mboxSendMsg(prAdapter,
1511 (P_MSG_HDR_T) prJoinReqMsg,
1512 MSG_SEND_METHOD_BUF);
1516 }/* end of aisFsmRetryJOIN() */
1519 #if CFG_SUPPORT_ADHOC
1520 /*----------------------------------------------------------------------------*/
1522 * @brief State Initialization of AIS_STATE_IBSS_ALONE
1528 /*----------------------------------------------------------------------------*/
1530 aisFsmStateInit_IBSS_ALONE (
1531 IN P_ADAPTER_T prAdapter
1534 P_AIS_FSM_INFO_T prAisFsmInfo;
1535 P_CONNECTION_SETTINGS_T prConnSettings;
1536 P_BSS_INFO_T prAisBssInfo;
1538 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1539 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1540 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1542 //4 <1> Check if IBSS was created before ?
1543 if (prAisBssInfo->fgIsBeaconActivated) {
1545 //4 <2> Start IBSS Alone Timer for periodic SCAN and then SEARCH
1546 #if !CFG_SLT_SUPPORT
1547 cnmTimerStartTimer(prAdapter,
1548 &prAisFsmInfo->rIbssAloneTimer,
1549 SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
1553 aisFsmCreateIBSS(prAdapter);
1556 } /* end of aisFsmStateInit_IBSS_ALONE() */
1559 /*----------------------------------------------------------------------------*/
1561 * @brief State Initialization of AIS_STATE_IBSS_MERGE
1563 * @param[in] prBssDesc The pointer of BSS_DESC_T which is the IBSS we will try to merge with.
1567 /*----------------------------------------------------------------------------*/
1569 aisFsmStateInit_IBSS_MERGE (
1570 IN P_ADAPTER_T prAdapter,
1571 P_BSS_DESC_T prBssDesc
1574 P_AIS_FSM_INFO_T prAisFsmInfo;
1575 P_CONNECTION_SETTINGS_T prConnSettings;
1576 P_BSS_INFO_T prAisBssInfo;
1577 P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
1582 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1583 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1584 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1586 //4 <1> We will merge with to this BSS immediately.
1587 prBssDesc->fgIsConnecting = FALSE;
1588 prBssDesc->fgIsConnected = TRUE;
1590 //4 <2> Setup corresponding STA_RECORD_T
1591 prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1592 STA_TYPE_ADHOC_PEER,
1593 NETWORK_TYPE_AIS_INDEX,
1596 prStaRec->fgIsMerging = TRUE;
1598 prAisFsmInfo->prTargetStaRec = prStaRec;
1600 //4 <2.1> sync. to firmware domain
1601 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1604 aisFsmMergeIBSS(prAdapter, prStaRec);
1607 } /* end of aisFsmStateInit_IBSS_MERGE() */
1609 #endif /* CFG_SUPPORT_ADHOC */
1612 /*----------------------------------------------------------------------------*/
1614 * @brief Process of JOIN Abort
1620 /*----------------------------------------------------------------------------*/
1622 aisFsmStateAbort_JOIN (
1623 IN P_ADAPTER_T prAdapter
1626 P_AIS_FSM_INFO_T prAisFsmInfo;
1627 P_MSG_JOIN_ABORT_T prJoinAbortMsg;
1629 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1631 /* 1. Abort JOIN process */
1632 prJoinAbortMsg = (P_MSG_JOIN_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_ABORT_T));
1633 if (!prJoinAbortMsg) {
1635 ASSERT(0); // Can't abort SAA FSM
1639 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
1640 WLAN_STATUS_CONNECT_INDICATION,
1644 prJoinAbortMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_ABORT;
1645 prJoinAbortMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfReqMsg;
1646 prJoinAbortMsg->prStaRec = prAisFsmInfo->prTargetStaRec;
1648 scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisFsmInfo->prTargetStaRec->aucMacAddr);
1650 mboxSendMsg(prAdapter,
1652 (P_MSG_HDR_T) prJoinAbortMsg,
1653 MSG_SEND_METHOD_BUF);
1655 /* 2. Return channel privilege */
1656 aisFsmReleaseCh(prAdapter);
1658 /* 3.1 stop join timeout timer */
1659 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1661 /* 3.2 reset local variable */
1662 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1663 prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
1666 } /* end of aisFsmAbortJOIN() */
1669 /*----------------------------------------------------------------------------*/
1671 * @brief Process of SCAN Abort
1677 /*----------------------------------------------------------------------------*/
1679 aisFsmStateAbort_SCAN (
1680 IN P_ADAPTER_T prAdapter
1683 P_AIS_FSM_INFO_T prAisFsmInfo;
1684 P_MSG_SCN_SCAN_CANCEL prScanCancelMsg;
1686 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1688 /* Abort JOIN process. */
1689 prScanCancelMsg = (P_MSG_SCN_SCAN_CANCEL)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_CANCEL));
1690 if (!prScanCancelMsg) {
1692 ASSERT(0); // Can't abort SCN FSM
1696 prScanCancelMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_CANCEL;
1697 prScanCancelMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfScanReq;
1698 prScanCancelMsg->ucNetTypeIndex = (UINT_8)NETWORK_TYPE_AIS_INDEX;
1699 #if CFG_ENABLE_WIFI_DIRECT
1700 if(prAdapter->fgIsP2PRegistered) {
1701 prScanCancelMsg->fgIsChannelExt = FALSE;
1705 /* unbuffered message to guarantee scan is cancelled in sequence */
1706 mboxSendMsg(prAdapter,
1708 (P_MSG_HDR_T) prScanCancelMsg,
1709 MSG_SEND_METHOD_UNBUF);
1712 } /* end of aisFsmAbortSCAN() */
1715 /*----------------------------------------------------------------------------*/
1717 * @brief Process of NORMAL_TR Abort
1723 /*----------------------------------------------------------------------------*/
1725 aisFsmStateAbort_NORMAL_TR (
1726 IN P_ADAPTER_T prAdapter
1729 P_AIS_FSM_INFO_T prAisFsmInfo;
1732 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1734 /* TODO(Kevin): Do abort other MGMT func */
1736 /* 1. Release channel to CNM */
1737 aisFsmReleaseCh(prAdapter);
1739 /* 2.1 stop join timeout timer */
1740 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1742 /* 2.2 reset local variable */
1743 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1746 } /* end of aisFsmAbortNORMAL_TR() */
1749 #if CFG_SUPPORT_ADHOC
1750 /*----------------------------------------------------------------------------*/
1752 * @brief Process of NORMAL_TR Abort
1758 /*----------------------------------------------------------------------------*/
1760 aisFsmStateAbort_IBSS (
1761 IN P_ADAPTER_T prAdapter
1764 P_AIS_FSM_INFO_T prAisFsmInfo;
1765 P_BSS_DESC_T prBssDesc;
1767 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1770 if (prAisFsmInfo->prTargetStaRec) {
1771 prBssDesc = scanSearchBssDescByTA(prAdapter,
1772 prAisFsmInfo->prTargetStaRec->aucMacAddr);
1775 prBssDesc->fgIsConnected = FALSE;
1776 prBssDesc->fgIsConnecting = FALSE;
1780 // release channel privilege
1781 aisFsmReleaseCh(prAdapter);
1785 #endif /* CFG_SUPPORT_ADHOC */
1788 /*----------------------------------------------------------------------------*/
1790 * @brief The Core FSM engine of AIS(Ad-hoc, Infra STA)
1792 * @param[in] eNextState Enum value of next AIS STATE
1796 /*----------------------------------------------------------------------------*/
1799 IN P_ADAPTER_T prAdapter,
1800 ENUM_AIS_STATE_T eNextState
1803 P_AIS_FSM_INFO_T prAisFsmInfo;
1804 P_BSS_INFO_T prAisBssInfo;
1805 P_CONNECTION_SETTINGS_T prConnSettings;
1806 P_BSS_DESC_T prBssDesc;
1807 P_MSG_CH_REQ_T prMsgChReq;
1808 P_MSG_SCN_SCAN_REQ prScanReqMsg;
1809 P_AIS_REQ_HDR_T prAisReq;
1812 UINT_16 u2ScanIELen;
1814 BOOLEAN fgIsTransition = (BOOLEAN)FALSE;
1816 DEBUGFUNC("aisFsmSteps()");
1818 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1819 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1820 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1824 /* Do entering Next State */
1825 prAisFsmInfo->ePreviousState = prAisFsmInfo->eCurrentState;
1828 DBGLOG(AIS, STATE, ("TRANSITION: [%s] -> [%s]\n",
1829 apucDebugAisState[prAisFsmInfo->eCurrentState],
1830 apucDebugAisState[eNextState]));
1832 DBGLOG(AIS, STATE, ("[%d] TRANSITION: [%d] -> [%d]\n",
1834 prAisFsmInfo->eCurrentState,
1837 /* NOTE(Kevin): This is the only place to change the eCurrentState(except initial) */
1838 prAisFsmInfo->eCurrentState = eNextState;
1840 fgIsTransition = (BOOLEAN)FALSE;
1842 /* Do tasks of the State that we just entered */
1843 switch (prAisFsmInfo->eCurrentState) {
1844 /* NOTE(Kevin): we don't have to rearrange the sequence of following
1845 * switch case. Instead I would like to use a common lookup table of array
1846 * of function pointer to speed up state search.
1848 case AIS_STATE_IDLE:
1850 prAisReq = aisFsmGetNextRequest(prAdapter);
1852 if(prAisReq == NULL || prAisReq->eReqType == AIS_REQUEST_RECONNECT) {
1853 if (prConnSettings->fgIsConnReqIssued == TRUE &&
1854 prConnSettings->fgIsDisconnectedByNonRequest == FALSE) {
1856 prAisFsmInfo->fgTryScan = TRUE;
1858 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1859 SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1861 // sync with firmware
1862 nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1864 // reset trial count
1865 prAisFsmInfo->ucConnTrialCount = 0;
1867 eNextState = AIS_STATE_SEARCH;
1868 fgIsTransition = TRUE;
1871 UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1872 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1874 // sync with firmware
1875 nicDeactivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1877 // check for other pending request
1879 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
1880 wlanClearScanningResult(prAdapter);
1881 eNextState = AIS_STATE_SCAN;
1883 fgIsTransition = TRUE;
1889 /* free the message */
1890 cnmMemFree(prAdapter, prAisReq);
1893 else if(prAisReq->eReqType == AIS_REQUEST_SCAN) {
1894 #if CFG_SUPPORT_ROAMING
1895 prAisFsmInfo->fgIsRoamingScanPending = FALSE;
1896 #endif /* CFG_SUPPORT_ROAMING */
1897 wlanClearScanningResult(prAdapter);
1899 eNextState = AIS_STATE_SCAN;
1900 fgIsTransition = TRUE;
1902 /* free the message */
1903 cnmMemFree(prAdapter, prAisReq);
1905 else if(prAisReq->eReqType == AIS_REQUEST_ROAMING_CONNECT || prAisReq->eReqType == AIS_REQUEST_ROAMING_SEARCH) {
1907 /* free the message */
1908 cnmMemFree(prAdapter, prAisReq);
1911 prAisFsmInfo->u4SleepInterval = AIS_BG_SCAN_INTERVAL_MIN_SEC;
1915 case AIS_STATE_SEARCH:
1916 //4 <1> Search for a matched candidate and save it to prTargetBssDesc.
1918 prBssDesc = prAdapter->rWifiVar.rSltInfo.prPseudoBssDesc;
1920 prBssDesc = scanSearchBssDescByPolicy(prAdapter, NETWORK_TYPE_AIS_INDEX);
1923 // we are under Roaming Condition.
1924 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
1925 if(prAisFsmInfo->ucConnTrialCount > AIS_ROAMING_CONNECTION_TRIAL_LIMIT) {
1926 #if CFG_SUPPORT_ROAMING
1927 roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_CONNLIMIT);
1928 #endif /* CFG_SUPPORT_ROAMING */
1929 // reset retry count
1930 prAisFsmInfo->ucConnTrialCount = 0;
1932 // abort connection trial
1933 prConnSettings->fgIsConnReqIssued = FALSE;
1935 eNextState = AIS_STATE_NORMAL_TR;
1936 fgIsTransition = TRUE;
1942 //4 <2> We are not under Roaming Condition.
1943 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1945 //4 <2.a> If we have the matched one
1948 //4 <A> Stored the Selected BSS security cipher. For later asoc req compose IE
1949 prAisBssInfo->u4RsnSelectedGroupCipher =
1950 prBssDesc->u4RsnSelectedGroupCipher;
1951 prAisBssInfo->u4RsnSelectedPairwiseCipher =
1952 prBssDesc->u4RsnSelectedPairwiseCipher;
1953 prAisBssInfo->u4RsnSelectedAKMSuite =
1954 prBssDesc->u4RsnSelectedAKMSuite;
1956 //4 <B> Do STATE transition and update current Operation Mode.
1957 if (prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE) {
1959 prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
1961 /* Record the target BSS_DESC_T for next STATE. */
1962 prAisFsmInfo->prTargetBssDesc = prBssDesc;
1964 /* Transit to channel acquire */
1965 eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
1966 fgIsTransition = TRUE;
1968 // increase connection trial count
1969 prAisFsmInfo->ucConnTrialCount++;
1971 #if CFG_SUPPORT_ADHOC
1972 else if (prBssDesc->eBSSType == BSS_TYPE_IBSS) {
1974 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
1976 /* Record the target BSS_DESC_T for next STATE. */
1977 prAisFsmInfo->prTargetBssDesc = prBssDesc;
1979 eNextState = AIS_STATE_IBSS_MERGE;
1980 fgIsTransition = TRUE;
1982 #endif /* CFG_SUPPORT_ADHOC */
1985 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
1986 fgIsTransition = TRUE;
1989 //4 <2.b> If we don't have the matched one
1992 // increase connection trial count for infrastructure connection
1993 if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
1994 prAisFsmInfo->ucConnTrialCount++;
1998 if (prAisFsmInfo->fgTryScan) {
1999 eNextState = AIS_STATE_LOOKING_FOR;
2001 fgIsTransition = TRUE;
2003 //4 <B> We've do SCAN already, now wait in some STATE.
2005 if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
2007 /* issue reconnect request, and retreat to idle state for scheduling */
2008 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2010 eNextState = AIS_STATE_IDLE;
2011 fgIsTransition = TRUE;
2013 #if CFG_SUPPORT_ADHOC
2014 else if ((prConnSettings->eOPMode == NET_TYPE_IBSS)
2015 || (prConnSettings->eOPMode == NET_TYPE_AUTO_SWITCH)
2016 || (prConnSettings->eOPMode == NET_TYPE_DEDICATED_IBSS)) {
2018 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
2019 prAisFsmInfo->prTargetBssDesc = NULL;
2021 eNextState = AIS_STATE_IBSS_ALONE;
2022 fgIsTransition = TRUE;
2024 #endif /* CFG_SUPPORT_ADHOC */
2027 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
2028 fgIsTransition = TRUE;
2033 //4 <3> We are under Roaming Condition.
2034 else { // prAdapter->eConnectionState == MEDIA_STATE_CONNECTED.
2036 //4 <3.a> This BSS_DESC_T is our AP.
2037 /* NOTE(Kevin 2008/05/16): Following cases will go back to NORMAL_TR.
2038 * CASE I: During Roaming, APP(WZC/NDISTEST) change the connection
2039 * settings. That make we can NOT match the original AP, so the
2040 * prBssDesc is NULL.
2041 * CASE II: The same reason as CASE I. Because APP change the
2042 * eOPMode to other network type in connection setting
2043 * (e.g. NET_TYPE_IBSS), so the BssDesc become the IBSS node.
2044 * (For CASE I/II, before WZC/NDISTEST set the OID_SSID, it will change
2045 * other parameters in connection setting first. So if we do roaming
2046 * at the same time, it will hit these cases.)
2048 * CASE III: Normal case, we can't find other candidate to roam
2049 * out, so only the current AP will be matched.
2051 * CASE VI: Timestamp of the current AP might be reset
2053 if ((!prBssDesc) || /* CASE I */
2054 (prBssDesc->eBSSType != BSS_TYPE_INFRASTRUCTURE) || /* CASE II */
2055 (prBssDesc->fgIsConnected) || /* CASE III */
2056 (EQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID)) /* CASE VI */) {
2059 (prBssDesc->fgIsConnected)) {
2060 ASSERT(EQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2063 /* We already associated with it, go back to NORMAL_TR */
2064 /* TODO(Kevin): Roaming Fail */
2065 #if CFG_SUPPORT_ROAMING
2066 roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_NOCANDIDATE);
2067 #endif /* CFG_SUPPORT_ROAMING */
2069 /* Retreat to NORMAL_TR state */
2070 eNextState = AIS_STATE_NORMAL_TR;
2071 fgIsTransition = TRUE;
2073 //4 <3.b> Try to roam out for JOIN this BSS_DESC_T.
2076 ASSERT(UNEQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2079 //4 <A> Record the target BSS_DESC_T for next STATE.
2080 prAisFsmInfo->prTargetBssDesc = prBssDesc;
2082 // tyhsu: increase connection trial count
2083 prAisFsmInfo->ucConnTrialCount++;
2085 /* Transit to channel acquire */
2086 eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
2087 fgIsTransition = TRUE;
2093 case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2095 DBGLOG(AIS, LOUD, ("SCAN: Idle Begin - Current Time = %ld\n", kalGetTimeTick()));
2097 cnmTimerStartTimer(prAdapter,
2098 &prAisFsmInfo->rBGScanTimer,
2099 SEC_TO_MSEC(prAisFsmInfo->u4SleepInterval));
2101 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2103 if (prAisFsmInfo->u4SleepInterval < AIS_BG_SCAN_INTERVAL_MAX_SEC) {
2104 prAisFsmInfo->u4SleepInterval <<= 1;
2108 case AIS_STATE_SCAN:
2109 case AIS_STATE_ONLINE_SCAN:
2110 case AIS_STATE_LOOKING_FOR:
2112 if(!IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX)) {
2113 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2115 // sync with firmware
2116 nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
2119 /* IE length decision */
2120 if(prAisFsmInfo->u4ScanIELength > 0) {
2121 u2ScanIELen = (UINT_16)prAisFsmInfo->u4ScanIELength;
2124 #if CFG_SUPPORT_WPS2
2125 u2ScanIELen = prAdapter->prGlueInfo->u2WSCIELen;
2131 prScanReqMsg = (P_MSG_SCN_SCAN_REQ)cnmMemAlloc(prAdapter,
2133 OFFSET_OF(MSG_SCN_SCAN_REQ, aucIE) + u2ScanIELen);
2134 if (!prScanReqMsg) {
2135 ASSERT(0); // Can't trigger SCAN FSM
2139 prScanReqMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_REQ;
2140 prScanReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfScanReq;
2141 prScanReqMsg->ucNetTypeIndex = (UINT_8)NETWORK_TYPE_AIS_INDEX;
2143 #if CFG_SUPPORT_RDD_TEST_MODE
2144 prScanReqMsg->eScanType = SCAN_TYPE_PASSIVE_SCAN;
2146 prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN;
2149 if(prAisFsmInfo->eCurrentState == AIS_STATE_SCAN
2150 || prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
2151 if(prAisFsmInfo->ucScanSSIDLen == 0) {
2152 /* Scan for all available SSID */
2153 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_WILDCARD;
2156 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
2157 COPY_SSID(prScanReqMsg->aucSSID,
2158 prScanReqMsg->ucSSIDLength,
2159 prAisFsmInfo->aucScanSSID,
2160 prAisFsmInfo->ucScanSSIDLen);
2164 /* Scan for determined SSID */
2165 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
2166 COPY_SSID(prScanReqMsg->aucSSID,
2167 prScanReqMsg->ucSSIDLength,
2168 prConnSettings->aucSSID,
2169 prConnSettings->ucSSIDLen);
2172 /* check if tethering is running and need to fix on specific channel */
2173 if(cnmAisInfraChannelFixed(prAdapter, &eBand, &ucChannel) == TRUE) {
2174 prScanReqMsg->eScanChannel = SCAN_CHANNEL_SPECIFIED;
2175 prScanReqMsg->ucChannelListNum = 1;
2176 prScanReqMsg->arChnlInfoList[0].eBand
2178 prScanReqMsg->arChnlInfoList[0].ucChannelNum
2181 else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_NULL) {
2182 if(prAdapter->fgEnable5GBand == TRUE) {
2183 prScanReqMsg->eScanChannel = SCAN_CHANNEL_FULL;
2186 prScanReqMsg->eScanChannel = SCAN_CHANNEL_2G4;
2189 else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_2G4) {
2190 prScanReqMsg->eScanChannel = SCAN_CHANNEL_2G4;
2192 else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_5G) {
2193 prScanReqMsg->eScanChannel = SCAN_CHANNEL_5G;
2196 prScanReqMsg->eScanChannel = SCAN_CHANNEL_FULL;
2200 if(prAisFsmInfo->u4ScanIELength > 0) {
2201 kalMemCopy(prScanReqMsg->aucIE, prAisFsmInfo->aucScanIEBuf, prAisFsmInfo->u4ScanIELength);
2204 #if CFG_SUPPORT_WPS2
2205 if(prAdapter->prGlueInfo->u2WSCIELen > 0) {
2206 kalMemCopy(prScanReqMsg->aucIE, &prAdapter->prGlueInfo->aucWSCIE, prAdapter->prGlueInfo->u2WSCIELen);
2211 prScanReqMsg->u2IELen = u2ScanIELen;
2213 mboxSendMsg(prAdapter,
2215 (P_MSG_HDR_T) prScanReqMsg,
2216 MSG_SEND_METHOD_BUF);
2218 prAisFsmInfo->fgTryScan = FALSE; /* Will enable background sleep for infrastructure */
2222 case AIS_STATE_REQ_CHANNEL_JOIN:
2223 /* send message to CNM for acquiring channel */
2224 prMsgChReq = (P_MSG_CH_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_REQ_T));
2226 ASSERT(0); // Can't indicate CNM for channel acquiring
2230 prMsgChReq->rMsgHdr.eMsgId = MID_MNY_CNM_CH_REQ;
2231 prMsgChReq->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
2232 prMsgChReq->ucTokenID = ++prAisFsmInfo->ucSeqNumOfChReq;
2233 prMsgChReq->eReqType = CH_REQ_TYPE_JOIN;
2234 prMsgChReq->u4MaxInterval = AIS_JOIN_CH_REQUEST_INTERVAL;
2235 prMsgChReq->ucPrimaryChannel = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
2236 prMsgChReq->eRfSco = prAisFsmInfo->prTargetBssDesc->eSco;
2237 prMsgChReq->eRfBand = prAisFsmInfo->prTargetBssDesc->eBand;
2238 COPY_MAC_ADDR(prMsgChReq->aucBSSID, prAisFsmInfo->prTargetBssDesc->aucBSSID);
2240 mboxSendMsg(prAdapter,
2242 (P_MSG_HDR_T) prMsgChReq,
2243 MSG_SEND_METHOD_BUF);
2245 prAisFsmInfo->fgIsChannelRequested = TRUE;
2248 case AIS_STATE_JOIN:
2249 aisFsmStateInit_JOIN(prAdapter, prAisFsmInfo->prTargetBssDesc);
2252 #if CFG_SUPPORT_ADHOC
2253 case AIS_STATE_IBSS_ALONE:
2254 aisFsmStateInit_IBSS_ALONE(prAdapter);
2257 case AIS_STATE_IBSS_MERGE:
2258 aisFsmStateInit_IBSS_MERGE(prAdapter, prAisFsmInfo->prTargetBssDesc);
2260 #endif /* CFG_SUPPORT_ADHOC */
2262 case AIS_STATE_NORMAL_TR:
2263 if(prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
2264 /* Don't do anything when rJoinTimeoutTimer is still ticking */
2267 /* 1. Process for pending scan */
2268 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
2269 wlanClearScanningResult(prAdapter);
2270 eNextState = AIS_STATE_ONLINE_SCAN;
2271 fgIsTransition = TRUE;
2273 /* 2. Process for pending roaming scan */
2274 else if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE) == TRUE) {
2275 eNextState = AIS_STATE_LOOKING_FOR;
2276 fgIsTransition = TRUE;
2278 /* 3. Process for pending roaming scan */
2279 else if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE) == TRUE) {
2280 eNextState = AIS_STATE_SEARCH;
2281 fgIsTransition = TRUE;
2287 case AIS_STATE_DISCONNECTING:
2288 /* send for deauth frame for disconnection */
2289 authSendDeauthFrame(prAdapter,
2290 prAisBssInfo->prStaRecOfAP,
2292 REASON_CODE_DEAUTH_LEAVING_BSS,
2293 aisDeauthXmitComplete);
2297 ASSERT(0); /* Make sure we have handle all STATEs */
2302 while (fgIsTransition);
2306 } /* end of aisFsmSteps() */
2309 /*----------------------------------------------------------------------------*/
2317 /*----------------------------------------------------------------------------*/
2319 aisFsmRunEventScanDone (
2320 IN P_ADAPTER_T prAdapter,
2321 IN P_MSG_HDR_T prMsgHdr
2324 P_MSG_SCN_SCAN_DONE prScanDoneMsg;
2325 P_AIS_FSM_INFO_T prAisFsmInfo;
2326 ENUM_AIS_STATE_T eNextState;
2327 UINT_8 ucSeqNumOfCompMsg;
2328 P_CONNECTION_SETTINGS_T prConnSettings;
2330 DEBUGFUNC("aisFsmRunEventScanDone()");
2335 DBGLOG(AIS, LOUD, ("EVENT-SCAN DONE: Current Time = %ld\n", kalGetTimeTick()));
2337 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2338 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2340 prScanDoneMsg = (P_MSG_SCN_SCAN_DONE)prMsgHdr;
2341 ASSERT(prScanDoneMsg->ucNetTypeIndex == (UINT_8)NETWORK_TYPE_AIS_INDEX);
2343 ucSeqNumOfCompMsg = prScanDoneMsg->ucSeqNum;
2344 cnmMemFree(prAdapter, prMsgHdr);
2346 eNextState = prAisFsmInfo->eCurrentState;
2348 if (ucSeqNumOfCompMsg != prAisFsmInfo->ucSeqNumOfScanReq) {
2349 DBGLOG(AIS, WARN, ("SEQ NO of AIS SCN DONE MSG is not matched.\n"));
2352 switch (prAisFsmInfo->eCurrentState) {
2353 case AIS_STATE_SCAN:
2354 prConnSettings->fgIsScanReqIssued = FALSE;
2356 /* reset scan IE buffer */
2357 prAisFsmInfo->u4ScanIELength = 0;
2359 kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2360 eNextState = AIS_STATE_IDLE;
2364 case AIS_STATE_ONLINE_SCAN:
2365 prConnSettings->fgIsScanReqIssued = FALSE;
2367 /* reset scan IE buffer */
2368 prAisFsmInfo->u4ScanIELength = 0;
2370 kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2371 #if CFG_SUPPORT_ROAMING
2372 eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2374 eNextState = AIS_STATE_NORMAL_TR;
2375 #endif /* CFG_SUPPORT_ROAMING */
2379 case AIS_STATE_LOOKING_FOR:
2380 #if CFG_SUPPORT_ROAMING
2381 eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2383 eNextState = AIS_STATE_SEARCH;
2384 #endif /* CFG_SUPPORT_ROAMING */
2393 if (eNextState != prAisFsmInfo->eCurrentState) {
2394 aisFsmSteps(prAdapter, eNextState);
2398 } /* end of aisFsmRunEventScanDone() */
2401 /*----------------------------------------------------------------------------*/
2409 /*----------------------------------------------------------------------------*/
2411 aisFsmRunEventAbort (
2412 IN P_ADAPTER_T prAdapter,
2413 IN P_MSG_HDR_T prMsgHdr
2416 P_MSG_AIS_ABORT_T prAisAbortMsg;
2417 P_AIS_FSM_INFO_T prAisFsmInfo;
2418 UINT_8 ucReasonOfDisconnect;
2419 BOOLEAN fgDelayIndication;
2420 P_CONNECTION_SETTINGS_T prConnSettings;
2422 DEBUGFUNC("aisFsmRunEventAbort()");
2426 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2427 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2429 //4 <1> Extract information of Abort Message and then free memory.
2430 prAisAbortMsg = (P_MSG_AIS_ABORT_T)prMsgHdr;
2431 ucReasonOfDisconnect = prAisAbortMsg->ucReasonOfDisconnect;
2432 fgDelayIndication = prAisAbortMsg->fgDelayIndication;
2434 cnmMemFree(prAdapter, prMsgHdr);
2437 DBGLOG(AIS, LOUD, ("EVENT-ABORT: Current State %s\n",
2438 apucDebugAisState[prAisFsmInfo->eCurrentState]));
2440 DBGLOG(AIS, LOUD, ("[%d] EVENT-ABORT: Current State [%d]\n",
2442 prAisFsmInfo->eCurrentState));
2445 //4 <2> clear previous pending connection request and insert new one
2446 if(ucReasonOfDisconnect == DISCONNECT_REASON_CODE_DEAUTHENTICATED
2447 || ucReasonOfDisconnect == DISCONNECT_REASON_CODE_DISASSOCIATED) {
2448 prConnSettings->fgIsDisconnectedByNonRequest = TRUE;
2451 prConnSettings->fgIsDisconnectedByNonRequest = FALSE;
2454 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
2455 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2457 if(prAisFsmInfo->eCurrentState != AIS_STATE_DISCONNECTING) {
2458 //4 <3> invoke abort handler
2459 aisFsmStateAbort(prAdapter, ucReasonOfDisconnect, fgDelayIndication);
2463 } /* end of aisFsmRunEventAbort() */
2466 /*----------------------------------------------------------------------------*/
2468 * \brief This function handles AIS-FSM abort event/command
2470 * \param[in] prAdapter Pointer of ADAPTER_T
2471 * ucReasonOfDisconnect Reason for disonnection
2472 * fgDelayIndication Option to delay disconnection indication
2476 /*----------------------------------------------------------------------------*/
2479 IN P_ADAPTER_T prAdapter,
2480 UINT_8 ucReasonOfDisconnect,
2481 BOOLEAN fgDelayIndication
2484 P_AIS_FSM_INFO_T prAisFsmInfo;
2485 P_BSS_INFO_T prAisBssInfo;
2486 P_CONNECTION_SETTINGS_T prConnSettings;
2487 BOOLEAN fgIsCheckConnected;
2491 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2492 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2493 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2494 fgIsCheckConnected = FALSE;
2496 //4 <1> Save information of Abort Message and then free memory.
2497 prAisBssInfo->ucReasonOfDisconnect = ucReasonOfDisconnect;
2499 //4 <2> Abort current job.
2500 switch (prAisFsmInfo->eCurrentState) {
2501 case AIS_STATE_IDLE:
2502 case AIS_STATE_SEARCH:
2505 case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2506 /* Do cancel timer */
2507 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
2509 /* in case roaming is triggered */
2510 fgIsCheckConnected = TRUE;
2513 case AIS_STATE_SCAN:
2515 aisFsmStateAbort_SCAN(prAdapter);
2517 /* queue for later handling */
2518 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2519 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2524 case AIS_STATE_LOOKING_FOR:
2526 aisFsmStateAbort_SCAN(prAdapter);
2528 /* in case roaming is triggered */
2529 fgIsCheckConnected = TRUE;
2532 case AIS_STATE_REQ_CHANNEL_JOIN:
2533 /* Release channel to CNM */
2534 aisFsmReleaseCh(prAdapter);
2536 /* in case roaming is triggered */
2537 fgIsCheckConnected = TRUE;
2540 case AIS_STATE_JOIN:
2542 aisFsmStateAbort_JOIN(prAdapter);
2544 /* in case roaming is triggered */
2545 fgIsCheckConnected = TRUE;
2548 #if CFG_SUPPORT_ADHOC
2549 case AIS_STATE_IBSS_ALONE:
2550 case AIS_STATE_IBSS_MERGE:
2551 aisFsmStateAbort_IBSS(prAdapter);
2553 #endif /* CFG_SUPPORT_ADHOC */
2555 case AIS_STATE_ONLINE_SCAN:
2557 aisFsmStateAbort_SCAN(prAdapter);
2559 /* queue for later handling */
2560 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2561 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2564 fgIsCheckConnected = TRUE;
2567 case AIS_STATE_NORMAL_TR:
2568 fgIsCheckConnected = TRUE;
2571 case AIS_STATE_DISCONNECTING:
2572 /* Do abort NORMAL_TR */
2573 aisFsmStateAbort_NORMAL_TR(prAdapter);
2581 if (fgIsCheckConnected &&
2582 (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState)) {
2584 /* switch into DISCONNECTING state for sending DEAUTH if necessary */
2585 if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE &&
2586 prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_NEW_CONNECTION &&
2587 prAisBssInfo->prStaRecOfAP &&
2588 prAisBssInfo->prStaRecOfAP->fgIsInUse) {
2589 aisFsmSteps(prAdapter, AIS_STATE_DISCONNECTING);
2594 /* Do abort NORMAL_TR */
2595 aisFsmStateAbort_NORMAL_TR(prAdapter);
2599 aisFsmDisconnect(prAdapter, fgDelayIndication);
2603 } /* end of aisFsmStateAbort() */
2606 /*----------------------------------------------------------------------------*/
2608 * @brief This function will handle the Join Complete Event from SAA FSM for AIS FSM
2610 * @param[in] prMsgHdr Message of Join Complete of SAA FSM.
2614 /*----------------------------------------------------------------------------*/
2616 aisFsmRunEventJoinComplete (
2617 IN P_ADAPTER_T prAdapter,
2618 IN P_MSG_HDR_T prMsgHdr
2621 P_MSG_JOIN_COMP_T prJoinCompMsg;
2622 P_AIS_FSM_INFO_T prAisFsmInfo;
2623 ENUM_AIS_STATE_T eNextState;
2624 P_STA_RECORD_T prStaRec;
2625 P_SW_RFB_T prAssocRspSwRfb;
2627 DEBUGFUNC("aisFsmRunEventJoinComplete()");
2631 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2632 prJoinCompMsg = (P_MSG_JOIN_COMP_T)prMsgHdr;
2633 prStaRec = prJoinCompMsg->prStaRec;
2634 prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
2636 eNextState = prAisFsmInfo->eCurrentState;
2638 // Check State and SEQ NUM
2639 if (prAisFsmInfo->eCurrentState == AIS_STATE_JOIN) {
2640 P_BSS_INFO_T prAisBssInfo;
2642 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2645 if (prJoinCompMsg->ucSeqNum == prAisFsmInfo->ucSeqNumOfReqMsg) {
2648 //4 <1> JOIN was successful
2649 if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
2651 //1. Reset retry count
2652 prAisFsmInfo->ucConnTrialCount = 0;
2654 // Completion of roaming
2655 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2657 #if CFG_SUPPORT_ROAMING
2658 //2. Deactivate previous BSS
2659 aisFsmRoamingDisconnectPrevAP(prAdapter, prStaRec);
2661 //3. Update bss based on roaming staRec
2662 aisUpdateBssInfoForRoamingAP(prAdapter, prStaRec, prAssocRspSwRfb);
2663 #endif /* CFG_SUPPORT_ROAMING */
2666 //4 <1.1> Change FW's Media State immediately.
2667 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2669 //4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have.
2670 if ((prAisBssInfo->prStaRecOfAP) &&
2671 (prAisBssInfo->prStaRecOfAP != prStaRec) &&
2672 (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
2674 cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
2677 //4 <1.3> Update BSS_INFO_T
2678 aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
2680 //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
2681 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2683 //4 <1.5> Update RSSI if necessary
2684 nicUpdateRSSI(prAdapter, NETWORK_TYPE_AIS_INDEX, (INT_8)(RCPI_TO_dBm(prStaRec->ucRCPI)), 0);
2686 //4 <1.6> Indicate Connected Event to Host immediately.
2687 /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
2688 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2691 #if CFG_SUPPORT_ROAMING
2692 roamingFsmRunEventStart(prAdapter);
2693 #endif /* CFG_SUPPORT_ROAMING */
2695 //4 <1.7> Set the Next State of AIS FSM
2696 eNextState = AIS_STATE_NORMAL_TR;
2698 //4 <2> JOIN was not successful
2700 //4 <2.1> Redo JOIN process with other Auth Type if possible
2701 if (aisFsmStateInit_RetryJOIN(prAdapter, prStaRec) == FALSE) {
2702 P_BSS_DESC_T prBssDesc;
2704 /* 1. Increase Failure Count */
2705 prStaRec->ucJoinFailureCount++;
2707 /* 2. release channel */
2708 aisFsmReleaseCh(prAdapter);
2710 /* 3.1 stop join timeout timer */
2711 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
2713 /* 3.2 reset local variable */
2714 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
2716 prBssDesc = scanSearchBssDescByBssid(prAdapter, prStaRec->aucMacAddr);
2719 ASSERT(prBssDesc->fgIsConnecting);
2722 prBssDesc->fgIsConnecting = FALSE;
2725 /* 3.3 Free STA-REC */
2726 if(prStaRec != prAisBssInfo->prStaRecOfAP) {
2727 cnmStaRecFree(prAdapter, prStaRec, FALSE);
2730 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2731 #if CFG_SUPPORT_ROAMING
2732 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
2733 #endif /* CFG_SUPPORT_ROAMING */
2736 // abort connection trial
2737 prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
2739 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
2740 WLAN_STATUS_CONNECT_INDICATION,
2744 eNextState = AIS_STATE_IDLE;
2751 DBGLOG(AIS, WARN, ("SEQ NO of AIS JOIN COMP MSG is not matched.\n"));
2757 if (eNextState != prAisFsmInfo->eCurrentState) {
2758 aisFsmSteps(prAdapter, eNextState);
2761 if (prAssocRspSwRfb) {
2762 nicRxReturnRFB(prAdapter, prAssocRspSwRfb);
2765 cnmMemFree(prAdapter, prMsgHdr);
2768 } /* end of aisFsmRunEventJoinComplete() */
2771 #if CFG_SUPPORT_ADHOC
2772 /*----------------------------------------------------------------------------*/
2774 * @brief This function will handle the Grant Msg of IBSS Create which was sent by
2775 * CNM to indicate that channel was changed for creating IBSS.
2777 * @param[in] prAdapter Pointer of ADAPTER_T
2781 /*----------------------------------------------------------------------------*/
2784 IN P_ADAPTER_T prAdapter
2787 P_AIS_FSM_INFO_T prAisFsmInfo;
2791 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2795 if (prAisFsmInfo->eCurrentState == AIS_STATE_IBSS_ALONE) {
2796 aisUpdateBssInfoForCreateIBSS(prAdapter);
2802 } /* end of aisFsmCreateIBSS() */
2805 /*----------------------------------------------------------------------------*/
2807 * @brief This function will handle the Grant Msg of IBSS Merge which was sent by
2808 * CNM to indicate that channel was changed for merging IBSS.
2810 * @param[in] prAdapter Pointer of ADAPTER_T
2811 * @param[in] prStaRec Pointer of STA_RECORD_T for merge
2815 /*----------------------------------------------------------------------------*/
2818 IN P_ADAPTER_T prAdapter,
2819 IN P_STA_RECORD_T prStaRec
2822 P_AIS_FSM_INFO_T prAisFsmInfo;
2823 ENUM_AIS_STATE_T eNextState;
2824 P_BSS_INFO_T prAisBssInfo;
2829 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2830 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2834 eNextState = prAisFsmInfo->eCurrentState;
2836 switch (prAisFsmInfo->eCurrentState) {
2837 case AIS_STATE_IBSS_MERGE:
2839 P_BSS_DESC_T prBssDesc;
2841 //4 <1.1> Change FW's Media State immediately.
2842 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2844 //4 <1.2> Deactivate previous Peers' STA_RECORD_T in Driver if have.
2845 bssClearClientList(prAdapter, prAisBssInfo);
2847 //4 <1.3> Unmark connection flag of previous BSS_DESC_T.
2848 if ((prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID)) != NULL) {
2849 prBssDesc->fgIsConnecting = FALSE;
2850 prBssDesc->fgIsConnected = FALSE;
2853 //4 <1.4> Update BSS_INFO_T
2854 aisUpdateBssInfoForMergeIBSS(prAdapter, prStaRec);
2856 //4 <1.5> Add Peers' STA_RECORD_T to Client List
2857 bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2859 //4 <1.6> Activate current Peer's STA_RECORD_T in Driver.
2860 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2861 prStaRec->fgIsMerging = FALSE;
2863 //4 <1.7> Enable other features
2865 //4 <1.8> Indicate Connected Event to Host immediately.
2866 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2868 //4 <1.9> Set the Next State of AIS FSM
2869 eNextState = AIS_STATE_NORMAL_TR;
2871 //4 <1.10> Release channel privilege
2872 aisFsmReleaseCh(prAdapter);
2875 prAdapter->rWifiVar.rSltInfo.prPseudoStaRec = prStaRec;
2884 if (eNextState != prAisFsmInfo->eCurrentState) {
2885 aisFsmSteps(prAdapter, eNextState);
2892 } /* end of aisFsmMergeIBSS() */
2895 /*----------------------------------------------------------------------------*/
2897 * @brief This function will handle the Notification of existing IBSS was found
2900 * @param[in] prMsgHdr Message of Notification of an IBSS was present.
2904 /*----------------------------------------------------------------------------*/
2906 aisFsmRunEventFoundIBSSPeer (
2907 IN P_ADAPTER_T prAdapter,
2908 IN P_MSG_HDR_T prMsgHdr
2911 P_MSG_AIS_IBSS_PEER_FOUND_T prAisIbssPeerFoundMsg;
2912 P_AIS_FSM_INFO_T prAisFsmInfo;
2913 ENUM_AIS_STATE_T eNextState;
2914 P_STA_RECORD_T prStaRec;
2915 P_BSS_INFO_T prAisBssInfo;
2916 P_BSS_DESC_T prBssDesc;
2917 BOOLEAN fgIsMergeIn;
2922 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2923 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2925 prAisIbssPeerFoundMsg = (P_MSG_AIS_IBSS_PEER_FOUND_T)prMsgHdr;
2927 ASSERT(prAisIbssPeerFoundMsg->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX);
2929 prStaRec = prAisIbssPeerFoundMsg->prStaRec;
2932 fgIsMergeIn = prAisIbssPeerFoundMsg->fgIsMergeIn;
2934 cnmMemFree(prAdapter, prMsgHdr);
2937 eNextState = prAisFsmInfo->eCurrentState;
2938 switch (prAisFsmInfo->eCurrentState) {
2939 case AIS_STATE_IBSS_ALONE:
2941 //4 <1> An IBSS Peer 'merged in'.
2944 //4 <1.1> Change FW's Media State immediately.
2945 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2947 //4 <1.2> Add Peers' STA_RECORD_T to Client List
2948 bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2951 //4 <1.3> Mark connection flag of BSS_DESC_T.
2952 if ((prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr)) != NULL) {
2953 prBssDesc->fgIsConnecting = FALSE;
2954 prBssDesc->fgIsConnected = TRUE;
2957 ASSERT(0); // Should be able to find a BSS_DESC_T here.
2960 //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
2961 prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
2963 //4 <1.3> Mark connection flag of BSS_DESC_T.
2964 if ((prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID)) != NULL) {
2965 prBssDesc->fgIsConnecting = FALSE;
2966 prBssDesc->fgIsConnected = TRUE;
2969 ASSERT(0); // Should be able to find a BSS_DESC_T here.
2973 //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
2974 prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
2978 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2979 prStaRec->fgIsMerging = FALSE;
2981 //4 <1.6> sync. to firmware
2982 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
2984 //4 <1.7> Indicate Connected Event to Host immediately.
2985 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2987 //4 <1.8> indicate PM for connected
2988 nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
2990 //4 <1.9> Set the Next State of AIS FSM
2991 eNextState = AIS_STATE_NORMAL_TR;
2993 //4 <1.10> Release channel privilege
2994 aisFsmReleaseCh(prAdapter);
2996 //4 <2> We need 'merge out' to this IBSS
2999 //4 <2.1> Get corresponding BSS_DESC_T
3000 prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3002 prAisFsmInfo->prTargetBssDesc = prBssDesc;
3004 //4 <2.2> Set the Next State of AIS FSM
3005 eNextState = AIS_STATE_IBSS_MERGE;
3010 case AIS_STATE_NORMAL_TR:
3013 //4 <3> An IBSS Peer 'merged in'.
3016 //4 <3.1> Add Peers' STA_RECORD_T to Client List
3017 bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
3020 //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
3021 prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
3023 //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
3024 prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
3027 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
3028 prStaRec->fgIsMerging = FALSE;
3031 //4 <4> We need 'merge out' to this IBSS
3034 //4 <4.1> Get corresponding BSS_DESC_T
3035 prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3037 prAisFsmInfo->prTargetBssDesc = prBssDesc;
3039 //4 <4.2> Set the Next State of AIS FSM
3040 eNextState = AIS_STATE_IBSS_MERGE;
3050 if (eNextState != prAisFsmInfo->eCurrentState) {
3051 aisFsmSteps(prAdapter, eNextState);
3055 } /* end of aisFsmRunEventFoundIBSSPeer() */
3056 #endif /* CFG_SUPPORT_ADHOC */
3059 /*----------------------------------------------------------------------------*/
3061 * @brief This function will indicate the Media State to HOST
3063 * @param[in] eConnectionState Current Media State
3064 * @param[in] fgDelayIndication Set TRUE for postponing the Disconnect Indication.
3068 /*----------------------------------------------------------------------------*/
3070 aisIndicationOfMediaStateToHost (
3071 IN P_ADAPTER_T prAdapter,
3072 ENUM_PARAM_MEDIA_STATE_T eConnectionState,
3073 BOOLEAN fgDelayIndication
3076 EVENT_CONNECTION_STATUS rEventConnStatus;
3077 P_CONNECTION_SETTINGS_T prConnSettings;
3078 P_BSS_INFO_T prAisBssInfo;
3079 P_AIS_FSM_INFO_T prAisFsmInfo;
3081 DEBUGFUNC("aisIndicationOfMediaStateToHost()");
3083 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3084 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3085 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3087 // NOTE(Kevin): Move following line to aisChangeMediaState() macro per CM's request.
3088 //prAisBssInfo->eConnectionState = eConnectionState;
3090 /* For indicating the Disconnect Event only if current media state is
3091 * disconnected and we didn't do indication yet.
3093 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
3094 if (prAisBssInfo->eConnectionStateIndicated == eConnectionState) {
3099 if (!fgDelayIndication) {
3100 //4 <0> Cancel Delay Timer
3101 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
3103 //4 <1> Fill EVENT_CONNECTION_STATUS
3104 rEventConnStatus.ucMediaStatus = (UINT_8)eConnectionState;
3106 if (eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
3107 rEventConnStatus.ucReasonOfDisconnect = DISCONNECT_REASON_CODE_RESERVED;
3109 if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) {
3110 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_INFRA;
3111 rEventConnStatus.u2AID = prAisBssInfo->u2AssocId;
3112 rEventConnStatus.u2ATIMWindow = 0;
3114 else if (prAisBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
3115 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_IBSS;
3116 rEventConnStatus.u2AID = 0;
3117 rEventConnStatus.u2ATIMWindow = prAisBssInfo->u2ATIMWindow;
3123 COPY_SSID(rEventConnStatus.aucSsid,
3124 rEventConnStatus.ucSsidLen,
3125 prConnSettings->aucSSID,
3126 prConnSettings->ucSSIDLen);
3128 COPY_MAC_ADDR(rEventConnStatus.aucBssid, prAisBssInfo->aucBSSID);
3130 rEventConnStatus.u2BeaconPeriod = prAisBssInfo->u2BeaconInterval;
3131 rEventConnStatus.u4FreqInKHz = nicChannelNum2Freq(prAisBssInfo->ucPrimaryChannel);
3133 switch (prAisBssInfo->ucNonHTBasicPhyType) {
3134 case PHY_TYPE_HR_DSSS_INDEX:
3135 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3138 case PHY_TYPE_ERP_INDEX:
3139 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM24;
3142 case PHY_TYPE_OFDM_INDEX:
3143 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM5;
3148 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3153 /* Deactivate previous Peers' STA_RECORD_T in Driver if have. */
3154 bssClearClientList(prAdapter, prAisBssInfo);
3156 #if CFG_PRIVACY_MIGRATION
3157 /* Clear the pmkid cache while media disconnect */
3158 secClearPmkid(prAdapter);
3161 rEventConnStatus.ucReasonOfDisconnect = prAisBssInfo->ucReasonOfDisconnect;
3165 nicMediaStateChange(prAdapter, NETWORK_TYPE_AIS_INDEX, &rEventConnStatus);
3166 prAisBssInfo->eConnectionStateIndicated = eConnectionState;
3169 /* NOTE: Only delay the Indication of Disconnect Event */
3170 ASSERT(eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED);
3172 DBGLOG(AIS, INFO, ("Postpone the indication of Disconnect for %d seconds\n",
3173 prConnSettings->ucDelayTimeOfDisconnectEvent));
3175 cnmTimerStartTimer(prAdapter,
3176 &prAisFsmInfo->rIndicationOfDisconnectTimer,
3177 SEC_TO_MSEC(prConnSettings->ucDelayTimeOfDisconnectEvent));
3181 } /* end of aisIndicationOfMediaStateToHost() */
3184 /*----------------------------------------------------------------------------*/
3186 * @brief This function will indicate an Event of "Media Disconnect" to HOST
3188 * @param[in] u4Param Unused timer parameter
3192 /*----------------------------------------------------------------------------*/
3194 aisPostponedEventOfDisconnTimeout (
3195 IN P_ADAPTER_T prAdapter,
3199 P_BSS_INFO_T prAisBssInfo;
3200 P_CONNECTION_SETTINGS_T prConnSettings;
3202 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3203 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3205 //4 <1> Deactivate previous AP's STA_RECORD_T in Driver if have.
3206 if (prAisBssInfo->prStaRecOfAP) {
3207 //cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
3209 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3212 //4 <2> Remove pending connection request
3213 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3214 prConnSettings->fgIsDisconnectedByNonRequest = TRUE;
3216 //4 <3> Indicate Disconnected Event to Host immediately.
3217 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED, FALSE);
3220 } /* end of aisPostponedEventOfDisconnTimeout() */
3223 /*----------------------------------------------------------------------------*/
3225 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3226 * the association was completed.
3228 * @param[in] prStaRec Pointer to the STA_RECORD_T
3229 * @param[in] prAssocRspSwRfb Pointer to SW RFB of ASSOC RESP FRAME.
3233 /*----------------------------------------------------------------------------*/
3235 aisUpdateBssInfoForJOIN (
3236 IN P_ADAPTER_T prAdapter,
3237 P_STA_RECORD_T prStaRec,
3238 P_SW_RFB_T prAssocRspSwRfb
3241 P_AIS_FSM_INFO_T prAisFsmInfo;
3242 P_BSS_INFO_T prAisBssInfo;
3243 P_CONNECTION_SETTINGS_T prConnSettings;
3244 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
3245 P_BSS_DESC_T prBssDesc;
3249 DEBUGFUNC("aisUpdateBssInfoForJOIN()");
3252 ASSERT(prAssocRspSwRfb);
3254 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3255 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3256 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3257 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prAssocRspSwRfb->pvHeader;
3260 DBGLOG(AIS, INFO, ("Update AIS_BSS_INFO_T and apply settings to MAC\n"));
3263 //3 <1> Update BSS_INFO_T from AIS_FSM_INFO_T or User Settings
3264 //4 <1.1> Setup Operation Mode
3265 prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
3267 //4 <1.2> Setup SSID
3268 COPY_SSID(prAisBssInfo->aucSSID,
3269 prAisBssInfo->ucSSIDLen,
3270 prConnSettings->aucSSID,
3271 prConnSettings->ucSSIDLen);
3273 //4 <1.3> Setup Channel, Band
3274 prAisBssInfo->ucPrimaryChannel = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
3275 prAisBssInfo->eBand = prAisFsmInfo->prTargetBssDesc->eBand;
3278 //3 <2> Update BSS_INFO_T from STA_RECORD_T
3279 //4 <2.1> Save current AP's STA_RECORD_T and current AID
3280 prAisBssInfo->prStaRecOfAP = prStaRec;
3281 prAisBssInfo->u2AssocId = prStaRec->u2AssocId;
3283 //4 <2.2> Setup Capability
3284 prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use AP's Cap Info as BSS Cap Info */
3286 if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3287 prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3290 prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3293 //4 <2.3> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3294 prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3296 prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3298 prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3299 prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3302 //3 <3> Update BSS_INFO_T from SW_RFB_T (Association Resp Frame)
3303 //4 <3.1> Setup BSSID
3304 COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prAssocRspFrame->aucBSSID);
3307 u2IELength = (UINT_16) ((prAssocRspSwRfb->u2PacketLen - prAssocRspSwRfb->u2HeaderLen) -
3308 (OFFSET_OF(WLAN_ASSOC_RSP_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN));
3309 pucIE = prAssocRspFrame->aucInfoElem;
3312 //4 <3.2> Parse WMM and setup QBSS flag
3313 /* Parse WMM related IEs and configure HW CRs accordingly */
3314 mqmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
3316 prAisBssInfo->fgIsQBSS = prStaRec->fgIsQoS;
3318 //3 <4> Update BSS_INFO_T from BSS_DESC_T
3319 prBssDesc = scanSearchBssDescByBssid(prAdapter, prAssocRspFrame->aucBSSID);
3321 prBssDesc->fgIsConnecting = FALSE;
3322 prBssDesc->fgIsConnected = TRUE;
3324 //4 <4.1> Setup MIB for current BSS
3325 prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3328 // should never happen
3332 /* NOTE: Defer ucDTIMPeriod updating to when beacon is received after connection */
3333 prAisBssInfo->ucDTIMPeriod = 0;
3334 prAisBssInfo->u2ATIMWindow = 0;
3336 prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_INFRA;
3338 //4 <4.2> Update HT information and set channel
3339 /* Record HT related parameters in rStaRec and rBssInfo
3340 * Note: it shall be called before nicUpdateBss()
3342 rlmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
3344 //4 <4.3> Sync with firmware for BSS-INFO
3345 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3347 //4 <4.4> *DEFER OPERATION* nicPmIndicateBssConnected() will be invoked
3348 //inside scanProcessBeaconAndProbeResp() after 1st beacon is received
3351 } /* end of aisUpdateBssInfoForJOIN() */
3354 #if CFG_SUPPORT_ADHOC
3355 /*----------------------------------------------------------------------------*/
3357 * @brief This function will create an Ad-Hoc network and start sending Beacon Frames.
3363 /*----------------------------------------------------------------------------*/
3365 aisUpdateBssInfoForCreateIBSS (
3366 IN P_ADAPTER_T prAdapter
3369 P_AIS_FSM_INFO_T prAisFsmInfo;
3370 P_BSS_INFO_T prAisBssInfo;
3371 P_CONNECTION_SETTINGS_T prConnSettings;
3373 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3374 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3375 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3377 if (prAisBssInfo->fgIsBeaconActivated) {
3381 //3 <1> Update BSS_INFO_T per Network Basis
3382 //4 <1.1> Setup Operation Mode
3383 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3385 //4 <1.2> Setup SSID
3386 COPY_SSID(prAisBssInfo->aucSSID,
3387 prAisBssInfo->ucSSIDLen,
3388 prConnSettings->aucSSID,
3389 prConnSettings->ucSSIDLen);
3391 //4 <1.3> Clear current AP's STA_RECORD_T and current AID
3392 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3393 prAisBssInfo->u2AssocId = 0;
3395 //4 <1.4> Setup Channel, Band and Phy Attributes
3396 prAisBssInfo->ucPrimaryChannel = prConnSettings->ucAdHocChannelNum;
3397 prAisBssInfo->eBand = prConnSettings->eAdHocBand;
3399 if (prAisBssInfo->eBand == BAND_2G4) {
3401 prAisBssInfo->ucPhyTypeSet =
3402 prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11BGN; /* Depend on eBand */
3404 prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_MIXED_11BG; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3408 prAisBssInfo->ucPhyTypeSet =
3409 prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11AN; /* Depend on eBand */
3411 prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_11A; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3414 //4 <1.5> Setup MIB for current BSS
3415 prAisBssInfo->u2BeaconInterval = prConnSettings->u2BeaconPeriod;
3416 prAisBssInfo->ucDTIMPeriod = 0;
3417 prAisBssInfo->u2ATIMWindow = prConnSettings->u2AtimWindow;
3419 prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3421 #if CFG_PRIVACY_MIGRATION
3422 if (prConnSettings->eEncStatus == ENUM_ENCRYPTION1_ENABLED ||
3423 prConnSettings->eEncStatus == ENUM_ENCRYPTION2_ENABLED ||
3424 prConnSettings->eEncStatus == ENUM_ENCRYPTION3_ENABLED) {
3425 prAisBssInfo->fgIsProtection = TRUE;
3428 prAisBssInfo->fgIsProtection = FALSE;
3431 prAisBssInfo->fgIsProtection = FALSE;
3434 //3 <2> Update BSS_INFO_T common part
3435 ibssInitForAdHoc(prAdapter, prAisBssInfo);
3440 //4 <3.1> Setup channel and bandwidth
3441 rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3443 //4 <3.2> use command packets to inform firmware
3444 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3446 //4 <3.3> enable beaconing
3447 bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3449 //4 <3.4> Update AdHoc PM parameter
3450 nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_AIS_INDEX);
3452 //3 <4> Set ACTIVE flag.
3453 prAisBssInfo->fgIsBeaconActivated = TRUE;
3454 prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3456 //3 <5> Start IBSS Alone Timer
3457 cnmTimerStartTimer(prAdapter,
3458 &prAisFsmInfo->rIbssAloneTimer,
3459 SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
3463 } /* end of aisCreateIBSS() */
3466 /*----------------------------------------------------------------------------*/
3468 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3469 * the existing IBSS was found.
3471 * @param[in] prStaRec Pointer to the STA_RECORD_T
3475 /*----------------------------------------------------------------------------*/
3477 aisUpdateBssInfoForMergeIBSS (
3478 IN P_ADAPTER_T prAdapter,
3479 IN P_STA_RECORD_T prStaRec
3482 P_AIS_FSM_INFO_T prAisFsmInfo;
3483 P_BSS_INFO_T prAisBssInfo;
3484 P_CONNECTION_SETTINGS_T prConnSettings;
3485 P_BSS_DESC_T prBssDesc;
3486 //UINT_16 u2IELength;
3492 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3493 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3494 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3496 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
3498 if (!prAisBssInfo->fgIsBeaconActivated) {
3500 //3 <1> Update BSS_INFO_T per Network Basis
3501 //4 <1.1> Setup Operation Mode
3502 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3504 //4 <1.2> Setup SSID
3505 COPY_SSID(prAisBssInfo->aucSSID,
3506 prAisBssInfo->ucSSIDLen,
3507 prConnSettings->aucSSID,
3508 prConnSettings->ucSSIDLen);
3510 //4 <1.3> Clear current AP's STA_RECORD_T and current AID
3511 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3512 prAisBssInfo->u2AssocId = 0;
3515 //3 <2> Update BSS_INFO_T from STA_RECORD_T
3516 //4 <2.1> Setup Capability
3517 prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use Peer's Cap Info as IBSS Cap Info */
3519 if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3520 prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3521 prAisBssInfo->fgUseShortPreamble = TRUE;
3524 prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3525 prAisBssInfo->fgUseShortPreamble = FALSE;
3528 // 7.3.1.4 For IBSS, the Short Slot Time subfield shall be set to 0.
3529 prAisBssInfo->fgUseShortSlotTime = FALSE; /* Set to FALSE for AdHoc */
3530 prAisBssInfo->u2CapInfo &= ~CAP_INFO_SHORT_SLOT_TIME;
3532 if (prAisBssInfo->u2CapInfo & CAP_INFO_PRIVACY) {
3533 prAisBssInfo->fgIsProtection= TRUE;
3536 prAisBssInfo->fgIsProtection = FALSE;
3539 //4 <2.2> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3540 prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3542 prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3544 prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3545 prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3547 rateGetDataRatesFromRateSet(prAisBssInfo->u2OperationalRateSet,
3548 prAisBssInfo->u2BSSBasicRateSet,
3549 prAisBssInfo->aucAllSupportedRates,
3550 &prAisBssInfo->ucAllSupportedRatesLen);
3552 //3 <3> X Update BSS_INFO_T from SW_RFB_T (Association Resp Frame)
3555 //3 <4> Update BSS_INFO_T from BSS_DESC_T
3556 prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3558 prBssDesc->fgIsConnecting = FALSE;
3559 prBssDesc->fgIsConnected = TRUE;
3561 //4 <4.1> Setup BSSID
3562 COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prBssDesc->aucBSSID);
3564 //4 <4.2> Setup Channel, Band
3565 prAisBssInfo->ucPrimaryChannel = prBssDesc->ucChannelNum;
3566 prAisBssInfo->eBand = prBssDesc->eBand;
3568 //4 <4.3> Setup MIB for current BSS
3569 prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3570 prAisBssInfo->ucDTIMPeriod = 0;
3571 prAisBssInfo->u2ATIMWindow = 0; /* TBD(Kevin) */
3573 prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3576 // should never happen
3582 //4 <5.1> Find Lowest Basic Rate Index for default TX Rate of MMPDU
3584 UINT_8 ucLowestBasicRateIndex;
3586 if (!rateGetLowestRateIndexFromRateSet(prAisBssInfo->u2BSSBasicRateSet,
3587 &ucLowestBasicRateIndex)) {
3589 if (prAisBssInfo->ucPhyTypeSet & PHY_TYPE_BIT_OFDM) {
3590 ucLowestBasicRateIndex = RATE_6M_INDEX;
3593 ucLowestBasicRateIndex = RATE_1M_INDEX;
3597 prAisBssInfo->ucHwDefaultFixedRateCode =
3598 aucRateIndex2RateCode[prAisBssInfo->fgUseShortPreamble][ucLowestBasicRateIndex];
3601 //4 <5.2> Setup channel and bandwidth
3602 rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3604 //4 <5.3> use command packets to inform firmware
3605 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3607 //4 <5.4> enable beaconing
3608 bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3610 //4 <5.5> Update AdHoc PM parameter
3611 nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
3613 //3 <6> Set ACTIVE flag.
3614 prAisBssInfo->fgIsBeaconActivated = TRUE;
3615 prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3618 } /* end of aisUpdateBssInfoForMergeIBSS() */
3621 /*----------------------------------------------------------------------------*/
3623 * @brief This function will validate the Rx Probe Request Frame and then return
3624 * result to BSS to indicate if need to send the corresponding Probe Response
3625 * Frame if the specified conditions were matched.
3627 * @param[in] prAdapter Pointer to the Adapter structure.
3628 * @param[in] prSwRfb Pointer to SW RFB data structure.
3629 * @param[out] pu4ControlFlags Control flags for replying the Probe Response
3631 * @retval TRUE Reply the Probe Response
3632 * @retval FALSE Don't reply the Probe Response
3634 /*----------------------------------------------------------------------------*/
3636 aisValidateProbeReq (
3637 IN P_ADAPTER_T prAdapter,
3638 IN P_SW_RFB_T prSwRfb,
3639 OUT PUINT_32 pu4ControlFlags
3642 P_WLAN_MAC_MGMT_HEADER_T prMgtHdr;
3643 P_BSS_INFO_T prBssInfo;
3644 P_IE_SSID_T prIeSsid = (P_IE_SSID_T)NULL;
3647 UINT_16 u2Offset = 0;
3648 BOOLEAN fgReplyProbeResp = FALSE;
3652 ASSERT(pu4ControlFlags);
3654 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3656 //4 <1> Parse Probe Req IE and Get IE ptr (SSID, Supported Rate IE, ...)
3657 prMgtHdr = (P_WLAN_MAC_MGMT_HEADER_T)prSwRfb->pvHeader;
3659 u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
3660 pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
3662 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
3663 if (ELEM_ID_SSID == IE_ID(pucIE)) {
3665 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
3666 prIeSsid = (P_IE_SSID_T)pucIE;
3670 } /* end of IE_FOR_EACH */
3672 //4 <2> Check network conditions
3674 if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
3677 ((prIeSsid->ucLength == BC_SSID_LEN) || /* WILDCARD SSID */
3678 EQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen, /* CURRENT SSID */
3679 prIeSsid->aucSSID, prIeSsid->ucLength)) ) {
3680 fgReplyProbeResp = TRUE;
3684 return fgReplyProbeResp;
3686 } /* end of aisValidateProbeReq() */
3688 #endif /* CFG_SUPPORT_ADHOC */
3690 /*----------------------------------------------------------------------------*/
3692 * @brief This function will modify and update necessary information to firmware
3693 * for disconnection handling
3695 * @param[in] prAdapter Pointer to the Adapter structure.
3699 /*----------------------------------------------------------------------------*/
3702 IN P_ADAPTER_T prAdapter,
3703 IN BOOLEAN fgDelayIndication
3706 P_BSS_INFO_T prAisBssInfo;
3710 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3712 nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
3714 #if CFG_SUPPORT_ADHOC
3715 if (prAisBssInfo->fgIsBeaconActivated) {
3716 nicUpdateBeaconIETemplate(prAdapter,
3717 IE_UPD_METHOD_DELETE_ALL,
3718 NETWORK_TYPE_AIS_INDEX,
3723 prAisBssInfo->fgIsBeaconActivated = FALSE;
3727 rlmBssAborted(prAdapter, prAisBssInfo);
3729 //4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed.
3730 if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
3732 if (prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_RADIO_LOST) {
3733 scanRemoveBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3735 /* remove from scanning results as well */
3736 wlanClearBssInScanningResult(prAdapter, prAisBssInfo->aucBSSID);
3738 /* trials for re-association */
3739 if (fgDelayIndication) {
3740 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3741 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
3745 scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3748 if (fgDelayIndication) {
3749 if (OP_MODE_IBSS != prAisBssInfo->eCurrentOPMode) {
3750 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3754 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3758 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3762 //4 <4> Change Media State immediately.
3763 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
3765 //4 <4.1> sync. with firmware
3766 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3768 if (!fgDelayIndication) {
3769 //4 <5> Deactivate previous AP's STA_RECORD_T or all Clients in Driver if have.
3770 if (prAisBssInfo->prStaRecOfAP) {
3771 //cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
3773 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3777 #if CFG_SUPPORT_ROAMING
3778 roamingFsmRunEventAbort(prAdapter);
3780 /* clear pending roaming connection request */
3781 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
3782 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
3783 #endif /* CFG_SUPPORT_ROAMING */
3785 //4 <6> Indicate Disconnected Event to Host
3786 aisIndicationOfMediaStateToHost(prAdapter,
3787 PARAM_MEDIA_STATE_DISCONNECTED,
3791 //4 <7> Trigger AIS FSM
3792 aisFsmSteps(prAdapter, AIS_STATE_IDLE);
3795 } /* end of aisFsmDisconnect() */
3798 /*----------------------------------------------------------------------------*/
3800 * @brief This function will indicate an Event of Scan done Time-Out to AIS FSM.
3802 * @param[in] u4Param Unused timer parameter
3806 /*----------------------------------------------------------------------------*/
3808 aisFsmRunEventScanDoneTimeOut (
3809 IN P_ADAPTER_T prAdapter,
3813 DEBUGFUNC("aisFsmRunEventScanDoneTimeOut()");
3815 P_AIS_FSM_INFO_T prAisFsmInfo;
3816 ENUM_AIS_STATE_T eNextState;
3817 P_CONNECTION_SETTINGS_T prConnSettings;
3821 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3822 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3824 DBGLOG(AIS, STATE, ("aisFsmRunEventScanDoneTimeOut Current[%d]\n",prAisFsmInfo->eCurrentState));
3826 prConnSettings->fgIsScanReqIssued = FALSE;
3827 kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
3828 eNextState = prAisFsmInfo->eCurrentState;
3830 switch (prAisFsmInfo->eCurrentState) {
3831 case AIS_STATE_SCAN:
3832 prAisFsmInfo->u4ScanIELength = 0;
3833 eNextState = AIS_STATE_IDLE;
3835 case AIS_STATE_ONLINE_SCAN:
3836 /* reset scan IE buffer */
3837 prAisFsmInfo->u4ScanIELength = 0;
3838 #if CFG_SUPPORT_ROAMING
3839 eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
3841 eNextState = AIS_STATE_NORMAL_TR;
3842 #endif /* CFG_SUPPORT_ROAMING */
3848 if (eNextState != prAisFsmInfo->eCurrentState) {
3849 aisFsmSteps(prAdapter, eNextState);
3853 } /* end of aisFsmBGSleepTimeout() */
3856 /*----------------------------------------------------------------------------*/
3858 * @brief This function will indicate an Event of "Background Scan Time-Out" to AIS FSM.
3860 * @param[in] u4Param Unused timer parameter
3864 /*----------------------------------------------------------------------------*/
3866 aisFsmRunEventBGSleepTimeOut (
3867 IN P_ADAPTER_T prAdapter,
3871 P_AIS_FSM_INFO_T prAisFsmInfo;
3872 ENUM_AIS_STATE_T eNextState;
3874 DEBUGFUNC("aisFsmRunEventBGSleepTimeOut()");
3876 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3878 eNextState = prAisFsmInfo->eCurrentState;
3880 switch (prAisFsmInfo->eCurrentState) {
3881 case AIS_STATE_WAIT_FOR_NEXT_SCAN:
3882 DBGLOG(AIS, LOUD, ("EVENT - SCAN TIMER: Idle End - Current Time = %ld\n", kalGetTimeTick()));
3884 eNextState = AIS_STATE_LOOKING_FOR;
3886 SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
3894 /* Call aisFsmSteps() when we are going to change AIS STATE */
3895 if (eNextState != prAisFsmInfo->eCurrentState) {
3896 aisFsmSteps(prAdapter, eNextState);
3900 } /* end of aisFsmBGSleepTimeout() */
3903 /*----------------------------------------------------------------------------*/
3905 * @brief This function will indicate an Event of "IBSS ALONE Time-Out" to AIS FSM.
3907 * @param[in] u4Param Unused timer parameter
3911 /*----------------------------------------------------------------------------*/
3913 aisFsmRunEventIbssAloneTimeOut (
3914 IN P_ADAPTER_T prAdapter,
3918 P_AIS_FSM_INFO_T prAisFsmInfo;
3919 ENUM_AIS_STATE_T eNextState;
3921 DEBUGFUNC("aisFsmRunEventIbssAloneTimeOut()");
3923 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3924 eNextState = prAisFsmInfo->eCurrentState;
3926 switch(prAisFsmInfo->eCurrentState) {
3927 case AIS_STATE_IBSS_ALONE:
3929 /* There is no one participate in our AdHoc during this TIMEOUT Interval
3930 * so go back to search for a valid IBSS again.
3933 DBGLOG(AIS, LOUD, ("EVENT-IBSS ALONE TIMER: Start pairing\n"));
3935 prAisFsmInfo->fgTryScan = TRUE;
3938 aisFsmReleaseCh(prAdapter);
3940 /* Pull back to SEARCH to find candidate again */
3941 eNextState = AIS_STATE_SEARCH;
3950 /* Call aisFsmSteps() when we are going to change AIS STATE */
3951 if (eNextState != prAisFsmInfo->eCurrentState) {
3952 aisFsmSteps(prAdapter, eNextState);
3956 } /* end of aisIbssAloneTimeOut() */
3959 /*----------------------------------------------------------------------------*/
3961 * @brief This function will indicate an Event of "Join Time-Out" to AIS FSM.
3963 * @param[in] u4Param Unused timer parameter
3967 /*----------------------------------------------------------------------------*/
3969 aisFsmRunEventJoinTimeout (
3970 IN P_ADAPTER_T prAdapter,
3974 P_AIS_FSM_INFO_T prAisFsmInfo;
3975 ENUM_AIS_STATE_T eNextState;
3977 DEBUGFUNC("aisFsmRunEventJoinTimeout()");
3979 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3980 eNextState = prAisFsmInfo->eCurrentState;
3982 switch(prAisFsmInfo->eCurrentState) {
3983 case AIS_STATE_JOIN:
3984 DBGLOG(AIS, LOUD, ("EVENT- JOIN TIMEOUT\n"));
3986 /* 1. Do abort JOIN */
3987 aisFsmStateAbort_JOIN(prAdapter);
3989 /* 2. Increase Join Failure Count */
3990 prAisFsmInfo->prTargetStaRec->ucJoinFailureCount++;
3993 if(prAisFsmInfo->prTargetStaRec->ucJoinFailureCount < JOIN_MAX_RETRY_FAILURE_COUNT) {
3994 /* 3.1 Retreat to AIS_STATE_SEARCH state for next try */
3995 eNextState = AIS_STATE_SEARCH;
3998 /* 3.2 Retreat to AIS_STATE_WAIT_FOR_NEXT_SCAN state for next try */
3999 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
4002 eNextState = AIS_STATE_IDLE;
4005 case AIS_STATE_NORMAL_TR:
4006 /* 1. release channel */
4007 aisFsmReleaseCh(prAdapter);
4008 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
4010 /* 2. process if there is pending scan */
4011 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
4012 wlanClearScanningResult(prAdapter);
4013 eNextState = AIS_STATE_ONLINE_SCAN;
4019 /* release channel */
4020 aisFsmReleaseCh(prAdapter);
4026 /* Call aisFsmSteps() when we are going to change AIS STATE */
4027 if (eNextState != prAisFsmInfo->eCurrentState) {
4028 aisFsmSteps(prAdapter, eNextState);
4032 } /* end of aisFsmRunEventJoinTimeout() */
4035 #if defined(CFG_TEST_MGMT_FSM) && (CFG_TEST_MGMT_FSM != 0)
4036 /*----------------------------------------------------------------------------*/
4044 /*----------------------------------------------------------------------------*/
4050 P_MSG_AIS_ABORT_T prAisAbortMsg;
4051 P_CONNECTION_SETTINGS_T prConnSettings;
4052 UINT_8 aucSSID[]="pci-11n";
4055 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4057 /* Set Connection Request Issued Flag */
4058 prConnSettings->fgIsConnReqIssued = TRUE;
4059 prConnSettings->ucSSIDLen = ucSSIDLen;
4060 kalMemCopy(prConnSettings->aucSSID, aucSSID, ucSSIDLen);
4062 prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
4063 if (!prAisAbortMsg) {
4065 ASSERT(0); // Can't trigger SCAN FSM
4069 prAisAbortMsg->rMsgHdr.eMsgId = MID_HEM_AIS_FSM_ABORT;
4071 mboxSendMsg(prAdapter,
4073 (P_MSG_HDR_T) prAisAbortMsg,
4074 MSG_SEND_METHOD_BUF);
4076 wifi_send_msg(INDX_WIFI, MSG_ID_WIFI_IST, 0);
4080 #endif /* CFG_TEST_MGMT_FSM */
4083 /*----------------------------------------------------------------------------*/
4085 * \brief This function is used to handle OID_802_11_BSSID_LIST_SCAN
4087 * \param[in] prAdapter Pointer of ADAPTER_T
4088 * \param[in] prSsid Pointer of SSID_T if specified
4089 * \param[in] pucIe Pointer to buffer of extra information elements to be attached
4090 * \param[in] u4IeLength Length of information elements
4094 /*----------------------------------------------------------------------------*/
4097 IN P_ADAPTER_T prAdapter,
4098 IN P_PARAM_SSID_T prSsid,
4100 IN UINT_32 u4IeLength
4103 P_CONNECTION_SETTINGS_T prConnSettings;
4104 P_BSS_INFO_T prAisBssInfo;
4105 P_AIS_FSM_INFO_T prAisFsmInfo;
4107 DEBUGFUNC("aisFsmScanRequest()");
4110 ASSERT(u4IeLength <= MAX_IE_LENGTH);
4112 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4113 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4114 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4116 if (!prConnSettings->fgIsScanReqIssued) {
4117 prConnSettings->fgIsScanReqIssued = TRUE;
4119 if(prSsid == NULL) {
4120 prAisFsmInfo->ucScanSSIDLen = 0;
4123 COPY_SSID(prAisFsmInfo->aucScanSSID,
4124 prAisFsmInfo->ucScanSSIDLen,
4126 (UINT_8)prSsid->u4SsidLen);
4129 if(u4IeLength > 0 && u4IeLength <= MAX_IE_LENGTH ) {
4130 prAisFsmInfo->u4ScanIELength = u4IeLength;
4131 kalMemCopy(prAisFsmInfo->aucScanIEBuf, pucIe, u4IeLength);
4134 prAisFsmInfo->u4ScanIELength = 0;
4137 if(prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR) {
4138 if(prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE
4139 && prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
4140 // 802.1x might not finished yet, pend it for later handling ..
4141 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
4144 if(prAisFsmInfo->fgIsChannelGranted == TRUE) {
4145 DBGLOG(AIS, WARN, ("Scan Request with channel granted for join operation: %d, %d",
4146 prAisFsmInfo->fgIsChannelGranted,
4147 prAisFsmInfo->fgIsChannelRequested));
4150 /* start online scan */
4151 wlanClearScanningResult(prAdapter);
4152 aisFsmSteps(prAdapter, AIS_STATE_ONLINE_SCAN);
4155 else if(prAisFsmInfo->eCurrentState == AIS_STATE_IDLE) {
4156 wlanClearScanningResult(prAdapter);
4157 aisFsmSteps(prAdapter, AIS_STATE_SCAN);
4160 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
4164 DBGLOG(AIS, WARN, ("Scan Request dropped. (state: %d)\n", prAisFsmInfo->eCurrentState));
4168 } /* end of aisFsmScanRequest() */
4171 /*----------------------------------------------------------------------------*/
4173 * \brief This function is invoked when CNM granted channel privilege
4175 * \param[in] prAdapter Pointer of ADAPTER_T
4179 /*----------------------------------------------------------------------------*/
4181 aisFsmRunEventChGrant (
4182 IN P_ADAPTER_T prAdapter,
4183 IN P_MSG_HDR_T prMsgHdr
4186 P_BSS_INFO_T prAisBssInfo;
4187 P_AIS_FSM_INFO_T prAisFsmInfo;
4188 P_MSG_CH_GRANT_T prMsgChGrant;
4190 UINT_32 u4GrantInterval;
4195 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4196 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4197 prMsgChGrant = (P_MSG_CH_GRANT_T)prMsgHdr;
4199 ucTokenID = prMsgChGrant->ucTokenID;
4200 u4GrantInterval = prMsgChGrant->u4GrantInterval;
4202 /* 1. free message */
4203 cnmMemFree(prAdapter, prMsgHdr);
4205 if(prAisFsmInfo->eCurrentState == AIS_STATE_REQ_CHANNEL_JOIN &&
4206 prAisFsmInfo->ucSeqNumOfChReq == ucTokenID) {
4207 /* 2. channel privilege has been approved */
4208 prAisFsmInfo->u4ChGrantedInterval = u4GrantInterval;
4210 /* 3. state transition to join/ibss-alone/ibss-merge */
4211 /* 3.1 set timeout timer in cases join could not be completed */
4212 cnmTimerStartTimer(prAdapter,
4213 &prAisFsmInfo->rJoinTimeoutTimer,
4214 prAisFsmInfo->u4ChGrantedInterval - AIS_JOIN_CH_GRANT_THRESHOLD);
4215 /* 3.2 set local variable to indicate join timer is ticking */
4216 prAisFsmInfo->fgIsInfraChannelFinished = FALSE;
4218 /* 3.3 switch to join state */
4219 aisFsmSteps(prAdapter, AIS_STATE_JOIN);
4221 prAisFsmInfo->fgIsChannelGranted = TRUE;
4223 else { /* mismatched grant */
4224 /* 2. return channel privilege to CNM immediately */
4225 aisFsmReleaseCh(prAdapter);
4229 } /* end of aisFsmRunEventChGrant() */
4232 /*----------------------------------------------------------------------------*/
4234 * \brief This function is to inform CNM that channel privilege
4237 * \param[in] prAdapter Pointer of ADAPTER_T
4241 /*----------------------------------------------------------------------------*/
4244 IN P_ADAPTER_T prAdapter
4247 P_AIS_FSM_INFO_T prAisFsmInfo;
4248 P_MSG_CH_ABORT_T prMsgChAbort;
4252 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4254 if(prAisFsmInfo->fgIsChannelGranted == TRUE
4255 || prAisFsmInfo->fgIsChannelRequested == TRUE) {
4257 prAisFsmInfo->fgIsChannelRequested = FALSE;
4258 prAisFsmInfo->fgIsChannelGranted = FALSE;
4260 /* 1. return channel privilege to CNM immediately */
4261 prMsgChAbort = (P_MSG_CH_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_ABORT_T));
4262 if (!prMsgChAbort) {
4263 ASSERT(0); // Can't release Channel to CNM
4267 prMsgChAbort->rMsgHdr.eMsgId = MID_MNY_CNM_CH_ABORT;
4268 prMsgChAbort->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
4269 prMsgChAbort->ucTokenID = prAisFsmInfo->ucSeqNumOfChReq;
4271 mboxSendMsg(prAdapter,
4273 (P_MSG_HDR_T) prMsgChAbort,
4274 MSG_SEND_METHOD_BUF);
4278 } /* end of aisFsmReleaseCh() */
4281 /*----------------------------------------------------------------------------*/
4283 * \brief This function is to inform AIS that corresponding beacon has not
4284 * been received for a while and probing is not successful
4286 * \param[in] prAdapter Pointer of ADAPTER_T
4290 /*----------------------------------------------------------------------------*/
4292 aisBssBeaconTimeout (
4293 IN P_ADAPTER_T prAdapter
4296 P_BSS_INFO_T prAisBssInfo;
4297 BOOLEAN fgDoAbortIndication = FALSE;
4301 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4303 //4 <1> Diagnose Connection for Beacon Timeout Event
4304 if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
4305 if (OP_MODE_INFRASTRUCTURE == prAisBssInfo->eCurrentOPMode) {
4306 P_STA_RECORD_T prStaRec = prAisBssInfo->prStaRecOfAP;
4309 fgDoAbortIndication = TRUE;
4312 else if (OP_MODE_IBSS == prAisBssInfo->eCurrentOPMode) {
4313 fgDoAbortIndication = TRUE;
4317 //4 <2> invoke abort handler
4318 if (fgDoAbortIndication) {
4319 aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_RADIO_LOST, TRUE);
4323 } /* end of aisBssBeaconTimeout() */
4326 /*----------------------------------------------------------------------------*/
4328 * \brief This function is to inform AIS that DEAUTH frame has been
4329 * sent and thus state machine could go ahead
4331 * \param[in] prAdapter Pointer of ADAPTER_T
4332 * \param[in] prMsduInfo Pointer of MSDU_INFO_T for DEAUTH frame
4333 * \param[in] prAdapter Pointer of ADAPTER_T
4335 * \return WLAN_STATUS_SUCCESS
4337 /*----------------------------------------------------------------------------*/
4339 aisDeauthXmitComplete (
4340 IN P_ADAPTER_T prAdapter,
4341 IN P_MSDU_INFO_T prMsduInfo,
4342 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
4345 P_AIS_FSM_INFO_T prAisFsmInfo;
4349 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4351 if(prAisFsmInfo->eCurrentState == AIS_STATE_DISCONNECTING) {
4352 if(rTxDoneStatus != TX_RESULT_DROPPED_IN_DRIVER) {
4353 aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_NEW_CONNECTION, FALSE);
4357 DBGLOG(AIS, WARN, ("DEAUTH frame transmitted without further handling"));
4360 return WLAN_STATUS_SUCCESS;
4362 } /* end of aisDeauthXmitComplete() */
4364 #if CFG_SUPPORT_ROAMING
4365 /*----------------------------------------------------------------------------*/
4367 * @brief This function will indicate an Event of "Looking for a candidate due to weak signal" to AIS FSM.
4369 * @param[in] u4ReqScan Requesting Scan or not
4373 /*----------------------------------------------------------------------------*/
4375 aisFsmRunEventRoamingDiscovery (
4376 IN P_ADAPTER_T prAdapter,
4380 P_AIS_FSM_INFO_T prAisFsmInfo;
4381 P_CONNECTION_SETTINGS_T prConnSettings;
4382 ENUM_AIS_REQUEST_TYPE_T eAisRequest;
4384 DBGLOG(AIS, LOUD, ("aisFsmRunEventRoamingDiscovery()\n"));
4386 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4387 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4389 /* search candidates by best rssi */
4390 prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
4392 /* results are still new */
4394 roamingFsmRunEventRoam(prAdapter);
4395 eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4398 if(prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN
4399 || prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4400 eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4403 eAisRequest = AIS_REQUEST_ROAMING_SEARCH;
4407 if(prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR && prAisFsmInfo->fgIsInfraChannelFinished == TRUE) {
4408 if(eAisRequest == AIS_REQUEST_ROAMING_SEARCH) {
4409 aisFsmSteps(prAdapter, AIS_STATE_LOOKING_FOR);
4412 aisFsmSteps(prAdapter, AIS_STATE_SEARCH);
4416 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
4417 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
4419 aisFsmInsertRequest(prAdapter, eAisRequest);
4423 } /* end of aisFsmRunEventRoamingDiscovery() */
4425 /*----------------------------------------------------------------------------*/
4427 * @brief Update the time of ScanDone for roaming and transit to Roam state.
4433 /*----------------------------------------------------------------------------*/
4435 aisFsmRoamingScanResultsUpdate (
4436 IN P_ADAPTER_T prAdapter
4439 P_AIS_FSM_INFO_T prAisFsmInfo;
4440 P_ROAMING_INFO_T prRoamingFsmInfo;
4441 ENUM_AIS_STATE_T eNextState;
4443 DBGLOG(AIS, LOUD, ("->aisFsmRoamingScanResultsUpdate()\n"));
4445 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4446 prRoamingFsmInfo = (P_ROAMING_INFO_T)&(prAdapter->rWifiVar.rRoamingInfo);
4448 roamingFsmScanResultsUpdate(prAdapter);
4450 eNextState = prAisFsmInfo->eCurrentState;
4451 if (prRoamingFsmInfo->eCurrentState == ROAMING_STATE_DISCOVERY) {
4452 roamingFsmRunEventRoam(prAdapter);
4453 eNextState = AIS_STATE_SEARCH;
4455 else if (prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4456 eNextState = AIS_STATE_SEARCH;
4458 else if (prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
4459 eNextState = AIS_STATE_NORMAL_TR;
4463 } /* end of aisFsmRoamingScanResultsUpdate() */
4465 /*----------------------------------------------------------------------------*/
4467 * @brief This function will modify and update necessary information to firmware
4468 * for disconnection of last AP before switching to roaming bss.
4470 * @param IN prAdapter Pointer to the Adapter structure.
4471 * prTargetStaRec Target of StaRec of roaming
4475 /*----------------------------------------------------------------------------*/
4477 aisFsmRoamingDisconnectPrevAP (
4478 IN P_ADAPTER_T prAdapter,
4479 IN P_STA_RECORD_T prTargetStaRec
4482 P_BSS_INFO_T prAisBssInfo;
4484 DBGLOG(AIS, LOUD, ("aisFsmRoamingDisconnectPrevAP()"));
4488 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4490 nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
4492 /* Not invoke rlmBssAborted() here to avoid prAisBssInfo->fg40mBwAllowed
4493 * to be reset. RLM related parameters will be reset again when handling
4494 * association response in rlmProcessAssocRsp(). 20110413
4496 //rlmBssAborted(prAdapter, prAisBssInfo);
4498 //4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed.
4499 if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
4500 scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
4503 //4 <4> Change Media State immediately.
4504 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
4506 //4 <4.1> sync. with firmware
4507 prTargetStaRec->ucNetTypeIndex = 0xff; /* Virtial NetType */
4508 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
4509 prTargetStaRec->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX; /* Virtial NetType */
4512 } /* end of aisFsmRoamingDisconnectPrevAP() */
4514 /*----------------------------------------------------------------------------*/
4516 * @brief This function will update the contain of BSS_INFO_T for AIS network once
4517 * the roaming was completed.
4519 * @param IN prAdapter Pointer to the Adapter structure.
4520 * prStaRec StaRec of roaming AP
4525 /*----------------------------------------------------------------------------*/
4527 aisUpdateBssInfoForRoamingAP (
4528 IN P_ADAPTER_T prAdapter,
4529 IN P_STA_RECORD_T prStaRec,
4530 IN P_SW_RFB_T prAssocRspSwRfb
4533 P_BSS_INFO_T prAisBssInfo;
4535 DBGLOG(AIS, LOUD, ("aisUpdateBssInfoForRoamingAP()"));
4539 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4541 //4 <1.1> Change FW's Media State immediately.
4542 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
4544 //4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have.
4545 if ((prAisBssInfo->prStaRecOfAP) &&
4546 (prAisBssInfo->prStaRecOfAP != prStaRec) &&
4547 (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
4548 cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
4551 //4 <1.3> Update BSS_INFO_T
4552 aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
4554 //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
4555 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
4557 //4 <1.6> Indicate Connected Event to Host immediately.
4558 /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
4559 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
4562 } /* end of aisFsmRoamingUpdateBss() */
4564 #endif /* CFG_SUPPORT_ROAMING */
4567 /*----------------------------------------------------------------------------*/
4569 * @brief Check if there is any pending request and remove it (optional)
4578 /*----------------------------------------------------------------------------*/
4580 aisFsmIsRequestPending (
4581 IN P_ADAPTER_T prAdapter,
4582 IN ENUM_AIS_REQUEST_TYPE_T eReqType,
4586 P_AIS_FSM_INFO_T prAisFsmInfo;
4587 P_AIS_REQ_HDR_T prPendingReqHdr, prPendingReqHdrNext;
4590 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4592 /* traverse through pending request list */
4593 LINK_FOR_EACH_ENTRY_SAFE(prPendingReqHdr,
4594 prPendingReqHdrNext,
4595 &(prAisFsmInfo->rPendingReqList),
4598 /* check for specified type */
4599 if(prPendingReqHdr->eReqType == eReqType) {
4600 /* check if need to remove */
4601 if(bRemove == TRUE) {
4602 LINK_REMOVE_KNOWN_ENTRY(&(prAisFsmInfo->rPendingReqList), &(prPendingReqHdr->rLinkEntry));
4604 cnmMemFree(prAdapter, prPendingReqHdr);
4615 /*----------------------------------------------------------------------------*/
4617 * @brief Get next pending request
4621 * @return P_AIS_REQ_HDR_T
4623 /*----------------------------------------------------------------------------*/
4625 aisFsmGetNextRequest (
4626 IN P_ADAPTER_T prAdapter
4629 P_AIS_FSM_INFO_T prAisFsmInfo;
4630 P_AIS_REQ_HDR_T prPendingReqHdr;
4633 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4635 LINK_REMOVE_HEAD(&(prAisFsmInfo->rPendingReqList), prPendingReqHdr, P_AIS_REQ_HDR_T);
4637 return prPendingReqHdr;
4641 /*----------------------------------------------------------------------------*/
4643 * @brief Insert a new request
4651 /*----------------------------------------------------------------------------*/
4653 aisFsmInsertRequest (
4654 IN P_ADAPTER_T prAdapter,
4655 IN ENUM_AIS_REQUEST_TYPE_T eReqType
4658 P_AIS_REQ_HDR_T prAisReq;
4659 P_AIS_FSM_INFO_T prAisFsmInfo;
4662 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4664 prAisReq = (P_AIS_REQ_HDR_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(AIS_REQ_HDR_T));
4667 ASSERT(0); // Can't generate new message
4671 prAisReq->eReqType = eReqType;
4673 /* attach request into pending request list */
4674 LINK_INSERT_TAIL(&prAisFsmInfo->rPendingReqList, &prAisReq->rLinkEntry);
4680 /*----------------------------------------------------------------------------*/
4682 * @brief Flush all pending requests
4688 /*----------------------------------------------------------------------------*/
4690 aisFsmFlushRequest (
4691 IN P_ADAPTER_T prAdapter
4694 P_AIS_REQ_HDR_T prAisReq;
4698 while((prAisReq = aisFsmGetNextRequest(prAdapter)) != NULL) {
4699 cnmMemFree(prAdapter, prAisReq);