2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_2/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 * 02 22 2012 yuche.tsai
57 * [ALPS00240483] [Wifi P2P]Run Sigma tool of A69. Always run fail on 5.1.2. No get correct connection from Realtek.
58 * Fix assoc response without P2P IE issue for Sigma test.
60 * 12 02 2011 yuche.tsai
62 * Resolve class 3 error issue under AP mode.
64 * data frame may TX before Assoc Response TX.
66 * 10 19 2011 yuche.tsai
67 * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
69 * Davinci Maintrunk Label: MT6620_WIFI_DRIVER_FW_TRUNK_MT6620E5_111019_0926.
73 * Add BoW 11n support.
76 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
77 * When RECONNECT request is identified as disconnected, it is necessary to check for pending scan request.
79 * 06 02 2011 eddie.chen
80 * [WCXRP00000759] [MT6620 Wi-Fi][DRV] Update RCPI in AAA
81 * Update RCPI when receiving Assoc request.
84 * [WCXRP00000674] [MT6620 Wi-Fi][Driver] Refine AAA authSendAuthFrame
85 * Add network type parameter to authSendAuthFrame.
87 * 04 15 2011 chinghwa.yu
88 * [WCXRP00000065] Update BoW design and settings
89 * Add BOW short range mode.
91 * 04 09 2011 chinghwa.yu
92 * [WCXRP00000065] Update BoW design and settings
93 * Change Link connection event procedure and change skb length check to 1512 bytes.
96 * [WCXRP00000577] [MT6620 Wi-Fi][Driver][FW] Create V2.0 branch for firmware and driver
97 * create V2.0 driver release based on label "MT6620_WIFI_DRIVER_V2_0_110318_1600" from main trunk
100 * [WCXRP00000530] [MT6620 Wi-Fi] [Driver] skip doing p2pRunEventAAAComplete after send assoc response Tx Done
101 * Skip to call p2pRunEventAAAComplete to avoid indicate STA connect twice.
103 * 03 04 2011 terry.wu
104 * [WCXRP00000515] [MT6620 Wi-Fi][Driver] Surpress compiler warning which is identified by GNU compiler collection
105 * Remove unused variable.
107 * 02 16 2011 yuche.tsai
108 * [WCXRP00000429] [Volunteer Patch][MT6620][Driver] Hot Spot Client Limit Issue
109 * Add more check after RX assoc frame under Hot-Spot mode.
111 * 02 09 2011 yuche.tsai
112 * [WCXRP00000429] [Volunteer Patch][MT6620][Driver] Hot Spot Client Limit Issue
113 * Fix Client Limit Issue.
115 * 01 25 2011 yuche.tsai
116 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
117 * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
119 * 01 15 2011 puff.wen
121 * [On behalf of Frog] Add CFG_ENABLE_WIFI_DIRECT to p2pRunEventAAAComplete
123 * 01 14 2011 yuche.tsai
124 * [WCXRP00000352] [Volunteer Patch][MT6620][Driver] P2P Statsion Record Client List Issue
125 * Modify AAA flow according to CM's comment.
127 * 09 03 2010 kevin.huang
129 * Refine #include sequence and solve recursive/nested #include issue
131 * 08 29 2010 yuche.tsai
133 * Fix Compile warning, type cast from UINT_32 to UINT_16.
135 * 08 26 2010 yuche.tsai
137 * In P2P AT GO test mode under WinXP, we would not indicate connected event to host.
139 * 08 24 2010 cm.chang
141 * Support RLM initail channel of Ad-hoc, P2P and BOW
143 * 08 23 2010 chinghwa.yu
147 * 08 20 2010 kevin.huang
149 * Modify AAA Module for changing STA STATE 3 at p2p/bowRunEventAAAComplete()
151 * 08 17 2010 yuche.tsai
153 * Fix bug while enabling P2P GO.
155 * 08 16 2010 kevin.huang
157 * Refine AAA functions
161 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
164 * [WPD00003833][MT6620 and MT5931] Driver migration
165 * refine TX-DONE callback.
167 * 06 21 2010 yuche.tsai
168 * [WPD00003839][MT6620 5931][P2P] Feature migration
169 * modify due to P2P functino call prototype change.
171 * 06 17 2010 yuche.tsai
172 * [WPD00003839][MT6620 5931][P2P] Feature migration
173 * First draft for migration P2P FSM from FW to Driver.
175 * 04 02 2010 kevin.huang
176 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
179 * 02 26 2010 kevin.huang
180 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
181 * add support of Driver STA_RECORD_T activation
183 * 02 04 2010 kevin.huang
184 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
185 * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
188 /*******************************************************************************
189 * C O M P I L E R F L A G S
190 ********************************************************************************
193 /*******************************************************************************
194 * E X T E R N A L R E F E R E N C E S
195 ********************************************************************************
199 /*******************************************************************************
201 ********************************************************************************
204 /*******************************************************************************
206 ********************************************************************************
209 /*******************************************************************************
210 * P U B L I C D A T A
211 ********************************************************************************
214 /*******************************************************************************
215 * P R I V A T E D A T A
216 ********************************************************************************
219 /*******************************************************************************
221 ********************************************************************************
224 /*******************************************************************************
225 * F U N C T I O N D E C L A R A T I O N S
226 ********************************************************************************
229 /*******************************************************************************
231 ********************************************************************************
234 /*----------------------------------------------------------------------------*/
236 * @brief This function will send Event to AIS/BOW/P2P
238 * @param[in] rJoinStatus To indicate JOIN success or failure.
239 * @param[in] prStaRec Pointer to the STA_RECORD_T
240 * @param[in] prSwRfb Pointer to the SW_RFB_T
244 /*----------------------------------------------------------------------------*/
246 aaaFsmSendEventJoinComplete (
247 WLAN_STATUS rJoinStatus,
248 P_STA_RECORD_T prStaRec,
252 P_MSG_SAA_JOIN_COMP_T prJoinCompMsg;
257 prJoinCompMsg = cnmMemAlloc(RAM_TYPE_TCM, sizeof(MSG_SAA_JOIN_COMP_T));
258 if (!prJoinCompMsg) {
259 return WLAN_STATUS_RESOURCES;
262 if (IS_STA_IN_AIS(prStaRec)) {
263 prJoinCompMsg->rMsgHdr.eMsgId = MID_SAA_AIS_JOIN_COMPLETE;
265 else if (IS_STA_IN_P2P(prStaRec)) {
266 prJoinCompMsg->rMsgHdr.eMsgId = MID_SAA_P2P_JOIN_COMPLETE;
268 else if (IS_STA_IN_BOW(prStaRec)) {
269 prJoinCompMsg->rMsgHdr.eMsgId = MID_SAA_BOW_JOIN_COMPLETE;
275 prJoinCompMsg->rJoinStatus = rJoinStatus;
276 prJoinCompMsg->prStaRec = prStaRec;
277 prJoinCompMsg->prSwRfb = prSwRfb;
279 mboxSendMsg(MBOX_ID_0,
280 (P_MSG_HDR_T)prJoinCompMsg,
281 MSG_SEND_METHOD_BUF);
283 return WLAN_STATUS_SUCCESS;
285 } /* end of saaFsmSendEventJoinComplete() */
287 /*----------------------------------------------------------------------------*/
289 * @brief This function will handle the Start Event to AAA FSM.
291 * @param[in] prMsgHdr Message of Join Request for a particular STA.
295 /*----------------------------------------------------------------------------*/
297 aaaFsmRunEventStart (
298 IN P_MSG_HDR_T prMsgHdr
301 P_MSG_SAA_JOIN_REQ_T prJoinReqMsg;
302 P_STA_RECORD_T prStaRec;
303 P_AIS_BSS_INFO_T prAisBssInfo;
308 prJoinReqMsg = (P_MSG_SAA_JOIN_REQ_T)prMsgHdr;
309 prStaRec = prJoinReqMsg->prStaRec;
313 DBGLOG(SAA, LOUD, ("EVENT-START: Trigger SAA FSM\n"));
315 cnmMemFree(prMsgHdr);
317 //4 <1> Validation of SAA Start Event
318 if (!IS_AP_STA(prStaRec->eStaType)) {
320 DBGLOG(SAA, ERROR, ("EVENT-START: STA Type - %d was not supported.\n", prStaRec->eStaType));
322 /* Ignore the return value because don't care the prSwRfb */
323 saaFsmSendEventJoinComplete(WLAN_STATUS_FAILURE, prStaRec, NULL);
328 //4 <2> The previous JOIN process is not completed ?
329 if (prStaRec->eAuthAssocState != AA_STATE_IDLE) {
330 DBGLOG(SAA, ERROR, ("EVENT-START: Reentry of SAA Module.\n"));
331 prStaRec->eAuthAssocState = AA_STATE_IDLE;
334 //4 <3> Reset Status Code and Time
335 /* Update Station Record - Status/Reason Code */
336 prStaRec->u2StatusCode = STATUS_CODE_SUCCESSFUL;
338 /* Update the record join time. */
339 GET_CURRENT_SYSTIME(&prStaRec->rLastJoinTime);
341 prStaRec->ucTxAuthAssocRetryCount = 0;
343 if (prStaRec->prChallengeText) {
344 cnmMemFree(prStaRec->prChallengeText);
345 prStaRec->prChallengeText = (P_IE_CHALLENGE_TEXT_T)NULL;
348 cnmTimerStopTimer(&prStaRec->rTxReqDoneOrRxRespTimer);
350 prStaRec->ucStaState = STA_STATE_1;
352 /* Trigger SAA MODULE */
353 saaFsmSteps(prStaRec, SAA_STATE_SEND_AUTH1, (P_SW_RFB_T)NULL);
356 } /* end of saaFsmRunEventStart() */
361 /*----------------------------------------------------------------------------*/
363 * @brief This function will process the Rx Auth Request Frame and then
366 * @param[in] prAdapter Pointer to the Adapter structure.
367 * @param[in] prSwRfb Pointer to the SW_RFB_T structure.
371 /*----------------------------------------------------------------------------*/
373 aaaFsmRunEventRxAuth (
374 IN P_ADAPTER_T prAdapter,
375 IN P_SW_RFB_T prSwRfb
378 P_BSS_INFO_T prBssInfo;
379 P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
380 UINT_16 u2StatusCode;
381 BOOLEAN fgReplyAuth = FALSE;
382 ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex;
390 //4 <1> Check P2P network conditions
391 #if CFG_ENABLE_WIFI_DIRECT
392 if(prAdapter->fgIsP2PRegistered){
393 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
395 if (prBssInfo->fgIsNetActive) {
397 //4 <1.1> Validate Auth Frame by Auth Algorithm/Transation Seq
398 if (WLAN_STATUS_SUCCESS ==
399 authProcessRxAuth1Frame(prAdapter,
402 AUTH_ALGORITHM_NUM_OPEN_SYSTEM,
403 AUTH_TRANSACTION_SEQ_1,
406 if (STATUS_CODE_SUCCESSFUL == u2StatusCode) {
408 if(prAdapter->rP2pFuncLkr.prP2pValidateAuth) {
409 //4 <1.2> Validate Auth Frame for Network Specific Conditions
411 prAdapter->rP2pFuncLkr.prP2pValidateAuth(
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 if(prAdapter->rP2pFuncLkr.prP2pValidateAssocReq) {
597 //4 <2.2> Validate Assoc Req Frame for Network Specific Conditions
598 fgReplyAssocResp = prAdapter->rP2pFuncLkr.prP2pValidateAssocReq(
601 (PUINT_16)&u2StatusCode);
608 fgReplyAssocResp = TRUE;
615 #endif /* CFG_ENABLE_WIFI_DIRECT */
617 //4 <3> Check BOW network conditions
618 #if CFG_ENABLE_BT_OVER_WIFI
619 if (IS_STA_IN_BOW(prStaRec)) {
621 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX]);
623 if ((prBssInfo->fgIsNetActive) &&
624 (OP_MODE_BOW == prBssInfo->eCurrentOPMode)){
626 //4 <3.1> Validate Auth Frame by Auth Algorithm/Transation Seq
627 /* Check if for this BSSID */
628 if (WLAN_STATUS_SUCCESS ==
629 assocProcessRxAssocReqFrame(prAdapter,
633 if (STATUS_CODE_SUCCESSFUL == u2StatusCode) {
635 //4 <3.2> Validate Auth Frame for Network Specific Conditions
636 fgReplyAssocResp = bowValidateAssocReq(prAdapter, prSwRfb, &u2StatusCode);
641 fgReplyAssocResp = TRUE;
644 /* TODO(Kevin): Allocate a STA_RECORD_T for new client */
649 #endif /* CFG_ENABLE_BT_OVER_WIFI */
651 return WLAN_STATUS_SUCCESS; // To release the SW_RFB_T
655 //4 <4> Update STA_RECORD_T and reply Assoc Resp Frame
656 if (fgReplyAssocResp) {
660 if ((((P_WLAN_ASSOC_REQ_FRAME_T)(prSwRfb->pvHeader))->u2FrameCtrl & MASK_FRAME_TYPE) ==
661 MAC_FRAME_REASSOC_RSP) {
663 u2IELength = prSwRfb->u2PacketLen -
664 (UINT_16)OFFSET_OF(WLAN_REASSOC_REQ_FRAME_T, aucInfoElem[0]);
666 pucIE = ((P_WLAN_REASSOC_REQ_FRAME_T)(prSwRfb->pvHeader))->aucInfoElem;
669 u2IELength = prSwRfb->u2PacketLen -
670 (UINT_16)OFFSET_OF(WLAN_ASSOC_REQ_FRAME_T, aucInfoElem[0]);
672 pucIE = ((P_WLAN_ASSOC_REQ_FRAME_T)(prSwRfb->pvHeader))->aucInfoElem;
675 rlmProcessAssocReq(prAdapter, prSwRfb, pucIE, u2IELength);
677 //4 <4.1> Assign Association ID
678 if (u2StatusCode == STATUS_CODE_SUCCESSFUL) {
680 #if CFG_ENABLE_WIFI_DIRECT
681 if ((prAdapter->fgIsP2PRegistered) && (IS_STA_IN_P2P(prStaRec))) {
682 ASSERT(prAdapter->rP2pFuncLkr.prP2pRunEventAAAComplete);
683 if (prAdapter->rP2pFuncLkr.prP2pRunEventAAAComplete(prAdapter, prStaRec) == WLAN_STATUS_SUCCESS) {
684 prStaRec->u2AssocId = bssAssignAssocID(prStaRec);
685 //prStaRec->eAuthAssocState = AA_STATE_IDLE;
686 prStaRec->eAuthAssocState = AAA_STATE_SEND_ASSOC2; // NOTE(Kevin): for TX done
688 /* NOTE(Kevin): Method A: Change to STATE_3 before handle TX Done */
689 //cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
692 /* Client List FULL. */
693 u2StatusCode = STATUS_CODE_REQ_DECLINED;
695 prStaRec->u2AssocId = 0; /* Invalid Assocation ID */
697 /* If (Re)association fail, the peer can try Assocation w/o Auth immediately */
698 prStaRec->eAuthAssocState = AAA_STATE_SEND_AUTH2;
700 /* NOTE(Kevin): Better to change state here, not at TX Done */
701 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
706 #if CFG_ENABLE_BT_OVER_WIFI
707 if ((IS_STA_IN_BOW(prStaRec))) {
709 // if (bowRunEventAAAComplete(prAdapter, prStaRec) == WLAN_STATUS_SUCCESS) {
710 prStaRec->u2AssocId = bssAssignAssocID(prStaRec);
711 prStaRec->eAuthAssocState = AAA_STATE_SEND_ASSOC2; // NOTE(Kevin): for TX done
713 /* NOTE(Kevin): Method A: Change to STATE_3 before handle TX Done */
714 //cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
718 /* Client List FULL. */
719 u2StatusCode = STATUS_CODE_REQ_DECLINED;
721 prStaRec->u2AssocId = 0; /* Invalid Assocation ID */
723 /* If (Re)association fail, the peer can try Assocation w/o Auth immediately */
724 prStaRec->eAuthAssocState = AAA_STATE_SEND_AUTH2;
726 /* NOTE(Kevin): Better to change state here, not at TX Done */
727 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
734 prStaRec->u2AssocId = 0; /* Invalid Assocation ID */
736 /* If (Re)association fail, the peer can try Assocation w/o Auth immediately */
737 prStaRec->eAuthAssocState = AAA_STATE_SEND_AUTH2;
739 /* NOTE(Kevin): Better to change state here, not at TX Done */
740 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
743 /* Update the record join time. */
744 GET_CURRENT_SYSTIME(&prStaRec->rUpdateTime);
746 /* Update Station Record - Status/Reason Code */
747 prStaRec->u2StatusCode = u2StatusCode;
749 /* NOTE: Ignore the return status for AAA */
750 //4 <4.2> Reply Assoc Resp
751 assocSendReAssocRespFrame(prAdapter, prStaRec);
755 return WLAN_STATUS_SUCCESS;
757 } /* end of aaaFsmRunEventRxAssoc() */
760 /*----------------------------------------------------------------------------*/
762 * @brief This function will handle TxDone(Auth2/AssocReq) Event of AAA FSM.
764 * @param[in] prAdapter Pointer to the Adapter structure.
765 * @param[in] prMsduInfo Pointer to the MSDU_INFO_T.
766 * @param[in] rTxDoneStatus Return TX status of the Auth1/Auth3/AssocReq frame.
768 * @retval WLAN_STATUS_SUCCESS
770 /*----------------------------------------------------------------------------*/
772 aaaFsmRunEventTxDone (
773 IN P_ADAPTER_T prAdapter,
774 IN P_MSDU_INFO_T prMsduInfo,
775 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
778 P_STA_RECORD_T prStaRec;
779 P_BSS_INFO_T prBssInfo;
785 DBGLOG(AAA, LOUD, ("EVENT-TX DONE: Current Time = %ld\n", kalGetTimeTick()));
787 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
789 if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
790 return WLAN_STATUS_SUCCESS; /* For the case of replying ERROR STATUS CODE */
793 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
795 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
797 switch (prStaRec->eAuthAssocState) {
798 case AAA_STATE_SEND_AUTH2:
800 /* Strictly check the outgoing frame is matched with current AA STATE */
801 if (authCheckTxAuthFrame(prAdapter,
803 AUTH_TRANSACTION_SEQ_2) != WLAN_STATUS_SUCCESS) {
807 if (STATUS_CODE_SUCCESSFUL == prStaRec->u2StatusCode) {
808 if (TX_RESULT_SUCCESS == rTxDoneStatus) {
810 /* NOTE(Kevin): Change to STATE_2 at TX Done */
811 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
815 prStaRec->eAuthAssocState = AA_STATE_IDLE;
817 /* NOTE(Kevin): Change to STATE_1 */
818 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
820 #if CFG_ENABLE_WIFI_DIRECT
821 if ((prAdapter->fgIsP2PRegistered) &&
822 (IS_STA_IN_P2P(prStaRec))) {
823 if(prAdapter->rP2pFuncLkr.prP2pRunEventAAATxFail) {
824 prAdapter->rP2pFuncLkr.prP2pRunEventAAATxFail(prAdapter, prStaRec);
829 #endif /* CFG_ENABLE_WIFI_DIRECT */
831 #if CFG_ENABLE_BT_OVER_WIFI
832 if (IS_STA_IN_BOW(prStaRec)) {
833 bowRunEventAAATxFail(prAdapter, prStaRec);
835 #endif /* CFG_ENABLE_BT_OVER_WIFI */
839 /* NOTE(Kevin): Ignore the TX Done Event of Auth Frame with Error Status Code */
844 case AAA_STATE_SEND_ASSOC2:
846 /* Strictly check the outgoing frame is matched with current SAA STATE */
847 if (assocCheckTxReAssocRespFrame(prAdapter, prMsduInfo) != WLAN_STATUS_SUCCESS) {
851 if (STATUS_CODE_SUCCESSFUL == prStaRec->u2StatusCode) {
852 if (TX_RESULT_SUCCESS == rTxDoneStatus) {
854 prStaRec->eAuthAssocState = AA_STATE_IDLE;
856 /* NOTE(Kevin): Change to STATE_3 at TX Done */
857 #if CFG_ENABLE_WIFI_DIRECT
858 if ((prAdapter->fgIsP2PRegistered) &&
859 (IS_STA_IN_P2P(prStaRec))) {
860 if(prAdapter->rP2pFuncLkr.prP2pRunEventAAASuccess) {
861 prAdapter->rP2pFuncLkr.prP2pRunEventAAASuccess(prAdapter, prStaRec);
866 #endif /* CFG_ENABLE_WIFI_DIRECT */
868 #if CFG_ENABLE_BT_OVER_WIFI
870 if (IS_STA_IN_BOW(prStaRec))
872 bowRunEventAAAComplete(prAdapter, prStaRec);
874 #endif /* CFG_ENABLE_BT_OVER_WIFI */
879 prStaRec->eAuthAssocState = AAA_STATE_SEND_AUTH2;
881 /* NOTE(Kevin): Change to STATE_2 */
882 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
884 #if CFG_ENABLE_WIFI_DIRECT
885 if ((prAdapter->fgIsP2PRegistered) &&
886 (IS_STA_IN_P2P(prStaRec))) {
887 if(prAdapter->rP2pFuncLkr.prP2pRunEventAAATxFail) {
888 prAdapter->rP2pFuncLkr.prP2pRunEventAAATxFail(prAdapter, prStaRec);
893 #endif /* CFG_ENABLE_WIFI_DIRECT */
895 #if CFG_ENABLE_BT_OVER_WIFI
896 if (IS_STA_IN_BOW(prStaRec)) {
897 bowRunEventAAATxFail(prAdapter, prStaRec);
899 #endif /* CFG_ENABLE_BT_OVER_WIFI */
903 /* NOTE(Kevin): Ignore the TX Done Event of Auth Frame with Error Status Code */
908 break; /* Ignore other cases */
912 return WLAN_STATUS_SUCCESS;
914 } /* end of aaaFsmRunEventTxDone() */
915 #endif /* CFG_SUPPORT_AAA */
918 #if 0 /* TODO(Kevin): for abort event, just reset the STA_RECORD_T. */
919 /*----------------------------------------------------------------------------*/
921 * \brief This function will send ABORT Event to JOIN FSM.
923 * \param[in] prAdapter Pointer to the Adapter structure.
927 /*----------------------------------------------------------------------------*/
929 saaFsmRunEventAbort (
930 IN P_MSG_HDR_T prMsgHdr
933 P_JOIN_INFO_T prJoinInfo;
934 P_STA_RECORD_T prStaRec;
936 DEBUGFUNC("joinFsmRunEventAbort");
940 prJoinInfo = &prAdapter->rJoinInfo;
942 DBGLOG(JOIN, EVENT, ("JOIN EVENT: ABORT\n"));
945 /* NOTE(Kevin): when reach here, the ARB_STATE should be in ARB_STATE_JOIN. */
946 ASSERT(prJoinInfo->prBssDesc);
948 //4 <1> Update Flags and Elements of JOIN Module.
949 /* Reset Send Auth/(Re)Assoc Frame Count */
950 prJoinInfo->ucTxAuthAssocRetryCount = 0;
952 /* Cancel all JOIN relative Timer */
953 ARB_CANCEL_TIMER(prAdapter,
954 prJoinInfo->rTxRequestTimer);
956 ARB_CANCEL_TIMER(prAdapter,
957 prJoinInfo->rRxResponseTimer);
959 ARB_CANCEL_TIMER(prAdapter,
960 prJoinInfo->rJoinTimer);
962 //4 <2> Update the associated STA_RECORD_T during JOIN.
963 /* Get a Station Record if possible, TA == BSSID for AP */
964 prStaRec = staRecGetStaRecordByAddr(prAdapter,
965 prJoinInfo->prBssDesc->aucBSSID);
968 /* Update Station Record - Class 1 Flag */
969 prStaRec->ucStaState = STA_STATE_1;
973 ASSERT(0); /* Shouldn't happened, because we already add this STA_RECORD_T at JOIN_STATE_INIT */
977 //4 <3> Pull back to IDLE.
978 joinFsmSteps(prAdapter, JOIN_STATE_IDLE);
980 //4 <4> If we are in Roaming, recover the settings of previous BSS.
982 * Restore original setting from current BSS_INFO_T.
984 if (prAdapter->eConnectionState == MEDIA_STATE_CONNECTED) {
985 joinAdoptParametersFromCurrentBss(prAdapter);
989 } /* end of joinFsmRunEventAbort() */
993 /* TODO(Kevin): following code will be modified and move to AIS FSM */
995 /*----------------------------------------------------------------------------*/
997 * \brief This function will send Join Timeout Event to JOIN FSM.
999 * \param[in] prAdapter Pointer to the Adapter structure.
1001 * \retval WLAN_STATUS_FAILURE Fail because of Join Timeout
1003 /*----------------------------------------------------------------------------*/
1005 joinFsmRunEventJoinTimeOut (
1006 IN P_ADAPTER_T prAdapter
1009 P_JOIN_INFO_T prJoinInfo;
1010 P_STA_RECORD_T prStaRec;
1012 DEBUGFUNC("joinFsmRunEventJoinTimeOut");
1016 prJoinInfo = &prAdapter->rJoinInfo;
1018 DBGLOG(JOIN, EVENT, ("JOIN EVENT: JOIN TIMEOUT\n"));
1020 /* Get a Station Record if possible, TA == BSSID for AP */
1021 prStaRec = staRecGetStaRecordByAddr(prAdapter,
1022 prJoinInfo->prBssDesc->aucBSSID);
1024 /* We have renew this Sta Record when in JOIN_STATE_INIT */
1027 /* Record the Status Code of Authentication Request */
1028 prStaRec->u2StatusCode = STATUS_CODE_JOIN_TIMEOUT;
1030 /* Increase Failure Count */
1031 prStaRec->ucJoinFailureCount++;
1033 /* Reset Send Auth/(Re)Assoc Frame Count */
1034 prJoinInfo->ucTxAuthAssocRetryCount = 0;
1036 /* Cancel other JOIN relative Timer */
1037 ARB_CANCEL_TIMER(prAdapter,
1038 prJoinInfo->rTxRequestTimer);
1040 ARB_CANCEL_TIMER(prAdapter,
1041 prJoinInfo->rRxResponseTimer);
1043 /* Restore original setting from current BSS_INFO_T */
1044 if (prAdapter->eConnectionState == MEDIA_STATE_CONNECTED) {
1045 joinAdoptParametersFromCurrentBss(prAdapter);
1048 /* Pull back to IDLE */
1049 joinFsmSteps(prAdapter, JOIN_STATE_IDLE);
1051 return WLAN_STATUS_FAILURE;
1053 } /* end of joinFsmRunEventJoinTimeOut() */
1055 /*----------------------------------------------------------------------------*/
1057 * \brief This function will adopt the parameters from Peer BSS.
1059 * \param[in] prAdapter Pointer to the Adapter structure.
1063 /*----------------------------------------------------------------------------*/
1065 joinAdoptParametersFromPeerBss (
1066 IN P_ADAPTER_T prAdapter
1069 P_JOIN_INFO_T prJoinInfo;
1070 P_BSS_DESC_T prBssDesc;
1072 DEBUGFUNC("joinAdoptParametersFromPeerBss");
1076 prJoinInfo = &prAdapter->rJoinInfo;
1077 prBssDesc = prJoinInfo->prBssDesc;
1079 //4 <1> Adopt Peer BSS' PHY TYPE
1080 prAdapter->eCurrentPhyType = prBssDesc->ePhyType;
1082 DBGLOG(JOIN, INFO, ("Target BSS[%s]'s PhyType = %s\n",
1083 prBssDesc->aucSSID, (prBssDesc->ePhyType == PHY_TYPE_ERP_INDEX) ? "ERP" : "HR_DSSS"));
1086 //4 <2> Adopt Peer BSS' Frequency(Band/Channel)
1087 DBGLOG(JOIN, INFO, ("Target BSS's Channel = %d, Band = %d\n",
1088 prBssDesc->ucChannelNum, prBssDesc->eBand));
1090 nicSwitchChannel(prAdapter,
1092 prBssDesc->ucChannelNum,
1095 prJoinInfo->fgIsParameterAdopted = TRUE;
1098 } /* end of joinAdoptParametersFromPeerBss() */
1101 /*----------------------------------------------------------------------------*/
1103 * \brief This function will adopt the parameters from current associated BSS.
1105 * \param[in] prAdapter Pointer to the Adapter structure.
1109 /*----------------------------------------------------------------------------*/
1111 joinAdoptParametersFromCurrentBss (
1112 IN P_ADAPTER_T prAdapter
1115 //P_JOIN_INFO_T prJoinInfo = &prAdapter->rJoinInfo;
1116 P_BSS_INFO_T prBssInfo;
1120 prBssInfo = &prAdapter->rBssInfo;
1122 //4 <1> Adopt current BSS' PHY TYPE
1123 prAdapter->eCurrentPhyType = prBssInfo->ePhyType;
1125 //4 <2> Adopt current BSS' Frequency(Band/Channel)
1126 DBGLOG(JOIN, INFO, ("Current BSS's Channel = %d, Band = %d\n",
1127 prBssInfo->ucChnl, prBssInfo->eBand));
1129 nicSwitchChannel(prAdapter,
1134 } /* end of joinAdoptParametersFromCurrentBss() */
1137 /*----------------------------------------------------------------------------*/
1139 * \brief This function will update all the SW variables and HW MCR registers after
1140 * the association with target BSS.
1142 * \param[in] prAdapter Pointer to the Adapter structure.
1146 /*----------------------------------------------------------------------------*/
1149 IN P_ADAPTER_T prAdapter
1152 P_JOIN_INFO_T prJoinInfo;
1153 P_BSS_DESC_T prBssDesc;
1154 P_PEER_BSS_INFO_T prPeerBssInfo;
1155 P_BSS_INFO_T prBssInfo;
1156 P_CONNECTION_SETTINGS_T prConnSettings;
1157 P_STA_RECORD_T prStaRec;
1158 P_TX_CTRL_T prTxCtrl;
1159 #if CFG_SUPPORT_802_11D
1160 P_IE_COUNTRY_T prIECountry;
1163 DEBUGFUNC("joinComplete");
1167 prJoinInfo = &prAdapter->rJoinInfo;
1168 prBssDesc = prJoinInfo->prBssDesc;
1169 prPeerBssInfo = &prAdapter->rPeerBssInfo;
1170 prBssInfo = &prAdapter->rBssInfo;
1171 prConnSettings = &prAdapter->rConnSettings;
1172 prTxCtrl = &prAdapter->rTxCtrl;
1174 //4 <1> Update Connecting & Connected Flag of BSS_DESC_T.
1175 /* Remove previous AP's Connection Flags if have */
1176 scanRemoveConnectionFlagOfBssDescByBssid(prAdapter, prBssInfo->aucBSSID);
1178 prBssDesc->fgIsConnected = TRUE; /* Mask as Connected */
1180 if (prBssDesc->fgIsHiddenSSID) {
1181 /* NOTE(Kevin): This is for the case of Passive Scan and the target BSS didn't
1182 * broadcast SSID on its Beacon Frame.
1184 COPY_SSID(prBssDesc->aucSSID,
1185 prBssDesc->ucSSIDLen,
1186 prAdapter->rConnSettings.aucSSID,
1187 prAdapter->rConnSettings.ucSSIDLen);
1189 if (prBssDesc->ucSSIDLen) {
1190 prBssDesc->fgIsHiddenSSID = FALSE;
1198 DBGLOG(JOIN, INFO, ("Hidden SSID! - Update SSID : %s\n", prBssDesc->aucSSID));
1202 //4 <2> Update BSS_INFO_T from BSS_DESC_T
1204 prBssInfo->ePhyType = prBssDesc->ePhyType;
1207 prBssInfo->eBSSType = BSS_TYPE_INFRASTRUCTURE;
1210 COPY_MAC_ADDR(prBssInfo->aucBSSID, prBssDesc->aucBSSID);
1212 DBGLOG(JOIN, INFO, ("JOIN to BSSID: ["MACSTR"]\n", MAC2STR(prBssDesc->aucBSSID)));
1216 COPY_SSID(prBssInfo->aucSSID,
1217 prBssInfo->ucSSIDLen,
1219 prBssDesc->ucSSIDLen);
1221 //4 <2.E> Channel / Band information.
1222 prBssInfo->eBand = prBssDesc->eBand;
1223 prBssInfo->ucChnl = prBssDesc->ucChannelNum;
1225 //4 <2.F> RSN/WPA information.
1226 secFsmRunEventStart(prAdapter);
1227 prBssInfo->u4RsnSelectedPairwiseCipher = prBssDesc->u4RsnSelectedPairwiseCipher;
1228 prBssInfo->u4RsnSelectedGroupCipher = prBssDesc->u4RsnSelectedGroupCipher;
1229 prBssInfo->u4RsnSelectedAKMSuite = prBssDesc->u4RsnSelectedAKMSuite;
1231 if (secRsnKeyHandshakeEnabled()) {
1232 prBssInfo->fgIsWPAorWPA2Enabled = TRUE;
1235 prBssInfo->fgIsWPAorWPA2Enabled = FALSE;
1238 //4 <2.G> Beacon interval.
1239 prBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
1241 //4 <2.H> DTIM period.
1242 prBssInfo->ucDtimPeriod = prBssDesc->ucDTIMPeriod;
1244 //4 <2.I> ERP Information
1245 if ((prBssInfo->ePhyType == PHY_TYPE_ERP_INDEX) && // Our BSS's PHY_TYPE is ERP now.
1246 (prBssDesc->fgIsERPPresent)) {
1248 prBssInfo->fgIsERPPresent = TRUE;
1249 prBssInfo->ucERP = prBssDesc->ucERP; /* Save the ERP for later check */
1251 else { /* Some AP, may send ProbeResp without ERP IE. Thus prBssDesc->fgIsERPPresent is FALSE. */
1252 prBssInfo->fgIsERPPresent = FALSE;
1253 prBssInfo->ucERP = 0;
1256 #if CFG_SUPPORT_802_11D
1257 //4 <2.J> Country inforamtion of the associated AP
1258 if (prConnSettings->fgMultiDomainCapabilityEnabled) {
1259 DOMAIN_INFO_ENTRY rDomainInfo;
1260 if (domainGetDomainInfoByScanResult(prAdapter, &rDomainInfo)) {
1261 if (prBssDesc->prIECountry) {
1262 prIECountry = prBssDesc->prIECountry;
1264 domainParseCountryInfoElem(prIECountry, &prBssInfo->rDomainInfo);
1266 /* use the domain get from the BSS info */
1267 prBssInfo->fgIsCountryInfoPresent = TRUE;
1268 nicSetupOpChnlList(prAdapter, prBssInfo->rDomainInfo.u2CountryCode, FALSE);
1270 /* use the domain get from the scan result */
1271 prBssInfo->fgIsCountryInfoPresent = TRUE;
1272 nicSetupOpChnlList(prAdapter, rDomainInfo.u2CountryCode, FALSE);
1278 //4 <2.K> Signal Power of the associated AP
1279 prBssInfo->rRcpi = prBssDesc->rRcpi;
1280 prBssInfo->rRssi = RCPI_TO_dBm(prBssInfo->rRcpi);
1281 GET_CURRENT_SYSTIME(&prBssInfo->rRssiLastUpdateTime);
1283 //4 <2.L> Capability Field of the associated AP
1284 prBssInfo->u2CapInfo = prBssDesc->u2CapInfo;
1286 DBGLOG(JOIN, INFO, ("prBssInfo-> fgIsERPPresent = %d, ucERP = %02x, rRcpi = %d, rRssi = %ld\n",
1287 prBssInfo->fgIsERPPresent, prBssInfo->ucERP, prBssInfo->rRcpi, prBssInfo->rRssi));
1290 //4 <3> Update BSS_INFO_T from PEER_BSS_INFO_T & NIC RATE FUNC
1291 //4 <3.A> Association ID
1292 prBssInfo->u2AssocId = prPeerBssInfo->u2AssocId;
1294 //4 <3.B> WMM Infomation
1295 if (prAdapter->fgIsEnableWMM &&
1296 (prPeerBssInfo->rWmmInfo.ucWmmFlag & WMM_FLAG_SUPPORT_WMM)) {
1298 prBssInfo->fgIsWmmAssoc = TRUE;
1299 prTxCtrl->rTxQForVoipAccess = TXQ_AC3;
1301 qosWmmInfoInit(&prBssInfo->rWmmInfo, (prBssInfo->ePhyType == PHY_TYPE_HR_DSSS_INDEX) ? TRUE : FALSE);
1303 if (prPeerBssInfo->rWmmInfo.ucWmmFlag & WMM_FLAG_AC_PARAM_PRESENT) {
1304 kalMemCopy(&prBssInfo->rWmmInfo,
1305 &prPeerBssInfo->rWmmInfo,
1306 sizeof(WMM_INFO_T));
1309 kalMemCopy(&prBssInfo->rWmmInfo,
1310 &prPeerBssInfo->rWmmInfo,
1311 sizeof(WMM_INFO_T) - sizeof(prPeerBssInfo->rWmmInfo.arWmmAcParams));
1315 prBssInfo->fgIsWmmAssoc = FALSE;
1316 prTxCtrl->rTxQForVoipAccess = TXQ_AC1;
1318 kalMemZero(&prBssInfo->rWmmInfo, sizeof(WMM_INFO_T));
1322 //4 <3.C> Operational Rate Set & BSS Basic Rate Set
1323 prBssInfo->u2OperationalRateSet = prPeerBssInfo->u2OperationalRateSet;
1324 prBssInfo->u2BSSBasicRateSet = prPeerBssInfo->u2BSSBasicRateSet;
1327 //4 <3.D> Short Preamble
1328 if (prBssInfo->fgIsERPPresent) {
1330 /* NOTE(Kevin 2007/12/24): Truth Table.
1331 * Short Preamble Bit in
1332 * <AssocReq> <AssocResp w/i ERP> <BARKER(Long)> Final Driver Setting(Short)
1333 * TRUE FALSE FALSE FALSE(shouldn't have such case, use the AssocResp)
1334 * TRUE FALSE TRUE FALSE
1335 * FALSE FALSE FALSE FALSE(shouldn't have such case, use the AssocResp)
1336 * FALSE FALSE TRUE FALSE
1337 * TRUE TRUE FALSE TRUE(follow ERP)
1338 * TRUE TRUE TRUE FALSE(follow ERP)
1339 * FALSE TRUE FALSE FALSE(shouldn't have such case, and we should set to FALSE)
1340 * FALSE TRUE TRUE FALSE(we should set to FALSE)
1342 if ((prPeerBssInfo->fgIsShortPreambleAllowed) &&
1343 ((prConnSettings->ePreambleType == PREAMBLE_TYPE_SHORT) || /* Short Preamble Option Enable is TRUE */
1344 ((prConnSettings->ePreambleType == PREAMBLE_TYPE_AUTO) &&
1345 (prBssDesc->u2CapInfo & CAP_INFO_SHORT_PREAMBLE)))) {
1347 prBssInfo->fgIsShortPreambleAllowed = TRUE;
1349 if (prBssInfo->ucERP & ERP_INFO_BARKER_PREAMBLE_MODE) {
1350 prBssInfo->fgUseShortPreamble = FALSE;
1353 prBssInfo->fgUseShortPreamble = TRUE;
1357 prBssInfo->fgIsShortPreambleAllowed = FALSE;
1358 prBssInfo->fgUseShortPreamble = FALSE;
1362 /* NOTE(Kevin 2007/12/24): Truth Table.
1363 * Short Preamble Bit in
1364 * <AssocReq> <AssocResp w/o ERP> Final Driver Setting(Short)
1368 * FALSE TRUE(status success) TRUE
1369 * --> Honor the result of prPeerBssInfo.
1372 prBssInfo->fgIsShortPreambleAllowed = prBssInfo->fgUseShortPreamble =
1373 prPeerBssInfo->fgIsShortPreambleAllowed;
1376 DBGLOG(JOIN, INFO, ("prBssInfo->fgIsShortPreambleAllowed = %d, prBssInfo->fgUseShortPreamble = %d\n",
1377 prBssInfo->fgIsShortPreambleAllowed, prBssInfo->fgUseShortPreamble));
1380 //4 <3.E> Short Slot Time
1381 prBssInfo->fgUseShortSlotTime =
1382 prPeerBssInfo->fgUseShortSlotTime; /* AP support Short Slot Time */
1384 DBGLOG(JOIN, INFO, ("prBssInfo->fgUseShortSlotTime = %d\n",
1385 prBssInfo->fgUseShortSlotTime));
1387 nicSetSlotTime(prAdapter,
1388 prBssInfo->ePhyType,
1389 ((prConnSettings->fgIsShortSlotTimeOptionEnable &&
1390 prBssInfo->fgUseShortSlotTime) ? TRUE : FALSE));
1393 //4 <3.F> Update Tx Rate for Control Frame
1394 bssUpdateTxRateForControlFrame(prAdapter);
1397 //4 <3.G> Save the available Auth Types during Roaming (Design for Fast BSS Transition).
1398 //if (prAdapter->fgIsEnableRoaming) /* NOTE(Kevin): Always prepare info for roaming */
1401 if (prJoinInfo->ucCurrAuthAlgNum == AUTH_ALGORITHM_NUM_OPEN_SYSTEM) {
1402 prJoinInfo->ucRoamingAuthTypes |= AUTH_TYPE_OPEN_SYSTEM;
1404 else if (prJoinInfo->ucCurrAuthAlgNum == AUTH_ALGORITHM_NUM_SHARED_KEY) {
1405 prJoinInfo->ucRoamingAuthTypes |= AUTH_TYPE_SHARED_KEY;
1408 prBssInfo->ucRoamingAuthTypes = prJoinInfo->ucRoamingAuthTypes;
1411 /* Set the stable time of the associated BSS. We won't do roaming decision
1412 * during the stable time.
1414 SET_EXPIRATION_TIME(prBssInfo->rRoamingStableExpirationTime,
1415 SEC_TO_SYSTIME(ROAMING_STABLE_TIMEOUT_SEC));
1419 //4 <3.H> Update Parameter for TX Fragmentation Threshold
1421 txFragInfoUpdate(prAdapter);
1422 #endif /* CFG_TX_FRAGMENT */
1425 //4 <4> Update STA_RECORD_T
1426 /* Get a Station Record if possible */
1427 prStaRec = staRecGetStaRecordByAddr(prAdapter,
1428 prBssDesc->aucBSSID);
1431 UINT_16 u2OperationalRateSet, u2DesiredRateSet;
1433 //4 <4.A> Desired Rate Set
1434 u2OperationalRateSet = (rPhyAttributes[prBssInfo->ePhyType].u2SupportedRateSet &
1435 prBssInfo->u2OperationalRateSet);
1437 u2DesiredRateSet = (u2OperationalRateSet & prConnSettings->u2DesiredRateSet);
1438 if (u2DesiredRateSet) {
1439 prStaRec->u2DesiredRateSet = u2DesiredRateSet;
1442 /* For Error Handling - The Desired Rate Set is not covered in Operational Rate Set. */
1443 prStaRec->u2DesiredRateSet = u2OperationalRateSet;
1446 /* Try to set the best initial rate for this entry */
1447 if (!rateGetBestInitialRateIndex(prStaRec->u2DesiredRateSet,
1449 &prStaRec->ucCurrRate1Index)) {
1451 if (!rateGetLowestRateIndexFromRateSet(prStaRec->u2DesiredRateSet,
1452 &prStaRec->ucCurrRate1Index)) {
1457 DBGLOG(JOIN, INFO, ("prStaRec->ucCurrRate1Index = %d\n",
1458 prStaRec->ucCurrRate1Index));
1460 //4 <4.B> Preamble Mode
1461 prStaRec->fgIsShortPreambleOptionEnable =
1462 prBssInfo->fgUseShortPreamble;
1465 prStaRec->fgIsQoS = prBssInfo->fgIsWmmAssoc;
1475 //4 <5.A> Update BSSID & Operation Mode
1476 nicSetupBSS(prAdapter, prBssInfo);
1478 //4 <5.B> Update WLAN Table.
1479 if (nicSetHwBySta(prAdapter, prStaRec) == FALSE) {
1483 //4 <5.C> Update Desired Rate Set for BT.
1485 if (prConnSettings->fgIsEnableTxAutoFragmentForBT) {
1486 txRateSetInitForBT(prAdapter, prStaRec);
1488 #endif /* CFG_TX_FRAGMENT */
1490 //4 <5.D> TX AC Parameter and TX/RX Queue Control
1491 if (prBssInfo->fgIsWmmAssoc) {
1493 #if CFG_TX_AGGREGATE_HW_FIFO
1494 nicTxAggregateTXQ(prAdapter, FALSE);
1495 #endif /* CFG_TX_AGGREGATE_HW_FIFO */
1497 qosUpdateWMMParametersAndAssignAllowedACI(prAdapter, &prBssInfo->rWmmInfo);
1501 #if CFG_TX_AGGREGATE_HW_FIFO
1502 nicTxAggregateTXQ(prAdapter, TRUE);
1503 #endif /* CFG_TX_AGGREGATE_HW_FIFO */
1505 nicTxNonQoSAssignDefaultAdmittedTXQ(prAdapter);
1507 nicTxNonQoSUpdateTXQParameters(prAdapter,
1508 prBssInfo->ePhyType);
1511 #if CFG_TX_STOP_WRITE_TX_FIFO_UNTIL_JOIN
1513 prTxCtrl->fgBlockTxDuringJoin = FALSE;
1515 #if !CFG_TX_AGGREGATE_HW_FIFO /* TX FIFO AGGREGATE already do flush once */
1516 nicTxFlushStopQueues(prAdapter, (UINT_8)TXQ_DATA_MASK, (UINT_8)NULL);
1517 #endif /* CFG_TX_AGGREGATE_HW_FIFO */
1519 nicTxRetransmitOfSendWaitQue(prAdapter);
1521 if (prTxCtrl->fgIsPacketInOsSendQueue) {
1522 nicTxRetransmitOfOsSendQue(prAdapter);
1525 #if CFG_SDIO_TX_ENHANCE
1526 halTxLeftClusteredMpdu(prAdapter);
1527 #endif /* CFG_SDIO_TX_ENHANCE */
1530 #endif /* CFG_TX_STOP_WRITE_TX_FIFO_UNTIL_JOIN */
1533 //4 <6> Setup CONNECTION flag.
1534 prAdapter->eConnectionState = MEDIA_STATE_CONNECTED;
1535 prAdapter->eConnectionStateIndicated = MEDIA_STATE_CONNECTED;
1537 if (prJoinInfo->fgIsReAssoc) {
1538 prAdapter->fgBypassPortCtrlForRoaming = TRUE;
1541 prAdapter->fgBypassPortCtrlForRoaming = FALSE;
1544 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
1545 WLAN_STATUS_MEDIA_CONNECT,
1550 } /* end of joinComplete() */