support different wifi bt chip auto compatible
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / mt5931 / 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 #endif
426     { (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP),     NULL,     rlmRspGenerateExtCapIE   },      /* 127 */
427     { (ELEM_HDR_LEN + ELEM_MAX_LEN_WMM_PARAM),     NULL,    mqmGenerateWmmParamIE }         /* 221 */
428 };
429 #endif
430
431 /*******************************************************************************
432 *                           P R I V A T E   D A T A
433 ********************************************************************************
434 */
435
436 /*******************************************************************************
437 *                                 M A C R O S
438 ********************************************************************************
439 */
440
441 /*******************************************************************************
442 *                   F U N C T I O N   D E C L A R A T I O N S
443 ********************************************************************************
444 */
445
446 /*******************************************************************************
447 *                              F U N C T I O N S
448 ********************************************************************************
449 */
450 /*----------------------------------------------------------------------------*/
451 /*!
452 * @brief This function is used to compose the Capability Info Field.
453 *
454 * @param[in] prStaRec               Pointer to the STA_RECORD_T
455 *
456 * @retval Capability Info Field
457 */
458 /*----------------------------------------------------------------------------*/
459 __KAL_INLINE__ UINT_16
460 assocBuildCapabilityInfo (
461     IN P_ADAPTER_T prAdapter,
462     IN P_STA_RECORD_T prStaRec
463     )
464 {
465     UINT_32 u4NonHTPhyType;
466     UINT_16 u2CapInfo;
467
468
469     ASSERT(prStaRec);
470
471
472     /* Set up our requested capabilities. */
473     u2CapInfo = CAP_INFO_ESS;
474     u2CapInfo |= CAP_CF_STA_NOT_POLLABLE;
475
476     if (prStaRec->u2CapInfo & CAP_INFO_PRIVACY) {
477         u2CapInfo |= CAP_INFO_PRIVACY;
478     }
479
480
481     /* 7.3.1.4 */
482     if (prStaRec->fgHasBasicPhyType) {
483         u4NonHTPhyType = prStaRec->ucNonHTBasicPhyType;
484
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)) ) ) {
489
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)
493              */
494             u2CapInfo |= CAP_INFO_SHORT_PREAMBLE;
495         }
496
497         if (rNonHTPhyAttributes[u4NonHTPhyType].fgIsShortSlotTimeOptionImplemented &&
498             prAdapter->rWifiVar.fgIsShortSlotTimeOptionEnable) {
499             u2CapInfo |= CAP_INFO_SHORT_SLOT_TIME;
500         }
501     }
502
503     DBGLOG(SAA, LOUD, ("ASSOC REQ: Compose Capability = 0x%04x for Target BSS ["MACSTR"].\n",
504         u2CapInfo, MAC2STR(prStaRec->aucMacAddr)));
505
506
507     return u2CapInfo;
508
509 } /* end of assocBuildCapabilityInfo() */
510
511
512 /*----------------------------------------------------------------------------*/
513 /*!
514 * @brief This function is used to compose Common Information Elements for Association
515 *        Request Frame.
516 *
517 * @param[in] prMsduInfo     Pointer to the composed MSDU_INFO_T.
518 *
519 * @return (none)
520 */
521 /*----------------------------------------------------------------------------*/
522 __KAL_INLINE__ VOID
523 assocBuildReAssocReqFrameCommonIEs (
524     IN P_ADAPTER_T prAdapter,
525     IN P_MSDU_INFO_T prMsduInfo
526     )
527 {
528     P_CONNECTION_SETTINGS_T prConnSettings;
529     P_STA_RECORD_T prStaRec;
530     PUINT_8 pucBuffer;
531     UINT_16 u2SupportedRateSet;
532     UINT_8 aucAllSupportedRates[RATE_NUM] = {0};
533     UINT_8 ucAllSupportedRatesLen;
534     UINT_8 ucSupRatesLen;
535     UINT_8 ucExtSupRatesLen;
536
537     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
538     ASSERT(prMsduInfo);
539     ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
540
541     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
542     ASSERT(prStaRec);
543
544     if(!prStaRec) {
545         return;
546     }
547
548     pucBuffer = (PUINT_8)((UINT_32)prMsduInfo->prPacket +
549                           (UINT_32)prMsduInfo->u2FrameLength);
550     ASSERT(pucBuffer);
551
552     if (IS_STA_IN_AIS(prStaRec)) {
553
554         /* Fill the SSID element. */
555         SSID_IE(pucBuffer)->ucId = ELEM_ID_SSID;
556
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.
559          */
560
561         COPY_SSID(SSID_IE(pucBuffer)->aucSSID,
562                   SSID_IE(pucBuffer)->ucLength,
563                   prConnSettings->aucSSID,
564                   prConnSettings->ucSSIDLen);
565
566         prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
567         pucBuffer += IE_SIZE(pucBuffer);
568
569     }
570 #if CFG_ENABLE_WIFI_DIRECT
571     else if((prAdapter->fgIsP2PRegistered) &&
572         (IS_STA_IN_P2P(prStaRec))) {
573         pucBuffer = p2pBuildReAssocReqFrameCommonIEs(prAdapter, prMsduInfo, pucBuffer);
574     }
575 #endif
576 #if CFG_ENABLE_BT_OVER_WIFI
577     else if (IS_STA_IN_BOW(prStaRec)) {
578
579         SSID_IE(pucBuffer)->ucId = ELEM_ID_SSID;
580
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.
583          */
584
585         COPY_SSID(SSID_IE(pucBuffer)->aucSSID,
586                   SSID_IE(pucBuffer)->ucLength,
587                   prConnSettings->aucSSID,
588                   prConnSettings->ucSSIDLen);
589
590         prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
591         pucBuffer += IE_SIZE(pucBuffer);
592     }
593 #endif
594
595     else {
596         /* TODO(Kevin): For other network */
597     }
598
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.
604      */
605     //rateGetDataRatesFromRateSet((prBssDesc->u2OperationalRateSet &
606     //                             rPhyAttributes[prBssDesc->ePhyType].u2SupportedRateSet),
607
608     if (prStaRec->fgHasBasicPhyType) {
609         UINT_32 u4NonHTPhyType;
610
611
612         u4NonHTPhyType = prStaRec->ucNonHTBasicPhyType;
613
614         u2SupportedRateSet = (prStaRec->u2OperationalRateSet &
615                               rNonHTPhyAttributes[u4NonHTPhyType].u2SupportedRateSet);
616
617         ASSERT(u2SupportedRateSet);
618
619         if (!u2SupportedRateSet) {
620             u2SupportedRateSet = rNonHTPhyAttributes[u4NonHTPhyType].u2SupportedRateSet;
621         }
622
623         /* TODO(Kevin): For P2P, we shouldn't send support rate set which contains 11b rate */
624
625         rateGetDataRatesFromRateSet(u2SupportedRateSet,
626                                     0,
627                                     aucAllSupportedRates,
628                                     &ucAllSupportedRatesLen);
629
630         ucSupRatesLen = ((ucAllSupportedRatesLen > ELEM_MAX_LEN_SUP_RATES) ?
631                          ELEM_MAX_LEN_SUP_RATES : ucAllSupportedRatesLen);
632
633         ucExtSupRatesLen = ucAllSupportedRatesLen - ucSupRatesLen;
634
635
636         /* Fill the Supported Rates element. */
637         if (ucSupRatesLen) {
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,
642                        ucSupRatesLen);
643
644             prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
645             pucBuffer += IE_SIZE(pucBuffer);
646         }
647
648
649         /* Fill the Extended Supported Rates element. */
650         if (ucExtSupRatesLen) {
651
652             EXT_SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_EXTENDED_SUP_RATES;
653             EXT_SUP_RATES_IE(pucBuffer)->ucLength = ucExtSupRatesLen;
654
655             kalMemCopy(EXT_SUP_RATES_IE(pucBuffer)->aucExtSupportedRates,
656                        &aucAllSupportedRates[ucSupRatesLen],
657                        ucExtSupRatesLen);
658
659             prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
660             pucBuffer += IE_SIZE(pucBuffer);
661         }
662     }
663
664     return;
665 } /* end of assocBuildReAssocReqFrameCommonIEs() */
666
667
668 /*----------------------------------------------------------------------------*/
669 /*!
670 * @brief This function will compose the (Re)Association Request frame header and
671 *        its fixed fields
672 *
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
677 *
678 * @return (none)
679 */
680 /*----------------------------------------------------------------------------*/
681 __KAL_INLINE__ VOID
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
688     )
689 {
690     P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
691     BOOLEAN fgIsReAssoc;
692
693     UINT_16 u2FrameCtrl;
694     UINT_16 u2CapInfo;
695     UINT_16 u2ListenInterval;
696
697
698     ASSERT(prStaRec);
699     ASSERT(pucBuffer);
700     ASSERT(aucMACAddress);
701     ASSERT(pu2PayloadLen);
702
703     prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)pucBuffer;
704     fgIsReAssoc = prStaRec->fgIsReAssoc;
705
706     //4 <1> Compose the frame header of the (Re)Association Request  frame.
707     /* Fill the Frame Control field. */
708     if (fgIsReAssoc) {
709         u2FrameCtrl = MAC_FRAME_REASSOC_REQ;
710     }
711     else {
712         u2FrameCtrl = MAC_FRAME_ASSOC_REQ;
713     }
714     WLAN_SET_FIELD_16(&prAssocFrame->u2FrameCtrl, u2FrameCtrl);
715
716     /* Fill the DA field with Target BSSID. */
717     COPY_MAC_ADDR(prAssocFrame->aucDestAddr, prStaRec->aucMacAddr);
718
719     /* Fill the SA field with our MAC Address. */
720     COPY_MAC_ADDR(prAssocFrame->aucSrcAddr, aucMACAddress);
721
722     /* Fill the BSSID field with Target BSSID. */
723     COPY_MAC_ADDR(prAssocFrame->aucBSSID, prStaRec->aucMacAddr);
724
725     /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
726     prAssocFrame->u2SeqCtrl = 0;
727
728
729     //4 <2> Compose the frame body's common fixed field part of the (Re)Association Request  frame.
730     u2CapInfo = assocBuildCapabilityInfo(prAdapter, prStaRec);
731
732     /* Fill the Capability Information field. */
733     WLAN_SET_FIELD_16(&prAssocFrame->u2CapInfo, u2CapInfo);
734
735
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;
740     }
741     else {
742         DBGLOG(SAA, TRACE, ("Use default listen interval\n"));
743         u2ListenInterval = DEFAULT_LISTEN_INTERVAL;
744     }
745     prStaRec->u2ListenInterval = u2ListenInterval;
746
747     /* Fill the Listen Interval field. */
748     WLAN_SET_FIELD_16(&prAssocFrame->u2ListenInterval, u2ListenInterval);
749
750
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)) {
755
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;
759
760             COPY_MAC_ADDR(prReAssocFrame->aucCurrentAPAddr, prAisBssInfo->aucBSSID);
761         }
762         else {
763             ASSERT(0); /* We don't support ReAssociation for other network */
764         }
765
766         *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
767                          LISTEN_INTERVAL_FIELD_LEN +
768                          CURR_AP_ADDR_FIELD_LEN);
769     }
770     else {
771         *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
772                          LISTEN_INTERVAL_FIELD_LEN);
773     }
774
775     return;
776 } /* end of assocComposeReAssocReqFrame() */
777
778
779 /*----------------------------------------------------------------------------*/
780 /*!
781 * @brief This function will send the (Re)Association Request frame
782 *
783 * @param[in] prStaRec           Pointer to the STA_RECORD_T
784 *
785 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
786 * @retval WLAN_STATUS_SUCCESS   Successfully send frame to TX Module
787 */
788 /*----------------------------------------------------------------------------*/
789 WLAN_STATUS
790 assocSendReAssocReqFrame (
791     IN P_ADAPTER_T prAdapter,
792     IN P_STA_RECORD_T prStaRec
793     )
794 {
795     P_MSDU_INFO_T prMsduInfo;
796     P_BSS_INFO_T prBssInfo;
797
798     UINT_16 u2PayloadLen;
799     UINT_16 u2EstimatedFrameLen;
800     UINT_16 u2EstimatedExtraIELen;
801     BOOLEAN fgIsReAssoc;
802     UINT_32 i;
803
804
805     ASSERT(prStaRec);
806
807     //4 <1> Allocate a PKT_INFO_T for Authentication Frame
808     fgIsReAssoc = prStaRec->fgIsReAssoc;
809
810     /* Init with MGMT Header Length + Length of Fixed Fields + Common IE Length */
811     if (fgIsReAssoc) {
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));
820     }
821     else {
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));
829     }
830
831     /* + Extra IE Length */
832     u2EstimatedExtraIELen = 0;
833
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,
839                                                                     prStaRec);
840         }
841         else {
842             DBGLOG(P2P, TRACE, ("Function Linker Lost.\n"));
843             ASSERT(FALSE);
844         }
845     }
846     else {
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;
850             }
851             else {
852                 u2EstimatedExtraIELen += (UINT_16)txAssocReqIETable[i].pfnCalculateVariableIELen(prAdapter,
853                                                                                 prStaRec->ucNetTypeIndex,
854                                                                                 prStaRec);
855             }
856         }
857     }
858 #else
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;
862         }
863         else {
864             u2EstimatedExtraIELen += (UINT_16)txAssocReqIETable[i].pfnCalculateVariableIELen(prAdapter,
865                                                                             prStaRec->ucNetTypeIndex,
866                                                                             prStaRec);
867         }
868     }
869 #endif
870
871     u2EstimatedFrameLen += u2EstimatedExtraIELen;
872
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;
877     }
878
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]);
882
883
884     /* Compose Header and Fixed Field */
885     assocComposeReAssocReqFrameHeaderAndFF(prAdapter,
886             prStaRec,
887             (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
888             prBssInfo->aucOwnMacAddr,
889             &u2PayloadLen);
890
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;
903
904     //4 <4> Compose the frame body's IEs of the (Re)Association Request  frame.
905     assocBuildReAssocReqFrameCommonIEs(prAdapter, prMsduInfo);
906
907
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);
913         }
914         else {
915             DBGLOG(P2P, TRACE, ("Function Linker Lost.\n"));
916             ASSERT(FALSE);
917         }
918     }
919     else {
920         /* Append IE */
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);
924             }
925         }
926     }
927 #else
928     /* Append IE */
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);
932         }
933     }
934 #endif
935
936     //4 <6> Update the (Re)association request information
937     if (IS_STA_IN_AIS(prStaRec)) {
938         P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
939
940         prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
941
942 #if CFG_RSN_MIGRATION
943         kalUpdateReAssocReqInfo(prAdapter->prGlueInfo,
944                                 (PUINT_8)&prAssocFrame->u2CapInfo,
945                                 prMsduInfo->u2FrameLength - offsetof(WLAN_ASSOC_REQ_FRAME_T, u2CapInfo),
946                                 fgIsReAssoc);
947 #endif
948     }
949
950 #if CFG_ENABLE_WIFI_DIRECT
951     if ((prAdapter->fgIsP2PRegistered) && (IS_STA_IN_P2P(prStaRec))) {
952         P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
953
954         prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
955
956
957         kalP2PUpdateAssocInfo(
958             prAdapter->prGlueInfo,
959             (PUINT_8)&prAssocFrame->u2CapInfo,
960             prMsduInfo->u2FrameLength - offsetof(WLAN_ASSOC_REQ_FRAME_T, u2CapInfo),
961             fgIsReAssoc);
962     }
963 #endif
964
965     /* TODO(Kevin): Also release the unused tail room of the composed MMPDU */
966
967     //4 <6> Enqueue the frame to send this (Re)Association request frame.
968     nicTxEnqueueMsdu(prAdapter, prMsduInfo);
969
970     return WLAN_STATUS_SUCCESS;
971 } /* end of assocSendReAssocReqFrame() */
972
973
974 /*----------------------------------------------------------------------------*/
975 /*!
976 * @brief This function will strictly check the TX (Re)Association Request frame for
977 *        SAA event handling.
978 *
979 * @param[in] prMsduInfo         Pointer of MSDU_INFO_T
980 *
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.
983 */
984 /*----------------------------------------------------------------------------*/
985 WLAN_STATUS
986 assocCheckTxReAssocReqFrame (
987     IN P_ADAPTER_T      prAdapter,
988     IN P_MSDU_INFO_T    prMsduInfo
989     )
990 {
991     P_WLAN_ASSOC_REQ_FRAME_T prAssocReqFrame;
992     P_STA_RECORD_T prStaRec;
993     UINT_16 u2TxFrameCtrl;
994
995
996     ASSERT(prMsduInfo);
997     ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
998
999     prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T)(prMsduInfo->prPacket);
1000     ASSERT(prAssocReqFrame);
1001
1002     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1003     ASSERT(prStaRec);
1004
1005     if(!prStaRec) {
1006         return WLAN_STATUS_INVALID_PACKET;
1007     }
1008
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;
1015         }
1016     }
1017     else {
1018         if (u2TxFrameCtrl != MAC_FRAME_ASSOC_REQ) {
1019             return WLAN_STATUS_FAILURE;
1020         }
1021     }
1022
1023     return WLAN_STATUS_SUCCESS;
1024
1025 } /* end of assocCheckTxReAssocReqFrame() */
1026
1027
1028 /*----------------------------------------------------------------------------*/
1029 /*!
1030 * @brief This function will strictly check the TX (Re)Association Response frame for
1031 *        AAA event handling.
1032 *
1033 * @param[in] prMsduInfo         Pointer of MSDU_INFO_T
1034 *
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.
1037 */
1038 /*----------------------------------------------------------------------------*/
1039 WLAN_STATUS
1040 assocCheckTxReAssocRespFrame (
1041     IN P_ADAPTER_T   prAdapter,
1042     IN P_MSDU_INFO_T prMsduInfo
1043     )
1044 {
1045     P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1046     P_STA_RECORD_T prStaRec;
1047     UINT_16 u2TxFrameCtrl;
1048
1049
1050     ASSERT(prMsduInfo);
1051     ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1052
1053     prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T)(prMsduInfo->prPacket);
1054     ASSERT(prAssocRspFrame);
1055
1056     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1057     ASSERT(prStaRec);
1058
1059     if(!prStaRec) {
1060         return WLAN_STATUS_INVALID_PACKET;
1061     }
1062
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;
1069         }
1070     }
1071     else {
1072         if (u2TxFrameCtrl != MAC_FRAME_ASSOC_RSP) {
1073             return WLAN_STATUS_FAILURE;
1074         }
1075     }
1076
1077     return WLAN_STATUS_SUCCESS;
1078
1079 } /* end of assocCheckTxReAssocRespFrame() */
1080
1081
1082 /*----------------------------------------------------------------------------*/
1083 /*!
1084 * @brief This function will validate the incoming (Re)Association Frame and take out
1085 *        the status code.
1086 *
1087 * @param[in] prSwRfb                Pointer to SW RFB data structure.
1088 * @param[out] pu2StatusCode         Pointer to store the Status Code from Authentication.
1089 *
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.
1092 */
1093 /*----------------------------------------------------------------------------*/
1094 WLAN_STATUS
1095 assocCheckRxReAssocRspFrameStatus (
1096     IN P_ADAPTER_T  prAdapter,
1097     IN P_SW_RFB_T   prSwRfb,
1098     OUT PUINT_16    pu2StatusCode
1099     )
1100 {
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;
1107
1108
1109     ASSERT(prSwRfb);
1110     ASSERT(pu2StatusCode);
1111
1112     if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) < (CAP_INFO_FIELD_LEN +
1113                                     STATUS_CODE_FIELD_LEN +
1114                                     AID_FIELD_LEN)) {
1115         ASSERT(0);
1116         return WLAN_STATUS_FAILURE;
1117     }
1118
1119     DBGLOG(SAA, LOUD, ("prSwRfb->u2PayloadLength = %d\n", prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen));
1120
1121     prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1122     ASSERT(prStaRec);
1123
1124     if(!prStaRec) {
1125         return WLAN_STATUS_INVALID_PACKET;
1126     }
1127
1128     //4 <1> locate the (Re)Assocation Resp Frame.
1129     prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prSwRfb->pvHeader;
1130
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;
1138         }
1139     }
1140     else {
1141         if (u2RxFrameCtrl != MAC_FRAME_ASSOC_RSP) {
1142             return WLAN_STATUS_FAILURE;
1143         }
1144     }
1145
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
1149
1150     //WLAN_GET_FIELD_16(&prAssocRspFrame->u2StatusCode, &u2RxStatusCode);
1151     u2RxStatusCode = prAssocRspFrame->u2StatusCode; // NOTE(Kevin): Optimized for ARM
1152
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.
1157      */
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"));
1164         }
1165         else
1166 #endif
1167 #if CFG_ENABLE_WIFI_DIRECT
1168         if (prAdapter->fgIsP2PRegistered && 1) {
1169         /* Todo:: Fixed this */
1170         }
1171         else
1172 #endif
1173         {
1174         }
1175
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;
1179         }
1180 #endif
1181     }
1182
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));
1190 #endif
1191     }
1192
1193     //4 <5> Update CAP_INFO and ASSOC_ID
1194     if (u2RxStatusCode == STATUS_CODE_SUCCESSFUL) {
1195         prStaRec->u2CapInfo = u2RxCapInfo;
1196
1197         //WLAN_GET_FIELD_16(&prAssocRspFrame->u2AssocId, &u2RxAssocId);
1198         u2RxAssocId = prAssocRspFrame->u2AssocId; // NOTE(Kevin): Optimized for ARM
1199
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.
1203                 *   For AID = 2
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
1207                 */
1208         if((u2RxAssocId & BIT(6)) &&
1209            (u2RxAssocId & BIT(7)) &&
1210            !(u2RxAssocId & BITS(8, 15))) {
1211             prStaRec->u2AssocId = u2RxAssocId & ~BITS(6,7);
1212         } else {
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;
1217
1218                 prBssSpecInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
1219                 ASSERT(prBssSpecInfo);
1220
1221                 prBssSpecInfo->ucSaQueryTimedOut = 0;
1222             }
1223 #endif
1224         }
1225     }
1226
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"));
1230     }
1231     else if (u2RxStatusCode == STATUS_CODE_ASSOC_REJECTED_TEMPORARILY) {
1232         PUINT_8 pucIE, pucTime;
1233         UINT_16 u2IELength;
1234         UINT_16 u2Offset = 0;
1235
1236         u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
1237         pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
1238
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) {
1243                     UINT_32 tu;
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);
1250                     }
1251                 }
1252                 break;
1253             }
1254         } /* end of IE_FOR_EACH */
1255     }
1256 #endif
1257     *pu2StatusCode = u2RxStatusCode;
1258
1259     return WLAN_STATUS_SUCCESS;
1260
1261 } /* end of assocCheckRxReAssocRspFrameStatus() */
1262
1263
1264 /*----------------------------------------------------------------------------*/
1265 /*!
1266 * \brief This function will compose the Disassociation frame
1267 *
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
1272 *
1273 * \return (none)
1274 */
1275 /*----------------------------------------------------------------------------*/
1276 __KAL_INLINE__ VOID
1277 assocComposeDisassocFrame (
1278     IN P_STA_RECORD_T   prStaRec,
1279     IN PUINT_8          pucBuffer,
1280     IN UINT_8           aucMACAddress[],
1281     IN UINT_16          u2ReasonCode
1282     )
1283 {
1284     P_WLAN_DISASSOC_FRAME_T prDisAssocFrame;
1285     UINT_16 u2FrameCtrl;
1286
1287     ASSERT(pucBuffer);
1288     ASSERT(pucBuffer);
1289     ASSERT(aucMACAddress);
1290
1291     prDisAssocFrame = (P_WLAN_DISASSOC_FRAME_T)pucBuffer;
1292
1293     //4 <1> Compose the frame header of the DisAssociation  frame.
1294     /* Fill the Frame Control field. */
1295     u2FrameCtrl = MAC_FRAME_DISASSOC;
1296
1297     WLAN_SET_FIELD_16(&prDisAssocFrame->u2FrameCtrl, u2FrameCtrl);
1298
1299     /* Fill the DA field with Target BSSID. */
1300     COPY_MAC_ADDR(prDisAssocFrame->aucDestAddr, prStaRec->aucMacAddr);
1301
1302     /* Fill the SA field with our MAC Address. */
1303     COPY_MAC_ADDR(prDisAssocFrame->aucSrcAddr, aucMACAddress);
1304
1305     /* Fill the BSSID field with Target BSSID. */
1306     COPY_MAC_ADDR(prDisAssocFrame->aucBSSID, prStaRec->aucMacAddr);
1307
1308     /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
1309     prDisAssocFrame->u2SeqCtrl = 0;
1310
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);
1314
1315     return;
1316 } /* end of assocComposeDisassocFrame() */
1317
1318
1319 /*----------------------------------------------------------------------------*/
1320 /*!
1321 * @brief This function will send the Disassociation frame
1322 *
1323 * @param[in] prStaRec           Pointer to the STA_RECORD_T
1324 * @param[in] u2ReasonCode  The reason code of disassociation
1325 *
1326 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
1327 * @retval WLAN_STATUS_SUCCESS   Successfully send frame to TX Module
1328 */
1329 /*----------------------------------------------------------------------------*/
1330 WLAN_STATUS
1331 assocSendDisAssocFrame (
1332     IN P_ADAPTER_T    prAdapter,
1333     IN P_STA_RECORD_T prStaRec,
1334     IN UINT_16        u2ReasonCode
1335     )
1336 {
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;
1342
1343
1344     ASSERT(prStaRec);
1345
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;
1351
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;
1356     }
1357
1358     //4 <2> Compose Disassociation  frame header and fixed fields in MSDU_INfO_T.
1359     ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1360
1361     pucMacAddress = prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex].aucOwnMacAddr;
1362
1363     /* Compose Header and Fixed Field */
1364     assocComposeDisassocFrame(prStaRec,
1365                               (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
1366                               pucMacAddress,
1367                               u2ReasonCode);
1368
1369 #if CFG_SUPPORT_802_11W
1370     if (rsnCheckBipKeyInstalled(prAdapter, prStaRec)) {
1371         P_WLAN_DISASSOC_FRAME_T prDisassocFrame;
1372
1373         prDisassocFrame = (P_WLAN_DEAUTH_FRAME_T)(PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
1374
1375         prDisassocFrame->u2FrameCtrl |= MASK_FC_PROTECTED_FRAME;
1376         DBGLOG(TX, WARN, ("assocSendDisAssocFrame with protection\n"));
1377     }
1378 #endif
1379
1380     u2PayloadLen = REASON_CODE_FIELD_LEN;
1381
1382     //4 <3> Update information of MSDU_INFO_T
1383     ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1384
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;
1396
1397     //4 <4> Enqueue the frame to send this (Re)Association request frame.
1398     nicTxEnqueueMsdu(prAdapter, prMsduInfo);
1399
1400     return WLAN_STATUS_SUCCESS;
1401 } /* end of assocSendDisAssocFrame() */
1402
1403
1404 /*----------------------------------------------------------------------------*/
1405 /*!
1406 * @brief This function will parse and process the incoming Disassociation frame
1407 *        if the given BSSID is matched.
1408 *
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.
1412 *
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.
1415 */
1416 /*----------------------------------------------------------------------------*/
1417 WLAN_STATUS
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
1423     )
1424 {
1425     P_WLAN_DISASSOC_FRAME_T prDisassocFrame;
1426     UINT_16 u2RxReasonCode;
1427
1428
1429     ASSERT(prSwRfb);
1430     ASSERT(aucBSSID);
1431     ASSERT(pu2ReasonCode);
1432
1433     //4 <1> locate the Disassociation Frame.
1434     prDisassocFrame = (P_WLAN_DISASSOC_FRAME_T) prSwRfb->pvHeader;
1435
1436     //4 <2> Parse the Header of Disassociation Frame.
1437     if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) < REASON_CODE_FIELD_LEN) {
1438         ASSERT(0);
1439         return WLAN_STATUS_FAILURE;
1440     }
1441
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;
1447     }
1448
1449     //4 <3> Parse the Fixed Fields of Deauthentication Frame Body.
1450     WLAN_GET_FIELD_16(&prDisassocFrame->u2ReasonCode, &u2RxReasonCode);
1451     *pu2ReasonCode = u2RxReasonCode;
1452
1453     return WLAN_STATUS_SUCCESS;
1454
1455 } /* end of assocProcessRxDisassocFrame() */
1456
1457
1458 #if CFG_SUPPORT_AAA
1459 /*----------------------------------------------------------------------------*/
1460 /*!
1461 * @brief This function will parse and process the incoming Association Req frame
1462 *        and return a Status Code.
1463 *
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.
1467 *
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.
1470 */
1471 /*----------------------------------------------------------------------------*/
1472 WLAN_STATUS
1473 assocProcessRxAssocReqFrame (
1474     IN P_ADAPTER_T  prAdapter,
1475     IN P_SW_RFB_T   prSwRfb,
1476     OUT PUINT_16    pu2StatusCode
1477     )
1478 {
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;
1487     UINT_16 u2IELength;
1488     UINT_16 u2Offset = 0;
1489     UINT_16 u2StatusCode = STATUS_CODE_SUCCESSFUL;
1490     UINT_16 u2RxFrameCtrl;
1491     UINT_16 u2BSSBasicRateSet;
1492     BOOLEAN fgIsUnknownBssBasicRate;
1493     UINT_32 i;
1494
1495
1496     ASSERT(prAdapter);
1497     ASSERT(prSwRfb);
1498     ASSERT(pu2StatusCode);
1499
1500     prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1501
1502     if (prStaRec == NULL) {
1503         return WLAN_STATUS_FAILURE;
1504     }
1505
1506     //4 <1> locate the Association Req Frame.
1507     prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T) prSwRfb->pvHeader;
1508
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)) {
1512         ASSERT(0);
1513         return WLAN_STATUS_FAILURE;
1514     }
1515
1516     prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
1517
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 */
1521     }
1522
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;
1528
1529         u2IELength = (prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) -
1530             (UINT_16)(OFFSET_OF(WLAN_REASSOC_REQ_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN);
1531
1532         pucIEStart = pucIE = ((P_WLAN_REASSOC_REQ_FRAME_T)(prSwRfb->pvHeader))->aucInfoElem;
1533     }
1534     else {
1535         prStaRec->fgIsReAssoc = FALSE;
1536
1537         u2IELength = (prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) -
1538             (UINT_16)(OFFSET_OF(WLAN_ASSOC_REQ_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN);
1539
1540         pucIEStart = pucIE = prAssocReqFrame->aucInfoElem;
1541     }
1542
1543
1544     //4 <3> Parse the Fixed Fields of Assoc Req Frame Body.
1545     prStaRec->u2CapInfo = prAssocReqFrame->u2CapInfo;
1546
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;
1554         }
1555     }
1556 #endif
1557
1558     prStaRec->u2ListenInterval = prAssocReqFrame->u2ListenInterval;
1559     prStaRec->ucPhyTypeSet = 0;
1560
1561     /* Might be legacy client or p2p gc. */
1562     prStaRec->eStaType = STA_TYPE_LEGACY_CLIENT;
1563
1564     //4 <4> Parse the IE of Assoc Req Frame Body.
1565     IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1566         switch (IE_ID(pucIE)) {
1567         case ELEM_ID_SSID:
1568             if ((!prIeSsid) && /* NOTE(Kevin): Get SSID once */
1569                 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
1570                 prIeSsid = (P_IE_SSID_T)pucIE;
1571             }
1572             break;
1573
1574         case ELEM_ID_SUP_RATES:
1575             if ((!prIeSupportedRate) && (IE_LEN(pucIE) <= RATE_NUM)) {
1576                 prIeSupportedRate = SUP_RATES_IE(pucIE);
1577             }
1578             break;
1579
1580         case ELEM_ID_EXTENDED_SUP_RATES:
1581             if (!prIeExtSupportedRate)
1582                 prIeExtSupportedRate = EXT_SUP_RATES_IE(pucIE);
1583             break;
1584         case ELEM_ID_HT_CAP:
1585             prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HT;
1586             break;
1587         case ELEM_ID_RSN:
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;
1595                 }
1596             }
1597             #endif
1598             break;
1599         case ELEM_ID_VENDOR:
1600             #if CFG_ENABLE_WIFI_DIRECT
1601             {
1602                 if ((prAdapter->fgIsP2PRegistered)) {
1603                     UINT_8 ucOuiType = 0;
1604
1605                     p2pFuncParseCheckForP2PInfoElem(prAdapter, pucIE, &ucOuiType);
1606
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;
1610                     }
1611                 }
1612             }
1613             #endif
1614             break;
1615         default:
1616             for (i = 0; i < (sizeof(rxAssocReqIETable) / sizeof(VERIFY_IE_ENTRY_T)); i++) {
1617
1618                 if ((IE_ID(pucIE)) == rxAssocReqIETable[i].ucElemID) {
1619                     rxAssocReqIETable[i].pfnVarifyIE(prAdapter, prSwRfb, (P_IE_HDR_T)pucIE, &u2StatusCode);
1620
1621                     if (u2StatusCode != STATUS_CODE_SUCCESSFUL) {
1622                         *pu2StatusCode = u2StatusCode;
1623                         return WLAN_STATUS_SUCCESS;
1624                     }
1625                 }
1626             }
1627
1628             break;
1629         }
1630     } /* end of IE_FOR_EACH */
1631
1632     // parsing for WMM related information (2010/12/21)
1633     mqmProcessAssocReq(
1634         prAdapter,
1635         prSwRfb,
1636         pucIEStart,
1637         u2IELength);
1638
1639     do {
1640         if (prIeSsid) {
1641             if (UNEQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen,
1642                              prIeSsid->aucSSID, prIeSsid->ucLength)) {
1643
1644                 u2StatusCode = STATUS_CODE_UNSPECIFIED_FAILURE;
1645                 break;
1646             }
1647         }
1648         else {
1649             u2StatusCode = STATUS_CODE_UNSPECIFIED_FAILURE;
1650             break;
1651         }
1652
1653         prStaRec->u2OperationalRateSet = 0;
1654         prStaRec->u2BSSBasicRateSet = 0;
1655
1656         if (prIeSupportedRate || prIeExtSupportedRate) {
1657             rateGetRateSetFromIEs(prIeSupportedRate,
1658                                   prIeExtSupportedRate,
1659                                   &prStaRec->u2OperationalRateSet,
1660                                   &u2BSSBasicRateSet, /* Ignore any Basic Bit */
1661                                   &fgIsUnknownBssBasicRate);
1662
1663             if ((prBssInfo->u2BSSBasicRateSet & prStaRec->u2OperationalRateSet) !=
1664                  prBssInfo->u2BSSBasicRateSet) {
1665
1666                 u2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
1667                 break;
1668             }
1669
1670             /* Accpet the Sta, update BSSBasicRateSet from Bss */
1671
1672             prStaRec->u2BSSBasicRateSet = prBssInfo->u2BSSBasicRateSet;
1673
1674             prStaRec->u2DesiredNonHTRateSet = (prStaRec->u2OperationalRateSet & RATE_SET_ALL_ABG);
1675
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)) {
1680
1681                     if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1682                         prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_ERP;
1683                     }
1684
1685
1686                     if (!(u2BSSBasicRateSet & RATE_SET_OFDM)) {
1687                         if (prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) {
1688                             prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HR_DSSS;
1689                         }
1690
1691                     }
1692
1693                 }
1694             #else
1695                 if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1696                     prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_ERP;
1697                 }
1698                 if (prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) {
1699                     prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HR_DSSS;
1700                 }
1701             #endif
1702             }
1703             else { /* (BAND_5G == prBssDesc->eBande) */
1704             #if 0 /* Marked by CMC 20111024 */
1705                 if (!(u2BSSBasicRateSet & RATE_SET_BIT_HT_PHY)) {
1706
1707                     prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_OFDM;
1708                 }
1709                 ASSERT((prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) == 0);
1710             #else
1711                 if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1712                     prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_OFDM;
1713                 }
1714             #endif
1715             }
1716
1717         }
1718         else {
1719             ASSERT(0);
1720             u2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
1721             break;
1722         }
1723
1724 #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_HOTSPOT_PRIVACY_CHECK
1725         if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1726             if (prIeRsn) {
1727                 if (!kalP2PGetCipher(prAdapter->prGlueInfo)) {
1728                     u2StatusCode = STATUS_CODE_CIPHER_SUITE_REJECTED;
1729                     break;
1730                 }
1731             }
1732             else {
1733                 prStaRec->rSecInfo.fgAllowOnly1x = FALSE;
1734                 if (kalP2PGetCipher(prAdapter->prGlueInfo)) {
1735                     //Only Allow 1x
1736                     prStaRec->rSecInfo.fgAllowOnly1x = TRUE;
1737                     break;
1738                 }
1739             }
1740         }
1741 #endif
1742
1743     } while (FALSE);
1744
1745 #if CFG_ENABLE_WIFI_DIRECT
1746     if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1747         #if 1 /* ICS */
1748         {
1749             PUINT_8 cp = (PUINT_8)&prAssocReqFrame->u2CapInfo;
1750             if (prStaRec->fgIsReAssoc)
1751                 cp += 10;
1752             else
1753                 cp += 4;
1754             if (prStaRec->pucAssocReqIe) {
1755                                 kalMemFree(prStaRec->pucAssocReqIe, VIR_MEM_TYPE, prStaRec->u2AssocReqIeLen);
1756                                 prStaRec->pucAssocReqIe = NULL;
1757             }
1758             prStaRec->u2AssocReqIeLen = u2IELength;
1759             if (u2IELength) {
1760                 prStaRec->pucAssocReqIe = kalMemAlloc(u2IELength, VIR_MEM_TYPE);
1761                 kalMemCopy(prStaRec->pucAssocReqIe, cp, u2IELength);
1762             }
1763         }
1764         #endif
1765             kalP2PUpdateAssocInfo(prAdapter->prGlueInfo, (PUINT_8)&prAssocReqFrame->u2CapInfo, u2IELength + (prStaRec->fgIsReAssoc ? 10 : 4), prStaRec->fgIsReAssoc);
1766         }
1767 #endif
1768
1769     *pu2StatusCode = u2StatusCode;
1770
1771     return WLAN_STATUS_SUCCESS;
1772
1773 } /* end of assocProcessRxAssocReqFrame() */
1774
1775
1776 /*----------------------------------------------------------------------------*/
1777 /*!
1778 * @brief This function is used to compose Common Information Elements for Association
1779 *        Response Frame.
1780 *
1781 * @param[in] prMsduInfo     Pointer to the composed MSDU_INFO_T.
1782 * @param[in] prBssInfo      Pointer to the BSS_INFO_T.
1783 *
1784 * @return (none)
1785 */
1786 /*----------------------------------------------------------------------------*/
1787 __KAL_INLINE__ VOID
1788 assocBuildReAssocRespFrameCommonIEs (
1789     IN P_ADAPTER_T prAdapter,
1790     IN P_MSDU_INFO_T prMsduInfo,
1791     IN P_BSS_INFO_T prBssInfo
1792     )
1793 {
1794     PUINT_8 pucBuffer;
1795     P_STA_RECORD_T prStaRec;
1796     UINT_8 ucSupRatesLen;
1797     UINT_8 ucExtSupRatesLen;
1798
1799
1800     ASSERT(prMsduInfo);
1801     ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1802
1803     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1804     ASSERT(prStaRec);
1805
1806
1807     pucBuffer = (PUINT_8)((UINT_32)prMsduInfo->prPacket +
1808                           (UINT_32)prMsduInfo->u2FrameLength);
1809     ASSERT(pucBuffer);
1810
1811     if (prBssInfo->ucAllSupportedRatesLen > ELEM_MAX_LEN_SUP_RATES) {
1812
1813         ucSupRatesLen = ELEM_MAX_LEN_SUP_RATES;
1814         ucExtSupRatesLen = prBssInfo->ucAllSupportedRatesLen - ELEM_MAX_LEN_SUP_RATES;
1815     }
1816     else {
1817         ucSupRatesLen = prBssInfo->ucAllSupportedRatesLen;
1818         ucExtSupRatesLen = 0;
1819     }
1820
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,
1827                    ucSupRatesLen);
1828
1829         prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
1830         pucBuffer += IE_SIZE(pucBuffer);
1831     }
1832
1833
1834     /* Fill the Extended Supported Rates element. */
1835     if (ucExtSupRatesLen) {
1836
1837         EXT_SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_EXTENDED_SUP_RATES;
1838         EXT_SUP_RATES_IE(pucBuffer)->ucLength = ucExtSupRatesLen;
1839
1840         kalMemCopy(EXT_SUP_RATES_IE(pucBuffer)->aucExtSupportedRates,
1841                    &prBssInfo->aucAllSupportedRates[ucSupRatesLen],
1842                    ucExtSupRatesLen);
1843
1844         prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
1845     }
1846
1847     return;
1848 } /* end of assocBuildReAssocRespFrameCommonIEs() */
1849
1850
1851 /*----------------------------------------------------------------------------*/
1852 /*!
1853 * @brief This function will compose the (Re)Association Response frame
1854 *
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
1860 *
1861 * @return (none)
1862 */
1863 /*----------------------------------------------------------------------------*/
1864 __KAL_INLINE__ VOID
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
1871     )
1872 {
1873     P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1874     BOOLEAN fgIsReAssoc;
1875
1876     UINT_16 u2FrameCtrl;
1877
1878
1879     ASSERT(prStaRec);
1880     ASSERT(pucBuffer);
1881     ASSERT(aucBSSID);
1882     ASSERT(pu2PayloadLen);
1883
1884     prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T)pucBuffer;
1885     fgIsReAssoc = prStaRec->fgIsReAssoc;
1886
1887     //4 <1> Compose the frame header of the (Re)Association Request  frame.
1888     /* Fill the Frame Control field. */
1889     if (fgIsReAssoc) {
1890         u2FrameCtrl = MAC_FRAME_REASSOC_RSP;
1891     }
1892     else {
1893         u2FrameCtrl = MAC_FRAME_ASSOC_RSP;
1894     }
1895     //WLAN_SET_FIELD_16(&prAssocFrame->u2FrameCtrl, u2FrameCtrl);
1896     prAssocRspFrame->u2FrameCtrl = u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1897
1898     /* Fill the DA field with Target MAC Address. */
1899     COPY_MAC_ADDR(prAssocRspFrame->aucDestAddr, prStaRec->aucMacAddr);
1900
1901     /* Fill the SA field with current BSSID. */
1902     COPY_MAC_ADDR(prAssocRspFrame->aucSrcAddr, aucBSSID);
1903
1904     /* Fill the BSSID field with current BSSID. */
1905     COPY_MAC_ADDR(prAssocRspFrame->aucBSSID, aucBSSID);
1906
1907     /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
1908     prAssocRspFrame->u2SeqCtrl = 0;
1909
1910
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
1915
1916     //WLAN_SET_FIELD_16(&prAssocFrame->u2StatusCode, prStaRec->u2StatusCode);
1917     prAssocRspFrame->u2StatusCode = prStaRec->u2StatusCode; // NOTE(Kevin): Optimized for ARM
1918
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
1922
1923     *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
1924                       STATUS_CODE_FIELD_LEN +
1925                       AID_FIELD_LEN);
1926
1927     return;
1928 } /* end of assocComposeReAssocRespFrameHeaderAndFF() */
1929
1930
1931 /*----------------------------------------------------------------------------*/
1932 /*!
1933 * @brief This function will send the (Re)Association Resp frame
1934 *
1935 * @param[in] prStaRec           Pointer to the STA_RECORD_T
1936 *
1937 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
1938 * @retval WLAN_STATUS_SUCCESS   Successfully send frame to TX Module
1939 */
1940 /*----------------------------------------------------------------------------*/
1941 WLAN_STATUS
1942 assocSendReAssocRespFrame (
1943     IN P_ADAPTER_T      prAdapter,
1944     IN P_STA_RECORD_T   prStaRec
1945     )
1946 {
1947     P_BSS_INFO_T prBssInfo;
1948     P_MSDU_INFO_T prMsduInfo;
1949
1950     UINT_16 u2PayloadLen;
1951     UINT_16 u2EstimatedFrameLen;
1952     UINT_16 u2EstimatedExtraIELen;
1953     BOOLEAN fgIsReAssoc;
1954     UINT_32 i;
1955
1956
1957     ASSERT(prStaRec);
1958
1959
1960     //4 <1> Allocate a PKT_INFO_T for Authentication Frame
1961     fgIsReAssoc = prStaRec->fgIsReAssoc;
1962
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 + \
1968                           AID_FIELD_LEN + \
1969                           (ELEM_HDR_LEN + ELEM_MAX_LEN_SUP_RATES) + \
1970                           (ELEM_HDR_LEN + (RATE_NUM - ELEM_MAX_LEN_SUP_RATES));
1971
1972     /* + Extra IE Length */
1973     u2EstimatedExtraIELen = 0;
1974
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;
1978         }
1979         else if (txAssocRespIETable[i].pfnCalculateVariableIELen != NULL) {
1980             u2EstimatedExtraIELen += (UINT_16)txAssocRespIETable[i].pfnCalculateVariableIELen(prAdapter,
1981                                                                                                         prStaRec->ucNetTypeIndex,
1982                                                                                                         prStaRec);
1983         }
1984
1985     }
1986
1987     u2EstimatedFrameLen += u2EstimatedExtraIELen;
1988
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;
1993     }
1994
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]);
1998
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,
2004                                             &u2PayloadLen);
2005
2006     //4 <3> Update information of MSDU_INFO_T
2007     ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
2008
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;
2020
2021     //4 <4> Compose the frame body's IEs of the (Re)Association Request  frame.
2022     assocBuildReAssocRespFrameCommonIEs(prAdapter, prMsduInfo, prBssInfo);
2023
2024
2025     //4 <5> Compose IEs in MSDU_INFO_T
2026
2027     /* Append IE */
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);
2031         }
2032     }
2033
2034     /* TODO(Kevin): Also release the unused tail room of the composed MMPDU */
2035
2036     //4 <6> Enqueue the frame to send this (Re)Association request frame.
2037     nicTxEnqueueMsdu(prAdapter, prMsduInfo);
2038
2039     return WLAN_STATUS_SUCCESS;
2040
2041 } /* end of assocSendReAssocRespFrame() */
2042 #endif /* CFG_SUPPORT_AAA */
2043
2044