2 ** $Id: //Department/DaVinci/BRANCHES/MT662X_593X_WIFI_DRIVER_V2_3/mgmt/assoc.c#1 $
6 \brief This file includes the association-related functions.
8 This file includes the association-related functions.
11 /*******************************************************************************
12 * Copyright (c) 2007 MediaTek Inc.
14 * All rights reserved. Copying, compilation, modification, distribution
15 * or any other use whatsoever of this material is strictly prohibited
16 * except in accordance with a Software License Agreement with
18 ********************************************************************************
21 /*******************************************************************************
24 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
25 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
26 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
27 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
28 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
29 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
30 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
31 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
32 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
33 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
34 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
35 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
36 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
38 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
39 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
40 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
41 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
42 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
44 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
45 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
46 * OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
47 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
48 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
50 ********************************************************************************
57 ** [WCXRP00001262] [MT6620 Wi-Fi][Driver] Fixed the update assoc info pkt length issue
58 ** fixed the assoc request update ie length.
60 ** 07 27 2012 yuche.tsai
62 ** Fix wifi direct connection issue.
63 ** Assoc Req no P2P IE.
65 * 07 17 2012 yuche.tsai
67 * Let netdev bring up.
69 * 07 17 2012 yuche.tsai
71 * Compile no error before trial run.
73 * 06 13 2012 yuche.tsai
75 * Update maintrunk driver.
76 * Add support for driver compose assoc request frame.
79 * [WCXRP00001245] [MT6620 Wi-Fi][Driver][Firmware] NPS Software Development
80 * add a pair of brace for compilation success.
83 * [WCXRP00001245] [MT6620 Wi-Fi][Driver][Firmware] NPS Software Development
84 * discussed with WH, privacy bit in associate response is not necessary to be checked, and identified as association failure when mismatching with beacon/probe response
87 * [WCXRP00001173] [MT6620 Wi-Fi][Driver] Adding the ICS Tethering WPA2-PSK supporting
96 * Sync CFG80211 modification from branch 2,2.
98 * 01 16 2012 yuche.tsai
100 * Update Driver for wifi driect gc join IE update issue.
103 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
104 * change the debug module level.
106 * 10 25 2011 cm.chang
107 * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
108 * Fix PhyTypeSet in STA_REC in AP mode
111 * [WCXRP00001036] [MT6620 Wi-Fi][Driver][FW] Adding the 802.11w code for MFP
112 * adding the 802.11w related function and define .
114 * 09 19 2011 yuche.tsai
116 * Fix KE when enable hot-spot & any one client connect to this hot-spot.
118 * 09 14 2011 yuche.tsai
120 * Add P2P IE in assoc response.
122 * 07 15 2011 terry.wu
123 * [WCXRP00000855] [MT6620 Wi-Fi] [Driver] Workaround for Kingnet 710 AP wrong AID assignment
124 * Update workaround for Kingnet AP.
126 * 07 15 2011 terry.wu
127 * [WCXRP00000855] [MT6620 Wi-Fi] [Driver] Workaround for Kingnet 710 AP wrong AID assignment
128 * Workaround for Kingnet 710 AP wrong AID assignment.
130 * 05 02 2011 eddie.chen
131 * [WCXRP00000603] [MT6620 Wi-Fi][DRV] Fix Klocwork warning[WCXRP00000672] [MT6620 Wi-Fi][FW] Fix the PS event allocation
132 * Check STA when rx assoc.
134 * 04 18 2011 terry.wu
135 * [WCXRP00000660] [MT6620 Wi-Fi][Driver] Remove flag CFG_WIFI_DIRECT_MOVED
136 * Remove flag CFG_WIFI_DIRECT_MOVED.
138 * 03 19 2011 yuche.tsai
139 * [WCXRP00000581] [Volunteer Patch][MT6620][Driver] P2P IE in Assoc Req Issue
140 * Make assoc req to append P2P IE if wifi direct is enabled.
142 * 03 17 2011 chinglan.wang
143 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
147 * [WCXRP00000530] [MT6620 Wi-Fi] [Driver] skip doing p2pRunEventAAAComplete after send assoc response Tx Done
148 * enable the protected while at P2P start GO, and skip some security check .
151 * [WCXRP00000545] [MT6620 Wi-Fi] [Driver] Fixed the p2p not enable, received a assoc rsp cause the rx assoc execute a null function
152 * Modify file for avoid assert at BOW recieve a assoc response frame but no p2p fucntion.
154 * 03 08 2011 terry.wu
155 * [WCXRP00000524] [MT6620 Wi-Fi][Driver] Fix p2p assoc request containing wrong IE format
156 * Fix p2p assoc request containing wrong IE format.
159 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
160 * add code to let the beacon and probe response for Auto GO WSC .
162 * 02 15 2011 yuche.tsai
163 * [WCXRP00000431] [Volunteer Patch][MT6620][Driver] Add MLME support for deauthentication under AP(Hot-Spot) mode.
164 * Fix RX disassoc issue under Hot-spot mode.
167 * [WCXRP00000432] [MT6620 Wi-Fi][Driver] Add STA privacy check at hotspot mode
168 * adding the code for check STA privacy bit at AP mode, .
170 * 02 08 2011 eddie.chen
171 * [WCXRP00000426] [MT6620 Wi-Fi][FW/Driver] Add STA aging timeout and defualtHwRatein AP mode
172 * Add event STA agint timeout
174 * 01 25 2011 yuche.tsai
175 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
176 * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
178 * 01 12 2011 yuche.tsai
179 * [WCXRP00000353] [Volunteer Patch][MT6620][Driver] Desired Non-HT Rate Set update when STA record is created under AP Mode.
180 * Update Phy Type Set. When legacy client is connected, it can use 11b rate,
181 * but if the P2P device is connected, 11b rate is not allowed.
183 * 01 11 2011 yuche.tsai
184 * [WCXRP00000353] [Volunteer Patch][MT6620][Driver] Desired Non-HT Rate Set update when STA record is created under AP Mode.
185 * Update Desired Non-HT Rate Set.
187 * 12 30 2010 eddie.chen
188 * [WCXRP00000322] Add WMM IE in beacon,
190 Add per station flow control when STA is in PS
193 * Recover the code that was coverwritted..
195 * 12 29 2010 eddie.chen
196 * [WCXRP00000322] Add WMM IE in beacon,
197 Add per station flow control when STA is in PS
199 * 1) PS flow control event
201 * 2) WMM IE in beacon, assoc resp, probe resp
204 * [WCXRP00000164] [MT6620 Wi-Fi][Driver] Support the p2p random SSID
205 * adding the p2p random ssid support.
208 * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
209 * use definition macro to replace hard-coded constant
213 * [WCXRP00000069][MT6620 Wi-Fi][Driver] Fix some code for phase 1 P2P Demo.
215 * 09 27 2010 chinghwa.yu
216 * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000065] Update BoW design and settings
217 * Update BCM/BoW design and settings.
219 * 09 16 2010 cm.chang
221 * Change conditional compiling options for BOW
223 * 09 03 2010 kevin.huang
225 * Refine #include sequence and solve recursive/nested #include issue
229 * adding the wapi support for integration test.
233 * eliminate klockwork errors
235 * 08 16 2010 yuche.tsai
237 * Add SSID IE in assoc req frame which is sent by P2P GC.
239 * 08 16 2010 kevin.huang
241 * Refine AAA functions
245 * surpress compilation warning.
249 * adding the wapi code.
251 * 07 09 2010 yarco.yang
253 * [MT6620 and MT5931] SW Migration: Add ADDBA support
257 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
260 * [WPD00003833][MT6620 and MT5931] Driver migration
261 * take use of RLM module for parsing/generating HT IEs for 11n capability
264 * [WPD00003833][MT6620 and MT5931] Driver migration
265 * comment out RSN IE generation by CFG_RSN_MIGRATION compilation flag.
268 * [WPD00003833][MT6620 and MT5931] Driver migration
269 * send MMPDU in basic rate.
272 * [WPD00003833][MT6620 and MT5931] Driver migration
273 * add scan_fsm into building.
276 * [WPD00003833][MT6620 and MT5931] Driver migration
277 * specify correct value for management frames.
279 * 06 18 2010 cm.chang
280 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
281 * Provide cnmMgtPktAlloc() and alloc/free function of msg/buf
284 * [WPD00003840][MT6620 5931] Security migration
285 * migration from MT6620 firmware.
288 * [WPD00003833][MT6620 and MT5931] Driver migration
292 * [WPD00003833][MT6620 and MT5931] Driver migration
293 * add management dispatching function table.
296 * [WPD00003833][MT6620 and MT5931] Driver migration
297 * auth.c is migrated.
300 * [WPD00003833][MT6620 and MT5931] Driver migration
301 * 1) migrate assoc.c.
302 * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
303 * 3) add configuration options for CNM_MEM and RSN modules
304 * 4) add data path for management frames
305 * 5) eliminate rPacketInfo of MSDU_INFO_T
307 * 05 24 2010 kevin.huang
308 * [BORA00000794][WIFISYS][New Feature]Power Management Support
309 * Update assocProcessRxAssocReqFrame() to avoid redundant SSID IE {0,0} for IOT.
311 * 05 14 2010 kevin.huang
312 * [BORA00000794][WIFISYS][New Feature]Power Management Support
313 * Fix compile warning - macro > 10 line, initial value of an array
315 * 04 24 2010 cm.chang
316 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
317 * g_aprBssInfo[] depends on CFG_SUPPORT_P2P and CFG_SUPPORT_BOW
319 * 04 22 2010 cm.chang
320 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
321 * First draft code to support protection in AP mode
323 * 04 19 2010 kevin.huang
324 * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
325 * Add Beacon Timeout Support
326 * * * * * * * * and will send Null frame to diagnose connection
329 * [BORA00000680][MT6620] Support the statistic for Microsoft os query
330 * adding the wpa-none for ibss beacon.
332 * 03 25 2010 cm.chang
333 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
334 * Remove compiling warning
336 * 03 24 2010 cm.chang
337 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
338 * Not carry HT cap when being associated with b/g only AP
340 * 02 04 2010 kevin.huang
341 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
342 * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
345 * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
346 * fixed the compiling warning.u1rwduu`wvpghlqg|rm+vp
349 * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
350 * add and fixed some security function.
352 * 01 11 2010 kevin.huang
353 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
354 * Add Deauth and Disassoc Handler
356 * 01 07 2010 kevin.huang
357 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
358 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
359 * Update Assoc ID for PS
361 * 01 04 2010 tehuang.liu
362 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
363 * For working out the first connection Chariot-verified version
365 * 12 18 2009 cm.chang
366 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
369 * Dec 12 2009 mtk01104
370 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
371 * Use new constant definition ELEM_MAX_LEN_EXT_CAP
373 * Dec 9 2009 mtk01104
374 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
375 * Modify assoc req IE talbe for HT cap IE
377 * Dec 7 2009 mtk01461
378 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
379 * update the assocComposeReAssocReqFrameHeader() and fix the u2EstimatedFrameLen in assocSendReAssocReqFrame()
381 * Dec 7 2009 mtk01088
382 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
383 * remove some space line
385 * Dec 7 2009 mtk01088
386 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
387 * adding the sending disassoc frame function
389 * Dec 4 2009 mtk01088
390 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
391 * adding the txassocReq IE table, adding for WPA/RSN
393 * Dec 3 2009 mtk01461
394 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
395 * Fix eNetType not init in send AssocReq function
397 * Dec 3 2009 mtk01461
398 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
399 * Integrate the send Assoc with TXM
401 * Dec 1 2009 mtk01088
402 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
403 * adding the code to indicate the assoc request and assoc response (now disable)
405 * Nov 24 2009 mtk01461
406 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
407 * Remove unused variables
409 * Nov 23 2009 mtk01461
410 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
414 /*******************************************************************************
415 * C O M P I L E R F L A G S
416 ********************************************************************************
419 /*******************************************************************************
420 * E X T E R N A L R E F E R E N C E S
421 ********************************************************************************
425 /*******************************************************************************
427 ********************************************************************************
430 /*******************************************************************************
432 ********************************************************************************
435 /*******************************************************************************
436 * P U B L I C D A T A
437 ********************************************************************************
439 APPEND_VAR_IE_ENTRY_T txAssocReqIETable[] = {
440 { (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_CAP), NULL, rlmReqGenerateHtCapIE },/* 45 */
442 { (ELEM_HDR_LEN + ELEM_MAX_LEN_WSC), NULL, rsnGenerateWSCIE }, /* 221 */
445 { (ELEM_HDR_LEN + ELEM_MAX_LEN_WAPI), NULL, wapiGenerateWAPIIE }, /* 68 */
447 #if CFG_RSN_MIGRATION
448 { (ELEM_HDR_LEN + ELEM_MAX_LEN_WPA), NULL, rsnGenerateWPAIE }, /* 221 */
450 { (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP), NULL, rlmReqGenerateExtCapIE }, /* 127 */
451 { (ELEM_HDR_LEN + ELEM_MAX_LEN_WMM_INFO), NULL, mqmGenerateWmmInfoIE }, /* 221 */
452 #if CFG_RSN_MIGRATION
453 { (ELEM_HDR_LEN + ELEM_MAX_LEN_RSN), NULL, rsnGenerateRSNIE }, /* 48 */
458 VERIFY_IE_ENTRY_T rxAssocReqIETable[] = {
459 { ELEM_ID_RESERVED, NULL } /* 255 */
463 APPEND_VAR_IE_ENTRY_T txAssocRespIETable[] = {
464 { (ELEM_HDR_LEN + ELEM_MAX_LEN_ERP), NULL, rlmRspGenerateErpIE }, /* 42 */
465 { (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_CAP), NULL, rlmRspGenerateHtCapIE }, /* 45 */
466 { (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_OP), NULL, rlmRspGenerateHtOpIE }, /* 61 */
467 #if CFG_ENABLE_WIFI_DIRECT
468 { (ELEM_HDR_LEN + ELEM_MAX_LEN_OBSS_SCAN), NULL, rlmRspGenerateObssScanIE }, /* 74 */
469 { (0), p2pFuncCalculateP2p_IELenForAssocRsp, p2pFuncGenerateP2p_IEForAssocRsp }, /* 221 */
471 { (0), wfdFuncCalculateWfdIELenForAssocRsp, wfdFuncGenerateWfdIEForAssocRsp }, /* 221 */
474 { (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP), NULL, rlmRspGenerateExtCapIE }, /* 127 */
475 { (ELEM_HDR_LEN + ELEM_MAX_LEN_WMM_PARAM), NULL, mqmGenerateWmmParamIE } /* 221 */
479 /*******************************************************************************
480 * P R I V A T E D A T A
481 ********************************************************************************
484 /*******************************************************************************
486 ********************************************************************************
489 /*******************************************************************************
490 * F U N C T I O N D E C L A R A T I O N S
491 ********************************************************************************
494 /*******************************************************************************
496 ********************************************************************************
498 /*----------------------------------------------------------------------------*/
500 * @brief This function is used to compose the Capability Info Field.
502 * @param[in] prStaRec Pointer to the STA_RECORD_T
504 * @retval Capability Info Field
506 /*----------------------------------------------------------------------------*/
507 __KAL_INLINE__ UINT_16
508 assocBuildCapabilityInfo (
509 IN P_ADAPTER_T prAdapter,
510 IN P_STA_RECORD_T prStaRec
513 UINT_32 u4NonHTPhyType;
520 /* Set up our requested capabilities. */
521 u2CapInfo = CAP_INFO_ESS;
522 u2CapInfo |= CAP_CF_STA_NOT_POLLABLE;
524 if (prStaRec->u2CapInfo & CAP_INFO_PRIVACY) {
525 u2CapInfo |= CAP_INFO_PRIVACY;
530 if (prStaRec->fgHasBasicPhyType) {
531 u4NonHTPhyType = prStaRec->ucNonHTBasicPhyType;
533 if ( (rNonHTPhyAttributes[u4NonHTPhyType].fgIsShortPreambleOptionImplemented) &&
534 ( (prAdapter->rWifiVar.ePreambleType == PREAMBLE_TYPE_SHORT) || /* Short Preamble Option Enable is TRUE */
535 ((prAdapter->rWifiVar.ePreambleType == PREAMBLE_TYPE_AUTO) &&
536 (prStaRec->u2CapInfo & CAP_INFO_SHORT_PREAMBLE)) ) ) {
538 /* Case I: Implemented == TRUE and Short Preamble Option Enable == TRUE.
539 * Case II: Implemented == TRUE and Short Preamble == AUTO (depends on
540 * BSS_DESC_T's capability)
542 u2CapInfo |= CAP_INFO_SHORT_PREAMBLE;
545 if (rNonHTPhyAttributes[u4NonHTPhyType].fgIsShortSlotTimeOptionImplemented &&
546 prAdapter->rWifiVar.fgIsShortSlotTimeOptionEnable) {
547 u2CapInfo |= CAP_INFO_SHORT_SLOT_TIME;
551 DBGLOG(SAA, LOUD, ("ASSOC REQ: Compose Capability = 0x%04x for Target BSS ["MACSTR"].\n",
552 u2CapInfo, MAC2STR(prStaRec->aucMacAddr)));
557 } /* end of assocBuildCapabilityInfo() */
560 /*----------------------------------------------------------------------------*/
562 * @brief This function is used to compose Common Information Elements for Association
565 * @param[in] prMsduInfo Pointer to the composed MSDU_INFO_T.
569 /*----------------------------------------------------------------------------*/
571 assocBuildReAssocReqFrameCommonIEs (
572 IN P_ADAPTER_T prAdapter,
573 IN P_MSDU_INFO_T prMsduInfo
576 P_CONNECTION_SETTINGS_T prConnSettings;
577 P_STA_RECORD_T prStaRec;
579 UINT_16 u2SupportedRateSet;
580 UINT_8 aucAllSupportedRates[RATE_NUM] = {0};
581 UINT_8 ucAllSupportedRatesLen;
582 UINT_8 ucSupRatesLen;
583 UINT_8 ucExtSupRatesLen;
585 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
587 ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
589 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
596 pucBuffer = (PUINT_8)((UINT_32)prMsduInfo->prPacket +
597 (UINT_32)prMsduInfo->u2FrameLength);
600 if (IS_STA_IN_AIS(prStaRec)) {
602 /* Fill the SSID element. */
603 SSID_IE(pucBuffer)->ucId = ELEM_ID_SSID;
605 /* NOTE(Kevin): We copy the SSID from CONNECTION_SETTINGS for the case of
606 * Passive Scan and the target BSS didn't broadcast SSID on its Beacon Frame.
609 COPY_SSID(SSID_IE(pucBuffer)->aucSSID,
610 SSID_IE(pucBuffer)->ucLength,
611 prConnSettings->aucSSID,
612 prConnSettings->ucSSIDLen);
614 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
615 pucBuffer += IE_SIZE(pucBuffer);
618 #if CFG_ENABLE_WIFI_DIRECT
619 else if((prAdapter->fgIsP2PRegistered) &&
620 (IS_STA_IN_P2P(prStaRec))) {
621 pucBuffer = p2pBuildReAssocReqFrameCommonIEs(prAdapter, prMsduInfo, pucBuffer);
624 #if CFG_ENABLE_BT_OVER_WIFI
625 else if (IS_STA_IN_BOW(prStaRec)) {
627 SSID_IE(pucBuffer)->ucId = ELEM_ID_SSID;
629 /* NOTE(Kevin): We copy the SSID from CONNECTION_SETTINGS for the case of
630 * Passive Scan and the target BSS didn't broadcast SSID on its Beacon Frame.
633 COPY_SSID(SSID_IE(pucBuffer)->aucSSID,
634 SSID_IE(pucBuffer)->ucLength,
635 prConnSettings->aucSSID,
636 prConnSettings->ucSSIDLen);
638 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
639 pucBuffer += IE_SIZE(pucBuffer);
644 /* TODO(Kevin): For other network */
647 /* NOTE(Kevin 2008/12/19): 16.3.6.3 MLME-ASSOCIATE.indication -
648 * SupportedRates - The set of data rates that are supported by the STA
649 * that is requesting association.
650 * Original(Portable Driver): Only send the Rates that we'll support.
651 * New: Send the Phy Rates if the result of following & operation == NULL.
653 //rateGetDataRatesFromRateSet((prBssDesc->u2OperationalRateSet &
654 // rPhyAttributes[prBssDesc->ePhyType].u2SupportedRateSet),
656 if (prStaRec->fgHasBasicPhyType) {
657 UINT_32 u4NonHTPhyType;
660 u4NonHTPhyType = prStaRec->ucNonHTBasicPhyType;
662 u2SupportedRateSet = (prStaRec->u2OperationalRateSet &
663 rNonHTPhyAttributes[u4NonHTPhyType].u2SupportedRateSet);
665 ASSERT(u2SupportedRateSet);
667 if (!u2SupportedRateSet) {
668 u2SupportedRateSet = rNonHTPhyAttributes[u4NonHTPhyType].u2SupportedRateSet;
671 /* TODO(Kevin): For P2P, we shouldn't send support rate set which contains 11b rate */
673 rateGetDataRatesFromRateSet(u2SupportedRateSet,
675 aucAllSupportedRates,
676 &ucAllSupportedRatesLen);
678 ucSupRatesLen = ((ucAllSupportedRatesLen > ELEM_MAX_LEN_SUP_RATES) ?
679 ELEM_MAX_LEN_SUP_RATES : ucAllSupportedRatesLen);
681 ucExtSupRatesLen = ucAllSupportedRatesLen - ucSupRatesLen;
684 /* Fill the Supported Rates element. */
686 SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_SUP_RATES;
687 SUP_RATES_IE(pucBuffer)->ucLength = ucSupRatesLen;
688 kalMemCopy(SUP_RATES_IE(pucBuffer)->aucSupportedRates,
689 aucAllSupportedRates,
692 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
693 pucBuffer += IE_SIZE(pucBuffer);
697 /* Fill the Extended Supported Rates element. */
698 if (ucExtSupRatesLen) {
700 EXT_SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_EXTENDED_SUP_RATES;
701 EXT_SUP_RATES_IE(pucBuffer)->ucLength = ucExtSupRatesLen;
703 kalMemCopy(EXT_SUP_RATES_IE(pucBuffer)->aucExtSupportedRates,
704 &aucAllSupportedRates[ucSupRatesLen],
707 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
708 pucBuffer += IE_SIZE(pucBuffer);
713 } /* end of assocBuildReAssocReqFrameCommonIEs() */
716 /*----------------------------------------------------------------------------*/
718 * @brief This function will compose the (Re)Association Request frame header and
721 * @param[in] prStaRec Pointer to the STA_RECORD_T
722 * @param[in] pucBuffer Pointer to the frame buffer.
723 * @param[in] aucMACAddress Given Our MAC Address.
724 * @param[in out] pu2PayloadLen Return the length of the composed fixed fields
728 /*----------------------------------------------------------------------------*/
730 assocComposeReAssocReqFrameHeaderAndFF (
731 IN P_ADAPTER_T prAdapter,
732 IN P_STA_RECORD_T prStaRec,
733 IN PUINT_8 pucBuffer,
734 IN UINT_8 aucMACAddress[],
735 IN OUT PUINT_16 pu2PayloadLen
738 P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
743 UINT_16 u2ListenInterval;
748 ASSERT(aucMACAddress);
749 ASSERT(pu2PayloadLen);
751 prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)pucBuffer;
752 fgIsReAssoc = prStaRec->fgIsReAssoc;
754 //4 <1> Compose the frame header of the (Re)Association Request frame.
755 /* Fill the Frame Control field. */
757 u2FrameCtrl = MAC_FRAME_REASSOC_REQ;
760 u2FrameCtrl = MAC_FRAME_ASSOC_REQ;
762 WLAN_SET_FIELD_16(&prAssocFrame->u2FrameCtrl, u2FrameCtrl);
764 /* Fill the DA field with Target BSSID. */
765 COPY_MAC_ADDR(prAssocFrame->aucDestAddr, prStaRec->aucMacAddr);
767 /* Fill the SA field with our MAC Address. */
768 COPY_MAC_ADDR(prAssocFrame->aucSrcAddr, aucMACAddress);
770 /* Fill the BSSID field with Target BSSID. */
771 COPY_MAC_ADDR(prAssocFrame->aucBSSID, prStaRec->aucMacAddr);
773 /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
774 prAssocFrame->u2SeqCtrl = 0;
777 //4 <2> Compose the frame body's common fixed field part of the (Re)Association Request frame.
778 u2CapInfo = assocBuildCapabilityInfo(prAdapter, prStaRec);
780 /* Fill the Capability Information field. */
781 WLAN_SET_FIELD_16(&prAssocFrame->u2CapInfo, u2CapInfo);
784 /* Calculate the listen interval for the maximum power mode. Currently, we
785 set it to the value 2 times DTIM period. */
786 if (prStaRec->ucDTIMPeriod) {
787 u2ListenInterval = prStaRec->ucDTIMPeriod * DEFAULT_LISTEN_INTERVAL_BY_DTIM_PERIOD;
790 DBGLOG(SAA, TRACE, ("Use default listen interval\n"));
791 u2ListenInterval = DEFAULT_LISTEN_INTERVAL;
793 prStaRec->u2ListenInterval = u2ListenInterval;
795 /* Fill the Listen Interval field. */
796 WLAN_SET_FIELD_16(&prAssocFrame->u2ListenInterval, u2ListenInterval);
799 //4 <3> Compose the Current AP Address field for ReAssociation Request frame.
800 /* Fill the Current AP Address field. */
801 if (prStaRec->fgIsReAssoc) {
802 if (IS_STA_IN_AIS(prStaRec)) {
804 P_AIS_BSS_INFO_T prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
805 P_WLAN_REASSOC_REQ_FRAME_T prReAssocFrame =
806 (P_WLAN_REASSOC_REQ_FRAME_T)prAssocFrame;
808 COPY_MAC_ADDR(prReAssocFrame->aucCurrentAPAddr, prAisBssInfo->aucBSSID);
811 ASSERT(0); /* We don't support ReAssociation for other network */
814 *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
815 LISTEN_INTERVAL_FIELD_LEN +
816 CURR_AP_ADDR_FIELD_LEN);
819 *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
820 LISTEN_INTERVAL_FIELD_LEN);
824 } /* end of assocComposeReAssocReqFrame() */
827 /*----------------------------------------------------------------------------*/
829 * @brief This function will send the (Re)Association Request frame
831 * @param[in] prStaRec Pointer to the STA_RECORD_T
833 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
834 * @retval WLAN_STATUS_SUCCESS Successfully send frame to TX Module
836 /*----------------------------------------------------------------------------*/
838 assocSendReAssocReqFrame (
839 IN P_ADAPTER_T prAdapter,
840 IN P_STA_RECORD_T prStaRec
843 P_MSDU_INFO_T prMsduInfo;
844 P_BSS_INFO_T prBssInfo;
846 UINT_16 u2PayloadLen;
847 UINT_16 u2EstimatedFrameLen;
848 UINT_16 u2EstimatedExtraIELen;
855 //4 <1> Allocate a PKT_INFO_T for Authentication Frame
856 fgIsReAssoc = prStaRec->fgIsReAssoc;
858 /* Init with MGMT Header Length + Length of Fixed Fields + Common IE Length */
860 u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
861 WLAN_MAC_MGMT_HEADER_LEN + \
862 CAP_INFO_FIELD_LEN + \
863 LISTEN_INTERVAL_FIELD_LEN + \
864 CURR_AP_ADDR_FIELD_LEN + \
865 (ELEM_HDR_LEN + ELEM_MAX_LEN_SSID) + \
866 (ELEM_HDR_LEN + ELEM_MAX_LEN_SUP_RATES) + \
867 (ELEM_HDR_LEN + (RATE_NUM - ELEM_MAX_LEN_SUP_RATES));
870 u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
871 WLAN_MAC_MGMT_HEADER_LEN + \
872 CAP_INFO_FIELD_LEN + \
873 LISTEN_INTERVAL_FIELD_LEN + \
874 (ELEM_HDR_LEN + ELEM_MAX_LEN_SSID) + \
875 (ELEM_HDR_LEN + ELEM_MAX_LEN_SUP_RATES) + \
876 (ELEM_HDR_LEN + (RATE_NUM - ELEM_MAX_LEN_SUP_RATES));
879 /* + Extra IE Length */
880 u2EstimatedExtraIELen = 0;
882 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211 && CFG_ENABLE_WIFI_DIRECT
883 if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_P2P_INDEX) {
884 if ((prAdapter->fgIsP2PRegistered)) {
885 u2EstimatedExtraIELen = p2pCalculate_IEForAssocReq(prAdapter,
886 prStaRec->ucNetTypeIndex,
890 DBGLOG(P2P, TRACE, ("Function Linker Lost.\n"));
895 for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
896 if (txAssocReqIETable[i].u2EstimatedFixedIELen != 0) {
897 u2EstimatedExtraIELen += txAssocReqIETable[i].u2EstimatedFixedIELen;
900 u2EstimatedExtraIELen += (UINT_16)txAssocReqIETable[i].pfnCalculateVariableIELen(prAdapter,
901 prStaRec->ucNetTypeIndex,
907 for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
908 if (txAssocReqIETable[i].u2EstimatedFixedIELen != 0) {
909 u2EstimatedExtraIELen += txAssocReqIETable[i].u2EstimatedFixedIELen;
912 u2EstimatedExtraIELen += (UINT_16)txAssocReqIETable[i].pfnCalculateVariableIELen(prAdapter,
913 prStaRec->ucNetTypeIndex,
919 u2EstimatedFrameLen += u2EstimatedExtraIELen;
921 /* Allocate a MSDU_INFO_T */
922 if ( (prMsduInfo = cnmMgtPktAlloc(prAdapter, u2EstimatedFrameLen)) == NULL) {
923 DBGLOG(SAA, WARN, ("No PKT_INFO_T for sending (Re)Assoc Request.\n"));
924 return WLAN_STATUS_RESOURCES;
927 //4 <2> Compose (Re)Association Request frame header and fixed fields in MSDU_INfO_T.
928 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
929 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
932 /* Compose Header and Fixed Field */
933 assocComposeReAssocReqFrameHeaderAndFF(prAdapter,
935 (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
936 prBssInfo->aucOwnMacAddr,
939 //4 <3> Update information of MSDU_INFO_T
940 prMsduInfo->eSrc = TX_PACKET_MGMT;
941 prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;
942 prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
943 prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
944 prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
945 prMsduInfo->fgIs802_1x = FALSE;
946 prMsduInfo->fgIs802_11 = TRUE;
947 prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
948 prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
949 prMsduInfo->pfTxDoneHandler = saaFsmRunEventTxDone;
950 prMsduInfo->fgIsBasicRate = TRUE;
952 //4 <4> Compose the frame body's IEs of the (Re)Association Request frame.
953 assocBuildReAssocReqFrameCommonIEs(prAdapter, prMsduInfo);
956 //4 <5> Compose IEs in MSDU_INFO_T
957 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211 && CFG_ENABLE_WIFI_DIRECT
958 if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_P2P_INDEX) {
959 if ((prAdapter->fgIsP2PRegistered)) {
960 p2pGenerate_IEForAssocReq(prAdapter, prMsduInfo);
963 DBGLOG(P2P, TRACE, ("Function Linker Lost.\n"));
969 for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
970 if (txAssocReqIETable[i].pfnAppendIE) {
971 txAssocReqIETable[i].pfnAppendIE(prAdapter, prMsduInfo);
977 for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
978 if (txAssocReqIETable[i].pfnAppendIE) {
979 txAssocReqIETable[i].pfnAppendIE(prAdapter, prMsduInfo);
984 //4 <6> Update the (Re)association request information
985 if (IS_STA_IN_AIS(prStaRec)) {
986 P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
988 prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
990 #if CFG_RSN_MIGRATION
991 kalUpdateReAssocReqInfo(prAdapter->prGlueInfo,
992 (PUINT_8)&prAssocFrame->u2CapInfo,
993 prMsduInfo->u2FrameLength - offsetof(WLAN_ASSOC_REQ_FRAME_T, u2CapInfo),
998 #if CFG_ENABLE_WIFI_DIRECT
999 if ((prAdapter->fgIsP2PRegistered) && (IS_STA_IN_P2P(prStaRec))) {
1000 P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
1002 prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
1005 kalP2PUpdateAssocInfo(
1006 prAdapter->prGlueInfo,
1007 (PUINT_8)&prAssocFrame->u2CapInfo,
1008 prMsduInfo->u2FrameLength - offsetof(WLAN_ASSOC_REQ_FRAME_T, u2CapInfo),
1013 /* TODO(Kevin): Also release the unused tail room of the composed MMPDU */
1015 //4 <6> Enqueue the frame to send this (Re)Association request frame.
1016 nicTxEnqueueMsdu(prAdapter, prMsduInfo);
1018 return WLAN_STATUS_SUCCESS;
1019 } /* end of assocSendReAssocReqFrame() */
1022 /*----------------------------------------------------------------------------*/
1024 * @brief This function will strictly check the TX (Re)Association Request frame for
1025 * SAA event handling.
1027 * @param[in] prMsduInfo Pointer of MSDU_INFO_T
1029 * @retval WLAN_STATUS_FAILURE This is not the frame we should handle at current state.
1030 * @retval WLAN_STATUS_SUCCESS This is the frame we should handle.
1032 /*----------------------------------------------------------------------------*/
1034 assocCheckTxReAssocReqFrame (
1035 IN P_ADAPTER_T prAdapter,
1036 IN P_MSDU_INFO_T prMsduInfo
1039 P_WLAN_ASSOC_REQ_FRAME_T prAssocReqFrame;
1040 P_STA_RECORD_T prStaRec;
1041 UINT_16 u2TxFrameCtrl;
1045 ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1047 prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T)(prMsduInfo->prPacket);
1048 ASSERT(prAssocReqFrame);
1050 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1054 return WLAN_STATUS_INVALID_PACKET;
1057 //WLAN_GET_FIELD_16(&prAssocReqFrame->u2FrameCtrl, &u2TxFrameCtrl)
1058 u2TxFrameCtrl = prAssocReqFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1059 u2TxFrameCtrl &= MASK_FRAME_TYPE;
1060 if (prStaRec->fgIsReAssoc) {
1061 if (u2TxFrameCtrl != MAC_FRAME_REASSOC_REQ) {
1062 return WLAN_STATUS_FAILURE;
1066 if (u2TxFrameCtrl != MAC_FRAME_ASSOC_REQ) {
1067 return WLAN_STATUS_FAILURE;
1071 return WLAN_STATUS_SUCCESS;
1073 } /* end of assocCheckTxReAssocReqFrame() */
1076 /*----------------------------------------------------------------------------*/
1078 * @brief This function will strictly check the TX (Re)Association Response frame for
1079 * AAA event handling.
1081 * @param[in] prMsduInfo Pointer of MSDU_INFO_T
1083 * @retval WLAN_STATUS_FAILURE This is not the frame we should handle at current state.
1084 * @retval WLAN_STATUS_SUCCESS This is the frame we should handle.
1086 /*----------------------------------------------------------------------------*/
1088 assocCheckTxReAssocRespFrame (
1089 IN P_ADAPTER_T prAdapter,
1090 IN P_MSDU_INFO_T prMsduInfo
1093 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1094 P_STA_RECORD_T prStaRec;
1095 UINT_16 u2TxFrameCtrl;
1099 ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1101 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T)(prMsduInfo->prPacket);
1102 ASSERT(prAssocRspFrame);
1104 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1108 return WLAN_STATUS_INVALID_PACKET;
1111 //WLAN_GET_FIELD_16(&prAssocFrame->u2FrameCtrl, &u2TxFrameCtrl)
1112 u2TxFrameCtrl = prAssocRspFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1113 u2TxFrameCtrl &= MASK_FRAME_TYPE;
1114 if (prStaRec->fgIsReAssoc) {
1115 if (u2TxFrameCtrl != MAC_FRAME_REASSOC_RSP) {
1116 return WLAN_STATUS_FAILURE;
1120 if (u2TxFrameCtrl != MAC_FRAME_ASSOC_RSP) {
1121 return WLAN_STATUS_FAILURE;
1125 return WLAN_STATUS_SUCCESS;
1127 } /* end of assocCheckTxReAssocRespFrame() */
1130 /*----------------------------------------------------------------------------*/
1132 * @brief This function will validate the incoming (Re)Association Frame and take out
1135 * @param[in] prSwRfb Pointer to SW RFB data structure.
1136 * @param[out] pu2StatusCode Pointer to store the Status Code from Authentication.
1138 * @retval WLAN_STATUS_FAILURE This is not the frame we should handle at current state.
1139 * @retval WLAN_STATUS_SUCCESS This is the frame we should handle.
1141 /*----------------------------------------------------------------------------*/
1143 assocCheckRxReAssocRspFrameStatus (
1144 IN P_ADAPTER_T prAdapter,
1145 IN P_SW_RFB_T prSwRfb,
1146 OUT PUINT_16 pu2StatusCode
1149 P_STA_RECORD_T prStaRec;
1150 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1151 UINT_16 u2RxFrameCtrl;
1152 UINT_16 u2RxCapInfo;
1153 UINT_16 u2RxStatusCode;
1154 UINT_16 u2RxAssocId;
1158 ASSERT(pu2StatusCode);
1160 if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) < (CAP_INFO_FIELD_LEN +
1161 STATUS_CODE_FIELD_LEN +
1164 return WLAN_STATUS_FAILURE;
1167 DBGLOG(SAA, LOUD, ("prSwRfb->u2PayloadLength = %d\n", prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen));
1169 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1173 return WLAN_STATUS_INVALID_PACKET;
1176 //4 <1> locate the (Re)Assocation Resp Frame.
1177 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prSwRfb->pvHeader;
1179 //4 <2> Parse the Header of (Re)Assocation Resp Frame.
1180 //WLAN_GET_FIELD_16(&prAssocRspFrame->u2FrameCtrl, &u2RxFrameCtrl);
1181 u2RxFrameCtrl = prAssocRspFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1182 u2RxFrameCtrl &= MASK_FRAME_TYPE;
1183 if (prStaRec->fgIsReAssoc) {
1184 if (u2RxFrameCtrl != MAC_FRAME_REASSOC_RSP) {
1185 return WLAN_STATUS_FAILURE;
1189 if (u2RxFrameCtrl != MAC_FRAME_ASSOC_RSP) {
1190 return WLAN_STATUS_FAILURE;
1194 //4 <3> Parse the Fixed Fields of (Re)Assocation Resp Frame Body.
1195 //WLAN_GET_FIELD_16(&prAssocRspFrame->u2CapInfo, &u2RxCapInfo);
1196 u2RxCapInfo = prAssocRspFrame->u2CapInfo; // NOTE(Kevin): Optimized for ARM
1198 //WLAN_GET_FIELD_16(&prAssocRspFrame->u2StatusCode, &u2RxStatusCode);
1199 u2RxStatusCode = prAssocRspFrame->u2StatusCode; // NOTE(Kevin): Optimized for ARM
1201 //4 <4> Check CAP_INFO
1202 /* NOTE(Kevin): CM suggest to add MGMT workaround for those APs didn't check
1203 * the CAP Privacy Bit to overcome a corner case that the Privacy Bit
1204 * of our SCAN result didn't consist with AP's Association Resp.
1206 if (u2RxStatusCode == STATUS_CODE_SUCCESSFUL) {
1207 #if CFG_SUPPORT_WAPI
1208 if (prAdapter->rWifiVar.rConnSettings.fgWapiMode) {
1209 /* WAPI AP allow the customer use WZC to join mode, the privacy bit is 0 */
1210 /* even at WAI & WAPI_PSK mode, but the assoc respose set the privacy bit set 1 */
1211 DBGLOG(SEC, TRACE, ("Workaround the WAPI AP allow the customer to use WZC to join\n"));
1215 #if CFG_ENABLE_WIFI_DIRECT
1216 if (prAdapter->fgIsP2PRegistered && 1) {
1217 /* Todo:: Fixed this */
1224 #if CFG_STRICT_CHECK_CAPINFO_PRIVACY
1225 if ((prStaRec->u2CapInfo & CAP_INFO_PRIVACY) ^ (u2RxCapInfo & CAP_INFO_PRIVACY)) {
1226 u2RxStatusCode = STATUS_CODE_CAP_NOT_SUPPORTED;
1231 if (u2RxStatusCode == STATUS_CODE_SUCCESSFUL) {
1232 #if CFG_RSN_MIGRATION
1233 /* Update the information in the structure used to query and set
1234 OID_802_11_ASSOCIATION_INFORMATION. */
1235 kalUpdateReAssocRspInfo(prAdapter->prGlueInfo,
1236 (PUINT_8)&prAssocRspFrame->u2CapInfo,
1237 (UINT_32)(prSwRfb->u2PacketLen));
1241 //4 <5> Update CAP_INFO and ASSOC_ID
1242 if (u2RxStatusCode == STATUS_CODE_SUCCESSFUL) {
1243 prStaRec->u2CapInfo = u2RxCapInfo;
1245 //WLAN_GET_FIELD_16(&prAssocRspFrame->u2AssocId, &u2RxAssocId);
1246 u2RxAssocId = prAssocRspFrame->u2AssocId; // NOTE(Kevin): Optimized for ARM
1248 /* 20110715 Workaround for Kingnet 710 AP (Realtek 8186)
1249 * This AP raises the bit 6&7 not bit 14&15 in AID field.
1250 * It cause wrong AID assignment.
1252 * Normal case: 0xC002(1100 0000 0000 0010) => 2
1253 * Kingnet 710: 0x00C2(0000 0000 1100 0010) => 194
1254 * workaround: mask bit 6&7 for this AP
1256 if((u2RxAssocId & BIT(6)) &&
1257 (u2RxAssocId & BIT(7)) &&
1258 !(u2RxAssocId & BITS(8, 15))) {
1259 prStaRec->u2AssocId = u2RxAssocId & ~BITS(6,7);
1261 prStaRec->u2AssocId = u2RxAssocId & ~AID_MSB;
1262 #if CFG_SUPPORT_802_11W
1263 if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX) {
1264 P_AIS_SPECIFIC_BSS_INFO_T prBssSpecInfo;
1266 prBssSpecInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
1267 ASSERT(prBssSpecInfo);
1269 prBssSpecInfo->ucSaQueryTimedOut = 0;
1275 #if CFG_SUPPORT_802_11W
1276 if (u2RxStatusCode == STATUS_CODE_AUTH_ALGORITHM_NOT_SUPPORTED){
1277 DBGLOG(SAA, INFO, ("AP rejected due the authentication algorithm not support\n"));
1279 else if (u2RxStatusCode == STATUS_CODE_ASSOC_REJECTED_TEMPORARILY) {
1280 PUINT_8 pucIE, pucTime;
1282 UINT_16 u2Offset = 0;
1284 u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
1285 pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
1287 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1288 if (ELEM_ID_TIMEOUT_INTERVAL == IE_ID(pucIE) && IE_LEN(pucIE) == 5) {
1289 pucTime = ((P_IE_HDR_T)pucIE)->aucInfo;
1290 if (pucTime[0] == ACTION_SA_TIMEOUT_ASSOC_COMEBACK) {
1292 WLAN_GET_FIELD_32(pucTime + 1, &tu);
1293 DBGLOG(SAA, INFO, ("AP rejected association temporarily; comeback duration %u TU "
1294 "(%u ms)\n", tu, TU_TO_MSEC(tu)));
1295 if (tu > TX_ASSOCIATION_RETRY_TIMEOUT_TU) {
1296 DBGLOG(SAA, INFO, ("Update timer based on comeback duration\n"));
1297 //ieee80211_reschedule_timer(wpa_s, ms);
1302 } /* end of IE_FOR_EACH */
1305 *pu2StatusCode = u2RxStatusCode;
1307 return WLAN_STATUS_SUCCESS;
1309 } /* end of assocCheckRxReAssocRspFrameStatus() */
1312 /*----------------------------------------------------------------------------*/
1314 * \brief This function will compose the Disassociation frame
1316 * @param[in] prStaRec Pointer to the STA_RECORD_T
1317 * @param[in] pucBuffer Pointer to the frame buffer.
1318 * @param[in] aucMACAddress Given Our MAC Address.
1319 * @param[in] u2ReasonCode The reason code of disassociation
1323 /*----------------------------------------------------------------------------*/
1325 assocComposeDisassocFrame (
1326 IN P_STA_RECORD_T prStaRec,
1327 IN PUINT_8 pucBuffer,
1328 IN UINT_8 aucMACAddress[],
1329 IN UINT_16 u2ReasonCode
1332 P_WLAN_DISASSOC_FRAME_T prDisAssocFrame;
1333 UINT_16 u2FrameCtrl;
1337 ASSERT(aucMACAddress);
1339 prDisAssocFrame = (P_WLAN_DISASSOC_FRAME_T)pucBuffer;
1341 //4 <1> Compose the frame header of the DisAssociation frame.
1342 /* Fill the Frame Control field. */
1343 u2FrameCtrl = MAC_FRAME_DISASSOC;
1345 WLAN_SET_FIELD_16(&prDisAssocFrame->u2FrameCtrl, u2FrameCtrl);
1347 /* Fill the DA field with Target BSSID. */
1348 COPY_MAC_ADDR(prDisAssocFrame->aucDestAddr, prStaRec->aucMacAddr);
1350 /* Fill the SA field with our MAC Address. */
1351 COPY_MAC_ADDR(prDisAssocFrame->aucSrcAddr, aucMACAddress);
1353 /* Fill the BSSID field with Target BSSID. */
1354 COPY_MAC_ADDR(prDisAssocFrame->aucBSSID, prStaRec->aucMacAddr);
1356 /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
1357 prDisAssocFrame->u2SeqCtrl = 0;
1359 //4 <2> Compose the frame body's fixed field part of the Disassociation frame.
1360 /* Fill the Reason Code field. */
1361 WLAN_SET_FIELD_16(&prDisAssocFrame->u2ReasonCode, u2ReasonCode);
1364 } /* end of assocComposeDisassocFrame() */
1367 /*----------------------------------------------------------------------------*/
1369 * @brief This function will send the Disassociation frame
1371 * @param[in] prStaRec Pointer to the STA_RECORD_T
1372 * @param[in] u2ReasonCode The reason code of disassociation
1374 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
1375 * @retval WLAN_STATUS_SUCCESS Successfully send frame to TX Module
1377 /*----------------------------------------------------------------------------*/
1379 assocSendDisAssocFrame (
1380 IN P_ADAPTER_T prAdapter,
1381 IN P_STA_RECORD_T prStaRec,
1382 IN UINT_16 u2ReasonCode
1385 PUINT_8 pucMacAddress;
1386 P_MSDU_INFO_T prMsduInfo;
1387 UINT_16 u2PayloadLen;
1388 UINT_16 u2EstimatedFrameLen;
1389 //UINT_32 u4Status = WLAN_STATUS_SUCCESS;
1394 //4 <1> Allocate a PKT_INFO_T for Disassociation Frame
1395 /* Init with MGMT Header Length + Length of Fixed Fields + IE Length */
1396 u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
1397 WLAN_MAC_MGMT_HEADER_LEN + \
1398 REASON_CODE_FIELD_LEN;
1400 /* Allocate a MSDU_INFO_T */
1401 if ( (prMsduInfo = cnmMgtPktAlloc(prAdapter, u2EstimatedFrameLen)) == NULL) {
1402 DBGLOG(SAA, WARN, ("No PKT_INFO_T for sending DisAssoc.\n"));
1403 return WLAN_STATUS_RESOURCES;
1406 //4 <2> Compose Disassociation frame header and fixed fields in MSDU_INfO_T.
1407 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1409 pucMacAddress = prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex].aucOwnMacAddr;
1411 /* Compose Header and Fixed Field */
1412 assocComposeDisassocFrame(prStaRec,
1413 (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
1417 #if CFG_SUPPORT_802_11W
1418 if (rsnCheckBipKeyInstalled(prAdapter, prStaRec)) {
1419 P_WLAN_DISASSOC_FRAME_T prDisassocFrame;
1421 prDisassocFrame = (P_WLAN_DEAUTH_FRAME_T)(PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
1423 prDisassocFrame->u2FrameCtrl |= MASK_FC_PROTECTED_FRAME;
1424 DBGLOG(TX, WARN, ("assocSendDisAssocFrame with protection\n"));
1428 u2PayloadLen = REASON_CODE_FIELD_LEN;
1430 //4 <3> Update information of MSDU_INFO_T
1431 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1433 prMsduInfo->eSrc = TX_PACKET_MGMT;
1434 prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;
1435 prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
1436 prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
1437 prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
1438 prMsduInfo->fgIs802_1x = FALSE;
1439 prMsduInfo->fgIs802_11 = TRUE;
1440 prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
1441 prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
1442 prMsduInfo->pfTxDoneHandler = NULL;
1443 prMsduInfo->fgIsBasicRate = TRUE;
1445 //4 <4> Enqueue the frame to send this (Re)Association request frame.
1446 nicTxEnqueueMsdu(prAdapter, prMsduInfo);
1448 return WLAN_STATUS_SUCCESS;
1449 } /* end of assocSendDisAssocFrame() */
1452 /*----------------------------------------------------------------------------*/
1454 * @brief This function will parse and process the incoming Disassociation frame
1455 * if the given BSSID is matched.
1457 * @param[in] prSwRfb Pointer to SW RFB data structure.
1458 * @param[in] aucBSSID Given BSSID
1459 * @param[out] pu2ReasonCode Pointer to store the Reason Code from Deauthentication.
1461 * @retval WLAN_STATUS_FAILURE This is not the frame we should handle at current state.
1462 * @retval WLAN_STATUS_SUCCESS This is the frame we should handle.
1464 /*----------------------------------------------------------------------------*/
1466 assocProcessRxDisassocFrame (
1467 IN P_ADAPTER_T prAdapter,
1468 IN P_SW_RFB_T prSwRfb,
1469 IN UINT_8 aucBSSID[],
1470 OUT PUINT_16 pu2ReasonCode
1473 P_WLAN_DISASSOC_FRAME_T prDisassocFrame;
1474 UINT_16 u2RxReasonCode;
1479 ASSERT(pu2ReasonCode);
1481 //4 <1> locate the Disassociation Frame.
1482 prDisassocFrame = (P_WLAN_DISASSOC_FRAME_T) prSwRfb->pvHeader;
1484 //4 <2> Parse the Header of Disassociation Frame.
1485 if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) < REASON_CODE_FIELD_LEN) {
1487 return WLAN_STATUS_FAILURE;
1490 /* Check if this Disassoc Frame is coming from Target BSSID */
1491 if (UNEQUAL_MAC_ADDR(prDisassocFrame->aucBSSID, aucBSSID)) {
1492 DBGLOG(SAA, LOUD, ("Ignore Disassoc Frame from other BSS ["MACSTR"]\n",
1493 MAC2STR(prDisassocFrame->aucSrcAddr)));
1494 return WLAN_STATUS_FAILURE;
1497 //4 <3> Parse the Fixed Fields of Deauthentication Frame Body.
1498 WLAN_GET_FIELD_16(&prDisassocFrame->u2ReasonCode, &u2RxReasonCode);
1499 *pu2ReasonCode = u2RxReasonCode;
1501 return WLAN_STATUS_SUCCESS;
1503 } /* end of assocProcessRxDisassocFrame() */
1507 /*----------------------------------------------------------------------------*/
1509 * @brief This function will parse and process the incoming Association Req frame
1510 * and return a Status Code.
1512 * @param[in] prAdapter Pointer to the Adapter structure.
1513 * @param[in] prSwRfb Pointer to SW RFB data structure.
1514 * @param[out] pu2StatusCode Pointer to store the Status Code for carried in Association Response.
1516 * @retval WLAN_STATUS_FAILURE This is not the frame we should handle at current state.
1517 * @retval WLAN_STATUS_SUCCESS This is the frame we should handle.
1519 /*----------------------------------------------------------------------------*/
1521 assocProcessRxAssocReqFrame (
1522 IN P_ADAPTER_T prAdapter,
1523 IN P_SW_RFB_T prSwRfb,
1524 OUT PUINT_16 pu2StatusCode
1527 P_WLAN_ASSOC_REQ_FRAME_T prAssocReqFrame;
1528 P_STA_RECORD_T prStaRec;
1529 P_BSS_INFO_T prBssInfo;
1530 P_IE_SSID_T prIeSsid = (P_IE_SSID_T)NULL;
1531 P_RSN_INFO_ELEM_T prIeRsn = (P_RSN_INFO_ELEM_T)NULL;
1532 P_IE_SUPPORTED_RATE_T prIeSupportedRate = (P_IE_SUPPORTED_RATE_T)NULL;
1533 P_IE_EXT_SUPPORTED_RATE_T prIeExtSupportedRate = (P_IE_EXT_SUPPORTED_RATE_T)NULL;
1534 PUINT_8 pucIE, pucIEStart;
1536 UINT_16 u2Offset = 0;
1537 UINT_16 u2StatusCode = STATUS_CODE_SUCCESSFUL;
1538 UINT_16 u2RxFrameCtrl;
1539 UINT_16 u2BSSBasicRateSet;
1540 BOOLEAN fgIsUnknownBssBasicRate;
1542 UINT_8 ucFixedFieldLength;
1547 ASSERT(pu2StatusCode);
1549 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1551 if (prStaRec == NULL) {
1552 return WLAN_STATUS_FAILURE;
1555 //4 <1> locate the Association Req Frame.
1556 prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T) prSwRfb->pvHeader;
1558 //WLAN_GET_FIELD_16(&prAssocReqFrame->u2FrameCtrl, &u2RxFrameCtrl);
1559 u2RxFrameCtrl = prAssocReqFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1560 u2RxFrameCtrl &= MASK_FRAME_TYPE;
1562 //4 <2> Parse the Header of Association Req Frame.
1563 if (MAC_FRAME_REASSOC_REQ == u2RxFrameCtrl) {
1564 ucFixedFieldLength = CAP_INFO_FIELD_LEN + LISTEN_INTERVAL_FIELD_LEN + CURR_AP_ADDR_FIELD_LEN;
1567 ucFixedFieldLength = CAP_INFO_FIELD_LEN + LISTEN_INTERVAL_FIELD_LEN;
1570 if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) <= ucFixedFieldLength) {
1571 /* Length of this (re)association req is invalid, ignore it */
1572 return WLAN_STATUS_FAILURE;
1575 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
1577 /* Check if this Disassoc Frame is coming from Target BSSID */
1578 if (UNEQUAL_MAC_ADDR(prAssocReqFrame->aucBSSID, prBssInfo->aucBSSID)) {
1579 return WLAN_STATUS_FAILURE; /* Just Ignore this MMPDU */
1582 if (MAC_FRAME_REASSOC_REQ == u2RxFrameCtrl) {
1583 prStaRec->fgIsReAssoc = TRUE;
1585 u2IELength = (prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) -
1586 (UINT_16)(OFFSET_OF(WLAN_REASSOC_REQ_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN);
1588 pucIEStart = pucIE = ((P_WLAN_REASSOC_REQ_FRAME_T)(prSwRfb->pvHeader))->aucInfoElem;
1591 prStaRec->fgIsReAssoc = FALSE;
1593 u2IELength = (prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) -
1594 (UINT_16)(OFFSET_OF(WLAN_ASSOC_REQ_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN);
1596 pucIEStart = pucIE = prAssocReqFrame->aucInfoElem;
1600 //4 <3> Parse the Fixed Fields of Assoc Req Frame Body.
1601 prStaRec->u2CapInfo = prAssocReqFrame->u2CapInfo;
1603 #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_HOTSPOT_PRIVACY_CHECK
1604 if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1605 if (((prStaRec->u2CapInfo & CAP_INFO_PRIVACY) &&
1606 !kalP2PGetCipher(prAdapter->prGlueInfo))) {
1607 u2StatusCode = STATUS_CODE_CAP_NOT_SUPPORTED;
1608 DBGLOG(RSN, TRACE, ("STA Assoc req privacy bit check fail\n"));
1609 return WLAN_STATUS_SUCCESS;
1614 prStaRec->u2ListenInterval = prAssocReqFrame->u2ListenInterval;
1615 prStaRec->ucPhyTypeSet = 0;
1617 /* Might be legacy client or p2p gc. */
1618 prStaRec->eStaType = STA_TYPE_LEGACY_CLIENT;
1620 //4 <4> Parse the IE of Assoc Req Frame Body.
1621 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1622 switch (IE_ID(pucIE)) {
1624 if ((!prIeSsid) && /* NOTE(Kevin): Get SSID once */
1625 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
1626 prIeSsid = (P_IE_SSID_T)pucIE;
1630 case ELEM_ID_SUP_RATES:
1631 if ((!prIeSupportedRate) && (IE_LEN(pucIE) <= RATE_NUM)) {
1632 prIeSupportedRate = SUP_RATES_IE(pucIE);
1636 case ELEM_ID_EXTENDED_SUP_RATES:
1637 if (!prIeExtSupportedRate)
1638 prIeExtSupportedRate = EXT_SUP_RATES_IE(pucIE);
1640 case ELEM_ID_HT_CAP:
1641 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HT;
1642 kalMemCopy(&prStaRec->u2HtCapInfo, &(HT_CAP_IE(pucIE)->u2HtCapInfo), 2);
1645 #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_HOTSPOT_PRIVACY_CHECK
1646 if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1647 prIeRsn = RSN_IE(pucIE);
1648 rsnParserCheckForRSNCCMPPSK(prAdapter, prIeRsn, &u2StatusCode);
1649 if (u2StatusCode != STATUS_CODE_SUCCESSFUL) {
1650 *pu2StatusCode = u2StatusCode;
1651 return WLAN_STATUS_SUCCESS;
1656 case ELEM_ID_VENDOR:
1657 #if CFG_ENABLE_WIFI_DIRECT
1659 if ((prAdapter->fgIsP2PRegistered)) {
1660 UINT_8 ucOuiType = 0;
1662 p2pFuncParseCheckForP2PInfoElem(prAdapter, pucIE, &ucOuiType);
1664 if (ucOuiType == VENDOR_OUI_TYPE_P2P) {
1665 DBGLOG(P2P, TRACE, ("Target Client is a P2P group client\n"));
1666 prStaRec->eStaType = STA_TYPE_P2P_GC;
1673 for (i = 0; i < (sizeof(rxAssocReqIETable) / sizeof(VERIFY_IE_ENTRY_T)); i++) {
1675 if (((IE_ID(pucIE)) == rxAssocReqIETable[i].ucElemID) &&
1676 (rxAssocReqIETable[i].pfnVarifyIE != NULL)) {
1677 rxAssocReqIETable[i].pfnVarifyIE(prAdapter, prSwRfb, (P_IE_HDR_T)pucIE, &u2StatusCode);
1679 if (u2StatusCode != STATUS_CODE_SUCCESSFUL) {
1680 *pu2StatusCode = u2StatusCode;
1681 return WLAN_STATUS_SUCCESS;
1688 } /* end of IE_FOR_EACH */
1690 // parsing for WMM related information (2010/12/21)
1699 if (UNEQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen,
1700 prIeSsid->aucSSID, prIeSsid->ucLength)) {
1702 u2StatusCode = STATUS_CODE_UNSPECIFIED_FAILURE;
1707 u2StatusCode = STATUS_CODE_UNSPECIFIED_FAILURE;
1711 prStaRec->u2OperationalRateSet = 0;
1712 prStaRec->u2BSSBasicRateSet = 0;
1714 if (prIeSupportedRate || prIeExtSupportedRate) {
1715 rateGetRateSetFromIEs(prIeSupportedRate,
1716 prIeExtSupportedRate,
1717 &prStaRec->u2OperationalRateSet,
1718 &u2BSSBasicRateSet, /* Ignore any Basic Bit */
1719 &fgIsUnknownBssBasicRate);
1721 if ((prBssInfo->u2BSSBasicRateSet & prStaRec->u2OperationalRateSet) !=
1722 prBssInfo->u2BSSBasicRateSet) {
1724 u2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
1728 /* Accpet the Sta, update BSSBasicRateSet from Bss */
1730 prStaRec->u2BSSBasicRateSet = prBssInfo->u2BSSBasicRateSet;
1732 prStaRec->u2DesiredNonHTRateSet = (prStaRec->u2OperationalRateSet & RATE_SET_ALL_ABG);
1734 if (BAND_2G4 == HIF_RX_HDR_GET_RF_BAND(prSwRfb->prHifRxHdr)) {
1735 #if 0 /* Marked by CMC 20111024 */
1736 /* check if support 11n */
1737 if (!(u2BSSBasicRateSet & RATE_SET_BIT_HT_PHY)) {
1739 if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1740 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_ERP;
1744 if (!(u2BSSBasicRateSet & RATE_SET_OFDM)) {
1745 if (prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) {
1746 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HR_DSSS;
1753 if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1754 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_ERP;
1756 if (prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) {
1757 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HR_DSSS;
1761 else { /* (BAND_5G == prBssDesc->eBande) */
1762 #if 0 /* Marked by CMC 20111024 */
1763 if (!(u2BSSBasicRateSet & RATE_SET_BIT_HT_PHY)) {
1765 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_OFDM;
1767 ASSERT((prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) == 0);
1769 if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1770 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_OFDM;
1778 u2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
1782 #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_HOTSPOT_PRIVACY_CHECK
1783 if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1785 if (!kalP2PGetCipher(prAdapter->prGlueInfo)) {
1786 u2StatusCode = STATUS_CODE_CIPHER_SUITE_REJECTED;
1791 prStaRec->rSecInfo.fgAllowOnly1x = FALSE;
1792 if (kalP2PGetCipher(prAdapter->prGlueInfo)) {
1794 prStaRec->rSecInfo.fgAllowOnly1x = TRUE;
1803 #if CFG_ENABLE_WIFI_DIRECT
1804 if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1807 PUINT_8 cp = (PUINT_8)&prAssocReqFrame->u2CapInfo;
1808 if (prStaRec->fgIsReAssoc)
1812 if (prStaRec->pucAssocReqIe) {
1813 kalMemFree(prStaRec->pucAssocReqIe, VIR_MEM_TYPE, prStaRec->u2AssocReqIeLen);
1814 prStaRec->pucAssocReqIe = NULL;
1816 prStaRec->u2AssocReqIeLen = u2IELength;
1818 prStaRec->pucAssocReqIe = kalMemAlloc(u2IELength, VIR_MEM_TYPE);
1819 kalMemCopy(prStaRec->pucAssocReqIe, cp, u2IELength);
1823 kalP2PUpdateAssocInfo(prAdapter->prGlueInfo, (PUINT_8)&prAssocReqFrame->u2CapInfo, u2IELength + (prStaRec->fgIsReAssoc ? 10 : 4), prStaRec->fgIsReAssoc);
1827 *pu2StatusCode = u2StatusCode;
1829 return WLAN_STATUS_SUCCESS;
1831 } /* end of assocProcessRxAssocReqFrame() */
1834 /*----------------------------------------------------------------------------*/
1836 * @brief This function is used to compose Common Information Elements for Association
1839 * @param[in] prMsduInfo Pointer to the composed MSDU_INFO_T.
1840 * @param[in] prBssInfo Pointer to the BSS_INFO_T.
1844 /*----------------------------------------------------------------------------*/
1846 assocBuildReAssocRespFrameCommonIEs (
1847 IN P_ADAPTER_T prAdapter,
1848 IN P_MSDU_INFO_T prMsduInfo,
1849 IN P_BSS_INFO_T prBssInfo
1853 P_STA_RECORD_T prStaRec;
1854 UINT_8 ucSupRatesLen;
1855 UINT_8 ucExtSupRatesLen;
1859 ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1861 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1865 pucBuffer = (PUINT_8)((UINT_32)prMsduInfo->prPacket +
1866 (UINT_32)prMsduInfo->u2FrameLength);
1869 if (prBssInfo->ucAllSupportedRatesLen > ELEM_MAX_LEN_SUP_RATES) {
1871 ucSupRatesLen = ELEM_MAX_LEN_SUP_RATES;
1872 ucExtSupRatesLen = prBssInfo->ucAllSupportedRatesLen - ELEM_MAX_LEN_SUP_RATES;
1875 ucSupRatesLen = prBssInfo->ucAllSupportedRatesLen;
1876 ucExtSupRatesLen = 0;
1879 /* Fill the Supported Rates element. */
1880 if (ucSupRatesLen) {
1881 SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_SUP_RATES;
1882 SUP_RATES_IE(pucBuffer)->ucLength = ucSupRatesLen;
1883 kalMemCopy(SUP_RATES_IE(pucBuffer)->aucSupportedRates,
1884 prBssInfo->aucAllSupportedRates,
1887 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
1888 pucBuffer += IE_SIZE(pucBuffer);
1892 /* Fill the Extended Supported Rates element. */
1893 if (ucExtSupRatesLen) {
1895 EXT_SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_EXTENDED_SUP_RATES;
1896 EXT_SUP_RATES_IE(pucBuffer)->ucLength = ucExtSupRatesLen;
1898 kalMemCopy(EXT_SUP_RATES_IE(pucBuffer)->aucExtSupportedRates,
1899 &prBssInfo->aucAllSupportedRates[ucSupRatesLen],
1902 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
1906 } /* end of assocBuildReAssocRespFrameCommonIEs() */
1909 /*----------------------------------------------------------------------------*/
1911 * @brief This function will compose the (Re)Association Response frame
1913 * @param[in] prStaRec Pointer to the STA_RECORD_T
1914 * @param[in] pucBuffer Pointer to the frame buffer.
1915 * @param[in] aucBssid Given BSSID.
1916 * @param[in] u2CapInfo Capability Field of current BSS.
1917 * @param[in out] pu2PayloadLen Return the length of the composed fixed fields
1921 /*----------------------------------------------------------------------------*/
1923 assocComposeReAssocRespFrameHeaderAndFF (
1924 IN P_STA_RECORD_T prStaRec,
1925 IN PUINT_8 pucBuffer,
1926 IN UINT_8 aucBSSID[],
1927 IN UINT_16 u2CapInfo,
1928 IN OUT PUINT_16 pu2PayloadLen
1931 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1932 BOOLEAN fgIsReAssoc;
1934 UINT_16 u2FrameCtrl;
1940 ASSERT(pu2PayloadLen);
1942 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T)pucBuffer;
1943 fgIsReAssoc = prStaRec->fgIsReAssoc;
1945 //4 <1> Compose the frame header of the (Re)Association Request frame.
1946 /* Fill the Frame Control field. */
1948 u2FrameCtrl = MAC_FRAME_REASSOC_RSP;
1951 u2FrameCtrl = MAC_FRAME_ASSOC_RSP;
1953 //WLAN_SET_FIELD_16(&prAssocFrame->u2FrameCtrl, u2FrameCtrl);
1954 prAssocRspFrame->u2FrameCtrl = u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1956 /* Fill the DA field with Target MAC Address. */
1957 COPY_MAC_ADDR(prAssocRspFrame->aucDestAddr, prStaRec->aucMacAddr);
1959 /* Fill the SA field with current BSSID. */
1960 COPY_MAC_ADDR(prAssocRspFrame->aucSrcAddr, aucBSSID);
1962 /* Fill the BSSID field with current BSSID. */
1963 COPY_MAC_ADDR(prAssocRspFrame->aucBSSID, aucBSSID);
1965 /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
1966 prAssocRspFrame->u2SeqCtrl = 0;
1969 //4 <2> Compose the frame body's common fixed field part of the (Re)Association Request frame.
1970 /* Fill the Capability Information field. */
1971 //WLAN_SET_FIELD_16(&prAssocFrame->u2CapInfo, u2CapInfo);
1972 prAssocRspFrame->u2CapInfo = u2CapInfo; // NOTE(Kevin): Optimized for ARM
1974 //WLAN_SET_FIELD_16(&prAssocFrame->u2StatusCode, prStaRec->u2StatusCode);
1975 prAssocRspFrame->u2StatusCode = prStaRec->u2StatusCode; // NOTE(Kevin): Optimized for ARM
1977 //WLAN_SET_FIELD_16(&prAssocFrame->u2AssocId, ((prStaRec->u2AssocId & AID_MASK) | AID_MSB));
1978 prAssocRspFrame->u2AssocId =
1979 ((prStaRec->u2AssocId & AID_MASK) | AID_MSB); // NOTE(Kevin): Optimized for ARM
1981 *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
1982 STATUS_CODE_FIELD_LEN +
1986 } /* end of assocComposeReAssocRespFrameHeaderAndFF() */
1989 /*----------------------------------------------------------------------------*/
1991 * @brief This function will send the (Re)Association Resp frame
1993 * @param[in] prStaRec Pointer to the STA_RECORD_T
1995 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
1996 * @retval WLAN_STATUS_SUCCESS Successfully send frame to TX Module
1998 /*----------------------------------------------------------------------------*/
2000 assocSendReAssocRespFrame (
2001 IN P_ADAPTER_T prAdapter,
2002 IN P_STA_RECORD_T prStaRec
2005 P_BSS_INFO_T prBssInfo;
2006 P_MSDU_INFO_T prMsduInfo;
2008 UINT_16 u2PayloadLen;
2009 UINT_16 u2EstimatedFrameLen;
2010 UINT_16 u2EstimatedExtraIELen;
2011 BOOLEAN fgIsReAssoc;
2018 //4 <1> Allocate a PKT_INFO_T for Authentication Frame
2019 fgIsReAssoc = prStaRec->fgIsReAssoc;
2021 /* Init with MGMT Header Length + Length of Fixed Fields + Common IE Length */
2022 u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
2023 WLAN_MAC_MGMT_HEADER_LEN + \
2024 CAP_INFO_FIELD_LEN + \
2025 STATUS_CODE_FIELD_LEN + \
2027 (ELEM_HDR_LEN + ELEM_MAX_LEN_SUP_RATES) + \
2028 (ELEM_HDR_LEN + (RATE_NUM - ELEM_MAX_LEN_SUP_RATES));
2030 /* + Extra IE Length */
2031 u2EstimatedExtraIELen = 0;
2033 for (i = 0; i < sizeof(txAssocRespIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
2034 if (txAssocRespIETable[i].u2EstimatedFixedIELen != 0) {
2035 u2EstimatedExtraIELen += txAssocRespIETable[i].u2EstimatedFixedIELen;
2037 else if (txAssocRespIETable[i].pfnCalculateVariableIELen != NULL) {
2038 u2EstimatedExtraIELen += (UINT_16)txAssocRespIETable[i].pfnCalculateVariableIELen(prAdapter,
2039 prStaRec->ucNetTypeIndex,
2045 u2EstimatedFrameLen += u2EstimatedExtraIELen;
2047 /* Allocate a MSDU_INFO_T */
2048 if ( (prMsduInfo = cnmMgtPktAlloc(prAdapter, u2EstimatedFrameLen)) == NULL) {
2049 DBGLOG(AAA, WARN, ("No PKT_INFO_T for sending (Re)Assoc Response.\n"));
2050 return WLAN_STATUS_RESOURCES;
2053 //4 <2> Compose (Re)Association Request frame header and fixed fields in MSDU_INfO_T.
2054 ASSERT(prStaRec->ucNetTypeIndex != NETWORK_TYPE_AIS_INDEX);
2055 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
2057 /* Compose Header and Fixed Field */
2058 assocComposeReAssocRespFrameHeaderAndFF(prStaRec,
2059 (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
2060 prBssInfo->aucBSSID,
2061 prBssInfo->u2CapInfo,
2064 //4 <3> Update information of MSDU_INFO_T
2065 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
2067 prMsduInfo->eSrc = TX_PACKET_MGMT;
2068 prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;
2069 prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
2070 prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
2071 prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
2072 prMsduInfo->fgIs802_1x = FALSE;
2073 prMsduInfo->fgIs802_11 = TRUE;
2074 prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
2075 prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
2076 prMsduInfo->pfTxDoneHandler = aaaFsmRunEventTxDone;
2077 prMsduInfo->fgIsBasicRate = TRUE;
2079 //4 <4> Compose the frame body's IEs of the (Re)Association Request frame.
2080 assocBuildReAssocRespFrameCommonIEs(prAdapter, prMsduInfo, prBssInfo);
2083 //4 <5> Compose IEs in MSDU_INFO_T
2086 for (i = 0; i < sizeof(txAssocRespIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
2087 if (txAssocRespIETable[i].pfnAppendIE) {
2088 txAssocRespIETable[i].pfnAppendIE(prAdapter, prMsduInfo);
2092 /* TODO(Kevin): Also release the unused tail room of the composed MMPDU */
2094 //4 <6> Enqueue the frame to send this (Re)Association request frame.
2095 nicTxEnqueueMsdu(prAdapter, prMsduInfo);
2097 return WLAN_STATUS_SUCCESS;
2099 } /* end of assocSendReAssocRespFrame() */
2100 #endif /* CFG_SUPPORT_AAA */