Commit | Line | Data |
---|---|---|
6fa3eb70 S |
1 | /* |
2 | ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/saa_fsm.c#2 $ | |
3 | */ | |
4 | ||
5 | /*! \file "saa_fsm.c" | |
6 | \brief This file defines the FSM for SAA MODULE. | |
7 | ||
8 | This file defines the FSM for SAA MODULE. | |
9 | */ | |
10 | ||
11 | ||
12 | ||
13 | /* | |
14 | ** $Log: saa_fsm.c $ | |
15 | ** | |
16 | ** 09 04 2013 cp.wu | |
17 | ** fix typo | |
18 | ** | |
19 | ** 09 03 2013 cp.wu | |
20 | ** add path for reassociation | |
21 | * | |
22 | * 07 17 2012 yuche.tsai | |
23 | * NULL | |
24 | * Compile no error before trial run. | |
25 | * | |
26 | * 04 20 2012 cp.wu | |
27 | * [WCXRP00000913] [MT6620 Wi-Fi] create repository of source code dedicated for MT6620 E6 ASIC | |
28 | * correct macro | |
29 | * | |
30 | * 11 24 2011 wh.su | |
31 | * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG | |
32 | * Adjust code for DBG and CONFIG_XLOG. | |
33 | * | |
34 | * 11 11 2011 wh.su | |
35 | * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG | |
36 | * modify the xlog related code. | |
37 | * | |
38 | * 11 04 2011 cp.wu | |
39 | * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT for REASSOCIATED cases as an explicit trigger for Android framework | |
40 | * 1. for DEAUTH/DISASSOC cases, indicate for DISCONNECTION immediately. | |
41 | * 2. (Android only) when reassociation-and-non-roaming cases happened, indicate an extra DISCONNECT indication to Android Wi-Fi framework | |
42 | * | |
43 | * 11 02 2011 wh.su | |
44 | * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG | |
45 | * adding the code for XLOG. | |
46 | * | |
47 | * 09 30 2011 cm.chang | |
48 | * [WCXRP00001020] [MT6620 Wi-Fi][Driver] Handle secondary channel offset of AP in 5GHz band | |
49 | * Add debug message about 40MHz bandwidth allowed | |
50 | * | |
51 | * 05 12 2011 cp.wu | |
52 | * [WCXRP00000720] [MT6620 Wi-Fi][Driver] Do not do any further operation in case STA-REC has been invalidated before SAA-FSM starts to roll | |
53 | * check for valid STA-REC before SAA-FSM starts to roll. | |
54 | * | |
55 | * 04 21 2011 terry.wu | |
56 | * [WCXRP00000674] [MT6620 Wi-Fi][Driver] Refine AAA authSendAuthFrame | |
57 | * Add network type parameter to authSendAuthFrame. | |
58 | * | |
59 | * 04 15 2011 chinghwa.yu | |
60 | * [WCXRP00000065] Update BoW design and settings | |
61 | * Add BOW short range mode. | |
62 | * | |
63 | * 04 14 2011 cm.chang | |
64 | * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency | |
65 | * . | |
66 | * | |
67 | * 03 31 2011 puff.wen | |
68 | * NULL | |
69 | * . | |
70 | * | |
71 | * 02 10 2011 yuche.tsai | |
72 | * [WCXRP00000431] [Volunteer Patch][MT6620][Driver] Add MLME support for deauthentication under AP(Hot-Spot) mode. | |
73 | * Add RX deauthentication & disassociation process under Hot-Spot mode. | |
74 | * | |
75 | * 01 26 2011 yuche.tsai | |
76 | * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record. | |
77 | * . | |
78 | * | |
79 | * 01 25 2011 yuche.tsai | |
80 | * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record. | |
81 | * Fix compile error of after Station Type Macro modification. | |
82 | * | |
83 | * 01 25 2011 yuche.tsai | |
84 | * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record. | |
85 | * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role. | |
86 | * | |
87 | * 11 29 2010 cp.wu | |
88 | * [WCXRP00000210] [MT6620 Wi-Fi][Driver][FW] Set RCPI value in STA_REC for initial TX rate selection of auto-rate algorithm | |
89 | * update ucRcpi of STA_RECORD_T for AIS when | |
90 | * 1) Beacons for IBSS merge is received | |
91 | * 2) Associate Response for a connecting peer is received | |
92 | * | |
93 | * 10 18 2010 cp.wu | |
94 | * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete and might leads to BSOD when entering RF test with AIS associated | |
95 | * 1. remove redundant variables in STA_REC structure | |
96 | * 2. add STA-REC uninitialization routine for clearing pending events | |
97 | * | |
98 | * 09 03 2010 kevin.huang | |
99 | * NULL | |
100 | * Refine #include sequence and solve recursive/nested #include issue | |
101 | * | |
102 | * 08 30 2010 cp.wu | |
103 | * NULL | |
104 | * eliminate klockwork errors | |
105 | * | |
106 | * 08 24 2010 chinghwa.yu | |
107 | * NULL | |
108 | * Update for MID_SCN_BOW_SCAN_DONE mboxDummy. | |
109 | * Update saa_fsm for BOW. | |
110 | * | |
111 | * 08 16 2010 cp.wu | |
112 | * NULL | |
113 | * Replace CFG_SUPPORT_BOW by CFG_ENABLE_BT_OVER_WIFI. | |
114 | * There is no CFG_SUPPORT_BOW in driver domain source. | |
115 | * | |
116 | * 08 02 2010 yuche.tsai | |
117 | * NULL | |
118 | * Add support for P2P join event start. | |
119 | * | |
120 | * 07 12 2010 cp.wu | |
121 | * | |
122 | * SAA will take a record for tracking request sequence number. | |
123 | * | |
124 | * 07 08 2010 cp.wu | |
125 | * | |
126 | * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository. | |
127 | * | |
128 | * 07 01 2010 cp.wu | |
129 | * [WPD00003833][MT6620 and MT5931] Driver migration | |
130 | * AIS-FSM integration with CNM channel request messages | |
131 | * | |
132 | * 06 23 2010 cp.wu | |
133 | * [WPD00003833][MT6620 and MT5931] Driver migration | |
134 | * sync. with main branch for reseting to state 1 when associating with another AP | |
135 | * | |
136 | * 06 21 2010 cp.wu | |
137 | * [WPD00003833][MT6620 and MT5931] Driver migration | |
138 | * refine TX-DONE callback. | |
139 | * | |
140 | * 06 21 2010 wh.su | |
141 | * [WPD00003840][MT6620 5931] Security migration | |
142 | * remove duplicate variable for migration. | |
143 | * | |
144 | * 06 18 2010 cm.chang | |
145 | * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver | |
146 | * Provide cnmMgtPktAlloc() and alloc/free function of msg/buf | |
147 | * | |
148 | * 06 18 2010 wh.su | |
149 | * [WPD00003840][MT6620 5931] Security migration | |
150 | * migration the security related function from firmware. | |
151 | * | |
152 | * 06 17 2010 yuche.tsai | |
153 | * [WPD00003839][MT6620 5931][P2P] Feature migration | |
154 | * Fix compile error when enable WiFi Direct function. | |
155 | * | |
156 | * 06 14 2010 cp.wu | |
157 | * [WPD00003833][MT6620 and MT5931] Driver migration | |
158 | * saa_fsm.c is migrated. | |
159 | * | |
160 | * 05 12 2010 kevin.huang | |
161 | * [BORA00000794][WIFISYS][New Feature]Power Management Support | |
162 | * Add Power Management - Legacy PS-POLL support. | |
163 | * | |
164 | * 04 24 2010 cm.chang | |
165 | * [BORA00000018]Integrate WIFI part into BORA for the 1st time | |
166 | * g_aprBssInfo[] depends on CFG_SUPPORT_P2P and CFG_SUPPORT_BOW | |
167 | * | |
168 | * 04 19 2010 kevin.huang | |
169 | * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support | |
170 | * | |
171 | * * * Add Connection Policy - Any and Rx Burst Deauth Support for WHQL | |
172 | * | |
173 | * 03 10 2010 kevin.huang | |
174 | * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support | |
175 | * Add Channel Manager for arbitration of JOIN and SCAN Req | |
176 | * | |
177 | * 02 26 2010 kevin.huang | |
178 | * [BORA00000603][WIFISYS] [New Feature] AAA Module Support | |
179 | * Add support of Driver STA_RECORD_T activation | |
180 | * | |
181 | * 02 04 2010 kevin.huang | |
182 | * [BORA00000603][WIFISYS] [New Feature] AAA Module Support | |
183 | * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup | |
184 | * | |
185 | * 01 27 2010 wh.su | |
186 | * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code | |
187 | * add and fixed some security function. | |
188 | * | |
189 | * 01 12 2010 kevin.huang | |
190 | * [BORA00000018]Integrate WIFI part into BORA for the 1st time | |
191 | * Fix compile warning due to declared but not used | |
192 | * | |
193 | * 01 11 2010 kevin.huang | |
194 | * [BORA00000018]Integrate WIFI part into BORA for the 1st time | |
195 | * Add Deauth and Disassoc Handler | |
196 | * | |
197 | * 01 08 2010 kevin.huang | |
198 | * [BORA00000018]Integrate WIFI part into BORA for the 1st time | |
199 | * Refine Debug Label | |
200 | * | |
201 | * 12 18 2009 cm.chang | |
202 | * [BORA00000018]Integrate WIFI part into BORA for the 1st time | |
203 | * . | |
204 | * | |
205 | * Dec 3 2009 mtk01461 | |
206 | * [BORA00000018] Integrate WIFI part into BORA for the 1st time | |
207 | * Update comment | |
208 | * | |
209 | * Dec 1 2009 mtk01088 | |
210 | * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code | |
211 | * rename the function | |
212 | * | |
213 | * Nov 24 2009 mtk01461 | |
214 | * [BORA00000018] Integrate WIFI part into BORA for the 1st time | |
215 | * Revise MGMT Handler with Retain Status | |
216 | * | |
217 | * Nov 23 2009 mtk01461 | |
218 | * [BORA00000018] Integrate WIFI part into BORA for the 1st time | |
219 | * | |
220 | */ | |
221 | ||
222 | /******************************************************************************* | |
223 | * C O M P I L E R F L A G S | |
224 | ******************************************************************************** | |
225 | */ | |
226 | ||
227 | /******************************************************************************* | |
228 | * E X T E R N A L R E F E R E N C E S | |
229 | ******************************************************************************** | |
230 | */ | |
231 | #include "precomp.h" | |
232 | ||
233 | /******************************************************************************* | |
234 | * C O N S T A N T S | |
235 | ******************************************************************************** | |
236 | */ | |
237 | ||
238 | /******************************************************************************* | |
239 | * D A T A T Y P E S | |
240 | ******************************************************************************** | |
241 | */ | |
242 | ||
243 | /******************************************************************************* | |
244 | * P U B L I C D A T A | |
245 | ******************************************************************************** | |
246 | */ | |
247 | ||
248 | /******************************************************************************* | |
249 | * P R I V A T E D A T A | |
250 | ******************************************************************************** | |
251 | */ | |
252 | #if DBG | |
253 | /*lint -save -e64 Type mismatch */ | |
254 | static PUINT_8 apucDebugAAState[AA_STATE_NUM] = { | |
255 | (PUINT_8)DISP_STRING("AA_STATE_IDLE"), | |
256 | (PUINT_8)DISP_STRING("SAA_STATE_SEND_AUTH1"), | |
257 | (PUINT_8)DISP_STRING("SAA_STATE_WAIT_AUTH2"), | |
258 | (PUINT_8)DISP_STRING("SAA_STATE_SEND_AUTH3"), | |
259 | (PUINT_8)DISP_STRING("SAA_STATE_WAIT_AUTH4"), | |
260 | (PUINT_8)DISP_STRING("SAA_STATE_SEND_ASSOC1"), | |
261 | (PUINT_8)DISP_STRING("SAA_STATE_WAIT_ASSOC2"), | |
262 | (PUINT_8)DISP_STRING("AAA_STATE_SEND_AUTH2"), | |
263 | (PUINT_8)DISP_STRING("AAA_STATE_SEND_AUTH4"), | |
264 | (PUINT_8)DISP_STRING("AAA_STATE_SEND_ASSOC2"), | |
265 | (PUINT_8)DISP_STRING("AA_STATE_RESOURCE") | |
266 | }; | |
267 | /*lint -restore */ | |
268 | #endif /* DBG */ | |
269 | ||
270 | /******************************************************************************* | |
271 | * M A C R O S | |
272 | ******************************************************************************** | |
273 | */ | |
274 | ||
275 | /******************************************************************************* | |
276 | * F U N C T I O N D E C L A R A T I O N S | |
277 | ******************************************************************************** | |
278 | */ | |
279 | ||
280 | /******************************************************************************* | |
281 | * F U N C T I O N S | |
282 | ******************************************************************************** | |
283 | */ | |
284 | /*----------------------------------------------------------------------------*/ | |
285 | /*! | |
286 | * @brief The Core FSM engine of SAA Module. | |
287 | * | |
288 | * @param[in] prStaRec Pointer to the STA_RECORD_T | |
289 | * @param[in] eNextState The value of Next State | |
290 | * @param[in] prRetainedSwRfb Pointer to the retained SW_RFB_T for JOIN Success | |
291 | * | |
292 | * @return (none) | |
293 | */ | |
294 | /*----------------------------------------------------------------------------*/ | |
295 | VOID | |
296 | saaFsmSteps ( | |
297 | IN P_ADAPTER_T prAdapter, | |
298 | IN P_STA_RECORD_T prStaRec, | |
299 | IN ENUM_AA_STATE_T eNextState, | |
300 | IN P_SW_RFB_T prRetainedSwRfb | |
301 | ) | |
302 | { | |
303 | ENUM_AA_STATE_T ePreviousState; | |
304 | BOOLEAN fgIsTransition; | |
305 | ||
306 | ||
307 | ASSERT(prStaRec); | |
308 | if(!prStaRec) { | |
309 | return; | |
310 | } | |
311 | ||
312 | do { | |
313 | ||
314 | #if DBG | |
315 | DBGLOG(SAA, STATE, ("TRANSITION: [%s] -> [%s]\n", | |
316 | apucDebugAAState[prStaRec->eAuthAssocState], | |
317 | apucDebugAAState[eNextState])); | |
318 | #else | |
319 | DBGLOG(SAA, STATE, ("[%d] TRANSITION: [%d] -> [%d]\n", | |
320 | DBG_SAA_IDX, | |
321 | prStaRec->eAuthAssocState, | |
322 | eNextState)); | |
323 | #endif | |
324 | ePreviousState = prStaRec->eAuthAssocState; | |
325 | ||
326 | /* NOTE(Kevin): This is the only place to change the eAuthAssocState(except initial) */ | |
327 | prStaRec->eAuthAssocState = eNextState; | |
328 | ||
329 | ||
330 | fgIsTransition = (BOOLEAN)FALSE; | |
331 | switch (prStaRec->eAuthAssocState) { | |
332 | case AA_STATE_IDLE: | |
333 | { | |
334 | if (ePreviousState != prStaRec->eAuthAssocState) { /* Only trigger this event once */ | |
335 | ||
336 | if (prRetainedSwRfb) { | |
337 | ||
338 | if (saaFsmSendEventJoinComplete(prAdapter, | |
339 | WLAN_STATUS_SUCCESS, | |
340 | prStaRec, | |
341 | prRetainedSwRfb) == WLAN_STATUS_SUCCESS) { | |
342 | } | |
343 | else { | |
344 | eNextState = AA_STATE_RESOURCE; | |
345 | fgIsTransition = TRUE; | |
346 | } | |
347 | } | |
348 | else { | |
349 | if (saaFsmSendEventJoinComplete(prAdapter, | |
350 | WLAN_STATUS_FAILURE, | |
351 | prStaRec, | |
352 | NULL) == WLAN_STATUS_RESOURCES) { | |
353 | eNextState = AA_STATE_RESOURCE; | |
354 | fgIsTransition = TRUE; | |
355 | } | |
356 | } | |
357 | ||
358 | } | |
359 | ||
360 | /* Free allocated TCM memory */ | |
361 | if (prStaRec->prChallengeText) { | |
362 | cnmMemFree(prAdapter, prStaRec->prChallengeText); | |
363 | prStaRec->prChallengeText = (P_IE_CHALLENGE_TEXT_T)NULL; | |
364 | } | |
365 | } | |
366 | break; | |
367 | ||
368 | case SAA_STATE_SEND_AUTH1: | |
369 | { | |
370 | /* Do tasks in INIT STATE */ | |
371 | if (prStaRec->ucTxAuthAssocRetryCount >= | |
372 | prStaRec->ucTxAuthAssocRetryLimit) { | |
373 | ||
374 | /* Record the Status Code of Authentication Request */ | |
375 | prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT; | |
376 | ||
377 | eNextState = AA_STATE_IDLE; | |
378 | fgIsTransition = TRUE; | |
379 | } | |
380 | else { | |
381 | prStaRec->ucTxAuthAssocRetryCount++; | |
382 | ||
383 | /* Update Station Record - Class 1 Flag */ | |
384 | cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1); | |
385 | ||
386 | #if !CFG_SUPPORT_AAA | |
387 | if (authSendAuthFrame(prAdapter, | |
388 | prStaRec, | |
389 | AUTH_TRANSACTION_SEQ_1) != WLAN_STATUS_SUCCESS) | |
390 | #else | |
391 | if (authSendAuthFrame( | |
392 | prAdapter, | |
393 | prStaRec, | |
394 | prStaRec->ucNetTypeIndex, | |
395 | NULL, | |
396 | AUTH_TRANSACTION_SEQ_1, | |
397 | STATUS_CODE_RESERVED) != WLAN_STATUS_SUCCESS) | |
398 | #endif /* CFG_SUPPORT_AAA */ | |
399 | { | |
400 | ||
401 | cnmTimerInitTimer(prAdapter, | |
402 | &prStaRec->rTxReqDoneOrRxRespTimer, | |
403 | (PFN_MGMT_TIMEOUT_FUNC)saaFsmRunEventTxReqTimeOut, | |
404 | (ULONG)prStaRec); | |
405 | ||
406 | cnmTimerStartTimer(prAdapter, | |
407 | &prStaRec->rTxReqDoneOrRxRespTimer, | |
408 | TU_TO_MSEC(TX_AUTHENTICATION_RETRY_TIMEOUT_TU)); | |
409 | } | |
410 | } | |
411 | } | |
412 | break; | |
413 | ||
414 | case SAA_STATE_WAIT_AUTH2: | |
415 | break; | |
416 | ||
417 | case SAA_STATE_SEND_AUTH3: | |
418 | { | |
419 | /* Do tasks in INIT STATE */ | |
420 | if (prStaRec->ucTxAuthAssocRetryCount >= | |
421 | prStaRec->ucTxAuthAssocRetryLimit) { | |
422 | ||
423 | /* Record the Status Code of Authentication Request */ | |
424 | prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT; | |
425 | ||
426 | eNextState = AA_STATE_IDLE; | |
427 | fgIsTransition = TRUE; | |
428 | } | |
429 | else { | |
430 | prStaRec->ucTxAuthAssocRetryCount++; | |
431 | ||
432 | #if !CFG_SUPPORT_AAA | |
433 | if (authSendAuthFrame(prAdapter, | |
434 | prStaRec, | |
435 | AUTH_TRANSACTION_SEQ_3) != WLAN_STATUS_SUCCESS) | |
436 | #else | |
437 | if (authSendAuthFrame(prAdapter, | |
438 | prStaRec, | |
439 | prStaRec->ucNetTypeIndex, | |
440 | NULL, | |
441 | AUTH_TRANSACTION_SEQ_3, | |
442 | STATUS_CODE_RESERVED) != WLAN_STATUS_SUCCESS) | |
443 | #endif /* CFG_SUPPORT_AAA */ | |
444 | { | |
445 | ||
446 | cnmTimerInitTimer(prAdapter, | |
447 | &prStaRec->rTxReqDoneOrRxRespTimer, | |
448 | (PFN_MGMT_TIMEOUT_FUNC)saaFsmRunEventTxReqTimeOut, | |
449 | (ULONG)prStaRec); | |
450 | ||
451 | cnmTimerStartTimer(prAdapter, | |
452 | &prStaRec->rTxReqDoneOrRxRespTimer, | |
453 | TU_TO_MSEC(TX_AUTHENTICATION_RETRY_TIMEOUT_TU)); | |
454 | } | |
455 | } | |
456 | } | |
457 | break; | |
458 | ||
459 | case SAA_STATE_WAIT_AUTH4: | |
460 | break; | |
461 | ||
462 | case SAA_STATE_SEND_ASSOC1: | |
463 | /* Do tasks in INIT STATE */ | |
464 | if (prStaRec->ucTxAuthAssocRetryCount >= | |
465 | prStaRec->ucTxAuthAssocRetryLimit) { | |
466 | ||
467 | /* Record the Status Code of Authentication Request */ | |
468 | prStaRec->u2StatusCode = STATUS_CODE_ASSOC_TIMEOUT; | |
469 | ||
470 | eNextState = AA_STATE_IDLE; | |
471 | fgIsTransition = TRUE; | |
472 | } | |
473 | else { | |
474 | prStaRec->ucTxAuthAssocRetryCount++; | |
475 | ||
476 | if (assocSendReAssocReqFrame(prAdapter, prStaRec) != WLAN_STATUS_SUCCESS) { | |
477 | ||
478 | cnmTimerInitTimer(prAdapter, | |
479 | &prStaRec->rTxReqDoneOrRxRespTimer, | |
480 | (PFN_MGMT_TIMEOUT_FUNC)saaFsmRunEventTxReqTimeOut, | |
481 | (ULONG)prStaRec); | |
482 | ||
483 | cnmTimerStartTimer(prAdapter, | |
484 | &prStaRec->rTxReqDoneOrRxRespTimer, | |
485 | TU_TO_MSEC(TX_ASSOCIATION_RETRY_TIMEOUT_TU)); | |
486 | } | |
487 | } | |
488 | ||
489 | break; | |
490 | ||
491 | case SAA_STATE_WAIT_ASSOC2: | |
492 | break; | |
493 | ||
494 | case AA_STATE_RESOURCE: | |
495 | /* TODO(Kevin) Can setup a timer and send message later */ | |
496 | break; | |
497 | ||
498 | default: | |
499 | DBGLOG(SAA, ERROR, ("Unknown AA STATE\n")); | |
500 | ASSERT(0); | |
501 | break; | |
502 | } | |
503 | ||
504 | } | |
505 | while (fgIsTransition); | |
506 | ||
507 | return; | |
508 | ||
509 | } /* end of saaFsmSteps() */ | |
510 | ||
511 | ||
512 | /*----------------------------------------------------------------------------*/ | |
513 | /*! | |
514 | * @brief This function will send Event to AIS/BOW/P2P | |
515 | * | |
516 | * @param[in] rJoinStatus To indicate JOIN success or failure. | |
517 | * @param[in] prStaRec Pointer to the STA_RECORD_T | |
518 | * @param[in] prSwRfb Pointer to the SW_RFB_T | |
519 | ||
520 | * @return (none) | |
521 | */ | |
522 | /*----------------------------------------------------------------------------*/ | |
523 | WLAN_STATUS | |
524 | saaFsmSendEventJoinComplete ( | |
525 | IN P_ADAPTER_T prAdapter, | |
526 | IN WLAN_STATUS rJoinStatus, | |
527 | IN P_STA_RECORD_T prStaRec, | |
528 | IN P_SW_RFB_T prSwRfb | |
529 | ) | |
530 | { | |
531 | P_BSS_INFO_T prBssInfo; | |
532 | ||
533 | ASSERT(prStaRec); | |
534 | if(!prStaRec) { | |
535 | return WLAN_STATUS_INVALID_PACKET; | |
536 | } | |
537 | ||
538 | /* Store limitation about 40Mhz bandwidth capability during association */ | |
539 | if (prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM) { | |
540 | prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]; | |
541 | ||
542 | if (rJoinStatus == WLAN_STATUS_SUCCESS) { | |
543 | prBssInfo->fg40mBwAllowed = prBssInfo->fgAssoc40mBwAllowed; | |
544 | } | |
545 | prBssInfo->fgAssoc40mBwAllowed = FALSE; | |
546 | } | |
547 | ||
548 | if(prStaRec->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX) { | |
549 | P_MSG_SAA_FSM_COMP_T prSaaFsmCompMsg; | |
550 | ||
551 | prSaaFsmCompMsg = cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SAA_FSM_COMP_T)); | |
552 | if (!prSaaFsmCompMsg) { | |
553 | return WLAN_STATUS_RESOURCES; | |
554 | } | |
555 | ||
556 | prSaaFsmCompMsg->rMsgHdr.eMsgId = MID_SAA_AIS_JOIN_COMPLETE; | |
557 | prSaaFsmCompMsg->ucSeqNum = prStaRec->ucAuthAssocReqSeqNum; | |
558 | prSaaFsmCompMsg->rJoinStatus = rJoinStatus; | |
559 | prSaaFsmCompMsg->prStaRec = prStaRec; | |
560 | prSaaFsmCompMsg->prSwRfb = prSwRfb; | |
561 | ||
562 | /* NOTE(Kevin): Set to UNBUF for immediately JOIN complete */ | |
563 | mboxSendMsg(prAdapter, | |
564 | MBOX_ID_0, | |
565 | (P_MSG_HDR_T)prSaaFsmCompMsg, | |
566 | MSG_SEND_METHOD_UNBUF); | |
567 | ||
568 | return WLAN_STATUS_SUCCESS; | |
569 | } | |
570 | #if CFG_ENABLE_WIFI_DIRECT | |
571 | else if ((prAdapter->fgIsP2PRegistered) && | |
572 | (IS_STA_IN_P2P(prStaRec))) { | |
573 | P_MSG_SAA_FSM_COMP_T prSaaFsmCompMsg; | |
574 | ||
575 | prSaaFsmCompMsg = cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SAA_FSM_COMP_T)); | |
576 | if (!prSaaFsmCompMsg) { | |
577 | return WLAN_STATUS_RESOURCES; | |
578 | } | |
579 | ||
580 | prSaaFsmCompMsg->rMsgHdr.eMsgId = MID_SAA_P2P_JOIN_COMPLETE; | |
581 | prSaaFsmCompMsg->ucSeqNum = prStaRec->ucAuthAssocReqSeqNum; | |
582 | prSaaFsmCompMsg->rJoinStatus = rJoinStatus; | |
583 | prSaaFsmCompMsg->prStaRec = prStaRec; | |
584 | prSaaFsmCompMsg->prSwRfb = prSwRfb; | |
585 | ||
586 | /* NOTE(Kevin): Set to UNBUF for immediately JOIN complete */ | |
587 | mboxSendMsg(prAdapter, | |
588 | MBOX_ID_0, | |
589 | (P_MSG_HDR_T)prSaaFsmCompMsg, | |
590 | MSG_SEND_METHOD_UNBUF); | |
591 | ||
592 | return WLAN_STATUS_SUCCESS; | |
593 | } | |
594 | #endif | |
595 | #if CFG_ENABLE_BT_OVER_WIFI | |
596 | else if(prStaRec->ucNetTypeIndex == NETWORK_TYPE_BOW_INDEX) { | |
597 | //@TODO: BOW handler | |
598 | ||
599 | P_MSG_SAA_FSM_COMP_T prSaaFsmCompMsg; | |
600 | ||
601 | prSaaFsmCompMsg = cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SAA_FSM_COMP_T)); | |
602 | if (!prSaaFsmCompMsg) { | |
603 | return WLAN_STATUS_RESOURCES; | |
604 | } | |
605 | ||
606 | prSaaFsmCompMsg->rMsgHdr.eMsgId = MID_SAA_BOW_JOIN_COMPLETE; | |
607 | prSaaFsmCompMsg->ucSeqNum = prStaRec->ucAuthAssocReqSeqNum; | |
608 | prSaaFsmCompMsg->rJoinStatus = rJoinStatus; | |
609 | prSaaFsmCompMsg->prStaRec = prStaRec; | |
610 | prSaaFsmCompMsg->prSwRfb = prSwRfb; | |
611 | ||
612 | /* NOTE(Kevin): Set to UNBUF for immediately JOIN complete */ | |
613 | mboxSendMsg(prAdapter, | |
614 | MBOX_ID_0, | |
615 | (P_MSG_HDR_T)prSaaFsmCompMsg, | |
616 | MSG_SEND_METHOD_UNBUF); | |
617 | ||
618 | return WLAN_STATUS_SUCCESS; | |
619 | } | |
620 | #endif | |
621 | else { | |
622 | ASSERT(0); | |
623 | return WLAN_STATUS_FAILURE; | |
624 | } | |
625 | ||
626 | } /* end of saaFsmSendEventJoinComplete() */ | |
627 | ||
628 | ||
629 | /*----------------------------------------------------------------------------*/ | |
630 | /*! | |
631 | * @brief This function will handle the Start Event to SAA FSM. | |
632 | * | |
633 | * @param[in] prMsgHdr Message of Join Request for a particular STA. | |
634 | * | |
635 | * @return (none) | |
636 | */ | |
637 | /*----------------------------------------------------------------------------*/ | |
638 | VOID | |
639 | saaFsmRunEventStart ( | |
640 | IN P_ADAPTER_T prAdapter, | |
641 | IN P_MSG_HDR_T prMsgHdr | |
642 | ) | |
643 | { | |
644 | P_MSG_SAA_FSM_START_T prSaaFsmStartMsg; | |
645 | P_STA_RECORD_T prStaRec; | |
646 | P_BSS_INFO_T prBssInfo; | |
647 | ||
648 | ASSERT(prAdapter); | |
649 | ASSERT(prMsgHdr); | |
650 | ||
651 | prSaaFsmStartMsg = (P_MSG_SAA_FSM_START_T)prMsgHdr; | |
652 | prStaRec = prSaaFsmStartMsg->prStaRec; | |
653 | ||
654 | if((!prStaRec) || (prStaRec->fgIsInUse == FALSE)) { | |
655 | cnmMemFree(prAdapter, prMsgHdr); | |
656 | return; | |
657 | } | |
658 | ||
659 | ASSERT(prStaRec); | |
660 | ||
661 | DBGLOG(SAA, LOUD, ("EVENT-START: Trigger SAA FSM.\n")); | |
662 | ||
663 | /* record sequence number of request message */ | |
664 | prStaRec->ucAuthAssocReqSeqNum = prSaaFsmStartMsg->ucSeqNum; | |
665 | ||
666 | cnmMemFree(prAdapter, prMsgHdr); | |
667 | ||
668 | //4 <1> Validation of SAA Start Event | |
669 | if (!IS_AP_STA(prStaRec)) { | |
670 | ||
671 | DBGLOG(SAA, ERROR, ("EVENT-START: STA Type - %d was not supported.\n", prStaRec->eStaType)); | |
672 | ||
673 | /* Ignore the return value because don't care the prSwRfb */ | |
674 | saaFsmSendEventJoinComplete(prAdapter, WLAN_STATUS_FAILURE, prStaRec, NULL); | |
675 | ||
676 | return; | |
677 | } | |
678 | ||
679 | //4 <2> The previous JOIN process is not completed ? | |
680 | if (prStaRec->eAuthAssocState != AA_STATE_IDLE) { | |
681 | DBGLOG(SAA, ERROR, ("EVENT-START: Reentry of SAA Module.\n")); | |
682 | prStaRec->eAuthAssocState = AA_STATE_IDLE; | |
683 | } | |
684 | ||
685 | //4 <3> Reset Status Code and Time | |
686 | /* Update Station Record - Status/Reason Code */ | |
687 | prStaRec->u2StatusCode = STATUS_CODE_SUCCESSFUL; | |
688 | ||
689 | /* Update the record join time. */ | |
690 | GET_CURRENT_SYSTIME(&prStaRec->rLastJoinTime); | |
691 | ||
692 | prStaRec->ucTxAuthAssocRetryCount = 0; | |
693 | ||
694 | if (prStaRec->prChallengeText) { | |
695 | cnmMemFree(prAdapter, prStaRec->prChallengeText); | |
696 | prStaRec->prChallengeText = (P_IE_CHALLENGE_TEXT_T)NULL; | |
697 | } | |
698 | ||
699 | cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer); | |
700 | ||
701 | #if CFG_PRIVACY_MIGRATION | |
702 | //4 <4> Init the sec fsm | |
703 | secFsmInit(prAdapter, prStaRec); | |
704 | #endif | |
705 | ||
706 | //4 <5> Reset the STA STATE | |
707 | /* Update Station Record - Class 1 Flag */ | |
708 | /* NOTE(Kevin): Moved to AIS FSM for Reconnect issue - | |
709 | * We won't deactivate the same STA_RECORD_T and then activate it again for the | |
710 | * case of reconnection. | |
711 | */ | |
712 | //cnmStaRecChangeState(prStaRec, STA_STATE_1); | |
713 | ||
714 | //4 <6> Decide if this BSS 20/40M bandwidth is allowed | |
715 | if (prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM) { | |
716 | prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]; | |
717 | ||
718 | if ((prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11N) | |
719 | && (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N)) { | |
720 | prBssInfo->fgAssoc40mBwAllowed = | |
721 | cnmBss40mBwPermitted(prAdapter, prBssInfo->ucNetTypeIndex); | |
722 | } | |
723 | else { | |
724 | prBssInfo->fgAssoc40mBwAllowed = FALSE; | |
725 | } | |
726 | DBGLOG(RLM, INFO, ("STA 40mAllowed=%d\n", prBssInfo->fgAssoc40mBwAllowed)); | |
727 | } | |
728 | ||
729 | //4 <7> Trigger SAA FSM | |
730 | if(prStaRec->ucStaState == STA_STATE_1) { | |
731 | saaFsmSteps(prAdapter, prStaRec, SAA_STATE_SEND_AUTH1, (P_SW_RFB_T)NULL); | |
732 | } | |
733 | else if(prStaRec->ucStaState == STA_STATE_2 || prStaRec->ucStaState == STA_STATE_3) { | |
734 | saaFsmSteps(prAdapter, prStaRec, SAA_STATE_SEND_ASSOC1, (P_SW_RFB_T)NULL); | |
735 | } | |
736 | ||
737 | return; | |
738 | } /* end of saaFsmRunEventStart() */ | |
739 | ||
740 | ||
741 | /*----------------------------------------------------------------------------*/ | |
742 | /*! | |
743 | * @brief This function will handle TxDone(Auth1/Auth3/AssocReq) Event of SAA FSM. | |
744 | * | |
745 | * @param[in] prMsduInfo Pointer to the MSDU_INFO_T. | |
746 | * @param[in] rTxDoneStatus Return TX status of the Auth1/Auth3/AssocReq frame. | |
747 | * | |
748 | * @retval WLAN_STATUS_SUCCESS | |
749 | */ | |
750 | /*----------------------------------------------------------------------------*/ | |
751 | WLAN_STATUS | |
752 | saaFsmRunEventTxDone ( | |
753 | IN P_ADAPTER_T prAdapter, | |
754 | IN P_MSDU_INFO_T prMsduInfo, | |
755 | IN ENUM_TX_RESULT_CODE_T rTxDoneStatus | |
756 | ) | |
757 | { | |
758 | ||
759 | P_STA_RECORD_T prStaRec; | |
760 | ENUM_AA_STATE_T eNextState; | |
761 | ||
762 | ||
763 | ASSERT(prMsduInfo); | |
764 | ||
765 | prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex); | |
766 | ||
767 | if(!prStaRec) { | |
768 | return WLAN_STATUS_INVALID_PACKET; | |
769 | } | |
770 | ||
771 | ASSERT(prStaRec); | |
772 | ||
773 | DBGLOG(SAA, LOUD, ("EVENT-TX DONE: Current Time = %u\n", | |
774 | kalGetTimeTick())); | |
775 | ||
776 | eNextState = prStaRec->eAuthAssocState; | |
777 | ||
778 | switch (prStaRec->eAuthAssocState) { | |
779 | case SAA_STATE_SEND_AUTH1: | |
780 | { | |
781 | /* Strictly check the outgoing frame is matched with current AA STATE */ | |
782 | if (authCheckTxAuthFrame(prAdapter, | |
783 | prMsduInfo, | |
784 | AUTH_TRANSACTION_SEQ_1) != WLAN_STATUS_SUCCESS) { | |
785 | break; | |
786 | } | |
787 | ||
788 | if (rTxDoneStatus == TX_RESULT_SUCCESS) { | |
789 | eNextState = SAA_STATE_WAIT_AUTH2; | |
790 | ||
791 | cnmTimerStopTimer(prAdapter, | |
792 | &prStaRec->rTxReqDoneOrRxRespTimer); | |
793 | ||
794 | cnmTimerInitTimer(prAdapter, | |
795 | &prStaRec->rTxReqDoneOrRxRespTimer, | |
796 | (PFN_MGMT_TIMEOUT_FUNC)saaFsmRunEventRxRespTimeOut, | |
797 | (ULONG)prStaRec); | |
798 | ||
799 | cnmTimerStartTimer(prAdapter, | |
800 | &prStaRec->rTxReqDoneOrRxRespTimer, | |
801 | TU_TO_MSEC(DOT11_AUTHENTICATION_RESPONSE_TIMEOUT_TU)); | |
802 | } | |
803 | ||
804 | /* if TX was successful, change to next state. | |
805 | * if TX was failed, do retry if possible. | |
806 | */ | |
807 | saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T)NULL); | |
808 | } | |
809 | break; | |
810 | ||
811 | case SAA_STATE_SEND_AUTH3: | |
812 | { | |
813 | /* Strictly check the outgoing frame is matched with current JOIN STATE */ | |
814 | if (authCheckTxAuthFrame(prAdapter, | |
815 | prMsduInfo, | |
816 | AUTH_TRANSACTION_SEQ_3) != WLAN_STATUS_SUCCESS) { | |
817 | break; | |
818 | } | |
819 | ||
820 | if (rTxDoneStatus == TX_RESULT_SUCCESS) { | |
821 | eNextState = SAA_STATE_WAIT_AUTH4; | |
822 | ||
823 | cnmTimerStopTimer(prAdapter, | |
824 | &prStaRec->rTxReqDoneOrRxRespTimer); | |
825 | ||
826 | cnmTimerInitTimer(prAdapter, | |
827 | &prStaRec->rTxReqDoneOrRxRespTimer, | |
828 | (PFN_MGMT_TIMEOUT_FUNC)saaFsmRunEventRxRespTimeOut, | |
829 | (ULONG)prStaRec); | |
830 | ||
831 | cnmTimerStartTimer(prAdapter, | |
832 | &prStaRec->rTxReqDoneOrRxRespTimer, | |
833 | TU_TO_MSEC(DOT11_AUTHENTICATION_RESPONSE_TIMEOUT_TU)); | |
834 | } | |
835 | ||
836 | /* if TX was successful, change to next state. | |
837 | * if TX was failed, do retry if possible. | |
838 | */ | |
839 | saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T)NULL); | |
840 | } | |
841 | break; | |
842 | ||
843 | case SAA_STATE_SEND_ASSOC1: | |
844 | { | |
845 | /* Strictly check the outgoing frame is matched with current SAA STATE */ | |
846 | if (assocCheckTxReAssocReqFrame(prAdapter, prMsduInfo) != WLAN_STATUS_SUCCESS) { | |
847 | break; | |
848 | } | |
849 | ||
850 | if (rTxDoneStatus == TX_RESULT_SUCCESS) { | |
851 | eNextState = SAA_STATE_WAIT_ASSOC2; | |
852 | ||
853 | cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer); | |
854 | ||
855 | cnmTimerInitTimer(prAdapter, | |
856 | &prStaRec->rTxReqDoneOrRxRespTimer, | |
857 | (PFN_MGMT_TIMEOUT_FUNC)saaFsmRunEventRxRespTimeOut, | |
858 | (ULONG)prStaRec); | |
859 | ||
860 | cnmTimerStartTimer(prAdapter, | |
861 | &(prStaRec->rTxReqDoneOrRxRespTimer), | |
862 | TU_TO_MSEC(DOT11_ASSOCIATION_RESPONSE_TIMEOUT_TU)); | |
863 | } | |
864 | ||
865 | /* if TX was successful, change to next state. | |
866 | * if TX was failed, do retry if possible. | |
867 | */ | |
868 | saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T)NULL); | |
869 | } | |
870 | break; | |
871 | ||
872 | default: | |
873 | break; /* Ignore other cases */ | |
874 | } | |
875 | ||
876 | ||
877 | return WLAN_STATUS_SUCCESS; | |
878 | ||
879 | } /* end of saaFsmRunEventTxDone() */ | |
880 | ||
881 | ||
882 | /*----------------------------------------------------------------------------*/ | |
883 | /*! | |
884 | * @brief This function will send Tx Request Timeout Event to SAA FSM. | |
885 | * | |
886 | * @param[in] prStaRec Pointer to the STA_RECORD_T | |
887 | * | |
888 | * @return (none) | |
889 | */ | |
890 | /*----------------------------------------------------------------------------*/ | |
891 | VOID | |
892 | saaFsmRunEventTxReqTimeOut ( | |
893 | IN P_ADAPTER_T prAdapter, | |
894 | IN P_STA_RECORD_T prStaRec | |
895 | ) | |
896 | { | |
897 | ASSERT(prStaRec); | |
898 | if(!prStaRec) { | |
899 | return; | |
900 | } | |
901 | ||
902 | DBGLOG(SAA, LOUD, ("EVENT-TIMER: TX REQ TIMEOUT, Current Time = %u\n", | |
903 | kalGetTimeTick())); | |
904 | ||
905 | switch (prStaRec->eAuthAssocState) { | |
906 | case SAA_STATE_SEND_AUTH1: | |
907 | case SAA_STATE_SEND_AUTH3: | |
908 | case SAA_STATE_SEND_ASSOC1: | |
909 | saaFsmSteps(prAdapter, prStaRec, prStaRec->eAuthAssocState, (P_SW_RFB_T)NULL); | |
910 | break; | |
911 | ||
912 | default: | |
913 | return; | |
914 | } | |
915 | ||
916 | return; | |
917 | } /* end of saaFsmRunEventTxReqTimeOut() */ | |
918 | ||
919 | ||
920 | /*----------------------------------------------------------------------------*/ | |
921 | /*! | |
922 | * @brief This function will send Rx Response Timeout Event to SAA FSM. | |
923 | * | |
924 | * @param[in] prStaRec Pointer to the STA_RECORD_T | |
925 | * | |
926 | * @return (none) | |
927 | */ | |
928 | /*----------------------------------------------------------------------------*/ | |
929 | VOID | |
930 | saaFsmRunEventRxRespTimeOut ( | |
931 | IN P_ADAPTER_T prAdapter, | |
932 | IN P_STA_RECORD_T prStaRec | |
933 | ) | |
934 | { | |
935 | ENUM_AA_STATE_T eNextState; | |
936 | ||
937 | ||
938 | DBGLOG(SAA, LOUD, ("EVENT-TIMER: RX RESP TIMEOUT, Current Time = %u\n", | |
939 | kalGetTimeTick())); | |
940 | ||
941 | ASSERT(prStaRec); | |
942 | if(!prStaRec) { | |
943 | return; | |
944 | } | |
945 | ||
946 | eNextState = prStaRec->eAuthAssocState; | |
947 | ||
948 | switch (prStaRec->eAuthAssocState) { | |
949 | case SAA_STATE_WAIT_AUTH2: | |
950 | /* Record the Status Code of Authentication Request */ | |
951 | prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT; | |
952 | ||
953 | /* Pull back to earlier state to do retry */ | |
954 | eNextState = SAA_STATE_SEND_AUTH1; | |
955 | break; | |
956 | ||
957 | case SAA_STATE_WAIT_AUTH4: | |
958 | /* Record the Status Code of Authentication Request */ | |
959 | prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT; | |
960 | ||
961 | /* Pull back to earlier state to do retry */ | |
962 | eNextState = SAA_STATE_SEND_AUTH3; | |
963 | break; | |
964 | ||
965 | case SAA_STATE_WAIT_ASSOC2: | |
966 | /* Record the Status Code of Authentication Request */ | |
967 | prStaRec->u2StatusCode = STATUS_CODE_ASSOC_TIMEOUT; | |
968 | ||
969 | /* Pull back to earlier state to do retry */ | |
970 | eNextState = SAA_STATE_SEND_ASSOC1; | |
971 | break; | |
972 | ||
973 | default: | |
974 | break; /* Ignore other cases */ | |
975 | } | |
976 | ||
977 | ||
978 | if (eNextState != prStaRec->eAuthAssocState) { | |
979 | saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T)NULL); | |
980 | } | |
981 | ||
982 | return; | |
983 | } /* end of saaFsmRunEventRxRespTimeOut() */ | |
984 | ||
985 | ||
986 | #ifdef CFG_AIS_SUPPORT_REJ_CNT_AVOID | |
987 | VOID | |
988 | saaFsmRunEventErrCountInc( | |
989 | IN P_ADAPTER_T prAdapter, | |
990 | IN P_STA_RECORD_T prStaRec, | |
991 | IN BOOLEAN fgCountReset) | |
992 | { | |
993 | if (prStaRec->ucNetTypeIndex != NETWORK_TYPE_AIS_INDEX) | |
994 | return; /* only for AIS now */ | |
995 | ||
996 | aisFsmRunEventErrCountInc(prAdapter, prStaRec, fgCountReset); | |
997 | } | |
998 | #endif /* CFG_AIS_SUPPORT_REJ_CNT_AVOID */ | |
999 | ||
1000 | ||
1001 | /*----------------------------------------------------------------------------*/ | |
1002 | /*! | |
1003 | * @brief This function will process the Rx Auth Response Frame and then | |
1004 | * trigger SAA FSM. | |
1005 | * | |
1006 | * @param[in] prSwRfb Pointer to the SW_RFB_T structure. | |
1007 | * | |
1008 | * @return (none) | |
1009 | */ | |
1010 | /*----------------------------------------------------------------------------*/ | |
1011 | VOID | |
1012 | saaFsmRunEventRxAuth ( | |
1013 | IN P_ADAPTER_T prAdapter, | |
1014 | IN P_SW_RFB_T prSwRfb | |
1015 | ) | |
1016 | { | |
1017 | P_STA_RECORD_T prStaRec; | |
1018 | UINT_16 u2StatusCode; | |
1019 | ENUM_AA_STATE_T eNextState; | |
1020 | ||
1021 | ||
1022 | ASSERT(prSwRfb); | |
1023 | prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx); | |
1024 | ||
1025 | /* We should have the corresponding Sta Record. */ | |
1026 | if (!prStaRec) { | |
1027 | /* Peter: we can handle the packet without station record */ | |
1028 | //ASSERT(0); | |
1029 | return; | |
1030 | } | |
1031 | ||
1032 | if (!IS_AP_STA(prStaRec)) { | |
1033 | return; | |
1034 | } | |
1035 | ||
1036 | switch(prStaRec->eAuthAssocState) { | |
1037 | case SAA_STATE_SEND_AUTH1: | |
1038 | case SAA_STATE_WAIT_AUTH2: | |
1039 | /* Check if the incoming frame is what we are waiting for */ | |
1040 | if (authCheckRxAuthFrameStatus(prAdapter, | |
1041 | prSwRfb, | |
1042 | AUTH_TRANSACTION_SEQ_2, | |
1043 | &u2StatusCode) == WLAN_STATUS_SUCCESS) { | |
1044 | ||
1045 | cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer); | |
1046 | ||
1047 | /* Record the Status Code of Authentication Request */ | |
1048 | prStaRec->u2StatusCode = u2StatusCode; | |
1049 | ||
1050 | if (u2StatusCode == STATUS_CODE_SUCCESSFUL) { | |
1051 | ||
1052 | authProcessRxAuth2_Auth4Frame(prAdapter, prSwRfb); | |
1053 | ||
1054 | if (prStaRec->ucAuthAlgNum == | |
1055 | (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY) { | |
1056 | ||
1057 | eNextState = SAA_STATE_SEND_AUTH3; | |
1058 | } | |
1059 | else { | |
1060 | /* Update Station Record - Class 2 Flag */ | |
1061 | cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2); | |
1062 | ||
1063 | eNextState = SAA_STATE_SEND_ASSOC1; | |
1064 | } | |
1065 | ||
1066 | #ifdef CFG_AIS_SUPPORT_REJ_CNT_AVOID | |
1067 | /* reset error count for the BSS due to successful authentication */ | |
1068 | saaFsmRunEventErrCountInc(prAdapter, prStaRec, TRUE); | |
1069 | #endif /* CFG_AIS_SUPPORT_REJ_CNT_AVOID */ | |
1070 | } | |
1071 | else { | |
1072 | DBGLOG(SAA, INFO, ("Auth Req was rejected by ["MACSTR"], Status Code = %d\n", | |
1073 | MAC2STR(prStaRec->aucMacAddr), u2StatusCode)); | |
1074 | ||
1075 | eNextState = AA_STATE_IDLE; | |
1076 | ||
1077 | #ifdef CFG_AIS_SUPPORT_REJ_CNT_AVOID | |
1078 | /* accumulate error count for the BSS */ | |
1079 | if (u2StatusCode == STATUS_CODE_ASSOC_DENIED_AP_OVERLOAD) | |
1080 | saaFsmRunEventErrCountInc(prAdapter, prStaRec, FALSE); | |
1081 | #endif /* CFG_AIS_SUPPORT_REJ_CNT_AVOID */ | |
1082 | } | |
1083 | ||
1084 | /* Reset Send Auth/(Re)Assoc Frame Count */ | |
1085 | prStaRec->ucTxAuthAssocRetryCount = 0; | |
1086 | ||
1087 | saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T)NULL); | |
1088 | } | |
1089 | break; | |
1090 | ||
1091 | case SAA_STATE_SEND_AUTH3: | |
1092 | case SAA_STATE_WAIT_AUTH4: | |
1093 | /* Check if the incoming frame is what we are waiting for */ | |
1094 | if (authCheckRxAuthFrameStatus(prAdapter, | |
1095 | prSwRfb, | |
1096 | AUTH_TRANSACTION_SEQ_4, | |
1097 | &u2StatusCode) == WLAN_STATUS_SUCCESS) { | |
1098 | ||
1099 | cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer); | |
1100 | ||
1101 | /* Record the Status Code of Authentication Request */ | |
1102 | prStaRec->u2StatusCode = u2StatusCode; | |
1103 | ||
1104 | if (u2StatusCode == STATUS_CODE_SUCCESSFUL) { | |
1105 | ||
1106 | authProcessRxAuth2_Auth4Frame(prAdapter, prSwRfb); /* Add for 802.11r handling */ | |
1107 | ||
1108 | /* Update Station Record - Class 2 Flag */ | |
1109 | cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2); | |
1110 | ||
1111 | eNextState = SAA_STATE_SEND_ASSOC1; | |
1112 | } | |
1113 | else { | |
1114 | DBGLOG(SAA, INFO, ("Auth Req was rejected by ["MACSTR"], Status Code = %d\n", | |
1115 | MAC2STR(prStaRec->aucMacAddr), u2StatusCode)); | |
1116 | ||
1117 | eNextState = AA_STATE_IDLE; | |
1118 | } | |
1119 | ||
1120 | /* Reset Send Auth/(Re)Assoc Frame Count */ | |
1121 | prStaRec->ucTxAuthAssocRetryCount = 0; | |
1122 | ||
1123 | saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T)NULL); | |
1124 | } | |
1125 | break; | |
1126 | ||
1127 | default: | |
1128 | break; /* Ignore other cases */ | |
1129 | } | |
1130 | ||
1131 | return; | |
1132 | } /* end of saaFsmRunEventRxAuth() */ | |
1133 | ||
1134 | ||
1135 | /*----------------------------------------------------------------------------*/ | |
1136 | /*! | |
1137 | * @brief This function will process the Rx (Re)Association Response Frame and then | |
1138 | * trigger SAA FSM. | |
1139 | * | |
1140 | * @param[in] prSwRfb Pointer to the SW_RFB_T structure. | |
1141 | * | |
1142 | * @retval WLAN_STATUS_SUCCESS if the status code was not success | |
1143 | * @retval WLAN_STATUS_BUFFER_RETAINED if the status code was success | |
1144 | */ | |
1145 | /*----------------------------------------------------------------------------*/ | |
1146 | WLAN_STATUS | |
1147 | saaFsmRunEventRxAssoc ( | |
1148 | IN P_ADAPTER_T prAdapter, | |
1149 | IN P_SW_RFB_T prSwRfb | |
1150 | ) | |
1151 | { | |
1152 | P_STA_RECORD_T prStaRec; | |
1153 | UINT_16 u2StatusCode; | |
1154 | ENUM_AA_STATE_T eNextState; | |
1155 | P_SW_RFB_T prRetainedSwRfb = (P_SW_RFB_T)NULL; | |
1156 | WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS; | |
1157 | ||
1158 | ||
1159 | ASSERT(prSwRfb); | |
1160 | prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx); | |
1161 | ||
1162 | /* We should have the corresponding Sta Record. */ | |
1163 | if (!prStaRec) { | |
1164 | ASSERT(0); | |
1165 | return rStatus; | |
1166 | } | |
1167 | ||
1168 | if (!IS_AP_STA(prStaRec)) { | |
1169 | return rStatus; | |
1170 | } | |
1171 | ||
1172 | switch (prStaRec->eAuthAssocState) { | |
1173 | case SAA_STATE_SEND_ASSOC1: | |
1174 | case SAA_STATE_WAIT_ASSOC2: | |
1175 | /* TRUE if the incoming frame is what we are waiting for */ | |
1176 | if (assocCheckRxReAssocRspFrameStatus(prAdapter, | |
1177 | prSwRfb, | |
1178 | &u2StatusCode) == WLAN_STATUS_SUCCESS) { | |
1179 | ||
1180 | cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer); | |
1181 | ||
1182 | ||
1183 | /* Record the Status Code of Authentication Request */ | |
1184 | prStaRec->u2StatusCode = u2StatusCode; | |
1185 | ||
1186 | if (u2StatusCode == STATUS_CODE_SUCCESSFUL) { | |
1187 | ||
1188 | /* Update Station Record - Class 3 Flag */ | |
1189 | /* NOTE(Kevin): Moved to AIS FSM for roaming issue - | |
1190 | * We should deactivate the STA_RECORD_T of previous AP before | |
1191 | * activate new one in Driver. | |
1192 | */ | |
1193 | //cnmStaRecChangeState(prStaRec, STA_STATE_3); | |
1194 | ||
1195 | prStaRec->ucJoinFailureCount = 0; // Clear history. | |
1196 | ||
1197 | prRetainedSwRfb = prSwRfb; | |
1198 | rStatus = WLAN_STATUS_PENDING; | |
1199 | } | |
1200 | else { | |
1201 | DBGLOG(SAA, INFO, ("Assoc Req was rejected by ["MACSTR"], Status Code = %d\n", | |
1202 | MAC2STR(prStaRec->aucMacAddr), u2StatusCode)); | |
1203 | } | |
1204 | ||
1205 | /* Reset Send Auth/(Re)Assoc Frame Count */ | |
1206 | prStaRec->ucTxAuthAssocRetryCount = 0; | |
1207 | ||
1208 | /* update RCPI */ | |
1209 | prStaRec->ucRCPI = prSwRfb->prHifRxHdr->ucRcpi; | |
1210 | ||
1211 | eNextState = AA_STATE_IDLE; | |
1212 | ||
1213 | saaFsmSteps(prAdapter, prStaRec, eNextState, prRetainedSwRfb); | |
1214 | } | |
1215 | break; | |
1216 | ||
1217 | default: | |
1218 | break; /* Ignore other cases */ | |
1219 | } | |
1220 | ||
1221 | return rStatus; | |
1222 | ||
1223 | } /* end of saaFsmRunEventRxAssoc() */ | |
1224 | ||
1225 | ||
1226 | /*----------------------------------------------------------------------------*/ | |
1227 | /*! | |
1228 | * @brief This function will check the incoming Deauth Frame. | |
1229 | * | |
1230 | * @param[in] prSwRfb Pointer to the SW_RFB_T structure. | |
1231 | * | |
1232 | * @retval WLAN_STATUS_SUCCESS Always not retain deauthentication frames | |
1233 | */ | |
1234 | /*----------------------------------------------------------------------------*/ | |
1235 | WLAN_STATUS | |
1236 | saaFsmRunEventRxDeauth ( | |
1237 | IN P_ADAPTER_T prAdapter, | |
1238 | IN P_SW_RFB_T prSwRfb | |
1239 | ) | |
1240 | { | |
1241 | P_STA_RECORD_T prStaRec; | |
1242 | //#if DBG | |
1243 | P_WLAN_DEAUTH_FRAME_T prDeauthFrame; | |
1244 | //#endif /* DBG */ | |
1245 | ||
1246 | ||
1247 | ASSERT(prSwRfb); | |
1248 | prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx); | |
1249 | ||
1250 | //#if DBG | |
1251 | prDeauthFrame = (P_WLAN_DEAUTH_FRAME_T) prSwRfb->pvHeader; | |
1252 | ||
1253 | DBGLOG(SAA, INFO, ("Rx Deauth frame from BSSID=["MACSTR"].\n", | |
1254 | MAC2STR(prDeauthFrame->aucBSSID))); | |
1255 | //#endif /* DBG */ | |
1256 | ||
1257 | do { | |
1258 | ||
1259 | /* We should have the corresponding Sta Record. */ | |
1260 | if (!prStaRec) { | |
1261 | break; | |
1262 | } | |
1263 | ||
1264 | if (IS_STA_IN_AIS(prStaRec)) { | |
1265 | P_AIS_BSS_INFO_T prAisBssInfo; | |
1266 | ||
1267 | ||
1268 | if (!IS_AP_STA(prStaRec)) { | |
1269 | break; | |
1270 | } | |
1271 | ||
1272 | prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]); | |
1273 | ||
1274 | if (prStaRec->ucStaState > STA_STATE_1) { | |
1275 | ||
1276 | /* Check if this is the AP we are associated or associating with */ | |
1277 | if (authProcessRxDeauthFrame(prSwRfb, | |
1278 | prStaRec->aucMacAddr, | |
1279 | &prStaRec->u2ReasonCode) == WLAN_STATUS_SUCCESS) { | |
1280 | ||
1281 | DBGLOG(SAA, INFO, ("Deauth reason = %d\n", | |
1282 | prStaRec->u2ReasonCode)); | |
1283 | ||
1284 | if (STA_STATE_3 == prStaRec->ucStaState) { | |
1285 | P_MSG_AIS_ABORT_T prAisAbortMsg; | |
1286 | ||
1287 | /* NOTE(Kevin): Change state immediately to avoid starvation of | |
1288 | * MSG buffer because of too many deauth frames before changing | |
1289 | * the STA state. | |
1290 | */ | |
1291 | cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1); | |
1292 | ||
1293 | prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T)); | |
1294 | if (!prAisAbortMsg) { | |
1295 | break; | |
1296 | } | |
1297 | ||
1298 | prAisAbortMsg->rMsgHdr.eMsgId = MID_SAA_AIS_FSM_ABORT; | |
1299 | prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_DEAUTHENTICATED; | |
1300 | prAisAbortMsg->fgDelayIndication = FALSE; | |
1301 | ||
1302 | mboxSendMsg(prAdapter, | |
1303 | MBOX_ID_0, | |
1304 | (P_MSG_HDR_T) prAisAbortMsg, | |
1305 | MSG_SEND_METHOD_BUF); | |
1306 | } | |
1307 | else { | |
1308 | ||
1309 | /* TODO(Kevin): Joining Abort */ | |
1310 | } | |
1311 | prAisBssInfo->u2DeauthReason = prStaRec->u2ReasonCode; | |
1312 | ||
1313 | } | |
1314 | ||
1315 | } | |
1316 | ||
1317 | } | |
1318 | #if CFG_ENABLE_WIFI_DIRECT | |
1319 | else if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) { | |
1320 | /* TODO(Kevin) */ | |
1321 | p2pFsmRunEventRxDeauthentication(prAdapter, prStaRec, prSwRfb); | |
1322 | } | |
1323 | #endif | |
1324 | #if CFG_ENABLE_BT_OVER_WIFI | |
1325 | else if (IS_STA_IN_BOW(prStaRec)) { | |
1326 | bowRunEventRxDeAuth(prAdapter, prStaRec, prSwRfb); | |
1327 | } | |
1328 | #endif | |
1329 | else { | |
1330 | ASSERT(0); | |
1331 | } | |
1332 | ||
1333 | } while (FALSE); | |
1334 | ||
1335 | return WLAN_STATUS_SUCCESS; | |
1336 | ||
1337 | } /* end of saaFsmRunEventRxDeauth() */ | |
1338 | ||
1339 | ||
1340 | /*----------------------------------------------------------------------------*/ | |
1341 | /*! | |
1342 | * @brief This function will check the incoming Disassociation Frame. | |
1343 | * | |
1344 | * @param[in] prSwRfb Pointer to the SW_RFB_T structure. | |
1345 | * | |
1346 | * @retval WLAN_STATUS_SUCCESS Always not retain disassociation frames | |
1347 | */ | |
1348 | /*----------------------------------------------------------------------------*/ | |
1349 | WLAN_STATUS | |
1350 | saaFsmRunEventRxDisassoc ( | |
1351 | IN P_ADAPTER_T prAdapter, | |
1352 | IN P_SW_RFB_T prSwRfb | |
1353 | ) | |
1354 | { | |
1355 | P_STA_RECORD_T prStaRec; | |
1356 | //#if DBG | |
1357 | P_WLAN_DISASSOC_FRAME_T prDisassocFrame; | |
1358 | //#endif /* DBG */ | |
1359 | ||
1360 | ||
1361 | ASSERT(prSwRfb); | |
1362 | prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx); | |
1363 | ||
1364 | //#if DBG | |
1365 | prDisassocFrame = (P_WLAN_DISASSOC_FRAME_T) prSwRfb->pvHeader; | |
1366 | ||
1367 | DBGLOG(SAA, INFO, ("Rx Disassoc frame from BSSID=["MACSTR"].\n", | |
1368 | MAC2STR(prDisassocFrame->aucBSSID))); | |
1369 | //#endif /* DBG */ | |
1370 | ||
1371 | do { | |
1372 | ||
1373 | /* We should have the corresponding Sta Record. */ | |
1374 | if (!prStaRec) { | |
1375 | break; | |
1376 | } | |
1377 | ||
1378 | if (IS_STA_IN_AIS(prStaRec)) { | |
1379 | P_AIS_BSS_INFO_T prAisBssInfo; | |
1380 | ||
1381 | ||
1382 | if (!IS_AP_STA(prStaRec)) { | |
1383 | break; | |
1384 | } | |
1385 | ||
1386 | prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]); | |
1387 | ||
1388 | if (prStaRec->ucStaState > STA_STATE_1) { | |
1389 | ||
1390 | /* Check if this is the AP we are associated or associating with */ | |
1391 | if (assocProcessRxDisassocFrame(prAdapter, | |
1392 | prSwRfb, | |
1393 | prStaRec->aucMacAddr, | |
1394 | &prStaRec->u2ReasonCode) == WLAN_STATUS_SUCCESS) { | |
1395 | ||
1396 | DBGLOG(SAA, INFO, ("Disassoc reason = %d\n", | |
1397 | prStaRec->u2ReasonCode)); | |
1398 | ||
1399 | if (STA_STATE_3 == prStaRec->ucStaState) { | |
1400 | P_MSG_AIS_ABORT_T prAisAbortMsg; | |
1401 | ||
1402 | prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T)); | |
1403 | if (!prAisAbortMsg) { | |
1404 | break; | |
1405 | } | |
1406 | ||
1407 | prAisAbortMsg->rMsgHdr.eMsgId = MID_SAA_AIS_FSM_ABORT; | |
1408 | prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_DISASSOCIATED; | |
1409 | prAisAbortMsg->fgDelayIndication = FALSE; | |
1410 | ||
1411 | mboxSendMsg(prAdapter, | |
1412 | MBOX_ID_0, | |
1413 | (P_MSG_HDR_T) prAisAbortMsg, | |
1414 | MSG_SEND_METHOD_BUF); | |
1415 | } | |
1416 | else { | |
1417 | ||
1418 | /* TODO(Kevin): Joining Abort */ | |
1419 | } | |
1420 | ||
1421 | } | |
1422 | ||
1423 | } | |
1424 | ||
1425 | } | |
1426 | #if CFG_ENABLE_WIFI_DIRECT | |
1427 | else if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) { | |
1428 | /* TODO(Kevin) */ | |
1429 | p2pFsmRunEventRxDisassociation(prAdapter, prStaRec, prSwRfb); | |
1430 | } | |
1431 | #endif | |
1432 | #if CFG_ENABLE_BT_OVER_WIFI | |
1433 | else if (IS_STA_IN_BOW(prStaRec)) { | |
1434 | /* TODO(Kevin) */ | |
1435 | } | |
1436 | #endif | |
1437 | else { | |
1438 | ASSERT(0); | |
1439 | } | |
1440 | ||
1441 | } while (FALSE); | |
1442 | ||
1443 | return WLAN_STATUS_SUCCESS; | |
1444 | ||
1445 | } /* end of saaFsmRunEventRxDisassoc() */ | |
1446 | ||
1447 | ||
1448 | /*----------------------------------------------------------------------------*/ | |
1449 | /*! | |
1450 | * @brief This function will handle the Abort Event to SAA FSM. | |
1451 | * | |
1452 | * @param[in] prMsgHdr Message of Abort Request for a particular STA. | |
1453 | * | |
1454 | * @return none | |
1455 | */ | |
1456 | /*----------------------------------------------------------------------------*/ | |
1457 | VOID | |
1458 | saaFsmRunEventAbort ( | |
1459 | IN P_ADAPTER_T prAdapter, | |
1460 | IN P_MSG_HDR_T prMsgHdr | |
1461 | ) | |
1462 | { | |
1463 | P_MSG_SAA_FSM_ABORT_T prSaaFsmAbortMsg; | |
1464 | P_STA_RECORD_T prStaRec; | |
1465 | ||
1466 | ||
1467 | ASSERT(prMsgHdr); | |
1468 | ||
1469 | prSaaFsmAbortMsg = (P_MSG_SAA_FSM_ABORT_T)prMsgHdr; | |
1470 | prStaRec = prSaaFsmAbortMsg->prStaRec; | |
1471 | ||
1472 | ASSERT(prStaRec); | |
1473 | if(!prStaRec) { | |
1474 | cnmMemFree(prAdapter, prMsgHdr); | |
1475 | return; | |
1476 | } | |
1477 | ||
1478 | DBGLOG(SAA, LOUD, ("EVENT-ABORT: Stop SAA FSM.\n")); | |
1479 | ||
1480 | cnmMemFree(prAdapter, prMsgHdr); | |
1481 | ||
1482 | ||
1483 | /* Reset Send Auth/(Re)Assoc Frame Count */ | |
1484 | prStaRec->ucTxAuthAssocRetryCount = 0; | |
1485 | ||
1486 | /* Cancel JOIN relative Timer */ | |
1487 | cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer); | |
1488 | ||
1489 | if (prStaRec->eAuthAssocState != AA_STATE_IDLE) { | |
1490 | #if DBG | |
1491 | DBGLOG(SAA, LOUD, ("EVENT-ABORT: Previous Auth/Assoc State == %s.\n", | |
1492 | apucDebugAAState[prStaRec->eAuthAssocState])); | |
1493 | #else | |
1494 | DBGLOG(SAA, LOUD, ("EVENT-ABORT: Previous Auth/Assoc State == %d.\n", | |
1495 | prStaRec->eAuthAssocState)); | |
1496 | #endif | |
1497 | } | |
1498 | ||
1499 | #if 0 | |
1500 | /* For the Auth/Assoc State to IDLE */ | |
1501 | prStaRec->eAuthAssocState = AA_STATE_IDLE; | |
1502 | #else | |
1503 | /* Free this StaRec */ | |
1504 | cnmStaRecFree(prAdapter, prStaRec, FALSE); | |
1505 | #endif | |
1506 | ||
1507 | return; | |
1508 | } /* end of saaFsmRunEventAbort() */ | |
1509 | ||
1510 | ||
1511 | /* TODO(Kevin): following code will be modified and move to AIS FSM */ | |
1512 | #if 0 | |
1513 | /*----------------------------------------------------------------------------*/ | |
1514 | /*! | |
1515 | * \brief This function will send Join Timeout Event to JOIN FSM. | |
1516 | * | |
1517 | * \param[in] prAdapter Pointer to the Adapter structure. | |
1518 | * | |
1519 | * \retval WLAN_STATUS_FAILURE Fail because of Join Timeout | |
1520 | */ | |
1521 | /*----------------------------------------------------------------------------*/ | |
1522 | WLAN_STATUS | |
1523 | joinFsmRunEventJoinTimeOut ( | |
1524 | IN P_ADAPTER_T prAdapter | |
1525 | ) | |
1526 | { | |
1527 | P_JOIN_INFO_T prJoinInfo; | |
1528 | P_STA_RECORD_T prStaRec; | |
1529 | ||
1530 | DEBUGFUNC("joinFsmRunEventJoinTimeOut"); | |
1531 | ||
1532 | ||
1533 | ASSERT(prAdapter); | |
1534 | prJoinInfo = &prAdapter->rJoinInfo; | |
1535 | ||
1536 | DBGLOG(JOIN, EVENT, ("JOIN EVENT: JOIN TIMEOUT\n")); | |
1537 | ||
1538 | /* Get a Station Record if possible, TA == BSSID for AP */ | |
1539 | prStaRec = staRecGetStaRecordByAddr(prAdapter, | |
1540 | prJoinInfo->prBssDesc->aucBSSID); | |
1541 | ||
1542 | /* We have renew this Sta Record when in JOIN_STATE_INIT */ | |
1543 | ASSERT(prStaRec); | |
1544 | ||
1545 | /* Record the Status Code of Authentication Request */ | |
1546 | prStaRec->u2StatusCode = STATUS_CODE_JOIN_TIMEOUT; | |
1547 | ||
1548 | /* Increase Failure Count */ | |
1549 | prStaRec->ucJoinFailureCount++; | |
1550 | ||
1551 | /* Reset Send Auth/(Re)Assoc Frame Count */ | |
1552 | prJoinInfo->ucTxAuthAssocRetryCount = 0; | |
1553 | ||
1554 | /* Cancel other JOIN relative Timer */ | |
1555 | ARB_CANCEL_TIMER(prAdapter, | |
1556 | prJoinInfo->rTxRequestTimer); | |
1557 | ||
1558 | ARB_CANCEL_TIMER(prAdapter, | |
1559 | prJoinInfo->rRxResponseTimer); | |
1560 | ||
1561 | /* Restore original setting from current BSS_INFO_T */ | |
1562 | if (prAdapter->eConnectionState == MEDIA_STATE_CONNECTED) { | |
1563 | joinAdoptParametersFromCurrentBss(prAdapter); | |
1564 | } | |
1565 | ||
1566 | /* Pull back to IDLE */ | |
1567 | joinFsmSteps(prAdapter, JOIN_STATE_IDLE); | |
1568 | ||
1569 | return WLAN_STATUS_FAILURE; | |
1570 | ||
1571 | } /* end of joinFsmRunEventJoinTimeOut() */ | |
1572 | ||
1573 | /*----------------------------------------------------------------------------*/ | |
1574 | /*! | |
1575 | * \brief This function will adopt the parameters from Peer BSS. | |
1576 | * | |
1577 | * \param[in] prAdapter Pointer to the Adapter structure. | |
1578 | * | |
1579 | * \return (none) | |
1580 | */ | |
1581 | /*----------------------------------------------------------------------------*/ | |
1582 | VOID | |
1583 | joinAdoptParametersFromPeerBss ( | |
1584 | IN P_ADAPTER_T prAdapter | |
1585 | ) | |
1586 | { | |
1587 | P_JOIN_INFO_T prJoinInfo; | |
1588 | P_BSS_DESC_T prBssDesc; | |
1589 | ||
1590 | DEBUGFUNC("joinAdoptParametersFromPeerBss"); | |
1591 | ||
1592 | ||
1593 | ASSERT(prAdapter); | |
1594 | prJoinInfo = &prAdapter->rJoinInfo; | |
1595 | prBssDesc = prJoinInfo->prBssDesc; | |
1596 | ||
1597 | //4 <1> Adopt Peer BSS' PHY TYPE | |
1598 | prAdapter->eCurrentPhyType = prBssDesc->ePhyType; | |
1599 | ||
1600 | DBGLOG(JOIN, INFO, ("Target BSS[%s]'s PhyType = %s\n", | |
1601 | prBssDesc->aucSSID, (prBssDesc->ePhyType == PHY_TYPE_ERP_INDEX) ? "ERP" : "HR_DSSS")); | |
1602 | ||
1603 | ||
1604 | //4 <2> Adopt Peer BSS' Frequency(Band/Channel) | |
1605 | DBGLOG(JOIN, INFO, ("Target BSS's Channel = %d, Band = %d\n", | |
1606 | prBssDesc->ucChannelNum, prBssDesc->eBand)); | |
1607 | ||
1608 | nicSwitchChannel(prAdapter, | |
1609 | prBssDesc->eBand, | |
1610 | prBssDesc->ucChannelNum, | |
1611 | 10); | |
1612 | ||
1613 | prJoinInfo->fgIsParameterAdopted = TRUE; | |
1614 | ||
1615 | return; | |
1616 | } /* end of joinAdoptParametersFromPeerBss() */ | |
1617 | ||
1618 | ||
1619 | /*----------------------------------------------------------------------------*/ | |
1620 | /*! | |
1621 | * \brief This function will adopt the parameters from current associated BSS. | |
1622 | * | |
1623 | * \param[in] prAdapter Pointer to the Adapter structure. | |
1624 | * | |
1625 | * \return (none) | |
1626 | */ | |
1627 | /*----------------------------------------------------------------------------*/ | |
1628 | VOID | |
1629 | joinAdoptParametersFromCurrentBss ( | |
1630 | IN P_ADAPTER_T prAdapter | |
1631 | ) | |
1632 | { | |
1633 | //P_JOIN_INFO_T prJoinInfo = &prAdapter->rJoinInfo; | |
1634 | P_BSS_INFO_T prBssInfo; | |
1635 | ||
1636 | ||
1637 | ASSERT(prAdapter); | |
1638 | prBssInfo = &prAdapter->rBssInfo; | |
1639 | ||
1640 | //4 <1> Adopt current BSS' PHY TYPE | |
1641 | prAdapter->eCurrentPhyType = prBssInfo->ePhyType; | |
1642 | ||
1643 | //4 <2> Adopt current BSS' Frequency(Band/Channel) | |
1644 | DBGLOG(JOIN, INFO, ("Current BSS's Channel = %d, Band = %d\n", | |
1645 | prBssInfo->ucChnl, prBssInfo->eBand)); | |
1646 | ||
1647 | nicSwitchChannel(prAdapter, | |
1648 | prBssInfo->eBand, | |
1649 | prBssInfo->ucChnl, | |
1650 | 10); | |
1651 | return; | |
1652 | } /* end of joinAdoptParametersFromCurrentBss() */ | |
1653 | ||
1654 | ||
1655 | /*----------------------------------------------------------------------------*/ | |
1656 | /*! | |
1657 | * \brief This function will update all the SW variables and HW MCR registers after | |
1658 | * the association with target BSS. | |
1659 | * | |
1660 | * \param[in] prAdapter Pointer to the Adapter structure. | |
1661 | * | |
1662 | * \return (none) | |
1663 | */ | |
1664 | /*----------------------------------------------------------------------------*/ | |
1665 | VOID | |
1666 | joinComplete ( | |
1667 | IN P_ADAPTER_T prAdapter | |
1668 | ) | |
1669 | { | |
1670 | P_JOIN_INFO_T prJoinInfo; | |
1671 | P_BSS_DESC_T prBssDesc; | |
1672 | P_PEER_BSS_INFO_T prPeerBssInfo; | |
1673 | P_BSS_INFO_T prBssInfo; | |
1674 | P_CONNECTION_SETTINGS_T prConnSettings; | |
1675 | P_STA_RECORD_T prStaRec; | |
1676 | P_TX_CTRL_T prTxCtrl; | |
1677 | #if CFG_SUPPORT_802_11D | |
1678 | P_IE_COUNTRY_T prIECountry; | |
1679 | #endif | |
1680 | ||
1681 | DEBUGFUNC("joinComplete"); | |
1682 | ||
1683 | ||
1684 | ASSERT(prAdapter); | |
1685 | prJoinInfo = &prAdapter->rJoinInfo; | |
1686 | prBssDesc = prJoinInfo->prBssDesc; | |
1687 | prPeerBssInfo = &prAdapter->rPeerBssInfo; | |
1688 | prBssInfo = &prAdapter->rBssInfo; | |
1689 | prConnSettings = &prAdapter->rConnSettings; | |
1690 | prTxCtrl = &prAdapter->rTxCtrl; | |
1691 | ||
1692 | //4 <1> Update Connecting & Connected Flag of BSS_DESC_T. | |
1693 | /* Remove previous AP's Connection Flags if have */ | |
1694 | scanRemoveConnectionFlagOfBssDescByBssid(prAdapter, prBssInfo->aucBSSID); | |
1695 | ||
1696 | prBssDesc->fgIsConnected = TRUE; /* Mask as Connected */ | |
1697 | ||
1698 | if (prBssDesc->fgIsHiddenSSID) { | |
1699 | /* NOTE(Kevin): This is for the case of Passive Scan and the target BSS didn't | |
1700 | * broadcast SSID on its Beacon Frame. | |
1701 | */ | |
1702 | COPY_SSID(prBssDesc->aucSSID, | |
1703 | prBssDesc->ucSSIDLen, | |
1704 | prAdapter->rConnSettings.aucSSID, | |
1705 | prAdapter->rConnSettings.ucSSIDLen); | |
1706 | ||
1707 | if (prBssDesc->ucSSIDLen) { | |
1708 | prBssDesc->fgIsHiddenSSID = FALSE; | |
1709 | } | |
1710 | #if DBG | |
1711 | else { | |
1712 | ASSERT(0); | |
1713 | } | |
1714 | #endif /* DBG */ | |
1715 | ||
1716 | DBGLOG(JOIN, INFO, ("Hidden SSID! - Update SSID : %s\n", prBssDesc->aucSSID)); | |
1717 | } | |
1718 | ||
1719 | ||
1720 | //4 <2> Update BSS_INFO_T from BSS_DESC_T | |
1721 | //4 <2.A> PHY Type | |
1722 | prBssInfo->ePhyType = prBssDesc->ePhyType; | |
1723 | ||
1724 | //4 <2.B> BSS Type | |
1725 | prBssInfo->eBSSType = BSS_TYPE_INFRASTRUCTURE; | |
1726 | ||
1727 | //4 <2.C> BSSID | |
1728 | COPY_MAC_ADDR(prBssInfo->aucBSSID, prBssDesc->aucBSSID); | |
1729 | ||
1730 | DBGLOG(JOIN, INFO, ("JOIN to BSSID: ["MACSTR"]\n", MAC2STR(prBssDesc->aucBSSID))); | |
1731 | ||
1732 | ||
1733 | //4 <2.D> SSID | |
1734 | COPY_SSID(prBssInfo->aucSSID, | |
1735 | prBssInfo->ucSSIDLen, | |
1736 | prBssDesc->aucSSID, | |
1737 | prBssDesc->ucSSIDLen); | |
1738 | ||
1739 | //4 <2.E> Channel / Band information. | |
1740 | prBssInfo->eBand = prBssDesc->eBand; | |
1741 | prBssInfo->ucChnl = prBssDesc->ucChannelNum; | |
1742 | ||
1743 | //4 <2.F> RSN/WPA information. | |
1744 | secFsmRunEventStart(prAdapter); | |
1745 | prBssInfo->u4RsnSelectedPairwiseCipher = prBssDesc->u4RsnSelectedPairwiseCipher; | |
1746 | prBssInfo->u4RsnSelectedGroupCipher = prBssDesc->u4RsnSelectedGroupCipher; | |
1747 | prBssInfo->u4RsnSelectedAKMSuite = prBssDesc->u4RsnSelectedAKMSuite; | |
1748 | ||
1749 | if (secRsnKeyHandshakeEnabled()) { | |
1750 | prBssInfo->fgIsWPAorWPA2Enabled = TRUE; | |
1751 | } | |
1752 | else { | |
1753 | prBssInfo->fgIsWPAorWPA2Enabled = FALSE; | |
1754 | } | |
1755 | ||
1756 | //4 <2.G> Beacon interval. | |
1757 | prBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval; | |
1758 | ||
1759 | //4 <2.H> DTIM period. | |
1760 | prBssInfo->ucDtimPeriod = prBssDesc->ucDTIMPeriod; | |
1761 | ||
1762 | //4 <2.I> ERP Information | |
1763 | if ((prBssInfo->ePhyType == PHY_TYPE_ERP_INDEX) && // Our BSS's PHY_TYPE is ERP now. | |
1764 | (prBssDesc->fgIsERPPresent)) { | |
1765 | ||
1766 | prBssInfo->fgIsERPPresent = TRUE; | |
1767 | prBssInfo->ucERP = prBssDesc->ucERP; /* Save the ERP for later check */ | |
1768 | } | |
1769 | else { /* Some AP, may send ProbeResp without ERP IE. Thus prBssDesc->fgIsERPPresent is FALSE. */ | |
1770 | prBssInfo->fgIsERPPresent = FALSE; | |
1771 | prBssInfo->ucERP = 0; | |
1772 | } | |
1773 | ||
1774 | #if CFG_SUPPORT_802_11D | |
1775 | //4 <2.J> Country inforamtion of the associated AP | |
1776 | if (prConnSettings->fgMultiDomainCapabilityEnabled) { | |
1777 | DOMAIN_INFO_ENTRY rDomainInfo; | |
1778 | if (domainGetDomainInfoByScanResult(prAdapter, &rDomainInfo)) { | |
1779 | if (prBssDesc->prIECountry) { | |
1780 | prIECountry = prBssDesc->prIECountry; | |
1781 | ||
1782 | domainParseCountryInfoElem(prIECountry, &prBssInfo->rDomainInfo); | |
1783 | ||
1784 | /* use the domain get from the BSS info */ | |
1785 | prBssInfo->fgIsCountryInfoPresent = TRUE; | |
1786 | nicSetupOpChnlList(prAdapter, prBssInfo->rDomainInfo.u2CountryCode, FALSE); | |
1787 | } else { | |
1788 | /* use the domain get from the scan result */ | |
1789 | prBssInfo->fgIsCountryInfoPresent = TRUE; | |
1790 | nicSetupOpChnlList(prAdapter, rDomainInfo.u2CountryCode, FALSE); | |
1791 | } | |
1792 | } | |
1793 | } | |
1794 | #endif | |
1795 | ||
1796 | //4 <2.K> Signal Power of the associated AP | |
1797 | prBssInfo->rRcpi = prBssDesc->rRcpi; | |
1798 | prBssInfo->rRssi = RCPI_TO_dBm(prBssInfo->rRcpi); | |
1799 | GET_CURRENT_SYSTIME(&prBssInfo->rRssiLastUpdateTime); | |
1800 | ||
1801 | //4 <2.L> Capability Field of the associated AP | |
1802 | prBssInfo->u2CapInfo = prBssDesc->u2CapInfo; | |
1803 | ||
1804 | DBGLOG(JOIN, INFO, ("prBssInfo-> fgIsERPPresent = %d, ucERP = %02x, rRcpi = %d, rRssi = %ld\n", | |
1805 | prBssInfo->fgIsERPPresent, prBssInfo->ucERP, prBssInfo->rRcpi, prBssInfo->rRssi)); | |
1806 | ||
1807 | ||
1808 | //4 <3> Update BSS_INFO_T from PEER_BSS_INFO_T & NIC RATE FUNC | |
1809 | //4 <3.A> Association ID | |
1810 | prBssInfo->u2AssocId = prPeerBssInfo->u2AssocId; | |
1811 | ||
1812 | //4 <3.B> WMM Infomation | |
1813 | if (prAdapter->fgIsEnableWMM && | |
1814 | (prPeerBssInfo->rWmmInfo.ucWmmFlag & WMM_FLAG_SUPPORT_WMM)) { | |
1815 | ||
1816 | prBssInfo->fgIsWmmAssoc = TRUE; | |
1817 | prTxCtrl->rTxQForVoipAccess = TXQ_AC3; | |
1818 | ||
1819 | qosWmmInfoInit(&prBssInfo->rWmmInfo, (prBssInfo->ePhyType == PHY_TYPE_HR_DSSS_INDEX) ? TRUE : FALSE); | |
1820 | ||
1821 | if (prPeerBssInfo->rWmmInfo.ucWmmFlag & WMM_FLAG_AC_PARAM_PRESENT) { | |
1822 | kalMemCopy(&prBssInfo->rWmmInfo, | |
1823 | &prPeerBssInfo->rWmmInfo, | |
1824 | sizeof(WMM_INFO_T)); | |
1825 | } | |
1826 | else { | |
1827 | kalMemCopy(&prBssInfo->rWmmInfo, | |
1828 | &prPeerBssInfo->rWmmInfo, | |
1829 | sizeof(WMM_INFO_T) - sizeof(prPeerBssInfo->rWmmInfo.arWmmAcParams)); | |
1830 | } | |
1831 | } | |
1832 | else { | |
1833 | prBssInfo->fgIsWmmAssoc = FALSE; | |
1834 | prTxCtrl->rTxQForVoipAccess = TXQ_AC1; | |
1835 | ||
1836 | kalMemZero(&prBssInfo->rWmmInfo, sizeof(WMM_INFO_T)); | |
1837 | } | |
1838 | ||
1839 | ||
1840 | //4 <3.C> Operational Rate Set & BSS Basic Rate Set | |
1841 | prBssInfo->u2OperationalRateSet = prPeerBssInfo->u2OperationalRateSet; | |
1842 | prBssInfo->u2BSSBasicRateSet = prPeerBssInfo->u2BSSBasicRateSet; | |
1843 | ||
1844 | ||
1845 | //4 <3.D> Short Preamble | |
1846 | if (prBssInfo->fgIsERPPresent) { | |
1847 | ||
1848 | /* NOTE(Kevin 2007/12/24): Truth Table. | |
1849 | * Short Preamble Bit in | |
1850 | * <AssocReq> <AssocResp w/i ERP> <BARKER(Long)> Final Driver Setting(Short) | |
1851 | * TRUE FALSE FALSE FALSE(shouldn't have such case, use the AssocResp) | |
1852 | * TRUE FALSE TRUE FALSE | |
1853 | * FALSE FALSE FALSE FALSE(shouldn't have such case, use the AssocResp) | |
1854 | * FALSE FALSE TRUE FALSE | |
1855 | * TRUE TRUE FALSE TRUE(follow ERP) | |
1856 | * TRUE TRUE TRUE FALSE(follow ERP) | |
1857 | * FALSE TRUE FALSE FALSE(shouldn't have such case, and we should set to FALSE) | |
1858 | * FALSE TRUE TRUE FALSE(we should set to FALSE) | |
1859 | */ | |
1860 | if ((prPeerBssInfo->fgIsShortPreambleAllowed) && | |
1861 | ((prConnSettings->ePreambleType == PREAMBLE_TYPE_SHORT) || /* Short Preamble Option Enable is TRUE */ | |
1862 | ((prConnSettings->ePreambleType == PREAMBLE_TYPE_AUTO) && | |
1863 | (prBssDesc->u2CapInfo & CAP_INFO_SHORT_PREAMBLE)))) { | |
1864 | ||
1865 | prBssInfo->fgIsShortPreambleAllowed = TRUE; | |
1866 | ||
1867 | if (prBssInfo->ucERP & ERP_INFO_BARKER_PREAMBLE_MODE) { | |
1868 | prBssInfo->fgUseShortPreamble = FALSE; | |
1869 | } | |
1870 | else { | |
1871 | prBssInfo->fgUseShortPreamble = TRUE; | |
1872 | } | |
1873 | } | |
1874 | else { | |
1875 | prBssInfo->fgIsShortPreambleAllowed = FALSE; | |
1876 | prBssInfo->fgUseShortPreamble = FALSE; | |
1877 | } | |
1878 | } | |
1879 | else { | |
1880 | /* NOTE(Kevin 2007/12/24): Truth Table. | |
1881 | * Short Preamble Bit in | |
1882 | * <AssocReq> <AssocResp w/o ERP> Final Driver Setting(Short) | |
1883 | * TRUE FALSE FALSE | |
1884 | * FALSE FALSE FALSE | |
1885 | * TRUE TRUE TRUE | |
1886 | * FALSE TRUE(status success) TRUE | |
1887 | * --> Honor the result of prPeerBssInfo. | |
1888 | */ | |
1889 | ||
1890 | prBssInfo->fgIsShortPreambleAllowed = prBssInfo->fgUseShortPreamble = | |
1891 | prPeerBssInfo->fgIsShortPreambleAllowed; | |
1892 | } | |
1893 | ||
1894 | DBGLOG(JOIN, INFO, ("prBssInfo->fgIsShortPreambleAllowed = %d, prBssInfo->fgUseShortPreamble = %d\n", | |
1895 | prBssInfo->fgIsShortPreambleAllowed, prBssInfo->fgUseShortPreamble)); | |
1896 | ||
1897 | ||
1898 | //4 <3.E> Short Slot Time | |
1899 | prBssInfo->fgUseShortSlotTime = | |
1900 | prPeerBssInfo->fgUseShortSlotTime; /* AP support Short Slot Time */ | |
1901 | ||
1902 | DBGLOG(JOIN, INFO, ("prBssInfo->fgUseShortSlotTime = %d\n", | |
1903 | prBssInfo->fgUseShortSlotTime)); | |
1904 | ||
1905 | nicSetSlotTime(prAdapter, | |
1906 | prBssInfo->ePhyType, | |
1907 | ((prConnSettings->fgIsShortSlotTimeOptionEnable && | |
1908 | prBssInfo->fgUseShortSlotTime) ? TRUE : FALSE)); | |
1909 | ||
1910 | ||
1911 | //4 <3.F> Update Tx Rate for Control Frame | |
1912 | bssUpdateTxRateForControlFrame(prAdapter); | |
1913 | ||
1914 | ||
1915 | //4 <3.G> Save the available Auth Types during Roaming (Design for Fast BSS Transition). | |
1916 | //if (prAdapter->fgIsEnableRoaming) /* NOTE(Kevin): Always prepare info for roaming */ | |
1917 | { | |
1918 | ||
1919 | if (prJoinInfo->ucCurrAuthAlgNum == AUTH_ALGORITHM_NUM_OPEN_SYSTEM) { | |
1920 | prJoinInfo->ucRoamingAuthTypes |= AUTH_TYPE_OPEN_SYSTEM; | |
1921 | } | |
1922 | else if (prJoinInfo->ucCurrAuthAlgNum == AUTH_ALGORITHM_NUM_SHARED_KEY) { | |
1923 | prJoinInfo->ucRoamingAuthTypes |= AUTH_TYPE_SHARED_KEY; | |
1924 | } | |
1925 | ||
1926 | prBssInfo->ucRoamingAuthTypes = prJoinInfo->ucRoamingAuthTypes; | |
1927 | ||
1928 | ||
1929 | /* Set the stable time of the associated BSS. We won't do roaming decision | |
1930 | * during the stable time. | |
1931 | */ | |
1932 | SET_EXPIRATION_TIME(prBssInfo->rRoamingStableExpirationTime, | |
1933 | SEC_TO_SYSTIME(ROAMING_STABLE_TIMEOUT_SEC)); | |
1934 | } | |
1935 | ||
1936 | ||
1937 | //4 <3.H> Update Parameter for TX Fragmentation Threshold | |
1938 | #if CFG_TX_FRAGMENT | |
1939 | txFragInfoUpdate(prAdapter); | |
1940 | #endif /* CFG_TX_FRAGMENT */ | |
1941 | ||
1942 | ||
1943 | //4 <4> Update STA_RECORD_T | |
1944 | /* Get a Station Record if possible */ | |
1945 | prStaRec = staRecGetStaRecordByAddr(prAdapter, | |
1946 | prBssDesc->aucBSSID); | |
1947 | ||
1948 | if (prStaRec) { | |
1949 | UINT_16 u2OperationalRateSet, u2DesiredRateSet; | |
1950 | ||
1951 | //4 <4.A> Desired Rate Set | |
1952 | u2OperationalRateSet = (rPhyAttributes[prBssInfo->ePhyType].u2SupportedRateSet & | |
1953 | prBssInfo->u2OperationalRateSet); | |
1954 | ||
1955 | u2DesiredRateSet = (u2OperationalRateSet & prConnSettings->u2DesiredRateSet); | |
1956 | if (u2DesiredRateSet) { | |
1957 | prStaRec->u2DesiredRateSet = u2DesiredRateSet; | |
1958 | } | |
1959 | else { | |
1960 | /* For Error Handling - The Desired Rate Set is not covered in Operational Rate Set. */ | |
1961 | prStaRec->u2DesiredRateSet = u2OperationalRateSet; | |
1962 | } | |
1963 | ||
1964 | /* Try to set the best initial rate for this entry */ | |
1965 | if (!rateGetBestInitialRateIndex(prStaRec->u2DesiredRateSet, | |
1966 | prStaRec->rRcpi, | |
1967 | &prStaRec->ucCurrRate1Index)) { | |
1968 | ||
1969 | if (!rateGetLowestRateIndexFromRateSet(prStaRec->u2DesiredRateSet, | |
1970 | &prStaRec->ucCurrRate1Index)) { | |
1971 | ASSERT(0); | |
1972 | } | |
1973 | } | |
1974 | ||
1975 | DBGLOG(JOIN, INFO, ("prStaRec->ucCurrRate1Index = %d\n", | |
1976 | prStaRec->ucCurrRate1Index)); | |
1977 | ||
1978 | //4 <4.B> Preamble Mode | |
1979 | prStaRec->fgIsShortPreambleOptionEnable = | |
1980 | prBssInfo->fgUseShortPreamble; | |
1981 | ||
1982 | //4 <4.C> QoS Flag | |
1983 | prStaRec->fgIsQoS = prBssInfo->fgIsWmmAssoc; | |
1984 | } | |
1985 | #if DBG | |
1986 | else { | |
1987 | ASSERT(0); | |
1988 | } | |
1989 | #endif /* DBG */ | |
1990 | ||
1991 | ||
1992 | //4 <5> Update NIC | |
1993 | //4 <5.A> Update BSSID & Operation Mode | |
1994 | nicSetupBSS(prAdapter, prBssInfo); | |
1995 | ||
1996 | //4 <5.B> Update WLAN Table. | |
1997 | if (nicSetHwBySta(prAdapter, prStaRec) == FALSE) { | |
1998 | ASSERT(FALSE); | |
1999 | } | |
2000 | ||
2001 | //4 <5.C> Update Desired Rate Set for BT. | |
2002 | #if CFG_TX_FRAGMENT | |
2003 | if (prConnSettings->fgIsEnableTxAutoFragmentForBT) { | |
2004 | txRateSetInitForBT(prAdapter, prStaRec); | |
2005 | } | |
2006 | #endif /* CFG_TX_FRAGMENT */ | |
2007 | ||
2008 | //4 <5.D> TX AC Parameter and TX/RX Queue Control | |
2009 | if (prBssInfo->fgIsWmmAssoc) { | |
2010 | ||
2011 | #if CFG_TX_AGGREGATE_HW_FIFO | |
2012 | nicTxAggregateTXQ(prAdapter, FALSE); | |
2013 | #endif /* CFG_TX_AGGREGATE_HW_FIFO */ | |
2014 | ||
2015 | qosUpdateWMMParametersAndAssignAllowedACI(prAdapter, &prBssInfo->rWmmInfo); | |
2016 | } | |
2017 | else { | |
2018 | ||
2019 | #if CFG_TX_AGGREGATE_HW_FIFO | |
2020 | nicTxAggregateTXQ(prAdapter, TRUE); | |
2021 | #endif /* CFG_TX_AGGREGATE_HW_FIFO */ | |
2022 | ||
2023 | nicTxNonQoSAssignDefaultAdmittedTXQ(prAdapter); | |
2024 | ||
2025 | nicTxNonQoSUpdateTXQParameters(prAdapter, | |
2026 | prBssInfo->ePhyType); | |
2027 | } | |
2028 | ||
2029 | #if CFG_TX_STOP_WRITE_TX_FIFO_UNTIL_JOIN | |
2030 | { | |
2031 | prTxCtrl->fgBlockTxDuringJoin = FALSE; | |
2032 | ||
2033 | #if !CFG_TX_AGGREGATE_HW_FIFO /* TX FIFO AGGREGATE already do flush once */ | |
2034 | nicTxFlushStopQueues(prAdapter, (UINT_8)TXQ_DATA_MASK, (UINT_8)NULL); | |
2035 | #endif /* CFG_TX_AGGREGATE_HW_FIFO */ | |
2036 | ||
2037 | nicTxRetransmitOfSendWaitQue(prAdapter); | |
2038 | ||
2039 | if (prTxCtrl->fgIsPacketInOsSendQueue) { | |
2040 | nicTxRetransmitOfOsSendQue(prAdapter); | |
2041 | } | |
2042 | ||
2043 | #if CFG_SDIO_TX_ENHANCE | |
2044 | halTxLeftClusteredMpdu(prAdapter); | |
2045 | #endif /* CFG_SDIO_TX_ENHANCE */ | |
2046 | ||
2047 | } | |
2048 | #endif /* CFG_TX_STOP_WRITE_TX_FIFO_UNTIL_JOIN */ | |
2049 | ||
2050 | ||
2051 | //4 <6> Setup CONNECTION flag. | |
2052 | prAdapter->eConnectionState = MEDIA_STATE_CONNECTED; | |
2053 | prAdapter->eConnectionStateIndicated = MEDIA_STATE_CONNECTED; | |
2054 | ||
2055 | if (prJoinInfo->fgIsReAssoc) { | |
2056 | prAdapter->fgBypassPortCtrlForRoaming = TRUE; | |
2057 | } | |
2058 | else { | |
2059 | prAdapter->fgBypassPortCtrlForRoaming = FALSE; | |
2060 | } | |
2061 | ||
2062 | kalIndicateStatusAndComplete(prAdapter->prGlueInfo, | |
2063 | WLAN_STATUS_MEDIA_CONNECT, | |
2064 | (PVOID)NULL, | |
2065 | 0); | |
2066 | ||
2067 | return; | |
2068 | } /* end of joinComplete() */ | |
2069 | #endif | |
2070 |