import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / connectivity / conn_soc / drv_wlan / mt_wifi / wlan / mgmt / saa_fsm.c
CommitLineData
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 */
254static 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/*----------------------------------------------------------------------------*/
295VOID
296saaFsmSteps (
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/*----------------------------------------------------------------------------*/
523WLAN_STATUS
524saaFsmSendEventJoinComplete (
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/*----------------------------------------------------------------------------*/
638VOID
639saaFsmRunEventStart (
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/*----------------------------------------------------------------------------*/
751WLAN_STATUS
752saaFsmRunEventTxDone (
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/*----------------------------------------------------------------------------*/
891VOID
892saaFsmRunEventTxReqTimeOut (
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/*----------------------------------------------------------------------------*/
929VOID
930saaFsmRunEventRxRespTimeOut (
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
987VOID
988saaFsmRunEventErrCountInc(
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/*----------------------------------------------------------------------------*/
1011VOID
1012saaFsmRunEventRxAuth (
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/*----------------------------------------------------------------------------*/
1146WLAN_STATUS
1147saaFsmRunEventRxAssoc (
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/*----------------------------------------------------------------------------*/
1235WLAN_STATUS
1236saaFsmRunEventRxDeauth (
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/*----------------------------------------------------------------------------*/
1349WLAN_STATUS
1350saaFsmRunEventRxDisassoc (
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/*----------------------------------------------------------------------------*/
1457VOID
1458saaFsmRunEventAbort (
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/*----------------------------------------------------------------------------*/
1522WLAN_STATUS
1523joinFsmRunEventJoinTimeOut (
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/*----------------------------------------------------------------------------*/
1582VOID
1583joinAdoptParametersFromPeerBss (
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/*----------------------------------------------------------------------------*/
1628VOID
1629joinAdoptParametersFromCurrentBss (
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/*----------------------------------------------------------------------------*/
1665VOID
1666joinComplete (
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