2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/assoc.c#3 $
6 \brief This file includes the association-related functions.
8 This file includes the association-related functions.
16 ** 07 27 2012 yuche.tsai
17 ** [ALPS00324337] [ALPS.JB][Hot-Spot] Driver update for Hot-Spot
18 ** Fix wifi direct connection issue.
20 * 07 17 2012 yuche.tsai
22 * Let netdev bring up.
24 * 07 17 2012 yuche.tsai
26 * Compile no error before trial run.
28 * 06 13 2012 yuche.tsai
30 * Update maintrunk driver.
31 * Add support for driver compose assoc request frame.
34 * [WCXRP00001245] [MT6620 Wi-Fi][Driver][Firmware] NPS Software Development
35 * add a pair of brace for compilation success.
38 * [WCXRP00001245] [MT6620 Wi-Fi][Driver][Firmware] NPS Software Development
39 * 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
42 * [WCXRP00001173] [MT6620 Wi-Fi][Driver] Adding the ICS Tethering WPA2-PSK supporting
51 * Sync CFG80211 modification from branch 2,2.
53 * 01 16 2012 yuche.tsai
55 * Update Driver for wifi driect gc join IE update issue.
58 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
59 * change the debug module level.
62 * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
63 * Fix PhyTypeSet in STA_REC in AP mode
66 * [WCXRP00001036] [MT6620 Wi-Fi][Driver][FW] Adding the 802.11w code for MFP
67 * adding the 802.11w related function and define .
69 * 09 19 2011 yuche.tsai
71 * Fix KE when enable hot-spot & any one client connect to this hot-spot.
73 * 09 14 2011 yuche.tsai
75 * Add P2P IE in assoc response.
78 * [WCXRP00000855] [MT6620 Wi-Fi] [Driver] Workaround for Kingnet 710 AP wrong AID assignment
79 * Update workaround for Kingnet AP.
82 * [WCXRP00000855] [MT6620 Wi-Fi] [Driver] Workaround for Kingnet 710 AP wrong AID assignment
83 * Workaround for Kingnet 710 AP wrong AID assignment.
85 * 05 02 2011 eddie.chen
86 * [WCXRP00000603] [MT6620 Wi-Fi][DRV] Fix Klocwork warning[WCXRP00000672] [MT6620 Wi-Fi][FW] Fix the PS event allocation
87 * Check STA when rx assoc.
90 * [WCXRP00000660] [MT6620 Wi-Fi][Driver] Remove flag CFG_WIFI_DIRECT_MOVED
91 * Remove flag CFG_WIFI_DIRECT_MOVED.
93 * 03 19 2011 yuche.tsai
94 * [WCXRP00000581] [Volunteer Patch][MT6620][Driver] P2P IE in Assoc Req Issue
95 * Make assoc req to append P2P IE if wifi direct is enabled.
97 * 03 17 2011 chinglan.wang
98 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
102 * [WCXRP00000530] [MT6620 Wi-Fi] [Driver] skip doing p2pRunEventAAAComplete after send assoc response Tx Done
103 * enable the protected while at P2P start GO, and skip some security check .
106 * [WCXRP00000545] [MT6620 Wi-Fi] [Driver] Fixed the p2p not enable, received a assoc rsp cause the rx assoc execute a null function
107 * Modify file for avoid assert at BOW recieve a assoc response frame but no p2p fucntion.
109 * 03 08 2011 terry.wu
110 * [WCXRP00000524] [MT6620 Wi-Fi][Driver] Fix p2p assoc request containing wrong IE format
111 * Fix p2p assoc request containing wrong IE format.
114 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
115 * add code to let the beacon and probe response for Auto GO WSC .
117 * 02 15 2011 yuche.tsai
118 * [WCXRP00000431] [Volunteer Patch][MT6620][Driver] Add MLME support for deauthentication under AP(Hot-Spot) mode.
119 * Fix RX disassoc issue under Hot-spot mode.
122 * [WCXRP00000432] [MT6620 Wi-Fi][Driver] Add STA privacy check at hotspot mode
123 * adding the code for check STA privacy bit at AP mode, .
125 * 02 08 2011 eddie.chen
126 * [WCXRP00000426] [MT6620 Wi-Fi][FW/Driver] Add STA aging timeout and defualtHwRatein AP mode
127 * Add event STA agint timeout
129 * 01 25 2011 yuche.tsai
130 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
131 * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
133 * 01 12 2011 yuche.tsai
134 * [WCXRP00000353] [Volunteer Patch][MT6620][Driver] Desired Non-HT Rate Set update when STA record is created under AP Mode.
135 * Update Phy Type Set. When legacy client is connected, it can use 11b rate,
136 * but if the P2P device is connected, 11b rate is not allowed.
138 * 01 11 2011 yuche.tsai
139 * [WCXRP00000353] [Volunteer Patch][MT6620][Driver] Desired Non-HT Rate Set update when STA record is created under AP Mode.
140 * Update Desired Non-HT Rate Set.
142 * 12 30 2010 eddie.chen
143 * [WCXRP00000322] Add WMM IE in beacon,
145 Add per station flow control when STA is in PS
148 * Recover the code that was coverwritted..
150 * 12 29 2010 eddie.chen
151 * [WCXRP00000322] Add WMM IE in beacon,
152 Add per station flow control when STA is in PS
154 * 1) PS flow control event
156 * 2) WMM IE in beacon, assoc resp, probe resp
159 * [WCXRP00000164] [MT6620 Wi-Fi][Driver] Support the p2p random SSID
160 * adding the p2p random ssid support.
163 * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
164 * use definition macro to replace hard-coded constant
168 * [WCXRP00000069][MT6620 Wi-Fi][Driver] Fix some code for phase 1 P2P Demo.
170 * 09 27 2010 chinghwa.yu
171 * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000065] Update BoW design and settings
172 * Update BCM/BoW design and settings.
174 * 09 16 2010 cm.chang
176 * Change conditional compiling options for BOW
178 * 09 03 2010 kevin.huang
180 * Refine #include sequence and solve recursive/nested #include issue
184 * adding the wapi support for integration test.
188 * eliminate klockwork errors
190 * 08 16 2010 yuche.tsai
192 * Add SSID IE in assoc req frame which is sent by P2P GC.
194 * 08 16 2010 kevin.huang
196 * Refine AAA functions
200 * surpress compilation warning.
204 * adding the wapi code.
206 * 07 09 2010 yarco.yang
208 * [MT6620 and MT5931] SW Migration: Add ADDBA support
212 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
215 * [WPD00003833][MT6620 and MT5931] Driver migration
216 * take use of RLM module for parsing/generating HT IEs for 11n capability
219 * [WPD00003833][MT6620 and MT5931] Driver migration
220 * comment out RSN IE generation by CFG_RSN_MIGRATION compilation flag.
223 * [WPD00003833][MT6620 and MT5931] Driver migration
224 * send MMPDU in basic rate.
227 * [WPD00003833][MT6620 and MT5931] Driver migration
228 * add scan_fsm into building.
231 * [WPD00003833][MT6620 and MT5931] Driver migration
232 * specify correct value for management frames.
234 * 06 18 2010 cm.chang
235 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
236 * Provide cnmMgtPktAlloc() and alloc/free function of msg/buf
239 * [WPD00003840][MT6620 5931] Security migration
240 * migration from MT6620 firmware.
243 * [WPD00003833][MT6620 and MT5931] Driver migration
247 * [WPD00003833][MT6620 and MT5931] Driver migration
248 * add management dispatching function table.
251 * [WPD00003833][MT6620 and MT5931] Driver migration
252 * auth.c is migrated.
255 * [WPD00003833][MT6620 and MT5931] Driver migration
256 * 1) migrate assoc.c.
257 * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
258 * 3) add configuration options for CNM_MEM and RSN modules
259 * 4) add data path for management frames
260 * 5) eliminate rPacketInfo of MSDU_INFO_T
262 * 05 24 2010 kevin.huang
263 * [BORA00000794][WIFISYS][New Feature]Power Management Support
264 * Update assocProcessRxAssocReqFrame() to avoid redundant SSID IE {0,0} for IOT.
266 * 05 14 2010 kevin.huang
267 * [BORA00000794][WIFISYS][New Feature]Power Management Support
268 * Fix compile warning - macro > 10 line, initial value of an array
270 * 04 24 2010 cm.chang
271 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
272 * g_aprBssInfo[] depends on CFG_SUPPORT_P2P and CFG_SUPPORT_BOW
274 * 04 22 2010 cm.chang
275 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
276 * First draft code to support protection in AP mode
278 * 04 19 2010 kevin.huang
279 * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
280 * Add Beacon Timeout Support
281 * * * * * * * * and will send Null frame to diagnose connection
284 * [BORA00000680][MT6620] Support the statistic for Microsoft os query
285 * adding the wpa-none for ibss beacon.
287 * 03 25 2010 cm.chang
288 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
289 * Remove compiling warning
291 * 03 24 2010 cm.chang
292 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
293 * Not carry HT cap when being associated with b/g only AP
295 * 02 04 2010 kevin.huang
296 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
297 * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
300 * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
301 * fixed the compiling warning.u1rwduu`wvpghlqg|rm+vp
304 * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
305 * add and fixed some security function.
307 * 01 11 2010 kevin.huang
308 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
309 * Add Deauth and Disassoc Handler
311 * 01 07 2010 kevin.huang
312 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
313 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
314 * Update Assoc ID for PS
316 * 01 04 2010 tehuang.liu
317 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
318 * For working out the first connection Chariot-verified version
320 * 12 18 2009 cm.chang
321 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
324 * Dec 12 2009 mtk01104
325 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
326 * Use new constant definition ELEM_MAX_LEN_EXT_CAP
328 * Dec 9 2009 mtk01104
329 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
330 * Modify assoc req IE talbe for HT cap IE
332 * Dec 7 2009 mtk01461
333 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
334 * update the assocComposeReAssocReqFrameHeader() and fix the u2EstimatedFrameLen in assocSendReAssocReqFrame()
336 * Dec 7 2009 mtk01088
337 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
338 * remove some space line
340 * Dec 7 2009 mtk01088
341 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
342 * adding the sending disassoc frame function
344 * Dec 4 2009 mtk01088
345 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
346 * adding the txassocReq IE table, adding for WPA/RSN
348 * Dec 3 2009 mtk01461
349 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
350 * Fix eNetType not init in send AssocReq function
352 * Dec 3 2009 mtk01461
353 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
354 * Integrate the send Assoc with TXM
356 * Dec 1 2009 mtk01088
357 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
358 * adding the code to indicate the assoc request and assoc response (now disable)
360 * Nov 24 2009 mtk01461
361 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
362 * Remove unused variables
364 * Nov 23 2009 mtk01461
365 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
369 /*******************************************************************************
370 * C O M P I L E R F L A G S
371 ********************************************************************************
374 /*******************************************************************************
375 * E X T E R N A L R E F E R E N C E S
376 ********************************************************************************
380 /*******************************************************************************
382 ********************************************************************************
385 /*******************************************************************************
387 ********************************************************************************
390 /*******************************************************************************
391 * P U B L I C D A T A
392 ********************************************************************************
394 APPEND_VAR_IE_ENTRY_T txAssocReqIETable[] = {
395 { (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_CAP), NULL, rlmReqGenerateHtCapIE },/* 45 */
397 { (ELEM_HDR_LEN + ELEM_MAX_LEN_WSC), NULL, rsnGenerateWSCIE }, /* 221 */
400 { (ELEM_HDR_LEN + ELEM_MAX_LEN_WAPI), NULL, wapiGenerateWAPIIE }, /* 68 */
402 #if CFG_RSN_MIGRATION
403 { (ELEM_HDR_LEN + ELEM_MAX_LEN_WPA), NULL, rsnGenerateWPAIE }, /* 221 */
405 { (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP), NULL, rlmReqGenerateExtCapIE }, /* 127 */
406 { (ELEM_HDR_LEN + ELEM_MAX_LEN_WMM_INFO), NULL, mqmGenerateWmmInfoIE }, /* 221 */
407 #if CFG_RSN_MIGRATION
408 { (ELEM_HDR_LEN + ELEM_MAX_LEN_RSN), NULL, rsnGenerateRSNIE }, /* 48 */
413 VERIFY_IE_ENTRY_T rxAssocReqIETable[] = {
414 { ELEM_ID_RESERVED, NULL } /* 255 */
418 APPEND_VAR_IE_ENTRY_T txAssocRespIETable[] = {
419 { (ELEM_HDR_LEN + ELEM_MAX_LEN_ERP), NULL, rlmRspGenerateErpIE }, /* 42 */
420 { (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_CAP), NULL, rlmRspGenerateHtCapIE }, /* 45 */
421 { (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_OP), NULL, rlmRspGenerateHtOpIE }, /* 61 */
422 #if CFG_ENABLE_WIFI_DIRECT
423 { (ELEM_HDR_LEN + ELEM_MAX_LEN_OBSS_SCAN), NULL, rlmRspGenerateObssScanIE }, /* 74 */
424 { (0), p2pFuncCalculateP2p_IELenForAssocRsp, p2pFuncGenerateP2p_IEForAssocRsp }, /* 221 */
426 { (0), wfdFuncCalculateWfdIELenForAssocRsp, wfdFuncGenerateWfdIEForAssocRsp }, /* 221 */
429 { (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP), NULL, rlmRspGenerateExtCapIE }, /* 127 */
430 { (ELEM_HDR_LEN + ELEM_MAX_LEN_WMM_PARAM), NULL, mqmGenerateWmmParamIE }, /* 221 */
432 { (0), p2pFuncCalculateWSC_IELenForAssocRsp, p2pFuncGenerateWSC_IEForAssocRsp } /* 221 */
437 /*******************************************************************************
438 * P R I V A T E D A T A
439 ********************************************************************************
442 /*******************************************************************************
444 ********************************************************************************
447 /*******************************************************************************
448 * F U N C T I O N D E C L A R A T I O N S
449 ********************************************************************************
452 /*******************************************************************************
454 ********************************************************************************
456 /*----------------------------------------------------------------------------*/
458 * @brief This function is used to compose the Capability Info Field.
460 * @param[in] prStaRec Pointer to the STA_RECORD_T
462 * @retval Capability Info Field
464 /*----------------------------------------------------------------------------*/
465 __KAL_INLINE__ UINT_16
466 assocBuildCapabilityInfo (
467 IN P_ADAPTER_T prAdapter,
468 IN P_STA_RECORD_T prStaRec
471 UINT_32 u4NonHTPhyType;
478 /* Set up our requested capabilities. */
479 u2CapInfo = CAP_INFO_ESS;
480 u2CapInfo |= CAP_CF_STA_NOT_POLLABLE;
482 if (prStaRec->u2CapInfo & CAP_INFO_PRIVACY) {
483 u2CapInfo |= CAP_INFO_PRIVACY;
488 if (prStaRec->fgHasBasicPhyType) {
489 u4NonHTPhyType = prStaRec->ucNonHTBasicPhyType;
491 if ( (rNonHTPhyAttributes[u4NonHTPhyType].fgIsShortPreambleOptionImplemented) &&
492 ( (prAdapter->rWifiVar.ePreambleType == PREAMBLE_TYPE_SHORT) || /* Short Preamble Option Enable is TRUE */
493 ((prAdapter->rWifiVar.ePreambleType == PREAMBLE_TYPE_AUTO) &&
494 (prStaRec->u2CapInfo & CAP_INFO_SHORT_PREAMBLE)) ) ) {
496 /* Case I: Implemented == TRUE and Short Preamble Option Enable == TRUE.
497 * Case II: Implemented == TRUE and Short Preamble == AUTO (depends on
498 * BSS_DESC_T's capability)
500 u2CapInfo |= CAP_INFO_SHORT_PREAMBLE;
503 if (rNonHTPhyAttributes[u4NonHTPhyType].fgIsShortSlotTimeOptionImplemented &&
504 prAdapter->rWifiVar.fgIsShortSlotTimeOptionEnable) {
505 u2CapInfo |= CAP_INFO_SHORT_SLOT_TIME;
509 DBGLOG(SAA, LOUD, ("ASSOC REQ: Compose Capability = 0x%04x for Target BSS ["MACSTR"].\n",
510 u2CapInfo, MAC2STR(prStaRec->aucMacAddr)));
515 } /* end of assocBuildCapabilityInfo() */
518 /*----------------------------------------------------------------------------*/
520 * @brief This function is used to compose Common Information Elements for Association
523 * @param[in] prMsduInfo Pointer to the composed MSDU_INFO_T.
527 /*----------------------------------------------------------------------------*/
529 assocBuildReAssocReqFrameCommonIEs (
530 IN P_ADAPTER_T prAdapter,
531 IN P_MSDU_INFO_T prMsduInfo
534 P_CONNECTION_SETTINGS_T prConnSettings;
535 P_STA_RECORD_T prStaRec;
537 UINT_16 u2SupportedRateSet;
538 UINT_8 aucAllSupportedRates[RATE_NUM] = {0};
539 UINT_8 ucAllSupportedRatesLen;
540 UINT_8 ucSupRatesLen;
541 UINT_8 ucExtSupRatesLen;
543 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
545 ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
547 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
554 pucBuffer = (PUINT_8)((UINT_32)prMsduInfo->prPacket +
555 (UINT_32)prMsduInfo->u2FrameLength);
558 if (IS_STA_IN_AIS(prStaRec)) {
560 /* Fill the SSID element. */
561 SSID_IE(pucBuffer)->ucId = ELEM_ID_SSID;
563 /* NOTE(Kevin): We copy the SSID from CONNECTION_SETTINGS for the case of
564 * Passive Scan and the target BSS didn't broadcast SSID on its Beacon Frame.
567 COPY_SSID(SSID_IE(pucBuffer)->aucSSID,
568 SSID_IE(pucBuffer)->ucLength,
569 prConnSettings->aucSSID,
570 prConnSettings->ucSSIDLen);
572 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
573 pucBuffer += IE_SIZE(pucBuffer);
576 #if CFG_ENABLE_WIFI_DIRECT
577 else if((prAdapter->fgIsP2PRegistered) &&
578 (IS_STA_IN_P2P(prStaRec))) {
579 pucBuffer = p2pBuildReAssocReqFrameCommonIEs(prAdapter, prMsduInfo, pucBuffer);
582 #if CFG_ENABLE_BT_OVER_WIFI
583 else if (IS_STA_IN_BOW(prStaRec)) {
585 SSID_IE(pucBuffer)->ucId = ELEM_ID_SSID;
587 /* NOTE(Kevin): We copy the SSID from CONNECTION_SETTINGS for the case of
588 * Passive Scan and the target BSS didn't broadcast SSID on its Beacon Frame.
591 COPY_SSID(SSID_IE(pucBuffer)->aucSSID,
592 SSID_IE(pucBuffer)->ucLength,
593 prConnSettings->aucSSID,
594 prConnSettings->ucSSIDLen);
596 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
597 pucBuffer += IE_SIZE(pucBuffer);
602 /* TODO(Kevin): For other network */
605 /* NOTE(Kevin 2008/12/19): 16.3.6.3 MLME-ASSOCIATE.indication -
606 * SupportedRates - The set of data rates that are supported by the STA
607 * that is requesting association.
608 * Original(Portable Driver): Only send the Rates that we'll support.
609 * New: Send the Phy Rates if the result of following & operation == NULL.
611 //rateGetDataRatesFromRateSet((prBssDesc->u2OperationalRateSet &
612 // rPhyAttributes[prBssDesc->ePhyType].u2SupportedRateSet),
614 if (prStaRec->fgHasBasicPhyType) {
615 UINT_32 u4NonHTPhyType;
618 u4NonHTPhyType = prStaRec->ucNonHTBasicPhyType;
620 u2SupportedRateSet = (prStaRec->u2OperationalRateSet &
621 rNonHTPhyAttributes[u4NonHTPhyType].u2SupportedRateSet);
623 ASSERT(u2SupportedRateSet);
625 if (!u2SupportedRateSet) {
626 u2SupportedRateSet = rNonHTPhyAttributes[u4NonHTPhyType].u2SupportedRateSet;
629 /* TODO(Kevin): For P2P, we shouldn't send support rate set which contains 11b rate */
631 rateGetDataRatesFromRateSet(u2SupportedRateSet,
633 aucAllSupportedRates,
634 &ucAllSupportedRatesLen);
636 ucSupRatesLen = ((ucAllSupportedRatesLen > ELEM_MAX_LEN_SUP_RATES) ?
637 ELEM_MAX_LEN_SUP_RATES : ucAllSupportedRatesLen);
639 ucExtSupRatesLen = ucAllSupportedRatesLen - ucSupRatesLen;
642 /* Fill the Supported Rates element. */
644 SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_SUP_RATES;
645 SUP_RATES_IE(pucBuffer)->ucLength = ucSupRatesLen;
646 kalMemCopy(SUP_RATES_IE(pucBuffer)->aucSupportedRates,
647 aucAllSupportedRates,
650 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
651 pucBuffer += IE_SIZE(pucBuffer);
655 /* Fill the Extended Supported Rates element. */
656 if (ucExtSupRatesLen) {
658 EXT_SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_EXTENDED_SUP_RATES;
659 EXT_SUP_RATES_IE(pucBuffer)->ucLength = ucExtSupRatesLen;
661 kalMemCopy(EXT_SUP_RATES_IE(pucBuffer)->aucExtSupportedRates,
662 &aucAllSupportedRates[ucSupRatesLen],
665 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
666 pucBuffer += IE_SIZE(pucBuffer);
671 } /* end of assocBuildReAssocReqFrameCommonIEs() */
674 /*----------------------------------------------------------------------------*/
676 * @brief This function will compose the (Re)Association Request frame header and
679 * @param[in] prStaRec Pointer to the STA_RECORD_T
680 * @param[in] pucBuffer Pointer to the frame buffer.
681 * @param[in] aucMACAddress Given Our MAC Address.
682 * @param[in out] pu2PayloadLen Return the length of the composed fixed fields
686 /*----------------------------------------------------------------------------*/
688 assocComposeReAssocReqFrameHeaderAndFF (
689 IN P_ADAPTER_T prAdapter,
690 IN P_STA_RECORD_T prStaRec,
691 IN PUINT_8 pucBuffer,
692 IN UINT_8 aucMACAddress[],
693 IN OUT PUINT_16 pu2PayloadLen
696 P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
701 UINT_16 u2ListenInterval;
706 ASSERT(aucMACAddress);
707 ASSERT(pu2PayloadLen);
709 prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)pucBuffer;
710 fgIsReAssoc = prStaRec->fgIsReAssoc;
712 //4 <1> Compose the frame header of the (Re)Association Request frame.
713 /* Fill the Frame Control field. */
715 u2FrameCtrl = MAC_FRAME_REASSOC_REQ;
718 u2FrameCtrl = MAC_FRAME_ASSOC_REQ;
720 WLAN_SET_FIELD_16(&prAssocFrame->u2FrameCtrl, u2FrameCtrl);
722 /* Fill the DA field with Target BSSID. */
723 COPY_MAC_ADDR(prAssocFrame->aucDestAddr, prStaRec->aucMacAddr);
725 /* Fill the SA field with our MAC Address. */
726 COPY_MAC_ADDR(prAssocFrame->aucSrcAddr, aucMACAddress);
728 /* Fill the BSSID field with Target BSSID. */
729 COPY_MAC_ADDR(prAssocFrame->aucBSSID, prStaRec->aucMacAddr);
731 /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
732 prAssocFrame->u2SeqCtrl = 0;
735 //4 <2> Compose the frame body's common fixed field part of the (Re)Association Request frame.
736 u2CapInfo = assocBuildCapabilityInfo(prAdapter, prStaRec);
738 /* Fill the Capability Information field. */
739 WLAN_SET_FIELD_16(&prAssocFrame->u2CapInfo, u2CapInfo);
742 /* Calculate the listen interval for the maximum power mode. Currently, we
743 set it to the value 2 times DTIM period. */
744 if (prStaRec->ucDTIMPeriod) {
745 u2ListenInterval = prStaRec->ucDTIMPeriod * DEFAULT_LISTEN_INTERVAL_BY_DTIM_PERIOD;
748 DBGLOG(SAA, TRACE, ("Use default listen interval\n"));
749 u2ListenInterval = DEFAULT_LISTEN_INTERVAL;
751 prStaRec->u2ListenInterval = u2ListenInterval;
753 /* Fill the Listen Interval field. */
754 WLAN_SET_FIELD_16(&prAssocFrame->u2ListenInterval, u2ListenInterval);
757 //4 <3> Compose the Current AP Address field for ReAssociation Request frame.
758 /* Fill the Current AP Address field. */
759 if (prStaRec->fgIsReAssoc) {
760 if (IS_STA_IN_AIS(prStaRec)) {
762 P_AIS_BSS_INFO_T prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
763 P_WLAN_REASSOC_REQ_FRAME_T prReAssocFrame =
764 (P_WLAN_REASSOC_REQ_FRAME_T)prAssocFrame;
766 COPY_MAC_ADDR(prReAssocFrame->aucCurrentAPAddr, prAisBssInfo->aucBSSID);
769 ASSERT(0); /* We don't support ReAssociation for other network */
772 *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
773 LISTEN_INTERVAL_FIELD_LEN +
774 CURR_AP_ADDR_FIELD_LEN);
777 *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
778 LISTEN_INTERVAL_FIELD_LEN);
782 } /* end of assocComposeReAssocReqFrame() */
785 /*----------------------------------------------------------------------------*/
787 * @brief This function will send the (Re)Association Request frame
789 * @param[in] prStaRec Pointer to the STA_RECORD_T
791 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
792 * @retval WLAN_STATUS_SUCCESS Successfully send frame to TX Module
794 /*----------------------------------------------------------------------------*/
796 assocSendReAssocReqFrame (
797 IN P_ADAPTER_T prAdapter,
798 IN P_STA_RECORD_T prStaRec
801 P_MSDU_INFO_T prMsduInfo;
802 P_BSS_INFO_T prBssInfo;
804 UINT_16 u2PayloadLen;
805 UINT_16 u2EstimatedFrameLen;
806 UINT_16 u2EstimatedExtraIELen;
813 //4 <1> Allocate a PKT_INFO_T for Authentication Frame
814 fgIsReAssoc = prStaRec->fgIsReAssoc;
816 /* Init with MGMT Header Length + Length of Fixed Fields + Common IE Length */
818 u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
819 WLAN_MAC_MGMT_HEADER_LEN + \
820 CAP_INFO_FIELD_LEN + \
821 LISTEN_INTERVAL_FIELD_LEN + \
822 CURR_AP_ADDR_FIELD_LEN + \
823 (ELEM_HDR_LEN + ELEM_MAX_LEN_SSID) + \
824 (ELEM_HDR_LEN + ELEM_MAX_LEN_SUP_RATES) + \
825 (ELEM_HDR_LEN + (RATE_NUM - ELEM_MAX_LEN_SUP_RATES));
828 u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
829 WLAN_MAC_MGMT_HEADER_LEN + \
830 CAP_INFO_FIELD_LEN + \
831 LISTEN_INTERVAL_FIELD_LEN + \
832 (ELEM_HDR_LEN + ELEM_MAX_LEN_SSID) + \
833 (ELEM_HDR_LEN + ELEM_MAX_LEN_SUP_RATES) + \
834 (ELEM_HDR_LEN + (RATE_NUM - ELEM_MAX_LEN_SUP_RATES));
837 /* + Extra IE Length */
838 u2EstimatedExtraIELen = 0;
840 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211 && CFG_ENABLE_WIFI_DIRECT
841 if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_P2P_INDEX) {
842 if ((prAdapter->fgIsP2PRegistered)) {
843 u2EstimatedExtraIELen = p2pCalculate_IEForAssocReq(prAdapter,
844 prStaRec->ucNetTypeIndex,
848 DBGLOG(P2P, TRACE, ("Function Linker Lost.\n"));
853 for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
854 if (txAssocReqIETable[i].u2EstimatedFixedIELen != 0) {
855 u2EstimatedExtraIELen += txAssocReqIETable[i].u2EstimatedFixedIELen;
858 u2EstimatedExtraIELen += (UINT_16)txAssocReqIETable[i].pfnCalculateVariableIELen(prAdapter,
859 prStaRec->ucNetTypeIndex,
865 for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
866 if (txAssocReqIETable[i].u2EstimatedFixedIELen != 0) {
867 u2EstimatedExtraIELen += txAssocReqIETable[i].u2EstimatedFixedIELen;
870 u2EstimatedExtraIELen += (UINT_16)txAssocReqIETable[i].pfnCalculateVariableIELen(prAdapter,
871 prStaRec->ucNetTypeIndex,
877 u2EstimatedFrameLen += u2EstimatedExtraIELen;
879 /* Allocate a MSDU_INFO_T */
880 if ( (prMsduInfo = cnmMgtPktAlloc(prAdapter, u2EstimatedFrameLen)) == NULL) {
881 DBGLOG(SAA, WARN, ("No PKT_INFO_T for sending (Re)Assoc Request.\n"));
882 return WLAN_STATUS_RESOURCES;
885 //4 <2> Compose (Re)Association Request frame header and fixed fields in MSDU_INfO_T.
886 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
887 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
890 /* Compose Header and Fixed Field */
891 assocComposeReAssocReqFrameHeaderAndFF(prAdapter,
893 (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
894 prBssInfo->aucOwnMacAddr,
897 //4 <3> Update information of MSDU_INFO_T
898 prMsduInfo->eSrc = TX_PACKET_MGMT;
899 prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;
900 prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
901 prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
902 prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
903 prMsduInfo->fgIs802_1x = FALSE;
904 prMsduInfo->fgIs802_11 = TRUE;
905 prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
906 prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
907 prMsduInfo->pfTxDoneHandler = saaFsmRunEventTxDone;
908 prMsduInfo->fgIsBasicRate = TRUE;
910 //4 <4> Compose the frame body's IEs of the (Re)Association Request frame.
911 assocBuildReAssocReqFrameCommonIEs(prAdapter, prMsduInfo);
914 //4 <5> Compose IEs in MSDU_INFO_T
915 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211 && CFG_ENABLE_WIFI_DIRECT
916 if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_P2P_INDEX) {
917 if ((prAdapter->fgIsP2PRegistered)) {
918 p2pGenerate_IEForAssocReq(prAdapter, prMsduInfo);
921 DBGLOG(P2P, TRACE, ("Function Linker Lost.\n"));
927 for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
928 if (txAssocReqIETable[i].pfnAppendIE) {
929 txAssocReqIETable[i].pfnAppendIE(prAdapter, prMsduInfo);
935 for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
936 if (txAssocReqIETable[i].pfnAppendIE) {
937 txAssocReqIETable[i].pfnAppendIE(prAdapter, prMsduInfo);
942 //4 <6> Update the (Re)association request information
943 if (IS_STA_IN_AIS(prStaRec)) {
944 P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
946 prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
948 #if CFG_RSN_MIGRATION
949 kalUpdateReAssocReqInfo(prAdapter->prGlueInfo,
950 (PUINT_8)&prAssocFrame->u2CapInfo,
951 prMsduInfo->u2FrameLength - offsetof(WLAN_ASSOC_REQ_FRAME_T, u2CapInfo),
956 #if CFG_ENABLE_WIFI_DIRECT
957 if ((prAdapter->fgIsP2PRegistered) && (IS_STA_IN_P2P(prStaRec))) {
958 P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
960 prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
963 kalP2PUpdateAssocInfo(
964 prAdapter->prGlueInfo,
965 (PUINT_8)&prAssocFrame->u2CapInfo,
966 prMsduInfo->u2FrameLength - offsetof(WLAN_ASSOC_REQ_FRAME_T, u2CapInfo),
971 /* TODO(Kevin): Also release the unused tail room of the composed MMPDU */
973 //4 <6> Enqueue the frame to send this (Re)Association request frame.
974 nicTxEnqueueMsdu(prAdapter, prMsduInfo);
976 return WLAN_STATUS_SUCCESS;
977 } /* end of assocSendReAssocReqFrame() */
980 /*----------------------------------------------------------------------------*/
982 * @brief This function will strictly check the TX (Re)Association Request frame for
983 * SAA event handling.
985 * @param[in] prMsduInfo Pointer of MSDU_INFO_T
987 * @retval WLAN_STATUS_FAILURE This is not the frame we should handle at current state.
988 * @retval WLAN_STATUS_SUCCESS This is the frame we should handle.
990 /*----------------------------------------------------------------------------*/
992 assocCheckTxReAssocReqFrame (
993 IN P_ADAPTER_T prAdapter,
994 IN P_MSDU_INFO_T prMsduInfo
997 P_WLAN_ASSOC_REQ_FRAME_T prAssocReqFrame;
998 P_STA_RECORD_T prStaRec;
999 UINT_16 u2TxFrameCtrl;
1003 ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1005 prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T)(prMsduInfo->prPacket);
1006 ASSERT(prAssocReqFrame);
1008 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1012 return WLAN_STATUS_INVALID_PACKET;
1015 //WLAN_GET_FIELD_16(&prAssocReqFrame->u2FrameCtrl, &u2TxFrameCtrl)
1016 u2TxFrameCtrl = prAssocReqFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1017 u2TxFrameCtrl &= MASK_FRAME_TYPE;
1018 if (prStaRec->fgIsReAssoc) {
1019 if (u2TxFrameCtrl != MAC_FRAME_REASSOC_REQ) {
1020 return WLAN_STATUS_FAILURE;
1024 if (u2TxFrameCtrl != MAC_FRAME_ASSOC_REQ) {
1025 return WLAN_STATUS_FAILURE;
1029 return WLAN_STATUS_SUCCESS;
1031 } /* end of assocCheckTxReAssocReqFrame() */
1034 /*----------------------------------------------------------------------------*/
1036 * @brief This function will strictly check the TX (Re)Association Response frame for
1037 * AAA event handling.
1039 * @param[in] prMsduInfo Pointer of MSDU_INFO_T
1041 * @retval WLAN_STATUS_FAILURE This is not the frame we should handle at current state.
1042 * @retval WLAN_STATUS_SUCCESS This is the frame we should handle.
1044 /*----------------------------------------------------------------------------*/
1046 assocCheckTxReAssocRespFrame (
1047 IN P_ADAPTER_T prAdapter,
1048 IN P_MSDU_INFO_T prMsduInfo
1051 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1052 P_STA_RECORD_T prStaRec;
1053 UINT_16 u2TxFrameCtrl;
1057 ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1059 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T)(prMsduInfo->prPacket);
1060 ASSERT(prAssocRspFrame);
1062 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1066 return WLAN_STATUS_INVALID_PACKET;
1069 //WLAN_GET_FIELD_16(&prAssocFrame->u2FrameCtrl, &u2TxFrameCtrl)
1070 u2TxFrameCtrl = prAssocRspFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1071 u2TxFrameCtrl &= MASK_FRAME_TYPE;
1072 if (prStaRec->fgIsReAssoc) {
1073 if (u2TxFrameCtrl != MAC_FRAME_REASSOC_RSP) {
1074 return WLAN_STATUS_FAILURE;
1078 if (u2TxFrameCtrl != MAC_FRAME_ASSOC_RSP) {
1079 return WLAN_STATUS_FAILURE;
1083 return WLAN_STATUS_SUCCESS;
1085 } /* end of assocCheckTxReAssocRespFrame() */
1088 /*----------------------------------------------------------------------------*/
1090 * @brief This function will validate the incoming (Re)Association Frame and take out
1093 * @param[in] prSwRfb Pointer to SW RFB data structure.
1094 * @param[out] pu2StatusCode Pointer to store the Status Code from Authentication.
1096 * @retval WLAN_STATUS_FAILURE This is not the frame we should handle at current state.
1097 * @retval WLAN_STATUS_SUCCESS This is the frame we should handle.
1099 /*----------------------------------------------------------------------------*/
1101 assocCheckRxReAssocRspFrameStatus (
1102 IN P_ADAPTER_T prAdapter,
1103 IN P_SW_RFB_T prSwRfb,
1104 OUT PUINT_16 pu2StatusCode
1107 P_STA_RECORD_T prStaRec;
1108 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1109 UINT_16 u2RxFrameCtrl;
1110 UINT_16 u2RxCapInfo;
1111 UINT_16 u2RxStatusCode;
1112 UINT_16 u2RxAssocId;
1116 ASSERT(pu2StatusCode);
1118 if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) < (CAP_INFO_FIELD_LEN +
1119 STATUS_CODE_FIELD_LEN +
1122 return WLAN_STATUS_FAILURE;
1125 DBGLOG(SAA, LOUD, ("prSwRfb->u2PayloadLength = %d\n", prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen));
1127 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1131 return WLAN_STATUS_INVALID_PACKET;
1134 //4 <1> locate the (Re)Assocation Resp Frame.
1135 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prSwRfb->pvHeader;
1137 //4 <2> Parse the Header of (Re)Assocation Resp Frame.
1138 //WLAN_GET_FIELD_16(&prAssocRspFrame->u2FrameCtrl, &u2RxFrameCtrl);
1139 u2RxFrameCtrl = prAssocRspFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1140 u2RxFrameCtrl &= MASK_FRAME_TYPE;
1141 if (prStaRec->fgIsReAssoc) {
1142 if (u2RxFrameCtrl != MAC_FRAME_REASSOC_RSP) {
1143 return WLAN_STATUS_FAILURE;
1147 if (u2RxFrameCtrl != MAC_FRAME_ASSOC_RSP) {
1148 return WLAN_STATUS_FAILURE;
1152 //4 <3> Parse the Fixed Fields of (Re)Assocation Resp Frame Body.
1153 //WLAN_GET_FIELD_16(&prAssocRspFrame->u2CapInfo, &u2RxCapInfo);
1154 u2RxCapInfo = prAssocRspFrame->u2CapInfo; // NOTE(Kevin): Optimized for ARM
1156 //WLAN_GET_FIELD_16(&prAssocRspFrame->u2StatusCode, &u2RxStatusCode);
1157 u2RxStatusCode = prAssocRspFrame->u2StatusCode; // NOTE(Kevin): Optimized for ARM
1159 //4 <4> Check CAP_INFO
1160 /* NOTE(Kevin): CM suggest to add MGMT workaround for those APs didn't check
1161 * the CAP Privacy Bit to overcome a corner case that the Privacy Bit
1162 * of our SCAN result didn't consist with AP's Association Resp.
1164 if (u2RxStatusCode == STATUS_CODE_SUCCESSFUL) {
1165 #if CFG_SUPPORT_WAPI
1166 if (prAdapter->rWifiVar.rConnSettings.fgWapiMode) {
1167 /* WAPI AP allow the customer use WZC to join mode, the privacy bit is 0 */
1168 /* even at WAI & WAPI_PSK mode, but the assoc respose set the privacy bit set 1 */
1169 DBGLOG(SEC, TRACE, ("Workaround the WAPI AP allow the customer to use WZC to join\n"));
1173 #if CFG_ENABLE_WIFI_DIRECT
1174 if (prAdapter->fgIsP2PRegistered && 1) {
1175 /* Todo:: Fixed this */
1182 #if CFG_STRICT_CHECK_CAPINFO_PRIVACY
1183 if ((prStaRec->u2CapInfo & CAP_INFO_PRIVACY) ^ (u2RxCapInfo & CAP_INFO_PRIVACY)) {
1184 u2RxStatusCode = STATUS_CODE_CAP_NOT_SUPPORTED;
1189 if (u2RxStatusCode == STATUS_CODE_SUCCESSFUL) {
1190 #if CFG_RSN_MIGRATION
1191 /* Update the information in the structure used to query and set
1192 OID_802_11_ASSOCIATION_INFORMATION. */
1193 kalUpdateReAssocRspInfo(prAdapter->prGlueInfo,
1194 (PUINT_8)&prAssocRspFrame->u2CapInfo,
1195 (UINT_32)(prSwRfb->u2PacketLen));
1199 //4 <5> Update CAP_INFO and ASSOC_ID
1200 if (u2RxStatusCode == STATUS_CODE_SUCCESSFUL) {
1201 prStaRec->u2CapInfo = u2RxCapInfo;
1203 //WLAN_GET_FIELD_16(&prAssocRspFrame->u2AssocId, &u2RxAssocId);
1204 u2RxAssocId = prAssocRspFrame->u2AssocId; // NOTE(Kevin): Optimized for ARM
1206 /* 20110715 Workaround for Kingnet 710 AP (Realtek 8186)
1207 * This AP raises the bit 6&7 not bit 14&15 in AID field.
1208 * It cause wrong AID assignment.
1210 * Normal case: 0xC002(1100 0000 0000 0010) => 2
1211 * Kingnet 710: 0x00C2(0000 0000 1100 0010) => 194
1212 * workaround: mask bit 6&7 for this AP
1214 if((u2RxAssocId & BIT(6)) &&
1215 (u2RxAssocId & BIT(7)) &&
1216 !(u2RxAssocId & BITS(8, 15))) {
1217 prStaRec->u2AssocId = u2RxAssocId & ~BITS(6,7);
1219 prStaRec->u2AssocId = u2RxAssocId & ~AID_MSB;
1220 #if CFG_SUPPORT_802_11W
1221 if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX) {
1222 P_AIS_SPECIFIC_BSS_INFO_T prBssSpecInfo;
1224 prBssSpecInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
1225 ASSERT(prBssSpecInfo);
1227 prBssSpecInfo->ucSaQueryTimedOut = 0;
1233 #if CFG_SUPPORT_802_11W
1234 if (u2RxStatusCode == STATUS_CODE_AUTH_ALGORITHM_NOT_SUPPORTED){
1235 DBGLOG(SAA, INFO, ("AP rejected due the authentication algorithm not support\n"));
1237 else if (u2RxStatusCode == STATUS_CODE_ASSOC_REJECTED_TEMPORARILY) {
1238 PUINT_8 pucIE, pucTime;
1240 UINT_16 u2Offset = 0;
1242 u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
1243 pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
1245 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1246 if (ELEM_ID_TIMEOUT_INTERVAL == IE_ID(pucIE) && IE_LEN(pucIE) == 5) {
1247 pucTime = ((P_IE_HDR_T)pucIE)->aucInfo;
1248 if (pucTime[0] == ACTION_SA_TIMEOUT_ASSOC_COMEBACK) {
1250 WLAN_GET_FIELD_32(pucTime + 1, &tu);
1251 DBGLOG(SAA, INFO, ("AP rejected association temporarily; comeback duration %u TU "
1252 "(%u ms)\n", tu, TU_TO_MSEC(tu)));
1253 if (tu > TX_ASSOCIATION_RETRY_TIMEOUT_TU) {
1254 DBGLOG(SAA, INFO, ("Update timer based on comeback duration\n"));
1255 //ieee80211_reschedule_timer(wpa_s, ms);
1260 } /* end of IE_FOR_EACH */
1263 *pu2StatusCode = u2RxStatusCode;
1265 return WLAN_STATUS_SUCCESS;
1267 } /* end of assocCheckRxReAssocRspFrameStatus() */
1270 /*----------------------------------------------------------------------------*/
1272 * \brief This function will compose the Disassociation frame
1274 * @param[in] prStaRec Pointer to the STA_RECORD_T
1275 * @param[in] pucBuffer Pointer to the frame buffer.
1276 * @param[in] aucMACAddress Given Our MAC Address.
1277 * @param[in] u2ReasonCode The reason code of disassociation
1281 /*----------------------------------------------------------------------------*/
1283 assocComposeDisassocFrame (
1284 IN P_STA_RECORD_T prStaRec,
1285 IN PUINT_8 pucBuffer,
1286 IN UINT_8 aucMACAddress[],
1287 IN UINT_16 u2ReasonCode
1290 P_WLAN_DISASSOC_FRAME_T prDisAssocFrame;
1291 UINT_16 u2FrameCtrl;
1295 ASSERT(aucMACAddress);
1297 prDisAssocFrame = (P_WLAN_DISASSOC_FRAME_T)pucBuffer;
1299 //4 <1> Compose the frame header of the DisAssociation frame.
1300 /* Fill the Frame Control field. */
1301 u2FrameCtrl = MAC_FRAME_DISASSOC;
1303 WLAN_SET_FIELD_16(&prDisAssocFrame->u2FrameCtrl, u2FrameCtrl);
1305 /* Fill the DA field with Target BSSID. */
1306 COPY_MAC_ADDR(prDisAssocFrame->aucDestAddr, prStaRec->aucMacAddr);
1308 /* Fill the SA field with our MAC Address. */
1309 COPY_MAC_ADDR(prDisAssocFrame->aucSrcAddr, aucMACAddress);
1311 /* Fill the BSSID field with Target BSSID. */
1312 COPY_MAC_ADDR(prDisAssocFrame->aucBSSID, prStaRec->aucMacAddr);
1314 /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
1315 prDisAssocFrame->u2SeqCtrl = 0;
1317 //4 <2> Compose the frame body's fixed field part of the Disassociation frame.
1318 /* Fill the Reason Code field. */
1319 WLAN_SET_FIELD_16(&prDisAssocFrame->u2ReasonCode, u2ReasonCode);
1322 } /* end of assocComposeDisassocFrame() */
1325 /*----------------------------------------------------------------------------*/
1327 * @brief This function will send the Disassociation frame
1329 * @param[in] prStaRec Pointer to the STA_RECORD_T
1330 * @param[in] u2ReasonCode The reason code of disassociation
1332 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
1333 * @retval WLAN_STATUS_SUCCESS Successfully send frame to TX Module
1335 /*----------------------------------------------------------------------------*/
1337 assocSendDisAssocFrame (
1338 IN P_ADAPTER_T prAdapter,
1339 IN P_STA_RECORD_T prStaRec,
1340 IN UINT_16 u2ReasonCode
1343 PUINT_8 pucMacAddress;
1344 P_MSDU_INFO_T prMsduInfo;
1345 UINT_16 u2PayloadLen;
1346 UINT_16 u2EstimatedFrameLen;
1347 //UINT_32 u4Status = WLAN_STATUS_SUCCESS;
1352 //4 <1> Allocate a PKT_INFO_T for Disassociation Frame
1353 /* Init with MGMT Header Length + Length of Fixed Fields + IE Length */
1354 u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
1355 WLAN_MAC_MGMT_HEADER_LEN + \
1356 REASON_CODE_FIELD_LEN;
1358 /* Allocate a MSDU_INFO_T */
1359 if ( (prMsduInfo = cnmMgtPktAlloc(prAdapter, u2EstimatedFrameLen)) == NULL) {
1360 DBGLOG(SAA, WARN, ("No PKT_INFO_T for sending DisAssoc.\n"));
1361 return WLAN_STATUS_RESOURCES;
1364 //4 <2> Compose Disassociation frame header and fixed fields in MSDU_INfO_T.
1365 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1367 pucMacAddress = prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex].aucOwnMacAddr;
1369 /* Compose Header and Fixed Field */
1370 assocComposeDisassocFrame(prStaRec,
1371 (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
1375 #if CFG_SUPPORT_802_11W
1376 if (rsnCheckBipKeyInstalled(prAdapter, prStaRec)) {
1377 P_WLAN_DISASSOC_FRAME_T prDisassocFrame;
1379 prDisassocFrame = (P_WLAN_DEAUTH_FRAME_T)(PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
1381 prDisassocFrame->u2FrameCtrl |= MASK_FC_PROTECTED_FRAME;
1382 DBGLOG(TX, WARN, ("assocSendDisAssocFrame with protection\n"));
1386 u2PayloadLen = REASON_CODE_FIELD_LEN;
1388 //4 <3> Update information of MSDU_INFO_T
1389 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1391 prMsduInfo->eSrc = TX_PACKET_MGMT;
1392 prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;
1393 prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
1394 prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
1395 prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
1396 prMsduInfo->fgIs802_1x = FALSE;
1397 prMsduInfo->fgIs802_11 = TRUE;
1398 prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
1399 prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
1400 prMsduInfo->pfTxDoneHandler = NULL;
1401 prMsduInfo->fgIsBasicRate = TRUE;
1403 //4 <4> Enqueue the frame to send this (Re)Association request frame.
1404 nicTxEnqueueMsdu(prAdapter, prMsduInfo);
1406 return WLAN_STATUS_SUCCESS;
1407 } /* end of assocSendDisAssocFrame() */
1410 /*----------------------------------------------------------------------------*/
1412 * @brief This function will parse and process the incoming Disassociation frame
1413 * if the given BSSID is matched.
1415 * @param[in] prSwRfb Pointer to SW RFB data structure.
1416 * @param[in] aucBSSID Given BSSID
1417 * @param[out] pu2ReasonCode Pointer to store the Reason Code from Deauthentication.
1419 * @retval WLAN_STATUS_FAILURE This is not the frame we should handle at current state.
1420 * @retval WLAN_STATUS_SUCCESS This is the frame we should handle.
1422 /*----------------------------------------------------------------------------*/
1424 assocProcessRxDisassocFrame (
1425 IN P_ADAPTER_T prAdapter,
1426 IN P_SW_RFB_T prSwRfb,
1427 IN UINT_8 aucBSSID[],
1428 OUT PUINT_16 pu2ReasonCode
1431 P_WLAN_DISASSOC_FRAME_T prDisassocFrame;
1432 UINT_16 u2RxReasonCode;
1437 ASSERT(pu2ReasonCode);
1439 //4 <1> locate the Disassociation Frame.
1440 prDisassocFrame = (P_WLAN_DISASSOC_FRAME_T) prSwRfb->pvHeader;
1442 //4 <2> Parse the Header of Disassociation Frame.
1443 if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) < REASON_CODE_FIELD_LEN) {
1445 return WLAN_STATUS_FAILURE;
1448 /* Check if this Disassoc Frame is coming from Target BSSID */
1449 if (UNEQUAL_MAC_ADDR(prDisassocFrame->aucBSSID, aucBSSID)) {
1450 DBGLOG(SAA, LOUD, ("Ignore Disassoc Frame from other BSS ["MACSTR"]\n",
1451 MAC2STR(prDisassocFrame->aucSrcAddr)));
1452 return WLAN_STATUS_FAILURE;
1455 //4 <3> Parse the Fixed Fields of Deauthentication Frame Body.
1456 WLAN_GET_FIELD_16(&prDisassocFrame->u2ReasonCode, &u2RxReasonCode);
1457 *pu2ReasonCode = u2RxReasonCode;
1459 return WLAN_STATUS_SUCCESS;
1461 } /* end of assocProcessRxDisassocFrame() */
1465 /*----------------------------------------------------------------------------*/
1467 * @brief This function will parse and process the incoming Association Req frame
1468 * and return a Status Code.
1470 * @param[in] prAdapter Pointer to the Adapter structure.
1471 * @param[in] prSwRfb Pointer to SW RFB data structure.
1472 * @param[out] pu2StatusCode Pointer to store the Status Code for carried in Association Response.
1474 * @retval WLAN_STATUS_FAILURE This is not the frame we should handle at current state.
1475 * @retval WLAN_STATUS_SUCCESS This is the frame we should handle.
1477 /*----------------------------------------------------------------------------*/
1479 assocProcessRxAssocReqFrame (
1480 IN P_ADAPTER_T prAdapter,
1481 IN P_SW_RFB_T prSwRfb,
1482 OUT PUINT_16 pu2StatusCode
1485 P_WLAN_ASSOC_REQ_FRAME_T prAssocReqFrame;
1486 P_STA_RECORD_T prStaRec;
1487 P_BSS_INFO_T prBssInfo;
1488 P_IE_SSID_T prIeSsid = (P_IE_SSID_T)NULL;
1489 P_RSN_INFO_ELEM_T prIeRsn = (P_RSN_INFO_ELEM_T)NULL;
1490 P_IE_SUPPORTED_RATE_T prIeSupportedRate = (P_IE_SUPPORTED_RATE_T)NULL;
1491 P_IE_EXT_SUPPORTED_RATE_T prIeExtSupportedRate = (P_IE_EXT_SUPPORTED_RATE_T)NULL;
1492 PUINT_8 pucIE, pucIEStart;
1494 UINT_16 u2Offset = 0;
1495 UINT_16 u2StatusCode = STATUS_CODE_SUCCESSFUL;
1496 UINT_16 u2RxFrameCtrl;
1497 UINT_16 u2BSSBasicRateSet;
1498 BOOLEAN fgIsUnknownBssBasicRate;
1504 ASSERT(pu2StatusCode);
1506 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1508 if (prStaRec == NULL) {
1509 return WLAN_STATUS_FAILURE;
1512 //4 <1> locate the Association Req Frame.
1513 prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T) prSwRfb->pvHeader;
1515 //4 <2> Parse the Header of Association Req Frame.
1516 if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) <
1517 (CAP_INFO_FIELD_LEN + LISTEN_INTERVAL_FIELD_LEN)) {
1519 return WLAN_STATUS_FAILURE;
1522 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
1524 /* Check if this Disassoc Frame is coming from Target BSSID */
1525 if (UNEQUAL_MAC_ADDR(prAssocReqFrame->aucBSSID, prBssInfo->aucBSSID)) {
1526 return WLAN_STATUS_FAILURE; /* Just Ignore this MMPDU */
1529 //WLAN_GET_FIELD_16(&prAssocReqFrame->u2FrameCtrl, &u2RxFrameCtrl);
1530 u2RxFrameCtrl = prAssocReqFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1531 u2RxFrameCtrl &= MASK_FRAME_TYPE;
1532 if (MAC_FRAME_REASSOC_REQ == u2RxFrameCtrl) {
1533 prStaRec->fgIsReAssoc = TRUE;
1535 u2IELength = (prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) -
1536 (UINT_16)(OFFSET_OF(WLAN_REASSOC_REQ_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN);
1538 pucIEStart = pucIE = ((P_WLAN_REASSOC_REQ_FRAME_T)(prSwRfb->pvHeader))->aucInfoElem;
1541 prStaRec->fgIsReAssoc = FALSE;
1543 u2IELength = (prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) -
1544 (UINT_16)(OFFSET_OF(WLAN_ASSOC_REQ_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN);
1546 pucIEStart = pucIE = prAssocReqFrame->aucInfoElem;
1550 //4 <3> Parse the Fixed Fields of Assoc Req Frame Body.
1551 prStaRec->u2CapInfo = prAssocReqFrame->u2CapInfo;
1553 #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_HOTSPOT_PRIVACY_CHECK
1554 if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1555 if (((prStaRec->u2CapInfo & CAP_INFO_PRIVACY) &&
1556 !kalP2PGetCipher(prAdapter->prGlueInfo))) {
1557 u2StatusCode = STATUS_CODE_CAP_NOT_SUPPORTED;
1558 DBGLOG(RSN, TRACE, ("STA Assoc req privacy bit check fail\n"));
1559 return WLAN_STATUS_SUCCESS;
1564 prStaRec->u2ListenInterval = prAssocReqFrame->u2ListenInterval;
1565 prStaRec->ucPhyTypeSet = 0;
1567 /* Might be legacy client or p2p gc. */
1568 prStaRec->eStaType = STA_TYPE_LEGACY_CLIENT;
1570 //4 <4> Parse the IE of Assoc Req Frame Body.
1571 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1572 switch (IE_ID(pucIE)) {
1574 if ((!prIeSsid) && /* NOTE(Kevin): Get SSID once */
1575 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
1576 prIeSsid = (P_IE_SSID_T)pucIE;
1580 case ELEM_ID_SUP_RATES:
1581 if ((!prIeSupportedRate) && (IE_LEN(pucIE) <= RATE_NUM)) {
1582 prIeSupportedRate = SUP_RATES_IE(pucIE);
1586 case ELEM_ID_EXTENDED_SUP_RATES:
1587 if (!prIeExtSupportedRate)
1588 prIeExtSupportedRate = EXT_SUP_RATES_IE(pucIE);
1590 case ELEM_ID_HT_CAP:
1591 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HT;
1594 #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_HOTSPOT_PRIVACY_CHECK
1595 if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1596 prIeRsn = RSN_IE(pucIE);
1597 rsnParserCheckForRSNCCMPPSK(prAdapter, prIeRsn, &u2StatusCode);
1598 if (u2StatusCode != STATUS_CODE_SUCCESSFUL) {
1599 *pu2StatusCode = u2StatusCode;
1600 return WLAN_STATUS_SUCCESS;
1605 case ELEM_ID_VENDOR:
1606 #if CFG_ENABLE_WIFI_DIRECT
1608 if ((prAdapter->fgIsP2PRegistered)) {
1609 UINT_8 ucOuiType = 0;
1611 p2pFuncParseCheckForP2PInfoElem(prAdapter, pucIE, &ucOuiType);
1613 if (ucOuiType == VENDOR_OUI_TYPE_P2P) {
1614 DBGLOG(P2P, TRACE, ("Target Client is a P2P group client\n"));
1615 prStaRec->eStaType = STA_TYPE_P2P_GC;
1622 for (i = 0; i < (sizeof(rxAssocReqIETable) / sizeof(VERIFY_IE_ENTRY_T)); i++) {
1624 if ((IE_ID(pucIE)) == rxAssocReqIETable[i].ucElemID) {
1625 rxAssocReqIETable[i].pfnVarifyIE(prAdapter, prSwRfb, (P_IE_HDR_T)pucIE, &u2StatusCode);
1627 if (u2StatusCode != STATUS_CODE_SUCCESSFUL) {
1628 *pu2StatusCode = u2StatusCode;
1629 return WLAN_STATUS_SUCCESS;
1636 } /* end of IE_FOR_EACH */
1638 // parsing for WMM related information (2010/12/21)
1647 if (UNEQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen,
1648 prIeSsid->aucSSID, prIeSsid->ucLength)) {
1650 u2StatusCode = STATUS_CODE_UNSPECIFIED_FAILURE;
1655 u2StatusCode = STATUS_CODE_UNSPECIFIED_FAILURE;
1659 prStaRec->u2OperationalRateSet = 0;
1660 prStaRec->u2BSSBasicRateSet = 0;
1662 if (prIeSupportedRate || prIeExtSupportedRate) {
1663 rateGetRateSetFromIEs(prIeSupportedRate,
1664 prIeExtSupportedRate,
1665 &prStaRec->u2OperationalRateSet,
1666 &u2BSSBasicRateSet, /* Ignore any Basic Bit */
1667 &fgIsUnknownBssBasicRate);
1669 if ((prBssInfo->u2BSSBasicRateSet & prStaRec->u2OperationalRateSet) !=
1670 prBssInfo->u2BSSBasicRateSet) {
1672 u2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
1676 /* Accpet the Sta, update BSSBasicRateSet from Bss */
1678 prStaRec->u2BSSBasicRateSet = prBssInfo->u2BSSBasicRateSet;
1680 prStaRec->u2DesiredNonHTRateSet = (prStaRec->u2OperationalRateSet & RATE_SET_ALL_ABG);
1682 if (BAND_2G4 == HIF_RX_HDR_GET_RF_BAND(prSwRfb->prHifRxHdr)) {
1683 #if 0 /* Marked by CMC 20111024 */
1684 /* check if support 11n */
1685 if (!(u2BSSBasicRateSet & RATE_SET_BIT_HT_PHY)) {
1687 if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1688 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_ERP;
1692 if (!(u2BSSBasicRateSet & RATE_SET_OFDM)) {
1693 if (prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) {
1694 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HR_DSSS;
1701 if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1702 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_ERP;
1704 if (prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) {
1705 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HR_DSSS;
1709 else { /* (BAND_5G == prBssDesc->eBande) */
1710 #if 0 /* Marked by CMC 20111024 */
1711 if (!(u2BSSBasicRateSet & RATE_SET_BIT_HT_PHY)) {
1713 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_OFDM;
1715 ASSERT((prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) == 0);
1717 if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1718 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_OFDM;
1726 u2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
1730 #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_HOTSPOT_PRIVACY_CHECK
1731 if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1733 if (!kalP2PGetCipher(prAdapter->prGlueInfo)) {
1734 u2StatusCode = STATUS_CODE_CIPHER_SUITE_REJECTED;
1739 prStaRec->rSecInfo.fgAllowOnly1x = FALSE;
1740 if (kalP2PGetCipher(prAdapter->prGlueInfo)) {
1742 prStaRec->rSecInfo.fgAllowOnly1x = TRUE;
1751 #if CFG_ENABLE_WIFI_DIRECT
1752 if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1755 PUINT_8 cp = (PUINT_8)&prAssocReqFrame->u2CapInfo;
1756 if (prStaRec->fgIsReAssoc)
1760 if (prStaRec->pucAssocReqIe) {
1761 kalMemFree(prStaRec->pucAssocReqIe, VIR_MEM_TYPE, prStaRec->u2AssocReqIeLen);
1762 prStaRec->pucAssocReqIe = NULL;
1764 prStaRec->u2AssocReqIeLen = u2IELength;
1766 prStaRec->pucAssocReqIe = kalMemAlloc(u2IELength, VIR_MEM_TYPE);
1767 kalMemCopy(prStaRec->pucAssocReqIe, cp, u2IELength);
1771 kalP2PUpdateAssocInfo(prAdapter->prGlueInfo, (PUINT_8)&prAssocReqFrame->u2CapInfo, u2IELength + (prStaRec->fgIsReAssoc ? 10 : 4), prStaRec->fgIsReAssoc);
1775 *pu2StatusCode = u2StatusCode;
1777 return WLAN_STATUS_SUCCESS;
1779 } /* end of assocProcessRxAssocReqFrame() */
1782 /*----------------------------------------------------------------------------*/
1784 * @brief This function is used to compose Common Information Elements for Association
1787 * @param[in] prMsduInfo Pointer to the composed MSDU_INFO_T.
1788 * @param[in] prBssInfo Pointer to the BSS_INFO_T.
1792 /*----------------------------------------------------------------------------*/
1794 assocBuildReAssocRespFrameCommonIEs (
1795 IN P_ADAPTER_T prAdapter,
1796 IN P_MSDU_INFO_T prMsduInfo,
1797 IN P_BSS_INFO_T prBssInfo
1801 P_STA_RECORD_T prStaRec;
1802 UINT_8 ucSupRatesLen;
1803 UINT_8 ucExtSupRatesLen;
1807 ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1809 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1813 pucBuffer = (PUINT_8)((UINT_32)prMsduInfo->prPacket +
1814 (UINT_32)prMsduInfo->u2FrameLength);
1817 if (prBssInfo->ucAllSupportedRatesLen > ELEM_MAX_LEN_SUP_RATES) {
1819 ucSupRatesLen = ELEM_MAX_LEN_SUP_RATES;
1820 ucExtSupRatesLen = prBssInfo->ucAllSupportedRatesLen - ELEM_MAX_LEN_SUP_RATES;
1823 ucSupRatesLen = prBssInfo->ucAllSupportedRatesLen;
1824 ucExtSupRatesLen = 0;
1827 /* Fill the Supported Rates element. */
1828 if (ucSupRatesLen) {
1829 SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_SUP_RATES;
1830 SUP_RATES_IE(pucBuffer)->ucLength = ucSupRatesLen;
1831 kalMemCopy(SUP_RATES_IE(pucBuffer)->aucSupportedRates,
1832 prBssInfo->aucAllSupportedRates,
1835 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
1836 pucBuffer += IE_SIZE(pucBuffer);
1840 /* Fill the Extended Supported Rates element. */
1841 if (ucExtSupRatesLen) {
1843 EXT_SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_EXTENDED_SUP_RATES;
1844 EXT_SUP_RATES_IE(pucBuffer)->ucLength = ucExtSupRatesLen;
1846 kalMemCopy(EXT_SUP_RATES_IE(pucBuffer)->aucExtSupportedRates,
1847 &prBssInfo->aucAllSupportedRates[ucSupRatesLen],
1850 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
1854 } /* end of assocBuildReAssocRespFrameCommonIEs() */
1857 /*----------------------------------------------------------------------------*/
1859 * @brief This function will compose the (Re)Association Response frame
1861 * @param[in] prStaRec Pointer to the STA_RECORD_T
1862 * @param[in] pucBuffer Pointer to the frame buffer.
1863 * @param[in] aucBssid Given BSSID.
1864 * @param[in] u2CapInfo Capability Field of current BSS.
1865 * @param[in out] pu2PayloadLen Return the length of the composed fixed fields
1869 /*----------------------------------------------------------------------------*/
1871 assocComposeReAssocRespFrameHeaderAndFF (
1872 IN P_STA_RECORD_T prStaRec,
1873 IN PUINT_8 pucBuffer,
1874 IN UINT_8 aucBSSID[],
1875 IN UINT_16 u2CapInfo,
1876 IN OUT PUINT_16 pu2PayloadLen
1879 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1880 BOOLEAN fgIsReAssoc;
1882 UINT_16 u2FrameCtrl;
1888 ASSERT(pu2PayloadLen);
1890 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T)pucBuffer;
1891 fgIsReAssoc = prStaRec->fgIsReAssoc;
1893 //4 <1> Compose the frame header of the (Re)Association Request frame.
1894 /* Fill the Frame Control field. */
1896 u2FrameCtrl = MAC_FRAME_REASSOC_RSP;
1899 u2FrameCtrl = MAC_FRAME_ASSOC_RSP;
1901 //WLAN_SET_FIELD_16(&prAssocFrame->u2FrameCtrl, u2FrameCtrl);
1902 prAssocRspFrame->u2FrameCtrl = u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1904 /* Fill the DA field with Target MAC Address. */
1905 COPY_MAC_ADDR(prAssocRspFrame->aucDestAddr, prStaRec->aucMacAddr);
1907 /* Fill the SA field with current BSSID. */
1908 COPY_MAC_ADDR(prAssocRspFrame->aucSrcAddr, aucBSSID);
1910 /* Fill the BSSID field with current BSSID. */
1911 COPY_MAC_ADDR(prAssocRspFrame->aucBSSID, aucBSSID);
1913 /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
1914 prAssocRspFrame->u2SeqCtrl = 0;
1917 //4 <2> Compose the frame body's common fixed field part of the (Re)Association Request frame.
1918 /* Fill the Capability Information field. */
1919 //WLAN_SET_FIELD_16(&prAssocFrame->u2CapInfo, u2CapInfo);
1920 prAssocRspFrame->u2CapInfo = u2CapInfo; // NOTE(Kevin): Optimized for ARM
1922 //WLAN_SET_FIELD_16(&prAssocFrame->u2StatusCode, prStaRec->u2StatusCode);
1923 prAssocRspFrame->u2StatusCode = prStaRec->u2StatusCode; // NOTE(Kevin): Optimized for ARM
1925 //WLAN_SET_FIELD_16(&prAssocFrame->u2AssocId, ((prStaRec->u2AssocId & AID_MASK) | AID_MSB));
1926 prAssocRspFrame->u2AssocId =
1927 ((prStaRec->u2AssocId & AID_MASK) | AID_MSB); // NOTE(Kevin): Optimized for ARM
1929 *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
1930 STATUS_CODE_FIELD_LEN +
1934 } /* end of assocComposeReAssocRespFrameHeaderAndFF() */
1937 /*----------------------------------------------------------------------------*/
1939 * @brief This function will send the (Re)Association Resp frame
1941 * @param[in] prStaRec Pointer to the STA_RECORD_T
1943 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
1944 * @retval WLAN_STATUS_SUCCESS Successfully send frame to TX Module
1946 /*----------------------------------------------------------------------------*/
1948 assocSendReAssocRespFrame (
1949 IN P_ADAPTER_T prAdapter,
1950 IN P_STA_RECORD_T prStaRec
1953 P_BSS_INFO_T prBssInfo;
1954 P_MSDU_INFO_T prMsduInfo;
1956 UINT_16 u2PayloadLen;
1957 UINT_16 u2EstimatedFrameLen;
1958 UINT_16 u2EstimatedExtraIELen;
1959 BOOLEAN fgIsReAssoc;
1966 //4 <1> Allocate a PKT_INFO_T for Authentication Frame
1967 fgIsReAssoc = prStaRec->fgIsReAssoc;
1969 /* Init with MGMT Header Length + Length of Fixed Fields + Common IE Length */
1970 u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
1971 WLAN_MAC_MGMT_HEADER_LEN + \
1972 CAP_INFO_FIELD_LEN + \
1973 STATUS_CODE_FIELD_LEN + \
1975 (ELEM_HDR_LEN + ELEM_MAX_LEN_SUP_RATES) + \
1976 (ELEM_HDR_LEN + (RATE_NUM - ELEM_MAX_LEN_SUP_RATES));
1978 /* + Extra IE Length */
1979 u2EstimatedExtraIELen = 0;
1981 for (i = 0; i < sizeof(txAssocRespIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
1982 if (txAssocRespIETable[i].u2EstimatedFixedIELen != 0) {
1983 u2EstimatedExtraIELen += txAssocRespIETable[i].u2EstimatedFixedIELen;
1985 else if (txAssocRespIETable[i].pfnCalculateVariableIELen != NULL) {
1986 u2EstimatedExtraIELen += (UINT_16)txAssocRespIETable[i].pfnCalculateVariableIELen(prAdapter,
1987 prStaRec->ucNetTypeIndex,
1993 u2EstimatedFrameLen += u2EstimatedExtraIELen;
1995 /* Allocate a MSDU_INFO_T */
1996 if ( (prMsduInfo = cnmMgtPktAlloc(prAdapter, u2EstimatedFrameLen)) == NULL) {
1997 DBGLOG(AAA, WARN, ("No PKT_INFO_T for sending (Re)Assoc Response.\n"));
1998 return WLAN_STATUS_RESOURCES;
2001 //4 <2> Compose (Re)Association Request frame header and fixed fields in MSDU_INfO_T.
2002 ASSERT(prStaRec->ucNetTypeIndex != NETWORK_TYPE_AIS_INDEX);
2003 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
2005 /* Compose Header and Fixed Field */
2006 assocComposeReAssocRespFrameHeaderAndFF(prStaRec,
2007 (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
2008 prBssInfo->aucBSSID,
2009 prBssInfo->u2CapInfo,
2012 //4 <3> Update information of MSDU_INFO_T
2013 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
2015 prMsduInfo->eSrc = TX_PACKET_MGMT;
2016 prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;
2017 prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
2018 prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
2019 prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
2020 prMsduInfo->fgIs802_1x = FALSE;
2021 prMsduInfo->fgIs802_11 = TRUE;
2022 prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
2023 prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
2024 prMsduInfo->pfTxDoneHandler = aaaFsmRunEventTxDone;
2025 prMsduInfo->fgIsBasicRate = TRUE;
2027 //4 <4> Compose the frame body's IEs of the (Re)Association Request frame.
2028 assocBuildReAssocRespFrameCommonIEs(prAdapter, prMsduInfo, prBssInfo);
2031 //4 <5> Compose IEs in MSDU_INFO_T
2034 for (i = 0; i < sizeof(txAssocRespIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
2035 if (txAssocRespIETable[i].pfnAppendIE) {
2036 txAssocRespIETable[i].pfnAppendIE(prAdapter, prMsduInfo);
2040 /* TODO(Kevin): Also release the unused tail room of the composed MMPDU */
2042 //4 <6> Enqueue the frame to send this (Re)Association request frame.
2043 nicTxEnqueueMsdu(prAdapter, prMsduInfo);
2045 return WLAN_STATUS_SUCCESS;
2047 } /* end of assocSendReAssocRespFrame() */
2048 #endif /* CFG_SUPPORT_AAA */