d91d19743e92af06c35375633765bbac179a14fd
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / combo_mt66xx / mt6628 / wlan / mgmt / assoc.c
1 /*
2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/assoc.c#3 $
3 */
4
5 /*! \file   "assoc.c"
6     \brief  This file includes the association-related functions.
7
8     This file includes the association-related functions.
9 */
10
11
12
13 /*\
14 ** $Log: assoc.c $
15 **
16 ** 07 27 2012 yuche.tsai
17 ** [ALPS00324337] [ALPS.JB][Hot-Spot] Driver update for Hot-Spot
18 ** Fix wifi direct connection issue.
19  *
20  * 07 17 2012 yuche.tsai
21  * NULL
22  * Let netdev bring up.
23  *
24  * 07 17 2012 yuche.tsai
25  * NULL
26  * Compile no error before trial run.
27  *
28  * 06 13 2012 yuche.tsai
29  * NULL
30  * Update maintrunk driver.
31  * Add support for driver compose assoc request frame.
32  *
33  * 06 08 2012 cp.wu
34  * [WCXRP00001245] [MT6620 Wi-Fi][Driver][Firmware] NPS Software Development
35  * add a pair of brace for compilation success.
36  *
37  * 06 04 2012 cp.wu
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
40  *
41  * 03 14 2012 wh.su
42  * [WCXRP00001173] [MT6620 Wi-Fi][Driver] Adding the ICS Tethering WPA2-PSK supporting
43  * Add code from 2.2
44  *
45  * 03 09 2012 terry.wu
46  * NULL
47  * Fix build error.
48  *
49  * 03 02 2012 terry.wu
50  * NULL
51  * Sync CFG80211 modification from branch 2,2.
52  *
53  * 01 16 2012 yuche.tsai
54  * NULL
55  * Update Driver for wifi driect gc join IE update issue.
56  *
57  * 11 10 2011 wh.su
58  * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
59  * change the debug module level.
60  *
61  * 10 25 2011 cm.chang
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
64  *
65  * 10 12 2011 wh.su
66  * [WCXRP00001036] [MT6620 Wi-Fi][Driver][FW] Adding the 802.11w code for MFP
67  * adding the 802.11w related function and define .
68  *
69  * 09 19 2011 yuche.tsai
70  * NULL
71  * Fix KE when enable hot-spot & any one client connect to this hot-spot.
72  *
73  * 09 14 2011 yuche.tsai
74  * NULL
75  * Add P2P IE in assoc response.
76  *
77  * 07 15 2011 terry.wu
78  * [WCXRP00000855] [MT6620 Wi-Fi] [Driver] Workaround for Kingnet 710 AP wrong AID assignment
79  * Update workaround for Kingnet AP.
80  *
81  * 07 15 2011 terry.wu
82  * [WCXRP00000855] [MT6620 Wi-Fi] [Driver] Workaround for Kingnet 710 AP wrong AID assignment
83  * Workaround for Kingnet 710 AP wrong AID assignment.
84  *
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.
88  *
89  * 04 18 2011 terry.wu
90  * [WCXRP00000660] [MT6620 Wi-Fi][Driver] Remove flag CFG_WIFI_DIRECT_MOVED
91  * Remove flag CFG_WIFI_DIRECT_MOVED.
92  *
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.
96  *
97  * 03 17 2011 chinglan.wang
98  * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
99  * .
100  *
101  * 03 16 2011 wh.su
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 .
104  *
105  * 03 14 2011 wh.su
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.
108  *
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.
112  *
113  * 03 02 2011 wh.su
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 .
116  *
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.
120  *
121  * 02 09 2011 wh.su
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, .
124  *
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
128  *
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.
132  *
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.
137  *
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.
141  *
142  * 12 30 2010 eddie.chen
143  * [WCXRP00000322] Add WMM IE in beacon,
144
145 Add per station flow control when STA is in PS
146
147
148  * Recover the code that was coverwritted..
149  *
150  * 12 29 2010 eddie.chen
151  * [WCXRP00000322] Add WMM IE in beacon,
152 Add per station flow control when STA is in PS
153
154  * 1) PS flow control event
155  *
156  * 2) WMM IE in beacon, assoc resp, probe resp
157  *
158  * 11 04 2010 wh.su
159  * [WCXRP00000164] [MT6620 Wi-Fi][Driver] Support the p2p random SSID
160  * adding the p2p random ssid support.
161  *
162  * 10 18 2010 cp.wu
163  * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
164  * use definition macro to replace hard-coded constant
165  *
166  * 09 28 2010 wh.su
167  * NULL
168  * [WCXRP00000069][MT6620 Wi-Fi][Driver] Fix some code for phase 1 P2P Demo.
169  *
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.
173  *
174  * 09 16 2010 cm.chang
175  * NULL
176  * Change conditional compiling options for BOW
177  *
178  * 09 03 2010 kevin.huang
179  * NULL
180  * Refine #include sequence and solve recursive/nested #include issue
181  *
182  * 09 01 2010 wh.su
183  * NULL
184  * adding the wapi support for integration test.
185  *
186  * 08 30 2010 cp.wu
187  * NULL
188  * eliminate klockwork errors
189  *
190  * 08 16 2010 yuche.tsai
191  * NULL
192  * Add SSID IE in assoc req frame which is sent by P2P GC.
193  *
194  * 08 16 2010 kevin.huang
195  * NULL
196  * Refine AAA functions
197  *
198  * 08 03 2010 cp.wu
199  * NULL
200  * surpress compilation warning.
201  *
202  * 07 20 2010 wh.su
203  *
204  * adding the wapi code.
205  *
206  * 07 09 2010 yarco.yang
207  *
208  * [MT6620 and MT5931] SW Migration: Add ADDBA support
209  *
210  * 07 08 2010 cp.wu
211  *
212  * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
213  *
214  * 07 08 2010 cp.wu
215  * [WPD00003833][MT6620 and MT5931] Driver migration
216  * take use of RLM module for parsing/generating HT IEs for 11n capability
217  *
218  * 07 01 2010 cp.wu
219  * [WPD00003833][MT6620 and MT5931] Driver migration
220  * comment out RSN IE generation by CFG_RSN_MIGRATION compilation flag.
221  *
222  * 06 28 2010 cp.wu
223  * [WPD00003833][MT6620 and MT5931] Driver migration
224  * send MMPDU in basic rate.
225  *
226  * 06 21 2010 cp.wu
227  * [WPD00003833][MT6620 and MT5931] Driver migration
228  * add scan_fsm into building.
229  *
230  * 06 21 2010 cp.wu
231  * [WPD00003833][MT6620 and MT5931] Driver migration
232  * specify correct value for management frames.
233  *
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
237  *
238  * 06 18 2010 wh.su
239  * [WPD00003840][MT6620 5931] Security migration
240  * migration from MT6620 firmware.
241  *
242  * 06 15 2010 cp.wu
243  * [WPD00003833][MT6620 and MT5931] Driver migration
244  * revised.
245  *
246  * 06 14 2010 cp.wu
247  * [WPD00003833][MT6620 and MT5931] Driver migration
248  * add management dispatching function table.
249  *
250  * 06 11 2010 cp.wu
251  * [WPD00003833][MT6620 and MT5931] Driver migration
252  * auth.c is migrated.
253  *
254  * 06 11 2010 cp.wu
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
261  *
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.
265  *
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
269  *
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
273  *
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
277  *
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
282  *
283  * 04 16 2010 wh.su
284  * [BORA00000680][MT6620] Support the statistic for Microsoft os query
285  * adding the wpa-none for ibss beacon.
286  *
287  * 03 25 2010 cm.chang
288  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
289  * Remove compiling warning
290  *
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
294  *
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
298  *
299  * 01 28 2010 wh.su
300  * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
301  * fixed the compiling warning.u1rwduu`wvpghlqg|rm+vp
302  *
303  * 01 27 2010 wh.su
304  * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
305  * add and fixed some security function.
306  *
307  * 01 11 2010 kevin.huang
308  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
309  * Add Deauth and Disassoc Handler
310  *
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
315  *
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
319  *
320  * 12 18 2009 cm.chang
321  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
322  * .
323  *
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
327  *
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
331  *
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()
335  *
336  * Dec 7 2009 mtk01088
337  * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
338  * remove some space line
339  *
340  * Dec 7 2009 mtk01088
341  * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
342  * adding the sending disassoc frame function
343  *
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
347  *
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
351  *
352  * Dec 3 2009 mtk01461
353  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
354  * Integrate the send Assoc with TXM
355  *
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)
359  *
360  * Nov 24 2009 mtk01461
361  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
362  * Remove unused variables
363  *
364  * Nov 23 2009 mtk01461
365  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
366  *
367 */
368
369 /*******************************************************************************
370 *                         C O M P I L E R   F L A G S
371 ********************************************************************************
372 */
373
374 /*******************************************************************************
375 *                    E X T E R N A L   R E F E R E N C E S
376 ********************************************************************************
377 */
378 #include "precomp.h"
379
380 /*******************************************************************************
381 *                              C O N S T A N T S
382 ********************************************************************************
383 */
384
385 /*******************************************************************************
386 *                             D A T A   T Y P E S
387 ********************************************************************************
388 */
389
390 /*******************************************************************************
391 *                            P U B L I C   D A T A
392 ********************************************************************************
393 */
394 APPEND_VAR_IE_ENTRY_T txAssocReqIETable[] = {
395     { (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_CAP),    NULL,     rlmReqGenerateHtCapIE },/* 45 */
396 #if CFG_SUPPORT_WPS2
397         { (ELEM_HDR_LEN + ELEM_MAX_LEN_WSC),   NULL,      rsnGenerateWSCIE },     /* 221 */
398 #endif
399 #if CFG_SUPPORT_WAPI
400     { (ELEM_HDR_LEN + ELEM_MAX_LEN_WAPI),   NULL,    wapiGenerateWAPIIE },   /* 68 */
401 #endif
402 #if CFG_RSN_MIGRATION
403     { (ELEM_HDR_LEN + ELEM_MAX_LEN_WPA),   NULL,        rsnGenerateWPAIE },     /* 221 */
404 #endif
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 */
409 #endif
410 };
411
412 #if CFG_SUPPORT_AAA
413 VERIFY_IE_ENTRY_T rxAssocReqIETable[] = {
414     { ELEM_ID_RESERVED,                         NULL                    } /* 255 */
415 };
416
417
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 */
425 #if CFG_SUPPORT_WFD
426     { (0),         wfdFuncCalculateWfdIELenForAssocRsp,     wfdFuncGenerateWfdIEForAssocRsp }, /* 221 */
427 #endif
428 #endif
429     { (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP),     NULL,     rlmRspGenerateExtCapIE   },      /* 127 */
430     { (ELEM_HDR_LEN + ELEM_MAX_LEN_WMM_PARAM),     NULL,    mqmGenerateWmmParamIE },         /* 221 */
431
432     { (0),         p2pFuncCalculateWSC_IELenForAssocRsp,      p2pFuncGenerateWSC_IEForAssocRsp }  /* 221 */
433
434 };
435 #endif
436
437 /*******************************************************************************
438 *                           P R I V A T E   D A T A
439 ********************************************************************************
440 */
441
442 /*******************************************************************************
443 *                                 M A C R O S
444 ********************************************************************************
445 */
446
447 /*******************************************************************************
448 *                   F U N C T I O N   D E C L A R A T I O N S
449 ********************************************************************************
450 */
451
452 /*******************************************************************************
453 *                              F U N C T I O N S
454 ********************************************************************************
455 */
456 /*----------------------------------------------------------------------------*/
457 /*!
458 * @brief This function is used to compose the Capability Info Field.
459 *
460 * @param[in] prStaRec               Pointer to the STA_RECORD_T
461 *
462 * @retval Capability Info Field
463 */
464 /*----------------------------------------------------------------------------*/
465 __KAL_INLINE__ UINT_16
466 assocBuildCapabilityInfo (
467     IN P_ADAPTER_T prAdapter,
468     IN P_STA_RECORD_T prStaRec
469     )
470 {
471     UINT_32 u4NonHTPhyType;
472     UINT_16 u2CapInfo;
473
474
475     ASSERT(prStaRec);
476
477
478     /* Set up our requested capabilities. */
479     u2CapInfo = CAP_INFO_ESS;
480     u2CapInfo |= CAP_CF_STA_NOT_POLLABLE;
481
482     if (prStaRec->u2CapInfo & CAP_INFO_PRIVACY) {
483         u2CapInfo |= CAP_INFO_PRIVACY;
484     }
485
486
487     /* 7.3.1.4 */
488     if (prStaRec->fgHasBasicPhyType) {
489         u4NonHTPhyType = prStaRec->ucNonHTBasicPhyType;
490
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)) ) ) {
495
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)
499              */
500             u2CapInfo |= CAP_INFO_SHORT_PREAMBLE;
501         }
502
503         if (rNonHTPhyAttributes[u4NonHTPhyType].fgIsShortSlotTimeOptionImplemented &&
504             prAdapter->rWifiVar.fgIsShortSlotTimeOptionEnable) {
505             u2CapInfo |= CAP_INFO_SHORT_SLOT_TIME;
506         }
507     }
508
509     DBGLOG(SAA, LOUD, ("ASSOC REQ: Compose Capability = 0x%04x for Target BSS ["MACSTR"].\n",
510         u2CapInfo, MAC2STR(prStaRec->aucMacAddr)));
511
512
513     return u2CapInfo;
514
515 } /* end of assocBuildCapabilityInfo() */
516
517
518 /*----------------------------------------------------------------------------*/
519 /*!
520 * @brief This function is used to compose Common Information Elements for Association
521 *        Request Frame.
522 *
523 * @param[in] prMsduInfo     Pointer to the composed MSDU_INFO_T.
524 *
525 * @return (none)
526 */
527 /*----------------------------------------------------------------------------*/
528 __KAL_INLINE__ VOID
529 assocBuildReAssocReqFrameCommonIEs (
530     IN P_ADAPTER_T prAdapter,
531     IN P_MSDU_INFO_T prMsduInfo
532     )
533 {
534     P_CONNECTION_SETTINGS_T prConnSettings;
535     P_STA_RECORD_T prStaRec;
536     PUINT_8 pucBuffer;
537     UINT_16 u2SupportedRateSet;
538     UINT_8 aucAllSupportedRates[RATE_NUM] = {0};
539     UINT_8 ucAllSupportedRatesLen;
540     UINT_8 ucSupRatesLen;
541     UINT_8 ucExtSupRatesLen;
542
543     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
544     ASSERT(prMsduInfo);
545     ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
546
547     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
548     ASSERT(prStaRec);
549
550     if(!prStaRec) {
551         return;
552     }
553
554     pucBuffer = (PUINT_8)((UINT_32)prMsduInfo->prPacket +
555                           (UINT_32)prMsduInfo->u2FrameLength);
556     ASSERT(pucBuffer);
557
558     if (IS_STA_IN_AIS(prStaRec)) {
559
560         /* Fill the SSID element. */
561         SSID_IE(pucBuffer)->ucId = ELEM_ID_SSID;
562
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.
565          */
566
567         COPY_SSID(SSID_IE(pucBuffer)->aucSSID,
568                   SSID_IE(pucBuffer)->ucLength,
569                   prConnSettings->aucSSID,
570                   prConnSettings->ucSSIDLen);
571
572         prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
573         pucBuffer += IE_SIZE(pucBuffer);
574
575     }
576 #if CFG_ENABLE_WIFI_DIRECT
577     else if((prAdapter->fgIsP2PRegistered) &&
578         (IS_STA_IN_P2P(prStaRec))) {
579         pucBuffer = p2pBuildReAssocReqFrameCommonIEs(prAdapter, prMsduInfo, pucBuffer);
580     }
581 #endif
582 #if CFG_ENABLE_BT_OVER_WIFI
583     else if (IS_STA_IN_BOW(prStaRec)) {
584
585         SSID_IE(pucBuffer)->ucId = ELEM_ID_SSID;
586
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.
589          */
590
591         COPY_SSID(SSID_IE(pucBuffer)->aucSSID,
592                   SSID_IE(pucBuffer)->ucLength,
593                   prConnSettings->aucSSID,
594                   prConnSettings->ucSSIDLen);
595
596         prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
597         pucBuffer += IE_SIZE(pucBuffer);
598     }
599 #endif
600
601     else {
602         /* TODO(Kevin): For other network */
603     }
604
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.
610      */
611     //rateGetDataRatesFromRateSet((prBssDesc->u2OperationalRateSet &
612     //                             rPhyAttributes[prBssDesc->ePhyType].u2SupportedRateSet),
613
614     if (prStaRec->fgHasBasicPhyType) {
615         UINT_32 u4NonHTPhyType;
616
617
618         u4NonHTPhyType = prStaRec->ucNonHTBasicPhyType;
619
620         u2SupportedRateSet = (prStaRec->u2OperationalRateSet &
621                               rNonHTPhyAttributes[u4NonHTPhyType].u2SupportedRateSet);
622
623         ASSERT(u2SupportedRateSet);
624
625         if (!u2SupportedRateSet) {
626             u2SupportedRateSet = rNonHTPhyAttributes[u4NonHTPhyType].u2SupportedRateSet;
627         }
628
629         /* TODO(Kevin): For P2P, we shouldn't send support rate set which contains 11b rate */
630
631         rateGetDataRatesFromRateSet(u2SupportedRateSet,
632                                     0,
633                                     aucAllSupportedRates,
634                                     &ucAllSupportedRatesLen);
635
636         ucSupRatesLen = ((ucAllSupportedRatesLen > ELEM_MAX_LEN_SUP_RATES) ?
637                          ELEM_MAX_LEN_SUP_RATES : ucAllSupportedRatesLen);
638
639         ucExtSupRatesLen = ucAllSupportedRatesLen - ucSupRatesLen;
640
641
642         /* Fill the Supported Rates element. */
643         if (ucSupRatesLen) {
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,
648                        ucSupRatesLen);
649
650             prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
651             pucBuffer += IE_SIZE(pucBuffer);
652         }
653
654
655         /* Fill the Extended Supported Rates element. */
656         if (ucExtSupRatesLen) {
657
658             EXT_SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_EXTENDED_SUP_RATES;
659             EXT_SUP_RATES_IE(pucBuffer)->ucLength = ucExtSupRatesLen;
660
661             kalMemCopy(EXT_SUP_RATES_IE(pucBuffer)->aucExtSupportedRates,
662                        &aucAllSupportedRates[ucSupRatesLen],
663                        ucExtSupRatesLen);
664
665             prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
666             pucBuffer += IE_SIZE(pucBuffer);
667         }
668     }
669
670     return;
671 } /* end of assocBuildReAssocReqFrameCommonIEs() */
672
673
674 /*----------------------------------------------------------------------------*/
675 /*!
676 * @brief This function will compose the (Re)Association Request frame header and
677 *        its fixed fields
678 *
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
683 *
684 * @return (none)
685 */
686 /*----------------------------------------------------------------------------*/
687 __KAL_INLINE__ VOID
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
694     )
695 {
696     P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
697     BOOLEAN fgIsReAssoc;
698
699     UINT_16 u2FrameCtrl;
700     UINT_16 u2CapInfo;
701     UINT_16 u2ListenInterval;
702
703
704     ASSERT(prStaRec);
705     ASSERT(pucBuffer);
706     ASSERT(aucMACAddress);
707     ASSERT(pu2PayloadLen);
708
709     prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)pucBuffer;
710     fgIsReAssoc = prStaRec->fgIsReAssoc;
711
712     //4 <1> Compose the frame header of the (Re)Association Request  frame.
713     /* Fill the Frame Control field. */
714     if (fgIsReAssoc) {
715         u2FrameCtrl = MAC_FRAME_REASSOC_REQ;
716     }
717     else {
718         u2FrameCtrl = MAC_FRAME_ASSOC_REQ;
719     }
720     WLAN_SET_FIELD_16(&prAssocFrame->u2FrameCtrl, u2FrameCtrl);
721
722     /* Fill the DA field with Target BSSID. */
723     COPY_MAC_ADDR(prAssocFrame->aucDestAddr, prStaRec->aucMacAddr);
724
725     /* Fill the SA field with our MAC Address. */
726     COPY_MAC_ADDR(prAssocFrame->aucSrcAddr, aucMACAddress);
727
728     /* Fill the BSSID field with Target BSSID. */
729     COPY_MAC_ADDR(prAssocFrame->aucBSSID, prStaRec->aucMacAddr);
730
731     /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
732     prAssocFrame->u2SeqCtrl = 0;
733
734
735     //4 <2> Compose the frame body's common fixed field part of the (Re)Association Request  frame.
736     u2CapInfo = assocBuildCapabilityInfo(prAdapter, prStaRec);
737
738     /* Fill the Capability Information field. */
739     WLAN_SET_FIELD_16(&prAssocFrame->u2CapInfo, u2CapInfo);
740
741
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;
746     }
747     else {
748         DBGLOG(SAA, TRACE, ("Use default listen interval\n"));
749         u2ListenInterval = DEFAULT_LISTEN_INTERVAL;
750     }
751     prStaRec->u2ListenInterval = u2ListenInterval;
752
753     /* Fill the Listen Interval field. */
754     WLAN_SET_FIELD_16(&prAssocFrame->u2ListenInterval, u2ListenInterval);
755
756
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)) {
761
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;
765
766             COPY_MAC_ADDR(prReAssocFrame->aucCurrentAPAddr, prAisBssInfo->aucBSSID);
767         }
768         else {
769             ASSERT(0); /* We don't support ReAssociation for other network */
770         }
771
772         *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
773                          LISTEN_INTERVAL_FIELD_LEN +
774                          CURR_AP_ADDR_FIELD_LEN);
775     }
776     else {
777         *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
778                          LISTEN_INTERVAL_FIELD_LEN);
779     }
780
781     return;
782 } /* end of assocComposeReAssocReqFrame() */
783
784
785 /*----------------------------------------------------------------------------*/
786 /*!
787 * @brief This function will send the (Re)Association Request frame
788 *
789 * @param[in] prStaRec           Pointer to the STA_RECORD_T
790 *
791 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
792 * @retval WLAN_STATUS_SUCCESS   Successfully send frame to TX Module
793 */
794 /*----------------------------------------------------------------------------*/
795 WLAN_STATUS
796 assocSendReAssocReqFrame (
797     IN P_ADAPTER_T prAdapter,
798     IN P_STA_RECORD_T prStaRec
799     )
800 {
801     P_MSDU_INFO_T prMsduInfo;
802     P_BSS_INFO_T prBssInfo;
803
804     UINT_16 u2PayloadLen;
805     UINT_16 u2EstimatedFrameLen;
806     UINT_16 u2EstimatedExtraIELen;
807     BOOLEAN fgIsReAssoc;
808     UINT_32 i;
809
810
811     ASSERT(prStaRec);
812
813     //4 <1> Allocate a PKT_INFO_T for Authentication Frame
814     fgIsReAssoc = prStaRec->fgIsReAssoc;
815
816     /* Init with MGMT Header Length + Length of Fixed Fields + Common IE Length */
817     if (fgIsReAssoc) {
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));
826     }
827     else {
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));
835     }
836
837     /* + Extra IE Length */
838     u2EstimatedExtraIELen = 0;
839
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,
845                                                                     prStaRec);
846         }
847         else {
848             DBGLOG(P2P, TRACE, ("Function Linker Lost.\n"));
849             ASSERT(FALSE);
850         }
851     }
852     else {
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;
856             }
857             else {
858                 u2EstimatedExtraIELen += (UINT_16)txAssocReqIETable[i].pfnCalculateVariableIELen(prAdapter,
859                                                                                 prStaRec->ucNetTypeIndex,
860                                                                                 prStaRec);
861             }
862         }
863     }
864 #else
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;
868         }
869         else {
870             u2EstimatedExtraIELen += (UINT_16)txAssocReqIETable[i].pfnCalculateVariableIELen(prAdapter,
871                                                                             prStaRec->ucNetTypeIndex,
872                                                                             prStaRec);
873         }
874     }
875 #endif
876
877     u2EstimatedFrameLen += u2EstimatedExtraIELen;
878
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;
883     }
884
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]);
888
889
890     /* Compose Header and Fixed Field */
891     assocComposeReAssocReqFrameHeaderAndFF(prAdapter,
892             prStaRec,
893             (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
894             prBssInfo->aucOwnMacAddr,
895             &u2PayloadLen);
896
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;
909
910     //4 <4> Compose the frame body's IEs of the (Re)Association Request  frame.
911     assocBuildReAssocReqFrameCommonIEs(prAdapter, prMsduInfo);
912
913
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);
919         }
920         else {
921             DBGLOG(P2P, TRACE, ("Function Linker Lost.\n"));
922             ASSERT(FALSE);
923         }
924     }
925     else {
926         /* Append IE */
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);
930             }
931         }
932     }
933 #else
934     /* Append IE */
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);
938         }
939     }
940 #endif
941
942     //4 <6> Update the (Re)association request information
943     if (IS_STA_IN_AIS(prStaRec)) {
944         P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
945
946         prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
947
948 #if CFG_RSN_MIGRATION
949         kalUpdateReAssocReqInfo(prAdapter->prGlueInfo,
950                                 (PUINT_8)&prAssocFrame->u2CapInfo,
951                                 prMsduInfo->u2FrameLength - offsetof(WLAN_ASSOC_REQ_FRAME_T, u2CapInfo),
952                                 fgIsReAssoc);
953 #endif
954     }
955
956 #if CFG_ENABLE_WIFI_DIRECT
957     if ((prAdapter->fgIsP2PRegistered) && (IS_STA_IN_P2P(prStaRec))) {
958         P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
959
960         prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
961
962
963         kalP2PUpdateAssocInfo(
964             prAdapter->prGlueInfo,
965             (PUINT_8)&prAssocFrame->u2CapInfo,
966             prMsduInfo->u2FrameLength - offsetof(WLAN_ASSOC_REQ_FRAME_T, u2CapInfo),
967             fgIsReAssoc);
968     }
969 #endif
970
971     /* TODO(Kevin): Also release the unused tail room of the composed MMPDU */
972
973     //4 <6> Enqueue the frame to send this (Re)Association request frame.
974     nicTxEnqueueMsdu(prAdapter, prMsduInfo);
975
976     return WLAN_STATUS_SUCCESS;
977 } /* end of assocSendReAssocReqFrame() */
978
979
980 /*----------------------------------------------------------------------------*/
981 /*!
982 * @brief This function will strictly check the TX (Re)Association Request frame for
983 *        SAA event handling.
984 *
985 * @param[in] prMsduInfo         Pointer of MSDU_INFO_T
986 *
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.
989 */
990 /*----------------------------------------------------------------------------*/
991 WLAN_STATUS
992 assocCheckTxReAssocReqFrame (
993     IN P_ADAPTER_T      prAdapter,
994     IN P_MSDU_INFO_T    prMsduInfo
995     )
996 {
997     P_WLAN_ASSOC_REQ_FRAME_T prAssocReqFrame;
998     P_STA_RECORD_T prStaRec;
999     UINT_16 u2TxFrameCtrl;
1000
1001
1002     ASSERT(prMsduInfo);
1003     ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1004
1005     prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T)(prMsduInfo->prPacket);
1006     ASSERT(prAssocReqFrame);
1007
1008     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1009     ASSERT(prStaRec);
1010
1011     if(!prStaRec) {
1012         return WLAN_STATUS_INVALID_PACKET;
1013     }
1014
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;
1021         }
1022     }
1023     else {
1024         if (u2TxFrameCtrl != MAC_FRAME_ASSOC_REQ) {
1025             return WLAN_STATUS_FAILURE;
1026         }
1027     }
1028
1029     return WLAN_STATUS_SUCCESS;
1030
1031 } /* end of assocCheckTxReAssocReqFrame() */
1032
1033
1034 /*----------------------------------------------------------------------------*/
1035 /*!
1036 * @brief This function will strictly check the TX (Re)Association Response frame for
1037 *        AAA event handling.
1038 *
1039 * @param[in] prMsduInfo         Pointer of MSDU_INFO_T
1040 *
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.
1043 */
1044 /*----------------------------------------------------------------------------*/
1045 WLAN_STATUS
1046 assocCheckTxReAssocRespFrame (
1047     IN P_ADAPTER_T   prAdapter,
1048     IN P_MSDU_INFO_T prMsduInfo
1049     )
1050 {
1051     P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1052     P_STA_RECORD_T prStaRec;
1053     UINT_16 u2TxFrameCtrl;
1054
1055
1056     ASSERT(prMsduInfo);
1057     ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1058
1059     prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T)(prMsduInfo->prPacket);
1060     ASSERT(prAssocRspFrame);
1061
1062     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1063     ASSERT(prStaRec);
1064
1065     if(!prStaRec) {
1066         return WLAN_STATUS_INVALID_PACKET;
1067     }
1068
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;
1075         }
1076     }
1077     else {
1078         if (u2TxFrameCtrl != MAC_FRAME_ASSOC_RSP) {
1079             return WLAN_STATUS_FAILURE;
1080         }
1081     }
1082
1083     return WLAN_STATUS_SUCCESS;
1084
1085 } /* end of assocCheckTxReAssocRespFrame() */
1086
1087
1088 /*----------------------------------------------------------------------------*/
1089 /*!
1090 * @brief This function will validate the incoming (Re)Association Frame and take out
1091 *        the status code.
1092 *
1093 * @param[in] prSwRfb                Pointer to SW RFB data structure.
1094 * @param[out] pu2StatusCode         Pointer to store the Status Code from Authentication.
1095 *
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.
1098 */
1099 /*----------------------------------------------------------------------------*/
1100 WLAN_STATUS
1101 assocCheckRxReAssocRspFrameStatus (
1102     IN P_ADAPTER_T  prAdapter,
1103     IN P_SW_RFB_T   prSwRfb,
1104     OUT PUINT_16    pu2StatusCode
1105     )
1106 {
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;
1113
1114
1115     ASSERT(prSwRfb);
1116     ASSERT(pu2StatusCode);
1117
1118     if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) < (CAP_INFO_FIELD_LEN +
1119                                     STATUS_CODE_FIELD_LEN +
1120                                     AID_FIELD_LEN)) {
1121         ASSERT(0);
1122         return WLAN_STATUS_FAILURE;
1123     }
1124
1125     DBGLOG(SAA, LOUD, ("prSwRfb->u2PayloadLength = %d\n", prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen));
1126
1127     prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1128     ASSERT(prStaRec);
1129
1130     if(!prStaRec) {
1131         return WLAN_STATUS_INVALID_PACKET;
1132     }
1133
1134     //4 <1> locate the (Re)Assocation Resp Frame.
1135     prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prSwRfb->pvHeader;
1136
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;
1144         }
1145     }
1146     else {
1147         if (u2RxFrameCtrl != MAC_FRAME_ASSOC_RSP) {
1148             return WLAN_STATUS_FAILURE;
1149         }
1150     }
1151
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
1155
1156     //WLAN_GET_FIELD_16(&prAssocRspFrame->u2StatusCode, &u2RxStatusCode);
1157     u2RxStatusCode = prAssocRspFrame->u2StatusCode; // NOTE(Kevin): Optimized for ARM
1158
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.
1163      */
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"));
1170         }
1171         else
1172 #endif
1173 #if CFG_ENABLE_WIFI_DIRECT
1174         if (prAdapter->fgIsP2PRegistered && 1) {
1175         /* Todo:: Fixed this */
1176         }
1177         else
1178 #endif
1179         {
1180         }
1181
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;
1185         }
1186 #endif
1187     }
1188
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));
1196 #endif
1197     }
1198
1199     //4 <5> Update CAP_INFO and ASSOC_ID
1200     if (u2RxStatusCode == STATUS_CODE_SUCCESSFUL) {
1201         prStaRec->u2CapInfo = u2RxCapInfo;
1202
1203         //WLAN_GET_FIELD_16(&prAssocRspFrame->u2AssocId, &u2RxAssocId);
1204         u2RxAssocId = prAssocRspFrame->u2AssocId; // NOTE(Kevin): Optimized for ARM
1205
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.
1209                 *   For AID = 2
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
1213                 */
1214         if((u2RxAssocId & BIT(6)) &&
1215            (u2RxAssocId & BIT(7)) &&
1216            !(u2RxAssocId & BITS(8, 15))) {
1217             prStaRec->u2AssocId = u2RxAssocId & ~BITS(6,7);
1218         } else {
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;
1223
1224                 prBssSpecInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
1225                 ASSERT(prBssSpecInfo);
1226
1227                 prBssSpecInfo->ucSaQueryTimedOut = 0;
1228             }
1229 #endif
1230         }
1231     }
1232
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"));
1236     }
1237     else if (u2RxStatusCode == STATUS_CODE_ASSOC_REJECTED_TEMPORARILY) {
1238         PUINT_8 pucIE, pucTime;
1239         UINT_16 u2IELength;
1240         UINT_16 u2Offset = 0;
1241
1242         u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
1243         pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
1244
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) {
1249                     UINT_32 tu;
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);
1256                     }
1257                 }
1258                 break;
1259             }
1260         } /* end of IE_FOR_EACH */
1261     }
1262 #endif
1263     *pu2StatusCode = u2RxStatusCode;
1264
1265     return WLAN_STATUS_SUCCESS;
1266
1267 } /* end of assocCheckRxReAssocRspFrameStatus() */
1268
1269
1270 /*----------------------------------------------------------------------------*/
1271 /*!
1272 * \brief This function will compose the Disassociation frame
1273 *
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
1278 *
1279 * \return (none)
1280 */
1281 /*----------------------------------------------------------------------------*/
1282 __KAL_INLINE__ VOID
1283 assocComposeDisassocFrame (
1284     IN P_STA_RECORD_T   prStaRec,
1285     IN PUINT_8          pucBuffer,
1286     IN UINT_8           aucMACAddress[],
1287     IN UINT_16          u2ReasonCode
1288     )
1289 {
1290     P_WLAN_DISASSOC_FRAME_T prDisAssocFrame;
1291     UINT_16 u2FrameCtrl;
1292
1293     ASSERT(pucBuffer);
1294     ASSERT(pucBuffer);
1295     ASSERT(aucMACAddress);
1296
1297     prDisAssocFrame = (P_WLAN_DISASSOC_FRAME_T)pucBuffer;
1298
1299     //4 <1> Compose the frame header of the DisAssociation  frame.
1300     /* Fill the Frame Control field. */
1301     u2FrameCtrl = MAC_FRAME_DISASSOC;
1302
1303     WLAN_SET_FIELD_16(&prDisAssocFrame->u2FrameCtrl, u2FrameCtrl);
1304
1305     /* Fill the DA field with Target BSSID. */
1306     COPY_MAC_ADDR(prDisAssocFrame->aucDestAddr, prStaRec->aucMacAddr);
1307
1308     /* Fill the SA field with our MAC Address. */
1309     COPY_MAC_ADDR(prDisAssocFrame->aucSrcAddr, aucMACAddress);
1310
1311     /* Fill the BSSID field with Target BSSID. */
1312     COPY_MAC_ADDR(prDisAssocFrame->aucBSSID, prStaRec->aucMacAddr);
1313
1314     /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
1315     prDisAssocFrame->u2SeqCtrl = 0;
1316
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);
1320
1321     return;
1322 } /* end of assocComposeDisassocFrame() */
1323
1324
1325 /*----------------------------------------------------------------------------*/
1326 /*!
1327 * @brief This function will send the Disassociation frame
1328 *
1329 * @param[in] prStaRec           Pointer to the STA_RECORD_T
1330 * @param[in] u2ReasonCode  The reason code of disassociation
1331 *
1332 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
1333 * @retval WLAN_STATUS_SUCCESS   Successfully send frame to TX Module
1334 */
1335 /*----------------------------------------------------------------------------*/
1336 WLAN_STATUS
1337 assocSendDisAssocFrame (
1338     IN P_ADAPTER_T    prAdapter,
1339     IN P_STA_RECORD_T prStaRec,
1340     IN UINT_16        u2ReasonCode
1341     )
1342 {
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;
1348
1349
1350     ASSERT(prStaRec);
1351
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;
1357
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;
1362     }
1363
1364     //4 <2> Compose Disassociation  frame header and fixed fields in MSDU_INfO_T.
1365     ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1366
1367     pucMacAddress = prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex].aucOwnMacAddr;
1368
1369     /* Compose Header and Fixed Field */
1370     assocComposeDisassocFrame(prStaRec,
1371                               (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
1372                               pucMacAddress,
1373                               u2ReasonCode);
1374
1375 #if CFG_SUPPORT_802_11W
1376     if (rsnCheckBipKeyInstalled(prAdapter, prStaRec)) {
1377         P_WLAN_DISASSOC_FRAME_T prDisassocFrame;
1378
1379         prDisassocFrame = (P_WLAN_DEAUTH_FRAME_T)(PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
1380
1381         prDisassocFrame->u2FrameCtrl |= MASK_FC_PROTECTED_FRAME;
1382         DBGLOG(TX, WARN, ("assocSendDisAssocFrame with protection\n"));
1383     }
1384 #endif
1385
1386     u2PayloadLen = REASON_CODE_FIELD_LEN;
1387
1388     //4 <3> Update information of MSDU_INFO_T
1389     ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1390
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;
1402
1403     //4 <4> Enqueue the frame to send this (Re)Association request frame.
1404     nicTxEnqueueMsdu(prAdapter, prMsduInfo);
1405
1406     return WLAN_STATUS_SUCCESS;
1407 } /* end of assocSendDisAssocFrame() */
1408
1409
1410 /*----------------------------------------------------------------------------*/
1411 /*!
1412 * @brief This function will parse and process the incoming Disassociation frame
1413 *        if the given BSSID is matched.
1414 *
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.
1418 *
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.
1421 */
1422 /*----------------------------------------------------------------------------*/
1423 WLAN_STATUS
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
1429     )
1430 {
1431     P_WLAN_DISASSOC_FRAME_T prDisassocFrame;
1432     UINT_16 u2RxReasonCode;
1433
1434
1435     ASSERT(prSwRfb);
1436     ASSERT(aucBSSID);
1437     ASSERT(pu2ReasonCode);
1438
1439     //4 <1> locate the Disassociation Frame.
1440     prDisassocFrame = (P_WLAN_DISASSOC_FRAME_T) prSwRfb->pvHeader;
1441
1442     //4 <2> Parse the Header of Disassociation Frame.
1443     if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) < REASON_CODE_FIELD_LEN) {
1444         ASSERT(0);
1445         return WLAN_STATUS_FAILURE;
1446     }
1447
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;
1453     }
1454
1455     //4 <3> Parse the Fixed Fields of Deauthentication Frame Body.
1456     WLAN_GET_FIELD_16(&prDisassocFrame->u2ReasonCode, &u2RxReasonCode);
1457     *pu2ReasonCode = u2RxReasonCode;
1458
1459     return WLAN_STATUS_SUCCESS;
1460
1461 } /* end of assocProcessRxDisassocFrame() */
1462
1463
1464 #if CFG_SUPPORT_AAA
1465 /*----------------------------------------------------------------------------*/
1466 /*!
1467 * @brief This function will parse and process the incoming Association Req frame
1468 *        and return a Status Code.
1469 *
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.
1473 *
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.
1476 */
1477 /*----------------------------------------------------------------------------*/
1478 WLAN_STATUS
1479 assocProcessRxAssocReqFrame (
1480     IN P_ADAPTER_T  prAdapter,
1481     IN P_SW_RFB_T   prSwRfb,
1482     OUT PUINT_16    pu2StatusCode
1483     )
1484 {
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;
1493     UINT_16 u2IELength;
1494     UINT_16 u2Offset = 0;
1495     UINT_16 u2StatusCode = STATUS_CODE_SUCCESSFUL;
1496     UINT_16 u2RxFrameCtrl;
1497     UINT_16 u2BSSBasicRateSet;
1498     BOOLEAN fgIsUnknownBssBasicRate;
1499     UINT_32 i;
1500
1501
1502     ASSERT(prAdapter);
1503     ASSERT(prSwRfb);
1504     ASSERT(pu2StatusCode);
1505
1506     prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1507
1508     if (prStaRec == NULL) {
1509         return WLAN_STATUS_FAILURE;
1510     }
1511
1512     //4 <1> locate the Association Req Frame.
1513     prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T) prSwRfb->pvHeader;
1514
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)) {
1518         ASSERT(0);
1519         return WLAN_STATUS_FAILURE;
1520     }
1521
1522     prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
1523
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 */
1527     }
1528
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;
1534
1535         u2IELength = (prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) -
1536             (UINT_16)(OFFSET_OF(WLAN_REASSOC_REQ_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN);
1537
1538         pucIEStart = pucIE = ((P_WLAN_REASSOC_REQ_FRAME_T)(prSwRfb->pvHeader))->aucInfoElem;
1539     }
1540     else {
1541         prStaRec->fgIsReAssoc = FALSE;
1542
1543         u2IELength = (prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) -
1544             (UINT_16)(OFFSET_OF(WLAN_ASSOC_REQ_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN);
1545
1546         pucIEStart = pucIE = prAssocReqFrame->aucInfoElem;
1547     }
1548
1549
1550     //4 <3> Parse the Fixed Fields of Assoc Req Frame Body.
1551     prStaRec->u2CapInfo = prAssocReqFrame->u2CapInfo;
1552
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;
1560         }
1561     }
1562 #endif
1563
1564     prStaRec->u2ListenInterval = prAssocReqFrame->u2ListenInterval;
1565     prStaRec->ucPhyTypeSet = 0;
1566
1567     /* Might be legacy client or p2p gc. */
1568     prStaRec->eStaType = STA_TYPE_LEGACY_CLIENT;
1569
1570     //4 <4> Parse the IE of Assoc Req Frame Body.
1571     IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1572         switch (IE_ID(pucIE)) {
1573         case ELEM_ID_SSID:
1574             if ((!prIeSsid) && /* NOTE(Kevin): Get SSID once */
1575                 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
1576                 prIeSsid = (P_IE_SSID_T)pucIE;
1577             }
1578             break;
1579
1580         case ELEM_ID_SUP_RATES:
1581             if ((!prIeSupportedRate) && (IE_LEN(pucIE) <= RATE_NUM)) {
1582                 prIeSupportedRate = SUP_RATES_IE(pucIE);
1583             }
1584             break;
1585
1586         case ELEM_ID_EXTENDED_SUP_RATES:
1587             if (!prIeExtSupportedRate)
1588                 prIeExtSupportedRate = EXT_SUP_RATES_IE(pucIE);
1589             break;
1590         case ELEM_ID_HT_CAP:
1591             prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HT;
1592             break;
1593         case ELEM_ID_RSN:
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;
1601                 }
1602             }
1603             #endif
1604             break;
1605         case ELEM_ID_VENDOR:
1606             #if CFG_ENABLE_WIFI_DIRECT
1607             {
1608                 if ((prAdapter->fgIsP2PRegistered)) {
1609                     UINT_8 ucOuiType = 0;
1610
1611                     p2pFuncParseCheckForP2PInfoElem(prAdapter, pucIE, &ucOuiType);
1612
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;
1616                     }
1617                 }
1618             }
1619             #endif
1620             break;
1621         default:
1622             for (i = 0; i < (sizeof(rxAssocReqIETable) / sizeof(VERIFY_IE_ENTRY_T)); i++) {
1623
1624                 if ((IE_ID(pucIE)) == rxAssocReqIETable[i].ucElemID) {
1625                     rxAssocReqIETable[i].pfnVarifyIE(prAdapter, prSwRfb, (P_IE_HDR_T)pucIE, &u2StatusCode);
1626
1627                     if (u2StatusCode != STATUS_CODE_SUCCESSFUL) {
1628                         *pu2StatusCode = u2StatusCode;
1629                         return WLAN_STATUS_SUCCESS;
1630                     }
1631                 }
1632             }
1633
1634             break;
1635         }
1636     } /* end of IE_FOR_EACH */
1637
1638     // parsing for WMM related information (2010/12/21)
1639     mqmProcessAssocReq(
1640         prAdapter,
1641         prSwRfb,
1642         pucIEStart,
1643         u2IELength);
1644
1645     do {
1646         if (prIeSsid) {
1647             if (UNEQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen,
1648                              prIeSsid->aucSSID, prIeSsid->ucLength)) {
1649
1650                 u2StatusCode = STATUS_CODE_UNSPECIFIED_FAILURE;
1651                 break;
1652             }
1653         }
1654         else {
1655             u2StatusCode = STATUS_CODE_UNSPECIFIED_FAILURE;
1656             break;
1657         }
1658
1659         prStaRec->u2OperationalRateSet = 0;
1660         prStaRec->u2BSSBasicRateSet = 0;
1661
1662         if (prIeSupportedRate || prIeExtSupportedRate) {
1663             rateGetRateSetFromIEs(prIeSupportedRate,
1664                                   prIeExtSupportedRate,
1665                                   &prStaRec->u2OperationalRateSet,
1666                                   &u2BSSBasicRateSet, /* Ignore any Basic Bit */
1667                                   &fgIsUnknownBssBasicRate);
1668
1669             if ((prBssInfo->u2BSSBasicRateSet & prStaRec->u2OperationalRateSet) !=
1670                  prBssInfo->u2BSSBasicRateSet) {
1671
1672                 u2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
1673                 break;
1674             }
1675
1676             /* Accpet the Sta, update BSSBasicRateSet from Bss */
1677
1678             prStaRec->u2BSSBasicRateSet = prBssInfo->u2BSSBasicRateSet;
1679
1680             prStaRec->u2DesiredNonHTRateSet = (prStaRec->u2OperationalRateSet & RATE_SET_ALL_ABG);
1681
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)) {
1686
1687                     if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1688                         prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_ERP;
1689                     }
1690
1691
1692                     if (!(u2BSSBasicRateSet & RATE_SET_OFDM)) {
1693                         if (prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) {
1694                             prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HR_DSSS;
1695                         }
1696
1697                     }
1698
1699                 }
1700             #else
1701                 if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1702                     prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_ERP;
1703                 }
1704                 if (prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) {
1705                     prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HR_DSSS;
1706                 }
1707             #endif
1708             }
1709             else { /* (BAND_5G == prBssDesc->eBande) */
1710             #if 0 /* Marked by CMC 20111024 */
1711                 if (!(u2BSSBasicRateSet & RATE_SET_BIT_HT_PHY)) {
1712
1713                     prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_OFDM;
1714                 }
1715                 ASSERT((prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) == 0);
1716             #else
1717                 if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1718                     prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_OFDM;
1719                 }
1720             #endif
1721             }
1722
1723         }
1724         else {
1725             ASSERT(0);
1726             u2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
1727             break;
1728         }
1729
1730 #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_HOTSPOT_PRIVACY_CHECK
1731         if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1732             if (prIeRsn) {
1733                 if (!kalP2PGetCipher(prAdapter->prGlueInfo)) {
1734                     u2StatusCode = STATUS_CODE_CIPHER_SUITE_REJECTED;
1735                     break;
1736                 }
1737             }
1738             else {
1739                 prStaRec->rSecInfo.fgAllowOnly1x = FALSE;
1740                 if (kalP2PGetCipher(prAdapter->prGlueInfo)) {
1741                     //Only Allow 1x
1742                     prStaRec->rSecInfo.fgAllowOnly1x = TRUE;
1743                     break;
1744                 }
1745             }
1746         }
1747 #endif
1748
1749     } while (FALSE);
1750
1751 #if CFG_ENABLE_WIFI_DIRECT
1752     if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1753         #if 1 /* ICS */
1754         {
1755             PUINT_8 cp = (PUINT_8)&prAssocReqFrame->u2CapInfo;
1756             if (prStaRec->fgIsReAssoc)
1757                 cp += 10;
1758             else
1759                 cp += 4;
1760             if (prStaRec->pucAssocReqIe) {
1761                                 kalMemFree(prStaRec->pucAssocReqIe, VIR_MEM_TYPE, prStaRec->u2AssocReqIeLen);
1762                                 prStaRec->pucAssocReqIe = NULL;
1763             }
1764             prStaRec->u2AssocReqIeLen = u2IELength;
1765             if (u2IELength) {
1766                 prStaRec->pucAssocReqIe = kalMemAlloc(u2IELength, VIR_MEM_TYPE);
1767                 kalMemCopy(prStaRec->pucAssocReqIe, cp, u2IELength);
1768             }
1769         }
1770         #endif
1771             kalP2PUpdateAssocInfo(prAdapter->prGlueInfo, (PUINT_8)&prAssocReqFrame->u2CapInfo, u2IELength + (prStaRec->fgIsReAssoc ? 10 : 4), prStaRec->fgIsReAssoc);
1772         }
1773 #endif
1774
1775     *pu2StatusCode = u2StatusCode;
1776
1777     return WLAN_STATUS_SUCCESS;
1778
1779 } /* end of assocProcessRxAssocReqFrame() */
1780
1781
1782 /*----------------------------------------------------------------------------*/
1783 /*!
1784 * @brief This function is used to compose Common Information Elements for Association
1785 *        Response Frame.
1786 *
1787 * @param[in] prMsduInfo     Pointer to the composed MSDU_INFO_T.
1788 * @param[in] prBssInfo      Pointer to the BSS_INFO_T.
1789 *
1790 * @return (none)
1791 */
1792 /*----------------------------------------------------------------------------*/
1793 __KAL_INLINE__ VOID
1794 assocBuildReAssocRespFrameCommonIEs (
1795     IN P_ADAPTER_T prAdapter,
1796     IN P_MSDU_INFO_T prMsduInfo,
1797     IN P_BSS_INFO_T prBssInfo
1798     )
1799 {
1800     PUINT_8 pucBuffer;
1801     P_STA_RECORD_T prStaRec;
1802     UINT_8 ucSupRatesLen;
1803     UINT_8 ucExtSupRatesLen;
1804
1805
1806     ASSERT(prMsduInfo);
1807     ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1808
1809     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1810     ASSERT(prStaRec);
1811
1812
1813     pucBuffer = (PUINT_8)((UINT_32)prMsduInfo->prPacket +
1814                           (UINT_32)prMsduInfo->u2FrameLength);
1815     ASSERT(pucBuffer);
1816
1817     if (prBssInfo->ucAllSupportedRatesLen > ELEM_MAX_LEN_SUP_RATES) {
1818
1819         ucSupRatesLen = ELEM_MAX_LEN_SUP_RATES;
1820         ucExtSupRatesLen = prBssInfo->ucAllSupportedRatesLen - ELEM_MAX_LEN_SUP_RATES;
1821     }
1822     else {
1823         ucSupRatesLen = prBssInfo->ucAllSupportedRatesLen;
1824         ucExtSupRatesLen = 0;
1825     }
1826
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,
1833                    ucSupRatesLen);
1834
1835         prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
1836         pucBuffer += IE_SIZE(pucBuffer);
1837     }
1838
1839
1840     /* Fill the Extended Supported Rates element. */
1841     if (ucExtSupRatesLen) {
1842
1843         EXT_SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_EXTENDED_SUP_RATES;
1844         EXT_SUP_RATES_IE(pucBuffer)->ucLength = ucExtSupRatesLen;
1845
1846         kalMemCopy(EXT_SUP_RATES_IE(pucBuffer)->aucExtSupportedRates,
1847                    &prBssInfo->aucAllSupportedRates[ucSupRatesLen],
1848                    ucExtSupRatesLen);
1849
1850         prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
1851     }
1852
1853     return;
1854 } /* end of assocBuildReAssocRespFrameCommonIEs() */
1855
1856
1857 /*----------------------------------------------------------------------------*/
1858 /*!
1859 * @brief This function will compose the (Re)Association Response frame
1860 *
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
1866 *
1867 * @return (none)
1868 */
1869 /*----------------------------------------------------------------------------*/
1870 __KAL_INLINE__ VOID
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
1877     )
1878 {
1879     P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1880     BOOLEAN fgIsReAssoc;
1881
1882     UINT_16 u2FrameCtrl;
1883
1884
1885     ASSERT(prStaRec);
1886     ASSERT(pucBuffer);
1887     ASSERT(aucBSSID);
1888     ASSERT(pu2PayloadLen);
1889
1890     prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T)pucBuffer;
1891     fgIsReAssoc = prStaRec->fgIsReAssoc;
1892
1893     //4 <1> Compose the frame header of the (Re)Association Request  frame.
1894     /* Fill the Frame Control field. */
1895     if (fgIsReAssoc) {
1896         u2FrameCtrl = MAC_FRAME_REASSOC_RSP;
1897     }
1898     else {
1899         u2FrameCtrl = MAC_FRAME_ASSOC_RSP;
1900     }
1901     //WLAN_SET_FIELD_16(&prAssocFrame->u2FrameCtrl, u2FrameCtrl);
1902     prAssocRspFrame->u2FrameCtrl = u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1903
1904     /* Fill the DA field with Target MAC Address. */
1905     COPY_MAC_ADDR(prAssocRspFrame->aucDestAddr, prStaRec->aucMacAddr);
1906
1907     /* Fill the SA field with current BSSID. */
1908     COPY_MAC_ADDR(prAssocRspFrame->aucSrcAddr, aucBSSID);
1909
1910     /* Fill the BSSID field with current BSSID. */
1911     COPY_MAC_ADDR(prAssocRspFrame->aucBSSID, aucBSSID);
1912
1913     /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
1914     prAssocRspFrame->u2SeqCtrl = 0;
1915
1916
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
1921
1922     //WLAN_SET_FIELD_16(&prAssocFrame->u2StatusCode, prStaRec->u2StatusCode);
1923     prAssocRspFrame->u2StatusCode = prStaRec->u2StatusCode; // NOTE(Kevin): Optimized for ARM
1924
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
1928
1929     *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
1930                       STATUS_CODE_FIELD_LEN +
1931                       AID_FIELD_LEN);
1932
1933     return;
1934 } /* end of assocComposeReAssocRespFrameHeaderAndFF() */
1935
1936
1937 /*----------------------------------------------------------------------------*/
1938 /*!
1939 * @brief This function will send the (Re)Association Resp frame
1940 *
1941 * @param[in] prStaRec           Pointer to the STA_RECORD_T
1942 *
1943 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
1944 * @retval WLAN_STATUS_SUCCESS   Successfully send frame to TX Module
1945 */
1946 /*----------------------------------------------------------------------------*/
1947 WLAN_STATUS
1948 assocSendReAssocRespFrame (
1949     IN P_ADAPTER_T      prAdapter,
1950     IN P_STA_RECORD_T   prStaRec
1951     )
1952 {
1953     P_BSS_INFO_T prBssInfo;
1954     P_MSDU_INFO_T prMsduInfo;
1955
1956     UINT_16 u2PayloadLen;
1957     UINT_16 u2EstimatedFrameLen;
1958     UINT_16 u2EstimatedExtraIELen;
1959     BOOLEAN fgIsReAssoc;
1960     UINT_32 i;
1961
1962
1963     ASSERT(prStaRec);
1964
1965
1966     //4 <1> Allocate a PKT_INFO_T for Authentication Frame
1967     fgIsReAssoc = prStaRec->fgIsReAssoc;
1968
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 + \
1974                           AID_FIELD_LEN + \
1975                           (ELEM_HDR_LEN + ELEM_MAX_LEN_SUP_RATES) + \
1976                           (ELEM_HDR_LEN + (RATE_NUM - ELEM_MAX_LEN_SUP_RATES));
1977
1978     /* + Extra IE Length */
1979     u2EstimatedExtraIELen = 0;
1980
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;
1984         }
1985         else if (txAssocRespIETable[i].pfnCalculateVariableIELen != NULL) {
1986             u2EstimatedExtraIELen += (UINT_16)txAssocRespIETable[i].pfnCalculateVariableIELen(prAdapter,
1987                                                                                                         prStaRec->ucNetTypeIndex,
1988                                                                                                         prStaRec);
1989         }
1990
1991     }
1992
1993     u2EstimatedFrameLen += u2EstimatedExtraIELen;
1994
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;
1999     }
2000
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]);
2004
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,
2010                                             &u2PayloadLen);
2011
2012     //4 <3> Update information of MSDU_INFO_T
2013     ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
2014
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;
2026
2027     //4 <4> Compose the frame body's IEs of the (Re)Association Request  frame.
2028     assocBuildReAssocRespFrameCommonIEs(prAdapter, prMsduInfo, prBssInfo);
2029
2030
2031     //4 <5> Compose IEs in MSDU_INFO_T
2032
2033     /* Append IE */
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);
2037         }
2038     }
2039
2040     /* TODO(Kevin): Also release the unused tail room of the composed MMPDU */
2041
2042     //4 <6> Enqueue the frame to send this (Re)Association request frame.
2043     nicTxEnqueueMsdu(prAdapter, prMsduInfo);
2044
2045     return WLAN_STATUS_SUCCESS;
2046
2047 } /* end of assocSendReAssocRespFrame() */
2048 #endif /* CFG_SUPPORT_AAA */
2049
2050