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 * [WCXRP00000913] [MT6620 Wi-Fi] create repository of source code dedicated for MT6620 E6 ASIC
21 * [MT6620 Wi-Fi][Driver] API and behavior modification for preferred band configuration with corresponding network configuration
22 * add wlanSetPreferBandByNetwork() for glue layer to invoke for setting preferred band configuration corresponding to network type.
25 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
26 * Adjust code for DBG and CONFIG_XLOG.
29 * [WCXRP00001120] [MT6620 Wi-Fi][Driver] Modify roaming to AIS state transition from synchronous to asynchronous approach to avoid incomplete state termination
30 * 1. change RDD related compile option brace position.
31 * 2. when roaming is triggered, ask AIS to transit immediately only when AIS is in Normal TR state without join timeout timer ticking
32 * 3. otherwise, insert AIS_REQUEST into pending request queue
35 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
36 * modify the xlog related code.
39 * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT for REASSOCIATED cases as an explicit trigger for Android framework
40 * correct reference to BSSID field in Association-Response frame.
43 * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT for REASSOCIATED cases as an explicit trigger for Android framework
44 * 1. for DEAUTH/DISASSOC cases, indicate for DISCONNECTION immediately.
45 * 2. (Android only) when reassociation-and-non-roaming cases happened, indicate an extra DISCONNECT indication to Android Wi-Fi framework
48 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
49 * adding the code for XLOG.
51 * 10 26 2011 tsaiyuan.hsu
52 * [WCXRP00001064] [MT6620 Wi-Fi][DRV]] add code with roaming awareness when disconnecting AIS network
53 * be aware roaming when disconnecting AIS network.
56 * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
57 * STA_REC shall be NULL for Beacon's MSDU
60 * [MT6620 Wi-Fi][Driver] Reduce join failure count limit to 2 for faster re-join for other BSS
61 * 1. short join failure count limit to 2
62 * 2. treat join timeout as kind of join failure as well
65 * [WCXRP00001036] [MT6620 Wi-Fi][Driver][FW] Adding the 802.11w code for MFP
66 * adding the 802.11w related function and define .
69 * [WCXRP00001020] [MT6620 Wi-Fi][Driver] Handle secondary channel offset of AP in 5GHz band
72 * 09 20 2011 tsaiyuan.hsu
73 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
74 * change window registry of driver for roaming.
77 * [WCXRP00000997] [MT6620 Wi-Fi][Driver][FW] Handle change of BSS preamble type and slot time
78 * Handle client mode about preamble type and slot time
80 * 09 08 2011 tsaiyuan.hsu
81 * [WCXRP00000972] [MT6620 Wi-Fi][DRV]] check if roaming occurs after join failure to avoid state incosistence.
82 * check if roaming occurs after join failure to avoid deactivation of network.
84 * 08 24 2011 chinghwa.yu
85 * [WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
86 * Update RDD test mode cases.
88 * 08 16 2011 tsaiyuan.hsu
89 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
90 * EnableRoaming in registry is deprecated.
92 * 08 16 2011 tsaiyuan.hsu
93 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
94 * use registry to enable or disable roaming.
97 * [WCXRP00000840] [MT6620 Wi-Fi][Driver][AIS] Stop timer for joining when channel is released due to join failure count exceeding limit
98 * stop timer when joining operation is failed due to try count exceeds limitation
101 * [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
102 * do not handle SCAN request immediately after connected to increase the probability of receiving 1st beacon frame.
105 * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
106 * change parameter name from PeerAddr to BSSID
109 * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
110 * 1. specify target's BSSID when requesting channel privilege.
111 * 2. pass BSSID information to firmware domain
114 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
115 * ensure DEAUTH is always sent before establish a new connection
118 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
119 * typo fix: a right brace is missed.
122 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
123 * When RECONNECT request is identified as disconnected, it is necessary to check for pending scan request.
126 * [WCXRP00000757] [MT6620 Wi-Fi][Driver][SCN] take use of RLM API to filter out BSS in disallowed channels
127 * mark fgIsTransition as TRUE for state rolling.
130 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
131 * always check for pending scan after switched into NORMAL_TR state.
134 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
135 * always treat connection request at higher priority over scanning request
137 * 06 09 2011 tsaiyuan.hsu
138 * [WCXRP00000760] [MT5931 Wi-Fi][FW] Refine rxmHandleMacRxDone to reduce code size
139 * move send_auth at rxmHandleMacRxDone in firmware to driver to reduce code size.
142 * [WCXRP00000681] [MT5931][Firmware] HIF code size reduction
143 * eliminate unused parameters for SAA-FSM
146 * [WCXRP00000732] [MT6620 Wi-Fi][AIS] No need to switch back to IDLE state when DEAUTH frame is dropped due to bss disconnection
147 * change SCAN handling behavior when followed by a CONNECT/DISCONNECT requests by pending instead of dropping.
150 * [WCXRP00000732] [MT6620 Wi-Fi][AIS] No need to switch back to IDLE state when DEAUTH frame is dropped due to bss disconnection
151 * when TX DONE status is TX_RESULT_DROPPED_IN_DRIVER, no need to switch back to IDLE state.
153 * 04 14 2011 cm.chang
154 * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
157 * 04 13 2011 george.huang
158 * [WCXRP00000628] [MT6620 Wi-Fi][FW][Driver] Modify U-APSD setting to default OFF
162 * [WCXRP00000575] [MT6620 Wi-Fi][Driver][AIS] reduce memory usage when generating mailbox message for scan request
163 * when there is no IE needed for probe request, then request a smaller memory for mailbox message
165 * 03 17 2011 chinglan.wang
166 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
169 * 03 17 2011 chinglan.wang
170 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
173 * 03 16 2011 tsaiyuan.hsu
174 * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
175 * remove obsolete definition and unused variables.
178 * [WCXRP00000535] [MT6620 Wi-Fi][Driver] Fixed channel operation when AIS and Tethering are operating concurrently
179 * When fixed channel operation is necessary, AIS-FSM would scan and only connect for BSS on the specific channel
181 * 03 09 2011 tsaiyuan.hsu
182 * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
183 * avoid clearing fgIsScanReqIssued so as to add scan results.
185 * 03 07 2011 terry.wu
186 * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
187 * Toggle non-standard debug messages to comments.
189 * 03 04 2011 tsaiyuan.hsu
190 * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
191 * reset retry conter of attemp to connect to ap after completion of join.
194 * [WCXRP00000515] [MT6620 Wi-Fi][Driver] Surpress compiler warning which is identified by GNU compiler collection
195 * surpress compile warning occured when compiled by GNU compiler collection.
198 * [WCXRP00000503] [MT6620 Wi-Fi][Driver] Take RCPI brought by association response as initial RSSI right after connection is built.
199 * use RCPI brought by ASSOC-RESP after connection is built as initial RCPI to avoid using a uninitialized MAC-RX RCPI.
201 * 02 26 2011 tsaiyuan.hsu
202 * [WCXRP00000391] [MT6620 Wi-Fi][FW] Add Roaming Support
203 * not send disassoc or deauth to leaving AP so as to improve performace of roaming.
206 * [WCXRP00000487] [MT6620 Wi-Fi][Driver][AIS] Serve scan and connect request with a queue-based approach to improve response time for scanning request
207 * when handling reconnect request, set fgTryScan as TRUE
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 * handle SCAN and RECONNECT with a FIFO approach.
213 * 02 09 2011 tsaiyuan.hsu
214 * [WCXRP00000392] [MT6620 Wi-Fi][Driver] Add Roaming Support
215 * Check if prRegInfo is null or not before initializing roaming parameters.
218 * [WCXRP00000416] [MT6620 Wi-Fi][Driver] treat "unable to find BSS" as connection trial to prevent infinite reconnection trials
219 * treat "unable to find BSS" as connection trial to prevent infinite reconnection trials.
221 * 01 27 2011 tsaiyuan.hsu
222 * [WCXRP00000392] [MT6620 Wi-Fi][Driver] Add Roaming Support
224 * 1. not support 11r, only use strength of signal to determine roaming.
225 * 2. not enable CFG_SUPPORT_ROAMING until completion of full test.
226 * 3. in 6620, adopt work-around to avoid sign extension problem of cck of hw
227 * 4. assume that change of link quality in smooth way.
229 * 01 26 2011 yuche.tsai
230 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
233 * 01 25 2011 yuche.tsai
234 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
235 * Fix Compile Error when DBG is disabled.
237 * 01 25 2011 yuche.tsai
238 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
239 * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
242 * [WCXRP00000359] [MT6620 Wi-Fi][Driver] add an extra state to ensure DEAUTH frame is always sent
243 * Add an extra state to guarantee DEAUTH frame is sent then connect to new BSS.
244 * This change is due to WAPI AP needs DEAUTH frame as a necessary step in handshaking protocol.
247 * [WCXRP00000307] [MT6620 Wi-Fi][SQA]WHQL test .2c_wlan_adhoc case fail.
248 * [IBSS] when merged in, the bss state should be updated to firmware to pass WHQL adhoc failed item
251 * [WCXRP00000351] [MT6620 Wi-Fi][Driver] remove from scanning result in OID handling layer when the corresponding BSS is disconnected due to beacon timeout
252 * remove from scanning result when the BSS is disconnected due to beacon timeout.
255 * [WCXRP00000337] [MT6620 Wi-FI][Driver] AIS-FSM not to invoke cnmStaRecResetStatus directly 'cause it frees all belonging STA-RECs
256 * do not invoke cnmStaRecResetStatus() directly, nicUpdateBss will do the things after bss is disconnected
259 * [WCXRP00000270] [MT6620 Wi-Fi][Driver] Clear issues after concurrent networking support has been merged
260 * do not need to manipulate prStaRec after indicating BSS disconnection to firmware, 'cause all STA-RECs belongs to BSS has been freed already
263 * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
264 * add DEBUGFUNC() macro invoking for more detailed debugging information
266 * 12 23 2010 george.huang
267 * [WCXRP00000152] [MT6620 Wi-Fi] AP mode power saving function
268 * 1. update WMM IE parsing, with ASSOC REQ handling
269 * 2. extend U-APSD parameter passing from driver to FW
272 * [WCXRP00000270] [MT6620 Wi-Fi][Driver] Clear issues after concurrent networking support has been merged
273 * before BSS disconnection is indicated to firmware, all correlated peer should be cleared and freed
275 * 12 07 2010 cm.chang
276 * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
277 * 1. BSSINFO include RLM parameter
278 * 2. free all sta records when network is disconnected
280 * 11 25 2010 yuche.tsai
282 * Update SLT Function for QoS Support and not be affected by fixed rate function.
285 * [WCXRP00000208] [MT6620 Wi-Fi][Driver] Add scanning with specified SSID to AIS FSM
286 * add scanning with specified SSID facility to AIS-FSM
289 * [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
290 * 1) Query link speed (TX rate) from firmware directly with buffering mechanism to reduce overhead
291 * 2) Remove CNM CH-RECOVER event handling
292 * 3) cfg read/write API renamed with kal prefix for unified naming rules.
295 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000137] [MT6620 Wi-Fi] [FW] Support NIC capability query command
296 * 1) update NVRAM content template to ver 1.02
297 * 2) add compile option for querying NIC capability (default: off)
298 * 3) modify AIS 5GHz support to run-time option, which could be turned on by registry or NVRAM setting
299 * 4) correct auto-rate compiler error under linux (treat warning as error)
300 * 5) simplify usage of NVRAM and REG_INFO_T
301 * 6) add version checking between driver and firmware
304 * [WCXRP00000097] [MT6620 Wi-Fi] [Driver] Fixed the P2P not setting the fgIsChannelExt value make scan not abort
305 * initial the fgIsChannelExt value.
308 * [WCXRP00000087] [MT6620 Wi-Fi][Driver] Cannot connect to 5GHz AP, driver will cause FW assert.
309 * correct erroneous logic: specifying eBand with incompatible eSco
312 * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and replaced by ENUM_NETWORK_TYPE_INDEX_T only
313 * remove ENUM_NETWORK_TYPE_T definitions
315 * 09 27 2010 chinghwa.yu
316 * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000065] Update BoW design and settings
317 * Update BCM/BoW design and settings.
320 * [WCXRP00000049] [MT6620 Wi-Fi][Driver] Adhoc cannot be created successfully.
321 * keep IBSS-ALONE state retrying until further instruction is received
324 * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete and might leads to BSOD when entering RF test with AIS associated
325 * Do a complete reset with STA-REC null checking for RF test re-entry
327 * 09 09 2010 yuche.tsai
329 * Fix NULL IE Beacon issue. Sync Beacon Content to FW before enable beacon.
330 * Both in IBSS Create & IBSS Merge
334 * frequency is in unit of KHz thus no need to divide 1000 once more.
338 * 1) initialize for correct parameter even for disassociation.
339 * 2) AIS-FSM should have a limit on trials to build connection
341 * 09 03 2010 kevin.huang
343 * Refine #include sequence and solve recursive/nested #include issue
347 * eliminate klockwork errors
349 * 08 29 2010 yuche.tsai
351 * Finish SLT TX/RX & Rate Changing Support.
355 * add option for enabling AIS 5GHz scan
359 * [AIS-FSM] IBSS no longer needs to acquire channel for beaconing, RLM/CNM will handle the channel switching when BSS information is updated
361 * 08 25 2010 george.huang
363 * update OID/ registry control path for PM related settings
365 * 08 24 2010 cm.chang
367 * Support RLM initail channel of Ad-hoc, P2P and BOW
369 * 08 20 2010 cm.chang
371 * Migrate RLM code to host from FW
375 * check-in missed files.
377 * 08 12 2010 kevin.huang
379 * Refine bssProcessProbeRequest() and bssSendBeaconProbeResponse()
383 * reset fgIsScanReqIssued when abort request is received right after join completion.
387 * surpress compilation warning.
391 * comment out deprecated members in BSS_INFO, which are only used by firmware rather than driver.
395 * 1) BoW wrapper: use definitions instead of hard-coded constant for error code
396 * 2) AIS-FSM: eliminate use of desired RF parameters, use prTargetBssDesc instead
397 * 3) add handling for RX_PKT_DESTINATION_HOST_WITH_FORWARD for GO-broadcast frames
401 * eliminate u4FreqInKHz usage, combined into rConnections.ucAdHoc*
405 * allocate on MGMT packet for IBSS beaconing.
409 * [AIS-FSM] fix: when join failed, release channel privilege as well
413 * reuse join-abort sub-procedure to reduce code size.
417 * 1) eliminate redundant variable eOPMode in prAdapter->rWlanInfo
418 * 2) change nicMediaStateChange() API prototype
422 * AIS-FSM: when scan request is coming in the 1st 5 seconds of channel privilege period, just pend it til 5-sec. period finishes
426 * AIS-FSM FIX: return channel privilege even when the privilege is not granted yet
427 * QM: qmGetFrameAction() won't assert when corresponding STA-REC index is not found
431 * re-commit code logic being overwriten.
435 * .support the Wi-Fi RSN
439 * 1) re-enable AIS-FSM beacon timeout handling.
440 * 2) scan done API revised
445 * 2) disable beacon timeout handling temporally due to unexpected beacon timeout event.
449 * indicate scan done for linux wireless extension
453 * add AIS-FSM handling for beacon timeout event.
457 * 1) refine AIS-FSM indent.
458 * 2) when entering RF Test mode, flush 802.1X frames as well
459 * 3) when entering D3 state, flush 802.1X frames as well
463 * separate AIS-FSM states into different cases of channel request.
467 * 1) change BG_SCAN to ONLINE_SCAN for consistent term
468 * 2) only clear scanning result when scan is permitted to do
472 * 1) [AIS] when new scan is issued, clear currently available scanning result except the connected one
473 * 2) refine disconnection behaviour when issued during BG-SCAN process
477 * 1) bugfix: do not stop timer for join after switched into normal_tr state, for providing chance for DHCP handshasking
478 * 2) modify rsnPerformPolicySelection() invoking
482 * 1) init AIS_BSS_INFO as channel number = 1 with band = 2.4GHz
487 * update for security supporting.
491 * [WPD00003833] [MT6620 and MT5931] Driver migration.
492 * when IBSS is being merged-in, send command packet to PM for connected indication
496 * [WPD00003833] [MT6620 and MT5931] Driver migration.
497 * Add Ad-Hoc support to AIS-FSM
499 * 07 19 2010 jeffrey.chang
501 * Linux port modification
505 * [WPD00003833] [MT6620 and MT5931] Driver migration.
506 * bugfix for SCN migration
507 * 1) modify QUEUE_CONCATENATE_QUEUES() so it could be used to concatence with an empty queue
508 * 2) before AIS issues scan request, network(BSS) needs to be activated first
509 * 3) only invoke COPY_SSID when using specified SSID for scan
513 * [WPD00003833] [MT6620 and MT5931] Driver migration.
514 * for AIS scanning, driver specifies no extra IE for probe request
518 * [WPD00003833] [MT6620 and MT5931] Driver migration.
519 * driver no longer generates probe request frames
521 * 07 14 2010 yarco.yang
523 * Remove CFG_MQM_MIGRATION
527 * [WPD00003833] [MT6620 and MT5931] Driver migration.
528 * Refine AIS-FSM by divided into more states
530 * 07 13 2010 cm.chang
532 * Rename MSG_CH_RELEASE_T to MSG_CH_ABORT_T
536 * 1) separate AIS_FSM state for two kinds of scanning. (OID triggered scan, and scan-for-connection)
537 * 2) eliminate PRE_BSS_DESC_T, Beacon/PrebResp is now parsed in single pass
538 * 3) implment DRV-SCN module, currently only accepts single scan request, other request will be directly dropped by returning BUSY
540 * 07 09 2010 george.huang
542 * [WPD00001556] Migrate PM variables from FW to driver: for composing QoS Info
546 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
549 * [WPD00003833][MT6620 and MT5931] Driver migration
550 * take use of RLM module for parsing/generating HT IEs for 11n capability
552 * 07 08 2010 cm.chang
553 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
554 * Rename MID_MNY_CNM_CH_RELEASE to MID_MNY_CNM_CH_ABORT
557 * [WPD00003833][MT6620 and MT5931] Driver migration
558 * for first connection, if connecting failed do not enter into scan state.
561 * [WPD00003833][MT6620 and MT5931] Driver migration
562 * once STA-REC is allocated and updated, invoke cnmStaRecChangeState() to sync. with firmware.
564 * 07 06 2010 george.huang
565 * [WPD00001556]Basic power managemenet function
566 * Update arguments for nicUpdateBeaconIETemplate()
569 * [WPD00003833][MT6620 and MT5931] Driver migration
570 * STA-REC is maintained by CNM only.
573 * [WPD00003833][MT6620 and MT5931] Driver migration
574 * remove unused definitions.
577 * [WPD00003833][MT6620 and MT5931] Driver migration
578 * AIS-FSM integration with CNM channel request messages
581 * [WPD00003833][MT6620 and MT5931] Driver migration
582 * implementation of DRV-SCN and related mailbox message handling.
585 * [WPD00003833][MT6620 and MT5931] Driver migration
586 * sync. with CMD/EVENT document ver0.07.
589 * [WPD00003833][MT6620 and MT5931] Driver migration
590 * 1) sync to. CMD/EVENT document v0.03
591 * 2) simplify DTIM period parsing in scan.c only, bss.c no longer parses it again.
592 * 3) send command packet to indicate FW-PM after
593 * a) 1st beacon is received after AIS has connected to an AP
594 * b) IBSS-ALONE has been created
595 * c) IBSS-MERGE has occured
598 * [WPD00003833][MT6620 and MT5931] Driver migration
599 * modify Beacon/ProbeResp to complete parsing,
600 * because host software has looser memory usage restriction
603 * [WPD00003833][MT6620 and MT5931] Driver migration
607 * [WPD00003833][MT6620 and MT5931] Driver migration
608 * comment out RLM APIs by CFG_RLM_MIGRATION.
611 * [WPD00003833][MT6620 and MT5931] Driver migration
612 * 1) add command warpper for STA-REC/BSS-INFO sync.
613 * 2) enhance command packet sending procedure for non-oid part
614 * 3) add command packet definitions for STA-REC/BSS-INFO sync.
616 * 06 21 2010 yarco.yang
617 * [WPD00003837][MT6620]Data Path Refine
618 * Support CFG_MQM_MIGRATION flag
621 * [WPD00003833][MT6620 and MT5931] Driver migration
622 * add scan_fsm into building.
625 * [WPD00003833][MT6620 and MT5931] Driver migration
626 * RSN/PRIVACY compilation flag awareness correction
628 * 06 18 2010 cm.chang
629 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
630 * Provide cnmMgtPktAlloc() and alloc/free function of msg/buf
633 * [WPD00003840][MT6620 5931] Security migration
634 * migration from MT6620 firmware.
637 * [WPD00003833][MT6620 and MT5931] Driver migration
641 * [WPD00003833][MT6620 and MT5931] Driver migration
642 * restore utility function invoking via hem_mbox to direct calls
645 * [WPD00003833][MT6620 and MT5931] Driver migration
646 * auth.c is migrated.
649 * [WPD00003833][MT6620 and MT5931] Driver migration
653 * [WPD00003833][MT6620 and MT5931] Driver migration
654 * 1) migrate assoc.c.
655 * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
656 * 3) add configuration options for CNM_MEM and RSN modules
657 * 4) add data path for management frames
658 * 5) eliminate rPacketInfo of MSDU_INFO_T
661 * [WPD00003833][MT6620 and MT5931] Driver migration
662 * change to enqueue TX frame infinitely.
665 * [WPD00003833][MT6620 and MT5931] Driver migration
666 * 1) eliminate CFG_CMD_EVENT_VERSION_0_9
667 * 2) when disconnected, indicate nic directly (no event is needed)
670 * [WPD00003833][MT6620 and MT5931] Driver migration
671 * add buildable & linkable ais_fsm.c
673 * related reference are still waiting to be resolved
675 * 06 01 2010 cm.chang
676 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
677 * Add conditionial compiling flag to choose default available bandwidth
679 * 05 28 2010 kevin.huang
680 * [BORA00000794][WIFISYS][New Feature]Power Management Support
681 * Add ClientList handling API - bssClearClientList, bssAddStaRecToClientList
683 * 05 24 2010 kevin.huang
684 * [BORA00000794][WIFISYS][New Feature]Power Management Support
685 * Refine authSendAuthFrame() for NULL STA_RECORD_T case and minimum deauth interval.
687 * 05 21 2010 kevin.huang
688 * [BORA00000794][WIFISYS][New Feature]Power Management Support
689 * Fix compile error if CFG_CMD_EVENT_VER_009 == 0 for prEventConnStatus->ucNetworkType.
691 * 05 21 2010 kevin.huang
692 * [BORA00000794][WIFISYS][New Feature]Power Management Support
693 * Refine txmInitWtblTxRateTable() - set TX initial rate according to AP's operation rate set
695 * 05 17 2010 kevin.huang
696 * [BORA00000794][WIFISYS][New Feature]Power Management Support
697 * Call pmAbort() and add ucNetworkType field in EVENT_CONNECTION_STATUS
699 * 05 14 2010 kevin.huang
700 * [BORA00000794][WIFISYS][New Feature]Power Management Support
701 * Fix compile warning - define of MQM_WMM_PARSING was removed
703 * 05 12 2010 kevin.huang
704 * [BORA00000794][WIFISYS][New Feature]Power Management Support
705 * Add Power Management - Legacy PS-POLL support.
707 * 04 28 2010 tehuang.liu
708 * [BORA00000605][WIFISYS] Phase3 Integration
709 * Removed the use of compiling flag MQM_WMM_PARSING
711 * 04 27 2010 kevin.huang
712 * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
716 * 04 27 2010 kevin.huang
717 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
718 * Add Set Slot Time and Beacon Timeout Support for AdHoc Mode
720 * 04 19 2010 kevin.huang
721 * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
722 * Add Send Deauth for Class 3 Error and Leave Network Support
725 * [BORA00000680][MT6620] Support the statistic for Microsoft os query
726 * fixed the protected bit at cap info for ad-hoc.
728 * 04 13 2010 kevin.huang
729 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
730 * Add new HW CH macro support
732 * 04 07 2010 chinghwa.yu
733 * [BORA00000563]Add WiFi CoEx BCM module
734 * Add TX Power Control RCPI function.
737 * [BORA00000605][WIFISYS] Phase3 Integration
738 * move the wlan table alloc / free to change state function.
741 * [BORA00000676][MT6620] Support the frequency setting and query at build connection / connection event
742 * modify the build connection and status event structure bu CMD_EVENT doc 0.09 draft, default is disable.
745 * [BORA00000605][WIFISYS] Phase3 Integration
746 * fixed some WHQL testing error.
748 * 03 24 2010 kevin.huang
749 * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
750 * Add Set / Unset POWER STATE in AIS Network
752 * 03 16 2010 kevin.huang
753 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
756 * 03 10 2010 kevin.huang
757 * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
758 * Add Channel Manager for arbitration of JOIN and SCAN Req
760 * 03 03 2010 kevin.huang
761 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
762 * Add PHY_CONFIG to change Phy Type
764 * 03 03 2010 chinghwa.yu
765 * [BORA00000563]Add WiFi CoEx BCM module
766 * Use bcmWiFiNotify to replace wifi_send_msg to pass infomation to BCM module.
768 * 03 03 2010 chinghwa.yu
769 * [BORA00000563]Add WiFi CoEx BCM module
770 * Remove wmt_task definition and add PTA function.
772 * 03 02 2010 tehuang.liu
773 * [BORA00000569][WIFISYS] Phase 2 Integration Test
774 * Init TXM and MQM testing procedures in aisFsmRunEventJoinComplete()
776 * 03 01 2010 tehuang.liu
777 * [BORA00000569][WIFISYS] Phase 2 Integration Test
778 * Modified aisUpdateBssInfo() to call TXM's functions for setting WTBL TX parameters
781 * [BORA00000605][WIFISYS] Phase3 Integration
782 * clear the pmkid cache while indicate media disconnect.
784 * 02 26 2010 tehuang.liu
785 * [BORA00000569][WIFISYS] Phase 2 Integration Test
788 * 02 26 2010 tehuang.liu
789 * [BORA00000569][WIFISYS] Phase 2 Integration Test
790 * Enabled MQM parsing WMM IEs for non-AP mode
792 * 02 26 2010 kevin.huang
793 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
794 * Remove CFG_TEST_VIRTUAL_CMD and add support of Driver STA_RECORD_T activation
797 * [BORA00000605][WIFISYS] Phase3 Integration
798 * use the Rx0 dor event indicate.
800 * 02 23 2010 kevin.huang
801 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
802 * Support dynamic channel selection
805 * [BORA00000621][MT6620 Wi-Fi] Add the RSSI indicate to avoid XP stalled for query rssi value
806 * Adding the RSSI event support, using the HAL function to get the rcpi value and tranlsate to RSSI and indicate to driver
808 * 02 12 2010 cm.chang
809 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
810 * Use bss info array for concurrent handle
812 * 02 05 2010 kevin.huang
813 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
814 * Revise data structure to share the same BSS_INFO_T for avoiding coding error
816 * 02 04 2010 kevin.huang
817 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
818 * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
820 * 01 27 2010 tehuang.liu
821 * [BORA00000569][WIFISYS] Phase 2 Integration Test
822 * Set max AMDPU size supported by the peer to 64 KB, removed mqmInit() and mqmTxSendAddBaReq() function calls in aisUpdateBssInfo()
825 * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
826 * add and fixed some security function.
828 * 01 22 2010 cm.chang
829 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
830 * Support protection and bandwidth switch
832 * 01 20 2010 kevin.huang
833 * [BORA00000569][WIFISYS] Phase 2 Integration Test
834 * Add PHASE_2_INTEGRATION_WORK_AROUND and CFG_SUPPORT_BCM flags
836 * 01 15 2010 tehuang.liu
837 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
838 * Configured the AMPDU factor to 3 for the APu1rwduu`wvpghlqg|q`mpdkb+ilp
840 * 01 14 2010 chinghwa.yu
841 * [BORA00000563]Add WiFi CoEx BCM module
842 * Add WiFi BCM module for the 1st time.
844 * 01 11 2010 kevin.huang
845 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
846 * Add Deauth and Disassoc Handler
848 * 01 07 2010 kevin.huang
849 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
850 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
852 * Refine JOIN Complete and seperate the function of Media State indication
854 * 01 04 2010 tehuang.liu
855 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
856 * For working out the first connection Chariot-verified version
858 * 12 18 2009 cm.chang
859 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
862 * Dec 10 2009 mtk01088
863 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
864 * adding the sample code to update the wlan table rate,
866 * Dec 10 2009 mtk01104
867 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
868 * Different function prototype of wifi_send_msg()
870 * Dec 9 2009 mtk01104
871 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
872 * Call rlm related function to process HT info when join complete
874 * Dec 9 2009 mtk01088
875 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
876 * default the acquired wlan table entry code off
878 * Dec 9 2009 mtk01088
879 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
880 * adding the code to acquired the wlan table entry, and a sample code to update the BA bit at table
882 * Dec 7 2009 mtk01461
883 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
884 * Fix the problem of prSwRfb overwrited by event packet in aisFsmRunEventJoinComplete()
886 * Dec 4 2009 mtk01088
887 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
888 * adding the code to integrate the security related code
890 * Dec 3 2009 mtk01461
891 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
892 * Remove redundant declaration
894 * Dec 3 2009 mtk01461
895 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
896 * Add code for JOIN init and JOIN complete
898 * Nov 30 2009 mtk01461
899 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
900 * Rename u4RSSI to i4RSSI
902 * Nov 30 2009 mtk01461
903 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
904 * Revise ENUM_MEDIA_STATE to ENUM_PARAM_MEDIA_STATE
906 * Nov 30 2009 mtk01461
907 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
908 * Add fgIsScanReqIssued to CONNECTION_SETTINGS_T
910 * Nov 26 2009 mtk01461
911 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
912 * Revise Virtual CMD handler due to structure changed
914 * Nov 25 2009 mtk01461
915 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
916 * Add Virtual CMD & RESP for testing CMD PATH
918 * Nov 23 2009 mtk01461
919 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
920 * Add aisFsmInitializeConnectionSettings()
922 * Nov 20 2009 mtk01461
923 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
924 * Add CFG_TEST_MGMT_FSM flag for aisFsmTest()
926 * Nov 16 2009 mtk01461
927 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
931 /*******************************************************************************
932 * C O M P I L E R F L A G S
933 ********************************************************************************
936 /*******************************************************************************
937 * E X T E R N A L R E F E R E N C E S
938 ********************************************************************************
942 /*******************************************************************************
944 ********************************************************************************
946 #define AIS_ROAMING_CONNECTION_TRIAL_LIMIT 2
948 #define CTIA_MAGIC_SSID "ctia_test_only_*#*#3646633#*#*"
949 #define CTIA_MAGIC_SSID_LEN 30
950 /*******************************************************************************
952 ********************************************************************************
955 /*******************************************************************************
956 * P U B L I C D A T A
957 ********************************************************************************
960 /*******************************************************************************
961 * P R I V A T E D A T A
962 ********************************************************************************
965 /*lint -save -e64 Type mismatch */
966 static PUINT_8 apucDebugAisState[AIS_STATE_NUM] = {
967 (PUINT_8)DISP_STRING("AIS_STATE_IDLE"),
968 (PUINT_8)DISP_STRING("AIS_STATE_SEARCH"),
969 (PUINT_8)DISP_STRING("AIS_STATE_SCAN"),
970 (PUINT_8)DISP_STRING("AIS_STATE_ONLINE_SCAN"),
971 (PUINT_8)DISP_STRING("AIS_STATE_LOOKING_FOR"),
972 (PUINT_8)DISP_STRING("AIS_STATE_WAIT_FOR_NEXT_SCAN"),
973 (PUINT_8)DISP_STRING("AIS_STATE_REQ_CHANNEL_JOIN"),
974 (PUINT_8)DISP_STRING("AIS_STATE_JOIN"),
975 (PUINT_8)DISP_STRING("AIS_STATE_IBSS_ALONE"),
976 (PUINT_8)DISP_STRING("AIS_STATE_IBSS_MERGE"),
977 (PUINT_8)DISP_STRING("AIS_STATE_NORMAL_TR"),
978 (PUINT_8)DISP_STRING("AIS_STATE_DISCONNECTING")
983 /*******************************************************************************
985 ********************************************************************************
988 /*******************************************************************************
989 * F U N C T I O N D E C L A R A T I O N S
990 ********************************************************************************
993 /*******************************************************************************
995 ********************************************************************************
997 /*----------------------------------------------------------------------------*/
999 * @brief the function is used to initialize the value of the connection settings for
1006 /*----------------------------------------------------------------------------*/
1008 aisInitializeConnectionSettings (
1009 IN P_ADAPTER_T prAdapter,
1010 IN P_REG_INFO_T prRegInfo
1013 P_CONNECTION_SETTINGS_T prConnSettings;
1014 UINT_8 aucAnyBSSID[] = BC_BSSID;
1015 UINT_8 aucZeroMacAddr[] = NULL_MAC_ADDR;
1018 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1020 /* Setup default values for operation */
1021 COPY_MAC_ADDR(prConnSettings->aucMacAddress, aucZeroMacAddr);
1023 prConnSettings->ucDelayTimeOfDisconnectEvent = AIS_DELAY_TIME_OF_DISCONNECT_SEC;
1025 COPY_MAC_ADDR(prConnSettings->aucBSSID, aucAnyBSSID);
1026 prConnSettings->fgIsConnByBssidIssued = FALSE;
1028 prConnSettings->fgIsConnReqIssued = FALSE;
1029 prConnSettings->fgIsDisconnectedByNonRequest = FALSE;
1031 prConnSettings->ucSSIDLen = 0;
1033 prConnSettings->eOPMode = NET_TYPE_INFRA;
1035 prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
1038 prConnSettings->ucAdHocChannelNum = (UINT_8) nicFreq2ChannelNum(prRegInfo->u4StartFreq);
1039 prConnSettings->eAdHocBand = prRegInfo->u4StartFreq < 5000000 ? BAND_2G4 : BAND_5G;
1040 prConnSettings->eAdHocMode = (ENUM_PARAM_AD_HOC_MODE_T) (prRegInfo->u4AdhocMode);
1043 prConnSettings->eAuthMode = AUTH_MODE_OPEN;
1045 prConnSettings->eEncStatus = ENUM_ENCRYPTION_DISABLED;
1047 prConnSettings->fgIsScanReqIssued = FALSE;
1049 /* MIB attributes */
1050 prConnSettings->u2BeaconPeriod = DOT11_BEACON_PERIOD_DEFAULT;
1052 prConnSettings->u2RTSThreshold = DOT11_RTS_THRESHOLD_DEFAULT;
1054 prConnSettings->u2DesiredNonHTRateSet = RATE_SET_ALL_ABG;
1056 //prConnSettings->u4FreqInKHz; /* Center frequency */
1060 prConnSettings->bmfgApsdEnAc = PM_UAPSD_NONE;
1062 secInit(prAdapter, NETWORK_TYPE_AIS_INDEX);
1065 prConnSettings->fgIsEnableRoaming = FALSE;
1066 #if CFG_SUPPORT_ROAMING
1068 prConnSettings->fgIsEnableRoaming = ((prRegInfo->fgDisRoaming > 0)?(FALSE):(TRUE));
1070 #endif /* CFG_SUPPORT_ROAMING */
1072 prConnSettings->fgIsAdHocQoSEnable = FALSE;
1074 prConnSettings->eDesiredPhyConfig = PHY_CONFIG_802_11ABGN;
1076 /* Set default bandwidth modes */
1077 prConnSettings->uc2G4BandwidthMode = CONFIG_BW_20M;
1078 prConnSettings->uc5GBandwidthMode = CONFIG_BW_20_40M;
1080 prConnSettings->rRsnInfo.ucElemId = 0x30;
1081 prConnSettings->rRsnInfo.u2Version = 0x0001;
1082 prConnSettings->rRsnInfo.u4GroupKeyCipherSuite = 0;
1083 prConnSettings->rRsnInfo.u4PairwiseKeyCipherSuiteCount = 0;
1084 for (i = 0; i < MAX_NUM_SUPPORTED_CIPHER_SUITES; i++)
1085 prConnSettings->rRsnInfo.au4PairwiseKeyCipherSuite[i] = 0;
1086 prConnSettings->rRsnInfo.u4AuthKeyMgtSuiteCount = 0;
1087 for (i = 0; i < MAX_NUM_SUPPORTED_AKM_SUITES; i++)
1088 prConnSettings->rRsnInfo.au4AuthKeyMgtSuite[i] = 0;
1089 prConnSettings->rRsnInfo.u2RsnCap = 0;
1090 prConnSettings->rRsnInfo.fgRsnCapPresent = FALSE;
1093 } /* end of aisFsmInitializeConnectionSettings() */
1096 /*----------------------------------------------------------------------------*/
1098 * @brief the function is used to initialize the value in AIS_FSM_INFO_T for
1105 /*----------------------------------------------------------------------------*/
1108 IN P_ADAPTER_T prAdapter
1111 P_AIS_FSM_INFO_T prAisFsmInfo;
1112 P_BSS_INFO_T prAisBssInfo;
1113 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1115 DEBUGFUNC("aisFsmInit()");
1116 DBGLOG(SW1, INFO, ("->aisFsmInit()\n"));
1118 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1119 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1120 prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1122 //4 <1> Initiate FSM
1123 prAisFsmInfo->ePreviousState = AIS_STATE_IDLE;
1124 prAisFsmInfo->eCurrentState = AIS_STATE_IDLE;
1126 prAisFsmInfo->ucAvailableAuthTypes = 0;
1128 prAisFsmInfo->prTargetBssDesc = (P_BSS_DESC_T)NULL;
1130 prAisFsmInfo->ucSeqNumOfReqMsg = 0;
1131 prAisFsmInfo->ucSeqNumOfChReq = 0;
1132 prAisFsmInfo->ucSeqNumOfScanReq = 0;
1134 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1135 #if CFG_SUPPORT_ROAMING
1136 prAisFsmInfo->fgIsRoamingScanPending = FALSE;
1137 #endif /* CFG_SUPPORT_ROAMING */
1138 prAisFsmInfo->fgIsChannelRequested = FALSE;
1139 prAisFsmInfo->fgIsChannelGranted = FALSE;
1141 //4 <1.1> Initiate FSM - Timer INIT
1142 cnmTimerInitTimer(prAdapter,
1143 &prAisFsmInfo->rBGScanTimer,
1144 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventBGSleepTimeOut,
1147 cnmTimerInitTimer(prAdapter,
1148 &prAisFsmInfo->rIbssAloneTimer,
1149 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventIbssAloneTimeOut,
1152 cnmTimerInitTimer(prAdapter,
1153 &prAisFsmInfo->rIndicationOfDisconnectTimer,
1154 (PFN_MGMT_TIMEOUT_FUNC)aisPostponedEventOfDisconnTimeout,
1157 cnmTimerInitTimer(prAdapter,
1158 &prAisFsmInfo->rJoinTimeoutTimer,
1159 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventJoinTimeout,
1162 cnmTimerInitTimer(prAdapter,
1163 &prAisFsmInfo->rScanDoneTimer,
1164 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventScanDoneTimeOut,
1167 //4 <1.2> Initiate PWR STATE
1168 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1171 //4 <2> Initiate BSS_INFO_T - common part
1172 BSS_INFO_INIT(prAdapter, NETWORK_TYPE_AIS_INDEX);
1173 COPY_MAC_ADDR(prAisBssInfo->aucOwnMacAddr, prAdapter->rWifiVar.aucMacAddress);
1175 //4 <3> Initiate BSS_INFO_T - private part
1177 prAisBssInfo->eBand = BAND_2G4;
1178 prAisBssInfo->ucPrimaryChannel = 1;
1179 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
1181 //4 <4> Allocate MSDU_INFO_T for Beacon
1182 prAisBssInfo->prBeacon = cnmMgtPktAlloc(prAdapter,
1183 OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem[0]) + MAX_IE_LENGTH);
1185 if (prAisBssInfo->prBeacon) {
1186 prAisBssInfo->prBeacon->eSrc = TX_PACKET_MGMT;
1187 prAisBssInfo->prBeacon->ucStaRecIndex = 0xFF; /* NULL STA_REC */
1194 prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = PM_UAPSD_ALL;
1195 prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC = PM_UAPSD_ALL;
1196 prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = WMM_MAX_SP_LENGTH_2;
1198 if (prAdapter->u4UapsdAcBmp == 0) {
1199 prAdapter->u4UapsdAcBmp = CFG_INIT_UAPSD_AC_BMP;
1200 //ASSERT(prAdapter->u4UapsdAcBmp);
1202 prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = (UINT_8)prAdapter->u4UapsdAcBmp;
1203 prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC =(UINT_8) prAdapter->u4UapsdAcBmp;
1204 prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = (UINT_8)prAdapter->u4MaxSpLen;
1207 /* request list initialization */
1208 LINK_INITIALIZE(&prAisFsmInfo->rPendingReqList);
1210 //DBGPRINTF("[2] ucBmpDeliveryAC:0x%x, ucBmpTriggerAC:0x%x, ucUapsdSp:0x%x",
1211 //prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC,
1212 //prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC,
1213 //prAisBssInfo->rPmProfSetupInfo.ucUapsdSp);
1216 } /* end of aisFsmInit() */
1218 /*----------------------------------------------------------------------------*/
1220 * @brief the function is used to uninitialize the value in AIS_FSM_INFO_T for
1227 /*----------------------------------------------------------------------------*/
1230 IN P_ADAPTER_T prAdapter
1233 P_AIS_FSM_INFO_T prAisFsmInfo;
1234 P_BSS_INFO_T prAisBssInfo;
1235 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1237 DEBUGFUNC("aisFsmUninit()");
1238 DBGLOG(SW1, INFO, ("->aisFsmUninit()\n"));
1240 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1241 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1242 prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1244 //4 <1> Stop all timers
1245 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
1246 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
1247 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
1248 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1249 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rScanDoneTimer); //Add by Enlai
1251 //4 <2> flush pending request
1252 aisFsmFlushRequest(prAdapter);
1254 //4 <3> Reset driver-domain BSS-INFO
1255 if(prAisBssInfo->prBeacon) {
1256 cnmMgtPktFree(prAdapter, prAisBssInfo->prBeacon);
1257 prAisBssInfo->prBeacon = NULL;
1260 #if CFG_SUPPORT_802_11W
1261 rsnStopSaQuery(prAdapter);
1265 } /* end of aisFsmUninit() */
1268 /*----------------------------------------------------------------------------*/
1270 * @brief Initialization of JOIN STATE
1272 * @param[in] prBssDesc The pointer of BSS_DESC_T which is the BSS we will try to join with.
1276 /*----------------------------------------------------------------------------*/
1278 aisFsmStateInit_JOIN (
1279 IN P_ADAPTER_T prAdapter,
1280 P_BSS_DESC_T prBssDesc
1283 P_AIS_FSM_INFO_T prAisFsmInfo;
1284 P_BSS_INFO_T prAisBssInfo;
1285 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1286 P_CONNECTION_SETTINGS_T prConnSettings;
1287 P_STA_RECORD_T prStaRec;
1288 P_MSG_JOIN_REQ_T prJoinReqMsg;
1290 DEBUGFUNC("aisFsmStateInit_JOIN()");
1292 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1293 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1294 prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1295 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1299 //4 <1> We are going to connect to this BSS.
1300 prBssDesc->fgIsConnecting = TRUE;
1303 //4 <2> Setup corresponding STA_RECORD_T
1304 prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1306 NETWORK_TYPE_AIS_INDEX,
1309 prAisFsmInfo->prTargetStaRec = prStaRec;
1311 //4 <2.1> sync. to firmware domain
1312 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1314 //4 <3> Update ucAvailableAuthTypes which we can choice during SAA
1315 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1317 prStaRec->fgIsReAssoc = FALSE;
1319 switch (prConnSettings->eAuthMode) {
1320 case AUTH_MODE_OPEN: /* Note: Omit break here. */
1322 case AUTH_MODE_WPA_PSK:
1323 case AUTH_MODE_WPA2:
1324 case AUTH_MODE_WPA2_PSK:
1325 prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_OPEN_SYSTEM;
1329 case AUTH_MODE_SHARED:
1330 prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_SHARED_KEY;
1334 case AUTH_MODE_AUTO_SWITCH:
1335 DBGLOG(AIS, LOUD, ("JOIN INIT: eAuthMode == AUTH_MODE_AUTO_SWITCH\n"));
1336 prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)(AUTH_TYPE_OPEN_SYSTEM |
1337 AUTH_TYPE_SHARED_KEY);
1341 ASSERT(!(prConnSettings->eAuthMode == AUTH_MODE_WPA_NONE));
1342 DBGLOG(AIS, ERROR, ("JOIN INIT: Auth Algorithm : %d was not supported by JOIN\n",
1343 prConnSettings->eAuthMode));
1344 /* TODO(Kevin): error handling ? */
1348 /* TODO(tyhsu): Assume that Roaming Auth Type is equal to ConnSettings eAuthMode */
1349 prAisSpecificBssInfo->ucRoamingAuthTypes = prAisFsmInfo->ucAvailableAuthTypes;
1351 prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT;
1355 ASSERT(prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE);
1356 ASSERT(!prBssDesc->fgIsConnected);
1358 DBGLOG(AIS, LOUD, ("JOIN INIT: AUTH TYPE = %d for Roaming\n",
1359 prAisSpecificBssInfo->ucRoamingAuthTypes));
1362 prStaRec->fgIsReAssoc = TRUE; /* We do roaming while the medium is connected */
1364 /* TODO(Kevin): We may call a sub function to acquire the Roaming Auth Type */
1365 prAisFsmInfo->ucAvailableAuthTypes = prAisSpecificBssInfo->ucRoamingAuthTypes;
1367 prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT_FOR_ROAMING;
1371 //4 <4> Use an appropriate Authentication Algorithm Number among the ucAvailableAuthTypes
1372 if (prAisFsmInfo->ucAvailableAuthTypes &
1373 (UINT_8)AUTH_TYPE_OPEN_SYSTEM) {
1375 DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == OPEN_SYSTEM.\n"));
1376 prAisFsmInfo->ucAvailableAuthTypes &=
1377 ~(UINT_8)AUTH_TYPE_OPEN_SYSTEM;
1379 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_OPEN_SYSTEM;
1381 else if (prAisFsmInfo->ucAvailableAuthTypes &
1382 (UINT_8)AUTH_TYPE_SHARED_KEY) {
1384 DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == SHARED_KEY.\n"));
1386 prAisFsmInfo->ucAvailableAuthTypes &=
1387 ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1389 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1391 else if (prAisFsmInfo->ucAvailableAuthTypes &
1392 (UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION) {
1394 DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == FAST_BSS_TRANSITION.\n"));
1396 prAisFsmInfo->ucAvailableAuthTypes &=
1397 ~(UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION;
1399 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_FAST_BSS_TRANSITION;
1405 //4 <5> Overwrite Connection Setting for eConnectionPolicy == ANY (Used by Assoc Req)
1406 if (prConnSettings->eConnectionPolicy == CONNECT_BY_SSID_ANY) {
1408 if (prBssDesc->ucSSIDLen) {
1409 COPY_SSID(prConnSettings->aucSSID,
1410 prConnSettings->ucSSIDLen,
1412 prBssDesc->ucSSIDLen);
1416 //4 <6> Send a Msg to trigger SAA to start JOIN process.
1417 prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
1418 if (!prJoinReqMsg) {
1420 ASSERT(0); // Can't trigger SAA FSM
1424 prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1425 prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1426 prJoinReqMsg->prStaRec = prStaRec;
1430 P_FRAG_INFO_T prFragInfo;
1431 for (j = 0; j < MAX_NUM_CONCURRENT_FRAGMENTED_MSDUS; j++) {
1432 prFragInfo = &prStaRec->rFragInfo[j];
1434 if (prFragInfo->pr1stFrag) {
1435 //nicRxReturnRFB(prAdapter, prFragInfo->pr1stFrag);
1436 prFragInfo->pr1stFrag = (P_SW_RFB_T)NULL;
1441 mboxSendMsg(prAdapter,
1443 (P_MSG_HDR_T) prJoinReqMsg,
1444 MSG_SEND_METHOD_BUF);
1447 } /* end of aisFsmInit_JOIN() */
1450 /*----------------------------------------------------------------------------*/
1452 * @brief Retry JOIN for AUTH_MODE_AUTO_SWITCH
1454 * @param[in] prStaRec Pointer to the STA_RECORD_T
1456 * @retval TRUE We will retry JOIN
1457 * @retval FALSE We will not retry JOIN
1459 /*----------------------------------------------------------------------------*/
1461 aisFsmStateInit_RetryJOIN (
1462 IN P_ADAPTER_T prAdapter,
1463 P_STA_RECORD_T prStaRec
1466 P_AIS_FSM_INFO_T prAisFsmInfo;
1467 P_MSG_JOIN_REQ_T prJoinReqMsg;
1469 DEBUGFUNC("aisFsmStateInit_RetryJOIN()");
1471 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1473 /* Retry other AuthType if possible */
1474 if (!prAisFsmInfo->ucAvailableAuthTypes) {
1478 if (prAisFsmInfo->ucAvailableAuthTypes &
1479 (UINT_8)AUTH_TYPE_SHARED_KEY) {
1481 DBGLOG(AIS, INFO, ("RETRY JOIN INIT: Retry Authentication with AuthType == SHARED_KEY.\n"));
1483 prAisFsmInfo->ucAvailableAuthTypes &=
1484 ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1486 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1489 DBGLOG(AIS, ERROR, ("RETRY JOIN INIT: Retry Authentication with Unexpected AuthType.\n"));
1493 prAisFsmInfo->ucAvailableAuthTypes = 0; /* No more available Auth Types */
1495 /* Trigger SAA to start JOIN process. */
1496 prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
1497 if (!prJoinReqMsg) {
1499 ASSERT(0); // Can't trigger SAA FSM
1503 prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1504 prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1505 prJoinReqMsg->prStaRec = prStaRec;
1507 mboxSendMsg(prAdapter,
1509 (P_MSG_HDR_T) prJoinReqMsg,
1510 MSG_SEND_METHOD_BUF);
1514 }/* end of aisFsmRetryJOIN() */
1517 #if CFG_SUPPORT_ADHOC
1518 /*----------------------------------------------------------------------------*/
1520 * @brief State Initialization of AIS_STATE_IBSS_ALONE
1526 /*----------------------------------------------------------------------------*/
1528 aisFsmStateInit_IBSS_ALONE (
1529 IN P_ADAPTER_T prAdapter
1532 P_AIS_FSM_INFO_T prAisFsmInfo;
1533 P_CONNECTION_SETTINGS_T prConnSettings;
1534 P_BSS_INFO_T prAisBssInfo;
1536 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1537 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1538 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1540 //4 <1> Check if IBSS was created before ?
1541 if (prAisBssInfo->fgIsBeaconActivated) {
1543 //4 <2> Start IBSS Alone Timer for periodic SCAN and then SEARCH
1544 #if !CFG_SLT_SUPPORT
1545 cnmTimerStartTimer(prAdapter,
1546 &prAisFsmInfo->rIbssAloneTimer,
1547 SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
1551 aisFsmCreateIBSS(prAdapter);
1554 } /* end of aisFsmStateInit_IBSS_ALONE() */
1557 /*----------------------------------------------------------------------------*/
1559 * @brief State Initialization of AIS_STATE_IBSS_MERGE
1561 * @param[in] prBssDesc The pointer of BSS_DESC_T which is the IBSS we will try to merge with.
1565 /*----------------------------------------------------------------------------*/
1567 aisFsmStateInit_IBSS_MERGE (
1568 IN P_ADAPTER_T prAdapter,
1569 P_BSS_DESC_T prBssDesc
1572 P_AIS_FSM_INFO_T prAisFsmInfo;
1573 P_CONNECTION_SETTINGS_T prConnSettings;
1574 P_BSS_INFO_T prAisBssInfo;
1575 P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
1580 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1581 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1582 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1584 //4 <1> We will merge with to this BSS immediately.
1585 prBssDesc->fgIsConnecting = FALSE;
1586 prBssDesc->fgIsConnected = TRUE;
1588 //4 <2> Setup corresponding STA_RECORD_T
1589 prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1590 STA_TYPE_ADHOC_PEER,
1591 NETWORK_TYPE_AIS_INDEX,
1594 prStaRec->fgIsMerging = TRUE;
1596 prAisFsmInfo->prTargetStaRec = prStaRec;
1598 //4 <2.1> sync. to firmware domain
1599 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1602 aisFsmMergeIBSS(prAdapter, prStaRec);
1605 } /* end of aisFsmStateInit_IBSS_MERGE() */
1607 #endif /* CFG_SUPPORT_ADHOC */
1610 /*----------------------------------------------------------------------------*/
1612 * @brief Process of JOIN Abort
1618 /*----------------------------------------------------------------------------*/
1620 aisFsmStateAbort_JOIN (
1621 IN P_ADAPTER_T prAdapter
1624 P_AIS_FSM_INFO_T prAisFsmInfo;
1625 P_MSG_JOIN_ABORT_T prJoinAbortMsg;
1627 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1629 /* 1. Abort JOIN process */
1630 prJoinAbortMsg = (P_MSG_JOIN_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_ABORT_T));
1631 if (!prJoinAbortMsg) {
1633 ASSERT(0); // Can't abort SAA FSM
1637 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
1638 WLAN_STATUS_CONNECT_INDICATION,
1642 prJoinAbortMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_ABORT;
1643 prJoinAbortMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfReqMsg;
1644 prJoinAbortMsg->prStaRec = prAisFsmInfo->prTargetStaRec;
1646 scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisFsmInfo->prTargetStaRec->aucMacAddr);
1648 mboxSendMsg(prAdapter,
1650 (P_MSG_HDR_T) prJoinAbortMsg,
1651 MSG_SEND_METHOD_BUF);
1653 /* 2. Return channel privilege */
1654 aisFsmReleaseCh(prAdapter);
1656 /* 3.1 stop join timeout timer */
1657 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1659 /* 3.2 reset local variable */
1660 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1661 prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
1664 } /* end of aisFsmAbortJOIN() */
1667 /*----------------------------------------------------------------------------*/
1669 * @brief Process of SCAN Abort
1675 /*----------------------------------------------------------------------------*/
1677 aisFsmStateAbort_SCAN (
1678 IN P_ADAPTER_T prAdapter
1681 P_AIS_FSM_INFO_T prAisFsmInfo;
1682 P_MSG_SCN_SCAN_CANCEL prScanCancelMsg;
1684 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1686 /* Abort JOIN process. */
1687 prScanCancelMsg = (P_MSG_SCN_SCAN_CANCEL)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_CANCEL));
1688 if (!prScanCancelMsg) {
1690 ASSERT(0); // Can't abort SCN FSM
1694 prScanCancelMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_CANCEL;
1695 prScanCancelMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfScanReq;
1696 prScanCancelMsg->ucNetTypeIndex = (UINT_8)NETWORK_TYPE_AIS_INDEX;
1697 #if CFG_ENABLE_WIFI_DIRECT
1698 if(prAdapter->fgIsP2PRegistered) {
1699 prScanCancelMsg->fgIsChannelExt = FALSE;
1703 /* unbuffered message to guarantee scan is cancelled in sequence */
1704 mboxSendMsg(prAdapter,
1706 (P_MSG_HDR_T) prScanCancelMsg,
1707 MSG_SEND_METHOD_UNBUF);
1710 } /* end of aisFsmAbortSCAN() */
1713 /*----------------------------------------------------------------------------*/
1715 * @brief Process of NORMAL_TR Abort
1721 /*----------------------------------------------------------------------------*/
1723 aisFsmStateAbort_NORMAL_TR (
1724 IN P_ADAPTER_T prAdapter
1727 P_AIS_FSM_INFO_T prAisFsmInfo;
1730 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1732 /* TODO(Kevin): Do abort other MGMT func */
1734 /* 1. Release channel to CNM */
1735 aisFsmReleaseCh(prAdapter);
1737 /* 2.1 stop join timeout timer */
1738 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1740 /* 2.2 reset local variable */
1741 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1744 } /* end of aisFsmAbortNORMAL_TR() */
1747 #if CFG_SUPPORT_ADHOC
1748 /*----------------------------------------------------------------------------*/
1750 * @brief Process of NORMAL_TR Abort
1756 /*----------------------------------------------------------------------------*/
1758 aisFsmStateAbort_IBSS (
1759 IN P_ADAPTER_T prAdapter
1762 P_AIS_FSM_INFO_T prAisFsmInfo;
1763 P_BSS_DESC_T prBssDesc;
1765 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1768 if (prAisFsmInfo->prTargetStaRec) {
1769 prBssDesc = scanSearchBssDescByTA(prAdapter,
1770 prAisFsmInfo->prTargetStaRec->aucMacAddr);
1773 prBssDesc->fgIsConnected = FALSE;
1774 prBssDesc->fgIsConnecting = FALSE;
1778 // release channel privilege
1779 aisFsmReleaseCh(prAdapter);
1783 #endif /* CFG_SUPPORT_ADHOC */
1786 /*----------------------------------------------------------------------------*/
1788 * @brief The Core FSM engine of AIS(Ad-hoc, Infra STA)
1790 * @param[in] eNextState Enum value of next AIS STATE
1794 /*----------------------------------------------------------------------------*/
1797 IN P_ADAPTER_T prAdapter,
1798 ENUM_AIS_STATE_T eNextState
1801 P_AIS_FSM_INFO_T prAisFsmInfo;
1802 P_BSS_INFO_T prAisBssInfo;
1803 P_CONNECTION_SETTINGS_T prConnSettings;
1804 P_BSS_DESC_T prBssDesc;
1805 P_MSG_CH_REQ_T prMsgChReq;
1806 P_MSG_SCN_SCAN_REQ prScanReqMsg;
1807 P_AIS_REQ_HDR_T prAisReq;
1810 UINT_16 u2ScanIELen;
1812 BOOLEAN fgIsTransition = (BOOLEAN)FALSE;
1814 DEBUGFUNC("aisFsmSteps()");
1816 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1817 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1818 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1822 /* Do entering Next State */
1823 prAisFsmInfo->ePreviousState = prAisFsmInfo->eCurrentState;
1826 DBGLOG(AIS, STATE, ("TRANSITION: [%s] -> [%s]\n",
1827 apucDebugAisState[prAisFsmInfo->eCurrentState],
1828 apucDebugAisState[eNextState]));
1830 DBGLOG(AIS, STATE, ("[%d] TRANSITION: [%d] -> [%d]\n",
1832 prAisFsmInfo->eCurrentState,
1835 /* NOTE(Kevin): This is the only place to change the eCurrentState(except initial) */
1836 prAisFsmInfo->eCurrentState = eNextState;
1838 fgIsTransition = (BOOLEAN)FALSE;
1840 /* Do tasks of the State that we just entered */
1841 switch (prAisFsmInfo->eCurrentState) {
1842 /* NOTE(Kevin): we don't have to rearrange the sequence of following
1843 * switch case. Instead I would like to use a common lookup table of array
1844 * of function pointer to speed up state search.
1846 case AIS_STATE_IDLE:
1848 prAisReq = aisFsmGetNextRequest(prAdapter);
1850 if(prAisReq == NULL || prAisReq->eReqType == AIS_REQUEST_RECONNECT) {
1851 if (prConnSettings->fgIsConnReqIssued == TRUE &&
1852 prConnSettings->fgIsDisconnectedByNonRequest == FALSE) {
1854 prAisFsmInfo->fgTryScan = TRUE;
1856 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1857 SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1859 // sync with firmware
1860 nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1862 // reset trial count
1863 prAisFsmInfo->ucConnTrialCount = 0;
1865 eNextState = AIS_STATE_SEARCH;
1866 fgIsTransition = TRUE;
1869 UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1870 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1872 // sync with firmware
1873 nicDeactivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1875 // check for other pending request
1877 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
1878 wlanClearScanningResult(prAdapter);
1879 eNextState = AIS_STATE_SCAN;
1881 fgIsTransition = TRUE;
1887 /* free the message */
1888 cnmMemFree(prAdapter, prAisReq);
1891 else if(prAisReq->eReqType == AIS_REQUEST_SCAN) {
1892 #if CFG_SUPPORT_ROAMING
1893 prAisFsmInfo->fgIsRoamingScanPending = FALSE;
1894 #endif /* CFG_SUPPORT_ROAMING */
1895 wlanClearScanningResult(prAdapter);
1897 eNextState = AIS_STATE_SCAN;
1898 fgIsTransition = TRUE;
1900 /* free the message */
1901 cnmMemFree(prAdapter, prAisReq);
1903 else if(prAisReq->eReqType == AIS_REQUEST_ROAMING_CONNECT || prAisReq->eReqType == AIS_REQUEST_ROAMING_SEARCH) {
1905 /* free the message */
1906 cnmMemFree(prAdapter, prAisReq);
1909 prAisFsmInfo->u4SleepInterval = AIS_BG_SCAN_INTERVAL_MIN_SEC;
1913 case AIS_STATE_SEARCH:
1914 //4 <1> Search for a matched candidate and save it to prTargetBssDesc.
1916 prBssDesc = prAdapter->rWifiVar.rSltInfo.prPseudoBssDesc;
1918 prBssDesc = scanSearchBssDescByPolicy(prAdapter, NETWORK_TYPE_AIS_INDEX);
1921 // we are under Roaming Condition.
1922 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
1923 if(prAisFsmInfo->ucConnTrialCount > AIS_ROAMING_CONNECTION_TRIAL_LIMIT) {
1924 #if CFG_SUPPORT_ROAMING
1925 roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_CONNLIMIT);
1926 #endif /* CFG_SUPPORT_ROAMING */
1927 // reset retry count
1928 prAisFsmInfo->ucConnTrialCount = 0;
1930 // abort connection trial
1931 prConnSettings->fgIsConnReqIssued = FALSE;
1933 eNextState = AIS_STATE_NORMAL_TR;
1934 fgIsTransition = TRUE;
1940 //4 <2> We are not under Roaming Condition.
1941 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1943 //4 <2.a> If we have the matched one
1946 //4 <A> Stored the Selected BSS security cipher. For later asoc req compose IE
1947 prAisBssInfo->u4RsnSelectedGroupCipher =
1948 prBssDesc->u4RsnSelectedGroupCipher;
1949 prAisBssInfo->u4RsnSelectedPairwiseCipher =
1950 prBssDesc->u4RsnSelectedPairwiseCipher;
1951 prAisBssInfo->u4RsnSelectedAKMSuite =
1952 prBssDesc->u4RsnSelectedAKMSuite;
1954 //4 <B> Do STATE transition and update current Operation Mode.
1955 if (prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE) {
1957 prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
1959 /* Record the target BSS_DESC_T for next STATE. */
1960 prAisFsmInfo->prTargetBssDesc = prBssDesc;
1962 /* Transit to channel acquire */
1963 eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
1964 fgIsTransition = TRUE;
1966 // increase connection trial count
1967 prAisFsmInfo->ucConnTrialCount++;
1969 #if CFG_SUPPORT_ADHOC
1970 else if (prBssDesc->eBSSType == BSS_TYPE_IBSS) {
1972 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
1974 /* Record the target BSS_DESC_T for next STATE. */
1975 prAisFsmInfo->prTargetBssDesc = prBssDesc;
1977 eNextState = AIS_STATE_IBSS_MERGE;
1978 fgIsTransition = TRUE;
1980 #endif /* CFG_SUPPORT_ADHOC */
1983 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
1984 fgIsTransition = TRUE;
1987 //4 <2.b> If we don't have the matched one
1990 // increase connection trial count for infrastructure connection
1991 if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
1992 prAisFsmInfo->ucConnTrialCount++;
1996 if (prAisFsmInfo->fgTryScan) {
1997 eNextState = AIS_STATE_LOOKING_FOR;
1999 fgIsTransition = TRUE;
2001 //4 <B> We've do SCAN already, now wait in some STATE.
2003 if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
2005 /* issue reconnect request, and retreat to idle state for scheduling */
2006 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2008 eNextState = AIS_STATE_IDLE;
2009 fgIsTransition = TRUE;
2011 #if CFG_SUPPORT_ADHOC
2012 else if ((prConnSettings->eOPMode == NET_TYPE_IBSS)
2013 || (prConnSettings->eOPMode == NET_TYPE_AUTO_SWITCH)
2014 || (prConnSettings->eOPMode == NET_TYPE_DEDICATED_IBSS)) {
2016 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
2017 prAisFsmInfo->prTargetBssDesc = NULL;
2019 eNextState = AIS_STATE_IBSS_ALONE;
2020 fgIsTransition = TRUE;
2022 #endif /* CFG_SUPPORT_ADHOC */
2025 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
2026 fgIsTransition = TRUE;
2031 //4 <3> We are under Roaming Condition.
2032 else { // prAdapter->eConnectionState == MEDIA_STATE_CONNECTED.
2034 //4 <3.a> This BSS_DESC_T is our AP.
2035 /* NOTE(Kevin 2008/05/16): Following cases will go back to NORMAL_TR.
2036 * CASE I: During Roaming, APP(WZC/NDISTEST) change the connection
2037 * settings. That make we can NOT match the original AP, so the
2038 * prBssDesc is NULL.
2039 * CASE II: The same reason as CASE I. Because APP change the
2040 * eOPMode to other network type in connection setting
2041 * (e.g. NET_TYPE_IBSS), so the BssDesc become the IBSS node.
2042 * (For CASE I/II, before WZC/NDISTEST set the OID_SSID, it will change
2043 * other parameters in connection setting first. So if we do roaming
2044 * at the same time, it will hit these cases.)
2046 * CASE III: Normal case, we can't find other candidate to roam
2047 * out, so only the current AP will be matched.
2049 * CASE VI: Timestamp of the current AP might be reset
2051 if ((!prBssDesc) || /* CASE I */
2052 (prBssDesc->eBSSType != BSS_TYPE_INFRASTRUCTURE) || /* CASE II */
2053 (prBssDesc->fgIsConnected) || /* CASE III */
2054 (EQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID)) /* CASE VI */) {
2057 (prBssDesc->fgIsConnected)) {
2058 ASSERT(EQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2061 /* We already associated with it, go back to NORMAL_TR */
2062 /* TODO(Kevin): Roaming Fail */
2063 #if CFG_SUPPORT_ROAMING
2064 roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_NOCANDIDATE);
2065 #endif /* CFG_SUPPORT_ROAMING */
2067 /* Retreat to NORMAL_TR state */
2068 eNextState = AIS_STATE_NORMAL_TR;
2069 fgIsTransition = TRUE;
2071 //4 <3.b> Try to roam out for JOIN this BSS_DESC_T.
2074 ASSERT(UNEQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2077 //4 <A> Record the target BSS_DESC_T for next STATE.
2078 prAisFsmInfo->prTargetBssDesc = prBssDesc;
2080 // tyhsu: increase connection trial count
2081 prAisFsmInfo->ucConnTrialCount++;
2083 /* Transit to channel acquire */
2084 eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
2085 fgIsTransition = TRUE;
2091 case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2093 DBGLOG(AIS, LOUD, ("SCAN: Idle Begin - Current Time = %ld\n", kalGetTimeTick()));
2095 cnmTimerStartTimer(prAdapter,
2096 &prAisFsmInfo->rBGScanTimer,
2097 SEC_TO_MSEC(prAisFsmInfo->u4SleepInterval));
2099 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2101 if (prAisFsmInfo->u4SleepInterval < AIS_BG_SCAN_INTERVAL_MAX_SEC) {
2102 prAisFsmInfo->u4SleepInterval <<= 1;
2106 case AIS_STATE_SCAN:
2107 case AIS_STATE_ONLINE_SCAN:
2108 case AIS_STATE_LOOKING_FOR:
2110 if(!IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX)) {
2111 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2113 // sync with firmware
2114 nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
2117 /* IE length decision */
2118 if(prAisFsmInfo->u4ScanIELength > 0) {
2119 u2ScanIELen = (UINT_16)prAisFsmInfo->u4ScanIELength;
2122 #if CFG_SUPPORT_WPS2
2123 u2ScanIELen = prAdapter->prGlueInfo->u2WSCIELen;
2129 prScanReqMsg = (P_MSG_SCN_SCAN_REQ)cnmMemAlloc(prAdapter,
2131 OFFSET_OF(MSG_SCN_SCAN_REQ, aucIE) + u2ScanIELen);
2132 if (!prScanReqMsg) {
2133 ASSERT(0); // Can't trigger SCAN FSM
2137 prScanReqMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_REQ;
2138 prScanReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfScanReq;
2139 prScanReqMsg->ucNetTypeIndex = (UINT_8)NETWORK_TYPE_AIS_INDEX;
2141 #if CFG_SUPPORT_RDD_TEST_MODE
2142 prScanReqMsg->eScanType = SCAN_TYPE_PASSIVE_SCAN;
2144 prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN;
2147 if(prAisFsmInfo->eCurrentState == AIS_STATE_SCAN
2148 || prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
2149 if(prAisFsmInfo->ucScanSSIDLen == 0) {
2150 /* Scan for all available SSID */
2151 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_WILDCARD;
2154 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
2155 COPY_SSID(prScanReqMsg->aucSSID,
2156 prScanReqMsg->ucSSIDLength,
2157 prAisFsmInfo->aucScanSSID,
2158 prAisFsmInfo->ucScanSSIDLen);
2162 /* Scan for determined SSID */
2163 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
2164 COPY_SSID(prScanReqMsg->aucSSID,
2165 prScanReqMsg->ucSSIDLength,
2166 prConnSettings->aucSSID,
2167 prConnSettings->ucSSIDLen);
2170 /* check if tethering is running and need to fix on specific channel */
2171 if(cnmAisInfraChannelFixed(prAdapter, &eBand, &ucChannel) == TRUE) {
2172 prScanReqMsg->eScanChannel = SCAN_CHANNEL_SPECIFIED;
2173 prScanReqMsg->ucChannelListNum = 1;
2174 prScanReqMsg->arChnlInfoList[0].eBand
2176 prScanReqMsg->arChnlInfoList[0].ucChannelNum
2179 else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_NULL) {
2180 if(prAdapter->fgEnable5GBand == TRUE) {
2181 prScanReqMsg->eScanChannel = SCAN_CHANNEL_FULL;
2184 prScanReqMsg->eScanChannel = SCAN_CHANNEL_2G4;
2187 else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_2G4) {
2188 prScanReqMsg->eScanChannel = SCAN_CHANNEL_2G4;
2190 else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_5G) {
2191 prScanReqMsg->eScanChannel = SCAN_CHANNEL_5G;
2194 prScanReqMsg->eScanChannel = SCAN_CHANNEL_FULL;
2198 if(prAisFsmInfo->u4ScanIELength > 0) {
2199 kalMemCopy(prScanReqMsg->aucIE, prAisFsmInfo->aucScanIEBuf, prAisFsmInfo->u4ScanIELength);
2202 #if CFG_SUPPORT_WPS2
2203 if(prAdapter->prGlueInfo->u2WSCIELen > 0) {
2204 kalMemCopy(prScanReqMsg->aucIE, &prAdapter->prGlueInfo->aucWSCIE, prAdapter->prGlueInfo->u2WSCIELen);
2209 prScanReqMsg->u2IELen = u2ScanIELen;
2211 mboxSendMsg(prAdapter,
2213 (P_MSG_HDR_T) prScanReqMsg,
2214 MSG_SEND_METHOD_BUF);
2216 prAisFsmInfo->fgTryScan = FALSE; /* Will enable background sleep for infrastructure */
2220 case AIS_STATE_REQ_CHANNEL_JOIN:
2221 /* send message to CNM for acquiring channel */
2222 prMsgChReq = (P_MSG_CH_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_REQ_T));
2224 ASSERT(0); // Can't indicate CNM for channel acquiring
2228 prMsgChReq->rMsgHdr.eMsgId = MID_MNY_CNM_CH_REQ;
2229 prMsgChReq->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
2230 prMsgChReq->ucTokenID = ++prAisFsmInfo->ucSeqNumOfChReq;
2231 prMsgChReq->eReqType = CH_REQ_TYPE_JOIN;
2232 prMsgChReq->u4MaxInterval = AIS_JOIN_CH_REQUEST_INTERVAL;
2233 prMsgChReq->ucPrimaryChannel = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
2234 prMsgChReq->eRfSco = prAisFsmInfo->prTargetBssDesc->eSco;
2235 prMsgChReq->eRfBand = prAisFsmInfo->prTargetBssDesc->eBand;
2236 COPY_MAC_ADDR(prMsgChReq->aucBSSID, prAisFsmInfo->prTargetBssDesc->aucBSSID);
2238 mboxSendMsg(prAdapter,
2240 (P_MSG_HDR_T) prMsgChReq,
2241 MSG_SEND_METHOD_BUF);
2243 prAisFsmInfo->fgIsChannelRequested = TRUE;
2246 case AIS_STATE_JOIN:
2247 aisFsmStateInit_JOIN(prAdapter, prAisFsmInfo->prTargetBssDesc);
2250 #if CFG_SUPPORT_ADHOC
2251 case AIS_STATE_IBSS_ALONE:
2252 aisFsmStateInit_IBSS_ALONE(prAdapter);
2255 case AIS_STATE_IBSS_MERGE:
2256 aisFsmStateInit_IBSS_MERGE(prAdapter, prAisFsmInfo->prTargetBssDesc);
2258 #endif /* CFG_SUPPORT_ADHOC */
2260 case AIS_STATE_NORMAL_TR:
2261 if(prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
2262 /* Don't do anything when rJoinTimeoutTimer is still ticking */
2265 /* 1. Process for pending scan */
2266 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
2267 wlanClearScanningResult(prAdapter);
2268 eNextState = AIS_STATE_ONLINE_SCAN;
2269 fgIsTransition = TRUE;
2271 /* 2. Process for pending roaming scan */
2272 else if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE) == TRUE) {
2273 eNextState = AIS_STATE_LOOKING_FOR;
2274 fgIsTransition = TRUE;
2276 /* 3. Process for pending roaming scan */
2277 else if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE) == TRUE) {
2278 eNextState = AIS_STATE_SEARCH;
2279 fgIsTransition = TRUE;
2285 case AIS_STATE_DISCONNECTING:
2286 /* send for deauth frame for disconnection */
2287 authSendDeauthFrame(prAdapter,
2288 prAisBssInfo->prStaRecOfAP,
2290 REASON_CODE_DEAUTH_LEAVING_BSS,
2291 aisDeauthXmitComplete);
2295 ASSERT(0); /* Make sure we have handle all STATEs */
2300 while (fgIsTransition);
2304 } /* end of aisFsmSteps() */
2307 /*----------------------------------------------------------------------------*/
2315 /*----------------------------------------------------------------------------*/
2317 aisFsmRunEventScanDone (
2318 IN P_ADAPTER_T prAdapter,
2319 IN P_MSG_HDR_T prMsgHdr
2322 P_MSG_SCN_SCAN_DONE prScanDoneMsg;
2323 P_AIS_FSM_INFO_T prAisFsmInfo;
2324 ENUM_AIS_STATE_T eNextState;
2325 UINT_8 ucSeqNumOfCompMsg;
2326 P_CONNECTION_SETTINGS_T prConnSettings;
2328 DEBUGFUNC("aisFsmRunEventScanDone()");
2333 DBGLOG(AIS, LOUD, ("EVENT-SCAN DONE: Current Time = %ld\n", kalGetTimeTick()));
2335 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2336 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2338 prScanDoneMsg = (P_MSG_SCN_SCAN_DONE)prMsgHdr;
2339 ASSERT(prScanDoneMsg->ucNetTypeIndex == (UINT_8)NETWORK_TYPE_AIS_INDEX);
2341 ucSeqNumOfCompMsg = prScanDoneMsg->ucSeqNum;
2342 cnmMemFree(prAdapter, prMsgHdr);
2344 eNextState = prAisFsmInfo->eCurrentState;
2346 if (ucSeqNumOfCompMsg != prAisFsmInfo->ucSeqNumOfScanReq) {
2347 DBGLOG(AIS, WARN, ("SEQ NO of AIS SCN DONE MSG is not matched.\n"));
2350 switch (prAisFsmInfo->eCurrentState) {
2351 case AIS_STATE_SCAN:
2352 prConnSettings->fgIsScanReqIssued = FALSE;
2354 /* reset scan IE buffer */
2355 prAisFsmInfo->u4ScanIELength = 0;
2357 kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2358 eNextState = AIS_STATE_IDLE;
2362 case AIS_STATE_ONLINE_SCAN:
2363 prConnSettings->fgIsScanReqIssued = FALSE;
2365 /* reset scan IE buffer */
2366 prAisFsmInfo->u4ScanIELength = 0;
2368 kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2369 #if CFG_SUPPORT_ROAMING
2370 eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2372 eNextState = AIS_STATE_NORMAL_TR;
2373 #endif /* CFG_SUPPORT_ROAMING */
2377 case AIS_STATE_LOOKING_FOR:
2378 #if CFG_SUPPORT_ROAMING
2379 eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2381 eNextState = AIS_STATE_SEARCH;
2382 #endif /* CFG_SUPPORT_ROAMING */
2391 if (eNextState != prAisFsmInfo->eCurrentState) {
2392 aisFsmSteps(prAdapter, eNextState);
2396 } /* end of aisFsmRunEventScanDone() */
2399 /*----------------------------------------------------------------------------*/
2407 /*----------------------------------------------------------------------------*/
2409 aisFsmRunEventAbort (
2410 IN P_ADAPTER_T prAdapter,
2411 IN P_MSG_HDR_T prMsgHdr
2414 P_MSG_AIS_ABORT_T prAisAbortMsg;
2415 P_AIS_FSM_INFO_T prAisFsmInfo;
2416 UINT_8 ucReasonOfDisconnect;
2417 BOOLEAN fgDelayIndication;
2418 P_CONNECTION_SETTINGS_T prConnSettings;
2420 DEBUGFUNC("aisFsmRunEventAbort()");
2424 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2425 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2427 //4 <1> Extract information of Abort Message and then free memory.
2428 prAisAbortMsg = (P_MSG_AIS_ABORT_T)prMsgHdr;
2429 ucReasonOfDisconnect = prAisAbortMsg->ucReasonOfDisconnect;
2430 fgDelayIndication = prAisAbortMsg->fgDelayIndication;
2432 cnmMemFree(prAdapter, prMsgHdr);
2435 DBGLOG(AIS, LOUD, ("EVENT-ABORT: Current State %s\n",
2436 apucDebugAisState[prAisFsmInfo->eCurrentState]));
2438 DBGLOG(AIS, LOUD, ("[%d] EVENT-ABORT: Current State [%d]\n",
2440 prAisFsmInfo->eCurrentState));
2443 //4 <2> clear previous pending connection request and insert new one
2444 if(ucReasonOfDisconnect == DISCONNECT_REASON_CODE_DEAUTHENTICATED
2445 || ucReasonOfDisconnect == DISCONNECT_REASON_CODE_DISASSOCIATED) {
2446 prConnSettings->fgIsDisconnectedByNonRequest = TRUE;
2449 prConnSettings->fgIsDisconnectedByNonRequest = FALSE;
2452 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
2453 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2455 if(prAisFsmInfo->eCurrentState != AIS_STATE_DISCONNECTING) {
2456 //4 <3> invoke abort handler
2457 aisFsmStateAbort(prAdapter, ucReasonOfDisconnect, fgDelayIndication);
2461 } /* end of aisFsmRunEventAbort() */
2464 /*----------------------------------------------------------------------------*/
2466 * \brief This function handles AIS-FSM abort event/command
2468 * \param[in] prAdapter Pointer of ADAPTER_T
2469 * ucReasonOfDisconnect Reason for disonnection
2470 * fgDelayIndication Option to delay disconnection indication
2474 /*----------------------------------------------------------------------------*/
2477 IN P_ADAPTER_T prAdapter,
2478 UINT_8 ucReasonOfDisconnect,
2479 BOOLEAN fgDelayIndication
2482 P_AIS_FSM_INFO_T prAisFsmInfo;
2483 P_BSS_INFO_T prAisBssInfo;
2484 P_CONNECTION_SETTINGS_T prConnSettings;
2485 BOOLEAN fgIsCheckConnected;
2489 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2490 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2491 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2492 fgIsCheckConnected = FALSE;
2494 //4 <1> Save information of Abort Message and then free memory.
2495 prAisBssInfo->ucReasonOfDisconnect = ucReasonOfDisconnect;
2497 //4 <2> Abort current job.
2498 switch (prAisFsmInfo->eCurrentState) {
2499 case AIS_STATE_IDLE:
2500 case AIS_STATE_SEARCH:
2503 case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2504 /* Do cancel timer */
2505 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
2507 /* in case roaming is triggered */
2508 fgIsCheckConnected = TRUE;
2511 case AIS_STATE_SCAN:
2513 aisFsmStateAbort_SCAN(prAdapter);
2515 /* queue for later handling */
2516 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2517 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2522 case AIS_STATE_LOOKING_FOR:
2524 aisFsmStateAbort_SCAN(prAdapter);
2526 /* in case roaming is triggered */
2527 fgIsCheckConnected = TRUE;
2530 case AIS_STATE_REQ_CHANNEL_JOIN:
2531 /* Release channel to CNM */
2532 aisFsmReleaseCh(prAdapter);
2534 /* in case roaming is triggered */
2535 fgIsCheckConnected = TRUE;
2538 case AIS_STATE_JOIN:
2540 aisFsmStateAbort_JOIN(prAdapter);
2542 /* in case roaming is triggered */
2543 fgIsCheckConnected = TRUE;
2546 #if CFG_SUPPORT_ADHOC
2547 case AIS_STATE_IBSS_ALONE:
2548 case AIS_STATE_IBSS_MERGE:
2549 aisFsmStateAbort_IBSS(prAdapter);
2551 #endif /* CFG_SUPPORT_ADHOC */
2553 case AIS_STATE_ONLINE_SCAN:
2555 aisFsmStateAbort_SCAN(prAdapter);
2557 /* queue for later handling */
2558 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2559 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2562 fgIsCheckConnected = TRUE;
2565 case AIS_STATE_NORMAL_TR:
2566 fgIsCheckConnected = TRUE;
2569 case AIS_STATE_DISCONNECTING:
2570 /* Do abort NORMAL_TR */
2571 aisFsmStateAbort_NORMAL_TR(prAdapter);
2579 if (fgIsCheckConnected &&
2580 (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState)) {
2582 /* switch into DISCONNECTING state for sending DEAUTH if necessary */
2583 if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE &&
2584 prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_NEW_CONNECTION &&
2585 prAisBssInfo->prStaRecOfAP &&
2586 prAisBssInfo->prStaRecOfAP->fgIsInUse) {
2587 aisFsmSteps(prAdapter, AIS_STATE_DISCONNECTING);
2592 /* Do abort NORMAL_TR */
2593 aisFsmStateAbort_NORMAL_TR(prAdapter);
2597 aisFsmDisconnect(prAdapter, fgDelayIndication);
2601 } /* end of aisFsmStateAbort() */
2604 /*----------------------------------------------------------------------------*/
2606 * @brief This function will handle the Join Complete Event from SAA FSM for AIS FSM
2608 * @param[in] prMsgHdr Message of Join Complete of SAA FSM.
2612 /*----------------------------------------------------------------------------*/
2614 aisFsmRunEventJoinComplete (
2615 IN P_ADAPTER_T prAdapter,
2616 IN P_MSG_HDR_T prMsgHdr
2619 P_MSG_JOIN_COMP_T prJoinCompMsg;
2620 P_AIS_FSM_INFO_T prAisFsmInfo;
2621 ENUM_AIS_STATE_T eNextState;
2622 P_STA_RECORD_T prStaRec;
2623 P_SW_RFB_T prAssocRspSwRfb;
2625 DEBUGFUNC("aisFsmRunEventJoinComplete()");
2629 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2630 prJoinCompMsg = (P_MSG_JOIN_COMP_T)prMsgHdr;
2631 prStaRec = prJoinCompMsg->prStaRec;
2632 prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
2634 eNextState = prAisFsmInfo->eCurrentState;
2636 // Check State and SEQ NUM
2637 if (prAisFsmInfo->eCurrentState == AIS_STATE_JOIN) {
2638 P_BSS_INFO_T prAisBssInfo;
2640 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2643 if (prJoinCompMsg->ucSeqNum == prAisFsmInfo->ucSeqNumOfReqMsg) {
2646 //4 <1> JOIN was successful
2647 if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
2649 //1. Reset retry count
2650 prAisFsmInfo->ucConnTrialCount = 0;
2652 // Completion of roaming
2653 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2655 #if CFG_SUPPORT_ROAMING
2656 //2. Deactivate previous BSS
2657 aisFsmRoamingDisconnectPrevAP(prAdapter, prStaRec);
2659 //3. Update bss based on roaming staRec
2660 aisUpdateBssInfoForRoamingAP(prAdapter, prStaRec, prAssocRspSwRfb);
2661 #endif /* CFG_SUPPORT_ROAMING */
2664 //4 <1.1> Change FW's Media State immediately.
2665 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2667 //4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have.
2668 if ((prAisBssInfo->prStaRecOfAP) &&
2669 (prAisBssInfo->prStaRecOfAP != prStaRec) &&
2670 (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
2672 cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
2675 //4 <1.3> Update BSS_INFO_T
2676 aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
2678 //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
2679 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2681 //4 <1.5> Update RSSI if necessary
2682 nicUpdateRSSI(prAdapter, NETWORK_TYPE_AIS_INDEX, (INT_8)(RCPI_TO_dBm(prStaRec->ucRCPI)), 0);
2684 //4 <1.6> Indicate Connected Event to Host immediately.
2685 /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
2686 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2690 UINT_8 aucP2pSsid[] = CTIA_MAGIC_SSID;
2692 if (EQUAL_SSID(aucP2pSsid, CTIA_MAGIC_SSID_LEN, prAisBssInfo->aucSSID, prAisBssInfo->ucSSIDLen)) {
2693 nicEnterCtiaMode(prAdapter, TRUE, FALSE);
2698 #if CFG_SUPPORT_ROAMING
2699 roamingFsmRunEventStart(prAdapter);
2700 #endif /* CFG_SUPPORT_ROAMING */
2702 //4 <1.7> Set the Next State of AIS FSM
2703 eNextState = AIS_STATE_NORMAL_TR;
2705 //4 <2> JOIN was not successful
2707 //4 <2.1> Redo JOIN process with other Auth Type if possible
2708 if (aisFsmStateInit_RetryJOIN(prAdapter, prStaRec) == FALSE) {
2709 P_BSS_DESC_T prBssDesc;
2711 /* 1. Increase Failure Count */
2712 prStaRec->ucJoinFailureCount++;
2714 /* 2. release channel */
2715 aisFsmReleaseCh(prAdapter);
2717 /* 3.1 stop join timeout timer */
2718 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
2720 /* 3.2 reset local variable */
2721 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
2723 prBssDesc = scanSearchBssDescByBssid(prAdapter, prStaRec->aucMacAddr);
2726 ASSERT(prBssDesc->fgIsConnecting);
2729 prBssDesc->fgIsConnecting = FALSE;
2732 /* 3.3 Free STA-REC */
2733 if(prStaRec != prAisBssInfo->prStaRecOfAP) {
2734 cnmStaRecFree(prAdapter, prStaRec, FALSE);
2737 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2738 #if CFG_SUPPORT_ROAMING
2739 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
2740 #endif /* CFG_SUPPORT_ROAMING */
2743 // abort connection trial
2744 prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
2746 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
2747 WLAN_STATUS_CONNECT_INDICATION,
2751 eNextState = AIS_STATE_IDLE;
2759 DBGLOG(AIS, WARN, ("SEQ NO of AIS JOIN COMP MSG is not matched.\n"));
2765 if (eNextState != prAisFsmInfo->eCurrentState) {
2766 aisFsmSteps(prAdapter, eNextState);
2769 if (prAssocRspSwRfb) {
2770 nicRxReturnRFB(prAdapter, prAssocRspSwRfb);
2773 cnmMemFree(prAdapter, prMsgHdr);
2776 } /* end of aisFsmRunEventJoinComplete() */
2779 #if CFG_SUPPORT_ADHOC
2780 /*----------------------------------------------------------------------------*/
2782 * @brief This function will handle the Grant Msg of IBSS Create which was sent by
2783 * CNM to indicate that channel was changed for creating IBSS.
2785 * @param[in] prAdapter Pointer of ADAPTER_T
2789 /*----------------------------------------------------------------------------*/
2792 IN P_ADAPTER_T prAdapter
2795 P_AIS_FSM_INFO_T prAisFsmInfo;
2799 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2803 if (prAisFsmInfo->eCurrentState == AIS_STATE_IBSS_ALONE) {
2804 aisUpdateBssInfoForCreateIBSS(prAdapter);
2810 } /* end of aisFsmCreateIBSS() */
2813 /*----------------------------------------------------------------------------*/
2815 * @brief This function will handle the Grant Msg of IBSS Merge which was sent by
2816 * CNM to indicate that channel was changed for merging IBSS.
2818 * @param[in] prAdapter Pointer of ADAPTER_T
2819 * @param[in] prStaRec Pointer of STA_RECORD_T for merge
2823 /*----------------------------------------------------------------------------*/
2826 IN P_ADAPTER_T prAdapter,
2827 IN P_STA_RECORD_T prStaRec
2830 P_AIS_FSM_INFO_T prAisFsmInfo;
2831 ENUM_AIS_STATE_T eNextState;
2832 P_BSS_INFO_T prAisBssInfo;
2837 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2838 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2842 eNextState = prAisFsmInfo->eCurrentState;
2844 switch (prAisFsmInfo->eCurrentState) {
2845 case AIS_STATE_IBSS_MERGE:
2847 P_BSS_DESC_T prBssDesc;
2849 //4 <1.1> Change FW's Media State immediately.
2850 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2852 //4 <1.2> Deactivate previous Peers' STA_RECORD_T in Driver if have.
2853 bssClearClientList(prAdapter, prAisBssInfo);
2855 //4 <1.3> Unmark connection flag of previous BSS_DESC_T.
2856 if ((prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID)) != NULL) {
2857 prBssDesc->fgIsConnecting = FALSE;
2858 prBssDesc->fgIsConnected = FALSE;
2861 //4 <1.4> Update BSS_INFO_T
2862 aisUpdateBssInfoForMergeIBSS(prAdapter, prStaRec);
2864 //4 <1.5> Add Peers' STA_RECORD_T to Client List
2865 bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2867 //4 <1.6> Activate current Peer's STA_RECORD_T in Driver.
2868 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2869 prStaRec->fgIsMerging = FALSE;
2871 //4 <1.7> Enable other features
2873 //4 <1.8> Indicate Connected Event to Host immediately.
2874 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2876 //4 <1.9> Set the Next State of AIS FSM
2877 eNextState = AIS_STATE_NORMAL_TR;
2879 //4 <1.10> Release channel privilege
2880 aisFsmReleaseCh(prAdapter);
2883 prAdapter->rWifiVar.rSltInfo.prPseudoStaRec = prStaRec;
2892 if (eNextState != prAisFsmInfo->eCurrentState) {
2893 aisFsmSteps(prAdapter, eNextState);
2900 } /* end of aisFsmMergeIBSS() */
2903 /*----------------------------------------------------------------------------*/
2905 * @brief This function will handle the Notification of existing IBSS was found
2908 * @param[in] prMsgHdr Message of Notification of an IBSS was present.
2912 /*----------------------------------------------------------------------------*/
2914 aisFsmRunEventFoundIBSSPeer (
2915 IN P_ADAPTER_T prAdapter,
2916 IN P_MSG_HDR_T prMsgHdr
2919 P_MSG_AIS_IBSS_PEER_FOUND_T prAisIbssPeerFoundMsg;
2920 P_AIS_FSM_INFO_T prAisFsmInfo;
2921 ENUM_AIS_STATE_T eNextState;
2922 P_STA_RECORD_T prStaRec;
2923 P_BSS_INFO_T prAisBssInfo;
2924 P_BSS_DESC_T prBssDesc;
2925 BOOLEAN fgIsMergeIn;
2930 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2931 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2933 prAisIbssPeerFoundMsg = (P_MSG_AIS_IBSS_PEER_FOUND_T)prMsgHdr;
2935 ASSERT(prAisIbssPeerFoundMsg->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX);
2937 prStaRec = prAisIbssPeerFoundMsg->prStaRec;
2940 fgIsMergeIn = prAisIbssPeerFoundMsg->fgIsMergeIn;
2942 cnmMemFree(prAdapter, prMsgHdr);
2945 eNextState = prAisFsmInfo->eCurrentState;
2946 switch (prAisFsmInfo->eCurrentState) {
2947 case AIS_STATE_IBSS_ALONE:
2949 //4 <1> An IBSS Peer 'merged in'.
2952 //4 <1.1> Change FW's Media State immediately.
2953 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2955 //4 <1.2> Add Peers' STA_RECORD_T to Client List
2956 bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2959 //4 <1.3> Mark connection flag of BSS_DESC_T.
2960 if ((prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr)) != NULL) {
2961 prBssDesc->fgIsConnecting = FALSE;
2962 prBssDesc->fgIsConnected = TRUE;
2965 ASSERT(0); // Should be able to find a BSS_DESC_T here.
2968 //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
2969 prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
2971 //4 <1.3> Mark connection flag of BSS_DESC_T.
2972 if ((prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID)) != NULL) {
2973 prBssDesc->fgIsConnecting = FALSE;
2974 prBssDesc->fgIsConnected = TRUE;
2977 ASSERT(0); // Should be able to find a BSS_DESC_T here.
2981 //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
2982 prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
2986 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2987 prStaRec->fgIsMerging = FALSE;
2989 //4 <1.6> sync. to firmware
2990 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
2992 //4 <1.7> Indicate Connected Event to Host immediately.
2993 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2995 //4 <1.8> indicate PM for connected
2996 nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
2998 //4 <1.9> Set the Next State of AIS FSM
2999 eNextState = AIS_STATE_NORMAL_TR;
3001 //4 <1.10> Release channel privilege
3002 aisFsmReleaseCh(prAdapter);
3004 //4 <2> We need 'merge out' to this IBSS
3007 //4 <2.1> Get corresponding BSS_DESC_T
3008 prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3010 prAisFsmInfo->prTargetBssDesc = prBssDesc;
3012 //4 <2.2> Set the Next State of AIS FSM
3013 eNextState = AIS_STATE_IBSS_MERGE;
3018 case AIS_STATE_NORMAL_TR:
3021 //4 <3> An IBSS Peer 'merged in'.
3024 //4 <3.1> Add Peers' STA_RECORD_T to Client List
3025 bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
3028 //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
3029 prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
3031 //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
3032 prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
3035 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
3036 prStaRec->fgIsMerging = FALSE;
3039 //4 <4> We need 'merge out' to this IBSS
3042 //4 <4.1> Get corresponding BSS_DESC_T
3043 prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3045 prAisFsmInfo->prTargetBssDesc = prBssDesc;
3047 //4 <4.2> Set the Next State of AIS FSM
3048 eNextState = AIS_STATE_IBSS_MERGE;
3058 if (eNextState != prAisFsmInfo->eCurrentState) {
3059 aisFsmSteps(prAdapter, eNextState);
3063 } /* end of aisFsmRunEventFoundIBSSPeer() */
3064 #endif /* CFG_SUPPORT_ADHOC */
3067 /*----------------------------------------------------------------------------*/
3069 * @brief This function will indicate the Media State to HOST
3071 * @param[in] eConnectionState Current Media State
3072 * @param[in] fgDelayIndication Set TRUE for postponing the Disconnect Indication.
3076 /*----------------------------------------------------------------------------*/
3078 aisIndicationOfMediaStateToHost (
3079 IN P_ADAPTER_T prAdapter,
3080 ENUM_PARAM_MEDIA_STATE_T eConnectionState,
3081 BOOLEAN fgDelayIndication
3084 EVENT_CONNECTION_STATUS rEventConnStatus;
3085 P_CONNECTION_SETTINGS_T prConnSettings;
3086 P_BSS_INFO_T prAisBssInfo;
3087 P_AIS_FSM_INFO_T prAisFsmInfo;
3089 DEBUGFUNC("aisIndicationOfMediaStateToHost()");
3091 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3092 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3093 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3095 // NOTE(Kevin): Move following line to aisChangeMediaState() macro per CM's request.
3096 //prAisBssInfo->eConnectionState = eConnectionState;
3098 /* For indicating the Disconnect Event only if current media state is
3099 * disconnected and we didn't do indication yet.
3101 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
3102 if (prAisBssInfo->eConnectionStateIndicated == eConnectionState) {
3107 if (!fgDelayIndication) {
3108 //4 <0> Cancel Delay Timer
3109 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
3111 //4 <1> Fill EVENT_CONNECTION_STATUS
3112 rEventConnStatus.ucMediaStatus = (UINT_8)eConnectionState;
3114 if (eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
3115 rEventConnStatus.ucReasonOfDisconnect = DISCONNECT_REASON_CODE_RESERVED;
3117 if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) {
3118 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_INFRA;
3119 rEventConnStatus.u2AID = prAisBssInfo->u2AssocId;
3120 rEventConnStatus.u2ATIMWindow = 0;
3122 else if (prAisBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
3123 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_IBSS;
3124 rEventConnStatus.u2AID = 0;
3125 rEventConnStatus.u2ATIMWindow = prAisBssInfo->u2ATIMWindow;
3131 COPY_SSID(rEventConnStatus.aucSsid,
3132 rEventConnStatus.ucSsidLen,
3133 prConnSettings->aucSSID,
3134 prConnSettings->ucSSIDLen);
3136 COPY_MAC_ADDR(rEventConnStatus.aucBssid, prAisBssInfo->aucBSSID);
3138 rEventConnStatus.u2BeaconPeriod = prAisBssInfo->u2BeaconInterval;
3139 rEventConnStatus.u4FreqInKHz = nicChannelNum2Freq(prAisBssInfo->ucPrimaryChannel);
3141 switch (prAisBssInfo->ucNonHTBasicPhyType) {
3142 case PHY_TYPE_HR_DSSS_INDEX:
3143 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3146 case PHY_TYPE_ERP_INDEX:
3147 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM24;
3150 case PHY_TYPE_OFDM_INDEX:
3151 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM5;
3156 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3161 /* Deactivate previous Peers' STA_RECORD_T in Driver if have. */
3162 bssClearClientList(prAdapter, prAisBssInfo);
3164 #if CFG_PRIVACY_MIGRATION
3165 /* Clear the pmkid cache while media disconnect */
3166 secClearPmkid(prAdapter);
3169 rEventConnStatus.ucReasonOfDisconnect = prAisBssInfo->ucReasonOfDisconnect;
3173 nicMediaStateChange(prAdapter, NETWORK_TYPE_AIS_INDEX, &rEventConnStatus);
3174 prAisBssInfo->eConnectionStateIndicated = eConnectionState;
3177 /* NOTE: Only delay the Indication of Disconnect Event */
3178 ASSERT(eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED);
3180 DBGLOG(AIS, INFO, ("Postpone the indication of Disconnect for %d seconds\n",
3181 prConnSettings->ucDelayTimeOfDisconnectEvent));
3183 cnmTimerStartTimer(prAdapter,
3184 &prAisFsmInfo->rIndicationOfDisconnectTimer,
3185 SEC_TO_MSEC(prConnSettings->ucDelayTimeOfDisconnectEvent));
3189 } /* end of aisIndicationOfMediaStateToHost() */
3192 /*----------------------------------------------------------------------------*/
3194 * @brief This function will indicate an Event of "Media Disconnect" to HOST
3196 * @param[in] u4Param Unused timer parameter
3200 /*----------------------------------------------------------------------------*/
3202 aisPostponedEventOfDisconnTimeout (
3203 IN P_ADAPTER_T prAdapter,
3207 P_BSS_INFO_T prAisBssInfo;
3208 P_CONNECTION_SETTINGS_T prConnSettings;
3210 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3211 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3213 //4 <1> Deactivate previous AP's STA_RECORD_T in Driver if have.
3214 if (prAisBssInfo->prStaRecOfAP) {
3215 //cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
3217 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3220 //4 <2> Remove pending connection request
3221 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3222 prConnSettings->fgIsDisconnectedByNonRequest = TRUE;
3224 //4 <3> Indicate Disconnected Event to Host immediately.
3225 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED, FALSE);
3228 } /* end of aisPostponedEventOfDisconnTimeout() */
3231 /*----------------------------------------------------------------------------*/
3233 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3234 * the association was completed.
3236 * @param[in] prStaRec Pointer to the STA_RECORD_T
3237 * @param[in] prAssocRspSwRfb Pointer to SW RFB of ASSOC RESP FRAME.
3241 /*----------------------------------------------------------------------------*/
3243 aisUpdateBssInfoForJOIN (
3244 IN P_ADAPTER_T prAdapter,
3245 P_STA_RECORD_T prStaRec,
3246 P_SW_RFB_T prAssocRspSwRfb
3249 P_AIS_FSM_INFO_T prAisFsmInfo;
3250 P_BSS_INFO_T prAisBssInfo;
3251 P_CONNECTION_SETTINGS_T prConnSettings;
3252 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
3253 P_BSS_DESC_T prBssDesc;
3257 DEBUGFUNC("aisUpdateBssInfoForJOIN()");
3260 ASSERT(prAssocRspSwRfb);
3262 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3263 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3264 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3265 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prAssocRspSwRfb->pvHeader;
3268 DBGLOG(AIS, INFO, ("Update AIS_BSS_INFO_T and apply settings to MAC\n"));
3271 //3 <1> Update BSS_INFO_T from AIS_FSM_INFO_T or User Settings
3272 //4 <1.1> Setup Operation Mode
3273 prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
3275 //4 <1.2> Setup SSID
3276 COPY_SSID(prAisBssInfo->aucSSID,
3277 prAisBssInfo->ucSSIDLen,
3278 prConnSettings->aucSSID,
3279 prConnSettings->ucSSIDLen);
3281 //4 <1.3> Setup Channel, Band
3282 prAisBssInfo->ucPrimaryChannel = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
3283 prAisBssInfo->eBand = prAisFsmInfo->prTargetBssDesc->eBand;
3286 //3 <2> Update BSS_INFO_T from STA_RECORD_T
3287 //4 <2.1> Save current AP's STA_RECORD_T and current AID
3288 prAisBssInfo->prStaRecOfAP = prStaRec;
3289 prAisBssInfo->u2AssocId = prStaRec->u2AssocId;
3291 //4 <2.2> Setup Capability
3292 prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use AP's Cap Info as BSS Cap Info */
3294 if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3295 prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3298 prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3301 //4 <2.3> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3302 prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3304 prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3306 prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3307 prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3310 //3 <3> Update BSS_INFO_T from SW_RFB_T (Association Resp Frame)
3311 //4 <3.1> Setup BSSID
3312 COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prAssocRspFrame->aucBSSID);
3315 u2IELength = (UINT_16) ((prAssocRspSwRfb->u2PacketLen - prAssocRspSwRfb->u2HeaderLen) -
3316 (OFFSET_OF(WLAN_ASSOC_RSP_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN));
3317 pucIE = prAssocRspFrame->aucInfoElem;
3320 //4 <3.2> Parse WMM and setup QBSS flag
3321 /* Parse WMM related IEs and configure HW CRs accordingly */
3322 mqmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
3324 prAisBssInfo->fgIsQBSS = prStaRec->fgIsQoS;
3326 //3 <4> Update BSS_INFO_T from BSS_DESC_T
3327 prBssDesc = scanSearchBssDescByBssid(prAdapter, prAssocRspFrame->aucBSSID);
3329 prBssDesc->fgIsConnecting = FALSE;
3330 prBssDesc->fgIsConnected = TRUE;
3332 //4 <4.1> Setup MIB for current BSS
3333 prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3336 // should never happen
3340 /* NOTE: Defer ucDTIMPeriod updating to when beacon is received after connection */
3341 prAisBssInfo->ucDTIMPeriod = 0;
3342 prAisBssInfo->u2ATIMWindow = 0;
3344 prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_INFRA;
3346 //4 <4.2> Update HT information and set channel
3347 /* Record HT related parameters in rStaRec and rBssInfo
3348 * Note: it shall be called before nicUpdateBss()
3350 rlmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
3352 //4 <4.3> Sync with firmware for BSS-INFO
3353 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3355 //4 <4.4> *DEFER OPERATION* nicPmIndicateBssConnected() will be invoked
3356 //inside scanProcessBeaconAndProbeResp() after 1st beacon is received
3359 } /* end of aisUpdateBssInfoForJOIN() */
3362 #if CFG_SUPPORT_ADHOC
3363 /*----------------------------------------------------------------------------*/
3365 * @brief This function will create an Ad-Hoc network and start sending Beacon Frames.
3371 /*----------------------------------------------------------------------------*/
3373 aisUpdateBssInfoForCreateIBSS (
3374 IN P_ADAPTER_T prAdapter
3377 P_AIS_FSM_INFO_T prAisFsmInfo;
3378 P_BSS_INFO_T prAisBssInfo;
3379 P_CONNECTION_SETTINGS_T prConnSettings;
3381 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3382 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3383 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3385 if (prAisBssInfo->fgIsBeaconActivated) {
3389 //3 <1> Update BSS_INFO_T per Network Basis
3390 //4 <1.1> Setup Operation Mode
3391 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3393 //4 <1.2> Setup SSID
3394 COPY_SSID(prAisBssInfo->aucSSID,
3395 prAisBssInfo->ucSSIDLen,
3396 prConnSettings->aucSSID,
3397 prConnSettings->ucSSIDLen);
3399 //4 <1.3> Clear current AP's STA_RECORD_T and current AID
3400 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3401 prAisBssInfo->u2AssocId = 0;
3403 //4 <1.4> Setup Channel, Band and Phy Attributes
3404 prAisBssInfo->ucPrimaryChannel = prConnSettings->ucAdHocChannelNum;
3405 prAisBssInfo->eBand = prConnSettings->eAdHocBand;
3407 if (prAisBssInfo->eBand == BAND_2G4) {
3409 prAisBssInfo->ucPhyTypeSet =
3410 prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11BGN; /* Depend on eBand */
3412 prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_MIXED_11BG; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3416 prAisBssInfo->ucPhyTypeSet =
3417 prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11AN; /* Depend on eBand */
3419 prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_11A; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3422 //4 <1.5> Setup MIB for current BSS
3423 prAisBssInfo->u2BeaconInterval = prConnSettings->u2BeaconPeriod;
3424 prAisBssInfo->ucDTIMPeriod = 0;
3425 prAisBssInfo->u2ATIMWindow = prConnSettings->u2AtimWindow;
3427 prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3429 #if CFG_PRIVACY_MIGRATION
3430 if (prConnSettings->eEncStatus == ENUM_ENCRYPTION1_ENABLED ||
3431 prConnSettings->eEncStatus == ENUM_ENCRYPTION2_ENABLED ||
3432 prConnSettings->eEncStatus == ENUM_ENCRYPTION3_ENABLED) {
3433 prAisBssInfo->fgIsProtection = TRUE;
3436 prAisBssInfo->fgIsProtection = FALSE;
3439 prAisBssInfo->fgIsProtection = FALSE;
3442 //3 <2> Update BSS_INFO_T common part
3443 ibssInitForAdHoc(prAdapter, prAisBssInfo);
3448 //4 <3.1> Setup channel and bandwidth
3449 rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3451 //4 <3.2> use command packets to inform firmware
3452 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3454 //4 <3.3> enable beaconing
3455 bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3457 //4 <3.4> Update AdHoc PM parameter
3458 nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_AIS_INDEX);
3460 //3 <4> Set ACTIVE flag.
3461 prAisBssInfo->fgIsBeaconActivated = TRUE;
3462 prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3464 //3 <5> Start IBSS Alone Timer
3465 cnmTimerStartTimer(prAdapter,
3466 &prAisFsmInfo->rIbssAloneTimer,
3467 SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
3471 } /* end of aisCreateIBSS() */
3474 /*----------------------------------------------------------------------------*/
3476 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3477 * the existing IBSS was found.
3479 * @param[in] prStaRec Pointer to the STA_RECORD_T
3483 /*----------------------------------------------------------------------------*/
3485 aisUpdateBssInfoForMergeIBSS (
3486 IN P_ADAPTER_T prAdapter,
3487 IN P_STA_RECORD_T prStaRec
3490 P_AIS_FSM_INFO_T prAisFsmInfo;
3491 P_BSS_INFO_T prAisBssInfo;
3492 P_CONNECTION_SETTINGS_T prConnSettings;
3493 P_BSS_DESC_T prBssDesc;
3494 //UINT_16 u2IELength;
3500 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3501 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3502 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3504 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
3506 if (!prAisBssInfo->fgIsBeaconActivated) {
3508 //3 <1> Update BSS_INFO_T per Network Basis
3509 //4 <1.1> Setup Operation Mode
3510 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3512 //4 <1.2> Setup SSID
3513 COPY_SSID(prAisBssInfo->aucSSID,
3514 prAisBssInfo->ucSSIDLen,
3515 prConnSettings->aucSSID,
3516 prConnSettings->ucSSIDLen);
3518 //4 <1.3> Clear current AP's STA_RECORD_T and current AID
3519 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3520 prAisBssInfo->u2AssocId = 0;
3523 //3 <2> Update BSS_INFO_T from STA_RECORD_T
3524 //4 <2.1> Setup Capability
3525 prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use Peer's Cap Info as IBSS Cap Info */
3527 if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3528 prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3529 prAisBssInfo->fgUseShortPreamble = TRUE;
3532 prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3533 prAisBssInfo->fgUseShortPreamble = FALSE;
3536 // 7.3.1.4 For IBSS, the Short Slot Time subfield shall be set to 0.
3537 prAisBssInfo->fgUseShortSlotTime = FALSE; /* Set to FALSE for AdHoc */
3538 prAisBssInfo->u2CapInfo &= ~CAP_INFO_SHORT_SLOT_TIME;
3540 if (prAisBssInfo->u2CapInfo & CAP_INFO_PRIVACY) {
3541 prAisBssInfo->fgIsProtection= TRUE;
3544 prAisBssInfo->fgIsProtection = FALSE;
3547 //4 <2.2> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3548 prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3550 prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3552 prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3553 prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3555 rateGetDataRatesFromRateSet(prAisBssInfo->u2OperationalRateSet,
3556 prAisBssInfo->u2BSSBasicRateSet,
3557 prAisBssInfo->aucAllSupportedRates,
3558 &prAisBssInfo->ucAllSupportedRatesLen);
3560 //3 <3> X Update BSS_INFO_T from SW_RFB_T (Association Resp Frame)
3563 //3 <4> Update BSS_INFO_T from BSS_DESC_T
3564 prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3566 prBssDesc->fgIsConnecting = FALSE;
3567 prBssDesc->fgIsConnected = TRUE;
3569 //4 <4.1> Setup BSSID
3570 COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prBssDesc->aucBSSID);
3572 //4 <4.2> Setup Channel, Band
3573 prAisBssInfo->ucPrimaryChannel = prBssDesc->ucChannelNum;
3574 prAisBssInfo->eBand = prBssDesc->eBand;
3576 //4 <4.3> Setup MIB for current BSS
3577 prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3578 prAisBssInfo->ucDTIMPeriod = 0;
3579 prAisBssInfo->u2ATIMWindow = 0; /* TBD(Kevin) */
3581 prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3584 // should never happen
3590 //4 <5.1> Find Lowest Basic Rate Index for default TX Rate of MMPDU
3592 UINT_8 ucLowestBasicRateIndex;
3594 if (!rateGetLowestRateIndexFromRateSet(prAisBssInfo->u2BSSBasicRateSet,
3595 &ucLowestBasicRateIndex)) {
3597 if (prAisBssInfo->ucPhyTypeSet & PHY_TYPE_BIT_OFDM) {
3598 ucLowestBasicRateIndex = RATE_6M_INDEX;
3601 ucLowestBasicRateIndex = RATE_1M_INDEX;
3605 prAisBssInfo->ucHwDefaultFixedRateCode =
3606 aucRateIndex2RateCode[prAisBssInfo->fgUseShortPreamble][ucLowestBasicRateIndex];
3609 //4 <5.2> Setup channel and bandwidth
3610 rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3612 //4 <5.3> use command packets to inform firmware
3613 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3615 //4 <5.4> enable beaconing
3616 bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3618 //4 <5.5> Update AdHoc PM parameter
3619 nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
3621 //3 <6> Set ACTIVE flag.
3622 prAisBssInfo->fgIsBeaconActivated = TRUE;
3623 prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3626 } /* end of aisUpdateBssInfoForMergeIBSS() */
3629 /*----------------------------------------------------------------------------*/
3631 * @brief This function will validate the Rx Probe Request Frame and then return
3632 * result to BSS to indicate if need to send the corresponding Probe Response
3633 * Frame if the specified conditions were matched.
3635 * @param[in] prAdapter Pointer to the Adapter structure.
3636 * @param[in] prSwRfb Pointer to SW RFB data structure.
3637 * @param[out] pu4ControlFlags Control flags for replying the Probe Response
3639 * @retval TRUE Reply the Probe Response
3640 * @retval FALSE Don't reply the Probe Response
3642 /*----------------------------------------------------------------------------*/
3644 aisValidateProbeReq (
3645 IN P_ADAPTER_T prAdapter,
3646 IN P_SW_RFB_T prSwRfb,
3647 OUT PUINT_32 pu4ControlFlags
3650 P_WLAN_MAC_MGMT_HEADER_T prMgtHdr;
3651 P_BSS_INFO_T prBssInfo;
3652 P_IE_SSID_T prIeSsid = (P_IE_SSID_T)NULL;
3655 UINT_16 u2Offset = 0;
3656 BOOLEAN fgReplyProbeResp = FALSE;
3660 ASSERT(pu4ControlFlags);
3662 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3664 //4 <1> Parse Probe Req IE and Get IE ptr (SSID, Supported Rate IE, ...)
3665 prMgtHdr = (P_WLAN_MAC_MGMT_HEADER_T)prSwRfb->pvHeader;
3667 u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
3668 pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
3670 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
3671 if (ELEM_ID_SSID == IE_ID(pucIE)) {
3673 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
3674 prIeSsid = (P_IE_SSID_T)pucIE;
3678 } /* end of IE_FOR_EACH */
3680 //4 <2> Check network conditions
3682 if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
3685 ((prIeSsid->ucLength == BC_SSID_LEN) || /* WILDCARD SSID */
3686 EQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen, /* CURRENT SSID */
3687 prIeSsid->aucSSID, prIeSsid->ucLength)) ) {
3688 fgReplyProbeResp = TRUE;
3692 return fgReplyProbeResp;
3694 } /* end of aisValidateProbeReq() */
3696 #endif /* CFG_SUPPORT_ADHOC */
3698 /*----------------------------------------------------------------------------*/
3700 * @brief This function will modify and update necessary information to firmware
3701 * for disconnection handling
3703 * @param[in] prAdapter Pointer to the Adapter structure.
3707 /*----------------------------------------------------------------------------*/
3710 IN P_ADAPTER_T prAdapter,
3711 IN BOOLEAN fgDelayIndication
3714 P_BSS_INFO_T prAisBssInfo;
3718 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3720 nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
3722 #if CFG_SUPPORT_ADHOC
3723 if (prAisBssInfo->fgIsBeaconActivated) {
3724 nicUpdateBeaconIETemplate(prAdapter,
3725 IE_UPD_METHOD_DELETE_ALL,
3726 NETWORK_TYPE_AIS_INDEX,
3731 prAisBssInfo->fgIsBeaconActivated = FALSE;
3735 rlmBssAborted(prAdapter, prAisBssInfo);
3737 //4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed.
3738 if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
3741 UINT_8 aucP2pSsid[] = CTIA_MAGIC_SSID;
3743 if (EQUAL_SSID(aucP2pSsid, CTIA_MAGIC_SSID_LEN, prAisBssInfo->aucSSID, prAisBssInfo->ucSSIDLen)) {
3744 nicEnterCtiaMode(prAdapter, FALSE, FALSE);
3748 if (prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_RADIO_LOST) {
3749 scanRemoveBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3751 /* remove from scanning results as well */
3752 wlanClearBssInScanningResult(prAdapter, prAisBssInfo->aucBSSID);
3754 /* trials for re-association */
3755 if (fgDelayIndication) {
3756 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3757 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
3761 scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3764 if (fgDelayIndication) {
3765 if (OP_MODE_IBSS != prAisBssInfo->eCurrentOPMode) {
3766 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3770 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3774 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3778 //4 <4> Change Media State immediately.
3779 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
3781 //4 <4.1> sync. with firmware
3782 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3784 if (!fgDelayIndication) {
3785 //4 <5> Deactivate previous AP's STA_RECORD_T or all Clients in Driver if have.
3786 if (prAisBssInfo->prStaRecOfAP) {
3787 //cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
3789 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3793 #if CFG_SUPPORT_ROAMING
3794 roamingFsmRunEventAbort(prAdapter);
3796 /* clear pending roaming connection request */
3797 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
3798 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
3799 #endif /* CFG_SUPPORT_ROAMING */
3801 //4 <6> Indicate Disconnected Event to Host
3802 aisIndicationOfMediaStateToHost(prAdapter,
3803 PARAM_MEDIA_STATE_DISCONNECTED,
3807 //4 <7> Trigger AIS FSM
3808 aisFsmSteps(prAdapter, AIS_STATE_IDLE);
3811 } /* end of aisFsmDisconnect() */
3814 /*----------------------------------------------------------------------------*/
3816 * @brief This function will indicate an Event of Scan done Time-Out to AIS FSM.
3818 * @param[in] u4Param Unused timer parameter
3822 /*----------------------------------------------------------------------------*/
3824 aisFsmRunEventScanDoneTimeOut (
3825 IN P_ADAPTER_T prAdapter,
3829 DEBUGFUNC("aisFsmRunEventScanDoneTimeOut()");
3831 P_AIS_FSM_INFO_T prAisFsmInfo;
3832 ENUM_AIS_STATE_T eNextState;
3833 P_CONNECTION_SETTINGS_T prConnSettings;
3837 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3838 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3840 DBGLOG(AIS, STATE, ("aisFsmRunEventScanDoneTimeOut Current[%d]\n",prAisFsmInfo->eCurrentState));
3842 prConnSettings->fgIsScanReqIssued = FALSE;
3843 kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
3844 eNextState = prAisFsmInfo->eCurrentState;
3846 switch (prAisFsmInfo->eCurrentState) {
3847 case AIS_STATE_SCAN:
3848 prAisFsmInfo->u4ScanIELength = 0;
3849 eNextState = AIS_STATE_IDLE;
3851 case AIS_STATE_ONLINE_SCAN:
3852 /* reset scan IE buffer */
3853 prAisFsmInfo->u4ScanIELength = 0;
3854 #if CFG_SUPPORT_ROAMING
3855 eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
3857 eNextState = AIS_STATE_NORMAL_TR;
3858 #endif /* CFG_SUPPORT_ROAMING */
3864 if (eNextState != prAisFsmInfo->eCurrentState) {
3865 aisFsmSteps(prAdapter, eNextState);
3869 } /* end of aisFsmBGSleepTimeout() */
3872 /*----------------------------------------------------------------------------*/
3874 * @brief This function will indicate an Event of "Background Scan Time-Out" to AIS FSM.
3876 * @param[in] u4Param Unused timer parameter
3880 /*----------------------------------------------------------------------------*/
3882 aisFsmRunEventBGSleepTimeOut (
3883 IN P_ADAPTER_T prAdapter,
3887 P_AIS_FSM_INFO_T prAisFsmInfo;
3888 ENUM_AIS_STATE_T eNextState;
3890 DEBUGFUNC("aisFsmRunEventBGSleepTimeOut()");
3892 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3894 eNextState = prAisFsmInfo->eCurrentState;
3896 switch (prAisFsmInfo->eCurrentState) {
3897 case AIS_STATE_WAIT_FOR_NEXT_SCAN:
3898 DBGLOG(AIS, LOUD, ("EVENT - SCAN TIMER: Idle End - Current Time = %ld\n", kalGetTimeTick()));
3900 eNextState = AIS_STATE_LOOKING_FOR;
3902 SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
3910 /* Call aisFsmSteps() when we are going to change AIS STATE */
3911 if (eNextState != prAisFsmInfo->eCurrentState) {
3912 aisFsmSteps(prAdapter, eNextState);
3916 } /* end of aisFsmBGSleepTimeout() */
3919 /*----------------------------------------------------------------------------*/
3921 * @brief This function will indicate an Event of "IBSS ALONE Time-Out" to AIS FSM.
3923 * @param[in] u4Param Unused timer parameter
3927 /*----------------------------------------------------------------------------*/
3929 aisFsmRunEventIbssAloneTimeOut (
3930 IN P_ADAPTER_T prAdapter,
3934 P_AIS_FSM_INFO_T prAisFsmInfo;
3935 ENUM_AIS_STATE_T eNextState;
3937 DEBUGFUNC("aisFsmRunEventIbssAloneTimeOut()");
3939 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3940 eNextState = prAisFsmInfo->eCurrentState;
3942 switch(prAisFsmInfo->eCurrentState) {
3943 case AIS_STATE_IBSS_ALONE:
3945 /* There is no one participate in our AdHoc during this TIMEOUT Interval
3946 * so go back to search for a valid IBSS again.
3949 DBGLOG(AIS, LOUD, ("EVENT-IBSS ALONE TIMER: Start pairing\n"));
3951 prAisFsmInfo->fgTryScan = TRUE;
3954 aisFsmReleaseCh(prAdapter);
3956 /* Pull back to SEARCH to find candidate again */
3957 eNextState = AIS_STATE_SEARCH;
3966 /* Call aisFsmSteps() when we are going to change AIS STATE */
3967 if (eNextState != prAisFsmInfo->eCurrentState) {
3968 aisFsmSteps(prAdapter, eNextState);
3972 } /* end of aisIbssAloneTimeOut() */
3975 /*----------------------------------------------------------------------------*/
3977 * @brief This function will indicate an Event of "Join Time-Out" to AIS FSM.
3979 * @param[in] u4Param Unused timer parameter
3983 /*----------------------------------------------------------------------------*/
3985 aisFsmRunEventJoinTimeout (
3986 IN P_ADAPTER_T prAdapter,
3990 P_AIS_FSM_INFO_T prAisFsmInfo;
3991 ENUM_AIS_STATE_T eNextState;
3993 DEBUGFUNC("aisFsmRunEventJoinTimeout()");
3995 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3996 eNextState = prAisFsmInfo->eCurrentState;
3998 switch(prAisFsmInfo->eCurrentState) {
3999 case AIS_STATE_JOIN:
4000 DBGLOG(AIS, LOUD, ("EVENT- JOIN TIMEOUT\n"));
4002 /* 1. Do abort JOIN */
4003 aisFsmStateAbort_JOIN(prAdapter);
4005 /* 2. Increase Join Failure Count */
4006 prAisFsmInfo->prTargetStaRec->ucJoinFailureCount++;
4009 if(prAisFsmInfo->prTargetStaRec->ucJoinFailureCount < JOIN_MAX_RETRY_FAILURE_COUNT) {
4010 /* 3.1 Retreat to AIS_STATE_SEARCH state for next try */
4011 eNextState = AIS_STATE_SEARCH;
4014 /* 3.2 Retreat to AIS_STATE_WAIT_FOR_NEXT_SCAN state for next try */
4015 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
4018 eNextState = AIS_STATE_IDLE;
4021 case AIS_STATE_NORMAL_TR:
4022 /* 1. release channel */
4023 aisFsmReleaseCh(prAdapter);
4024 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
4026 /* 2. process if there is pending scan */
4027 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
4028 wlanClearScanningResult(prAdapter);
4029 eNextState = AIS_STATE_ONLINE_SCAN;
4035 /* release channel */
4036 aisFsmReleaseCh(prAdapter);
4042 /* Call aisFsmSteps() when we are going to change AIS STATE */
4043 if (eNextState != prAisFsmInfo->eCurrentState) {
4044 aisFsmSteps(prAdapter, eNextState);
4048 } /* end of aisFsmRunEventJoinTimeout() */
4051 #if defined(CFG_TEST_MGMT_FSM) && (CFG_TEST_MGMT_FSM != 0)
4052 /*----------------------------------------------------------------------------*/
4060 /*----------------------------------------------------------------------------*/
4066 P_MSG_AIS_ABORT_T prAisAbortMsg;
4067 P_CONNECTION_SETTINGS_T prConnSettings;
4068 UINT_8 aucSSID[]="pci-11n";
4071 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4073 /* Set Connection Request Issued Flag */
4074 prConnSettings->fgIsConnReqIssued = TRUE;
4075 prConnSettings->ucSSIDLen = ucSSIDLen;
4076 kalMemCopy(prConnSettings->aucSSID, aucSSID, ucSSIDLen);
4078 prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
4079 if (!prAisAbortMsg) {
4081 ASSERT(0); // Can't trigger SCAN FSM
4085 prAisAbortMsg->rMsgHdr.eMsgId = MID_HEM_AIS_FSM_ABORT;
4087 mboxSendMsg(prAdapter,
4089 (P_MSG_HDR_T) prAisAbortMsg,
4090 MSG_SEND_METHOD_BUF);
4092 wifi_send_msg(INDX_WIFI, MSG_ID_WIFI_IST, 0);
4096 #endif /* CFG_TEST_MGMT_FSM */
4099 /*----------------------------------------------------------------------------*/
4101 * \brief This function is used to handle OID_802_11_BSSID_LIST_SCAN
4103 * \param[in] prAdapter Pointer of ADAPTER_T
4104 * \param[in] prSsid Pointer of SSID_T if specified
4105 * \param[in] pucIe Pointer to buffer of extra information elements to be attached
4106 * \param[in] u4IeLength Length of information elements
4110 /*----------------------------------------------------------------------------*/
4113 IN P_ADAPTER_T prAdapter,
4114 IN P_PARAM_SSID_T prSsid,
4116 IN UINT_32 u4IeLength
4119 P_CONNECTION_SETTINGS_T prConnSettings;
4120 P_BSS_INFO_T prAisBssInfo;
4121 P_AIS_FSM_INFO_T prAisFsmInfo;
4123 DEBUGFUNC("aisFsmScanRequest()");
4126 ASSERT(u4IeLength <= MAX_IE_LENGTH);
4128 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4129 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4130 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4132 if (!prConnSettings->fgIsScanReqIssued) {
4133 prConnSettings->fgIsScanReqIssued = TRUE;
4135 if(prSsid == NULL) {
4136 prAisFsmInfo->ucScanSSIDLen = 0;
4139 COPY_SSID(prAisFsmInfo->aucScanSSID,
4140 prAisFsmInfo->ucScanSSIDLen,
4142 (UINT_8)prSsid->u4SsidLen);
4145 if(u4IeLength > 0 && u4IeLength <= MAX_IE_LENGTH ) {
4146 prAisFsmInfo->u4ScanIELength = u4IeLength;
4147 kalMemCopy(prAisFsmInfo->aucScanIEBuf, pucIe, u4IeLength);
4150 prAisFsmInfo->u4ScanIELength = 0;
4153 if(prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR) {
4154 if(prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE
4155 && prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
4156 // 802.1x might not finished yet, pend it for later handling ..
4157 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
4160 if(prAisFsmInfo->fgIsChannelGranted == TRUE) {
4161 DBGLOG(AIS, WARN, ("Scan Request with channel granted for join operation: %d, %d",
4162 prAisFsmInfo->fgIsChannelGranted,
4163 prAisFsmInfo->fgIsChannelRequested));
4166 /* start online scan */
4167 wlanClearScanningResult(prAdapter);
4168 aisFsmSteps(prAdapter, AIS_STATE_ONLINE_SCAN);
4171 else if(prAisFsmInfo->eCurrentState == AIS_STATE_IDLE) {
4172 wlanClearScanningResult(prAdapter);
4173 aisFsmSteps(prAdapter, AIS_STATE_SCAN);
4176 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
4180 DBGLOG(AIS, WARN, ("Scan Request dropped. (state: %d)\n", prAisFsmInfo->eCurrentState));
4184 } /* end of aisFsmScanRequest() */
4187 /*----------------------------------------------------------------------------*/
4189 * \brief This function is invoked when CNM granted channel privilege
4191 * \param[in] prAdapter Pointer of ADAPTER_T
4195 /*----------------------------------------------------------------------------*/
4197 aisFsmRunEventChGrant (
4198 IN P_ADAPTER_T prAdapter,
4199 IN P_MSG_HDR_T prMsgHdr
4202 P_BSS_INFO_T prAisBssInfo;
4203 P_AIS_FSM_INFO_T prAisFsmInfo;
4204 P_MSG_CH_GRANT_T prMsgChGrant;
4206 UINT_32 u4GrantInterval;
4211 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4212 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4213 prMsgChGrant = (P_MSG_CH_GRANT_T)prMsgHdr;
4215 ucTokenID = prMsgChGrant->ucTokenID;
4216 u4GrantInterval = prMsgChGrant->u4GrantInterval;
4218 /* 1. free message */
4219 cnmMemFree(prAdapter, prMsgHdr);
4221 if(prAisFsmInfo->eCurrentState == AIS_STATE_REQ_CHANNEL_JOIN &&
4222 prAisFsmInfo->ucSeqNumOfChReq == ucTokenID) {
4223 /* 2. channel privilege has been approved */
4224 prAisFsmInfo->u4ChGrantedInterval = u4GrantInterval;
4226 /* 3. state transition to join/ibss-alone/ibss-merge */
4227 /* 3.1 set timeout timer in cases join could not be completed */
4228 cnmTimerStartTimer(prAdapter,
4229 &prAisFsmInfo->rJoinTimeoutTimer,
4230 prAisFsmInfo->u4ChGrantedInterval - AIS_JOIN_CH_GRANT_THRESHOLD);
4231 /* 3.2 set local variable to indicate join timer is ticking */
4232 prAisFsmInfo->fgIsInfraChannelFinished = FALSE;
4234 /* 3.3 switch to join state */
4235 aisFsmSteps(prAdapter, AIS_STATE_JOIN);
4237 prAisFsmInfo->fgIsChannelGranted = TRUE;
4239 else { /* mismatched grant */
4240 /* 2. return channel privilege to CNM immediately */
4241 aisFsmReleaseCh(prAdapter);
4245 } /* end of aisFsmRunEventChGrant() */
4248 /*----------------------------------------------------------------------------*/
4250 * \brief This function is to inform CNM that channel privilege
4253 * \param[in] prAdapter Pointer of ADAPTER_T
4257 /*----------------------------------------------------------------------------*/
4260 IN P_ADAPTER_T prAdapter
4263 P_AIS_FSM_INFO_T prAisFsmInfo;
4264 P_MSG_CH_ABORT_T prMsgChAbort;
4268 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4270 if(prAisFsmInfo->fgIsChannelGranted == TRUE
4271 || prAisFsmInfo->fgIsChannelRequested == TRUE) {
4273 prAisFsmInfo->fgIsChannelRequested = FALSE;
4274 prAisFsmInfo->fgIsChannelGranted = FALSE;
4276 /* 1. return channel privilege to CNM immediately */
4277 prMsgChAbort = (P_MSG_CH_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_ABORT_T));
4278 if (!prMsgChAbort) {
4279 ASSERT(0); // Can't release Channel to CNM
4283 prMsgChAbort->rMsgHdr.eMsgId = MID_MNY_CNM_CH_ABORT;
4284 prMsgChAbort->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
4285 prMsgChAbort->ucTokenID = prAisFsmInfo->ucSeqNumOfChReq;
4287 mboxSendMsg(prAdapter,
4289 (P_MSG_HDR_T) prMsgChAbort,
4290 MSG_SEND_METHOD_BUF);
4294 } /* end of aisFsmReleaseCh() */
4297 /*----------------------------------------------------------------------------*/
4299 * \brief This function is to inform AIS that corresponding beacon has not
4300 * been received for a while and probing is not successful
4302 * \param[in] prAdapter Pointer of ADAPTER_T
4306 /*----------------------------------------------------------------------------*/
4308 aisBssBeaconTimeout (
4309 IN P_ADAPTER_T prAdapter
4312 P_BSS_INFO_T prAisBssInfo;
4313 BOOLEAN fgDoAbortIndication = FALSE;
4317 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4319 //4 <1> Diagnose Connection for Beacon Timeout Event
4320 if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
4321 if (OP_MODE_INFRASTRUCTURE == prAisBssInfo->eCurrentOPMode) {
4322 P_STA_RECORD_T prStaRec = prAisBssInfo->prStaRecOfAP;
4325 fgDoAbortIndication = TRUE;
4328 else if (OP_MODE_IBSS == prAisBssInfo->eCurrentOPMode) {
4329 fgDoAbortIndication = TRUE;
4333 //4 <2> invoke abort handler
4334 if (fgDoAbortIndication) {
4335 aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_RADIO_LOST, TRUE);
4339 } /* end of aisBssBeaconTimeout() */
4342 /*----------------------------------------------------------------------------*/
4344 * \brief This function is to inform AIS that DEAUTH frame has been
4345 * sent and thus state machine could go ahead
4347 * \param[in] prAdapter Pointer of ADAPTER_T
4348 * \param[in] prMsduInfo Pointer of MSDU_INFO_T for DEAUTH frame
4349 * \param[in] prAdapter Pointer of ADAPTER_T
4351 * \return WLAN_STATUS_SUCCESS
4353 /*----------------------------------------------------------------------------*/
4355 aisDeauthXmitComplete (
4356 IN P_ADAPTER_T prAdapter,
4357 IN P_MSDU_INFO_T prMsduInfo,
4358 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
4361 P_AIS_FSM_INFO_T prAisFsmInfo;
4365 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4367 if(prAisFsmInfo->eCurrentState == AIS_STATE_DISCONNECTING) {
4368 if(rTxDoneStatus != TX_RESULT_DROPPED_IN_DRIVER) {
4369 aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_NEW_CONNECTION, FALSE);
4373 DBGLOG(AIS, WARN, ("DEAUTH frame transmitted without further handling"));
4376 return WLAN_STATUS_SUCCESS;
4378 } /* end of aisDeauthXmitComplete() */
4380 #if CFG_SUPPORT_ROAMING
4381 /*----------------------------------------------------------------------------*/
4383 * @brief This function will indicate an Event of "Looking for a candidate due to weak signal" to AIS FSM.
4385 * @param[in] u4ReqScan Requesting Scan or not
4389 /*----------------------------------------------------------------------------*/
4391 aisFsmRunEventRoamingDiscovery (
4392 IN P_ADAPTER_T prAdapter,
4396 P_AIS_FSM_INFO_T prAisFsmInfo;
4397 P_CONNECTION_SETTINGS_T prConnSettings;
4398 ENUM_AIS_REQUEST_TYPE_T eAisRequest;
4400 DBGLOG(AIS, LOUD, ("aisFsmRunEventRoamingDiscovery()\n"));
4402 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4403 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4405 /* search candidates by best rssi */
4406 prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
4409 #if CFG_ENABLE_WIFI_DIRECT
4411 /* Check WFD is running */
4412 P_BSS_INFO_T prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
4413 P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T)NULL;
4414 if (prAdapter->fgIsP2PRegistered &&
4415 IS_BSS_ACTIVE(prP2pBssInfo) &&
4416 (prP2pBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT ||
4417 prP2pBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE)) {
4418 DBGLOG(ROAMING, INFO, ("Handle roaming when P2P is GC or GO.\n"));
4419 if (prAdapter->rWifiVar.prP2pFsmInfo) {
4420 prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
4421 if ((prWfdCfgSettings->ucWfdEnable == 1) &&
4422 ((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_DEV_INFO_VALID))) {
4423 DBGLOG(ROAMING, INFO, ("WFD is running. Stop roaming.\n"));
4424 roamingFsmRunEventRoam(prAdapter);
4425 roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_NOCANDIDATE);
4432 } /* fgIsP2PRegistered */
4437 /* results are still new */
4439 roamingFsmRunEventRoam(prAdapter);
4440 eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4443 if(prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN
4444 || prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4445 eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4448 eAisRequest = AIS_REQUEST_ROAMING_SEARCH;
4452 if(prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR && prAisFsmInfo->fgIsInfraChannelFinished == TRUE) {
4453 if(eAisRequest == AIS_REQUEST_ROAMING_SEARCH) {
4454 aisFsmSteps(prAdapter, AIS_STATE_LOOKING_FOR);
4457 aisFsmSteps(prAdapter, AIS_STATE_SEARCH);
4461 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
4462 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
4464 aisFsmInsertRequest(prAdapter, eAisRequest);
4468 } /* end of aisFsmRunEventRoamingDiscovery() */
4470 /*----------------------------------------------------------------------------*/
4472 * @brief Update the time of ScanDone for roaming and transit to Roam state.
4478 /*----------------------------------------------------------------------------*/
4480 aisFsmRoamingScanResultsUpdate (
4481 IN P_ADAPTER_T prAdapter
4484 P_AIS_FSM_INFO_T prAisFsmInfo;
4485 P_ROAMING_INFO_T prRoamingFsmInfo;
4486 ENUM_AIS_STATE_T eNextState;
4488 DBGLOG(AIS, LOUD, ("->aisFsmRoamingScanResultsUpdate()\n"));
4490 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4491 prRoamingFsmInfo = (P_ROAMING_INFO_T)&(prAdapter->rWifiVar.rRoamingInfo);
4493 roamingFsmScanResultsUpdate(prAdapter);
4495 eNextState = prAisFsmInfo->eCurrentState;
4496 if (prRoamingFsmInfo->eCurrentState == ROAMING_STATE_DISCOVERY) {
4497 roamingFsmRunEventRoam(prAdapter);
4498 eNextState = AIS_STATE_SEARCH;
4500 else if (prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4501 eNextState = AIS_STATE_SEARCH;
4503 else if (prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
4504 eNextState = AIS_STATE_NORMAL_TR;
4508 } /* end of aisFsmRoamingScanResultsUpdate() */
4510 /*----------------------------------------------------------------------------*/
4512 * @brief This function will modify and update necessary information to firmware
4513 * for disconnection of last AP before switching to roaming bss.
4515 * @param IN prAdapter Pointer to the Adapter structure.
4516 * prTargetStaRec Target of StaRec of roaming
4520 /*----------------------------------------------------------------------------*/
4522 aisFsmRoamingDisconnectPrevAP (
4523 IN P_ADAPTER_T prAdapter,
4524 IN P_STA_RECORD_T prTargetStaRec
4527 P_BSS_INFO_T prAisBssInfo;
4529 DBGLOG(AIS, LOUD, ("aisFsmRoamingDisconnectPrevAP()"));
4533 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4535 nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
4537 /* Not invoke rlmBssAborted() here to avoid prAisBssInfo->fg40mBwAllowed
4538 * to be reset. RLM related parameters will be reset again when handling
4539 * association response in rlmProcessAssocRsp(). 20110413
4541 //rlmBssAborted(prAdapter, prAisBssInfo);
4543 //4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed.
4544 if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
4545 scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
4548 //4 <4> Change Media State immediately.
4549 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
4551 //4 <4.1> sync. with firmware
4552 prTargetStaRec->ucNetTypeIndex = 0xff; /* Virtial NetType */
4553 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
4554 prTargetStaRec->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX; /* Virtial NetType */
4557 } /* end of aisFsmRoamingDisconnectPrevAP() */
4559 /*----------------------------------------------------------------------------*/
4561 * @brief This function will update the contain of BSS_INFO_T for AIS network once
4562 * the roaming was completed.
4564 * @param IN prAdapter Pointer to the Adapter structure.
4565 * prStaRec StaRec of roaming AP
4570 /*----------------------------------------------------------------------------*/
4572 aisUpdateBssInfoForRoamingAP (
4573 IN P_ADAPTER_T prAdapter,
4574 IN P_STA_RECORD_T prStaRec,
4575 IN P_SW_RFB_T prAssocRspSwRfb
4578 P_BSS_INFO_T prAisBssInfo;
4580 DBGLOG(AIS, LOUD, ("aisUpdateBssInfoForRoamingAP()"));
4584 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4586 //4 <1.1> Change FW's Media State immediately.
4587 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
4589 //4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have.
4590 if ((prAisBssInfo->prStaRecOfAP) &&
4591 (prAisBssInfo->prStaRecOfAP != prStaRec) &&
4592 (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
4593 cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
4596 //4 <1.3> Update BSS_INFO_T
4597 aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
4599 //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
4600 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
4602 //4 <1.6> Indicate Connected Event to Host immediately.
4603 /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
4604 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
4607 } /* end of aisFsmRoamingUpdateBss() */
4609 #endif /* CFG_SUPPORT_ROAMING */
4612 /*----------------------------------------------------------------------------*/
4614 * @brief Check if there is any pending request and remove it (optional)
4623 /*----------------------------------------------------------------------------*/
4625 aisFsmIsRequestPending (
4626 IN P_ADAPTER_T prAdapter,
4627 IN ENUM_AIS_REQUEST_TYPE_T eReqType,
4631 P_AIS_FSM_INFO_T prAisFsmInfo;
4632 P_AIS_REQ_HDR_T prPendingReqHdr, prPendingReqHdrNext;
4635 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4637 /* traverse through pending request list */
4638 LINK_FOR_EACH_ENTRY_SAFE(prPendingReqHdr,
4639 prPendingReqHdrNext,
4640 &(prAisFsmInfo->rPendingReqList),
4643 /* check for specified type */
4644 if(prPendingReqHdr->eReqType == eReqType) {
4645 /* check if need to remove */
4646 if(bRemove == TRUE) {
4647 LINK_REMOVE_KNOWN_ENTRY(&(prAisFsmInfo->rPendingReqList), &(prPendingReqHdr->rLinkEntry));
4649 cnmMemFree(prAdapter, prPendingReqHdr);
4660 /*----------------------------------------------------------------------------*/
4662 * @brief Get next pending request
4666 * @return P_AIS_REQ_HDR_T
4668 /*----------------------------------------------------------------------------*/
4670 aisFsmGetNextRequest (
4671 IN P_ADAPTER_T prAdapter
4674 P_AIS_FSM_INFO_T prAisFsmInfo;
4675 P_AIS_REQ_HDR_T prPendingReqHdr;
4678 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4680 LINK_REMOVE_HEAD(&(prAisFsmInfo->rPendingReqList), prPendingReqHdr, P_AIS_REQ_HDR_T);
4682 return prPendingReqHdr;
4686 /*----------------------------------------------------------------------------*/
4688 * @brief Insert a new request
4696 /*----------------------------------------------------------------------------*/
4698 aisFsmInsertRequest (
4699 IN P_ADAPTER_T prAdapter,
4700 IN ENUM_AIS_REQUEST_TYPE_T eReqType
4703 P_AIS_REQ_HDR_T prAisReq;
4704 P_AIS_FSM_INFO_T prAisFsmInfo;
4707 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4709 prAisReq = (P_AIS_REQ_HDR_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(AIS_REQ_HDR_T));
4712 ASSERT(0); // Can't generate new message
4716 prAisReq->eReqType = eReqType;
4718 /* attach request into pending request list */
4719 LINK_INSERT_TAIL(&prAisFsmInfo->rPendingReqList, &prAisReq->rLinkEntry);
4725 /*----------------------------------------------------------------------------*/
4727 * @brief Flush all pending requests
4733 /*----------------------------------------------------------------------------*/
4735 aisFsmFlushRequest (
4736 IN P_ADAPTER_T prAdapter
4739 P_AIS_REQ_HDR_T prAisReq;
4743 while((prAisReq = aisFsmGetNextRequest(prAdapter)) != NULL) {
4744 cnmMemFree(prAdapter, prAisReq);