2 ** $Id: //Department/DaVinci/BRANCHES/MT662X_593X_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.
11 /*******************************************************************************
12 * Copyright (c) 2009 MediaTek Inc.
14 * All rights reserved. Copying, compilation, modification, distribution
15 * or any other use whatsoever of this material is strictly prohibited
16 * except in accordance with a Software License Agreement with
18 ********************************************************************************
21 /*******************************************************************************
24 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
25 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
26 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
27 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
28 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
29 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
30 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
31 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
32 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
33 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
34 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
35 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
36 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
38 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
39 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
40 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
41 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
42 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
44 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
45 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
46 * OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
47 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
48 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
50 ********************************************************************************
57 ** [WCXRP00001269] [MT6620 Wi-Fi][Driver] cfg80211 porting merge back to DaVinci
58 ** to sync with CFG80211 behavior for CFG80211 will block disconnect request while not staying in connected state
61 ** [WCXRP00001269] [MT6620 Wi-Fi][Driver] cfg80211 porting merge back to DaVinci
65 ** [WCXRP00001269] [MT6620 Wi-Fi][Driver] cfg80211 porting merge back to DaVinci
66 ** cfg80211 support merge back from ALPS.JB to DaVinci - MT6620 Driver v2.3 branch.
69 ** [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT for REASSOCIATED cases as an explicit trigger for Android framework
70 ** remove unnecessary driver workaround for WEP key change detection - it should be done by framework instead
73 * [WCXRP00000913] [MT6620 Wi-Fi] create repository of source code dedicated for MT6620 E6 ASIC
77 * [MT6620 Wi-Fi][Driver] API and behavior modification for preferred band configuration with corresponding network configuration
78 * add wlanSetPreferBandByNetwork() for glue layer to invoke for setting preferred band configuration corresponding to network type.
81 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
82 * Adjust code for DBG and CONFIG_XLOG.
85 * [WCXRP00001120] [MT6620 Wi-Fi][Driver] Modify roaming to AIS state transition from synchronous to asynchronous approach to avoid incomplete state termination
86 * 1. change RDD related compile option brace position.
87 * 2. when roaming is triggered, ask AIS to transit immediately only when AIS is in Normal TR state without join timeout timer ticking
88 * 3. otherwise, insert AIS_REQUEST into pending request queue
91 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
92 * modify the xlog related code.
95 * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT for REASSOCIATED cases as an explicit trigger for Android framework
96 * correct reference to BSSID field in Association-Response frame.
99 * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT for REASSOCIATED cases as an explicit trigger for Android framework
100 * 1. for DEAUTH/DISASSOC cases, indicate for DISCONNECTION immediately.
101 * 2. (Android only) when reassociation-and-non-roaming cases happened, indicate an extra DISCONNECT indication to Android Wi-Fi framework
104 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
105 * adding the code for XLOG.
107 * 10 26 2011 tsaiyuan.hsu
108 * [WCXRP00001064] [MT6620 Wi-Fi][DRV]] add code with roaming awareness when disconnecting AIS network
109 * be aware roaming when disconnecting AIS network.
111 * 10 25 2011 cm.chang
112 * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
113 * STA_REC shall be NULL for Beacon's MSDU
116 * [MT6620 Wi-Fi][Driver] Reduce join failure count limit to 2 for faster re-join for other BSS
117 * 1. short join failure count limit to 2
118 * 2. treat join timeout as kind of join failure as well
121 * [WCXRP00001036] [MT6620 Wi-Fi][Driver][FW] Adding the 802.11w code for MFP
122 * adding the 802.11w related function and define .
124 * 09 30 2011 cm.chang
125 * [WCXRP00001020] [MT6620 Wi-Fi][Driver] Handle secondary channel offset of AP in 5GHz band
128 * 09 20 2011 tsaiyuan.hsu
129 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
130 * change window registry of driver for roaming.
132 * 09 20 2011 cm.chang
133 * [WCXRP00000997] [MT6620 Wi-Fi][Driver][FW] Handle change of BSS preamble type and slot time
134 * Handle client mode about preamble type and slot time
136 * 09 08 2011 tsaiyuan.hsu
137 * [WCXRP00000972] [MT6620 Wi-Fi][DRV]] check if roaming occurs after join failure to avoid state incosistence.
138 * check if roaming occurs after join failure to avoid deactivation of network.
140 * 08 24 2011 chinghwa.yu
141 * [WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
142 * Update RDD test mode cases.
144 * 08 16 2011 tsaiyuan.hsu
145 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
146 * EnableRoaming in registry is deprecated.
148 * 08 16 2011 tsaiyuan.hsu
149 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
150 * use registry to enable or disable roaming.
153 * [WCXRP00000840] [MT6620 Wi-Fi][Driver][AIS] Stop timer for joining when channel is released due to join failure count exceeding limit
154 * stop timer when joining operation is failed due to try count exceeds limitation
157 * [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
158 * do not handle SCAN request immediately after connected to increase the probability of receiving 1st beacon frame.
161 * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
162 * change parameter name from PeerAddr to BSSID
165 * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
166 * 1. specify target's BSSID when requesting channel privilege.
167 * 2. pass BSSID information to firmware domain
170 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
171 * ensure DEAUTH is always sent before establish a new connection
174 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
175 * typo fix: a right brace is missed.
178 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
179 * When RECONNECT request is identified as disconnected, it is necessary to check for pending scan request.
182 * [WCXRP00000757] [MT6620 Wi-Fi][Driver][SCN] take use of RLM API to filter out BSS in disallowed channels
183 * mark fgIsTransition as TRUE for state rolling.
186 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
187 * always check for pending scan after switched into NORMAL_TR state.
190 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
191 * always treat connection request at higher priority over scanning request
193 * 06 09 2011 tsaiyuan.hsu
194 * [WCXRP00000760] [MT5931 Wi-Fi][FW] Refine rxmHandleMacRxDone to reduce code size
195 * move send_auth at rxmHandleMacRxDone in firmware to driver to reduce code size.
198 * [WCXRP00000681] [MT5931][Firmware] HIF code size reduction
199 * eliminate unused parameters for SAA-FSM
202 * [WCXRP00000732] [MT6620 Wi-Fi][AIS] No need to switch back to IDLE state when DEAUTH frame is dropped due to bss disconnection
203 * change SCAN handling behavior when followed by a CONNECT/DISCONNECT requests by pending instead of dropping.
206 * [WCXRP00000732] [MT6620 Wi-Fi][AIS] No need to switch back to IDLE state when DEAUTH frame is dropped due to bss disconnection
207 * when TX DONE status is TX_RESULT_DROPPED_IN_DRIVER, no need to switch back to IDLE state.
209 * 04 14 2011 cm.chang
210 * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
213 * 04 13 2011 george.huang
214 * [WCXRP00000628] [MT6620 Wi-Fi][FW][Driver] Modify U-APSD setting to default OFF
218 * [WCXRP00000575] [MT6620 Wi-Fi][Driver][AIS] reduce memory usage when generating mailbox message for scan request
219 * when there is no IE needed for probe request, then request a smaller memory for mailbox message
221 * 03 17 2011 chinglan.wang
222 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
225 * 03 17 2011 chinglan.wang
226 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
229 * 03 16 2011 tsaiyuan.hsu
230 * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
231 * remove obsolete definition and unused variables.
234 * [WCXRP00000535] [MT6620 Wi-Fi][Driver] Fixed channel operation when AIS and Tethering are operating concurrently
235 * When fixed channel operation is necessary, AIS-FSM would scan and only connect for BSS on the specific channel
237 * 03 09 2011 tsaiyuan.hsu
238 * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
239 * avoid clearing fgIsScanReqIssued so as to add scan results.
241 * 03 07 2011 terry.wu
242 * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
243 * Toggle non-standard debug messages to comments.
245 * 03 04 2011 tsaiyuan.hsu
246 * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
247 * reset retry conter of attemp to connect to ap after completion of join.
250 * [WCXRP00000515] [MT6620 Wi-Fi][Driver] Surpress compiler warning which is identified by GNU compiler collection
251 * surpress compile warning occured when compiled by GNU compiler collection.
254 * [WCXRP00000503] [MT6620 Wi-Fi][Driver] Take RCPI brought by association response as initial RSSI right after connection is built.
255 * use RCPI brought by ASSOC-RESP after connection is built as initial RCPI to avoid using a uninitialized MAC-RX RCPI.
257 * 02 26 2011 tsaiyuan.hsu
258 * [WCXRP00000391] [MT6620 Wi-Fi][FW] Add Roaming Support
259 * not send disassoc or deauth to leaving AP so as to improve performace of roaming.
262 * [WCXRP00000487] [MT6620 Wi-Fi][Driver][AIS] Serve scan and connect request with a queue-based approach to improve response time for scanning request
263 * when handling reconnect request, set fgTryScan as TRUE
266 * [WCXRP00000487] [MT6620 Wi-Fi][Driver][AIS] Serve scan and connect request with a queue-based approach to improve response time for scanning request
267 * handle SCAN and RECONNECT with a FIFO approach.
269 * 02 09 2011 tsaiyuan.hsu
270 * [WCXRP00000392] [MT6620 Wi-Fi][Driver] Add Roaming Support
271 * Check if prRegInfo is null or not before initializing roaming parameters.
274 * [WCXRP00000416] [MT6620 Wi-Fi][Driver] treat "unable to find BSS" as connection trial to prevent infinite reconnection trials
275 * treat "unable to find BSS" as connection trial to prevent infinite reconnection trials.
277 * 01 27 2011 tsaiyuan.hsu
278 * [WCXRP00000392] [MT6620 Wi-Fi][Driver] Add Roaming Support
280 * 1. not support 11r, only use strength of signal to determine roaming.
281 * 2. not enable CFG_SUPPORT_ROAMING until completion of full test.
282 * 3. in 6620, adopt work-around to avoid sign extension problem of cck of hw
283 * 4. assume that change of link quality in smooth way.
285 * 01 26 2011 yuche.tsai
286 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
289 * 01 25 2011 yuche.tsai
290 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
291 * Fix Compile Error when DBG is disabled.
293 * 01 25 2011 yuche.tsai
294 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
295 * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
298 * [WCXRP00000359] [MT6620 Wi-Fi][Driver] add an extra state to ensure DEAUTH frame is always sent
299 * Add an extra state to guarantee DEAUTH frame is sent then connect to new BSS.
300 * This change is due to WAPI AP needs DEAUTH frame as a necessary step in handshaking protocol.
303 * [WCXRP00000307] [MT6620 Wi-Fi][SQA]WHQL test .2c_wlan_adhoc case fail.
304 * [IBSS] when merged in, the bss state should be updated to firmware to pass WHQL adhoc failed item
307 * [WCXRP00000351] [MT6620 Wi-Fi][Driver] remove from scanning result in OID handling layer when the corresponding BSS is disconnected due to beacon timeout
308 * remove from scanning result when the BSS is disconnected due to beacon timeout.
311 * [WCXRP00000337] [MT6620 Wi-FI][Driver] AIS-FSM not to invoke cnmStaRecResetStatus directly 'cause it frees all belonging STA-RECs
312 * do not invoke cnmStaRecResetStatus() directly, nicUpdateBss will do the things after bss is disconnected
315 * [WCXRP00000270] [MT6620 Wi-Fi][Driver] Clear issues after concurrent networking support has been merged
316 * do not need to manipulate prStaRec after indicating BSS disconnection to firmware, 'cause all STA-RECs belongs to BSS has been freed already
319 * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
320 * add DEBUGFUNC() macro invoking for more detailed debugging information
322 * 12 23 2010 george.huang
323 * [WCXRP00000152] [MT6620 Wi-Fi] AP mode power saving function
324 * 1. update WMM IE parsing, with ASSOC REQ handling
325 * 2. extend U-APSD parameter passing from driver to FW
328 * [WCXRP00000270] [MT6620 Wi-Fi][Driver] Clear issues after concurrent networking support has been merged
329 * before BSS disconnection is indicated to firmware, all correlated peer should be cleared and freed
331 * 12 07 2010 cm.chang
332 * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
333 * 1. BSSINFO include RLM parameter
334 * 2. free all sta records when network is disconnected
336 * 11 25 2010 yuche.tsai
338 * Update SLT Function for QoS Support and not be affected by fixed rate function.
341 * [WCXRP00000208] [MT6620 Wi-Fi][Driver] Add scanning with specified SSID to AIS FSM
342 * add scanning with specified SSID facility to AIS-FSM
345 * [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
346 * 1) Query link speed (TX rate) from firmware directly with buffering mechanism to reduce overhead
347 * 2) Remove CNM CH-RECOVER event handling
348 * 3) cfg read/write API renamed with kal prefix for unified naming rules.
351 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000137] [MT6620 Wi-Fi] [FW] Support NIC capability query command
352 * 1) update NVRAM content template to ver 1.02
353 * 2) add compile option for querying NIC capability (default: off)
354 * 3) modify AIS 5GHz support to run-time option, which could be turned on by registry or NVRAM setting
355 * 4) correct auto-rate compiler error under linux (treat warning as error)
356 * 5) simplify usage of NVRAM and REG_INFO_T
357 * 6) add version checking between driver and firmware
360 * [WCXRP00000097] [MT6620 Wi-Fi] [Driver] Fixed the P2P not setting the fgIsChannelExt value make scan not abort
361 * initial the fgIsChannelExt value.
364 * [WCXRP00000087] [MT6620 Wi-Fi][Driver] Cannot connect to 5GHz AP, driver will cause FW assert.
365 * correct erroneous logic: specifying eBand with incompatible eSco
368 * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and replaced by ENUM_NETWORK_TYPE_INDEX_T only
369 * remove ENUM_NETWORK_TYPE_T definitions
371 * 09 27 2010 chinghwa.yu
372 * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000065] Update BoW design and settings
373 * Update BCM/BoW design and settings.
376 * [WCXRP00000049] [MT6620 Wi-Fi][Driver] Adhoc cannot be created successfully.
377 * keep IBSS-ALONE state retrying until further instruction is received
380 * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete and might leads to BSOD when entering RF test with AIS associated
381 * Do a complete reset with STA-REC null checking for RF test re-entry
383 * 09 09 2010 yuche.tsai
385 * Fix NULL IE Beacon issue. Sync Beacon Content to FW before enable beacon.
386 * Both in IBSS Create & IBSS Merge
390 * frequency is in unit of KHz thus no need to divide 1000 once more.
394 * 1) initialize for correct parameter even for disassociation.
395 * 2) AIS-FSM should have a limit on trials to build connection
397 * 09 03 2010 kevin.huang
399 * Refine #include sequence and solve recursive/nested #include issue
403 * eliminate klockwork errors
405 * 08 29 2010 yuche.tsai
407 * Finish SLT TX/RX & Rate Changing Support.
411 * add option for enabling AIS 5GHz scan
415 * [AIS-FSM] IBSS no longer needs to acquire channel for beaconing, RLM/CNM will handle the channel switching when BSS information is updated
417 * 08 25 2010 george.huang
419 * update OID/ registry control path for PM related settings
421 * 08 24 2010 cm.chang
423 * Support RLM initail channel of Ad-hoc, P2P and BOW
425 * 08 20 2010 cm.chang
427 * Migrate RLM code to host from FW
431 * check-in missed files.
433 * 08 12 2010 kevin.huang
435 * Refine bssProcessProbeRequest() and bssSendBeaconProbeResponse()
439 * reset fgIsScanReqIssued when abort request is received right after join completion.
443 * surpress compilation warning.
447 * comment out deprecated members in BSS_INFO, which are only used by firmware rather than driver.
451 * 1) BoW wrapper: use definitions instead of hard-coded constant for error code
452 * 2) AIS-FSM: eliminate use of desired RF parameters, use prTargetBssDesc instead
453 * 3) add handling for RX_PKT_DESTINATION_HOST_WITH_FORWARD for GO-broadcast frames
457 * eliminate u4FreqInKHz usage, combined into rConnections.ucAdHoc*
461 * allocate on MGMT packet for IBSS beaconing.
465 * [AIS-FSM] fix: when join failed, release channel privilege as well
469 * reuse join-abort sub-procedure to reduce code size.
473 * 1) eliminate redundant variable eOPMode in prAdapter->rWlanInfo
474 * 2) change nicMediaStateChange() API prototype
478 * AIS-FSM: when scan request is coming in the 1st 5 seconds of channel privilege period, just pend it til 5-sec. period finishes
482 * AIS-FSM FIX: return channel privilege even when the privilege is not granted yet
483 * QM: qmGetFrameAction() won't assert when corresponding STA-REC index is not found
487 * re-commit code logic being overwriten.
491 * .support the Wi-Fi RSN
495 * 1) re-enable AIS-FSM beacon timeout handling.
496 * 2) scan done API revised
501 * 2) disable beacon timeout handling temporally due to unexpected beacon timeout event.
505 * indicate scan done for linux wireless extension
509 * add AIS-FSM handling for beacon timeout event.
513 * 1) refine AIS-FSM indent.
514 * 2) when entering RF Test mode, flush 802.1X frames as well
515 * 3) when entering D3 state, flush 802.1X frames as well
519 * separate AIS-FSM states into different cases of channel request.
523 * 1) change BG_SCAN to ONLINE_SCAN for consistent term
524 * 2) only clear scanning result when scan is permitted to do
528 * 1) [AIS] when new scan is issued, clear currently available scanning result except the connected one
529 * 2) refine disconnection behaviour when issued during BG-SCAN process
533 * 1) bugfix: do not stop timer for join after switched into normal_tr state, for providing chance for DHCP handshasking
534 * 2) modify rsnPerformPolicySelection() invoking
538 * 1) init AIS_BSS_INFO as channel number = 1 with band = 2.4GHz
543 * update for security supporting.
547 * [WPD00003833] [MT6620 and MT5931] Driver migration.
548 * when IBSS is being merged-in, send command packet to PM for connected indication
552 * [WPD00003833] [MT6620 and MT5931] Driver migration.
553 * Add Ad-Hoc support to AIS-FSM
555 * 07 19 2010 jeffrey.chang
557 * Linux port modification
561 * [WPD00003833] [MT6620 and MT5931] Driver migration.
562 * bugfix for SCN migration
563 * 1) modify QUEUE_CONCATENATE_QUEUES() so it could be used to concatence with an empty queue
564 * 2) before AIS issues scan request, network(BSS) needs to be activated first
565 * 3) only invoke COPY_SSID when using specified SSID for scan
569 * [WPD00003833] [MT6620 and MT5931] Driver migration.
570 * for AIS scanning, driver specifies no extra IE for probe request
574 * [WPD00003833] [MT6620 and MT5931] Driver migration.
575 * driver no longer generates probe request frames
577 * 07 14 2010 yarco.yang
579 * Remove CFG_MQM_MIGRATION
583 * [WPD00003833] [MT6620 and MT5931] Driver migration.
584 * Refine AIS-FSM by divided into more states
586 * 07 13 2010 cm.chang
588 * Rename MSG_CH_RELEASE_T to MSG_CH_ABORT_T
592 * 1) separate AIS_FSM state for two kinds of scanning. (OID triggered scan, and scan-for-connection)
593 * 2) eliminate PRE_BSS_DESC_T, Beacon/PrebResp is now parsed in single pass
594 * 3) implment DRV-SCN module, currently only accepts single scan request, other request will be directly dropped by returning BUSY
596 * 07 09 2010 george.huang
598 * [WPD00001556] Migrate PM variables from FW to driver: for composing QoS Info
602 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
605 * [WPD00003833][MT6620 and MT5931] Driver migration
606 * take use of RLM module for parsing/generating HT IEs for 11n capability
608 * 07 08 2010 cm.chang
609 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
610 * Rename MID_MNY_CNM_CH_RELEASE to MID_MNY_CNM_CH_ABORT
613 * [WPD00003833][MT6620 and MT5931] Driver migration
614 * for first connection, if connecting failed do not enter into scan state.
617 * [WPD00003833][MT6620 and MT5931] Driver migration
618 * once STA-REC is allocated and updated, invoke cnmStaRecChangeState() to sync. with firmware.
620 * 07 06 2010 george.huang
621 * [WPD00001556]Basic power managemenet function
622 * Update arguments for nicUpdateBeaconIETemplate()
625 * [WPD00003833][MT6620 and MT5931] Driver migration
626 * STA-REC is maintained by CNM only.
629 * [WPD00003833][MT6620 and MT5931] Driver migration
630 * remove unused definitions.
633 * [WPD00003833][MT6620 and MT5931] Driver migration
634 * AIS-FSM integration with CNM channel request messages
637 * [WPD00003833][MT6620 and MT5931] Driver migration
638 * implementation of DRV-SCN and related mailbox message handling.
641 * [WPD00003833][MT6620 and MT5931] Driver migration
642 * sync. with CMD/EVENT document ver0.07.
645 * [WPD00003833][MT6620 and MT5931] Driver migration
646 * 1) sync to. CMD/EVENT document v0.03
647 * 2) simplify DTIM period parsing in scan.c only, bss.c no longer parses it again.
648 * 3) send command packet to indicate FW-PM after
649 * a) 1st beacon is received after AIS has connected to an AP
650 * b) IBSS-ALONE has been created
651 * c) IBSS-MERGE has occured
654 * [WPD00003833][MT6620 and MT5931] Driver migration
655 * modify Beacon/ProbeResp to complete parsing,
656 * because host software has looser memory usage restriction
659 * [WPD00003833][MT6620 and MT5931] Driver migration
663 * [WPD00003833][MT6620 and MT5931] Driver migration
664 * comment out RLM APIs by CFG_RLM_MIGRATION.
667 * [WPD00003833][MT6620 and MT5931] Driver migration
668 * 1) add command warpper for STA-REC/BSS-INFO sync.
669 * 2) enhance command packet sending procedure for non-oid part
670 * 3) add command packet definitions for STA-REC/BSS-INFO sync.
672 * 06 21 2010 yarco.yang
673 * [WPD00003837][MT6620]Data Path Refine
674 * Support CFG_MQM_MIGRATION flag
677 * [WPD00003833][MT6620 and MT5931] Driver migration
678 * add scan_fsm into building.
681 * [WPD00003833][MT6620 and MT5931] Driver migration
682 * RSN/PRIVACY compilation flag awareness correction
684 * 06 18 2010 cm.chang
685 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
686 * Provide cnmMgtPktAlloc() and alloc/free function of msg/buf
689 * [WPD00003840][MT6620 5931] Security migration
690 * migration from MT6620 firmware.
693 * [WPD00003833][MT6620 and MT5931] Driver migration
697 * [WPD00003833][MT6620 and MT5931] Driver migration
698 * restore utility function invoking via hem_mbox to direct calls
701 * [WPD00003833][MT6620 and MT5931] Driver migration
702 * auth.c is migrated.
705 * [WPD00003833][MT6620 and MT5931] Driver migration
709 * [WPD00003833][MT6620 and MT5931] Driver migration
710 * 1) migrate assoc.c.
711 * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
712 * 3) add configuration options for CNM_MEM and RSN modules
713 * 4) add data path for management frames
714 * 5) eliminate rPacketInfo of MSDU_INFO_T
717 * [WPD00003833][MT6620 and MT5931] Driver migration
718 * change to enqueue TX frame infinitely.
721 * [WPD00003833][MT6620 and MT5931] Driver migration
722 * 1) eliminate CFG_CMD_EVENT_VERSION_0_9
723 * 2) when disconnected, indicate nic directly (no event is needed)
726 * [WPD00003833][MT6620 and MT5931] Driver migration
727 * add buildable & linkable ais_fsm.c
729 * related reference are still waiting to be resolved
731 * 06 01 2010 cm.chang
732 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
733 * Add conditionial compiling flag to choose default available bandwidth
735 * 05 28 2010 kevin.huang
736 * [BORA00000794][WIFISYS][New Feature]Power Management Support
737 * Add ClientList handling API - bssClearClientList, bssAddStaRecToClientList
739 * 05 24 2010 kevin.huang
740 * [BORA00000794][WIFISYS][New Feature]Power Management Support
741 * Refine authSendAuthFrame() for NULL STA_RECORD_T case and minimum deauth interval.
743 * 05 21 2010 kevin.huang
744 * [BORA00000794][WIFISYS][New Feature]Power Management Support
745 * Fix compile error if CFG_CMD_EVENT_VER_009 == 0 for prEventConnStatus->ucNetworkType.
747 * 05 21 2010 kevin.huang
748 * [BORA00000794][WIFISYS][New Feature]Power Management Support
749 * Refine txmInitWtblTxRateTable() - set TX initial rate according to AP's operation rate set
751 * 05 17 2010 kevin.huang
752 * [BORA00000794][WIFISYS][New Feature]Power Management Support
753 * Call pmAbort() and add ucNetworkType field in EVENT_CONNECTION_STATUS
755 * 05 14 2010 kevin.huang
756 * [BORA00000794][WIFISYS][New Feature]Power Management Support
757 * Fix compile warning - define of MQM_WMM_PARSING was removed
759 * 05 12 2010 kevin.huang
760 * [BORA00000794][WIFISYS][New Feature]Power Management Support
761 * Add Power Management - Legacy PS-POLL support.
763 * 04 28 2010 tehuang.liu
764 * [BORA00000605][WIFISYS] Phase3 Integration
765 * Removed the use of compiling flag MQM_WMM_PARSING
767 * 04 27 2010 kevin.huang
768 * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
772 * 04 27 2010 kevin.huang
773 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
774 * Add Set Slot Time and Beacon Timeout Support for AdHoc Mode
776 * 04 19 2010 kevin.huang
777 * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
778 * Add Send Deauth for Class 3 Error and Leave Network Support
781 * [BORA00000680][MT6620] Support the statistic for Microsoft os query
782 * fixed the protected bit at cap info for ad-hoc.
784 * 04 13 2010 kevin.huang
785 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
786 * Add new HW CH macro support
788 * 04 07 2010 chinghwa.yu
789 * [BORA00000563]Add WiFi CoEx BCM module
790 * Add TX Power Control RCPI function.
793 * [BORA00000605][WIFISYS] Phase3 Integration
794 * move the wlan table alloc / free to change state function.
797 * [BORA00000676][MT6620] Support the frequency setting and query at build connection / connection event
798 * modify the build connection and status event structure bu CMD_EVENT doc 0.09 draft, default is disable.
801 * [BORA00000605][WIFISYS] Phase3 Integration
802 * fixed some WHQL testing error.
804 * 03 24 2010 kevin.huang
805 * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
806 * Add Set / Unset POWER STATE in AIS Network
808 * 03 16 2010 kevin.huang
809 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
812 * 03 10 2010 kevin.huang
813 * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
814 * Add Channel Manager for arbitration of JOIN and SCAN Req
816 * 03 03 2010 kevin.huang
817 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
818 * Add PHY_CONFIG to change Phy Type
820 * 03 03 2010 chinghwa.yu
821 * [BORA00000563]Add WiFi CoEx BCM module
822 * Use bcmWiFiNotify to replace wifi_send_msg to pass infomation to BCM module.
824 * 03 03 2010 chinghwa.yu
825 * [BORA00000563]Add WiFi CoEx BCM module
826 * Remove wmt_task definition and add PTA function.
828 * 03 02 2010 tehuang.liu
829 * [BORA00000569][WIFISYS] Phase 2 Integration Test
830 * Init TXM and MQM testing procedures in aisFsmRunEventJoinComplete()
832 * 03 01 2010 tehuang.liu
833 * [BORA00000569][WIFISYS] Phase 2 Integration Test
834 * Modified aisUpdateBssInfo() to call TXM's functions for setting WTBL TX parameters
837 * [BORA00000605][WIFISYS] Phase3 Integration
838 * clear the pmkid cache while indicate media disconnect.
840 * 02 26 2010 tehuang.liu
841 * [BORA00000569][WIFISYS] Phase 2 Integration Test
844 * 02 26 2010 tehuang.liu
845 * [BORA00000569][WIFISYS] Phase 2 Integration Test
846 * Enabled MQM parsing WMM IEs for non-AP mode
848 * 02 26 2010 kevin.huang
849 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
850 * Remove CFG_TEST_VIRTUAL_CMD and add support of Driver STA_RECORD_T activation
853 * [BORA00000605][WIFISYS] Phase3 Integration
854 * use the Rx0 dor event indicate.
856 * 02 23 2010 kevin.huang
857 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
858 * Support dynamic channel selection
861 * [BORA00000621][MT6620 Wi-Fi] Add the RSSI indicate to avoid XP stalled for query rssi value
862 * Adding the RSSI event support, using the HAL function to get the rcpi value and tranlsate to RSSI and indicate to driver
864 * 02 12 2010 cm.chang
865 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
866 * Use bss info array for concurrent handle
868 * 02 05 2010 kevin.huang
869 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
870 * Revise data structure to share the same BSS_INFO_T for avoiding coding error
872 * 02 04 2010 kevin.huang
873 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
874 * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
876 * 01 27 2010 tehuang.liu
877 * [BORA00000569][WIFISYS] Phase 2 Integration Test
878 * Set max AMDPU size supported by the peer to 64 KB, removed mqmInit() and mqmTxSendAddBaReq() function calls in aisUpdateBssInfo()
881 * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
882 * add and fixed some security function.
884 * 01 22 2010 cm.chang
885 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
886 * Support protection and bandwidth switch
888 * 01 20 2010 kevin.huang
889 * [BORA00000569][WIFISYS] Phase 2 Integration Test
890 * Add PHASE_2_INTEGRATION_WORK_AROUND and CFG_SUPPORT_BCM flags
892 * 01 15 2010 tehuang.liu
893 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
894 * Configured the AMPDU factor to 3 for the APu1rwduu`wvpghlqg|q`mpdkb+ilp
896 * 01 14 2010 chinghwa.yu
897 * [BORA00000563]Add WiFi CoEx BCM module
898 * Add WiFi BCM module for the 1st time.
900 * 01 11 2010 kevin.huang
901 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
902 * Add Deauth and Disassoc Handler
904 * 01 07 2010 kevin.huang
905 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
906 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
908 * Refine JOIN Complete and seperate the function of Media State indication
910 * 01 04 2010 tehuang.liu
911 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
912 * For working out the first connection Chariot-verified version
914 * 12 18 2009 cm.chang
915 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
918 * Dec 10 2009 mtk01088
919 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
920 * adding the sample code to update the wlan table rate,
922 * Dec 10 2009 mtk01104
923 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
924 * Different function prototype of wifi_send_msg()
926 * Dec 9 2009 mtk01104
927 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
928 * Call rlm related function to process HT info when join complete
930 * Dec 9 2009 mtk01088
931 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
932 * default the acquired wlan table entry code off
934 * Dec 9 2009 mtk01088
935 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
936 * adding the code to acquired the wlan table entry, and a sample code to update the BA bit at table
938 * Dec 7 2009 mtk01461
939 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
940 * Fix the problem of prSwRfb overwrited by event packet in aisFsmRunEventJoinComplete()
942 * Dec 4 2009 mtk01088
943 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
944 * adding the code to integrate the security related code
946 * Dec 3 2009 mtk01461
947 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
948 * Remove redundant declaration
950 * Dec 3 2009 mtk01461
951 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
952 * Add code for JOIN init and JOIN complete
954 * Nov 30 2009 mtk01461
955 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
956 * Rename u4RSSI to i4RSSI
958 * Nov 30 2009 mtk01461
959 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
960 * Revise ENUM_MEDIA_STATE to ENUM_PARAM_MEDIA_STATE
962 * Nov 30 2009 mtk01461
963 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
964 * Add fgIsScanReqIssued to CONNECTION_SETTINGS_T
966 * Nov 26 2009 mtk01461
967 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
968 * Revise Virtual CMD handler due to structure changed
970 * Nov 25 2009 mtk01461
971 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
972 * Add Virtual CMD & RESP for testing CMD PATH
974 * Nov 23 2009 mtk01461
975 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
976 * Add aisFsmInitializeConnectionSettings()
978 * Nov 20 2009 mtk01461
979 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
980 * Add CFG_TEST_MGMT_FSM flag for aisFsmTest()
982 * Nov 16 2009 mtk01461
983 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
987 /*******************************************************************************
988 * C O M P I L E R F L A G S
989 ********************************************************************************
992 /*******************************************************************************
993 * E X T E R N A L R E F E R E N C E S
994 ********************************************************************************
998 /*******************************************************************************
1000 ********************************************************************************
1002 #define AIS_ROAMING_CONNECTION_TRIAL_LIMIT 2
1004 /*******************************************************************************
1006 ********************************************************************************
1009 /*******************************************************************************
1010 * P U B L I C D A T A
1011 ********************************************************************************
1014 /*******************************************************************************
1015 * P R I V A T E D A T A
1016 ********************************************************************************
1019 /*lint -save -e64 Type mismatch */
1020 static PUINT_8 apucDebugAisState[AIS_STATE_NUM] = {
1021 (PUINT_8)DISP_STRING("AIS_STATE_IDLE"),
1022 (PUINT_8)DISP_STRING("AIS_STATE_SEARCH"),
1023 (PUINT_8)DISP_STRING("AIS_STATE_SCAN"),
1024 (PUINT_8)DISP_STRING("AIS_STATE_ONLINE_SCAN"),
1025 (PUINT_8)DISP_STRING("AIS_STATE_LOOKING_FOR"),
1026 (PUINT_8)DISP_STRING("AIS_STATE_WAIT_FOR_NEXT_SCAN"),
1027 (PUINT_8)DISP_STRING("AIS_STATE_REQ_CHANNEL_JOIN"),
1028 (PUINT_8)DISP_STRING("AIS_STATE_JOIN"),
1029 (PUINT_8)DISP_STRING("AIS_STATE_IBSS_ALONE"),
1030 (PUINT_8)DISP_STRING("AIS_STATE_IBSS_MERGE"),
1031 (PUINT_8)DISP_STRING("AIS_STATE_NORMAL_TR"),
1032 (PUINT_8)DISP_STRING("AIS_STATE_DISCONNECTING")
1037 /*******************************************************************************
1039 ********************************************************************************
1042 /*******************************************************************************
1043 * F U N C T I O N D E C L A R A T I O N S
1044 ********************************************************************************
1047 /*******************************************************************************
1049 ********************************************************************************
1051 /*----------------------------------------------------------------------------*/
1053 * @brief the function is used to initialize the value of the connection settings for
1060 /*----------------------------------------------------------------------------*/
1062 aisInitializeConnectionSettings (
1063 IN P_ADAPTER_T prAdapter,
1064 IN P_REG_INFO_T prRegInfo
1067 P_CONNECTION_SETTINGS_T prConnSettings;
1068 UINT_8 aucAnyBSSID[] = BC_BSSID;
1069 UINT_8 aucZeroMacAddr[] = NULL_MAC_ADDR;
1071 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1073 /* Setup default values for operation */
1074 COPY_MAC_ADDR(prConnSettings->aucMacAddress, aucZeroMacAddr);
1076 prConnSettings->ucDelayTimeOfDisconnectEvent = AIS_DELAY_TIME_OF_DISCONNECT_SEC;
1078 COPY_MAC_ADDR(prConnSettings->aucBSSID, aucAnyBSSID);
1079 prConnSettings->fgIsConnByBssidIssued = FALSE;
1081 prConnSettings->fgIsConnReqIssued = FALSE;
1082 prConnSettings->fgIsDisconnectedByNonRequest = FALSE;
1084 prConnSettings->ucSSIDLen = 0;
1086 prConnSettings->eOPMode = NET_TYPE_INFRA;
1088 prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
1091 prConnSettings->ucAdHocChannelNum = (UINT_8) nicFreq2ChannelNum(prRegInfo->u4StartFreq);
1092 prConnSettings->eAdHocBand = prRegInfo->u4StartFreq < 5000000 ? BAND_2G4 : BAND_5G;
1093 prConnSettings->eAdHocMode = (ENUM_PARAM_AD_HOC_MODE_T) (prRegInfo->u4AdhocMode);
1096 prConnSettings->eAuthMode = AUTH_MODE_OPEN;
1098 prConnSettings->eEncStatus = ENUM_ENCRYPTION_DISABLED;
1100 prConnSettings->fgIsScanReqIssued = FALSE;
1102 /* MIB attributes */
1103 prConnSettings->u2BeaconPeriod = DOT11_BEACON_PERIOD_DEFAULT;
1105 prConnSettings->u2RTSThreshold = DOT11_RTS_THRESHOLD_DEFAULT;
1107 prConnSettings->u2DesiredNonHTRateSet = RATE_SET_ALL_ABG;
1109 //prConnSettings->u4FreqInKHz; /* Center frequency */
1113 prConnSettings->bmfgApsdEnAc = PM_UAPSD_NONE;
1115 secInit(prAdapter, NETWORK_TYPE_AIS_INDEX);
1118 prConnSettings->fgIsEnableRoaming = FALSE;
1119 #if CFG_SUPPORT_ROAMING
1121 prConnSettings->fgIsEnableRoaming = ((prRegInfo->fgDisRoaming > 0)?(FALSE):(TRUE));
1123 #endif /* CFG_SUPPORT_ROAMING */
1125 prConnSettings->fgIsAdHocQoSEnable = FALSE;
1127 prConnSettings->eDesiredPhyConfig = PHY_CONFIG_802_11ABGN;
1129 /* Set default bandwidth modes */
1130 prConnSettings->uc2G4BandwidthMode = CONFIG_BW_20M;
1131 prConnSettings->uc5GBandwidthMode = CONFIG_BW_20_40M;
1134 } /* end of aisFsmInitializeConnectionSettings() */
1137 /*----------------------------------------------------------------------------*/
1139 * @brief the function is used to initialize the value in AIS_FSM_INFO_T for
1146 /*----------------------------------------------------------------------------*/
1149 IN P_ADAPTER_T prAdapter
1152 P_AIS_FSM_INFO_T prAisFsmInfo;
1153 P_BSS_INFO_T prAisBssInfo;
1154 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1156 DEBUGFUNC("aisFsmInit()");
1157 DBGLOG(SW1, INFO, ("->aisFsmInit()\n"));
1159 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1160 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1161 prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1163 //4 <1> Initiate FSM
1164 prAisFsmInfo->ePreviousState = AIS_STATE_IDLE;
1165 prAisFsmInfo->eCurrentState = AIS_STATE_IDLE;
1167 prAisFsmInfo->ucAvailableAuthTypes = 0;
1169 prAisFsmInfo->prTargetBssDesc = (P_BSS_DESC_T)NULL;
1171 prAisFsmInfo->ucSeqNumOfReqMsg = 0;
1172 prAisFsmInfo->ucSeqNumOfChReq = 0;
1173 prAisFsmInfo->ucSeqNumOfScanReq = 0;
1175 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1176 #if CFG_SUPPORT_ROAMING
1177 prAisFsmInfo->fgIsRoamingScanPending = FALSE;
1178 #endif /* CFG_SUPPORT_ROAMING */
1179 prAisFsmInfo->fgIsChannelRequested = FALSE;
1180 prAisFsmInfo->fgIsChannelGranted = FALSE;
1182 //4 <1.1> Initiate FSM - Timer INIT
1183 cnmTimerInitTimer(prAdapter,
1184 &prAisFsmInfo->rBGScanTimer,
1185 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventBGSleepTimeOut,
1188 cnmTimerInitTimer(prAdapter,
1189 &prAisFsmInfo->rIbssAloneTimer,
1190 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventIbssAloneTimeOut,
1193 cnmTimerInitTimer(prAdapter,
1194 &prAisFsmInfo->rIndicationOfDisconnectTimer,
1195 (PFN_MGMT_TIMEOUT_FUNC)aisPostponedEventOfDisconnTimeout,
1198 cnmTimerInitTimer(prAdapter,
1199 &prAisFsmInfo->rJoinTimeoutTimer,
1200 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventJoinTimeout,
1203 //4 <1.2> Initiate PWR STATE
1204 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1207 //4 <2> Initiate BSS_INFO_T - common part
1208 BSS_INFO_INIT(prAdapter, NETWORK_TYPE_AIS_INDEX);
1209 COPY_MAC_ADDR(prAisBssInfo->aucOwnMacAddr, prAdapter->rWifiVar.aucMacAddress);
1211 //4 <3> Initiate BSS_INFO_T - private part
1213 prAisBssInfo->eBand = BAND_2G4;
1214 prAisBssInfo->ucPrimaryChannel = 1;
1215 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
1217 //4 <4> Allocate MSDU_INFO_T for Beacon
1218 prAisBssInfo->prBeacon = cnmMgtPktAlloc(prAdapter,
1219 OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem[0]) + MAX_IE_LENGTH);
1221 if (prAisBssInfo->prBeacon) {
1222 prAisBssInfo->prBeacon->eSrc = TX_PACKET_MGMT;
1223 prAisBssInfo->prBeacon->ucStaRecIndex = 0xFF; /* NULL STA_REC */
1230 prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = PM_UAPSD_ALL;
1231 prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC = PM_UAPSD_ALL;
1232 prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = WMM_MAX_SP_LENGTH_2;
1234 if (prAdapter->u4UapsdAcBmp == 0) {
1235 prAdapter->u4UapsdAcBmp = CFG_INIT_UAPSD_AC_BMP;
1236 //ASSERT(prAdapter->u4UapsdAcBmp);
1238 prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = (UINT_8)prAdapter->u4UapsdAcBmp;
1239 prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC =(UINT_8) prAdapter->u4UapsdAcBmp;
1240 prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = (UINT_8)prAdapter->u4MaxSpLen;
1243 /* request list initialization */
1244 LINK_INITIALIZE(&prAisFsmInfo->rPendingReqList);
1246 //DBGPRINTF("[2] ucBmpDeliveryAC:0x%x, ucBmpTriggerAC:0x%x, ucUapsdSp:0x%x",
1247 //prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC,
1248 //prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC,
1249 //prAisBssInfo->rPmProfSetupInfo.ucUapsdSp);
1252 } /* end of aisFsmInit() */
1254 /*----------------------------------------------------------------------------*/
1256 * @brief the function is used to uninitialize the value in AIS_FSM_INFO_T for
1263 /*----------------------------------------------------------------------------*/
1266 IN P_ADAPTER_T prAdapter
1269 P_AIS_FSM_INFO_T prAisFsmInfo;
1270 P_BSS_INFO_T prAisBssInfo;
1271 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1273 DEBUGFUNC("aisFsmUninit()");
1274 DBGLOG(SW1, INFO, ("->aisFsmUninit()\n"));
1276 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1277 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1278 prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1280 //4 <1> Stop all timers
1281 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
1282 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
1283 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
1284 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1286 //4 <2> flush pending request
1287 aisFsmFlushRequest(prAdapter);
1289 //4 <3> Reset driver-domain BSS-INFO
1290 if(prAisBssInfo->prBeacon) {
1291 cnmMgtPktFree(prAdapter, prAisBssInfo->prBeacon);
1292 prAisBssInfo->prBeacon = NULL;
1295 #if CFG_SUPPORT_802_11W
1296 rsnStopSaQuery(prAdapter);
1300 } /* end of aisFsmUninit() */
1303 /*----------------------------------------------------------------------------*/
1305 * @brief Initialization of JOIN STATE
1307 * @param[in] prBssDesc The pointer of BSS_DESC_T which is the BSS we will try to join with.
1311 /*----------------------------------------------------------------------------*/
1313 aisFsmStateInit_JOIN (
1314 IN P_ADAPTER_T prAdapter,
1315 P_BSS_DESC_T prBssDesc
1318 P_AIS_FSM_INFO_T prAisFsmInfo;
1319 P_BSS_INFO_T prAisBssInfo;
1320 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1321 P_CONNECTION_SETTINGS_T prConnSettings;
1322 P_STA_RECORD_T prStaRec;
1323 P_MSG_JOIN_REQ_T prJoinReqMsg;
1325 DEBUGFUNC("aisFsmStateInit_JOIN()");
1327 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1328 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1329 prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1330 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1334 //4 <1> We are going to connect to this BSS.
1335 prBssDesc->fgIsConnecting = TRUE;
1338 //4 <2> Setup corresponding STA_RECORD_T
1339 prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1341 NETWORK_TYPE_AIS_INDEX,
1344 prAisFsmInfo->prTargetStaRec = prStaRec;
1346 //4 <2.1> sync. to firmware domain
1347 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1349 //4 <3> Update ucAvailableAuthTypes which we can choice during SAA
1350 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1352 prStaRec->fgIsReAssoc = FALSE;
1354 switch (prConnSettings->eAuthMode) {
1355 case AUTH_MODE_OPEN: /* Note: Omit break here. */
1357 case AUTH_MODE_WPA_PSK:
1358 case AUTH_MODE_WPA2:
1359 case AUTH_MODE_WPA2_PSK:
1360 prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_OPEN_SYSTEM;
1364 case AUTH_MODE_SHARED:
1365 prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_SHARED_KEY;
1369 case AUTH_MODE_AUTO_SWITCH:
1370 DBGLOG(AIS, LOUD, ("JOIN INIT: eAuthMode == AUTH_MODE_AUTO_SWITCH\n"));
1371 prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)(AUTH_TYPE_OPEN_SYSTEM |
1372 AUTH_TYPE_SHARED_KEY);
1376 ASSERT(!(prConnSettings->eAuthMode == AUTH_MODE_WPA_NONE));
1377 DBGLOG(AIS, ERROR, ("JOIN INIT: Auth Algorithm : %d was not supported by JOIN\n",
1378 prConnSettings->eAuthMode));
1379 /* TODO(Kevin): error handling ? */
1383 /* TODO(tyhsu): Assume that Roaming Auth Type is equal to ConnSettings eAuthMode */
1384 prAisSpecificBssInfo->ucRoamingAuthTypes = prAisFsmInfo->ucAvailableAuthTypes;
1386 prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT;
1390 ASSERT(prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE);
1391 ASSERT(!prBssDesc->fgIsConnected);
1393 DBGLOG(AIS, LOUD, ("JOIN INIT: AUTH TYPE = %d for Roaming\n",
1394 prAisSpecificBssInfo->ucRoamingAuthTypes));
1397 prStaRec->fgIsReAssoc = TRUE; /* We do roaming while the medium is connected */
1399 /* TODO(Kevin): We may call a sub function to acquire the Roaming Auth Type */
1400 prAisFsmInfo->ucAvailableAuthTypes = prAisSpecificBssInfo->ucRoamingAuthTypes;
1402 prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT_FOR_ROAMING;
1406 //4 <4> Use an appropriate Authentication Algorithm Number among the ucAvailableAuthTypes
1407 if (prAisFsmInfo->ucAvailableAuthTypes &
1408 (UINT_8)AUTH_TYPE_OPEN_SYSTEM) {
1410 DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == OPEN_SYSTEM.\n"));
1411 prAisFsmInfo->ucAvailableAuthTypes &=
1412 ~(UINT_8)AUTH_TYPE_OPEN_SYSTEM;
1414 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_OPEN_SYSTEM;
1416 else if (prAisFsmInfo->ucAvailableAuthTypes &
1417 (UINT_8)AUTH_TYPE_SHARED_KEY) {
1419 DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == SHARED_KEY.\n"));
1421 prAisFsmInfo->ucAvailableAuthTypes &=
1422 ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1424 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1426 else if (prAisFsmInfo->ucAvailableAuthTypes &
1427 (UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION) {
1429 DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == FAST_BSS_TRANSITION.\n"));
1431 prAisFsmInfo->ucAvailableAuthTypes &=
1432 ~(UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION;
1434 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_FAST_BSS_TRANSITION;
1440 //4 <5> Overwrite Connection Setting for eConnectionPolicy == ANY (Used by Assoc Req)
1441 if (prConnSettings->eConnectionPolicy == CONNECT_BY_SSID_ANY) {
1443 if (prBssDesc->ucSSIDLen) {
1444 COPY_SSID(prConnSettings->aucSSID,
1445 prConnSettings->ucSSIDLen,
1447 prBssDesc->ucSSIDLen);
1451 //4 <6> Send a Msg to trigger SAA to start JOIN process.
1452 prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
1453 if (!prJoinReqMsg) {
1455 ASSERT(0); // Can't trigger SAA FSM
1459 prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1460 prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1461 prJoinReqMsg->prStaRec = prStaRec;
1465 P_FRAG_INFO_T prFragInfo;
1466 for (j = 0; j < MAX_NUM_CONCURRENT_FRAGMENTED_MSDUS; j++) {
1467 prFragInfo = &prStaRec->rFragInfo[j];
1469 if (prFragInfo->pr1stFrag) {
1470 //nicRxReturnRFB(prAdapter, prFragInfo->pr1stFrag);
1471 prFragInfo->pr1stFrag = (P_SW_RFB_T)NULL;
1476 mboxSendMsg(prAdapter,
1478 (P_MSG_HDR_T) prJoinReqMsg,
1479 MSG_SEND_METHOD_BUF);
1482 } /* end of aisFsmInit_JOIN() */
1485 /*----------------------------------------------------------------------------*/
1487 * @brief Retry JOIN for AUTH_MODE_AUTO_SWITCH
1489 * @param[in] prStaRec Pointer to the STA_RECORD_T
1491 * @retval TRUE We will retry JOIN
1492 * @retval FALSE We will not retry JOIN
1494 /*----------------------------------------------------------------------------*/
1496 aisFsmStateInit_RetryJOIN (
1497 IN P_ADAPTER_T prAdapter,
1498 P_STA_RECORD_T prStaRec
1501 P_AIS_FSM_INFO_T prAisFsmInfo;
1502 P_MSG_JOIN_REQ_T prJoinReqMsg;
1504 DEBUGFUNC("aisFsmStateInit_RetryJOIN()");
1506 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1508 /* Retry other AuthType if possible */
1509 if (!prAisFsmInfo->ucAvailableAuthTypes) {
1513 if (prAisFsmInfo->ucAvailableAuthTypes &
1514 (UINT_8)AUTH_TYPE_SHARED_KEY) {
1516 DBGLOG(AIS, INFO, ("RETRY JOIN INIT: Retry Authentication with AuthType == SHARED_KEY.\n"));
1518 prAisFsmInfo->ucAvailableAuthTypes &=
1519 ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1521 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1524 DBGLOG(AIS, ERROR, ("RETRY JOIN INIT: Retry Authentication with Unexpected AuthType.\n"));
1528 prAisFsmInfo->ucAvailableAuthTypes = 0; /* No more available Auth Types */
1530 /* Trigger SAA to start JOIN process. */
1531 prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
1532 if (!prJoinReqMsg) {
1534 ASSERT(0); // Can't trigger SAA FSM
1538 prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1539 prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1540 prJoinReqMsg->prStaRec = prStaRec;
1542 mboxSendMsg(prAdapter,
1544 (P_MSG_HDR_T) prJoinReqMsg,
1545 MSG_SEND_METHOD_BUF);
1549 }/* end of aisFsmRetryJOIN() */
1552 #if CFG_SUPPORT_ADHOC
1553 /*----------------------------------------------------------------------------*/
1555 * @brief State Initialization of AIS_STATE_IBSS_ALONE
1561 /*----------------------------------------------------------------------------*/
1563 aisFsmStateInit_IBSS_ALONE (
1564 IN P_ADAPTER_T prAdapter
1567 P_AIS_FSM_INFO_T prAisFsmInfo;
1568 P_CONNECTION_SETTINGS_T prConnSettings;
1569 P_BSS_INFO_T prAisBssInfo;
1571 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1572 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1573 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1575 //4 <1> Check if IBSS was created before ?
1576 if (prAisBssInfo->fgIsBeaconActivated) {
1578 //4 <2> Start IBSS Alone Timer for periodic SCAN and then SEARCH
1579 #if !CFG_SLT_SUPPORT
1580 cnmTimerStartTimer(prAdapter,
1581 &prAisFsmInfo->rIbssAloneTimer,
1582 SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
1586 aisFsmCreateIBSS(prAdapter);
1589 } /* end of aisFsmStateInit_IBSS_ALONE() */
1592 /*----------------------------------------------------------------------------*/
1594 * @brief State Initialization of AIS_STATE_IBSS_MERGE
1596 * @param[in] prBssDesc The pointer of BSS_DESC_T which is the IBSS we will try to merge with.
1600 /*----------------------------------------------------------------------------*/
1602 aisFsmStateInit_IBSS_MERGE (
1603 IN P_ADAPTER_T prAdapter,
1604 P_BSS_DESC_T prBssDesc
1607 P_AIS_FSM_INFO_T prAisFsmInfo;
1608 P_CONNECTION_SETTINGS_T prConnSettings;
1609 P_BSS_INFO_T prAisBssInfo;
1610 P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
1615 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1616 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1617 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1619 //4 <1> We will merge with to this BSS immediately.
1620 prBssDesc->fgIsConnecting = FALSE;
1621 prBssDesc->fgIsConnected = TRUE;
1623 //4 <2> Setup corresponding STA_RECORD_T
1624 prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1625 STA_TYPE_ADHOC_PEER,
1626 NETWORK_TYPE_AIS_INDEX,
1629 prStaRec->fgIsMerging = TRUE;
1631 prAisFsmInfo->prTargetStaRec = prStaRec;
1633 //4 <2.1> sync. to firmware domain
1634 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1637 aisFsmMergeIBSS(prAdapter, prStaRec);
1640 } /* end of aisFsmStateInit_IBSS_MERGE() */
1642 #endif /* CFG_SUPPORT_ADHOC */
1645 /*----------------------------------------------------------------------------*/
1647 * @brief Process of JOIN Abort
1653 /*----------------------------------------------------------------------------*/
1655 aisFsmStateAbort_JOIN (
1656 IN P_ADAPTER_T prAdapter
1659 P_AIS_FSM_INFO_T prAisFsmInfo;
1660 P_MSG_JOIN_ABORT_T prJoinAbortMsg;
1662 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1664 /* 1. Abort JOIN process */
1665 prJoinAbortMsg = (P_MSG_JOIN_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_ABORT_T));
1666 if (!prJoinAbortMsg) {
1668 ASSERT(0); // Can't abort SAA FSM
1672 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
1673 WLAN_STATUS_CONNECT_INDICATION,
1677 prJoinAbortMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_ABORT;
1678 prJoinAbortMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfReqMsg;
1679 prJoinAbortMsg->prStaRec = prAisFsmInfo->prTargetStaRec;
1681 scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisFsmInfo->prTargetStaRec->aucMacAddr);
1683 mboxSendMsg(prAdapter,
1685 (P_MSG_HDR_T) prJoinAbortMsg,
1686 MSG_SEND_METHOD_BUF);
1688 /* 2. Return channel privilege */
1689 aisFsmReleaseCh(prAdapter);
1691 /* 3.1 stop join timeout timer */
1692 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1694 /* 3.2 reset local variable */
1695 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1698 } /* end of aisFsmAbortJOIN() */
1701 /*----------------------------------------------------------------------------*/
1703 * @brief Process of SCAN Abort
1709 /*----------------------------------------------------------------------------*/
1711 aisFsmStateAbort_SCAN (
1712 IN P_ADAPTER_T prAdapter
1715 P_AIS_FSM_INFO_T prAisFsmInfo;
1716 P_MSG_SCN_SCAN_CANCEL prScanCancelMsg;
1718 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1720 /* Abort JOIN process. */
1721 prScanCancelMsg = (P_MSG_SCN_SCAN_CANCEL)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_CANCEL));
1722 if (!prScanCancelMsg) {
1724 ASSERT(0); // Can't abort SCN FSM
1728 prScanCancelMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_CANCEL;
1729 prScanCancelMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfScanReq;
1730 prScanCancelMsg->ucNetTypeIndex = (UINT_8)NETWORK_TYPE_AIS_INDEX;
1731 #if CFG_ENABLE_WIFI_DIRECT
1732 if(prAdapter->fgIsP2PRegistered) {
1733 prScanCancelMsg->fgIsChannelExt = FALSE;
1737 /* unbuffered message to guarantee scan is cancelled in sequence */
1738 mboxSendMsg(prAdapter,
1740 (P_MSG_HDR_T) prScanCancelMsg,
1741 MSG_SEND_METHOD_UNBUF);
1744 } /* end of aisFsmAbortSCAN() */
1747 /*----------------------------------------------------------------------------*/
1749 * @brief Process of NORMAL_TR Abort
1755 /*----------------------------------------------------------------------------*/
1757 aisFsmStateAbort_NORMAL_TR (
1758 IN P_ADAPTER_T prAdapter
1761 P_AIS_FSM_INFO_T prAisFsmInfo;
1764 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1766 /* TODO(Kevin): Do abort other MGMT func */
1768 /* 1. Release channel to CNM */
1769 aisFsmReleaseCh(prAdapter);
1771 /* 2.1 stop join timeout timer */
1772 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1774 /* 2.2 reset local variable */
1775 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1778 } /* end of aisFsmAbortNORMAL_TR() */
1781 #if CFG_SUPPORT_ADHOC
1782 /*----------------------------------------------------------------------------*/
1784 * @brief Process of NORMAL_TR Abort
1790 /*----------------------------------------------------------------------------*/
1792 aisFsmStateAbort_IBSS (
1793 IN P_ADAPTER_T prAdapter
1796 P_AIS_FSM_INFO_T prAisFsmInfo;
1797 P_BSS_DESC_T prBssDesc;
1799 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1802 if (prAisFsmInfo->prTargetStaRec) {
1803 prBssDesc = scanSearchBssDescByTA(prAdapter,
1804 prAisFsmInfo->prTargetStaRec->aucMacAddr);
1807 prBssDesc->fgIsConnected = FALSE;
1808 prBssDesc->fgIsConnecting = FALSE;
1812 // release channel privilege
1813 aisFsmReleaseCh(prAdapter);
1817 #endif /* CFG_SUPPORT_ADHOC */
1820 /*----------------------------------------------------------------------------*/
1822 * @brief The Core FSM engine of AIS(Ad-hoc, Infra STA)
1824 * @param[in] eNextState Enum value of next AIS STATE
1828 /*----------------------------------------------------------------------------*/
1831 IN P_ADAPTER_T prAdapter,
1832 ENUM_AIS_STATE_T eNextState
1835 P_AIS_FSM_INFO_T prAisFsmInfo;
1836 P_BSS_INFO_T prAisBssInfo;
1837 P_CONNECTION_SETTINGS_T prConnSettings;
1838 P_BSS_DESC_T prBssDesc;
1839 P_MSG_CH_REQ_T prMsgChReq;
1840 P_MSG_SCN_SCAN_REQ prScanReqMsg;
1841 P_AIS_REQ_HDR_T prAisReq;
1844 UINT_16 u2ScanIELen;
1846 BOOLEAN fgIsTransition = (BOOLEAN)FALSE;
1848 DEBUGFUNC("aisFsmSteps()");
1850 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1851 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1852 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1856 /* Do entering Next State */
1857 prAisFsmInfo->ePreviousState = prAisFsmInfo->eCurrentState;
1860 DBGLOG(AIS, STATE, ("TRANSITION: [%s] -> [%s]\n",
1861 apucDebugAisState[prAisFsmInfo->eCurrentState],
1862 apucDebugAisState[eNextState]));
1864 DBGLOG(AIS, STATE, ("[%d] TRANSITION: [%d] -> [%d]\n",
1866 prAisFsmInfo->eCurrentState,
1869 /* NOTE(Kevin): This is the only place to change the eCurrentState(except initial) */
1870 prAisFsmInfo->eCurrentState = eNextState;
1872 fgIsTransition = (BOOLEAN)FALSE;
1874 /* Do tasks of the State that we just entered */
1875 switch (prAisFsmInfo->eCurrentState) {
1876 /* NOTE(Kevin): we don't have to rearrange the sequence of following
1877 * switch case. Instead I would like to use a common lookup table of array
1878 * of function pointer to speed up state search.
1880 case AIS_STATE_IDLE:
1882 prAisReq = aisFsmGetNextRequest(prAdapter);
1884 if(prAisReq == NULL || prAisReq->eReqType == AIS_REQUEST_RECONNECT) {
1885 if (prConnSettings->fgIsConnReqIssued == TRUE &&
1886 prConnSettings->fgIsDisconnectedByNonRequest == FALSE) {
1888 prAisFsmInfo->fgTryScan = TRUE;
1890 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1891 SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1893 // sync with firmware
1894 nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1896 // reset trial count
1897 prAisFsmInfo->ucConnTrialCount = 0;
1899 eNextState = AIS_STATE_SEARCH;
1900 fgIsTransition = TRUE;
1903 UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1904 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1906 // sync with firmware
1907 nicDeactivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1909 // check for other pending request
1911 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
1912 wlanClearScanningResult(prAdapter);
1913 eNextState = AIS_STATE_SCAN;
1915 fgIsTransition = TRUE;
1921 /* free the message */
1922 cnmMemFree(prAdapter, prAisReq);
1925 else if(prAisReq->eReqType == AIS_REQUEST_SCAN) {
1926 #if CFG_SUPPORT_ROAMING
1927 prAisFsmInfo->fgIsRoamingScanPending = FALSE;
1928 #endif /* CFG_SUPPORT_ROAMING */
1929 wlanClearScanningResult(prAdapter);
1931 eNextState = AIS_STATE_SCAN;
1932 fgIsTransition = TRUE;
1934 /* free the message */
1935 cnmMemFree(prAdapter, prAisReq);
1937 else if(prAisReq->eReqType == AIS_REQUEST_ROAMING_CONNECT || prAisReq->eReqType == AIS_REQUEST_ROAMING_SEARCH) {
1939 /* free the message */
1940 cnmMemFree(prAdapter, prAisReq);
1943 prAisFsmInfo->u4SleepInterval = AIS_BG_SCAN_INTERVAL_MIN_SEC;
1947 case AIS_STATE_SEARCH:
1948 //4 <1> Search for a matched candidate and save it to prTargetBssDesc.
1950 prBssDesc = prAdapter->rWifiVar.rSltInfo.prPseudoBssDesc;
1952 prBssDesc = scanSearchBssDescByPolicy(prAdapter, NETWORK_TYPE_AIS_INDEX);
1955 // we are under Roaming Condition.
1956 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
1957 if(prAisFsmInfo->ucConnTrialCount > AIS_ROAMING_CONNECTION_TRIAL_LIMIT) {
1958 #if CFG_SUPPORT_ROAMING
1959 roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_CONNLIMIT);
1960 #endif /* CFG_SUPPORT_ROAMING */
1961 // reset retry count
1962 prAisFsmInfo->ucConnTrialCount = 0;
1964 // abort connection trial
1965 prConnSettings->fgIsConnReqIssued = FALSE;
1967 eNextState = AIS_STATE_NORMAL_TR;
1968 fgIsTransition = TRUE;
1974 //4 <2> We are not under Roaming Condition.
1975 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1977 //4 <2.a> If we have the matched one
1980 //4 <A> Stored the Selected BSS security cipher. For later asoc req compose IE
1981 prAisBssInfo->u4RsnSelectedGroupCipher =
1982 prBssDesc->u4RsnSelectedGroupCipher;
1983 prAisBssInfo->u4RsnSelectedPairwiseCipher =
1984 prBssDesc->u4RsnSelectedPairwiseCipher;
1985 prAisBssInfo->u4RsnSelectedAKMSuite =
1986 prBssDesc->u4RsnSelectedAKMSuite;
1988 //4 <B> Do STATE transition and update current Operation Mode.
1989 if (prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE) {
1991 prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
1993 /* Record the target BSS_DESC_T for next STATE. */
1994 prAisFsmInfo->prTargetBssDesc = prBssDesc;
1996 /* Transit to channel acquire */
1997 eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
1998 fgIsTransition = TRUE;
2000 // increase connection trial count
2001 prAisFsmInfo->ucConnTrialCount++;
2003 #if CFG_SUPPORT_ADHOC
2004 else if (prBssDesc->eBSSType == BSS_TYPE_IBSS) {
2006 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
2008 /* Record the target BSS_DESC_T for next STATE. */
2009 prAisFsmInfo->prTargetBssDesc = prBssDesc;
2011 eNextState = AIS_STATE_IBSS_MERGE;
2012 fgIsTransition = TRUE;
2014 #endif /* CFG_SUPPORT_ADHOC */
2017 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
2018 fgIsTransition = TRUE;
2021 //4 <2.b> If we don't have the matched one
2024 // increase connection trial count for infrastructure connection
2025 if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
2026 prAisFsmInfo->ucConnTrialCount++;
2030 if (prAisFsmInfo->fgTryScan) {
2031 eNextState = AIS_STATE_LOOKING_FOR;
2033 fgIsTransition = TRUE;
2035 //4 <B> We've do SCAN already, now wait in some STATE.
2037 if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
2039 /* issue reconnect request, and retreat to idle state for scheduling */
2040 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2042 eNextState = AIS_STATE_IDLE;
2043 fgIsTransition = TRUE;
2045 #if CFG_SUPPORT_ADHOC
2046 else if ((prConnSettings->eOPMode == NET_TYPE_IBSS)
2047 || (prConnSettings->eOPMode == NET_TYPE_AUTO_SWITCH)
2048 || (prConnSettings->eOPMode == NET_TYPE_DEDICATED_IBSS)) {
2050 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
2051 prAisFsmInfo->prTargetBssDesc = NULL;
2053 eNextState = AIS_STATE_IBSS_ALONE;
2054 fgIsTransition = TRUE;
2056 #endif /* CFG_SUPPORT_ADHOC */
2059 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
2060 fgIsTransition = TRUE;
2065 //4 <3> We are under Roaming Condition.
2066 else { // prAdapter->eConnectionState == MEDIA_STATE_CONNECTED.
2068 //4 <3.a> This BSS_DESC_T is our AP.
2069 /* NOTE(Kevin 2008/05/16): Following cases will go back to NORMAL_TR.
2070 * CASE I: During Roaming, APP(WZC/NDISTEST) change the connection
2071 * settings. That make we can NOT match the original AP, so the
2072 * prBssDesc is NULL.
2073 * CASE II: The same reason as CASE I. Because APP change the
2074 * eOPMode to other network type in connection setting
2075 * (e.g. NET_TYPE_IBSS), so the BssDesc become the IBSS node.
2076 * (For CASE I/II, before WZC/NDISTEST set the OID_SSID, it will change
2077 * other parameters in connection setting first. So if we do roaming
2078 * at the same time, it will hit these cases.)
2080 * CASE III: Normal case, we can't find other candidate to roam
2081 * out, so only the current AP will be matched.
2083 * CASE VI: Timestamp of the current AP might be reset
2085 if ((!prBssDesc) || /* CASE I */
2086 (prBssDesc->eBSSType != BSS_TYPE_INFRASTRUCTURE) || /* CASE II */
2087 (prBssDesc->fgIsConnected) || /* CASE III */
2088 (EQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID)) /* CASE VI */) {
2091 (prBssDesc->fgIsConnected)) {
2092 ASSERT(EQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2095 /* We already associated with it, go back to NORMAL_TR */
2096 /* TODO(Kevin): Roaming Fail */
2097 #if CFG_SUPPORT_ROAMING
2098 roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_NOCANDIDATE);
2099 #endif /* CFG_SUPPORT_ROAMING */
2101 /* Retreat to NORMAL_TR state */
2102 eNextState = AIS_STATE_NORMAL_TR;
2103 fgIsTransition = TRUE;
2105 //4 <3.b> Try to roam out for JOIN this BSS_DESC_T.
2108 ASSERT(UNEQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2111 //4 <A> Record the target BSS_DESC_T for next STATE.
2112 prAisFsmInfo->prTargetBssDesc = prBssDesc;
2114 // tyhsu: increase connection trial count
2115 prAisFsmInfo->ucConnTrialCount++;
2117 /* Transit to channel acquire */
2118 eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
2119 fgIsTransition = TRUE;
2125 case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2127 DBGLOG(AIS, LOUD, ("SCAN: Idle Begin - Current Time = %ld\n", kalGetTimeTick()));
2129 cnmTimerStartTimer(prAdapter,
2130 &prAisFsmInfo->rBGScanTimer,
2131 SEC_TO_MSEC(prAisFsmInfo->u4SleepInterval));
2133 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2135 if (prAisFsmInfo->u4SleepInterval < AIS_BG_SCAN_INTERVAL_MAX_SEC) {
2136 prAisFsmInfo->u4SleepInterval <<= 1;
2140 case AIS_STATE_SCAN:
2141 case AIS_STATE_ONLINE_SCAN:
2142 case AIS_STATE_LOOKING_FOR:
2144 if(!IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX)) {
2145 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2147 // sync with firmware
2148 nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
2151 /* IE length decision */
2152 if(prAisFsmInfo->u4ScanIELength > 0) {
2153 u2ScanIELen = (UINT_16)prAisFsmInfo->u4ScanIELength;
2156 #if CFG_SUPPORT_WPS2
2157 u2ScanIELen = prAdapter->prGlueInfo->u2WSCIELen;
2163 prScanReqMsg = (P_MSG_SCN_SCAN_REQ)cnmMemAlloc(prAdapter,
2165 OFFSET_OF(MSG_SCN_SCAN_REQ, aucIE) + u2ScanIELen);
2166 if (!prScanReqMsg) {
2167 ASSERT(0); // Can't trigger SCAN FSM
2171 prScanReqMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_REQ;
2172 prScanReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfScanReq;
2173 prScanReqMsg->ucNetTypeIndex = (UINT_8)NETWORK_TYPE_AIS_INDEX;
2175 #if CFG_SUPPORT_RDD_TEST_MODE
2176 prScanReqMsg->eScanType = SCAN_TYPE_PASSIVE_SCAN;
2178 prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN;
2181 if(prAisFsmInfo->eCurrentState == AIS_STATE_SCAN
2182 || prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
2183 if(prAisFsmInfo->ucScanSSIDLen == 0) {
2184 /* Scan for all available SSID */
2185 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_WILDCARD;
2188 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
2189 COPY_SSID(prScanReqMsg->aucSSID,
2190 prScanReqMsg->ucSSIDLength,
2191 prAisFsmInfo->aucScanSSID,
2192 prAisFsmInfo->ucScanSSIDLen);
2196 /* Scan for determined SSID */
2197 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
2198 COPY_SSID(prScanReqMsg->aucSSID,
2199 prScanReqMsg->ucSSIDLength,
2200 prConnSettings->aucSSID,
2201 prConnSettings->ucSSIDLen);
2204 /* check if tethering is running and need to fix on specific channel */
2205 if(cnmAisInfraChannelFixed(prAdapter, &eBand, &ucChannel) == TRUE) {
2206 prScanReqMsg->eScanChannel = SCAN_CHANNEL_SPECIFIED;
2207 prScanReqMsg->ucChannelListNum = 1;
2208 prScanReqMsg->arChnlInfoList[0].eBand
2210 prScanReqMsg->arChnlInfoList[0].ucChannelNum
2213 else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_NULL) {
2214 if(prAdapter->fgEnable5GBand == TRUE) {
2215 prScanReqMsg->eScanChannel = SCAN_CHANNEL_FULL;
2218 prScanReqMsg->eScanChannel = SCAN_CHANNEL_2G4;
2221 else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_2G4) {
2222 prScanReqMsg->eScanChannel = SCAN_CHANNEL_2G4;
2224 else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_5G) {
2225 prScanReqMsg->eScanChannel = SCAN_CHANNEL_5G;
2228 prScanReqMsg->eScanChannel = SCAN_CHANNEL_FULL;
2232 if(prAisFsmInfo->u4ScanIELength > 0) {
2233 kalMemCopy(prScanReqMsg->aucIE, prAisFsmInfo->aucScanIEBuf, prAisFsmInfo->u4ScanIELength);
2236 #if CFG_SUPPORT_WPS2
2237 if(prAdapter->prGlueInfo->u2WSCIELen > 0) {
2238 kalMemCopy(prScanReqMsg->aucIE, &prAdapter->prGlueInfo->aucWSCIE, prAdapter->prGlueInfo->u2WSCIELen);
2243 prScanReqMsg->u2IELen = u2ScanIELen;
2245 mboxSendMsg(prAdapter,
2247 (P_MSG_HDR_T) prScanReqMsg,
2248 MSG_SEND_METHOD_BUF);
2250 prAisFsmInfo->fgTryScan = FALSE; /* Will enable background sleep for infrastructure */
2254 case AIS_STATE_REQ_CHANNEL_JOIN:
2255 /* send message to CNM for acquiring channel */
2256 prMsgChReq = (P_MSG_CH_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_REQ_T));
2258 ASSERT(0); // Can't indicate CNM for channel acquiring
2262 prMsgChReq->rMsgHdr.eMsgId = MID_MNY_CNM_CH_REQ;
2263 prMsgChReq->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
2264 prMsgChReq->ucTokenID = ++prAisFsmInfo->ucSeqNumOfChReq;
2265 prMsgChReq->eReqType = CH_REQ_TYPE_JOIN;
2266 prMsgChReq->u4MaxInterval = AIS_JOIN_CH_REQUEST_INTERVAL;
2267 prMsgChReq->ucPrimaryChannel = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
2268 prMsgChReq->eRfSco = prAisFsmInfo->prTargetBssDesc->eSco;
2269 prMsgChReq->eRfBand = prAisFsmInfo->prTargetBssDesc->eBand;
2270 COPY_MAC_ADDR(prMsgChReq->aucBSSID, prAisFsmInfo->prTargetBssDesc->aucBSSID);
2272 mboxSendMsg(prAdapter,
2274 (P_MSG_HDR_T) prMsgChReq,
2275 MSG_SEND_METHOD_BUF);
2277 prAisFsmInfo->fgIsChannelRequested = TRUE;
2280 case AIS_STATE_JOIN:
2281 aisFsmStateInit_JOIN(prAdapter, prAisFsmInfo->prTargetBssDesc);
2284 #if CFG_SUPPORT_ADHOC
2285 case AIS_STATE_IBSS_ALONE:
2286 aisFsmStateInit_IBSS_ALONE(prAdapter);
2289 case AIS_STATE_IBSS_MERGE:
2290 aisFsmStateInit_IBSS_MERGE(prAdapter, prAisFsmInfo->prTargetBssDesc);
2292 #endif /* CFG_SUPPORT_ADHOC */
2294 case AIS_STATE_NORMAL_TR:
2295 if(prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
2296 /* Don't do anything when rJoinTimeoutTimer is still ticking */
2299 /* 1. Process for pending scan */
2300 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
2301 wlanClearScanningResult(prAdapter);
2302 eNextState = AIS_STATE_ONLINE_SCAN;
2303 fgIsTransition = TRUE;
2305 /* 2. Process for pending roaming scan */
2306 else if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE) == TRUE) {
2307 eNextState = AIS_STATE_LOOKING_FOR;
2308 fgIsTransition = TRUE;
2310 /* 3. Process for pending roaming scan */
2311 else if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE) == TRUE) {
2312 eNextState = AIS_STATE_SEARCH;
2313 fgIsTransition = TRUE;
2319 case AIS_STATE_DISCONNECTING:
2320 /* send for deauth frame for disconnection */
2321 authSendDeauthFrame(prAdapter,
2322 prAisBssInfo->prStaRecOfAP,
2324 REASON_CODE_DEAUTH_LEAVING_BSS,
2325 aisDeauthXmitComplete);
2329 ASSERT(0); /* Make sure we have handle all STATEs */
2334 while (fgIsTransition);
2338 } /* end of aisFsmSteps() */
2341 /*----------------------------------------------------------------------------*/
2349 /*----------------------------------------------------------------------------*/
2351 aisFsmRunEventScanDone (
2352 IN P_ADAPTER_T prAdapter,
2353 IN P_MSG_HDR_T prMsgHdr
2356 P_MSG_SCN_SCAN_DONE prScanDoneMsg;
2357 P_AIS_FSM_INFO_T prAisFsmInfo;
2358 ENUM_AIS_STATE_T eNextState;
2359 UINT_8 ucSeqNumOfCompMsg;
2360 P_CONNECTION_SETTINGS_T prConnSettings;
2362 DEBUGFUNC("aisFsmRunEventScanDone()");
2367 DBGLOG(AIS, LOUD, ("EVENT-SCAN DONE: Current Time = %ld\n", kalGetTimeTick()));
2369 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2370 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2372 prScanDoneMsg = (P_MSG_SCN_SCAN_DONE)prMsgHdr;
2373 ASSERT(prScanDoneMsg->ucNetTypeIndex == (UINT_8)NETWORK_TYPE_AIS_INDEX);
2375 ucSeqNumOfCompMsg = prScanDoneMsg->ucSeqNum;
2376 cnmMemFree(prAdapter, prMsgHdr);
2378 eNextState = prAisFsmInfo->eCurrentState;
2380 if (ucSeqNumOfCompMsg != prAisFsmInfo->ucSeqNumOfScanReq) {
2381 DBGLOG(AIS, WARN, ("SEQ NO of AIS SCN DONE MSG is not matched.\n"));
2384 switch (prAisFsmInfo->eCurrentState) {
2385 case AIS_STATE_SCAN:
2386 prConnSettings->fgIsScanReqIssued = FALSE;
2388 /* reset scan IE buffer */
2389 prAisFsmInfo->u4ScanIELength = 0;
2391 kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2392 eNextState = AIS_STATE_IDLE;
2396 case AIS_STATE_ONLINE_SCAN:
2397 prConnSettings->fgIsScanReqIssued = FALSE;
2399 /* reset scan IE buffer */
2400 prAisFsmInfo->u4ScanIELength = 0;
2402 kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2403 #if CFG_SUPPORT_ROAMING
2404 eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2406 eNextState = AIS_STATE_NORMAL_TR;
2407 #endif /* CFG_SUPPORT_ROAMING */
2411 case AIS_STATE_LOOKING_FOR:
2412 #if CFG_SUPPORT_ROAMING
2413 eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2415 eNextState = AIS_STATE_SEARCH;
2416 #endif /* CFG_SUPPORT_ROAMING */
2425 if (eNextState != prAisFsmInfo->eCurrentState) {
2426 aisFsmSteps(prAdapter, eNextState);
2430 } /* end of aisFsmRunEventScanDone() */
2433 /*----------------------------------------------------------------------------*/
2441 /*----------------------------------------------------------------------------*/
2443 aisFsmRunEventAbort (
2444 IN P_ADAPTER_T prAdapter,
2445 IN P_MSG_HDR_T prMsgHdr
2448 P_MSG_AIS_ABORT_T prAisAbortMsg;
2449 P_AIS_FSM_INFO_T prAisFsmInfo;
2450 UINT_8 ucReasonOfDisconnect;
2451 BOOLEAN fgDelayIndication;
2452 P_CONNECTION_SETTINGS_T prConnSettings;
2454 DEBUGFUNC("aisFsmRunEventAbort()");
2458 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2459 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2461 //4 <1> Extract information of Abort Message and then free memory.
2462 prAisAbortMsg = (P_MSG_AIS_ABORT_T)prMsgHdr;
2463 ucReasonOfDisconnect = prAisAbortMsg->ucReasonOfDisconnect;
2464 fgDelayIndication = prAisAbortMsg->fgDelayIndication;
2466 cnmMemFree(prAdapter, prMsgHdr);
2469 DBGLOG(AIS, LOUD, ("EVENT-ABORT: Current State %s\n",
2470 apucDebugAisState[prAisFsmInfo->eCurrentState]));
2472 DBGLOG(AIS, LOUD, ("[%d] EVENT-ABORT: Current State [%d]\n",
2474 prAisFsmInfo->eCurrentState));
2477 //4 <2> clear previous pending connection request and insert new one
2478 if(ucReasonOfDisconnect == DISCONNECT_REASON_CODE_DEAUTHENTICATED
2479 || ucReasonOfDisconnect == DISCONNECT_REASON_CODE_DISASSOCIATED) {
2480 prConnSettings->fgIsDisconnectedByNonRequest = TRUE;
2483 prConnSettings->fgIsDisconnectedByNonRequest = FALSE;
2486 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
2487 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2489 if(prAisFsmInfo->eCurrentState != AIS_STATE_DISCONNECTING) {
2490 //4 <3> invoke abort handler
2491 aisFsmStateAbort(prAdapter, ucReasonOfDisconnect, fgDelayIndication);
2495 } /* end of aisFsmRunEventAbort() */
2498 /*----------------------------------------------------------------------------*/
2500 * \brief This function handles AIS-FSM abort event/command
2502 * \param[in] prAdapter Pointer of ADAPTER_T
2503 * ucReasonOfDisconnect Reason for disonnection
2504 * fgDelayIndication Option to delay disconnection indication
2508 /*----------------------------------------------------------------------------*/
2511 IN P_ADAPTER_T prAdapter,
2512 UINT_8 ucReasonOfDisconnect,
2513 BOOLEAN fgDelayIndication
2516 P_AIS_FSM_INFO_T prAisFsmInfo;
2517 P_BSS_INFO_T prAisBssInfo;
2518 P_CONNECTION_SETTINGS_T prConnSettings;
2519 BOOLEAN fgIsCheckConnected;
2523 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2524 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2525 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2526 fgIsCheckConnected = FALSE;
2528 //4 <1> Save information of Abort Message and then free memory.
2529 prAisBssInfo->ucReasonOfDisconnect = ucReasonOfDisconnect;
2531 //4 <2> Abort current job.
2532 switch (prAisFsmInfo->eCurrentState) {
2533 case AIS_STATE_IDLE:
2534 case AIS_STATE_SEARCH:
2537 case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2538 /* Do cancel timer */
2539 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
2541 /* in case roaming is triggered */
2542 fgIsCheckConnected = TRUE;
2545 case AIS_STATE_SCAN:
2547 aisFsmStateAbort_SCAN(prAdapter);
2549 /* queue for later handling */
2550 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2551 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2556 case AIS_STATE_LOOKING_FOR:
2558 aisFsmStateAbort_SCAN(prAdapter);
2560 /* in case roaming is triggered */
2561 fgIsCheckConnected = TRUE;
2564 case AIS_STATE_REQ_CHANNEL_JOIN:
2565 /* Release channel to CNM */
2566 aisFsmReleaseCh(prAdapter);
2568 /* in case roaming is triggered */
2569 fgIsCheckConnected = TRUE;
2572 case AIS_STATE_JOIN:
2574 aisFsmStateAbort_JOIN(prAdapter);
2576 /* in case roaming is triggered */
2577 fgIsCheckConnected = TRUE;
2580 #if CFG_SUPPORT_ADHOC
2581 case AIS_STATE_IBSS_ALONE:
2582 case AIS_STATE_IBSS_MERGE:
2583 aisFsmStateAbort_IBSS(prAdapter);
2585 #endif /* CFG_SUPPORT_ADHOC */
2587 case AIS_STATE_ONLINE_SCAN:
2589 aisFsmStateAbort_SCAN(prAdapter);
2591 /* queue for later handling */
2592 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2593 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2596 fgIsCheckConnected = TRUE;
2599 case AIS_STATE_NORMAL_TR:
2600 fgIsCheckConnected = TRUE;
2603 case AIS_STATE_DISCONNECTING:
2604 /* Do abort NORMAL_TR */
2605 aisFsmStateAbort_NORMAL_TR(prAdapter);
2613 if (fgIsCheckConnected &&
2614 (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState)) {
2616 /* switch into DISCONNECTING state for sending DEAUTH if necessary */
2617 if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE &&
2618 prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_NEW_CONNECTION &&
2619 prAisBssInfo->prStaRecOfAP &&
2620 prAisBssInfo->prStaRecOfAP->fgIsInUse) {
2621 aisFsmSteps(prAdapter, AIS_STATE_DISCONNECTING);
2626 /* Do abort NORMAL_TR */
2627 aisFsmStateAbort_NORMAL_TR(prAdapter);
2631 aisFsmDisconnect(prAdapter, fgDelayIndication);
2635 } /* end of aisFsmStateAbort() */
2638 /*----------------------------------------------------------------------------*/
2640 * @brief This function will handle the Join Complete Event from SAA FSM for AIS FSM
2642 * @param[in] prMsgHdr Message of Join Complete of SAA FSM.
2646 /*----------------------------------------------------------------------------*/
2648 aisFsmRunEventJoinComplete (
2649 IN P_ADAPTER_T prAdapter,
2650 IN P_MSG_HDR_T prMsgHdr
2653 P_MSG_JOIN_COMP_T prJoinCompMsg;
2654 P_AIS_FSM_INFO_T prAisFsmInfo;
2655 ENUM_AIS_STATE_T eNextState;
2656 P_STA_RECORD_T prStaRec;
2657 P_SW_RFB_T prAssocRspSwRfb;
2659 DEBUGFUNC("aisFsmRunEventJoinComplete()");
2663 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2664 prJoinCompMsg = (P_MSG_JOIN_COMP_T)prMsgHdr;
2665 prStaRec = prJoinCompMsg->prStaRec;
2666 prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
2668 eNextState = prAisFsmInfo->eCurrentState;
2670 // Check State and SEQ NUM
2671 if (prAisFsmInfo->eCurrentState == AIS_STATE_JOIN) {
2672 P_BSS_INFO_T prAisBssInfo;
2674 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2677 if (prJoinCompMsg->ucSeqNum == prAisFsmInfo->ucSeqNumOfReqMsg) {
2680 //4 <1> JOIN was successful
2681 if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
2683 //1. Reset retry count
2684 prAisFsmInfo->ucConnTrialCount = 0;
2686 // Completion of roaming
2687 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2689 #if CFG_SUPPORT_ROAMING
2690 //2. Deactivate previous BSS
2691 aisFsmRoamingDisconnectPrevAP(prAdapter, prStaRec);
2693 //3. Update bss based on roaming staRec
2694 aisUpdateBssInfoForRoamingAP(prAdapter, prStaRec, prAssocRspSwRfb);
2695 #endif /* CFG_SUPPORT_ROAMING */
2698 //4 <1.1> Change FW's Media State immediately.
2699 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2701 //4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have.
2702 if ((prAisBssInfo->prStaRecOfAP) &&
2703 (prAisBssInfo->prStaRecOfAP != prStaRec) &&
2704 (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
2706 cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
2709 //4 <1.3> Update BSS_INFO_T
2710 aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
2712 //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
2713 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2715 //4 <1.5> Update RSSI if necessary
2716 nicUpdateRSSI(prAdapter, NETWORK_TYPE_AIS_INDEX, (INT_8)(RCPI_TO_dBm(prStaRec->ucRCPI)), 0);
2718 //4 <1.6> Indicate Connected Event to Host immediately.
2719 /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
2720 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2723 #if CFG_SUPPORT_ROAMING
2724 roamingFsmRunEventStart(prAdapter);
2725 #endif /* CFG_SUPPORT_ROAMING */
2727 //4 <1.7> Set the Next State of AIS FSM
2728 eNextState = AIS_STATE_NORMAL_TR;
2730 //4 <2> JOIN was not successful
2732 //4 <2.1> Redo JOIN process with other Auth Type if possible
2733 if (aisFsmStateInit_RetryJOIN(prAdapter, prStaRec) == FALSE) {
2734 P_BSS_DESC_T prBssDesc;
2736 /* 1. Increase Failure Count */
2737 prStaRec->ucJoinFailureCount++;
2739 /* 2. release channel */
2740 aisFsmReleaseCh(prAdapter);
2742 /* 3.1 stop join timeout timer */
2743 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
2745 /* 3.2 reset local variable */
2746 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
2748 prBssDesc = scanSearchBssDescByBssid(prAdapter, prStaRec->aucMacAddr);
2751 ASSERT(prBssDesc->fgIsConnecting);
2754 prBssDesc->fgIsConnecting = FALSE;
2757 /* 3.3 Free STA-REC */
2758 if(prStaRec != prAisBssInfo->prStaRecOfAP) {
2759 cnmStaRecFree(prAdapter, prStaRec, FALSE);
2762 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2763 #if CFG_SUPPORT_ROAMING
2764 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
2765 #endif /* CFG_SUPPORT_ROAMING */
2768 /* 4. send reconnect request */
2769 prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
2771 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
2772 WLAN_STATUS_CONNECT_INDICATION,
2776 eNextState = AIS_STATE_IDLE;
2783 DBGLOG(AIS, WARN, ("SEQ NO of AIS JOIN COMP MSG is not matched.\n"));
2789 if (eNextState != prAisFsmInfo->eCurrentState) {
2790 aisFsmSteps(prAdapter, eNextState);
2793 if (prAssocRspSwRfb) {
2794 nicRxReturnRFB(prAdapter, prAssocRspSwRfb);
2797 cnmMemFree(prAdapter, prMsgHdr);
2800 } /* end of aisFsmRunEventJoinComplete() */
2803 #if CFG_SUPPORT_ADHOC
2804 /*----------------------------------------------------------------------------*/
2806 * @brief This function will handle the Grant Msg of IBSS Create which was sent by
2807 * CNM to indicate that channel was changed for creating IBSS.
2809 * @param[in] prAdapter Pointer of ADAPTER_T
2813 /*----------------------------------------------------------------------------*/
2816 IN P_ADAPTER_T prAdapter
2819 P_AIS_FSM_INFO_T prAisFsmInfo;
2823 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2827 if (prAisFsmInfo->eCurrentState == AIS_STATE_IBSS_ALONE) {
2828 aisUpdateBssInfoForCreateIBSS(prAdapter);
2834 } /* end of aisFsmCreateIBSS() */
2837 /*----------------------------------------------------------------------------*/
2839 * @brief This function will handle the Grant Msg of IBSS Merge which was sent by
2840 * CNM to indicate that channel was changed for merging IBSS.
2842 * @param[in] prAdapter Pointer of ADAPTER_T
2843 * @param[in] prStaRec Pointer of STA_RECORD_T for merge
2847 /*----------------------------------------------------------------------------*/
2850 IN P_ADAPTER_T prAdapter,
2851 IN P_STA_RECORD_T prStaRec
2854 P_AIS_FSM_INFO_T prAisFsmInfo;
2855 ENUM_AIS_STATE_T eNextState;
2856 P_BSS_INFO_T prAisBssInfo;
2861 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2862 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2866 eNextState = prAisFsmInfo->eCurrentState;
2868 switch (prAisFsmInfo->eCurrentState) {
2869 case AIS_STATE_IBSS_MERGE:
2871 P_BSS_DESC_T prBssDesc;
2873 //4 <1.1> Change FW's Media State immediately.
2874 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2876 //4 <1.2> Deactivate previous Peers' STA_RECORD_T in Driver if have.
2877 bssClearClientList(prAdapter, prAisBssInfo);
2879 //4 <1.3> Unmark connection flag of previous BSS_DESC_T.
2880 if ((prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID)) != NULL) {
2881 prBssDesc->fgIsConnecting = FALSE;
2882 prBssDesc->fgIsConnected = FALSE;
2885 //4 <1.4> Update BSS_INFO_T
2886 aisUpdateBssInfoForMergeIBSS(prAdapter, prStaRec);
2888 //4 <1.5> Add Peers' STA_RECORD_T to Client List
2889 bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2891 //4 <1.6> Activate current Peer's STA_RECORD_T in Driver.
2892 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2893 prStaRec->fgIsMerging = FALSE;
2895 //4 <1.7> Enable other features
2897 //4 <1.8> Indicate Connected Event to Host immediately.
2898 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2900 //4 <1.9> Set the Next State of AIS FSM
2901 eNextState = AIS_STATE_NORMAL_TR;
2903 //4 <1.10> Release channel privilege
2904 aisFsmReleaseCh(prAdapter);
2907 prAdapter->rWifiVar.rSltInfo.prPseudoStaRec = prStaRec;
2916 if (eNextState != prAisFsmInfo->eCurrentState) {
2917 aisFsmSteps(prAdapter, eNextState);
2924 } /* end of aisFsmMergeIBSS() */
2927 /*----------------------------------------------------------------------------*/
2929 * @brief This function will handle the Notification of existing IBSS was found
2932 * @param[in] prMsgHdr Message of Notification of an IBSS was present.
2936 /*----------------------------------------------------------------------------*/
2938 aisFsmRunEventFoundIBSSPeer (
2939 IN P_ADAPTER_T prAdapter,
2940 IN P_MSG_HDR_T prMsgHdr
2943 P_MSG_AIS_IBSS_PEER_FOUND_T prAisIbssPeerFoundMsg;
2944 P_AIS_FSM_INFO_T prAisFsmInfo;
2945 ENUM_AIS_STATE_T eNextState;
2946 P_STA_RECORD_T prStaRec;
2947 P_BSS_INFO_T prAisBssInfo;
2948 P_BSS_DESC_T prBssDesc;
2949 BOOLEAN fgIsMergeIn;
2954 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2955 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2957 prAisIbssPeerFoundMsg = (P_MSG_AIS_IBSS_PEER_FOUND_T)prMsgHdr;
2959 ASSERT(prAisIbssPeerFoundMsg->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX);
2961 prStaRec = prAisIbssPeerFoundMsg->prStaRec;
2964 fgIsMergeIn = prAisIbssPeerFoundMsg->fgIsMergeIn;
2966 cnmMemFree(prAdapter, prMsgHdr);
2969 eNextState = prAisFsmInfo->eCurrentState;
2970 switch (prAisFsmInfo->eCurrentState) {
2971 case AIS_STATE_IBSS_ALONE:
2973 //4 <1> An IBSS Peer 'merged in'.
2976 //4 <1.1> Change FW's Media State immediately.
2977 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2979 //4 <1.2> Add Peers' STA_RECORD_T to Client List
2980 bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2983 //4 <1.3> Mark connection flag of BSS_DESC_T.
2984 if ((prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr)) != NULL) {
2985 prBssDesc->fgIsConnecting = FALSE;
2986 prBssDesc->fgIsConnected = TRUE;
2989 ASSERT(0); // Should be able to find a BSS_DESC_T here.
2992 //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
2993 prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
2995 //4 <1.3> Mark connection flag of BSS_DESC_T.
2996 if ((prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID)) != NULL) {
2997 prBssDesc->fgIsConnecting = FALSE;
2998 prBssDesc->fgIsConnected = TRUE;
3001 ASSERT(0); // Should be able to find a BSS_DESC_T here.
3005 //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
3006 prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
3010 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
3011 prStaRec->fgIsMerging = FALSE;
3013 //4 <1.6> sync. to firmware
3014 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3016 //4 <1.7> Indicate Connected Event to Host immediately.
3017 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
3019 //4 <1.8> indicate PM for connected
3020 nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
3022 //4 <1.9> Set the Next State of AIS FSM
3023 eNextState = AIS_STATE_NORMAL_TR;
3025 //4 <1.10> Release channel privilege
3026 aisFsmReleaseCh(prAdapter);
3028 //4 <2> We need 'merge out' to this IBSS
3031 //4 <2.1> Get corresponding BSS_DESC_T
3032 prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3034 prAisFsmInfo->prTargetBssDesc = prBssDesc;
3036 //4 <2.2> Set the Next State of AIS FSM
3037 eNextState = AIS_STATE_IBSS_MERGE;
3042 case AIS_STATE_NORMAL_TR:
3045 //4 <3> An IBSS Peer 'merged in'.
3048 //4 <3.1> Add Peers' STA_RECORD_T to Client List
3049 bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
3052 //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
3053 prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
3055 //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
3056 prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
3059 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
3060 prStaRec->fgIsMerging = FALSE;
3063 //4 <4> We need 'merge out' to this IBSS
3066 //4 <4.1> Get corresponding BSS_DESC_T
3067 prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3069 prAisFsmInfo->prTargetBssDesc = prBssDesc;
3071 //4 <4.2> Set the Next State of AIS FSM
3072 eNextState = AIS_STATE_IBSS_MERGE;
3082 if (eNextState != prAisFsmInfo->eCurrentState) {
3083 aisFsmSteps(prAdapter, eNextState);
3087 } /* end of aisFsmRunEventFoundIBSSPeer() */
3088 #endif /* CFG_SUPPORT_ADHOC */
3091 /*----------------------------------------------------------------------------*/
3093 * @brief This function will indicate the Media State to HOST
3095 * @param[in] eConnectionState Current Media State
3096 * @param[in] fgDelayIndication Set TRUE for postponing the Disconnect Indication.
3100 /*----------------------------------------------------------------------------*/
3102 aisIndicationOfMediaStateToHost (
3103 IN P_ADAPTER_T prAdapter,
3104 ENUM_PARAM_MEDIA_STATE_T eConnectionState,
3105 BOOLEAN fgDelayIndication
3108 EVENT_CONNECTION_STATUS rEventConnStatus;
3109 P_CONNECTION_SETTINGS_T prConnSettings;
3110 P_BSS_INFO_T prAisBssInfo;
3111 P_AIS_FSM_INFO_T prAisFsmInfo;
3113 DEBUGFUNC("aisIndicationOfMediaStateToHost()");
3115 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3116 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3117 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3119 // NOTE(Kevin): Move following line to aisChangeMediaState() macro per CM's request.
3120 //prAisBssInfo->eConnectionState = eConnectionState;
3122 /* For indicating the Disconnect Event only if current media state is
3123 * disconnected and we didn't do indication yet.
3125 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
3126 if (prAisBssInfo->eConnectionStateIndicated == eConnectionState) {
3131 if (!fgDelayIndication) {
3132 //4 <0> Cancel Delay Timer
3133 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
3135 //4 <1> Fill EVENT_CONNECTION_STATUS
3136 rEventConnStatus.ucMediaStatus = (UINT_8)eConnectionState;
3138 if (eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
3139 rEventConnStatus.ucReasonOfDisconnect = DISCONNECT_REASON_CODE_RESERVED;
3141 if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) {
3142 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_INFRA;
3143 rEventConnStatus.u2AID = prAisBssInfo->u2AssocId;
3144 rEventConnStatus.u2ATIMWindow = 0;
3146 else if (prAisBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
3147 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_IBSS;
3148 rEventConnStatus.u2AID = 0;
3149 rEventConnStatus.u2ATIMWindow = prAisBssInfo->u2ATIMWindow;
3155 COPY_SSID(rEventConnStatus.aucSsid,
3156 rEventConnStatus.ucSsidLen,
3157 prConnSettings->aucSSID,
3158 prConnSettings->ucSSIDLen);
3160 COPY_MAC_ADDR(rEventConnStatus.aucBssid, prAisBssInfo->aucBSSID);
3162 rEventConnStatus.u2BeaconPeriod = prAisBssInfo->u2BeaconInterval;
3163 rEventConnStatus.u4FreqInKHz = nicChannelNum2Freq(prAisBssInfo->ucPrimaryChannel);
3165 switch (prAisBssInfo->ucNonHTBasicPhyType) {
3166 case PHY_TYPE_HR_DSSS_INDEX:
3167 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3170 case PHY_TYPE_ERP_INDEX:
3171 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM24;
3174 case PHY_TYPE_OFDM_INDEX:
3175 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM5;
3180 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3185 /* Deactivate previous Peers' STA_RECORD_T in Driver if have. */
3186 bssClearClientList(prAdapter, prAisBssInfo);
3188 #if CFG_PRIVACY_MIGRATION
3189 /* Clear the pmkid cache while media disconnect */
3190 secClearPmkid(prAdapter);
3193 rEventConnStatus.ucReasonOfDisconnect = prAisBssInfo->ucReasonOfDisconnect;
3197 nicMediaStateChange(prAdapter, NETWORK_TYPE_AIS_INDEX, &rEventConnStatus);
3198 prAisBssInfo->eConnectionStateIndicated = eConnectionState;
3201 /* NOTE: Only delay the Indication of Disconnect Event */
3202 ASSERT(eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED);
3204 DBGLOG(AIS, INFO, ("Postpone the indication of Disconnect for %d seconds\n",
3205 prConnSettings->ucDelayTimeOfDisconnectEvent));
3207 cnmTimerStartTimer(prAdapter,
3208 &prAisFsmInfo->rIndicationOfDisconnectTimer,
3209 SEC_TO_MSEC(prConnSettings->ucDelayTimeOfDisconnectEvent));
3213 } /* end of aisIndicationOfMediaStateToHost() */
3216 /*----------------------------------------------------------------------------*/
3218 * @brief This function will indicate an Event of "Media Disconnect" to HOST
3220 * @param[in] u4Param Unused timer parameter
3224 /*----------------------------------------------------------------------------*/
3226 aisPostponedEventOfDisconnTimeout (
3227 IN P_ADAPTER_T prAdapter,
3231 P_BSS_INFO_T prAisBssInfo;
3232 P_CONNECTION_SETTINGS_T prConnSettings;
3234 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3235 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3237 //4 <1> Deactivate previous AP's STA_RECORD_T in Driver if have.
3238 if (prAisBssInfo->prStaRecOfAP) {
3239 //cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
3241 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3244 //4 <2> Remove pending connection request
3245 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3246 prConnSettings->fgIsDisconnectedByNonRequest = TRUE;
3248 //4 <3> Indicate Disconnected Event to Host immediately.
3249 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED, FALSE);
3252 } /* end of aisPostponedEventOfDisconnTimeout() */
3255 /*----------------------------------------------------------------------------*/
3257 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3258 * the association was completed.
3260 * @param[in] prStaRec Pointer to the STA_RECORD_T
3261 * @param[in] prAssocRspSwRfb Pointer to SW RFB of ASSOC RESP FRAME.
3265 /*----------------------------------------------------------------------------*/
3267 aisUpdateBssInfoForJOIN (
3268 IN P_ADAPTER_T prAdapter,
3269 P_STA_RECORD_T prStaRec,
3270 P_SW_RFB_T prAssocRspSwRfb
3273 P_AIS_FSM_INFO_T prAisFsmInfo;
3274 P_BSS_INFO_T prAisBssInfo;
3275 P_CONNECTION_SETTINGS_T prConnSettings;
3276 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
3277 P_BSS_DESC_T prBssDesc;
3281 DEBUGFUNC("aisUpdateBssInfoForJOIN()");
3284 ASSERT(prAssocRspSwRfb);
3286 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3287 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3288 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3289 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prAssocRspSwRfb->pvHeader;
3292 DBGLOG(AIS, INFO, ("Update AIS_BSS_INFO_T and apply settings to MAC\n"));
3295 //3 <1> Update BSS_INFO_T from AIS_FSM_INFO_T or User Settings
3296 //4 <1.1> Setup Operation Mode
3297 prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
3299 //4 <1.2> Setup SSID
3300 COPY_SSID(prAisBssInfo->aucSSID,
3301 prAisBssInfo->ucSSIDLen,
3302 prConnSettings->aucSSID,
3303 prConnSettings->ucSSIDLen);
3305 //4 <1.3> Setup Channel, Band
3306 prAisBssInfo->ucPrimaryChannel = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
3307 prAisBssInfo->eBand = prAisFsmInfo->prTargetBssDesc->eBand;
3310 //3 <2> Update BSS_INFO_T from STA_RECORD_T
3311 //4 <2.1> Save current AP's STA_RECORD_T and current AID
3312 prAisBssInfo->prStaRecOfAP = prStaRec;
3313 prAisBssInfo->u2AssocId = prStaRec->u2AssocId;
3315 //4 <2.2> Setup Capability
3316 prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use AP's Cap Info as BSS Cap Info */
3318 if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3319 prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3322 prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3325 //4 <2.3> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3326 prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3328 prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3330 prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3331 prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3334 //3 <3> Update BSS_INFO_T from SW_RFB_T (Association Resp Frame)
3335 //4 <3.1> Setup BSSID
3336 COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prAssocRspFrame->aucBSSID);
3339 u2IELength = (UINT_16) ((prAssocRspSwRfb->u2PacketLen - prAssocRspSwRfb->u2HeaderLen) -
3340 (OFFSET_OF(WLAN_ASSOC_RSP_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN));
3341 pucIE = prAssocRspFrame->aucInfoElem;
3344 //4 <3.2> Parse WMM and setup QBSS flag
3345 /* Parse WMM related IEs and configure HW CRs accordingly */
3346 mqmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
3348 prAisBssInfo->fgIsQBSS = prStaRec->fgIsQoS;
3350 //3 <4> Update BSS_INFO_T from BSS_DESC_T
3351 prBssDesc = scanSearchBssDescByBssid(prAdapter, prAssocRspFrame->aucBSSID);
3353 prBssDesc->fgIsConnecting = FALSE;
3354 prBssDesc->fgIsConnected = TRUE;
3356 //4 <4.1> Setup MIB for current BSS
3357 prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3360 // should never happen
3364 /* NOTE: Defer ucDTIMPeriod updating to when beacon is received after connection */
3365 prAisBssInfo->ucDTIMPeriod = 0;
3366 prAisBssInfo->u2ATIMWindow = 0;
3368 prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_INFRA;
3370 //4 <4.2> Update HT information and set channel
3371 /* Record HT related parameters in rStaRec and rBssInfo
3372 * Note: it shall be called before nicUpdateBss()
3374 rlmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
3376 //4 <4.3> Sync with firmware for BSS-INFO
3377 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3379 //4 <4.4> *DEFER OPERATION* nicPmIndicateBssConnected() will be invoked
3380 //inside scanProcessBeaconAndProbeResp() after 1st beacon is received
3383 } /* end of aisUpdateBssInfoForJOIN() */
3386 #if CFG_SUPPORT_ADHOC
3387 /*----------------------------------------------------------------------------*/
3389 * @brief This function will create an Ad-Hoc network and start sending Beacon Frames.
3395 /*----------------------------------------------------------------------------*/
3397 aisUpdateBssInfoForCreateIBSS (
3398 IN P_ADAPTER_T prAdapter
3401 P_AIS_FSM_INFO_T prAisFsmInfo;
3402 P_BSS_INFO_T prAisBssInfo;
3403 P_CONNECTION_SETTINGS_T prConnSettings;
3405 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3406 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3407 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3409 if (prAisBssInfo->fgIsBeaconActivated) {
3413 //3 <1> Update BSS_INFO_T per Network Basis
3414 //4 <1.1> Setup Operation Mode
3415 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3417 //4 <1.2> Setup SSID
3418 COPY_SSID(prAisBssInfo->aucSSID,
3419 prAisBssInfo->ucSSIDLen,
3420 prConnSettings->aucSSID,
3421 prConnSettings->ucSSIDLen);
3423 //4 <1.3> Clear current AP's STA_RECORD_T and current AID
3424 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3425 prAisBssInfo->u2AssocId = 0;
3427 //4 <1.4> Setup Channel, Band and Phy Attributes
3428 prAisBssInfo->ucPrimaryChannel = prConnSettings->ucAdHocChannelNum;
3429 prAisBssInfo->eBand = prConnSettings->eAdHocBand;
3431 if (prAisBssInfo->eBand == BAND_2G4) {
3433 prAisBssInfo->ucPhyTypeSet =
3434 prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11BGN; /* Depend on eBand */
3436 prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_MIXED_11BG; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3440 prAisBssInfo->ucPhyTypeSet =
3441 prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11AN; /* Depend on eBand */
3443 prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_11A; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3446 //4 <1.5> Setup MIB for current BSS
3447 prAisBssInfo->u2BeaconInterval = prConnSettings->u2BeaconPeriod;
3448 prAisBssInfo->ucDTIMPeriod = 0;
3449 prAisBssInfo->u2ATIMWindow = prConnSettings->u2AtimWindow;
3451 prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3453 #if CFG_PRIVACY_MIGRATION
3454 if (prConnSettings->eEncStatus == ENUM_ENCRYPTION1_ENABLED ||
3455 prConnSettings->eEncStatus == ENUM_ENCRYPTION2_ENABLED ||
3456 prConnSettings->eEncStatus == ENUM_ENCRYPTION3_ENABLED) {
3457 prAisBssInfo->fgIsProtection = TRUE;
3460 prAisBssInfo->fgIsProtection = FALSE;
3463 prAisBssInfo->fgIsProtection = FALSE;
3466 //3 <2> Update BSS_INFO_T common part
3467 ibssInitForAdHoc(prAdapter, prAisBssInfo);
3472 //4 <3.1> Setup channel and bandwidth
3473 rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3475 //4 <3.2> use command packets to inform firmware
3476 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3478 //4 <3.3> enable beaconing
3479 bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3481 //4 <3.4> Update AdHoc PM parameter
3482 nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_AIS_INDEX);
3484 //3 <4> Set ACTIVE flag.
3485 prAisBssInfo->fgIsBeaconActivated = TRUE;
3486 prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3488 //3 <5> Start IBSS Alone Timer
3489 cnmTimerStartTimer(prAdapter,
3490 &prAisFsmInfo->rIbssAloneTimer,
3491 SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
3495 } /* end of aisCreateIBSS() */
3498 /*----------------------------------------------------------------------------*/
3500 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3501 * the existing IBSS was found.
3503 * @param[in] prStaRec Pointer to the STA_RECORD_T
3507 /*----------------------------------------------------------------------------*/
3509 aisUpdateBssInfoForMergeIBSS (
3510 IN P_ADAPTER_T prAdapter,
3511 IN P_STA_RECORD_T prStaRec
3514 P_AIS_FSM_INFO_T prAisFsmInfo;
3515 P_BSS_INFO_T prAisBssInfo;
3516 P_CONNECTION_SETTINGS_T prConnSettings;
3517 P_BSS_DESC_T prBssDesc;
3518 //UINT_16 u2IELength;
3524 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3525 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3526 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3528 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
3530 if (!prAisBssInfo->fgIsBeaconActivated) {
3532 //3 <1> Update BSS_INFO_T per Network Basis
3533 //4 <1.1> Setup Operation Mode
3534 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3536 //4 <1.2> Setup SSID
3537 COPY_SSID(prAisBssInfo->aucSSID,
3538 prAisBssInfo->ucSSIDLen,
3539 prConnSettings->aucSSID,
3540 prConnSettings->ucSSIDLen);
3542 //4 <1.3> Clear current AP's STA_RECORD_T and current AID
3543 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3544 prAisBssInfo->u2AssocId = 0;
3547 //3 <2> Update BSS_INFO_T from STA_RECORD_T
3548 //4 <2.1> Setup Capability
3549 prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use Peer's Cap Info as IBSS Cap Info */
3551 if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3552 prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3553 prAisBssInfo->fgUseShortPreamble = TRUE;
3556 prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3557 prAisBssInfo->fgUseShortPreamble = FALSE;
3560 // 7.3.1.4 For IBSS, the Short Slot Time subfield shall be set to 0.
3561 prAisBssInfo->fgUseShortSlotTime = FALSE; /* Set to FALSE for AdHoc */
3562 prAisBssInfo->u2CapInfo &= ~CAP_INFO_SHORT_SLOT_TIME;
3564 if (prAisBssInfo->u2CapInfo & CAP_INFO_PRIVACY) {
3565 prAisBssInfo->fgIsProtection= TRUE;
3568 prAisBssInfo->fgIsProtection = FALSE;
3571 //4 <2.2> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3572 prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3574 prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3576 prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3577 prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3579 rateGetDataRatesFromRateSet(prAisBssInfo->u2OperationalRateSet,
3580 prAisBssInfo->u2BSSBasicRateSet,
3581 prAisBssInfo->aucAllSupportedRates,
3582 &prAisBssInfo->ucAllSupportedRatesLen);
3584 //3 <3> X Update BSS_INFO_T from SW_RFB_T (Association Resp Frame)
3587 //3 <4> Update BSS_INFO_T from BSS_DESC_T
3588 prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3590 prBssDesc->fgIsConnecting = FALSE;
3591 prBssDesc->fgIsConnected = TRUE;
3593 //4 <4.1> Setup BSSID
3594 COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prBssDesc->aucBSSID);
3596 //4 <4.2> Setup Channel, Band
3597 prAisBssInfo->ucPrimaryChannel = prBssDesc->ucChannelNum;
3598 prAisBssInfo->eBand = prBssDesc->eBand;
3600 //4 <4.3> Setup MIB for current BSS
3601 prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3602 prAisBssInfo->ucDTIMPeriod = 0;
3603 prAisBssInfo->u2ATIMWindow = 0; /* TBD(Kevin) */
3605 prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3608 // should never happen
3614 //4 <5.1> Find Lowest Basic Rate Index for default TX Rate of MMPDU
3616 UINT_8 ucLowestBasicRateIndex;
3618 if (!rateGetLowestRateIndexFromRateSet(prAisBssInfo->u2BSSBasicRateSet,
3619 &ucLowestBasicRateIndex)) {
3621 if (prAisBssInfo->ucPhyTypeSet & PHY_TYPE_BIT_OFDM) {
3622 ucLowestBasicRateIndex = RATE_6M_INDEX;
3625 ucLowestBasicRateIndex = RATE_1M_INDEX;
3629 prAisBssInfo->ucHwDefaultFixedRateCode =
3630 aucRateIndex2RateCode[prAisBssInfo->fgUseShortPreamble][ucLowestBasicRateIndex];
3633 //4 <5.2> Setup channel and bandwidth
3634 rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3636 //4 <5.3> use command packets to inform firmware
3637 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3639 //4 <5.4> enable beaconing
3640 bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3642 //4 <5.5> Update AdHoc PM parameter
3643 nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
3645 //3 <6> Set ACTIVE flag.
3646 prAisBssInfo->fgIsBeaconActivated = TRUE;
3647 prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3650 } /* end of aisUpdateBssInfoForMergeIBSS() */
3653 /*----------------------------------------------------------------------------*/
3655 * @brief This function will validate the Rx Probe Request Frame and then return
3656 * result to BSS to indicate if need to send the corresponding Probe Response
3657 * Frame if the specified conditions were matched.
3659 * @param[in] prAdapter Pointer to the Adapter structure.
3660 * @param[in] prSwRfb Pointer to SW RFB data structure.
3661 * @param[out] pu4ControlFlags Control flags for replying the Probe Response
3663 * @retval TRUE Reply the Probe Response
3664 * @retval FALSE Don't reply the Probe Response
3666 /*----------------------------------------------------------------------------*/
3668 aisValidateProbeReq (
3669 IN P_ADAPTER_T prAdapter,
3670 IN P_SW_RFB_T prSwRfb,
3671 OUT PUINT_32 pu4ControlFlags
3674 P_WLAN_MAC_MGMT_HEADER_T prMgtHdr;
3675 P_BSS_INFO_T prBssInfo;
3676 P_IE_SSID_T prIeSsid = (P_IE_SSID_T)NULL;
3679 UINT_16 u2Offset = 0;
3680 BOOLEAN fgReplyProbeResp = FALSE;
3684 ASSERT(pu4ControlFlags);
3686 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3688 //4 <1> Parse Probe Req IE and Get IE ptr (SSID, Supported Rate IE, ...)
3689 prMgtHdr = (P_WLAN_MAC_MGMT_HEADER_T)prSwRfb->pvHeader;
3691 u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
3692 pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
3694 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
3695 if (ELEM_ID_SSID == IE_ID(pucIE)) {
3697 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
3698 prIeSsid = (P_IE_SSID_T)pucIE;
3702 } /* end of IE_FOR_EACH */
3704 //4 <2> Check network conditions
3706 if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
3709 ((prIeSsid->ucLength == BC_SSID_LEN) || /* WILDCARD SSID */
3710 EQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen, /* CURRENT SSID */
3711 prIeSsid->aucSSID, prIeSsid->ucLength)) ) {
3712 fgReplyProbeResp = TRUE;
3716 return fgReplyProbeResp;
3718 } /* end of aisValidateProbeReq() */
3720 #endif /* CFG_SUPPORT_ADHOC */
3722 /*----------------------------------------------------------------------------*/
3724 * @brief This function will modify and update necessary information to firmware
3725 * for disconnection handling
3727 * @param[in] prAdapter Pointer to the Adapter structure.
3731 /*----------------------------------------------------------------------------*/
3734 IN P_ADAPTER_T prAdapter,
3735 IN BOOLEAN fgDelayIndication
3738 P_BSS_INFO_T prAisBssInfo;
3742 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3744 nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
3746 #if CFG_SUPPORT_ADHOC
3747 if (prAisBssInfo->fgIsBeaconActivated) {
3748 nicUpdateBeaconIETemplate(prAdapter,
3749 IE_UPD_METHOD_DELETE_ALL,
3750 NETWORK_TYPE_AIS_INDEX,
3755 prAisBssInfo->fgIsBeaconActivated = FALSE;
3759 rlmBssAborted(prAdapter, prAisBssInfo);
3761 //4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed.
3762 if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
3764 if (prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_RADIO_LOST) {
3765 scanRemoveBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3767 /* remove from scanning results as well */
3768 wlanClearBssInScanningResult(prAdapter, prAisBssInfo->aucBSSID);
3770 /* trials for re-association */
3771 if (fgDelayIndication) {
3772 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3773 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
3777 scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3780 if (fgDelayIndication) {
3781 if (OP_MODE_IBSS != prAisBssInfo->eCurrentOPMode) {
3782 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3786 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3790 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3794 //4 <4> Change Media State immediately.
3795 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
3797 //4 <4.1> sync. with firmware
3798 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3800 if (!fgDelayIndication) {
3801 //4 <5> Deactivate previous AP's STA_RECORD_T or all Clients in Driver if have.
3802 if (prAisBssInfo->prStaRecOfAP) {
3803 //cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
3805 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3809 #if CFG_SUPPORT_ROAMING
3810 roamingFsmRunEventAbort(prAdapter);
3812 /* clear pending roaming connection request */
3813 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
3814 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
3815 #endif /* CFG_SUPPORT_ROAMING */
3817 //4 <6> Indicate Disconnected Event to Host
3818 aisIndicationOfMediaStateToHost(prAdapter,
3819 PARAM_MEDIA_STATE_DISCONNECTED,
3823 //4 <7> Trigger AIS FSM
3824 aisFsmSteps(prAdapter, AIS_STATE_IDLE);
3827 } /* end of aisFsmDisconnect() */
3830 /*----------------------------------------------------------------------------*/
3832 * @brief This function will indicate an Event of "Background Scan Time-Out" to AIS FSM.
3834 * @param[in] u4Param Unused timer parameter
3838 /*----------------------------------------------------------------------------*/
3840 aisFsmRunEventBGSleepTimeOut (
3841 IN P_ADAPTER_T prAdapter,
3845 P_AIS_FSM_INFO_T prAisFsmInfo;
3846 ENUM_AIS_STATE_T eNextState;
3848 DEBUGFUNC("aisFsmRunEventBGSleepTimeOut()");
3850 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3852 eNextState = prAisFsmInfo->eCurrentState;
3854 switch (prAisFsmInfo->eCurrentState) {
3855 case AIS_STATE_WAIT_FOR_NEXT_SCAN:
3856 DBGLOG(AIS, LOUD, ("EVENT - SCAN TIMER: Idle End - Current Time = %ld\n", kalGetTimeTick()));
3858 eNextState = AIS_STATE_LOOKING_FOR;
3860 SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
3868 /* Call aisFsmSteps() when we are going to change AIS STATE */
3869 if (eNextState != prAisFsmInfo->eCurrentState) {
3870 aisFsmSteps(prAdapter, eNextState);
3874 } /* end of aisFsmBGSleepTimeout() */
3877 /*----------------------------------------------------------------------------*/
3879 * @brief This function will indicate an Event of "IBSS ALONE Time-Out" to AIS FSM.
3881 * @param[in] u4Param Unused timer parameter
3885 /*----------------------------------------------------------------------------*/
3887 aisFsmRunEventIbssAloneTimeOut (
3888 IN P_ADAPTER_T prAdapter,
3892 P_AIS_FSM_INFO_T prAisFsmInfo;
3893 ENUM_AIS_STATE_T eNextState;
3895 DEBUGFUNC("aisFsmRunEventIbssAloneTimeOut()");
3897 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3898 eNextState = prAisFsmInfo->eCurrentState;
3900 switch(prAisFsmInfo->eCurrentState) {
3901 case AIS_STATE_IBSS_ALONE:
3903 /* There is no one participate in our AdHoc during this TIMEOUT Interval
3904 * so go back to search for a valid IBSS again.
3907 DBGLOG(AIS, LOUD, ("EVENT-IBSS ALONE TIMER: Start pairing\n"));
3909 prAisFsmInfo->fgTryScan = TRUE;
3912 aisFsmReleaseCh(prAdapter);
3914 /* Pull back to SEARCH to find candidate again */
3915 eNextState = AIS_STATE_SEARCH;
3924 /* Call aisFsmSteps() when we are going to change AIS STATE */
3925 if (eNextState != prAisFsmInfo->eCurrentState) {
3926 aisFsmSteps(prAdapter, eNextState);
3930 } /* end of aisIbssAloneTimeOut() */
3933 /*----------------------------------------------------------------------------*/
3935 * @brief This function will indicate an Event of "Join Time-Out" to AIS FSM.
3937 * @param[in] u4Param Unused timer parameter
3941 /*----------------------------------------------------------------------------*/
3943 aisFsmRunEventJoinTimeout (
3944 IN P_ADAPTER_T prAdapter,
3948 P_AIS_FSM_INFO_T prAisFsmInfo;
3949 ENUM_AIS_STATE_T eNextState;
3951 DEBUGFUNC("aisFsmRunEventJoinTimeout()");
3953 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3954 eNextState = prAisFsmInfo->eCurrentState;
3956 switch(prAisFsmInfo->eCurrentState) {
3957 case AIS_STATE_JOIN:
3958 DBGLOG(AIS, LOUD, ("EVENT- JOIN TIMEOUT\n"));
3960 /* 1. Do abort JOIN */
3961 aisFsmStateAbort_JOIN(prAdapter);
3963 /* 2. Increase Join Failure Count */
3964 prAisFsmInfo->prTargetStaRec->ucJoinFailureCount++;
3967 if(prAisFsmInfo->prTargetStaRec->ucJoinFailureCount < JOIN_MAX_RETRY_FAILURE_COUNT) {
3968 /* 3.1 Retreat to AIS_STATE_SEARCH state for next try */
3969 eNextState = AIS_STATE_SEARCH;
3972 /* 3.2 Retreat to AIS_STATE_WAIT_FOR_NEXT_SCAN state for next try */
3973 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
3976 eNextState = AIS_STATE_IDLE;
3979 case AIS_STATE_NORMAL_TR:
3980 /* 1. release channel */
3981 aisFsmReleaseCh(prAdapter);
3982 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
3984 /* 2. process if there is pending scan */
3985 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
3986 wlanClearScanningResult(prAdapter);
3987 eNextState = AIS_STATE_ONLINE_SCAN;
3993 /* release channel */
3994 aisFsmReleaseCh(prAdapter);
4000 /* Call aisFsmSteps() when we are going to change AIS STATE */
4001 if (eNextState != prAisFsmInfo->eCurrentState) {
4002 aisFsmSteps(prAdapter, eNextState);
4006 } /* end of aisFsmRunEventJoinTimeout() */
4009 #if defined(CFG_TEST_MGMT_FSM) && (CFG_TEST_MGMT_FSM != 0)
4010 /*----------------------------------------------------------------------------*/
4018 /*----------------------------------------------------------------------------*/
4024 P_MSG_AIS_ABORT_T prAisAbortMsg;
4025 P_CONNECTION_SETTINGS_T prConnSettings;
4026 UINT_8 aucSSID[]="pci-11n";
4029 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4031 /* Set Connection Request Issued Flag */
4032 prConnSettings->fgIsConnReqIssued = TRUE;
4033 prConnSettings->ucSSIDLen = ucSSIDLen;
4034 kalMemCopy(prConnSettings->aucSSID, aucSSID, ucSSIDLen);
4036 prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
4037 if (!prAisAbortMsg) {
4039 ASSERT(0); // Can't trigger SCAN FSM
4043 prAisAbortMsg->rMsgHdr.eMsgId = MID_HEM_AIS_FSM_ABORT;
4045 mboxSendMsg(prAdapter,
4047 (P_MSG_HDR_T) prAisAbortMsg,
4048 MSG_SEND_METHOD_BUF);
4050 wifi_send_msg(INDX_WIFI, MSG_ID_WIFI_IST, 0);
4054 #endif /* CFG_TEST_MGMT_FSM */
4057 /*----------------------------------------------------------------------------*/
4059 * \brief This function is used to handle OID_802_11_BSSID_LIST_SCAN
4061 * \param[in] prAdapter Pointer of ADAPTER_T
4062 * \param[in] prSsid Pointer of SSID_T if specified
4063 * \param[in] pucIe Pointer to buffer of extra information elements to be attached
4064 * \param[in] u4IeLength Length of information elements
4068 /*----------------------------------------------------------------------------*/
4071 IN P_ADAPTER_T prAdapter,
4072 IN P_PARAM_SSID_T prSsid,
4074 IN UINT_32 u4IeLength
4077 P_CONNECTION_SETTINGS_T prConnSettings;
4078 P_BSS_INFO_T prAisBssInfo;
4079 P_AIS_FSM_INFO_T prAisFsmInfo;
4081 DEBUGFUNC("aisFsmScanRequest()");
4084 ASSERT(u4IeLength <= MAX_IE_LENGTH);
4086 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4087 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4088 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4090 if (!prConnSettings->fgIsScanReqIssued) {
4091 prConnSettings->fgIsScanReqIssued = TRUE;
4093 if(prSsid == NULL) {
4094 prAisFsmInfo->ucScanSSIDLen = 0;
4097 COPY_SSID(prAisFsmInfo->aucScanSSID,
4098 prAisFsmInfo->ucScanSSIDLen,
4100 (UINT_8)prSsid->u4SsidLen);
4103 if(u4IeLength > 0 && u4IeLength <= MAX_IE_LENGTH ) {
4104 prAisFsmInfo->u4ScanIELength = u4IeLength;
4105 kalMemCopy(prAisFsmInfo->aucScanIEBuf, pucIe, u4IeLength);
4108 prAisFsmInfo->u4ScanIELength = 0;
4111 if(prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR) {
4112 if(prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE
4113 && prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
4114 // 802.1x might not finished yet, pend it for later handling ..
4115 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
4118 if(prAisFsmInfo->fgIsChannelGranted == TRUE) {
4119 DBGLOG(AIS, WARN, ("Scan Request with channel granted for join operation: %d, %d",
4120 prAisFsmInfo->fgIsChannelGranted,
4121 prAisFsmInfo->fgIsChannelRequested));
4124 /* start online scan */
4125 wlanClearScanningResult(prAdapter);
4126 aisFsmSteps(prAdapter, AIS_STATE_ONLINE_SCAN);
4129 else if(prAisFsmInfo->eCurrentState == AIS_STATE_IDLE) {
4130 wlanClearScanningResult(prAdapter);
4131 aisFsmSteps(prAdapter, AIS_STATE_SCAN);
4134 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
4138 DBGLOG(AIS, WARN, ("Scan Request dropped. (state: %d)\n", prAisFsmInfo->eCurrentState));
4142 } /* end of aisFsmScanRequest() */
4145 /*----------------------------------------------------------------------------*/
4147 * \brief This function is invoked when CNM granted channel privilege
4149 * \param[in] prAdapter Pointer of ADAPTER_T
4153 /*----------------------------------------------------------------------------*/
4155 aisFsmRunEventChGrant (
4156 IN P_ADAPTER_T prAdapter,
4157 IN P_MSG_HDR_T prMsgHdr
4160 P_BSS_INFO_T prAisBssInfo;
4161 P_AIS_FSM_INFO_T prAisFsmInfo;
4162 P_MSG_CH_GRANT_T prMsgChGrant;
4164 UINT_32 u4GrantInterval;
4169 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4170 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4171 prMsgChGrant = (P_MSG_CH_GRANT_T)prMsgHdr;
4173 ucTokenID = prMsgChGrant->ucTokenID;
4174 u4GrantInterval = prMsgChGrant->u4GrantInterval;
4176 /* 1. free message */
4177 cnmMemFree(prAdapter, prMsgHdr);
4179 if(prAisFsmInfo->eCurrentState == AIS_STATE_REQ_CHANNEL_JOIN &&
4180 prAisFsmInfo->ucSeqNumOfChReq == ucTokenID) {
4181 /* 2. channel privilege has been approved */
4182 prAisFsmInfo->u4ChGrantedInterval = u4GrantInterval;
4184 /* 3. state transition to join/ibss-alone/ibss-merge */
4185 /* 3.1 set timeout timer in cases join could not be completed */
4186 cnmTimerStartTimer(prAdapter,
4187 &prAisFsmInfo->rJoinTimeoutTimer,
4188 prAisFsmInfo->u4ChGrantedInterval - AIS_JOIN_CH_GRANT_THRESHOLD);
4189 /* 3.2 set local variable to indicate join timer is ticking */
4190 prAisFsmInfo->fgIsInfraChannelFinished = FALSE;
4192 /* 3.3 switch to join state */
4193 aisFsmSteps(prAdapter, AIS_STATE_JOIN);
4195 prAisFsmInfo->fgIsChannelGranted = TRUE;
4197 else { /* mismatched grant */
4198 /* 2. return channel privilege to CNM immediately */
4199 aisFsmReleaseCh(prAdapter);
4203 } /* end of aisFsmRunEventChGrant() */
4206 /*----------------------------------------------------------------------------*/
4208 * \brief This function is to inform CNM that channel privilege
4211 * \param[in] prAdapter Pointer of ADAPTER_T
4215 /*----------------------------------------------------------------------------*/
4218 IN P_ADAPTER_T prAdapter
4221 P_AIS_FSM_INFO_T prAisFsmInfo;
4222 P_MSG_CH_ABORT_T prMsgChAbort;
4226 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4228 if(prAisFsmInfo->fgIsChannelGranted == TRUE
4229 || prAisFsmInfo->fgIsChannelRequested == TRUE) {
4231 prAisFsmInfo->fgIsChannelRequested = FALSE;
4232 prAisFsmInfo->fgIsChannelGranted = FALSE;
4234 /* 1. return channel privilege to CNM immediately */
4235 prMsgChAbort = (P_MSG_CH_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_ABORT_T));
4236 if (!prMsgChAbort) {
4237 ASSERT(0); // Can't release Channel to CNM
4241 prMsgChAbort->rMsgHdr.eMsgId = MID_MNY_CNM_CH_ABORT;
4242 prMsgChAbort->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
4243 prMsgChAbort->ucTokenID = prAisFsmInfo->ucSeqNumOfChReq;
4245 mboxSendMsg(prAdapter,
4247 (P_MSG_HDR_T) prMsgChAbort,
4248 MSG_SEND_METHOD_BUF);
4252 } /* end of aisFsmReleaseCh() */
4255 /*----------------------------------------------------------------------------*/
4257 * \brief This function is to inform AIS that corresponding beacon has not
4258 * been received for a while and probing is not successful
4260 * \param[in] prAdapter Pointer of ADAPTER_T
4264 /*----------------------------------------------------------------------------*/
4266 aisBssBeaconTimeout (
4267 IN P_ADAPTER_T prAdapter
4270 P_BSS_INFO_T prAisBssInfo;
4271 BOOLEAN fgDoAbortIndication = FALSE;
4275 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4277 //4 <1> Diagnose Connection for Beacon Timeout Event
4278 if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
4279 if (OP_MODE_INFRASTRUCTURE == prAisBssInfo->eCurrentOPMode) {
4280 P_STA_RECORD_T prStaRec = prAisBssInfo->prStaRecOfAP;
4283 fgDoAbortIndication = TRUE;
4286 else if (OP_MODE_IBSS == prAisBssInfo->eCurrentOPMode) {
4287 fgDoAbortIndication = TRUE;
4291 //4 <2> invoke abort handler
4292 if (fgDoAbortIndication) {
4293 aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_RADIO_LOST, TRUE);
4297 } /* end of aisBssBeaconTimeout() */
4300 /*----------------------------------------------------------------------------*/
4302 * \brief This function is to inform AIS that DEAUTH frame has been
4303 * sent and thus state machine could go ahead
4305 * \param[in] prAdapter Pointer of ADAPTER_T
4306 * \param[in] prMsduInfo Pointer of MSDU_INFO_T for DEAUTH frame
4307 * \param[in] prAdapter Pointer of ADAPTER_T
4309 * \return WLAN_STATUS_SUCCESS
4311 /*----------------------------------------------------------------------------*/
4313 aisDeauthXmitComplete (
4314 IN P_ADAPTER_T prAdapter,
4315 IN P_MSDU_INFO_T prMsduInfo,
4316 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
4319 P_AIS_FSM_INFO_T prAisFsmInfo;
4323 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4325 if(prAisFsmInfo->eCurrentState == AIS_STATE_DISCONNECTING) {
4326 if(rTxDoneStatus != TX_RESULT_DROPPED_IN_DRIVER) {
4327 aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_NEW_CONNECTION, FALSE);
4331 DBGLOG(AIS, WARN, ("DEAUTH frame transmitted without further handling"));
4334 return WLAN_STATUS_SUCCESS;
4336 } /* end of aisDeauthXmitComplete() */
4338 #if CFG_SUPPORT_ROAMING
4339 /*----------------------------------------------------------------------------*/
4341 * @brief This function will indicate an Event of "Looking for a candidate due to weak signal" to AIS FSM.
4343 * @param[in] u4ReqScan Requesting Scan or not
4347 /*----------------------------------------------------------------------------*/
4349 aisFsmRunEventRoamingDiscovery (
4350 IN P_ADAPTER_T prAdapter,
4354 P_AIS_FSM_INFO_T prAisFsmInfo;
4355 P_CONNECTION_SETTINGS_T prConnSettings;
4356 ENUM_AIS_REQUEST_TYPE_T eAisRequest;
4358 DBGLOG(AIS, LOUD, ("aisFsmRunEventRoamingDiscovery()\n"));
4360 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4361 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4363 /* search candidates by best rssi */
4364 prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
4366 /* results are still new */
4368 roamingFsmRunEventRoam(prAdapter);
4369 eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4372 if(prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN
4373 || prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4374 eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4377 eAisRequest = AIS_REQUEST_ROAMING_SEARCH;
4381 if(prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR && prAisFsmInfo->fgIsInfraChannelFinished == TRUE) {
4382 if(eAisRequest == AIS_REQUEST_ROAMING_SEARCH) {
4383 aisFsmSteps(prAdapter, AIS_STATE_LOOKING_FOR);
4386 aisFsmSteps(prAdapter, AIS_STATE_SEARCH);
4390 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
4391 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
4393 aisFsmInsertRequest(prAdapter, eAisRequest);
4397 } /* end of aisFsmRunEventRoamingDiscovery() */
4399 /*----------------------------------------------------------------------------*/
4401 * @brief Update the time of ScanDone for roaming and transit to Roam state.
4407 /*----------------------------------------------------------------------------*/
4409 aisFsmRoamingScanResultsUpdate (
4410 IN P_ADAPTER_T prAdapter
4413 P_AIS_FSM_INFO_T prAisFsmInfo;
4414 P_ROAMING_INFO_T prRoamingFsmInfo;
4415 ENUM_AIS_STATE_T eNextState;
4417 DBGLOG(AIS, LOUD, ("->aisFsmRoamingScanResultsUpdate()\n"));
4419 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4420 prRoamingFsmInfo = (P_ROAMING_INFO_T)&(prAdapter->rWifiVar.rRoamingInfo);
4422 roamingFsmScanResultsUpdate(prAdapter);
4424 eNextState = prAisFsmInfo->eCurrentState;
4425 if (prRoamingFsmInfo->eCurrentState == ROAMING_STATE_DISCOVERY) {
4426 roamingFsmRunEventRoam(prAdapter);
4427 eNextState = AIS_STATE_SEARCH;
4429 else if (prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4430 eNextState = AIS_STATE_SEARCH;
4432 else if (prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
4433 eNextState = AIS_STATE_NORMAL_TR;
4437 } /* end of aisFsmRoamingScanResultsUpdate() */
4439 /*----------------------------------------------------------------------------*/
4441 * @brief This function will modify and update necessary information to firmware
4442 * for disconnection of last AP before switching to roaming bss.
4444 * @param IN prAdapter Pointer to the Adapter structure.
4445 * prTargetStaRec Target of StaRec of roaming
4449 /*----------------------------------------------------------------------------*/
4451 aisFsmRoamingDisconnectPrevAP (
4452 IN P_ADAPTER_T prAdapter,
4453 IN P_STA_RECORD_T prTargetStaRec
4456 P_BSS_INFO_T prAisBssInfo;
4458 DBGLOG(AIS, LOUD, ("aisFsmRoamingDisconnectPrevAP()"));
4462 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4464 nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
4466 /* Not invoke rlmBssAborted() here to avoid prAisBssInfo->fg40mBwAllowed
4467 * to be reset. RLM related parameters will be reset again when handling
4468 * association response in rlmProcessAssocRsp(). 20110413
4470 //rlmBssAborted(prAdapter, prAisBssInfo);
4472 //4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed.
4473 if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
4474 scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
4477 //4 <4> Change Media State immediately.
4478 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
4480 //4 <4.1> sync. with firmware
4481 prTargetStaRec->ucNetTypeIndex = 0xff; /* Virtial NetType */
4482 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
4483 prTargetStaRec->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX; /* Virtial NetType */
4486 } /* end of aisFsmRoamingDisconnectPrevAP() */
4488 /*----------------------------------------------------------------------------*/
4490 * @brief This function will update the contain of BSS_INFO_T for AIS network once
4491 * the roaming was completed.
4493 * @param IN prAdapter Pointer to the Adapter structure.
4494 * prStaRec StaRec of roaming AP
4499 /*----------------------------------------------------------------------------*/
4501 aisUpdateBssInfoForRoamingAP (
4502 IN P_ADAPTER_T prAdapter,
4503 IN P_STA_RECORD_T prStaRec,
4504 IN P_SW_RFB_T prAssocRspSwRfb
4507 P_BSS_INFO_T prAisBssInfo;
4509 DBGLOG(AIS, LOUD, ("aisUpdateBssInfoForRoamingAP()"));
4513 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4515 //4 <1.1> Change FW's Media State immediately.
4516 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
4518 //4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have.
4519 if ((prAisBssInfo->prStaRecOfAP) &&
4520 (prAisBssInfo->prStaRecOfAP != prStaRec) &&
4521 (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
4522 cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
4525 //4 <1.3> Update BSS_INFO_T
4526 aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
4528 //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
4529 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
4531 //4 <1.6> Indicate Connected Event to Host immediately.
4532 /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
4533 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
4536 } /* end of aisFsmRoamingUpdateBss() */
4538 #endif /* CFG_SUPPORT_ROAMING */
4541 /*----------------------------------------------------------------------------*/
4543 * @brief Check if there is any pending request and remove it (optional)
4552 /*----------------------------------------------------------------------------*/
4554 aisFsmIsRequestPending (
4555 IN P_ADAPTER_T prAdapter,
4556 IN ENUM_AIS_REQUEST_TYPE_T eReqType,
4560 P_AIS_FSM_INFO_T prAisFsmInfo;
4561 P_AIS_REQ_HDR_T prPendingReqHdr, prPendingReqHdrNext;
4564 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4566 /* traverse through pending request list */
4567 LINK_FOR_EACH_ENTRY_SAFE(prPendingReqHdr,
4568 prPendingReqHdrNext,
4569 &(prAisFsmInfo->rPendingReqList),
4572 /* check for specified type */
4573 if(prPendingReqHdr->eReqType == eReqType) {
4574 /* check if need to remove */
4575 if(bRemove == TRUE) {
4576 LINK_REMOVE_KNOWN_ENTRY(&(prAisFsmInfo->rPendingReqList), &(prPendingReqHdr->rLinkEntry));
4578 cnmMemFree(prAdapter, prPendingReqHdr);
4589 /*----------------------------------------------------------------------------*/
4591 * @brief Get next pending request
4595 * @return P_AIS_REQ_HDR_T
4597 /*----------------------------------------------------------------------------*/
4599 aisFsmGetNextRequest (
4600 IN P_ADAPTER_T prAdapter
4603 P_AIS_FSM_INFO_T prAisFsmInfo;
4604 P_AIS_REQ_HDR_T prPendingReqHdr;
4607 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4609 LINK_REMOVE_HEAD(&(prAisFsmInfo->rPendingReqList), prPendingReqHdr, P_AIS_REQ_HDR_T);
4611 return prPendingReqHdr;
4615 /*----------------------------------------------------------------------------*/
4617 * @brief Insert a new request
4625 /*----------------------------------------------------------------------------*/
4627 aisFsmInsertRequest (
4628 IN P_ADAPTER_T prAdapter,
4629 IN ENUM_AIS_REQUEST_TYPE_T eReqType
4632 P_AIS_REQ_HDR_T prAisReq;
4633 P_AIS_FSM_INFO_T prAisFsmInfo;
4636 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4638 prAisReq = (P_AIS_REQ_HDR_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(AIS_REQ_HDR_T));
4641 ASSERT(0); // Can't generate new message
4645 prAisReq->eReqType = eReqType;
4647 /* attach request into pending request list */
4648 LINK_INSERT_TAIL(&prAisFsmInfo->rPendingReqList, &prAisReq->rLinkEntry);
4654 /*----------------------------------------------------------------------------*/
4656 * @brief Flush all pending requests
4662 /*----------------------------------------------------------------------------*/
4664 aisFsmFlushRequest (
4665 IN P_ADAPTER_T prAdapter
4668 P_AIS_REQ_HDR_T prAisReq;
4672 while((prAisReq = aisFsmGetNextRequest(prAdapter)) != NULL) {
4673 cnmMemFree(prAdapter, prAisReq);