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 { (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP), NULL, rlmRspGenerateExtCapIE }, /* 127 */
427 { (ELEM_HDR_LEN + ELEM_MAX_LEN_WMM_PARAM), NULL, mqmGenerateWmmParamIE } /* 221 */
431 /*******************************************************************************
432 * P R I V A T E D A T A
433 ********************************************************************************
436 /*******************************************************************************
438 ********************************************************************************
441 /*******************************************************************************
442 * F U N C T I O N D E C L A R A T I O N S
443 ********************************************************************************
446 /*******************************************************************************
448 ********************************************************************************
450 /*----------------------------------------------------------------------------*/
452 * @brief This function is used to compose the Capability Info Field.
454 * @param[in] prStaRec Pointer to the STA_RECORD_T
456 * @retval Capability Info Field
458 /*----------------------------------------------------------------------------*/
459 __KAL_INLINE__ UINT_16
460 assocBuildCapabilityInfo (
461 IN P_ADAPTER_T prAdapter,
462 IN P_STA_RECORD_T prStaRec
465 UINT_32 u4NonHTPhyType;
472 /* Set up our requested capabilities. */
473 u2CapInfo = CAP_INFO_ESS;
474 u2CapInfo |= CAP_CF_STA_NOT_POLLABLE;
476 if (prStaRec->u2CapInfo & CAP_INFO_PRIVACY) {
477 u2CapInfo |= CAP_INFO_PRIVACY;
482 if (prStaRec->fgHasBasicPhyType) {
483 u4NonHTPhyType = prStaRec->ucNonHTBasicPhyType;
485 if ( (rNonHTPhyAttributes[u4NonHTPhyType].fgIsShortPreambleOptionImplemented) &&
486 ( (prAdapter->rWifiVar.ePreambleType == PREAMBLE_TYPE_SHORT) || /* Short Preamble Option Enable is TRUE */
487 ((prAdapter->rWifiVar.ePreambleType == PREAMBLE_TYPE_AUTO) &&
488 (prStaRec->u2CapInfo & CAP_INFO_SHORT_PREAMBLE)) ) ) {
490 /* Case I: Implemented == TRUE and Short Preamble Option Enable == TRUE.
491 * Case II: Implemented == TRUE and Short Preamble == AUTO (depends on
492 * BSS_DESC_T's capability)
494 u2CapInfo |= CAP_INFO_SHORT_PREAMBLE;
497 if (rNonHTPhyAttributes[u4NonHTPhyType].fgIsShortSlotTimeOptionImplemented &&
498 prAdapter->rWifiVar.fgIsShortSlotTimeOptionEnable) {
499 u2CapInfo |= CAP_INFO_SHORT_SLOT_TIME;
503 DBGLOG(SAA, LOUD, ("ASSOC REQ: Compose Capability = 0x%04x for Target BSS ["MACSTR"].\n",
504 u2CapInfo, MAC2STR(prStaRec->aucMacAddr)));
509 } /* end of assocBuildCapabilityInfo() */
512 /*----------------------------------------------------------------------------*/
514 * @brief This function is used to compose Common Information Elements for Association
517 * @param[in] prMsduInfo Pointer to the composed MSDU_INFO_T.
521 /*----------------------------------------------------------------------------*/
523 assocBuildReAssocReqFrameCommonIEs (
524 IN P_ADAPTER_T prAdapter,
525 IN P_MSDU_INFO_T prMsduInfo
528 P_CONNECTION_SETTINGS_T prConnSettings;
529 P_STA_RECORD_T prStaRec;
531 UINT_16 u2SupportedRateSet;
532 UINT_8 aucAllSupportedRates[RATE_NUM] = {0};
533 UINT_8 ucAllSupportedRatesLen;
534 UINT_8 ucSupRatesLen;
535 UINT_8 ucExtSupRatesLen;
537 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
539 ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
541 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
548 pucBuffer = (PUINT_8)((UINT_32)prMsduInfo->prPacket +
549 (UINT_32)prMsduInfo->u2FrameLength);
552 if (IS_STA_IN_AIS(prStaRec)) {
554 /* Fill the SSID element. */
555 SSID_IE(pucBuffer)->ucId = ELEM_ID_SSID;
557 /* NOTE(Kevin): We copy the SSID from CONNECTION_SETTINGS for the case of
558 * Passive Scan and the target BSS didn't broadcast SSID on its Beacon Frame.
561 COPY_SSID(SSID_IE(pucBuffer)->aucSSID,
562 SSID_IE(pucBuffer)->ucLength,
563 prConnSettings->aucSSID,
564 prConnSettings->ucSSIDLen);
566 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
567 pucBuffer += IE_SIZE(pucBuffer);
570 #if CFG_ENABLE_WIFI_DIRECT
571 else if((prAdapter->fgIsP2PRegistered) &&
572 (IS_STA_IN_P2P(prStaRec))) {
573 pucBuffer = p2pBuildReAssocReqFrameCommonIEs(prAdapter, prMsduInfo, pucBuffer);
576 #if CFG_ENABLE_BT_OVER_WIFI
577 else if (IS_STA_IN_BOW(prStaRec)) {
579 SSID_IE(pucBuffer)->ucId = ELEM_ID_SSID;
581 /* NOTE(Kevin): We copy the SSID from CONNECTION_SETTINGS for the case of
582 * Passive Scan and the target BSS didn't broadcast SSID on its Beacon Frame.
585 COPY_SSID(SSID_IE(pucBuffer)->aucSSID,
586 SSID_IE(pucBuffer)->ucLength,
587 prConnSettings->aucSSID,
588 prConnSettings->ucSSIDLen);
590 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
591 pucBuffer += IE_SIZE(pucBuffer);
596 /* TODO(Kevin): For other network */
599 /* NOTE(Kevin 2008/12/19): 16.3.6.3 MLME-ASSOCIATE.indication -
600 * SupportedRates - The set of data rates that are supported by the STA
601 * that is requesting association.
602 * Original(Portable Driver): Only send the Rates that we'll support.
603 * New: Send the Phy Rates if the result of following & operation == NULL.
605 //rateGetDataRatesFromRateSet((prBssDesc->u2OperationalRateSet &
606 // rPhyAttributes[prBssDesc->ePhyType].u2SupportedRateSet),
608 if (prStaRec->fgHasBasicPhyType) {
609 UINT_32 u4NonHTPhyType;
612 u4NonHTPhyType = prStaRec->ucNonHTBasicPhyType;
614 u2SupportedRateSet = (prStaRec->u2OperationalRateSet &
615 rNonHTPhyAttributes[u4NonHTPhyType].u2SupportedRateSet);
617 ASSERT(u2SupportedRateSet);
619 if (!u2SupportedRateSet) {
620 u2SupportedRateSet = rNonHTPhyAttributes[u4NonHTPhyType].u2SupportedRateSet;
623 /* TODO(Kevin): For P2P, we shouldn't send support rate set which contains 11b rate */
625 rateGetDataRatesFromRateSet(u2SupportedRateSet,
627 aucAllSupportedRates,
628 &ucAllSupportedRatesLen);
630 ucSupRatesLen = ((ucAllSupportedRatesLen > ELEM_MAX_LEN_SUP_RATES) ?
631 ELEM_MAX_LEN_SUP_RATES : ucAllSupportedRatesLen);
633 ucExtSupRatesLen = ucAllSupportedRatesLen - ucSupRatesLen;
636 /* Fill the Supported Rates element. */
638 SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_SUP_RATES;
639 SUP_RATES_IE(pucBuffer)->ucLength = ucSupRatesLen;
640 kalMemCopy(SUP_RATES_IE(pucBuffer)->aucSupportedRates,
641 aucAllSupportedRates,
644 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
645 pucBuffer += IE_SIZE(pucBuffer);
649 /* Fill the Extended Supported Rates element. */
650 if (ucExtSupRatesLen) {
652 EXT_SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_EXTENDED_SUP_RATES;
653 EXT_SUP_RATES_IE(pucBuffer)->ucLength = ucExtSupRatesLen;
655 kalMemCopy(EXT_SUP_RATES_IE(pucBuffer)->aucExtSupportedRates,
656 &aucAllSupportedRates[ucSupRatesLen],
659 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
660 pucBuffer += IE_SIZE(pucBuffer);
665 } /* end of assocBuildReAssocReqFrameCommonIEs() */
668 /*----------------------------------------------------------------------------*/
670 * @brief This function will compose the (Re)Association Request frame header and
673 * @param[in] prStaRec Pointer to the STA_RECORD_T
674 * @param[in] pucBuffer Pointer to the frame buffer.
675 * @param[in] aucMACAddress Given Our MAC Address.
676 * @param[in out] pu2PayloadLen Return the length of the composed fixed fields
680 /*----------------------------------------------------------------------------*/
682 assocComposeReAssocReqFrameHeaderAndFF (
683 IN P_ADAPTER_T prAdapter,
684 IN P_STA_RECORD_T prStaRec,
685 IN PUINT_8 pucBuffer,
686 IN UINT_8 aucMACAddress[],
687 IN OUT PUINT_16 pu2PayloadLen
690 P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
695 UINT_16 u2ListenInterval;
700 ASSERT(aucMACAddress);
701 ASSERT(pu2PayloadLen);
703 prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)pucBuffer;
704 fgIsReAssoc = prStaRec->fgIsReAssoc;
706 //4 <1> Compose the frame header of the (Re)Association Request frame.
707 /* Fill the Frame Control field. */
709 u2FrameCtrl = MAC_FRAME_REASSOC_REQ;
712 u2FrameCtrl = MAC_FRAME_ASSOC_REQ;
714 WLAN_SET_FIELD_16(&prAssocFrame->u2FrameCtrl, u2FrameCtrl);
716 /* Fill the DA field with Target BSSID. */
717 COPY_MAC_ADDR(prAssocFrame->aucDestAddr, prStaRec->aucMacAddr);
719 /* Fill the SA field with our MAC Address. */
720 COPY_MAC_ADDR(prAssocFrame->aucSrcAddr, aucMACAddress);
722 /* Fill the BSSID field with Target BSSID. */
723 COPY_MAC_ADDR(prAssocFrame->aucBSSID, prStaRec->aucMacAddr);
725 /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
726 prAssocFrame->u2SeqCtrl = 0;
729 //4 <2> Compose the frame body's common fixed field part of the (Re)Association Request frame.
730 u2CapInfo = assocBuildCapabilityInfo(prAdapter, prStaRec);
732 /* Fill the Capability Information field. */
733 WLAN_SET_FIELD_16(&prAssocFrame->u2CapInfo, u2CapInfo);
736 /* Calculate the listen interval for the maximum power mode. Currently, we
737 set it to the value 2 times DTIM period. */
738 if (prStaRec->ucDTIMPeriod) {
739 u2ListenInterval = prStaRec->ucDTIMPeriod * DEFAULT_LISTEN_INTERVAL_BY_DTIM_PERIOD;
742 DBGLOG(SAA, TRACE, ("Use default listen interval\n"));
743 u2ListenInterval = DEFAULT_LISTEN_INTERVAL;
745 prStaRec->u2ListenInterval = u2ListenInterval;
747 /* Fill the Listen Interval field. */
748 WLAN_SET_FIELD_16(&prAssocFrame->u2ListenInterval, u2ListenInterval);
751 //4 <3> Compose the Current AP Address field for ReAssociation Request frame.
752 /* Fill the Current AP Address field. */
753 if (prStaRec->fgIsReAssoc) {
754 if (IS_STA_IN_AIS(prStaRec)) {
756 P_AIS_BSS_INFO_T prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
757 P_WLAN_REASSOC_REQ_FRAME_T prReAssocFrame =
758 (P_WLAN_REASSOC_REQ_FRAME_T)prAssocFrame;
760 COPY_MAC_ADDR(prReAssocFrame->aucCurrentAPAddr, prAisBssInfo->aucBSSID);
763 ASSERT(0); /* We don't support ReAssociation for other network */
766 *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
767 LISTEN_INTERVAL_FIELD_LEN +
768 CURR_AP_ADDR_FIELD_LEN);
771 *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
772 LISTEN_INTERVAL_FIELD_LEN);
776 } /* end of assocComposeReAssocReqFrame() */
779 /*----------------------------------------------------------------------------*/
781 * @brief This function will send the (Re)Association Request frame
783 * @param[in] prStaRec Pointer to the STA_RECORD_T
785 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
786 * @retval WLAN_STATUS_SUCCESS Successfully send frame to TX Module
788 /*----------------------------------------------------------------------------*/
790 assocSendReAssocReqFrame (
791 IN P_ADAPTER_T prAdapter,
792 IN P_STA_RECORD_T prStaRec
795 P_MSDU_INFO_T prMsduInfo;
796 P_BSS_INFO_T prBssInfo;
798 UINT_16 u2PayloadLen;
799 UINT_16 u2EstimatedFrameLen;
800 UINT_16 u2EstimatedExtraIELen;
807 //4 <1> Allocate a PKT_INFO_T for Authentication Frame
808 fgIsReAssoc = prStaRec->fgIsReAssoc;
810 /* Init with MGMT Header Length + Length of Fixed Fields + Common IE Length */
812 u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
813 WLAN_MAC_MGMT_HEADER_LEN + \
814 CAP_INFO_FIELD_LEN + \
815 LISTEN_INTERVAL_FIELD_LEN + \
816 CURR_AP_ADDR_FIELD_LEN + \
817 (ELEM_HDR_LEN + ELEM_MAX_LEN_SSID) + \
818 (ELEM_HDR_LEN + ELEM_MAX_LEN_SUP_RATES) + \
819 (ELEM_HDR_LEN + (RATE_NUM - ELEM_MAX_LEN_SUP_RATES));
822 u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
823 WLAN_MAC_MGMT_HEADER_LEN + \
824 CAP_INFO_FIELD_LEN + \
825 LISTEN_INTERVAL_FIELD_LEN + \
826 (ELEM_HDR_LEN + ELEM_MAX_LEN_SSID) + \
827 (ELEM_HDR_LEN + ELEM_MAX_LEN_SUP_RATES) + \
828 (ELEM_HDR_LEN + (RATE_NUM - ELEM_MAX_LEN_SUP_RATES));
831 /* + Extra IE Length */
832 u2EstimatedExtraIELen = 0;
834 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211 && CFG_ENABLE_WIFI_DIRECT
835 if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_P2P_INDEX) {
836 if ((prAdapter->fgIsP2PRegistered)) {
837 u2EstimatedExtraIELen = p2pCalculate_IEForAssocReq(prAdapter,
838 prStaRec->ucNetTypeIndex,
842 DBGLOG(P2P, TRACE, ("Function Linker Lost.\n"));
847 for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
848 if (txAssocReqIETable[i].u2EstimatedFixedIELen != 0) {
849 u2EstimatedExtraIELen += txAssocReqIETable[i].u2EstimatedFixedIELen;
852 u2EstimatedExtraIELen += (UINT_16)txAssocReqIETable[i].pfnCalculateVariableIELen(prAdapter,
853 prStaRec->ucNetTypeIndex,
859 for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
860 if (txAssocReqIETable[i].u2EstimatedFixedIELen != 0) {
861 u2EstimatedExtraIELen += txAssocReqIETable[i].u2EstimatedFixedIELen;
864 u2EstimatedExtraIELen += (UINT_16)txAssocReqIETable[i].pfnCalculateVariableIELen(prAdapter,
865 prStaRec->ucNetTypeIndex,
871 u2EstimatedFrameLen += u2EstimatedExtraIELen;
873 /* Allocate a MSDU_INFO_T */
874 if ( (prMsduInfo = cnmMgtPktAlloc(prAdapter, u2EstimatedFrameLen)) == NULL) {
875 DBGLOG(SAA, WARN, ("No PKT_INFO_T for sending (Re)Assoc Request.\n"));
876 return WLAN_STATUS_RESOURCES;
879 //4 <2> Compose (Re)Association Request frame header and fixed fields in MSDU_INfO_T.
880 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
881 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
884 /* Compose Header and Fixed Field */
885 assocComposeReAssocReqFrameHeaderAndFF(prAdapter,
887 (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
888 prBssInfo->aucOwnMacAddr,
891 //4 <3> Update information of MSDU_INFO_T
892 prMsduInfo->eSrc = TX_PACKET_MGMT;
893 prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;
894 prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
895 prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
896 prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
897 prMsduInfo->fgIs802_1x = FALSE;
898 prMsduInfo->fgIs802_11 = TRUE;
899 prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
900 prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
901 prMsduInfo->pfTxDoneHandler = saaFsmRunEventTxDone;
902 prMsduInfo->fgIsBasicRate = TRUE;
904 //4 <4> Compose the frame body's IEs of the (Re)Association Request frame.
905 assocBuildReAssocReqFrameCommonIEs(prAdapter, prMsduInfo);
908 //4 <5> Compose IEs in MSDU_INFO_T
909 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211 && CFG_ENABLE_WIFI_DIRECT
910 if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_P2P_INDEX) {
911 if ((prAdapter->fgIsP2PRegistered)) {
912 p2pGenerate_IEForAssocReq(prAdapter, prMsduInfo);
915 DBGLOG(P2P, TRACE, ("Function Linker Lost.\n"));
921 for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
922 if (txAssocReqIETable[i].pfnAppendIE) {
923 txAssocReqIETable[i].pfnAppendIE(prAdapter, prMsduInfo);
929 for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
930 if (txAssocReqIETable[i].pfnAppendIE) {
931 txAssocReqIETable[i].pfnAppendIE(prAdapter, prMsduInfo);
936 //4 <6> Update the (Re)association request information
937 if (IS_STA_IN_AIS(prStaRec)) {
938 P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
940 prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
942 #if CFG_RSN_MIGRATION
943 kalUpdateReAssocReqInfo(prAdapter->prGlueInfo,
944 (PUINT_8)&prAssocFrame->u2CapInfo,
945 prMsduInfo->u2FrameLength - offsetof(WLAN_ASSOC_REQ_FRAME_T, u2CapInfo),
950 #if CFG_ENABLE_WIFI_DIRECT
951 if ((prAdapter->fgIsP2PRegistered) && (IS_STA_IN_P2P(prStaRec))) {
952 P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
954 prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
957 kalP2PUpdateAssocInfo(
958 prAdapter->prGlueInfo,
959 (PUINT_8)&prAssocFrame->u2CapInfo,
960 prMsduInfo->u2FrameLength - offsetof(WLAN_ASSOC_REQ_FRAME_T, u2CapInfo),
965 /* TODO(Kevin): Also release the unused tail room of the composed MMPDU */
967 //4 <6> Enqueue the frame to send this (Re)Association request frame.
968 nicTxEnqueueMsdu(prAdapter, prMsduInfo);
970 return WLAN_STATUS_SUCCESS;
971 } /* end of assocSendReAssocReqFrame() */
974 /*----------------------------------------------------------------------------*/
976 * @brief This function will strictly check the TX (Re)Association Request frame for
977 * SAA event handling.
979 * @param[in] prMsduInfo Pointer of MSDU_INFO_T
981 * @retval WLAN_STATUS_FAILURE This is not the frame we should handle at current state.
982 * @retval WLAN_STATUS_SUCCESS This is the frame we should handle.
984 /*----------------------------------------------------------------------------*/
986 assocCheckTxReAssocReqFrame (
987 IN P_ADAPTER_T prAdapter,
988 IN P_MSDU_INFO_T prMsduInfo
991 P_WLAN_ASSOC_REQ_FRAME_T prAssocReqFrame;
992 P_STA_RECORD_T prStaRec;
993 UINT_16 u2TxFrameCtrl;
997 ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
999 prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T)(prMsduInfo->prPacket);
1000 ASSERT(prAssocReqFrame);
1002 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1006 return WLAN_STATUS_INVALID_PACKET;
1009 //WLAN_GET_FIELD_16(&prAssocReqFrame->u2FrameCtrl, &u2TxFrameCtrl)
1010 u2TxFrameCtrl = prAssocReqFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1011 u2TxFrameCtrl &= MASK_FRAME_TYPE;
1012 if (prStaRec->fgIsReAssoc) {
1013 if (u2TxFrameCtrl != MAC_FRAME_REASSOC_REQ) {
1014 return WLAN_STATUS_FAILURE;
1018 if (u2TxFrameCtrl != MAC_FRAME_ASSOC_REQ) {
1019 return WLAN_STATUS_FAILURE;
1023 return WLAN_STATUS_SUCCESS;
1025 } /* end of assocCheckTxReAssocReqFrame() */
1028 /*----------------------------------------------------------------------------*/
1030 * @brief This function will strictly check the TX (Re)Association Response frame for
1031 * AAA event handling.
1033 * @param[in] prMsduInfo Pointer of MSDU_INFO_T
1035 * @retval WLAN_STATUS_FAILURE This is not the frame we should handle at current state.
1036 * @retval WLAN_STATUS_SUCCESS This is the frame we should handle.
1038 /*----------------------------------------------------------------------------*/
1040 assocCheckTxReAssocRespFrame (
1041 IN P_ADAPTER_T prAdapter,
1042 IN P_MSDU_INFO_T prMsduInfo
1045 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1046 P_STA_RECORD_T prStaRec;
1047 UINT_16 u2TxFrameCtrl;
1051 ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1053 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T)(prMsduInfo->prPacket);
1054 ASSERT(prAssocRspFrame);
1056 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1060 return WLAN_STATUS_INVALID_PACKET;
1063 //WLAN_GET_FIELD_16(&prAssocFrame->u2FrameCtrl, &u2TxFrameCtrl)
1064 u2TxFrameCtrl = prAssocRspFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1065 u2TxFrameCtrl &= MASK_FRAME_TYPE;
1066 if (prStaRec->fgIsReAssoc) {
1067 if (u2TxFrameCtrl != MAC_FRAME_REASSOC_RSP) {
1068 return WLAN_STATUS_FAILURE;
1072 if (u2TxFrameCtrl != MAC_FRAME_ASSOC_RSP) {
1073 return WLAN_STATUS_FAILURE;
1077 return WLAN_STATUS_SUCCESS;
1079 } /* end of assocCheckTxReAssocRespFrame() */
1082 /*----------------------------------------------------------------------------*/
1084 * @brief This function will validate the incoming (Re)Association Frame and take out
1087 * @param[in] prSwRfb Pointer to SW RFB data structure.
1088 * @param[out] pu2StatusCode Pointer to store the Status Code from Authentication.
1090 * @retval WLAN_STATUS_FAILURE This is not the frame we should handle at current state.
1091 * @retval WLAN_STATUS_SUCCESS This is the frame we should handle.
1093 /*----------------------------------------------------------------------------*/
1095 assocCheckRxReAssocRspFrameStatus (
1096 IN P_ADAPTER_T prAdapter,
1097 IN P_SW_RFB_T prSwRfb,
1098 OUT PUINT_16 pu2StatusCode
1101 P_STA_RECORD_T prStaRec;
1102 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1103 UINT_16 u2RxFrameCtrl;
1104 UINT_16 u2RxCapInfo;
1105 UINT_16 u2RxStatusCode;
1106 UINT_16 u2RxAssocId;
1110 ASSERT(pu2StatusCode);
1112 if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) < (CAP_INFO_FIELD_LEN +
1113 STATUS_CODE_FIELD_LEN +
1116 return WLAN_STATUS_FAILURE;
1119 DBGLOG(SAA, LOUD, ("prSwRfb->u2PayloadLength = %d\n", prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen));
1121 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1125 return WLAN_STATUS_INVALID_PACKET;
1128 //4 <1> locate the (Re)Assocation Resp Frame.
1129 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prSwRfb->pvHeader;
1131 //4 <2> Parse the Header of (Re)Assocation Resp Frame.
1132 //WLAN_GET_FIELD_16(&prAssocRspFrame->u2FrameCtrl, &u2RxFrameCtrl);
1133 u2RxFrameCtrl = prAssocRspFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1134 u2RxFrameCtrl &= MASK_FRAME_TYPE;
1135 if (prStaRec->fgIsReAssoc) {
1136 if (u2RxFrameCtrl != MAC_FRAME_REASSOC_RSP) {
1137 return WLAN_STATUS_FAILURE;
1141 if (u2RxFrameCtrl != MAC_FRAME_ASSOC_RSP) {
1142 return WLAN_STATUS_FAILURE;
1146 //4 <3> Parse the Fixed Fields of (Re)Assocation Resp Frame Body.
1147 //WLAN_GET_FIELD_16(&prAssocRspFrame->u2CapInfo, &u2RxCapInfo);
1148 u2RxCapInfo = prAssocRspFrame->u2CapInfo; // NOTE(Kevin): Optimized for ARM
1150 //WLAN_GET_FIELD_16(&prAssocRspFrame->u2StatusCode, &u2RxStatusCode);
1151 u2RxStatusCode = prAssocRspFrame->u2StatusCode; // NOTE(Kevin): Optimized for ARM
1153 //4 <4> Check CAP_INFO
1154 /* NOTE(Kevin): CM suggest to add MGMT workaround for those APs didn't check
1155 * the CAP Privacy Bit to overcome a corner case that the Privacy Bit
1156 * of our SCAN result didn't consist with AP's Association Resp.
1158 if (u2RxStatusCode == STATUS_CODE_SUCCESSFUL) {
1159 #if CFG_SUPPORT_WAPI
1160 if (prAdapter->rWifiVar.rConnSettings.fgWapiMode) {
1161 /* WAPI AP allow the customer use WZC to join mode, the privacy bit is 0 */
1162 /* even at WAI & WAPI_PSK mode, but the assoc respose set the privacy bit set 1 */
1163 DBGLOG(SEC, TRACE, ("Workaround the WAPI AP allow the customer to use WZC to join\n"));
1167 #if CFG_ENABLE_WIFI_DIRECT
1168 if (prAdapter->fgIsP2PRegistered && 1) {
1169 /* Todo:: Fixed this */
1176 #if CFG_STRICT_CHECK_CAPINFO_PRIVACY
1177 if ((prStaRec->u2CapInfo & CAP_INFO_PRIVACY) ^ (u2RxCapInfo & CAP_INFO_PRIVACY)) {
1178 u2RxStatusCode = STATUS_CODE_CAP_NOT_SUPPORTED;
1183 if (u2RxStatusCode == STATUS_CODE_SUCCESSFUL) {
1184 #if CFG_RSN_MIGRATION
1185 /* Update the information in the structure used to query and set
1186 OID_802_11_ASSOCIATION_INFORMATION. */
1187 kalUpdateReAssocRspInfo(prAdapter->prGlueInfo,
1188 (PUINT_8)&prAssocRspFrame->u2CapInfo,
1189 (UINT_32)(prSwRfb->u2PacketLen));
1193 //4 <5> Update CAP_INFO and ASSOC_ID
1194 if (u2RxStatusCode == STATUS_CODE_SUCCESSFUL) {
1195 prStaRec->u2CapInfo = u2RxCapInfo;
1197 //WLAN_GET_FIELD_16(&prAssocRspFrame->u2AssocId, &u2RxAssocId);
1198 u2RxAssocId = prAssocRspFrame->u2AssocId; // NOTE(Kevin): Optimized for ARM
1200 /* 20110715 Workaround for Kingnet 710 AP (Realtek 8186)
1201 * This AP raises the bit 6&7 not bit 14&15 in AID field.
1202 * It cause wrong AID assignment.
1204 * Normal case: 0xC002(1100 0000 0000 0010) => 2
1205 * Kingnet 710: 0x00C2(0000 0000 1100 0010) => 194
1206 * workaround: mask bit 6&7 for this AP
1208 if((u2RxAssocId & BIT(6)) &&
1209 (u2RxAssocId & BIT(7)) &&
1210 !(u2RxAssocId & BITS(8, 15))) {
1211 prStaRec->u2AssocId = u2RxAssocId & ~BITS(6,7);
1213 prStaRec->u2AssocId = u2RxAssocId & ~AID_MSB;
1214 #if CFG_SUPPORT_802_11W
1215 if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX) {
1216 P_AIS_SPECIFIC_BSS_INFO_T prBssSpecInfo;
1218 prBssSpecInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
1219 ASSERT(prBssSpecInfo);
1221 prBssSpecInfo->ucSaQueryTimedOut = 0;
1227 #if CFG_SUPPORT_802_11W
1228 if (u2RxStatusCode == STATUS_CODE_AUTH_ALGORITHM_NOT_SUPPORTED){
1229 DBGLOG(SAA, INFO, ("AP rejected due the authentication algorithm not support\n"));
1231 else if (u2RxStatusCode == STATUS_CODE_ASSOC_REJECTED_TEMPORARILY) {
1232 PUINT_8 pucIE, pucTime;
1234 UINT_16 u2Offset = 0;
1236 u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
1237 pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
1239 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1240 if (ELEM_ID_TIMEOUT_INTERVAL == IE_ID(pucIE) && IE_LEN(pucIE) == 5) {
1241 pucTime = ((P_IE_HDR_T)pucIE)->aucInfo;
1242 if (pucTime[0] == ACTION_SA_TIMEOUT_ASSOC_COMEBACK) {
1244 WLAN_GET_FIELD_32(pucTime + 1, &tu);
1245 DBGLOG(SAA, INFO, ("AP rejected association temporarily; comeback duration %u TU "
1246 "(%u ms)\n", tu, TU_TO_MSEC(tu)));
1247 if (tu > TX_ASSOCIATION_RETRY_TIMEOUT_TU) {
1248 DBGLOG(SAA, INFO, ("Update timer based on comeback duration\n"));
1249 //ieee80211_reschedule_timer(wpa_s, ms);
1254 } /* end of IE_FOR_EACH */
1257 *pu2StatusCode = u2RxStatusCode;
1259 return WLAN_STATUS_SUCCESS;
1261 } /* end of assocCheckRxReAssocRspFrameStatus() */
1264 /*----------------------------------------------------------------------------*/
1266 * \brief This function will compose the Disassociation frame
1268 * @param[in] prStaRec Pointer to the STA_RECORD_T
1269 * @param[in] pucBuffer Pointer to the frame buffer.
1270 * @param[in] aucMACAddress Given Our MAC Address.
1271 * @param[in] u2ReasonCode The reason code of disassociation
1275 /*----------------------------------------------------------------------------*/
1277 assocComposeDisassocFrame (
1278 IN P_STA_RECORD_T prStaRec,
1279 IN PUINT_8 pucBuffer,
1280 IN UINT_8 aucMACAddress[],
1281 IN UINT_16 u2ReasonCode
1284 P_WLAN_DISASSOC_FRAME_T prDisAssocFrame;
1285 UINT_16 u2FrameCtrl;
1289 ASSERT(aucMACAddress);
1291 prDisAssocFrame = (P_WLAN_DISASSOC_FRAME_T)pucBuffer;
1293 //4 <1> Compose the frame header of the DisAssociation frame.
1294 /* Fill the Frame Control field. */
1295 u2FrameCtrl = MAC_FRAME_DISASSOC;
1297 WLAN_SET_FIELD_16(&prDisAssocFrame->u2FrameCtrl, u2FrameCtrl);
1299 /* Fill the DA field with Target BSSID. */
1300 COPY_MAC_ADDR(prDisAssocFrame->aucDestAddr, prStaRec->aucMacAddr);
1302 /* Fill the SA field with our MAC Address. */
1303 COPY_MAC_ADDR(prDisAssocFrame->aucSrcAddr, aucMACAddress);
1305 /* Fill the BSSID field with Target BSSID. */
1306 COPY_MAC_ADDR(prDisAssocFrame->aucBSSID, prStaRec->aucMacAddr);
1308 /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
1309 prDisAssocFrame->u2SeqCtrl = 0;
1311 //4 <2> Compose the frame body's fixed field part of the Disassociation frame.
1312 /* Fill the Reason Code field. */
1313 WLAN_SET_FIELD_16(&prDisAssocFrame->u2ReasonCode, u2ReasonCode);
1316 } /* end of assocComposeDisassocFrame() */
1319 /*----------------------------------------------------------------------------*/
1321 * @brief This function will send the Disassociation frame
1323 * @param[in] prStaRec Pointer to the STA_RECORD_T
1324 * @param[in] u2ReasonCode The reason code of disassociation
1326 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
1327 * @retval WLAN_STATUS_SUCCESS Successfully send frame to TX Module
1329 /*----------------------------------------------------------------------------*/
1331 assocSendDisAssocFrame (
1332 IN P_ADAPTER_T prAdapter,
1333 IN P_STA_RECORD_T prStaRec,
1334 IN UINT_16 u2ReasonCode
1337 PUINT_8 pucMacAddress;
1338 P_MSDU_INFO_T prMsduInfo;
1339 UINT_16 u2PayloadLen;
1340 UINT_16 u2EstimatedFrameLen;
1341 //UINT_32 u4Status = WLAN_STATUS_SUCCESS;
1346 //4 <1> Allocate a PKT_INFO_T for Disassociation Frame
1347 /* Init with MGMT Header Length + Length of Fixed Fields + IE Length */
1348 u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
1349 WLAN_MAC_MGMT_HEADER_LEN + \
1350 REASON_CODE_FIELD_LEN;
1352 /* Allocate a MSDU_INFO_T */
1353 if ( (prMsduInfo = cnmMgtPktAlloc(prAdapter, u2EstimatedFrameLen)) == NULL) {
1354 DBGLOG(SAA, WARN, ("No PKT_INFO_T for sending DisAssoc.\n"));
1355 return WLAN_STATUS_RESOURCES;
1358 //4 <2> Compose Disassociation frame header and fixed fields in MSDU_INfO_T.
1359 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1361 pucMacAddress = prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex].aucOwnMacAddr;
1363 /* Compose Header and Fixed Field */
1364 assocComposeDisassocFrame(prStaRec,
1365 (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
1369 #if CFG_SUPPORT_802_11W
1370 if (rsnCheckBipKeyInstalled(prAdapter, prStaRec)) {
1371 P_WLAN_DISASSOC_FRAME_T prDisassocFrame;
1373 prDisassocFrame = (P_WLAN_DEAUTH_FRAME_T)(PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
1375 prDisassocFrame->u2FrameCtrl |= MASK_FC_PROTECTED_FRAME;
1376 DBGLOG(TX, WARN, ("assocSendDisAssocFrame with protection\n"));
1380 u2PayloadLen = REASON_CODE_FIELD_LEN;
1382 //4 <3> Update information of MSDU_INFO_T
1383 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1385 prMsduInfo->eSrc = TX_PACKET_MGMT;
1386 prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;
1387 prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
1388 prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
1389 prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
1390 prMsduInfo->fgIs802_1x = FALSE;
1391 prMsduInfo->fgIs802_11 = TRUE;
1392 prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
1393 prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
1394 prMsduInfo->pfTxDoneHandler = NULL;
1395 prMsduInfo->fgIsBasicRate = TRUE;
1397 //4 <4> Enqueue the frame to send this (Re)Association request frame.
1398 nicTxEnqueueMsdu(prAdapter, prMsduInfo);
1400 return WLAN_STATUS_SUCCESS;
1401 } /* end of assocSendDisAssocFrame() */
1404 /*----------------------------------------------------------------------------*/
1406 * @brief This function will parse and process the incoming Disassociation frame
1407 * if the given BSSID is matched.
1409 * @param[in] prSwRfb Pointer to SW RFB data structure.
1410 * @param[in] aucBSSID Given BSSID
1411 * @param[out] pu2ReasonCode Pointer to store the Reason Code from Deauthentication.
1413 * @retval WLAN_STATUS_FAILURE This is not the frame we should handle at current state.
1414 * @retval WLAN_STATUS_SUCCESS This is the frame we should handle.
1416 /*----------------------------------------------------------------------------*/
1418 assocProcessRxDisassocFrame (
1419 IN P_ADAPTER_T prAdapter,
1420 IN P_SW_RFB_T prSwRfb,
1421 IN UINT_8 aucBSSID[],
1422 OUT PUINT_16 pu2ReasonCode
1425 P_WLAN_DISASSOC_FRAME_T prDisassocFrame;
1426 UINT_16 u2RxReasonCode;
1431 ASSERT(pu2ReasonCode);
1433 //4 <1> locate the Disassociation Frame.
1434 prDisassocFrame = (P_WLAN_DISASSOC_FRAME_T) prSwRfb->pvHeader;
1436 //4 <2> Parse the Header of Disassociation Frame.
1437 if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) < REASON_CODE_FIELD_LEN) {
1439 return WLAN_STATUS_FAILURE;
1442 /* Check if this Disassoc Frame is coming from Target BSSID */
1443 if (UNEQUAL_MAC_ADDR(prDisassocFrame->aucBSSID, aucBSSID)) {
1444 DBGLOG(SAA, LOUD, ("Ignore Disassoc Frame from other BSS ["MACSTR"]\n",
1445 MAC2STR(prDisassocFrame->aucSrcAddr)));
1446 return WLAN_STATUS_FAILURE;
1449 //4 <3> Parse the Fixed Fields of Deauthentication Frame Body.
1450 WLAN_GET_FIELD_16(&prDisassocFrame->u2ReasonCode, &u2RxReasonCode);
1451 *pu2ReasonCode = u2RxReasonCode;
1453 return WLAN_STATUS_SUCCESS;
1455 } /* end of assocProcessRxDisassocFrame() */
1459 /*----------------------------------------------------------------------------*/
1461 * @brief This function will parse and process the incoming Association Req frame
1462 * and return a Status Code.
1464 * @param[in] prAdapter Pointer to the Adapter structure.
1465 * @param[in] prSwRfb Pointer to SW RFB data structure.
1466 * @param[out] pu2StatusCode Pointer to store the Status Code for carried in Association Response.
1468 * @retval WLAN_STATUS_FAILURE This is not the frame we should handle at current state.
1469 * @retval WLAN_STATUS_SUCCESS This is the frame we should handle.
1471 /*----------------------------------------------------------------------------*/
1473 assocProcessRxAssocReqFrame (
1474 IN P_ADAPTER_T prAdapter,
1475 IN P_SW_RFB_T prSwRfb,
1476 OUT PUINT_16 pu2StatusCode
1479 P_WLAN_ASSOC_REQ_FRAME_T prAssocReqFrame;
1480 P_STA_RECORD_T prStaRec;
1481 P_BSS_INFO_T prBssInfo;
1482 P_IE_SSID_T prIeSsid = (P_IE_SSID_T)NULL;
1483 P_RSN_INFO_ELEM_T prIeRsn = (P_RSN_INFO_ELEM_T)NULL;
1484 P_IE_SUPPORTED_RATE_T prIeSupportedRate = (P_IE_SUPPORTED_RATE_T)NULL;
1485 P_IE_EXT_SUPPORTED_RATE_T prIeExtSupportedRate = (P_IE_EXT_SUPPORTED_RATE_T)NULL;
1486 PUINT_8 pucIE, pucIEStart;
1488 UINT_16 u2Offset = 0;
1489 UINT_16 u2StatusCode = STATUS_CODE_SUCCESSFUL;
1490 UINT_16 u2RxFrameCtrl;
1491 UINT_16 u2BSSBasicRateSet;
1492 BOOLEAN fgIsUnknownBssBasicRate;
1498 ASSERT(pu2StatusCode);
1500 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1502 if (prStaRec == NULL) {
1503 return WLAN_STATUS_FAILURE;
1506 //4 <1> locate the Association Req Frame.
1507 prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T) prSwRfb->pvHeader;
1509 //4 <2> Parse the Header of Association Req Frame.
1510 if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) <
1511 (CAP_INFO_FIELD_LEN + LISTEN_INTERVAL_FIELD_LEN)) {
1513 return WLAN_STATUS_FAILURE;
1516 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
1518 /* Check if this Disassoc Frame is coming from Target BSSID */
1519 if (UNEQUAL_MAC_ADDR(prAssocReqFrame->aucBSSID, prBssInfo->aucBSSID)) {
1520 return WLAN_STATUS_FAILURE; /* Just Ignore this MMPDU */
1523 //WLAN_GET_FIELD_16(&prAssocReqFrame->u2FrameCtrl, &u2RxFrameCtrl);
1524 u2RxFrameCtrl = prAssocReqFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1525 u2RxFrameCtrl &= MASK_FRAME_TYPE;
1526 if (MAC_FRAME_REASSOC_REQ == u2RxFrameCtrl) {
1527 prStaRec->fgIsReAssoc = TRUE;
1529 u2IELength = (prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) -
1530 (UINT_16)(OFFSET_OF(WLAN_REASSOC_REQ_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN);
1532 pucIEStart = pucIE = ((P_WLAN_REASSOC_REQ_FRAME_T)(prSwRfb->pvHeader))->aucInfoElem;
1535 prStaRec->fgIsReAssoc = FALSE;
1537 u2IELength = (prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) -
1538 (UINT_16)(OFFSET_OF(WLAN_ASSOC_REQ_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN);
1540 pucIEStart = pucIE = prAssocReqFrame->aucInfoElem;
1544 //4 <3> Parse the Fixed Fields of Assoc Req Frame Body.
1545 prStaRec->u2CapInfo = prAssocReqFrame->u2CapInfo;
1547 #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_HOTSPOT_PRIVACY_CHECK
1548 if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1549 if (((prStaRec->u2CapInfo & CAP_INFO_PRIVACY) &&
1550 !kalP2PGetCipher(prAdapter->prGlueInfo))) {
1551 u2StatusCode = STATUS_CODE_CAP_NOT_SUPPORTED;
1552 DBGLOG(RSN, TRACE, ("STA Assoc req privacy bit check fail\n"));
1553 return WLAN_STATUS_SUCCESS;
1558 prStaRec->u2ListenInterval = prAssocReqFrame->u2ListenInterval;
1559 prStaRec->ucPhyTypeSet = 0;
1561 /* Might be legacy client or p2p gc. */
1562 prStaRec->eStaType = STA_TYPE_LEGACY_CLIENT;
1564 //4 <4> Parse the IE of Assoc Req Frame Body.
1565 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1566 switch (IE_ID(pucIE)) {
1568 if ((!prIeSsid) && /* NOTE(Kevin): Get SSID once */
1569 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
1570 prIeSsid = (P_IE_SSID_T)pucIE;
1574 case ELEM_ID_SUP_RATES:
1575 if ((!prIeSupportedRate) && (IE_LEN(pucIE) <= RATE_NUM)) {
1576 prIeSupportedRate = SUP_RATES_IE(pucIE);
1580 case ELEM_ID_EXTENDED_SUP_RATES:
1581 if (!prIeExtSupportedRate)
1582 prIeExtSupportedRate = EXT_SUP_RATES_IE(pucIE);
1584 case ELEM_ID_HT_CAP:
1585 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HT;
1588 #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_HOTSPOT_PRIVACY_CHECK
1589 if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1590 prIeRsn = RSN_IE(pucIE);
1591 rsnParserCheckForRSNCCMPPSK(prAdapter, prIeRsn, &u2StatusCode);
1592 if (u2StatusCode != STATUS_CODE_SUCCESSFUL) {
1593 *pu2StatusCode = u2StatusCode;
1594 return WLAN_STATUS_SUCCESS;
1599 case ELEM_ID_VENDOR:
1600 #if CFG_ENABLE_WIFI_DIRECT
1602 if ((prAdapter->fgIsP2PRegistered)) {
1603 UINT_8 ucOuiType = 0;
1605 p2pFuncParseCheckForP2PInfoElem(prAdapter, pucIE, &ucOuiType);
1607 if (ucOuiType == VENDOR_OUI_TYPE_P2P) {
1608 DBGLOG(P2P, TRACE, ("Target Client is a P2P group client\n"));
1609 prStaRec->eStaType = STA_TYPE_P2P_GC;
1616 for (i = 0; i < (sizeof(rxAssocReqIETable) / sizeof(VERIFY_IE_ENTRY_T)); i++) {
1618 if ((IE_ID(pucIE)) == rxAssocReqIETable[i].ucElemID) {
1619 rxAssocReqIETable[i].pfnVarifyIE(prAdapter, prSwRfb, (P_IE_HDR_T)pucIE, &u2StatusCode);
1621 if (u2StatusCode != STATUS_CODE_SUCCESSFUL) {
1622 *pu2StatusCode = u2StatusCode;
1623 return WLAN_STATUS_SUCCESS;
1630 } /* end of IE_FOR_EACH */
1632 // parsing for WMM related information (2010/12/21)
1641 if (UNEQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen,
1642 prIeSsid->aucSSID, prIeSsid->ucLength)) {
1644 u2StatusCode = STATUS_CODE_UNSPECIFIED_FAILURE;
1649 u2StatusCode = STATUS_CODE_UNSPECIFIED_FAILURE;
1653 prStaRec->u2OperationalRateSet = 0;
1654 prStaRec->u2BSSBasicRateSet = 0;
1656 if (prIeSupportedRate || prIeExtSupportedRate) {
1657 rateGetRateSetFromIEs(prIeSupportedRate,
1658 prIeExtSupportedRate,
1659 &prStaRec->u2OperationalRateSet,
1660 &u2BSSBasicRateSet, /* Ignore any Basic Bit */
1661 &fgIsUnknownBssBasicRate);
1663 if ((prBssInfo->u2BSSBasicRateSet & prStaRec->u2OperationalRateSet) !=
1664 prBssInfo->u2BSSBasicRateSet) {
1666 u2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
1670 /* Accpet the Sta, update BSSBasicRateSet from Bss */
1672 prStaRec->u2BSSBasicRateSet = prBssInfo->u2BSSBasicRateSet;
1674 prStaRec->u2DesiredNonHTRateSet = (prStaRec->u2OperationalRateSet & RATE_SET_ALL_ABG);
1676 if (BAND_2G4 == HIF_RX_HDR_GET_RF_BAND(prSwRfb->prHifRxHdr)) {
1677 #if 0 /* Marked by CMC 20111024 */
1678 /* check if support 11n */
1679 if (!(u2BSSBasicRateSet & RATE_SET_BIT_HT_PHY)) {
1681 if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1682 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_ERP;
1686 if (!(u2BSSBasicRateSet & RATE_SET_OFDM)) {
1687 if (prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) {
1688 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HR_DSSS;
1695 if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1696 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_ERP;
1698 if (prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) {
1699 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HR_DSSS;
1703 else { /* (BAND_5G == prBssDesc->eBande) */
1704 #if 0 /* Marked by CMC 20111024 */
1705 if (!(u2BSSBasicRateSet & RATE_SET_BIT_HT_PHY)) {
1707 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_OFDM;
1709 ASSERT((prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) == 0);
1711 if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1712 prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_OFDM;
1720 u2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
1724 #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_HOTSPOT_PRIVACY_CHECK
1725 if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1727 if (!kalP2PGetCipher(prAdapter->prGlueInfo)) {
1728 u2StatusCode = STATUS_CODE_CIPHER_SUITE_REJECTED;
1733 prStaRec->rSecInfo.fgAllowOnly1x = FALSE;
1734 if (kalP2PGetCipher(prAdapter->prGlueInfo)) {
1736 prStaRec->rSecInfo.fgAllowOnly1x = TRUE;
1745 #if CFG_ENABLE_WIFI_DIRECT
1746 if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1749 PUINT_8 cp = (PUINT_8)&prAssocReqFrame->u2CapInfo;
1750 if (prStaRec->fgIsReAssoc)
1754 if (prStaRec->pucAssocReqIe) {
1755 kalMemFree(prStaRec->pucAssocReqIe, VIR_MEM_TYPE, prStaRec->u2AssocReqIeLen);
1756 prStaRec->pucAssocReqIe = NULL;
1758 prStaRec->u2AssocReqIeLen = u2IELength;
1760 prStaRec->pucAssocReqIe = kalMemAlloc(u2IELength, VIR_MEM_TYPE);
1761 kalMemCopy(prStaRec->pucAssocReqIe, cp, u2IELength);
1765 kalP2PUpdateAssocInfo(prAdapter->prGlueInfo, (PUINT_8)&prAssocReqFrame->u2CapInfo, u2IELength + (prStaRec->fgIsReAssoc ? 10 : 4), prStaRec->fgIsReAssoc);
1769 *pu2StatusCode = u2StatusCode;
1771 return WLAN_STATUS_SUCCESS;
1773 } /* end of assocProcessRxAssocReqFrame() */
1776 /*----------------------------------------------------------------------------*/
1778 * @brief This function is used to compose Common Information Elements for Association
1781 * @param[in] prMsduInfo Pointer to the composed MSDU_INFO_T.
1782 * @param[in] prBssInfo Pointer to the BSS_INFO_T.
1786 /*----------------------------------------------------------------------------*/
1788 assocBuildReAssocRespFrameCommonIEs (
1789 IN P_ADAPTER_T prAdapter,
1790 IN P_MSDU_INFO_T prMsduInfo,
1791 IN P_BSS_INFO_T prBssInfo
1795 P_STA_RECORD_T prStaRec;
1796 UINT_8 ucSupRatesLen;
1797 UINT_8 ucExtSupRatesLen;
1801 ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1803 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1807 pucBuffer = (PUINT_8)((UINT_32)prMsduInfo->prPacket +
1808 (UINT_32)prMsduInfo->u2FrameLength);
1811 if (prBssInfo->ucAllSupportedRatesLen > ELEM_MAX_LEN_SUP_RATES) {
1813 ucSupRatesLen = ELEM_MAX_LEN_SUP_RATES;
1814 ucExtSupRatesLen = prBssInfo->ucAllSupportedRatesLen - ELEM_MAX_LEN_SUP_RATES;
1817 ucSupRatesLen = prBssInfo->ucAllSupportedRatesLen;
1818 ucExtSupRatesLen = 0;
1821 /* Fill the Supported Rates element. */
1822 if (ucSupRatesLen) {
1823 SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_SUP_RATES;
1824 SUP_RATES_IE(pucBuffer)->ucLength = ucSupRatesLen;
1825 kalMemCopy(SUP_RATES_IE(pucBuffer)->aucSupportedRates,
1826 prBssInfo->aucAllSupportedRates,
1829 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
1830 pucBuffer += IE_SIZE(pucBuffer);
1834 /* Fill the Extended Supported Rates element. */
1835 if (ucExtSupRatesLen) {
1837 EXT_SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_EXTENDED_SUP_RATES;
1838 EXT_SUP_RATES_IE(pucBuffer)->ucLength = ucExtSupRatesLen;
1840 kalMemCopy(EXT_SUP_RATES_IE(pucBuffer)->aucExtSupportedRates,
1841 &prBssInfo->aucAllSupportedRates[ucSupRatesLen],
1844 prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
1848 } /* end of assocBuildReAssocRespFrameCommonIEs() */
1851 /*----------------------------------------------------------------------------*/
1853 * @brief This function will compose the (Re)Association Response frame
1855 * @param[in] prStaRec Pointer to the STA_RECORD_T
1856 * @param[in] pucBuffer Pointer to the frame buffer.
1857 * @param[in] aucBssid Given BSSID.
1858 * @param[in] u2CapInfo Capability Field of current BSS.
1859 * @param[in out] pu2PayloadLen Return the length of the composed fixed fields
1863 /*----------------------------------------------------------------------------*/
1865 assocComposeReAssocRespFrameHeaderAndFF (
1866 IN P_STA_RECORD_T prStaRec,
1867 IN PUINT_8 pucBuffer,
1868 IN UINT_8 aucBSSID[],
1869 IN UINT_16 u2CapInfo,
1870 IN OUT PUINT_16 pu2PayloadLen
1873 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1874 BOOLEAN fgIsReAssoc;
1876 UINT_16 u2FrameCtrl;
1882 ASSERT(pu2PayloadLen);
1884 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T)pucBuffer;
1885 fgIsReAssoc = prStaRec->fgIsReAssoc;
1887 //4 <1> Compose the frame header of the (Re)Association Request frame.
1888 /* Fill the Frame Control field. */
1890 u2FrameCtrl = MAC_FRAME_REASSOC_RSP;
1893 u2FrameCtrl = MAC_FRAME_ASSOC_RSP;
1895 //WLAN_SET_FIELD_16(&prAssocFrame->u2FrameCtrl, u2FrameCtrl);
1896 prAssocRspFrame->u2FrameCtrl = u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1898 /* Fill the DA field with Target MAC Address. */
1899 COPY_MAC_ADDR(prAssocRspFrame->aucDestAddr, prStaRec->aucMacAddr);
1901 /* Fill the SA field with current BSSID. */
1902 COPY_MAC_ADDR(prAssocRspFrame->aucSrcAddr, aucBSSID);
1904 /* Fill the BSSID field with current BSSID. */
1905 COPY_MAC_ADDR(prAssocRspFrame->aucBSSID, aucBSSID);
1907 /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
1908 prAssocRspFrame->u2SeqCtrl = 0;
1911 //4 <2> Compose the frame body's common fixed field part of the (Re)Association Request frame.
1912 /* Fill the Capability Information field. */
1913 //WLAN_SET_FIELD_16(&prAssocFrame->u2CapInfo, u2CapInfo);
1914 prAssocRspFrame->u2CapInfo = u2CapInfo; // NOTE(Kevin): Optimized for ARM
1916 //WLAN_SET_FIELD_16(&prAssocFrame->u2StatusCode, prStaRec->u2StatusCode);
1917 prAssocRspFrame->u2StatusCode = prStaRec->u2StatusCode; // NOTE(Kevin): Optimized for ARM
1919 //WLAN_SET_FIELD_16(&prAssocFrame->u2AssocId, ((prStaRec->u2AssocId & AID_MASK) | AID_MSB));
1920 prAssocRspFrame->u2AssocId =
1921 ((prStaRec->u2AssocId & AID_MASK) | AID_MSB); // NOTE(Kevin): Optimized for ARM
1923 *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
1924 STATUS_CODE_FIELD_LEN +
1928 } /* end of assocComposeReAssocRespFrameHeaderAndFF() */
1931 /*----------------------------------------------------------------------------*/
1933 * @brief This function will send the (Re)Association Resp frame
1935 * @param[in] prStaRec Pointer to the STA_RECORD_T
1937 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
1938 * @retval WLAN_STATUS_SUCCESS Successfully send frame to TX Module
1940 /*----------------------------------------------------------------------------*/
1942 assocSendReAssocRespFrame (
1943 IN P_ADAPTER_T prAdapter,
1944 IN P_STA_RECORD_T prStaRec
1947 P_BSS_INFO_T prBssInfo;
1948 P_MSDU_INFO_T prMsduInfo;
1950 UINT_16 u2PayloadLen;
1951 UINT_16 u2EstimatedFrameLen;
1952 UINT_16 u2EstimatedExtraIELen;
1953 BOOLEAN fgIsReAssoc;
1960 //4 <1> Allocate a PKT_INFO_T for Authentication Frame
1961 fgIsReAssoc = prStaRec->fgIsReAssoc;
1963 /* Init with MGMT Header Length + Length of Fixed Fields + Common IE Length */
1964 u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
1965 WLAN_MAC_MGMT_HEADER_LEN + \
1966 CAP_INFO_FIELD_LEN + \
1967 STATUS_CODE_FIELD_LEN + \
1969 (ELEM_HDR_LEN + ELEM_MAX_LEN_SUP_RATES) + \
1970 (ELEM_HDR_LEN + (RATE_NUM - ELEM_MAX_LEN_SUP_RATES));
1972 /* + Extra IE Length */
1973 u2EstimatedExtraIELen = 0;
1975 for (i = 0; i < sizeof(txAssocRespIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
1976 if (txAssocRespIETable[i].u2EstimatedFixedIELen != 0) {
1977 u2EstimatedExtraIELen += txAssocRespIETable[i].u2EstimatedFixedIELen;
1979 else if (txAssocRespIETable[i].pfnCalculateVariableIELen != NULL) {
1980 u2EstimatedExtraIELen += (UINT_16)txAssocRespIETable[i].pfnCalculateVariableIELen(prAdapter,
1981 prStaRec->ucNetTypeIndex,
1987 u2EstimatedFrameLen += u2EstimatedExtraIELen;
1989 /* Allocate a MSDU_INFO_T */
1990 if ( (prMsduInfo = cnmMgtPktAlloc(prAdapter, u2EstimatedFrameLen)) == NULL) {
1991 DBGLOG(AAA, WARN, ("No PKT_INFO_T for sending (Re)Assoc Response.\n"));
1992 return WLAN_STATUS_RESOURCES;
1995 //4 <2> Compose (Re)Association Request frame header and fixed fields in MSDU_INfO_T.
1996 ASSERT(prStaRec->ucNetTypeIndex != NETWORK_TYPE_AIS_INDEX);
1997 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
1999 /* Compose Header and Fixed Field */
2000 assocComposeReAssocRespFrameHeaderAndFF(prStaRec,
2001 (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
2002 prBssInfo->aucBSSID,
2003 prBssInfo->u2CapInfo,
2006 //4 <3> Update information of MSDU_INFO_T
2007 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
2009 prMsduInfo->eSrc = TX_PACKET_MGMT;
2010 prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;
2011 prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
2012 prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
2013 prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
2014 prMsduInfo->fgIs802_1x = FALSE;
2015 prMsduInfo->fgIs802_11 = TRUE;
2016 prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
2017 prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
2018 prMsduInfo->pfTxDoneHandler = aaaFsmRunEventTxDone;
2019 prMsduInfo->fgIsBasicRate = TRUE;
2021 //4 <4> Compose the frame body's IEs of the (Re)Association Request frame.
2022 assocBuildReAssocRespFrameCommonIEs(prAdapter, prMsduInfo, prBssInfo);
2025 //4 <5> Compose IEs in MSDU_INFO_T
2028 for (i = 0; i < sizeof(txAssocRespIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
2029 if (txAssocRespIETable[i].pfnAppendIE) {
2030 txAssocRespIETable[i].pfnAppendIE(prAdapter, prMsduInfo);
2034 /* TODO(Kevin): Also release the unused tail room of the composed MMPDU */
2036 //4 <6> Enqueue the frame to send this (Re)Association request frame.
2037 nicTxEnqueueMsdu(prAdapter, prMsduInfo);
2039 return WLAN_STATUS_SUCCESS;
2041 } /* end of assocSendReAssocRespFrame() */
2042 #endif /* CFG_SUPPORT_AAA */