2 ** $Id: //Department/DaVinci/BRANCHES/MT662X_593X_WIFI_DRIVER_V2_3/mgmt/aaa_fsm.c#1 $
6 \brief This file defines the FSM for AAA MODULE.
8 This file defines the FSM for AAA MODULE.
11 /*******************************************************************************
12 * Copyright (c) 2010 MediaTek Inc.
14 * All rights reserved. Copying, compilation, modification, distribution
15 * or any other use whatsoever of this material is strictly prohibited
16 * except in accordance with a Software License Agreement with
18 ********************************************************************************
21 /*******************************************************************************
24 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
25 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
26 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
27 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
28 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
29 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
30 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
31 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
32 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
33 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
34 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
35 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
36 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
38 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
39 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
40 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
41 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
42 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
44 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
45 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
46 * OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
47 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
48 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
50 ********************************************************************************
56 ** 08 24 2012 yuche.tsai
57 ** [WCXRP00001119] [Volunteer Patch][WiFi Direct][Driver] Connection Policy Set for WFD SIGMA test
58 ** Bug fix for Assoc Req rx check len.
60 * 07 17 2012 yuche.tsai
62 * Compile no error before trial run.
64 * 06 13 2012 yuche.tsai
66 * Update maintrunk driver.
67 * Add support for driver compose assoc request frame.
71 * Sync CFG80211 modification from branch 2,2.
73 * 02 22 2012 yuche.tsai
75 * Solve sigma test 5.1.3 issue, assoc response should have P2P IE.
77 * 12 02 2011 yuche.tsai
79 * Resolve inorder issue under AP mode.
81 * data frame may TX before assoc response frame.
83 * 11 18 2011 yuche.tsai
85 * CONFIG P2P support RSSI query, default turned off.
89 * Add BoW 11N support.
91 * 06 02 2011 eddie.chen
92 * [WCXRP00000759] [MT6620 Wi-Fi][DRV] Update RCPI in AAA
93 * Update RCPI when receiving Assoc request.
96 * [WCXRP00000674] [MT6620 Wi-Fi][Driver] Refine AAA authSendAuthFrame
97 * Add network type parameter to authSendAuthFrame.
99 * 04 15 2011 chinghwa.yu
100 * [WCXRP00000065] Update BoW design and settings
101 * Add BOW short range mode.
103 * 04 09 2011 chinghwa.yu
104 * [WCXRP00000065] Update BoW design and settings
105 * Change Link connection event procedure and change skb length check to 1512 bytes.
108 * [WCXRP00000530] [MT6620 Wi-Fi] [Driver] skip doing p2pRunEventAAAComplete after send assoc response Tx Done
109 * Skip to call p2pRunEventAAAComplete to avoid indicate STA connect twice.
111 * 03 04 2011 terry.wu
112 * [WCXRP00000515] [MT6620 Wi-Fi][Driver] Surpress compiler warning which is identified by GNU compiler collection
113 * Remove unused variable.
115 * 02 16 2011 yuche.tsai
116 * [WCXRP00000429] [Volunteer Patch][MT6620][Driver] Hot Spot Client Limit Issue
117 * Add more check after RX assoc frame under Hot-Spot mode.
119 * 02 09 2011 yuche.tsai
120 * [WCXRP00000429] [Volunteer Patch][MT6620][Driver] Hot Spot Client Limit Issue
121 * Fix Client Limit Issue.
123 * 01 25 2011 yuche.tsai
124 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
125 * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
127 * 01 15 2011 puff.wen
129 * [On behalf of Frog] Add CFG_ENABLE_WIFI_DIRECT to p2pRunEventAAAComplete
131 * 01 14 2011 yuche.tsai
132 * [WCXRP00000352] [Volunteer Patch][MT6620][Driver] P2P Statsion Record Client List Issue
133 * Modify AAA flow according to CM's comment.
135 * 09 03 2010 kevin.huang
137 * Refine #include sequence and solve recursive/nested #include issue
139 * 08 29 2010 yuche.tsai
141 * Fix Compile warning, type cast from UINT_32 to UINT_16.
143 * 08 26 2010 yuche.tsai
145 * In P2P AT GO test mode under WinXP, we would not indicate connected event to host.
147 * 08 24 2010 cm.chang
149 * Support RLM initail channel of Ad-hoc, P2P and BOW
151 * 08 23 2010 chinghwa.yu
155 * 08 20 2010 kevin.huang
157 * Modify AAA Module for changing STA STATE 3 at p2p/bowRunEventAAAComplete()
159 * 08 17 2010 yuche.tsai
161 * Fix bug while enabling P2P GO.
163 * 08 16 2010 kevin.huang
165 * Refine AAA functions
169 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
172 * [WPD00003833][MT6620 and MT5931] Driver migration
173 * refine TX-DONE callback.
175 * 06 21 2010 yuche.tsai
176 * [WPD00003839][MT6620 5931][P2P] Feature migration
177 * modify due to P2P functino call prototype change.
179 * 06 17 2010 yuche.tsai
180 * [WPD00003839][MT6620 5931][P2P] Feature migration
181 * First draft for migration P2P FSM from FW to Driver.
183 * 04 02 2010 kevin.huang
184 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
187 * 02 26 2010 kevin.huang
188 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
189 * add support of Driver STA_RECORD_T activation
191 * 02 04 2010 kevin.huang
192 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
193 * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
196 /*******************************************************************************
197 * C O M P I L E R F L A G S
198 ********************************************************************************
201 /*******************************************************************************
202 * E X T E R N A L R E F E R E N C E S
203 ********************************************************************************
207 /*******************************************************************************
209 ********************************************************************************
212 /*******************************************************************************
214 ********************************************************************************
217 /*******************************************************************************
218 * P U B L I C D A T A
219 ********************************************************************************
222 /*******************************************************************************
223 * P R I V A T E D A T A
224 ********************************************************************************
227 /*******************************************************************************
229 ********************************************************************************
232 /*******************************************************************************
233 * F U N C T I O N D E C L A R A T I O N S
234 ********************************************************************************
237 /*******************************************************************************
239 ********************************************************************************
242 /*----------------------------------------------------------------------------*/
244 * @brief This function will send Event to AIS/BOW/P2P
246 * @param[in] rJoinStatus To indicate JOIN success or failure.
247 * @param[in] prStaRec Pointer to the STA_RECORD_T
248 * @param[in] prSwRfb Pointer to the SW_RFB_T
252 /*----------------------------------------------------------------------------*/
254 aaaFsmSendEventJoinComplete (
255 WLAN_STATUS rJoinStatus,
256 P_STA_RECORD_T prStaRec,
260 P_MSG_SAA_JOIN_COMP_T prJoinCompMsg;
265 prJoinCompMsg = cnmMemAlloc(RAM_TYPE_TCM, sizeof(MSG_SAA_JOIN_COMP_T));
266 if (!prJoinCompMsg) {
267 return WLAN_STATUS_RESOURCES;
270 if (IS_STA_IN_AIS(prStaRec)) {
271 prJoinCompMsg->rMsgHdr.eMsgId = MID_SAA_AIS_JOIN_COMPLETE;
273 else if (IS_STA_IN_P2P(prStaRec)) {
274 prJoinCompMsg->rMsgHdr.eMsgId = MID_SAA_P2P_JOIN_COMPLETE;
276 else if (IS_STA_IN_BOW(prStaRec)) {
277 prJoinCompMsg->rMsgHdr.eMsgId = MID_SAA_BOW_JOIN_COMPLETE;
283 prJoinCompMsg->rJoinStatus = rJoinStatus;
284 prJoinCompMsg->prStaRec = prStaRec;
285 prJoinCompMsg->prSwRfb = prSwRfb;
287 mboxSendMsg(MBOX_ID_0,
288 (P_MSG_HDR_T)prJoinCompMsg,
289 MSG_SEND_METHOD_BUF);
291 return WLAN_STATUS_SUCCESS;
293 } /* end of saaFsmSendEventJoinComplete() */
295 /*----------------------------------------------------------------------------*/
297 * @brief This function will handle the Start Event to AAA FSM.
299 * @param[in] prMsgHdr Message of Join Request for a particular STA.
303 /*----------------------------------------------------------------------------*/
305 aaaFsmRunEventStart (
306 IN P_MSG_HDR_T prMsgHdr
309 P_MSG_SAA_JOIN_REQ_T prJoinReqMsg;
310 P_STA_RECORD_T prStaRec;
311 P_AIS_BSS_INFO_T prAisBssInfo;
316 prJoinReqMsg = (P_MSG_SAA_JOIN_REQ_T)prMsgHdr;
317 prStaRec = prJoinReqMsg->prStaRec;
321 DBGLOG(SAA, LOUD, ("EVENT-START: Trigger SAA FSM\n"));
323 cnmMemFree(prMsgHdr);
325 //4 <1> Validation of SAA Start Event
326 if (!IS_AP_STA(prStaRec->eStaType)) {
328 DBGLOG(SAA, ERROR, ("EVENT-START: STA Type - %d was not supported.\n", prStaRec->eStaType));
330 /* Ignore the return value because don't care the prSwRfb */
331 saaFsmSendEventJoinComplete(WLAN_STATUS_FAILURE, prStaRec, NULL);
336 //4 <2> The previous JOIN process is not completed ?
337 if (prStaRec->eAuthAssocState != AA_STATE_IDLE) {
338 DBGLOG(SAA, ERROR, ("EVENT-START: Reentry of SAA Module.\n"));
339 prStaRec->eAuthAssocState = AA_STATE_IDLE;
342 //4 <3> Reset Status Code and Time
343 /* Update Station Record - Status/Reason Code */
344 prStaRec->u2StatusCode = STATUS_CODE_SUCCESSFUL;
346 /* Update the record join time. */
347 GET_CURRENT_SYSTIME(&prStaRec->rLastJoinTime);
349 prStaRec->ucTxAuthAssocRetryCount = 0;
351 if (prStaRec->prChallengeText) {
352 cnmMemFree(prStaRec->prChallengeText);
353 prStaRec->prChallengeText = (P_IE_CHALLENGE_TEXT_T)NULL;
356 cnmTimerStopTimer(&prStaRec->rTxReqDoneOrRxRespTimer);
358 prStaRec->ucStaState = STA_STATE_1;
360 /* Trigger SAA MODULE */
361 saaFsmSteps(prStaRec, SAA_STATE_SEND_AUTH1, (P_SW_RFB_T)NULL);
364 } /* end of saaFsmRunEventStart() */
369 /*----------------------------------------------------------------------------*/
371 * @brief This function will process the Rx Auth Request Frame and then
374 * @param[in] prAdapter Pointer to the Adapter structure.
375 * @param[in] prSwRfb Pointer to the SW_RFB_T structure.
379 /*----------------------------------------------------------------------------*/
381 aaaFsmRunEventRxAuth (
382 IN P_ADAPTER_T prAdapter,
383 IN P_SW_RFB_T prSwRfb
386 P_BSS_INFO_T prBssInfo;
387 P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
388 UINT_16 u2StatusCode;
389 BOOLEAN fgReplyAuth = FALSE;
390 ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex;
398 //4 <1> Check P2P network conditions
399 #if CFG_ENABLE_WIFI_DIRECT
400 if(prAdapter->fgIsP2PRegistered){
401 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
403 if (prBssInfo->fgIsNetActive) {
405 //4 <1.1> Validate Auth Frame by Auth Algorithm/Transation Seq
406 if (WLAN_STATUS_SUCCESS ==
407 authProcessRxAuth1Frame(prAdapter,
410 AUTH_ALGORITHM_NUM_OPEN_SYSTEM,
411 AUTH_TRANSACTION_SEQ_1,
414 if (STATUS_CODE_SUCCESSFUL == u2StatusCode) {
415 //4 <1.2> Validate Auth Frame for Network Specific Conditions
416 fgReplyAuth = p2pFuncValidateAuth(
425 eNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
430 #endif /* CFG_ENABLE_WIFI_DIRECT */
432 //4 <2> Check BOW network conditions
433 #if CFG_ENABLE_BT_OVER_WIFI
435 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
437 if ((prBssInfo->fgIsNetActive) &&
438 (OP_MODE_BOW == prBssInfo->eCurrentOPMode)) {
440 //4 <2.1> Validate Auth Frame by Auth Algorithm/Transation Seq
441 /* Check if for this BSSID */
442 if (WLAN_STATUS_SUCCESS ==
443 authProcessRxAuth1Frame(prAdapter,
446 AUTH_ALGORITHM_NUM_OPEN_SYSTEM,
447 AUTH_TRANSACTION_SEQ_1,
450 if (STATUS_CODE_SUCCESSFUL == u2StatusCode) {
452 //4 <2.2> Validate Auth Frame for Network Specific Conditions
453 fgReplyAuth = bowValidateAuth(prAdapter, prSwRfb, &prStaRec, &u2StatusCode);
460 eNetTypeIndex = NETWORK_TYPE_BOW_INDEX;
461 /* TODO(Kevin): Allocate a STA_RECORD_T for new client */
466 #endif /* CFG_ENABLE_BT_OVER_WIFI */
473 prStaRec->ucRCPI = prSwRfb->prHifRxHdr->ucRcpi;
476 //4 <3> Update STA_RECORD_T and reply Auth_2(Response to Auth_1) Frame
481 if (u2StatusCode == STATUS_CODE_SUCCESSFUL) {
482 if (prStaRec->eAuthAssocState != AA_STATE_IDLE) {
483 DBGLOG(AAA, WARN, ("Previous AuthAssocState (%d) != IDLE.\n",
484 prStaRec->eAuthAssocState));
487 prStaRec->eAuthAssocState = AAA_STATE_SEND_AUTH2;
490 prStaRec->eAuthAssocState = AA_STATE_IDLE;
492 /* NOTE(Kevin): Change to STATE_1 */
493 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
496 /* Update the record join time. */
497 GET_CURRENT_SYSTIME(&prStaRec->rUpdateTime);
499 /* Update Station Record - Status/Reason Code */
500 prStaRec->u2StatusCode = u2StatusCode;
502 prStaRec->ucAuthAlgNum = AUTH_ALGORITHM_NUM_OPEN_SYSTEM;
505 /* NOTE(Kevin): We should have STA_RECORD_T if the status code was successful */
506 ASSERT(!(u2StatusCode == STATUS_CODE_SUCCESSFUL));
509 /* NOTE: Ignore the return status for AAA */
511 authSendAuthFrame(prAdapter,
515 AUTH_TRANSACTION_SEQ_2,
521 } /* end of aaaFsmRunEventRxAuth() */
524 /*----------------------------------------------------------------------------*/
526 * @brief This function will process the Rx (Re)Association Request Frame and then
529 * @param[in] prAdapter Pointer to the Adapter structure.
530 * @param[in] prSwRfb Pointer to the SW_RFB_T structure.
532 * @retval WLAN_STATUS_SUCCESS Always return success
534 /*----------------------------------------------------------------------------*/
536 aaaFsmRunEventRxAssoc (
537 IN P_ADAPTER_T prAdapter,
538 IN P_SW_RFB_T prSwRfb
541 P_BSS_INFO_T prBssInfo;
542 P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
543 UINT_16 u2StatusCode = STATUS_CODE_RESERVED;
544 BOOLEAN fgReplyAssocResp = FALSE;
551 //4 <1> Check if we have the STA_RECORD_T for incoming Assoc Req
552 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
554 /* We should have the corresponding Sta Record. */
555 if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
556 ASSERT(0); // Only for debug phase
560 if (!IS_CLIENT_STA(prStaRec)) {
564 if (prStaRec->ucStaState == STA_STATE_3) {
565 /* Do Reassocation */
567 else if ((prStaRec->ucStaState == STA_STATE_2) &&
568 (prStaRec->eAuthAssocState == AAA_STATE_SEND_AUTH2)) {
572 DBGLOG(AAA, WARN, ("Previous AuthAssocState (%d) != SEND_AUTH2.\n",
573 prStaRec->eAuthAssocState));
578 prStaRec->ucRCPI = prSwRfb->prHifRxHdr->ucRcpi;
580 //4 <2> Check P2P network conditions
581 #if CFG_ENABLE_WIFI_DIRECT
582 if ((prAdapter->fgIsP2PRegistered) && (IS_STA_IN_P2P(prStaRec))) {
584 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
586 if (prBssInfo->fgIsNetActive) {
588 //4 <2.1> Validate Assoc Req Frame and get Status Code
589 /* Check if for this BSSID */
590 if (WLAN_STATUS_SUCCESS ==
591 assocProcessRxAssocReqFrame(prAdapter,
595 if (STATUS_CODE_SUCCESSFUL == u2StatusCode) {
596 //4 <2.2> Validate Assoc Req Frame for Network Specific Conditions
597 fgReplyAssocResp = p2pFuncValidateAssocReq(
600 (PUINT_16)&u2StatusCode);
603 fgReplyAssocResp = TRUE;
610 #endif /* CFG_ENABLE_WIFI_DIRECT */
612 //4 <3> Check BOW network conditions
613 #if CFG_ENABLE_BT_OVER_WIFI
614 if (IS_STA_IN_BOW(prStaRec)) {
616 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
618 if ((prBssInfo->fgIsNetActive) &&
619 (OP_MODE_BOW == prBssInfo->eCurrentOPMode)){
621 //4 <3.1> Validate Auth Frame by Auth Algorithm/Transation Seq
622 /* Check if for this BSSID */
623 if (WLAN_STATUS_SUCCESS ==
624 assocProcessRxAssocReqFrame(prAdapter,
628 if (STATUS_CODE_SUCCESSFUL == u2StatusCode) {
630 //4 <3.2> Validate Auth Frame for Network Specific Conditions
631 fgReplyAssocResp = bowValidateAssocReq(prAdapter, prSwRfb, &u2StatusCode);
636 fgReplyAssocResp = TRUE;
639 /* TODO(Kevin): Allocate a STA_RECORD_T for new client */
644 #endif /* CFG_ENABLE_BT_OVER_WIFI */
646 return WLAN_STATUS_SUCCESS; // To release the SW_RFB_T
650 //4 <4> Update STA_RECORD_T and reply Assoc Resp Frame
651 if (fgReplyAssocResp) {
655 if ((((P_WLAN_ASSOC_REQ_FRAME_T)(prSwRfb->pvHeader))->u2FrameCtrl & MASK_FRAME_TYPE) ==
656 MAC_FRAME_REASSOC_REQ) {
658 u2IELength = prSwRfb->u2PacketLen -
659 (UINT_16)OFFSET_OF(WLAN_REASSOC_REQ_FRAME_T, aucInfoElem[0]);
661 pucIE = ((P_WLAN_REASSOC_REQ_FRAME_T)(prSwRfb->pvHeader))->aucInfoElem;
664 u2IELength = prSwRfb->u2PacketLen -
665 (UINT_16)OFFSET_OF(WLAN_ASSOC_REQ_FRAME_T, aucInfoElem[0]);
667 pucIE = ((P_WLAN_ASSOC_REQ_FRAME_T)(prSwRfb->pvHeader))->aucInfoElem;
670 rlmProcessAssocReq(prAdapter, prSwRfb, pucIE, u2IELength);
672 //4 <4.1> Assign Association ID
673 if (u2StatusCode == STATUS_CODE_SUCCESSFUL) {
675 #if CFG_ENABLE_WIFI_DIRECT
676 if ((prAdapter->fgIsP2PRegistered) && (IS_STA_IN_P2P(prStaRec))) {
677 if (p2pRunEventAAAComplete(prAdapter, prStaRec) == WLAN_STATUS_SUCCESS) {
678 prStaRec->u2AssocId = bssAssignAssocID(prStaRec);
679 //prStaRec->eAuthAssocState = AA_STATE_IDLE;
680 prStaRec->eAuthAssocState = AAA_STATE_SEND_ASSOC2; // NOTE(Kevin): for TX done
682 /* NOTE(Kevin): Method A: Change to STATE_3 before handle TX Done */
683 //cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
686 /* Client List FULL. */
687 u2StatusCode = STATUS_CODE_REQ_DECLINED;
689 prStaRec->u2AssocId = 0; /* Invalid Assocation ID */
691 /* If (Re)association fail, the peer can try Assocation w/o Auth immediately */
692 prStaRec->eAuthAssocState = AAA_STATE_SEND_AUTH2;
694 /* NOTE(Kevin): Better to change state here, not at TX Done */
695 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
700 #if CFG_ENABLE_BT_OVER_WIFI
701 if ((IS_STA_IN_BOW(prStaRec))) {
703 // if (bowRunEventAAAComplete(prAdapter, prStaRec) == WLAN_STATUS_SUCCESS) {
704 prStaRec->u2AssocId = bssAssignAssocID(prStaRec);
705 prStaRec->eAuthAssocState = AAA_STATE_SEND_ASSOC2; // NOTE(Kevin): for TX done
707 /* NOTE(Kevin): Method A: Change to STATE_3 before handle TX Done */
708 //cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
712 /* Client List FULL. */
713 u2StatusCode = STATUS_CODE_REQ_DECLINED;
715 prStaRec->u2AssocId = 0; /* Invalid Assocation ID */
717 /* If (Re)association fail, the peer can try Assocation w/o Auth immediately */
718 prStaRec->eAuthAssocState = AAA_STATE_SEND_AUTH2;
720 /* NOTE(Kevin): Better to change state here, not at TX Done */
721 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
728 prStaRec->u2AssocId = 0; /* Invalid Assocation ID */
730 /* If (Re)association fail, the peer can try Assocation w/o Auth immediately */
731 prStaRec->eAuthAssocState = AAA_STATE_SEND_AUTH2;
733 /* NOTE(Kevin): Better to change state here, not at TX Done */
734 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
737 /* Update the record join time. */
738 GET_CURRENT_SYSTIME(&prStaRec->rUpdateTime);
740 /* Update Station Record - Status/Reason Code */
741 prStaRec->u2StatusCode = u2StatusCode;
743 /* NOTE: Ignore the return status for AAA */
744 //4 <4.2> Reply Assoc Resp
745 assocSendReAssocRespFrame(prAdapter, prStaRec);
749 return WLAN_STATUS_SUCCESS;
751 } /* end of aaaFsmRunEventRxAssoc() */
754 /*----------------------------------------------------------------------------*/
756 * @brief This function will handle TxDone(Auth2/AssocReq) Event of AAA FSM.
758 * @param[in] prAdapter Pointer to the Adapter structure.
759 * @param[in] prMsduInfo Pointer to the MSDU_INFO_T.
760 * @param[in] rTxDoneStatus Return TX status of the Auth1/Auth3/AssocReq frame.
762 * @retval WLAN_STATUS_SUCCESS
764 /*----------------------------------------------------------------------------*/
766 aaaFsmRunEventTxDone (
767 IN P_ADAPTER_T prAdapter,
768 IN P_MSDU_INFO_T prMsduInfo,
769 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
772 P_STA_RECORD_T prStaRec;
773 P_BSS_INFO_T prBssInfo;
779 DBGLOG(AAA, LOUD, ("EVENT-TX DONE: Current Time = %ld\n", kalGetTimeTick()));
781 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
783 if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
784 return WLAN_STATUS_SUCCESS; /* For the case of replying ERROR STATUS CODE */
787 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
789 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
791 switch (prStaRec->eAuthAssocState) {
792 case AAA_STATE_SEND_AUTH2:
794 /* Strictly check the outgoing frame is matched with current AA STATE */
795 if (authCheckTxAuthFrame(prAdapter,
797 AUTH_TRANSACTION_SEQ_2) != WLAN_STATUS_SUCCESS) {
801 if (STATUS_CODE_SUCCESSFUL == prStaRec->u2StatusCode) {
802 if (TX_RESULT_SUCCESS == rTxDoneStatus) {
804 /* NOTE(Kevin): Change to STATE_2 at TX Done */
805 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
809 prStaRec->eAuthAssocState = AA_STATE_IDLE;
811 /* NOTE(Kevin): Change to STATE_1 */
812 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
814 #if CFG_ENABLE_WIFI_DIRECT
815 if ((prAdapter->fgIsP2PRegistered) &&
816 (IS_STA_IN_P2P(prStaRec))) {
817 p2pRunEventAAATxFail(prAdapter, prStaRec);
819 #endif /* CFG_ENABLE_WIFI_DIRECT */
821 #if CFG_ENABLE_BT_OVER_WIFI
822 if (IS_STA_IN_BOW(prStaRec)) {
823 bowRunEventAAATxFail(prAdapter, prStaRec);
825 #endif /* CFG_ENABLE_BT_OVER_WIFI */
829 /* NOTE(Kevin): Ignore the TX Done Event of Auth Frame with Error Status Code */
834 case AAA_STATE_SEND_ASSOC2:
836 /* Strictly check the outgoing frame is matched with current SAA STATE */
837 if (assocCheckTxReAssocRespFrame(prAdapter, prMsduInfo) != WLAN_STATUS_SUCCESS) {
841 if (STATUS_CODE_SUCCESSFUL == prStaRec->u2StatusCode) {
842 if (TX_RESULT_SUCCESS == rTxDoneStatus) {
844 prStaRec->eAuthAssocState = AA_STATE_IDLE;
846 /* NOTE(Kevin): Change to STATE_3 at TX Done */
847 #if CFG_ENABLE_WIFI_DIRECT
848 if ((prAdapter->fgIsP2PRegistered) &&
849 (IS_STA_IN_P2P(prStaRec))) {
850 p2pRunEventAAASuccess(prAdapter, prStaRec);
852 #endif /* CFG_ENABLE_WIFI_DIRECT */
854 #if CFG_ENABLE_BT_OVER_WIFI
856 if (IS_STA_IN_BOW(prStaRec))
858 bowRunEventAAAComplete(prAdapter, prStaRec);
860 #endif /* CFG_ENABLE_BT_OVER_WIFI */
865 prStaRec->eAuthAssocState = AAA_STATE_SEND_AUTH2;
867 /* NOTE(Kevin): Change to STATE_2 */
868 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
870 #if CFG_ENABLE_WIFI_DIRECT
871 if ((prAdapter->fgIsP2PRegistered) &&
872 (IS_STA_IN_P2P(prStaRec))) {
873 p2pRunEventAAATxFail(prAdapter, prStaRec);
875 #endif /* CFG_ENABLE_WIFI_DIRECT */
877 #if CFG_ENABLE_BT_OVER_WIFI
878 if (IS_STA_IN_BOW(prStaRec)) {
879 bowRunEventAAATxFail(prAdapter, prStaRec);
881 #endif /* CFG_ENABLE_BT_OVER_WIFI */
885 /* NOTE(Kevin): Ignore the TX Done Event of Auth Frame with Error Status Code */
890 break; /* Ignore other cases */
894 return WLAN_STATUS_SUCCESS;
896 } /* end of aaaFsmRunEventTxDone() */
897 #endif /* CFG_SUPPORT_AAA */
900 #if 0 /* TODO(Kevin): for abort event, just reset the STA_RECORD_T. */
901 /*----------------------------------------------------------------------------*/
903 * \brief This function will send ABORT Event to JOIN FSM.
905 * \param[in] prAdapter Pointer to the Adapter structure.
909 /*----------------------------------------------------------------------------*/
911 saaFsmRunEventAbort (
912 IN P_MSG_HDR_T prMsgHdr
915 P_JOIN_INFO_T prJoinInfo;
916 P_STA_RECORD_T prStaRec;
918 DEBUGFUNC("joinFsmRunEventAbort");
922 prJoinInfo = &prAdapter->rJoinInfo;
924 DBGLOG(JOIN, EVENT, ("JOIN EVENT: ABORT\n"));
927 /* NOTE(Kevin): when reach here, the ARB_STATE should be in ARB_STATE_JOIN. */
928 ASSERT(prJoinInfo->prBssDesc);
930 //4 <1> Update Flags and Elements of JOIN Module.
931 /* Reset Send Auth/(Re)Assoc Frame Count */
932 prJoinInfo->ucTxAuthAssocRetryCount = 0;
934 /* Cancel all JOIN relative Timer */
935 ARB_CANCEL_TIMER(prAdapter,
936 prJoinInfo->rTxRequestTimer);
938 ARB_CANCEL_TIMER(prAdapter,
939 prJoinInfo->rRxResponseTimer);
941 ARB_CANCEL_TIMER(prAdapter,
942 prJoinInfo->rJoinTimer);
944 //4 <2> Update the associated STA_RECORD_T during JOIN.
945 /* Get a Station Record if possible, TA == BSSID for AP */
946 prStaRec = staRecGetStaRecordByAddr(prAdapter,
947 prJoinInfo->prBssDesc->aucBSSID);
950 /* Update Station Record - Class 1 Flag */
951 prStaRec->ucStaState = STA_STATE_1;
955 ASSERT(0); /* Shouldn't happened, because we already add this STA_RECORD_T at JOIN_STATE_INIT */
959 //4 <3> Pull back to IDLE.
960 joinFsmSteps(prAdapter, JOIN_STATE_IDLE);
962 //4 <4> If we are in Roaming, recover the settings of previous BSS.
964 * Restore original setting from current BSS_INFO_T.
966 if (prAdapter->eConnectionState == MEDIA_STATE_CONNECTED) {
967 joinAdoptParametersFromCurrentBss(prAdapter);
971 } /* end of joinFsmRunEventAbort() */
975 /* TODO(Kevin): following code will be modified and move to AIS FSM */
977 /*----------------------------------------------------------------------------*/
979 * \brief This function will send Join Timeout Event to JOIN FSM.
981 * \param[in] prAdapter Pointer to the Adapter structure.
983 * \retval WLAN_STATUS_FAILURE Fail because of Join Timeout
985 /*----------------------------------------------------------------------------*/
987 joinFsmRunEventJoinTimeOut (
988 IN P_ADAPTER_T prAdapter
991 P_JOIN_INFO_T prJoinInfo;
992 P_STA_RECORD_T prStaRec;
994 DEBUGFUNC("joinFsmRunEventJoinTimeOut");
998 prJoinInfo = &prAdapter->rJoinInfo;
1000 DBGLOG(JOIN, EVENT, ("JOIN EVENT: JOIN TIMEOUT\n"));
1002 /* Get a Station Record if possible, TA == BSSID for AP */
1003 prStaRec = staRecGetStaRecordByAddr(prAdapter,
1004 prJoinInfo->prBssDesc->aucBSSID);
1006 /* We have renew this Sta Record when in JOIN_STATE_INIT */
1009 /* Record the Status Code of Authentication Request */
1010 prStaRec->u2StatusCode = STATUS_CODE_JOIN_TIMEOUT;
1012 /* Increase Failure Count */
1013 prStaRec->ucJoinFailureCount++;
1015 /* Reset Send Auth/(Re)Assoc Frame Count */
1016 prJoinInfo->ucTxAuthAssocRetryCount = 0;
1018 /* Cancel other JOIN relative Timer */
1019 ARB_CANCEL_TIMER(prAdapter,
1020 prJoinInfo->rTxRequestTimer);
1022 ARB_CANCEL_TIMER(prAdapter,
1023 prJoinInfo->rRxResponseTimer);
1025 /* Restore original setting from current BSS_INFO_T */
1026 if (prAdapter->eConnectionState == MEDIA_STATE_CONNECTED) {
1027 joinAdoptParametersFromCurrentBss(prAdapter);
1030 /* Pull back to IDLE */
1031 joinFsmSteps(prAdapter, JOIN_STATE_IDLE);
1033 return WLAN_STATUS_FAILURE;
1035 } /* end of joinFsmRunEventJoinTimeOut() */
1037 /*----------------------------------------------------------------------------*/
1039 * \brief This function will adopt the parameters from Peer BSS.
1041 * \param[in] prAdapter Pointer to the Adapter structure.
1045 /*----------------------------------------------------------------------------*/
1047 joinAdoptParametersFromPeerBss (
1048 IN P_ADAPTER_T prAdapter
1051 P_JOIN_INFO_T prJoinInfo;
1052 P_BSS_DESC_T prBssDesc;
1054 DEBUGFUNC("joinAdoptParametersFromPeerBss");
1058 prJoinInfo = &prAdapter->rJoinInfo;
1059 prBssDesc = prJoinInfo->prBssDesc;
1061 //4 <1> Adopt Peer BSS' PHY TYPE
1062 prAdapter->eCurrentPhyType = prBssDesc->ePhyType;
1064 DBGLOG(JOIN, INFO, ("Target BSS[%s]'s PhyType = %s\n",
1065 prBssDesc->aucSSID, (prBssDesc->ePhyType == PHY_TYPE_ERP_INDEX) ? "ERP" : "HR_DSSS"));
1068 //4 <2> Adopt Peer BSS' Frequency(Band/Channel)
1069 DBGLOG(JOIN, INFO, ("Target BSS's Channel = %d, Band = %d\n",
1070 prBssDesc->ucChannelNum, prBssDesc->eBand));
1072 nicSwitchChannel(prAdapter,
1074 prBssDesc->ucChannelNum,
1077 prJoinInfo->fgIsParameterAdopted = TRUE;
1080 } /* end of joinAdoptParametersFromPeerBss() */
1083 /*----------------------------------------------------------------------------*/
1085 * \brief This function will adopt the parameters from current associated BSS.
1087 * \param[in] prAdapter Pointer to the Adapter structure.
1091 /*----------------------------------------------------------------------------*/
1093 joinAdoptParametersFromCurrentBss (
1094 IN P_ADAPTER_T prAdapter
1097 //P_JOIN_INFO_T prJoinInfo = &prAdapter->rJoinInfo;
1098 P_BSS_INFO_T prBssInfo;
1102 prBssInfo = &prAdapter->rBssInfo;
1104 //4 <1> Adopt current BSS' PHY TYPE
1105 prAdapter->eCurrentPhyType = prBssInfo->ePhyType;
1107 //4 <2> Adopt current BSS' Frequency(Band/Channel)
1108 DBGLOG(JOIN, INFO, ("Current BSS's Channel = %d, Band = %d\n",
1109 prBssInfo->ucChnl, prBssInfo->eBand));
1111 nicSwitchChannel(prAdapter,
1116 } /* end of joinAdoptParametersFromCurrentBss() */
1119 /*----------------------------------------------------------------------------*/
1121 * \brief This function will update all the SW variables and HW MCR registers after
1122 * the association with target BSS.
1124 * \param[in] prAdapter Pointer to the Adapter structure.
1128 /*----------------------------------------------------------------------------*/
1131 IN P_ADAPTER_T prAdapter
1134 P_JOIN_INFO_T prJoinInfo;
1135 P_BSS_DESC_T prBssDesc;
1136 P_PEER_BSS_INFO_T prPeerBssInfo;
1137 P_BSS_INFO_T prBssInfo;
1138 P_CONNECTION_SETTINGS_T prConnSettings;
1139 P_STA_RECORD_T prStaRec;
1140 P_TX_CTRL_T prTxCtrl;
1141 #if CFG_SUPPORT_802_11D
1142 P_IE_COUNTRY_T prIECountry;
1145 DEBUGFUNC("joinComplete");
1149 prJoinInfo = &prAdapter->rJoinInfo;
1150 prBssDesc = prJoinInfo->prBssDesc;
1151 prPeerBssInfo = &prAdapter->rPeerBssInfo;
1152 prBssInfo = &prAdapter->rBssInfo;
1153 prConnSettings = &prAdapter->rConnSettings;
1154 prTxCtrl = &prAdapter->rTxCtrl;
1156 //4 <1> Update Connecting & Connected Flag of BSS_DESC_T.
1157 /* Remove previous AP's Connection Flags if have */
1158 scanRemoveConnectionFlagOfBssDescByBssid(prAdapter, prBssInfo->aucBSSID);
1160 prBssDesc->fgIsConnected = TRUE; /* Mask as Connected */
1162 if (prBssDesc->fgIsHiddenSSID) {
1163 /* NOTE(Kevin): This is for the case of Passive Scan and the target BSS didn't
1164 * broadcast SSID on its Beacon Frame.
1166 COPY_SSID(prBssDesc->aucSSID,
1167 prBssDesc->ucSSIDLen,
1168 prAdapter->rConnSettings.aucSSID,
1169 prAdapter->rConnSettings.ucSSIDLen);
1171 if (prBssDesc->ucSSIDLen) {
1172 prBssDesc->fgIsHiddenSSID = FALSE;
1180 DBGLOG(JOIN, INFO, ("Hidden SSID! - Update SSID : %s\n", prBssDesc->aucSSID));
1184 //4 <2> Update BSS_INFO_T from BSS_DESC_T
1186 prBssInfo->ePhyType = prBssDesc->ePhyType;
1189 prBssInfo->eBSSType = BSS_TYPE_INFRASTRUCTURE;
1192 COPY_MAC_ADDR(prBssInfo->aucBSSID, prBssDesc->aucBSSID);
1194 DBGLOG(JOIN, INFO, ("JOIN to BSSID: ["MACSTR"]\n", MAC2STR(prBssDesc->aucBSSID)));
1198 COPY_SSID(prBssInfo->aucSSID,
1199 prBssInfo->ucSSIDLen,
1201 prBssDesc->ucSSIDLen);
1203 //4 <2.E> Channel / Band information.
1204 prBssInfo->eBand = prBssDesc->eBand;
1205 prBssInfo->ucChnl = prBssDesc->ucChannelNum;
1207 //4 <2.F> RSN/WPA information.
1208 secFsmRunEventStart(prAdapter);
1209 prBssInfo->u4RsnSelectedPairwiseCipher = prBssDesc->u4RsnSelectedPairwiseCipher;
1210 prBssInfo->u4RsnSelectedGroupCipher = prBssDesc->u4RsnSelectedGroupCipher;
1211 prBssInfo->u4RsnSelectedAKMSuite = prBssDesc->u4RsnSelectedAKMSuite;
1213 if (secRsnKeyHandshakeEnabled()) {
1214 prBssInfo->fgIsWPAorWPA2Enabled = TRUE;
1217 prBssInfo->fgIsWPAorWPA2Enabled = FALSE;
1220 //4 <2.G> Beacon interval.
1221 prBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
1223 //4 <2.H> DTIM period.
1224 prBssInfo->ucDtimPeriod = prBssDesc->ucDTIMPeriod;
1226 //4 <2.I> ERP Information
1227 if ((prBssInfo->ePhyType == PHY_TYPE_ERP_INDEX) && // Our BSS's PHY_TYPE is ERP now.
1228 (prBssDesc->fgIsERPPresent)) {
1230 prBssInfo->fgIsERPPresent = TRUE;
1231 prBssInfo->ucERP = prBssDesc->ucERP; /* Save the ERP for later check */
1233 else { /* Some AP, may send ProbeResp without ERP IE. Thus prBssDesc->fgIsERPPresent is FALSE. */
1234 prBssInfo->fgIsERPPresent = FALSE;
1235 prBssInfo->ucERP = 0;
1238 #if CFG_SUPPORT_802_11D
1239 //4 <2.J> Country inforamtion of the associated AP
1240 if (prConnSettings->fgMultiDomainCapabilityEnabled) {
1241 DOMAIN_INFO_ENTRY rDomainInfo;
1242 if (domainGetDomainInfoByScanResult(prAdapter, &rDomainInfo)) {
1243 if (prBssDesc->prIECountry) {
1244 prIECountry = prBssDesc->prIECountry;
1246 domainParseCountryInfoElem(prIECountry, &prBssInfo->rDomainInfo);
1248 /* use the domain get from the BSS info */
1249 prBssInfo->fgIsCountryInfoPresent = TRUE;
1250 nicSetupOpChnlList(prAdapter, prBssInfo->rDomainInfo.u2CountryCode, FALSE);
1252 /* use the domain get from the scan result */
1253 prBssInfo->fgIsCountryInfoPresent = TRUE;
1254 nicSetupOpChnlList(prAdapter, rDomainInfo.u2CountryCode, FALSE);
1260 //4 <2.K> Signal Power of the associated AP
1261 prBssInfo->rRcpi = prBssDesc->rRcpi;
1262 prBssInfo->rRssi = RCPI_TO_dBm(prBssInfo->rRcpi);
1263 GET_CURRENT_SYSTIME(&prBssInfo->rRssiLastUpdateTime);
1265 //4 <2.L> Capability Field of the associated AP
1266 prBssInfo->u2CapInfo = prBssDesc->u2CapInfo;
1268 DBGLOG(JOIN, INFO, ("prBssInfo-> fgIsERPPresent = %d, ucERP = %02x, rRcpi = %d, rRssi = %ld\n",
1269 prBssInfo->fgIsERPPresent, prBssInfo->ucERP, prBssInfo->rRcpi, prBssInfo->rRssi));
1272 //4 <3> Update BSS_INFO_T from PEER_BSS_INFO_T & NIC RATE FUNC
1273 //4 <3.A> Association ID
1274 prBssInfo->u2AssocId = prPeerBssInfo->u2AssocId;
1276 //4 <3.B> WMM Infomation
1277 if (prAdapter->fgIsEnableWMM &&
1278 (prPeerBssInfo->rWmmInfo.ucWmmFlag & WMM_FLAG_SUPPORT_WMM)) {
1280 prBssInfo->fgIsWmmAssoc = TRUE;
1281 prTxCtrl->rTxQForVoipAccess = TXQ_AC3;
1283 qosWmmInfoInit(&prBssInfo->rWmmInfo, (prBssInfo->ePhyType == PHY_TYPE_HR_DSSS_INDEX) ? TRUE : FALSE);
1285 if (prPeerBssInfo->rWmmInfo.ucWmmFlag & WMM_FLAG_AC_PARAM_PRESENT) {
1286 kalMemCopy(&prBssInfo->rWmmInfo,
1287 &prPeerBssInfo->rWmmInfo,
1288 sizeof(WMM_INFO_T));
1291 kalMemCopy(&prBssInfo->rWmmInfo,
1292 &prPeerBssInfo->rWmmInfo,
1293 sizeof(WMM_INFO_T) - sizeof(prPeerBssInfo->rWmmInfo.arWmmAcParams));
1297 prBssInfo->fgIsWmmAssoc = FALSE;
1298 prTxCtrl->rTxQForVoipAccess = TXQ_AC1;
1300 kalMemZero(&prBssInfo->rWmmInfo, sizeof(WMM_INFO_T));
1304 //4 <3.C> Operational Rate Set & BSS Basic Rate Set
1305 prBssInfo->u2OperationalRateSet = prPeerBssInfo->u2OperationalRateSet;
1306 prBssInfo->u2BSSBasicRateSet = prPeerBssInfo->u2BSSBasicRateSet;
1309 //4 <3.D> Short Preamble
1310 if (prBssInfo->fgIsERPPresent) {
1312 /* NOTE(Kevin 2007/12/24): Truth Table.
1313 * Short Preamble Bit in
1314 * <AssocReq> <AssocResp w/i ERP> <BARKER(Long)> Final Driver Setting(Short)
1315 * TRUE FALSE FALSE FALSE(shouldn't have such case, use the AssocResp)
1316 * TRUE FALSE TRUE FALSE
1317 * FALSE FALSE FALSE FALSE(shouldn't have such case, use the AssocResp)
1318 * FALSE FALSE TRUE FALSE
1319 * TRUE TRUE FALSE TRUE(follow ERP)
1320 * TRUE TRUE TRUE FALSE(follow ERP)
1321 * FALSE TRUE FALSE FALSE(shouldn't have such case, and we should set to FALSE)
1322 * FALSE TRUE TRUE FALSE(we should set to FALSE)
1324 if ((prPeerBssInfo->fgIsShortPreambleAllowed) &&
1325 ((prConnSettings->ePreambleType == PREAMBLE_TYPE_SHORT) || /* Short Preamble Option Enable is TRUE */
1326 ((prConnSettings->ePreambleType == PREAMBLE_TYPE_AUTO) &&
1327 (prBssDesc->u2CapInfo & CAP_INFO_SHORT_PREAMBLE)))) {
1329 prBssInfo->fgIsShortPreambleAllowed = TRUE;
1331 if (prBssInfo->ucERP & ERP_INFO_BARKER_PREAMBLE_MODE) {
1332 prBssInfo->fgUseShortPreamble = FALSE;
1335 prBssInfo->fgUseShortPreamble = TRUE;
1339 prBssInfo->fgIsShortPreambleAllowed = FALSE;
1340 prBssInfo->fgUseShortPreamble = FALSE;
1344 /* NOTE(Kevin 2007/12/24): Truth Table.
1345 * Short Preamble Bit in
1346 * <AssocReq> <AssocResp w/o ERP> Final Driver Setting(Short)
1350 * FALSE TRUE(status success) TRUE
1351 * --> Honor the result of prPeerBssInfo.
1354 prBssInfo->fgIsShortPreambleAllowed = prBssInfo->fgUseShortPreamble =
1355 prPeerBssInfo->fgIsShortPreambleAllowed;
1358 DBGLOG(JOIN, INFO, ("prBssInfo->fgIsShortPreambleAllowed = %d, prBssInfo->fgUseShortPreamble = %d\n",
1359 prBssInfo->fgIsShortPreambleAllowed, prBssInfo->fgUseShortPreamble));
1362 //4 <3.E> Short Slot Time
1363 prBssInfo->fgUseShortSlotTime =
1364 prPeerBssInfo->fgUseShortSlotTime; /* AP support Short Slot Time */
1366 DBGLOG(JOIN, INFO, ("prBssInfo->fgUseShortSlotTime = %d\n",
1367 prBssInfo->fgUseShortSlotTime));
1369 nicSetSlotTime(prAdapter,
1370 prBssInfo->ePhyType,
1371 ((prConnSettings->fgIsShortSlotTimeOptionEnable &&
1372 prBssInfo->fgUseShortSlotTime) ? TRUE : FALSE));
1375 //4 <3.F> Update Tx Rate for Control Frame
1376 bssUpdateTxRateForControlFrame(prAdapter);
1379 //4 <3.G> Save the available Auth Types during Roaming (Design for Fast BSS Transition).
1380 //if (prAdapter->fgIsEnableRoaming) /* NOTE(Kevin): Always prepare info for roaming */
1383 if (prJoinInfo->ucCurrAuthAlgNum == AUTH_ALGORITHM_NUM_OPEN_SYSTEM) {
1384 prJoinInfo->ucRoamingAuthTypes |= AUTH_TYPE_OPEN_SYSTEM;
1386 else if (prJoinInfo->ucCurrAuthAlgNum == AUTH_ALGORITHM_NUM_SHARED_KEY) {
1387 prJoinInfo->ucRoamingAuthTypes |= AUTH_TYPE_SHARED_KEY;
1390 prBssInfo->ucRoamingAuthTypes = prJoinInfo->ucRoamingAuthTypes;
1393 /* Set the stable time of the associated BSS. We won't do roaming decision
1394 * during the stable time.
1396 SET_EXPIRATION_TIME(prBssInfo->rRoamingStableExpirationTime,
1397 SEC_TO_SYSTIME(ROAMING_STABLE_TIMEOUT_SEC));
1401 //4 <3.H> Update Parameter for TX Fragmentation Threshold
1403 txFragInfoUpdate(prAdapter);
1404 #endif /* CFG_TX_FRAGMENT */
1407 //4 <4> Update STA_RECORD_T
1408 /* Get a Station Record if possible */
1409 prStaRec = staRecGetStaRecordByAddr(prAdapter,
1410 prBssDesc->aucBSSID);
1413 UINT_16 u2OperationalRateSet, u2DesiredRateSet;
1415 //4 <4.A> Desired Rate Set
1416 u2OperationalRateSet = (rPhyAttributes[prBssInfo->ePhyType].u2SupportedRateSet &
1417 prBssInfo->u2OperationalRateSet);
1419 u2DesiredRateSet = (u2OperationalRateSet & prConnSettings->u2DesiredRateSet);
1420 if (u2DesiredRateSet) {
1421 prStaRec->u2DesiredRateSet = u2DesiredRateSet;
1424 /* For Error Handling - The Desired Rate Set is not covered in Operational Rate Set. */
1425 prStaRec->u2DesiredRateSet = u2OperationalRateSet;
1428 /* Try to set the best initial rate for this entry */
1429 if (!rateGetBestInitialRateIndex(prStaRec->u2DesiredRateSet,
1431 &prStaRec->ucCurrRate1Index)) {
1433 if (!rateGetLowestRateIndexFromRateSet(prStaRec->u2DesiredRateSet,
1434 &prStaRec->ucCurrRate1Index)) {
1439 DBGLOG(JOIN, INFO, ("prStaRec->ucCurrRate1Index = %d\n",
1440 prStaRec->ucCurrRate1Index));
1442 //4 <4.B> Preamble Mode
1443 prStaRec->fgIsShortPreambleOptionEnable =
1444 prBssInfo->fgUseShortPreamble;
1447 prStaRec->fgIsQoS = prBssInfo->fgIsWmmAssoc;
1457 //4 <5.A> Update BSSID & Operation Mode
1458 nicSetupBSS(prAdapter, prBssInfo);
1460 //4 <5.B> Update WLAN Table.
1461 if (nicSetHwBySta(prAdapter, prStaRec) == FALSE) {
1465 //4 <5.C> Update Desired Rate Set for BT.
1467 if (prConnSettings->fgIsEnableTxAutoFragmentForBT) {
1468 txRateSetInitForBT(prAdapter, prStaRec);
1470 #endif /* CFG_TX_FRAGMENT */
1472 //4 <5.D> TX AC Parameter and TX/RX Queue Control
1473 if (prBssInfo->fgIsWmmAssoc) {
1475 #if CFG_TX_AGGREGATE_HW_FIFO
1476 nicTxAggregateTXQ(prAdapter, FALSE);
1477 #endif /* CFG_TX_AGGREGATE_HW_FIFO */
1479 qosUpdateWMMParametersAndAssignAllowedACI(prAdapter, &prBssInfo->rWmmInfo);
1483 #if CFG_TX_AGGREGATE_HW_FIFO
1484 nicTxAggregateTXQ(prAdapter, TRUE);
1485 #endif /* CFG_TX_AGGREGATE_HW_FIFO */
1487 nicTxNonQoSAssignDefaultAdmittedTXQ(prAdapter);
1489 nicTxNonQoSUpdateTXQParameters(prAdapter,
1490 prBssInfo->ePhyType);
1493 #if CFG_TX_STOP_WRITE_TX_FIFO_UNTIL_JOIN
1495 prTxCtrl->fgBlockTxDuringJoin = FALSE;
1497 #if !CFG_TX_AGGREGATE_HW_FIFO /* TX FIFO AGGREGATE already do flush once */
1498 nicTxFlushStopQueues(prAdapter, (UINT_8)TXQ_DATA_MASK, (UINT_8)NULL);
1499 #endif /* CFG_TX_AGGREGATE_HW_FIFO */
1501 nicTxRetransmitOfSendWaitQue(prAdapter);
1503 if (prTxCtrl->fgIsPacketInOsSendQueue) {
1504 nicTxRetransmitOfOsSendQue(prAdapter);
1507 #if CFG_SDIO_TX_ENHANCE
1508 halTxLeftClusteredMpdu(prAdapter);
1509 #endif /* CFG_SDIO_TX_ENHANCE */
1512 #endif /* CFG_TX_STOP_WRITE_TX_FIFO_UNTIL_JOIN */
1515 //4 <6> Setup CONNECTION flag.
1516 prAdapter->eConnectionState = MEDIA_STATE_CONNECTED;
1517 prAdapter->eConnectionStateIndicated = MEDIA_STATE_CONNECTED;
1519 if (prJoinInfo->fgIsReAssoc) {
1520 prAdapter->fgBypassPortCtrlForRoaming = TRUE;
1523 prAdapter->fgBypassPortCtrlForRoaming = FALSE;
1526 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
1527 WLAN_STATUS_MEDIA_CONNECT,
1532 } /* end of joinComplete() */