add rk3288 pinctrl dts code
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / mt5931_kk / drv_wlan / mgmt / assoc.c
1 /*
2 ** $Id: //Department/DaVinci/BRANCHES/MT662X_593X_WIFI_DRIVER_V2_3/mgmt/assoc.c#1 $
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 * Copyright (c) 2007 MediaTek Inc.
13 *
14 * All rights reserved. Copying, compilation, modification, distribution
15 * or any other use whatsoever of this material is strictly prohibited
16 * except in accordance with a Software License Agreement with
17 * MediaTek Inc.
18 ********************************************************************************
19 */
20
21 /*******************************************************************************
22 * LEGAL DISCLAIMER
23 *
24 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
25 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
26 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
27 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
28 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
29 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
30 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
31 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
32 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
33 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
34 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
35 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
36 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
37 *
38 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
39 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
40 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
41 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
42 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
43 *
44 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
45 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
46 * OF LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
47 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
48 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
49 * (ICC).
50 ********************************************************************************
51 */
52
53 /*\
54 ** $Log: assoc.c $
55 ** 
56 ** 08 08 2012 wh.su
57 ** [WCXRP00001262] [MT6620 Wi-Fi][Driver] Fixed the update assoc info pkt length issue
58 ** fixed the assoc request update ie length.
59 **
60 ** 07 27 2012 yuche.tsai
61 ** NULL
62 ** Fix wifi direct connection issue.
63 ** Assoc Req no P2P IE.
64  *
65  * 07 17 2012 yuche.tsai
66  * NULL
67  * Let netdev bring up.
68  *
69  * 07 17 2012 yuche.tsai
70  * NULL
71  * Compile no error before trial run.
72  *
73  * 06 13 2012 yuche.tsai
74  * NULL
75  * Update maintrunk driver.
76  * Add support for driver compose assoc request frame.
77  *
78  * 06 08 2012 cp.wu
79  * [WCXRP00001245] [MT6620 Wi-Fi][Driver][Firmware] NPS Software Development
80  * add a pair of brace for compilation success.
81  *
82  * 06 04 2012 cp.wu
83  * [WCXRP00001245] [MT6620 Wi-Fi][Driver][Firmware] NPS Software Development
84  * discussed with WH, privacy bit in associate response is not necessary to be checked, and identified as association failure when mismatching with beacon/probe response
85  *
86  * 03 14 2012 wh.su
87  * [WCXRP00001173] [MT6620 Wi-Fi][Driver] Adding the ICS Tethering WPA2-PSK supporting
88  * Add code from 2.2
89  *
90  * 03 09 2012 terry.wu
91  * NULL
92  * Fix build error.
93  *
94  * 03 02 2012 terry.wu
95  * NULL
96  * Sync CFG80211 modification from branch 2,2.
97  *
98  * 01 16 2012 yuche.tsai
99  * NULL
100  * Update Driver for wifi driect gc join IE update issue.
101  *
102  * 11 10 2011 wh.su
103  * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
104  * change the debug module level.
105  *
106  * 10 25 2011 cm.chang
107  * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
108  * Fix PhyTypeSet in STA_REC in AP mode
109  *
110  * 10 12 2011 wh.su
111  * [WCXRP00001036] [MT6620 Wi-Fi][Driver][FW] Adding the 802.11w code for MFP
112  * adding the 802.11w related function and define .
113  *
114  * 09 19 2011 yuche.tsai
115  * NULL
116  * Fix KE when enable hot-spot & any one client connect to this hot-spot.
117  *
118  * 09 14 2011 yuche.tsai
119  * NULL
120  * Add P2P IE in assoc response.
121  *
122  * 07 15 2011 terry.wu
123  * [WCXRP00000855] [MT6620 Wi-Fi] [Driver] Workaround for Kingnet 710 AP wrong AID assignment
124  * Update workaround for Kingnet AP.
125  *
126  * 07 15 2011 terry.wu
127  * [WCXRP00000855] [MT6620 Wi-Fi] [Driver] Workaround for Kingnet 710 AP wrong AID assignment
128  * Workaround for Kingnet 710 AP wrong AID assignment.
129  *
130  * 05 02 2011 eddie.chen
131  * [WCXRP00000603] [MT6620 Wi-Fi][DRV] Fix Klocwork warning[WCXRP00000672] [MT6620 Wi-Fi][FW] Fix the PS event allocation
132  * Check STA when rx assoc.
133  *
134  * 04 18 2011 terry.wu
135  * [WCXRP00000660] [MT6620 Wi-Fi][Driver] Remove flag CFG_WIFI_DIRECT_MOVED
136  * Remove flag CFG_WIFI_DIRECT_MOVED.
137  *
138  * 03 19 2011 yuche.tsai
139  * [WCXRP00000581] [Volunteer Patch][MT6620][Driver] P2P IE in Assoc Req Issue
140  * Make assoc req to append P2P IE if wifi direct is enabled.
141  *
142  * 03 17 2011 chinglan.wang
143  * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
144  * .
145  *
146  * 03 16 2011 wh.su
147  * [WCXRP00000530] [MT6620 Wi-Fi] [Driver] skip doing p2pRunEventAAAComplete after send assoc response Tx Done
148  * enable the protected while at P2P start GO, and skip some security check .
149  *
150  * 03 14 2011 wh.su
151  * [WCXRP00000545] [MT6620 Wi-Fi] [Driver] Fixed the p2p not enable, received a assoc rsp cause the rx assoc execute a null function
152  * Modify file for avoid assert at BOW recieve a assoc response frame but no p2p fucntion.
153  *
154  * 03 08 2011 terry.wu
155  * [WCXRP00000524] [MT6620 Wi-Fi][Driver] Fix p2p assoc request containing wrong IE format
156  * Fix p2p assoc request containing wrong IE format.
157  *
158  * 03 02 2011 wh.su
159  * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
160  * add code to let the beacon and probe response for Auto GO WSC .
161  *
162  * 02 15 2011 yuche.tsai
163  * [WCXRP00000431] [Volunteer Patch][MT6620][Driver] Add MLME support for deauthentication under AP(Hot-Spot) mode.
164  * Fix RX disassoc issue under Hot-spot mode.
165  *
166  * 02 09 2011 wh.su
167  * [WCXRP00000432] [MT6620 Wi-Fi][Driver] Add STA privacy check at hotspot mode
168  * adding the code for check STA privacy bit at AP mode, .
169  *
170  * 02 08 2011 eddie.chen
171  * [WCXRP00000426] [MT6620 Wi-Fi][FW/Driver] Add STA aging timeout and defualtHwRatein AP mode
172  * Add event STA agint timeout
173  *
174  * 01 25 2011 yuche.tsai
175  * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
176  * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
177  *
178  * 01 12 2011 yuche.tsai
179  * [WCXRP00000353] [Volunteer Patch][MT6620][Driver] Desired Non-HT Rate Set update when STA record is created under AP Mode.
180  * Update Phy Type Set. When legacy client is connected, it can use 11b rate,
181  * but if the P2P device is connected, 11b rate is not allowed.
182  *
183  * 01 11 2011 yuche.tsai
184  * [WCXRP00000353] [Volunteer Patch][MT6620][Driver] Desired Non-HT Rate Set update when STA record is created under AP Mode.
185  * Update Desired Non-HT Rate Set.
186  *
187  * 12 30 2010 eddie.chen
188  * [WCXRP00000322] Add WMM IE in beacon,
189
190 Add per station flow control when STA is in PS
191
192
193  * Recover the code that was coverwritted..
194  *
195  * 12 29 2010 eddie.chen
196  * [WCXRP00000322] Add WMM IE in beacon,
197 Add per station flow control when STA is in PS
198
199  * 1) PS flow control event
200  *
201  * 2) WMM IE in beacon, assoc resp, probe resp
202  *
203  * 11 04 2010 wh.su
204  * [WCXRP00000164] [MT6620 Wi-Fi][Driver] Support the p2p random SSID
205  * adding the p2p random ssid support.
206  *
207  * 10 18 2010 cp.wu
208  * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
209  * use definition macro to replace hard-coded constant
210  *
211  * 09 28 2010 wh.su
212  * NULL
213  * [WCXRP00000069][MT6620 Wi-Fi][Driver] Fix some code for phase 1 P2P Demo.
214  *
215  * 09 27 2010 chinghwa.yu
216  * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000065] Update BoW design and settings
217  * Update BCM/BoW design and settings.
218  *
219  * 09 16 2010 cm.chang
220  * NULL
221  * Change conditional compiling options for BOW
222  *
223  * 09 03 2010 kevin.huang
224  * NULL
225  * Refine #include sequence and solve recursive/nested #include issue
226  *
227  * 09 01 2010 wh.su
228  * NULL
229  * adding the wapi support for integration test.
230  *
231  * 08 30 2010 cp.wu
232  * NULL
233  * eliminate klockwork errors
234  *
235  * 08 16 2010 yuche.tsai
236  * NULL
237  * Add SSID IE in assoc req frame which is sent by P2P GC.
238  *
239  * 08 16 2010 kevin.huang
240  * NULL
241  * Refine AAA functions
242  *
243  * 08 03 2010 cp.wu
244  * NULL
245  * surpress compilation warning.
246  *
247  * 07 20 2010 wh.su
248  *
249  * adding the wapi code.
250  *
251  * 07 09 2010 yarco.yang
252  *
253  * [MT6620 and MT5931] SW Migration: Add ADDBA support
254  *
255  * 07 08 2010 cp.wu
256  *
257  * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
258  *
259  * 07 08 2010 cp.wu
260  * [WPD00003833][MT6620 and MT5931] Driver migration
261  * take use of RLM module for parsing/generating HT IEs for 11n capability
262  *
263  * 07 01 2010 cp.wu
264  * [WPD00003833][MT6620 and MT5931] Driver migration
265  * comment out RSN IE generation by CFG_RSN_MIGRATION compilation flag.
266  *
267  * 06 28 2010 cp.wu
268  * [WPD00003833][MT6620 and MT5931] Driver migration
269  * send MMPDU in basic rate.
270  *
271  * 06 21 2010 cp.wu
272  * [WPD00003833][MT6620 and MT5931] Driver migration
273  * add scan_fsm into building.
274  *
275  * 06 21 2010 cp.wu
276  * [WPD00003833][MT6620 and MT5931] Driver migration
277  * specify correct value for management frames.
278  *
279  * 06 18 2010 cm.chang
280  * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
281  * Provide cnmMgtPktAlloc() and alloc/free function of msg/buf
282  *
283  * 06 18 2010 wh.su
284  * [WPD00003840][MT6620 5931] Security migration
285  * migration from MT6620 firmware.
286  *
287  * 06 15 2010 cp.wu
288  * [WPD00003833][MT6620 and MT5931] Driver migration
289  * revised.
290  *
291  * 06 14 2010 cp.wu
292  * [WPD00003833][MT6620 and MT5931] Driver migration
293  * add management dispatching function table.
294  *
295  * 06 11 2010 cp.wu
296  * [WPD00003833][MT6620 and MT5931] Driver migration
297  * auth.c is migrated.
298  *
299  * 06 11 2010 cp.wu
300  * [WPD00003833][MT6620 and MT5931] Driver migration
301  * 1) migrate assoc.c.
302  * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
303  * 3) add configuration options for CNM_MEM and RSN modules
304  * 4) add data path for management frames
305  * 5) eliminate rPacketInfo of MSDU_INFO_T
306  *
307  * 05 24 2010 kevin.huang
308  * [BORA00000794][WIFISYS][New Feature]Power Management Support
309  * Update assocProcessRxAssocReqFrame() to avoid redundant SSID IE {0,0} for IOT.
310  *
311  * 05 14 2010 kevin.huang
312  * [BORA00000794][WIFISYS][New Feature]Power Management Support
313  * Fix compile warning - macro > 10 line, initial value of an array
314  *
315  * 04 24 2010 cm.chang
316  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
317  * g_aprBssInfo[] depends on CFG_SUPPORT_P2P and CFG_SUPPORT_BOW
318  *
319  * 04 22 2010 cm.chang
320  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
321  * First draft code to support protection in AP mode
322  *
323  * 04 19 2010 kevin.huang
324  * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
325  * Add Beacon Timeout Support
326  *  *  *  *  *  *  *  *  and will send Null frame to diagnose connection
327  *
328  * 04 16 2010 wh.su
329  * [BORA00000680][MT6620] Support the statistic for Microsoft os query
330  * adding the wpa-none for ibss beacon.
331  *
332  * 03 25 2010 cm.chang
333  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
334  * Remove compiling warning
335  *
336  * 03 24 2010 cm.chang
337  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
338  * Not carry  HT cap when being associated with b/g only AP
339  *
340  * 02 04 2010 kevin.huang
341  * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
342  * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
343  *
344  * 01 28 2010 wh.su
345  * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
346  * fixed the compiling warning.u1rwduu`wvpghlqg|rm+vp
347  *
348  * 01 27 2010 wh.su
349  * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
350  * add and fixed some security function.
351  *
352  * 01 11 2010 kevin.huang
353  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
354  * Add Deauth and Disassoc Handler
355  *
356  * 01 07 2010 kevin.huang
357  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
358  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
359  * Update Assoc ID for PS
360  *
361  * 01 04 2010 tehuang.liu
362  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
363  * For working out the first connection Chariot-verified version
364  *
365  * 12 18 2009 cm.chang
366  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
367  * .
368  *
369  * Dec 12 2009 mtk01104
370  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
371  * Use new constant definition ELEM_MAX_LEN_EXT_CAP
372  *
373  * Dec 9 2009 mtk01104
374  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
375  * Modify assoc req IE talbe for HT cap IE
376  *
377  * Dec 7 2009 mtk01461
378  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
379  * update the assocComposeReAssocReqFrameHeader() and fix the u2EstimatedFrameLen in assocSendReAssocReqFrame()
380  *
381  * Dec 7 2009 mtk01088
382  * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
383  * remove some space line
384  *
385  * Dec 7 2009 mtk01088
386  * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
387  * adding the sending disassoc frame function
388  *
389  * Dec 4 2009 mtk01088
390  * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
391  * adding the txassocReq IE table, adding for WPA/RSN
392  *
393  * Dec 3 2009 mtk01461
394  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
395  * Fix eNetType not init in send AssocReq function
396  *
397  * Dec 3 2009 mtk01461
398  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
399  * Integrate the send Assoc with TXM
400  *
401  * Dec 1 2009 mtk01088
402  * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
403  * adding the code to indicate the assoc request and assoc response (now disable)
404  *
405  * Nov 24 2009 mtk01461
406  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
407  * Remove unused variables
408  *
409  * Nov 23 2009 mtk01461
410  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
411  *
412 */
413
414 /*******************************************************************************
415 *                         C O M P I L E R   F L A G S
416 ********************************************************************************
417 */
418
419 /*******************************************************************************
420 *                    E X T E R N A L   R E F E R E N C E S
421 ********************************************************************************
422 */
423 #include "precomp.h"
424
425 /*******************************************************************************
426 *                              C O N S T A N T S
427 ********************************************************************************
428 */
429
430 /*******************************************************************************
431 *                             D A T A   T Y P E S
432 ********************************************************************************
433 */
434
435 /*******************************************************************************
436 *                            P U B L I C   D A T A
437 ********************************************************************************
438 */
439 APPEND_VAR_IE_ENTRY_T txAssocReqIETable[] = {
440     { (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_CAP),    NULL,     rlmReqGenerateHtCapIE },/* 45 */
441 #if CFG_SUPPORT_WPS2
442         { (ELEM_HDR_LEN + ELEM_MAX_LEN_WSC),   NULL,      rsnGenerateWSCIE },     /* 221 */
443 #endif
444 #if CFG_SUPPORT_WAPI
445     { (ELEM_HDR_LEN + ELEM_MAX_LEN_WAPI),   NULL,    wapiGenerateWAPIIE },   /* 68 */
446 #endif
447 #if CFG_RSN_MIGRATION
448     { (ELEM_HDR_LEN + ELEM_MAX_LEN_WPA),   NULL,        rsnGenerateWPAIE },     /* 221 */
449 #endif
450     { (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP),   NULL,    rlmReqGenerateExtCapIE },  /* 127 */
451     { (ELEM_HDR_LEN + ELEM_MAX_LEN_WMM_INFO),   NULL,   mqmGenerateWmmInfoIE },  /* 221 */
452 #if CFG_RSN_MIGRATION
453     { (ELEM_HDR_LEN + ELEM_MAX_LEN_RSN),   NULL,        rsnGenerateRSNIE },    /* 48 */
454 #endif
455 };
456
457 #if CFG_SUPPORT_AAA
458 VERIFY_IE_ENTRY_T rxAssocReqIETable[] = {
459     { ELEM_ID_RESERVED,                         NULL                    } /* 255 */
460 };
461
462
463 APPEND_VAR_IE_ENTRY_T txAssocRespIETable[] = {
464     { (ELEM_HDR_LEN + ELEM_MAX_LEN_ERP),     NULL,     rlmRspGenerateErpIE   },        /* 42 */
465     { (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_CAP),      NULL,     rlmRspGenerateHtCapIE   },      /* 45 */
466     { (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_OP),     NULL,     rlmRspGenerateHtOpIE   },       /* 61 */
467 #if CFG_ENABLE_WIFI_DIRECT
468     { (ELEM_HDR_LEN + ELEM_MAX_LEN_OBSS_SCAN),  NULL,   rlmRspGenerateObssScanIE   },   /* 74 */
469     { (0),         p2pFuncCalculateP2p_IELenForAssocRsp,      p2pFuncGenerateP2p_IEForAssocRsp }, /* 221 */
470 #if CFG_SUPPORT_WFD
471     { (0),         wfdFuncCalculateWfdIELenForAssocRsp,     wfdFuncGenerateWfdIEForAssocRsp }, /* 221 */
472 #endif
473 #endif
474     { (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP),     NULL,     rlmRspGenerateExtCapIE   },      /* 127 */
475     { (ELEM_HDR_LEN + ELEM_MAX_LEN_WMM_PARAM),     NULL,    mqmGenerateWmmParamIE }         /* 221 */
476 };
477 #endif
478
479 /*******************************************************************************
480 *                           P R I V A T E   D A T A
481 ********************************************************************************
482 */
483
484 /*******************************************************************************
485 *                                 M A C R O S
486 ********************************************************************************
487 */
488
489 /*******************************************************************************
490 *                   F U N C T I O N   D E C L A R A T I O N S
491 ********************************************************************************
492 */
493
494 /*******************************************************************************
495 *                              F U N C T I O N S
496 ********************************************************************************
497 */
498 /*----------------------------------------------------------------------------*/
499 /*!
500 * @brief This function is used to compose the Capability Info Field.
501 *
502 * @param[in] prStaRec               Pointer to the STA_RECORD_T
503 *
504 * @retval Capability Info Field
505 */
506 /*----------------------------------------------------------------------------*/
507 __KAL_INLINE__ UINT_16
508 assocBuildCapabilityInfo (
509     IN P_ADAPTER_T prAdapter,
510     IN P_STA_RECORD_T prStaRec
511     )
512 {
513     UINT_32 u4NonHTPhyType;
514     UINT_16 u2CapInfo;
515
516
517     ASSERT(prStaRec);
518
519
520     /* Set up our requested capabilities. */
521     u2CapInfo = CAP_INFO_ESS;
522     u2CapInfo |= CAP_CF_STA_NOT_POLLABLE;
523
524     if (prStaRec->u2CapInfo & CAP_INFO_PRIVACY) {
525         u2CapInfo |= CAP_INFO_PRIVACY;
526     }
527
528
529     /* 7.3.1.4 */
530     if (prStaRec->fgHasBasicPhyType) {
531         u4NonHTPhyType = prStaRec->ucNonHTBasicPhyType;
532
533         if ( (rNonHTPhyAttributes[u4NonHTPhyType].fgIsShortPreambleOptionImplemented) &&
534             ( (prAdapter->rWifiVar.ePreambleType == PREAMBLE_TYPE_SHORT) || /* Short Preamble Option Enable is TRUE */
535              ((prAdapter->rWifiVar.ePreambleType == PREAMBLE_TYPE_AUTO) &&
536               (prStaRec->u2CapInfo & CAP_INFO_SHORT_PREAMBLE)) ) ) {
537
538             /* Case I: Implemented == TRUE and Short Preamble Option Enable == TRUE.
539              * Case II: Implemented == TRUE and Short Preamble == AUTO (depends on
540              *          BSS_DESC_T's capability)
541              */
542             u2CapInfo |= CAP_INFO_SHORT_PREAMBLE;
543         }
544
545         if (rNonHTPhyAttributes[u4NonHTPhyType].fgIsShortSlotTimeOptionImplemented &&
546             prAdapter->rWifiVar.fgIsShortSlotTimeOptionEnable) {
547             u2CapInfo |= CAP_INFO_SHORT_SLOT_TIME;
548         }
549     }
550
551     DBGLOG(SAA, LOUD, ("ASSOC REQ: Compose Capability = 0x%04x for Target BSS ["MACSTR"].\n",
552         u2CapInfo, MAC2STR(prStaRec->aucMacAddr)));
553
554
555     return u2CapInfo;
556
557 } /* end of assocBuildCapabilityInfo() */
558
559
560 /*----------------------------------------------------------------------------*/
561 /*!
562 * @brief This function is used to compose Common Information Elements for Association
563 *        Request Frame.
564 *
565 * @param[in] prMsduInfo     Pointer to the composed MSDU_INFO_T.
566 *
567 * @return (none)
568 */
569 /*----------------------------------------------------------------------------*/
570 __KAL_INLINE__ VOID
571 assocBuildReAssocReqFrameCommonIEs (
572     IN P_ADAPTER_T prAdapter,
573     IN P_MSDU_INFO_T prMsduInfo
574     )
575 {
576     P_CONNECTION_SETTINGS_T prConnSettings;
577     P_STA_RECORD_T prStaRec;
578     PUINT_8 pucBuffer;
579     UINT_16 u2SupportedRateSet;
580     UINT_8 aucAllSupportedRates[RATE_NUM] = {0};
581     UINT_8 ucAllSupportedRatesLen;
582     UINT_8 ucSupRatesLen;
583     UINT_8 ucExtSupRatesLen;
584
585     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
586     ASSERT(prMsduInfo);
587     ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
588
589     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
590     ASSERT(prStaRec);
591
592     if(!prStaRec) {
593         return;
594     }
595
596     pucBuffer = (PUINT_8)((UINT_32)prMsduInfo->prPacket +
597                           (UINT_32)prMsduInfo->u2FrameLength);
598     ASSERT(pucBuffer);
599
600     if (IS_STA_IN_AIS(prStaRec)) {
601
602         /* Fill the SSID element. */
603         SSID_IE(pucBuffer)->ucId = ELEM_ID_SSID;
604
605         /* NOTE(Kevin): We copy the SSID from CONNECTION_SETTINGS for the case of
606          * Passive Scan and the target BSS didn't broadcast SSID on its Beacon Frame.
607          */
608
609         COPY_SSID(SSID_IE(pucBuffer)->aucSSID,
610                   SSID_IE(pucBuffer)->ucLength,
611                   prConnSettings->aucSSID,
612                   prConnSettings->ucSSIDLen);
613
614         prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
615         pucBuffer += IE_SIZE(pucBuffer);
616
617     }
618 #if CFG_ENABLE_WIFI_DIRECT
619     else if((prAdapter->fgIsP2PRegistered) &&
620         (IS_STA_IN_P2P(prStaRec))) {
621         pucBuffer = p2pBuildReAssocReqFrameCommonIEs(prAdapter, prMsduInfo, pucBuffer);
622     }
623 #endif
624 #if CFG_ENABLE_BT_OVER_WIFI
625     else if (IS_STA_IN_BOW(prStaRec)) {
626
627         SSID_IE(pucBuffer)->ucId = ELEM_ID_SSID;
628
629         /* NOTE(Kevin): We copy the SSID from CONNECTION_SETTINGS for the case of
630          * Passive Scan and the target BSS didn't broadcast SSID on its Beacon Frame.
631          */
632
633         COPY_SSID(SSID_IE(pucBuffer)->aucSSID,
634                   SSID_IE(pucBuffer)->ucLength,
635                   prConnSettings->aucSSID,
636                   prConnSettings->ucSSIDLen);
637
638         prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
639         pucBuffer += IE_SIZE(pucBuffer);
640     }
641 #endif
642
643     else {
644         /* TODO(Kevin): For other network */
645     }
646
647     /* NOTE(Kevin 2008/12/19): 16.3.6.3 MLME-ASSOCIATE.indication -
648      * SupportedRates - The set of data rates that are supported by the STA
649      * that is requesting association.
650      * Original(Portable Driver): Only send the Rates that we'll support.
651      * New: Send the Phy Rates if the result of following & operation == NULL.
652      */
653     //rateGetDataRatesFromRateSet((prBssDesc->u2OperationalRateSet &
654     //                             rPhyAttributes[prBssDesc->ePhyType].u2SupportedRateSet),
655
656     if (prStaRec->fgHasBasicPhyType) {
657         UINT_32 u4NonHTPhyType;
658
659
660         u4NonHTPhyType = prStaRec->ucNonHTBasicPhyType;
661
662         u2SupportedRateSet = (prStaRec->u2OperationalRateSet &
663                               rNonHTPhyAttributes[u4NonHTPhyType].u2SupportedRateSet);
664
665         ASSERT(u2SupportedRateSet);
666
667         if (!u2SupportedRateSet) {
668             u2SupportedRateSet = rNonHTPhyAttributes[u4NonHTPhyType].u2SupportedRateSet;
669         }
670
671         /* TODO(Kevin): For P2P, we shouldn't send support rate set which contains 11b rate */
672
673         rateGetDataRatesFromRateSet(u2SupportedRateSet,
674                                     0,
675                                     aucAllSupportedRates,
676                                     &ucAllSupportedRatesLen);
677
678         ucSupRatesLen = ((ucAllSupportedRatesLen > ELEM_MAX_LEN_SUP_RATES) ?
679                          ELEM_MAX_LEN_SUP_RATES : ucAllSupportedRatesLen);
680
681         ucExtSupRatesLen = ucAllSupportedRatesLen - ucSupRatesLen;
682
683
684         /* Fill the Supported Rates element. */
685         if (ucSupRatesLen) {
686             SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_SUP_RATES;
687             SUP_RATES_IE(pucBuffer)->ucLength = ucSupRatesLen;
688             kalMemCopy(SUP_RATES_IE(pucBuffer)->aucSupportedRates,
689                        aucAllSupportedRates,
690                        ucSupRatesLen);
691
692             prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
693             pucBuffer += IE_SIZE(pucBuffer);
694         }
695
696
697         /* Fill the Extended Supported Rates element. */
698         if (ucExtSupRatesLen) {
699
700             EXT_SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_EXTENDED_SUP_RATES;
701             EXT_SUP_RATES_IE(pucBuffer)->ucLength = ucExtSupRatesLen;
702
703             kalMemCopy(EXT_SUP_RATES_IE(pucBuffer)->aucExtSupportedRates,
704                        &aucAllSupportedRates[ucSupRatesLen],
705                        ucExtSupRatesLen);
706
707             prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
708             pucBuffer += IE_SIZE(pucBuffer);
709         }
710     }
711
712     return;
713 } /* end of assocBuildReAssocReqFrameCommonIEs() */
714
715
716 /*----------------------------------------------------------------------------*/
717 /*!
718 * @brief This function will compose the (Re)Association Request frame header and
719 *        its fixed fields
720 *
721 * @param[in] prStaRec               Pointer to the STA_RECORD_T
722 * @param[in] pucBuffer              Pointer to the frame buffer.
723 * @param[in] aucMACAddress          Given Our MAC Address.
724 * @param[in out] pu2PayloadLen      Return the length of the composed fixed fields
725 *
726 * @return (none)
727 */
728 /*----------------------------------------------------------------------------*/
729 __KAL_INLINE__ VOID
730 assocComposeReAssocReqFrameHeaderAndFF (
731     IN P_ADAPTER_T prAdapter,
732     IN P_STA_RECORD_T prStaRec,
733     IN PUINT_8 pucBuffer,
734     IN UINT_8 aucMACAddress[],
735     IN OUT PUINT_16 pu2PayloadLen
736     )
737 {
738     P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
739     BOOLEAN fgIsReAssoc;
740
741     UINT_16 u2FrameCtrl;
742     UINT_16 u2CapInfo;
743     UINT_16 u2ListenInterval;
744
745
746     ASSERT(prStaRec);
747     ASSERT(pucBuffer);
748     ASSERT(aucMACAddress);
749     ASSERT(pu2PayloadLen);
750
751     prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)pucBuffer;
752     fgIsReAssoc = prStaRec->fgIsReAssoc;
753
754     //4 <1> Compose the frame header of the (Re)Association Request  frame.
755     /* Fill the Frame Control field. */
756     if (fgIsReAssoc) {
757         u2FrameCtrl = MAC_FRAME_REASSOC_REQ;
758     }
759     else {
760         u2FrameCtrl = MAC_FRAME_ASSOC_REQ;
761     }
762     WLAN_SET_FIELD_16(&prAssocFrame->u2FrameCtrl, u2FrameCtrl);
763
764     /* Fill the DA field with Target BSSID. */
765     COPY_MAC_ADDR(prAssocFrame->aucDestAddr, prStaRec->aucMacAddr);
766
767     /* Fill the SA field with our MAC Address. */
768     COPY_MAC_ADDR(prAssocFrame->aucSrcAddr, aucMACAddress);
769
770     /* Fill the BSSID field with Target BSSID. */
771     COPY_MAC_ADDR(prAssocFrame->aucBSSID, prStaRec->aucMacAddr);
772
773     /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
774     prAssocFrame->u2SeqCtrl = 0;
775
776
777     //4 <2> Compose the frame body's common fixed field part of the (Re)Association Request  frame.
778     u2CapInfo = assocBuildCapabilityInfo(prAdapter, prStaRec);
779
780     /* Fill the Capability Information field. */
781     WLAN_SET_FIELD_16(&prAssocFrame->u2CapInfo, u2CapInfo);
782
783
784     /* Calculate the listen interval for the maximum power mode. Currently, we
785        set it to the value 2 times DTIM period. */
786     if (prStaRec->ucDTIMPeriod) {
787         u2ListenInterval = prStaRec->ucDTIMPeriod * DEFAULT_LISTEN_INTERVAL_BY_DTIM_PERIOD;
788     }
789     else {
790         DBGLOG(SAA, TRACE, ("Use default listen interval\n"));
791         u2ListenInterval = DEFAULT_LISTEN_INTERVAL;
792     }
793     prStaRec->u2ListenInterval = u2ListenInterval;
794
795     /* Fill the Listen Interval field. */
796     WLAN_SET_FIELD_16(&prAssocFrame->u2ListenInterval, u2ListenInterval);
797
798
799     //4 <3> Compose the Current AP Address field for ReAssociation Request  frame.
800     /* Fill the Current AP Address field. */
801     if (prStaRec->fgIsReAssoc) {
802         if (IS_STA_IN_AIS(prStaRec)) {
803
804             P_AIS_BSS_INFO_T prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
805             P_WLAN_REASSOC_REQ_FRAME_T prReAssocFrame =
806                 (P_WLAN_REASSOC_REQ_FRAME_T)prAssocFrame;
807
808             COPY_MAC_ADDR(prReAssocFrame->aucCurrentAPAddr, prAisBssInfo->aucBSSID);
809         }
810         else {
811             ASSERT(0); /* We don't support ReAssociation for other network */
812         }
813
814         *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
815                          LISTEN_INTERVAL_FIELD_LEN +
816                          CURR_AP_ADDR_FIELD_LEN);
817     }
818     else {
819         *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
820                          LISTEN_INTERVAL_FIELD_LEN);
821     }
822
823     return;
824 } /* end of assocComposeReAssocReqFrame() */
825
826
827 /*----------------------------------------------------------------------------*/
828 /*!
829 * @brief This function will send the (Re)Association Request frame
830 *
831 * @param[in] prStaRec           Pointer to the STA_RECORD_T
832 *
833 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
834 * @retval WLAN_STATUS_SUCCESS   Successfully send frame to TX Module
835 */
836 /*----------------------------------------------------------------------------*/
837 WLAN_STATUS
838 assocSendReAssocReqFrame (
839     IN P_ADAPTER_T prAdapter,
840     IN P_STA_RECORD_T prStaRec
841     )
842 {
843     P_MSDU_INFO_T prMsduInfo;
844     P_BSS_INFO_T prBssInfo;
845
846     UINT_16 u2PayloadLen;
847     UINT_16 u2EstimatedFrameLen;
848     UINT_16 u2EstimatedExtraIELen;
849     BOOLEAN fgIsReAssoc;
850     UINT_32 i;
851
852
853     ASSERT(prStaRec);
854
855     //4 <1> Allocate a PKT_INFO_T for Authentication Frame
856     fgIsReAssoc = prStaRec->fgIsReAssoc;
857
858     /* Init with MGMT Header Length + Length of Fixed Fields + Common IE Length */
859     if (fgIsReAssoc) {
860         u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
861                               WLAN_MAC_MGMT_HEADER_LEN + \
862                               CAP_INFO_FIELD_LEN + \
863                               LISTEN_INTERVAL_FIELD_LEN + \
864                               CURR_AP_ADDR_FIELD_LEN + \
865                               (ELEM_HDR_LEN + ELEM_MAX_LEN_SSID) + \
866                               (ELEM_HDR_LEN + ELEM_MAX_LEN_SUP_RATES) + \
867                               (ELEM_HDR_LEN + (RATE_NUM - ELEM_MAX_LEN_SUP_RATES));
868     }
869     else {
870         u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
871                               WLAN_MAC_MGMT_HEADER_LEN + \
872                               CAP_INFO_FIELD_LEN + \
873                               LISTEN_INTERVAL_FIELD_LEN + \
874                               (ELEM_HDR_LEN + ELEM_MAX_LEN_SSID) + \
875                               (ELEM_HDR_LEN + ELEM_MAX_LEN_SUP_RATES) + \
876                               (ELEM_HDR_LEN + (RATE_NUM - ELEM_MAX_LEN_SUP_RATES));
877     }
878
879     /* + Extra IE Length */
880     u2EstimatedExtraIELen = 0;
881
882 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211 && CFG_ENABLE_WIFI_DIRECT
883     if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_P2P_INDEX) {
884         if ((prAdapter->fgIsP2PRegistered)) {
885             u2EstimatedExtraIELen = p2pCalculate_IEForAssocReq(prAdapter,
886                                                                     prStaRec->ucNetTypeIndex,
887                                                                     prStaRec);
888         }
889         else {
890             DBGLOG(P2P, TRACE, ("Function Linker Lost.\n"));
891             ASSERT(FALSE);
892         }
893     }
894     else {
895         for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
896             if (txAssocReqIETable[i].u2EstimatedFixedIELen != 0) {
897                 u2EstimatedExtraIELen += txAssocReqIETable[i].u2EstimatedFixedIELen;
898             }
899             else {
900                 u2EstimatedExtraIELen += (UINT_16)txAssocReqIETable[i].pfnCalculateVariableIELen(prAdapter,
901                                                                                 prStaRec->ucNetTypeIndex,
902                                                                                 prStaRec);
903             }
904         }
905     }
906 #else
907     for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
908         if (txAssocReqIETable[i].u2EstimatedFixedIELen != 0) {
909             u2EstimatedExtraIELen += txAssocReqIETable[i].u2EstimatedFixedIELen;
910         }
911         else {
912             u2EstimatedExtraIELen += (UINT_16)txAssocReqIETable[i].pfnCalculateVariableIELen(prAdapter,
913                                                                             prStaRec->ucNetTypeIndex,
914                                                                             prStaRec);
915         }
916     }
917 #endif
918
919     u2EstimatedFrameLen += u2EstimatedExtraIELen;
920
921     /* Allocate a MSDU_INFO_T */
922     if ( (prMsduInfo = cnmMgtPktAlloc(prAdapter, u2EstimatedFrameLen)) == NULL) {
923         DBGLOG(SAA, WARN, ("No PKT_INFO_T for sending (Re)Assoc Request.\n"));
924         return WLAN_STATUS_RESOURCES;
925     }
926
927     //4 <2> Compose (Re)Association Request frame header and fixed fields in MSDU_INfO_T.
928     ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
929     prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
930
931
932     /* Compose Header and Fixed Field */
933     assocComposeReAssocReqFrameHeaderAndFF(prAdapter,
934             prStaRec,
935             (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
936             prBssInfo->aucOwnMacAddr,
937             &u2PayloadLen);
938
939     //4 <3> Update information of MSDU_INFO_T
940     prMsduInfo->eSrc = TX_PACKET_MGMT;
941     prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;
942     prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
943     prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
944     prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
945     prMsduInfo->fgIs802_1x = FALSE;
946     prMsduInfo->fgIs802_11 = TRUE;
947     prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
948     prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
949     prMsduInfo->pfTxDoneHandler = saaFsmRunEventTxDone;
950     prMsduInfo->fgIsBasicRate = TRUE;
951
952     //4 <4> Compose the frame body's IEs of the (Re)Association Request  frame.
953     assocBuildReAssocReqFrameCommonIEs(prAdapter, prMsduInfo);
954
955
956     //4 <5> Compose IEs in MSDU_INFO_T
957 #if CFG_ENABLE_WIFI_DIRECT_CFG_80211 && CFG_ENABLE_WIFI_DIRECT
958     if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_P2P_INDEX) {
959         if ((prAdapter->fgIsP2PRegistered)) {
960             p2pGenerate_IEForAssocReq(prAdapter, prMsduInfo);
961         }
962         else {
963             DBGLOG(P2P, TRACE, ("Function Linker Lost.\n"));
964             ASSERT(FALSE);
965         }
966     }
967     else {
968         /* Append IE */
969         for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
970             if (txAssocReqIETable[i].pfnAppendIE) {
971                 txAssocReqIETable[i].pfnAppendIE(prAdapter, prMsduInfo);
972             }
973         }
974     }
975 #else
976     /* Append IE */
977     for (i = 0; i < sizeof(txAssocReqIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
978         if (txAssocReqIETable[i].pfnAppendIE) {
979             txAssocReqIETable[i].pfnAppendIE(prAdapter, prMsduInfo);
980         }
981     }
982 #endif
983
984     //4 <6> Update the (Re)association request information
985     if (IS_STA_IN_AIS(prStaRec)) {
986         P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
987
988         prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
989
990 #if CFG_RSN_MIGRATION
991         kalUpdateReAssocReqInfo(prAdapter->prGlueInfo,
992                                 (PUINT_8)&prAssocFrame->u2CapInfo,
993                                 prMsduInfo->u2FrameLength - offsetof(WLAN_ASSOC_REQ_FRAME_T, u2CapInfo),
994                                 fgIsReAssoc);
995 #endif
996     }
997
998 #if CFG_ENABLE_WIFI_DIRECT
999     if ((prAdapter->fgIsP2PRegistered) && (IS_STA_IN_P2P(prStaRec))) {
1000         P_WLAN_ASSOC_REQ_FRAME_T prAssocFrame;
1001
1002         prAssocFrame = (P_WLAN_ASSOC_REQ_FRAME_T)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
1003
1004
1005         kalP2PUpdateAssocInfo(
1006             prAdapter->prGlueInfo,
1007             (PUINT_8)&prAssocFrame->u2CapInfo,
1008             prMsduInfo->u2FrameLength - offsetof(WLAN_ASSOC_REQ_FRAME_T, u2CapInfo),
1009             fgIsReAssoc);
1010     }
1011 #endif
1012
1013     /* TODO(Kevin): Also release the unused tail room of the composed MMPDU */
1014
1015     //4 <6> Enqueue the frame to send this (Re)Association request frame.
1016     nicTxEnqueueMsdu(prAdapter, prMsduInfo);
1017
1018     return WLAN_STATUS_SUCCESS;
1019 } /* end of assocSendReAssocReqFrame() */
1020
1021
1022 /*----------------------------------------------------------------------------*/
1023 /*!
1024 * @brief This function will strictly check the TX (Re)Association Request frame for
1025 *        SAA event handling.
1026 *
1027 * @param[in] prMsduInfo         Pointer of MSDU_INFO_T
1028 *
1029 * @retval WLAN_STATUS_FAILURE   This is not the frame we should handle at current state.
1030 * @retval WLAN_STATUS_SUCCESS   This is the frame we should handle.
1031 */
1032 /*----------------------------------------------------------------------------*/
1033 WLAN_STATUS
1034 assocCheckTxReAssocReqFrame (
1035     IN P_ADAPTER_T      prAdapter,
1036     IN P_MSDU_INFO_T    prMsduInfo
1037     )
1038 {
1039     P_WLAN_ASSOC_REQ_FRAME_T prAssocReqFrame;
1040     P_STA_RECORD_T prStaRec;
1041     UINT_16 u2TxFrameCtrl;
1042
1043
1044     ASSERT(prMsduInfo);
1045     ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1046
1047     prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T)(prMsduInfo->prPacket);
1048     ASSERT(prAssocReqFrame);
1049
1050     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1051     ASSERT(prStaRec);
1052
1053     if(!prStaRec) {
1054         return WLAN_STATUS_INVALID_PACKET;
1055     }
1056
1057     //WLAN_GET_FIELD_16(&prAssocReqFrame->u2FrameCtrl, &u2TxFrameCtrl)
1058     u2TxFrameCtrl = prAssocReqFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1059     u2TxFrameCtrl &= MASK_FRAME_TYPE;
1060     if (prStaRec->fgIsReAssoc) {
1061         if (u2TxFrameCtrl != MAC_FRAME_REASSOC_REQ) {
1062             return WLAN_STATUS_FAILURE;
1063         }
1064     }
1065     else {
1066         if (u2TxFrameCtrl != MAC_FRAME_ASSOC_REQ) {
1067             return WLAN_STATUS_FAILURE;
1068         }
1069     }
1070
1071     return WLAN_STATUS_SUCCESS;
1072
1073 } /* end of assocCheckTxReAssocReqFrame() */
1074
1075
1076 /*----------------------------------------------------------------------------*/
1077 /*!
1078 * @brief This function will strictly check the TX (Re)Association Response frame for
1079 *        AAA event handling.
1080 *
1081 * @param[in] prMsduInfo         Pointer of MSDU_INFO_T
1082 *
1083 * @retval WLAN_STATUS_FAILURE   This is not the frame we should handle at current state.
1084 * @retval WLAN_STATUS_SUCCESS   This is the frame we should handle.
1085 */
1086 /*----------------------------------------------------------------------------*/
1087 WLAN_STATUS
1088 assocCheckTxReAssocRespFrame (
1089     IN P_ADAPTER_T   prAdapter,
1090     IN P_MSDU_INFO_T prMsduInfo
1091     )
1092 {
1093     P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1094     P_STA_RECORD_T prStaRec;
1095     UINT_16 u2TxFrameCtrl;
1096
1097
1098     ASSERT(prMsduInfo);
1099     ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1100
1101     prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T)(prMsduInfo->prPacket);
1102     ASSERT(prAssocRspFrame);
1103
1104     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1105     ASSERT(prStaRec);
1106
1107     if(!prStaRec) {
1108         return WLAN_STATUS_INVALID_PACKET;
1109     }
1110
1111     //WLAN_GET_FIELD_16(&prAssocFrame->u2FrameCtrl, &u2TxFrameCtrl)
1112     u2TxFrameCtrl = prAssocRspFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1113     u2TxFrameCtrl &= MASK_FRAME_TYPE;
1114     if (prStaRec->fgIsReAssoc) {
1115         if (u2TxFrameCtrl != MAC_FRAME_REASSOC_RSP) {
1116             return WLAN_STATUS_FAILURE;
1117         }
1118     }
1119     else {
1120         if (u2TxFrameCtrl != MAC_FRAME_ASSOC_RSP) {
1121             return WLAN_STATUS_FAILURE;
1122         }
1123     }
1124
1125     return WLAN_STATUS_SUCCESS;
1126
1127 } /* end of assocCheckTxReAssocRespFrame() */
1128
1129
1130 /*----------------------------------------------------------------------------*/
1131 /*!
1132 * @brief This function will validate the incoming (Re)Association Frame and take out
1133 *        the status code.
1134 *
1135 * @param[in] prSwRfb                Pointer to SW RFB data structure.
1136 * @param[out] pu2StatusCode         Pointer to store the Status Code from Authentication.
1137 *
1138 * @retval WLAN_STATUS_FAILURE   This is not the frame we should handle at current state.
1139 * @retval WLAN_STATUS_SUCCESS   This is the frame we should handle.
1140 */
1141 /*----------------------------------------------------------------------------*/
1142 WLAN_STATUS
1143 assocCheckRxReAssocRspFrameStatus (
1144     IN P_ADAPTER_T  prAdapter,
1145     IN P_SW_RFB_T   prSwRfb,
1146     OUT PUINT_16    pu2StatusCode
1147     )
1148 {
1149     P_STA_RECORD_T prStaRec;
1150     P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1151     UINT_16 u2RxFrameCtrl;
1152     UINT_16 u2RxCapInfo;
1153     UINT_16 u2RxStatusCode;
1154     UINT_16 u2RxAssocId;
1155
1156
1157     ASSERT(prSwRfb);
1158     ASSERT(pu2StatusCode);
1159
1160     if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) < (CAP_INFO_FIELD_LEN +
1161                                     STATUS_CODE_FIELD_LEN +
1162                                     AID_FIELD_LEN)) {
1163         ASSERT(0);
1164         return WLAN_STATUS_FAILURE;
1165     }
1166
1167     DBGLOG(SAA, LOUD, ("prSwRfb->u2PayloadLength = %d\n", prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen));
1168
1169     prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1170     ASSERT(prStaRec);
1171
1172     if(!prStaRec) {
1173         return WLAN_STATUS_INVALID_PACKET;
1174     }
1175
1176     //4 <1> locate the (Re)Assocation Resp Frame.
1177     prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prSwRfb->pvHeader;
1178
1179     //4 <2> Parse the Header of (Re)Assocation Resp Frame.
1180     //WLAN_GET_FIELD_16(&prAssocRspFrame->u2FrameCtrl, &u2RxFrameCtrl);
1181     u2RxFrameCtrl = prAssocRspFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1182     u2RxFrameCtrl &= MASK_FRAME_TYPE;
1183     if (prStaRec->fgIsReAssoc) {
1184         if (u2RxFrameCtrl != MAC_FRAME_REASSOC_RSP) {
1185             return WLAN_STATUS_FAILURE;
1186         }
1187     }
1188     else {
1189         if (u2RxFrameCtrl != MAC_FRAME_ASSOC_RSP) {
1190             return WLAN_STATUS_FAILURE;
1191         }
1192     }
1193
1194     //4 <3> Parse the Fixed Fields of (Re)Assocation Resp Frame Body.
1195     //WLAN_GET_FIELD_16(&prAssocRspFrame->u2CapInfo, &u2RxCapInfo);
1196     u2RxCapInfo = prAssocRspFrame->u2CapInfo; // NOTE(Kevin): Optimized for ARM
1197
1198     //WLAN_GET_FIELD_16(&prAssocRspFrame->u2StatusCode, &u2RxStatusCode);
1199     u2RxStatusCode = prAssocRspFrame->u2StatusCode; // NOTE(Kevin): Optimized for ARM
1200
1201     //4 <4> Check CAP_INFO
1202     /* NOTE(Kevin): CM suggest to add MGMT workaround for those APs didn't check
1203      * the CAP Privacy Bit to overcome a corner case that the Privacy Bit
1204      * of our SCAN result didn't consist with AP's Association Resp.
1205      */
1206     if (u2RxStatusCode == STATUS_CODE_SUCCESSFUL) {
1207 #if CFG_SUPPORT_WAPI
1208         if (prAdapter->rWifiVar.rConnSettings.fgWapiMode) {
1209             /* WAPI AP allow the customer use WZC to join mode, the privacy bit is 0 */
1210             /* even at WAI & WAPI_PSK mode, but the assoc respose set the privacy bit set 1 */
1211             DBGLOG(SEC, TRACE, ("Workaround the WAPI AP allow the customer to use WZC to join\n"));
1212         }
1213         else
1214 #endif
1215 #if CFG_ENABLE_WIFI_DIRECT
1216         if (prAdapter->fgIsP2PRegistered && 1) {
1217         /* Todo:: Fixed this */
1218         }
1219         else
1220 #endif
1221         {
1222         }
1223
1224 #if CFG_STRICT_CHECK_CAPINFO_PRIVACY
1225         if ((prStaRec->u2CapInfo & CAP_INFO_PRIVACY) ^ (u2RxCapInfo & CAP_INFO_PRIVACY)) {
1226             u2RxStatusCode = STATUS_CODE_CAP_NOT_SUPPORTED;
1227         }
1228 #endif
1229     }
1230
1231     if (u2RxStatusCode == STATUS_CODE_SUCCESSFUL) {
1232 #if CFG_RSN_MIGRATION
1233         /* Update the information in the structure used to query and set
1234            OID_802_11_ASSOCIATION_INFORMATION. */
1235         kalUpdateReAssocRspInfo(prAdapter->prGlueInfo,
1236                                (PUINT_8)&prAssocRspFrame->u2CapInfo,
1237                                (UINT_32)(prSwRfb->u2PacketLen));
1238 #endif
1239     }
1240
1241     //4 <5> Update CAP_INFO and ASSOC_ID
1242     if (u2RxStatusCode == STATUS_CODE_SUCCESSFUL) {
1243         prStaRec->u2CapInfo = u2RxCapInfo;
1244
1245         //WLAN_GET_FIELD_16(&prAssocRspFrame->u2AssocId, &u2RxAssocId);
1246         u2RxAssocId = prAssocRspFrame->u2AssocId; // NOTE(Kevin): Optimized for ARM
1247
1248         /*  20110715 Workaround for Kingnet 710 AP (Realtek 8186)
1249                 *   This AP raises the bit 6&7 not bit 14&15 in AID field.
1250                 *   It cause wrong AID assignment.
1251                 *   For AID = 2
1252                 *     Normal case: 0xC002(1100 0000 0000 0010) => 2
1253                 *     Kingnet 710:  0x00C2(0000 0000 1100 0010) => 194
1254                 *     workaround: mask bit 6&7 for this AP
1255                 */
1256         if((u2RxAssocId & BIT(6)) &&
1257            (u2RxAssocId & BIT(7)) &&
1258            !(u2RxAssocId & BITS(8, 15))) {
1259             prStaRec->u2AssocId = u2RxAssocId & ~BITS(6,7);
1260         } else {
1261             prStaRec->u2AssocId = u2RxAssocId & ~AID_MSB;
1262 #if CFG_SUPPORT_802_11W
1263             if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX) {
1264                 P_AIS_SPECIFIC_BSS_INFO_T       prBssSpecInfo;
1265
1266                 prBssSpecInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
1267                 ASSERT(prBssSpecInfo);
1268
1269                 prBssSpecInfo->ucSaQueryTimedOut = 0;
1270             }
1271 #endif
1272         }
1273     }
1274
1275 #if CFG_SUPPORT_802_11W
1276     if (u2RxStatusCode == STATUS_CODE_AUTH_ALGORITHM_NOT_SUPPORTED){
1277         DBGLOG(SAA, INFO, ("AP rejected due the authentication algorithm not support\n"));
1278     }
1279     else if (u2RxStatusCode == STATUS_CODE_ASSOC_REJECTED_TEMPORARILY) {
1280         PUINT_8 pucIE, pucTime;
1281         UINT_16 u2IELength;
1282         UINT_16 u2Offset = 0;
1283
1284         u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
1285         pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
1286
1287         IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1288             if (ELEM_ID_TIMEOUT_INTERVAL == IE_ID(pucIE) && IE_LEN(pucIE) == 5) {
1289                 pucTime = ((P_IE_HDR_T)pucIE)->aucInfo;
1290                 if (pucTime[0] == ACTION_SA_TIMEOUT_ASSOC_COMEBACK) {
1291                     UINT_32 tu;
1292                     WLAN_GET_FIELD_32(pucTime + 1, &tu);
1293                     DBGLOG(SAA, INFO, ("AP rejected association temporarily; comeback duration %u TU "
1294                            "(%u ms)\n", tu, TU_TO_MSEC(tu)));
1295                     if (tu > TX_ASSOCIATION_RETRY_TIMEOUT_TU) {
1296                         DBGLOG(SAA, INFO, ("Update timer based on comeback duration\n"));
1297                         //ieee80211_reschedule_timer(wpa_s, ms);
1298                     }
1299                 }
1300                 break;
1301             }
1302         } /* end of IE_FOR_EACH */
1303     }
1304 #endif
1305     *pu2StatusCode = u2RxStatusCode;
1306
1307     return WLAN_STATUS_SUCCESS;
1308
1309 } /* end of assocCheckRxReAssocRspFrameStatus() */
1310
1311
1312 /*----------------------------------------------------------------------------*/
1313 /*!
1314 * \brief This function will compose the Disassociation frame
1315 *
1316 * @param[in] prStaRec               Pointer to the STA_RECORD_T
1317 * @param[in] pucBuffer              Pointer to the frame buffer.
1318 * @param[in] aucMACAddress     Given Our MAC Address.
1319 * @param[in] u2ReasonCode      The reason code of disassociation
1320 *
1321 * \return (none)
1322 */
1323 /*----------------------------------------------------------------------------*/
1324 __KAL_INLINE__ VOID
1325 assocComposeDisassocFrame (
1326     IN P_STA_RECORD_T   prStaRec,
1327     IN PUINT_8          pucBuffer,
1328     IN UINT_8           aucMACAddress[],
1329     IN UINT_16          u2ReasonCode
1330     )
1331 {
1332     P_WLAN_DISASSOC_FRAME_T prDisAssocFrame;
1333     UINT_16 u2FrameCtrl;
1334
1335     ASSERT(pucBuffer);
1336     ASSERT(pucBuffer);
1337     ASSERT(aucMACAddress);
1338
1339     prDisAssocFrame = (P_WLAN_DISASSOC_FRAME_T)pucBuffer;
1340
1341     //4 <1> Compose the frame header of the DisAssociation  frame.
1342     /* Fill the Frame Control field. */
1343     u2FrameCtrl = MAC_FRAME_DISASSOC;
1344
1345     WLAN_SET_FIELD_16(&prDisAssocFrame->u2FrameCtrl, u2FrameCtrl);
1346
1347     /* Fill the DA field with Target BSSID. */
1348     COPY_MAC_ADDR(prDisAssocFrame->aucDestAddr, prStaRec->aucMacAddr);
1349
1350     /* Fill the SA field with our MAC Address. */
1351     COPY_MAC_ADDR(prDisAssocFrame->aucSrcAddr, aucMACAddress);
1352
1353     /* Fill the BSSID field with Target BSSID. */
1354     COPY_MAC_ADDR(prDisAssocFrame->aucBSSID, prStaRec->aucMacAddr);
1355
1356     /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
1357     prDisAssocFrame->u2SeqCtrl = 0;
1358
1359     //4 <2> Compose the frame body's fixed field part of the Disassociation frame.
1360     /* Fill the Reason Code field. */
1361     WLAN_SET_FIELD_16(&prDisAssocFrame->u2ReasonCode, u2ReasonCode);
1362
1363     return;
1364 } /* end of assocComposeDisassocFrame() */
1365
1366
1367 /*----------------------------------------------------------------------------*/
1368 /*!
1369 * @brief This function will send the Disassociation frame
1370 *
1371 * @param[in] prStaRec           Pointer to the STA_RECORD_T
1372 * @param[in] u2ReasonCode  The reason code of disassociation
1373 *
1374 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
1375 * @retval WLAN_STATUS_SUCCESS   Successfully send frame to TX Module
1376 */
1377 /*----------------------------------------------------------------------------*/
1378 WLAN_STATUS
1379 assocSendDisAssocFrame (
1380     IN P_ADAPTER_T    prAdapter,
1381     IN P_STA_RECORD_T prStaRec,
1382     IN UINT_16        u2ReasonCode
1383     )
1384 {
1385     PUINT_8 pucMacAddress;
1386     P_MSDU_INFO_T prMsduInfo;
1387     UINT_16 u2PayloadLen;
1388     UINT_16 u2EstimatedFrameLen;
1389     //UINT_32 u4Status = WLAN_STATUS_SUCCESS;
1390
1391
1392     ASSERT(prStaRec);
1393
1394     //4 <1> Allocate a PKT_INFO_T for Disassociation Frame
1395     /* Init with MGMT Header Length + Length of Fixed Fields + IE Length */
1396     u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
1397                           WLAN_MAC_MGMT_HEADER_LEN + \
1398                           REASON_CODE_FIELD_LEN;
1399
1400     /* Allocate a MSDU_INFO_T */
1401     if ( (prMsduInfo = cnmMgtPktAlloc(prAdapter, u2EstimatedFrameLen)) == NULL) {
1402         DBGLOG(SAA, WARN, ("No PKT_INFO_T for sending DisAssoc.\n"));
1403         return WLAN_STATUS_RESOURCES;
1404     }
1405
1406     //4 <2> Compose Disassociation  frame header and fixed fields in MSDU_INfO_T.
1407     ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1408
1409     pucMacAddress = prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex].aucOwnMacAddr;
1410
1411     /* Compose Header and Fixed Field */
1412     assocComposeDisassocFrame(prStaRec,
1413                               (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
1414                               pucMacAddress,
1415                               u2ReasonCode);
1416
1417 #if CFG_SUPPORT_802_11W
1418     if (rsnCheckBipKeyInstalled(prAdapter, prStaRec)) {
1419         P_WLAN_DISASSOC_FRAME_T prDisassocFrame;
1420
1421         prDisassocFrame = (P_WLAN_DEAUTH_FRAME_T)(PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
1422
1423         prDisassocFrame->u2FrameCtrl |= MASK_FC_PROTECTED_FRAME;
1424         DBGLOG(TX, WARN, ("assocSendDisAssocFrame with protection\n"));
1425     }
1426 #endif
1427
1428     u2PayloadLen = REASON_CODE_FIELD_LEN;
1429
1430     //4 <3> Update information of MSDU_INFO_T
1431     ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1432
1433     prMsduInfo->eSrc = TX_PACKET_MGMT;
1434     prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;
1435     prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
1436     prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
1437     prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
1438     prMsduInfo->fgIs802_1x = FALSE;
1439     prMsduInfo->fgIs802_11 = TRUE;
1440     prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
1441     prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
1442     prMsduInfo->pfTxDoneHandler = NULL;
1443     prMsduInfo->fgIsBasicRate = TRUE;
1444
1445     //4 <4> Enqueue the frame to send this (Re)Association request frame.
1446     nicTxEnqueueMsdu(prAdapter, prMsduInfo);
1447
1448     return WLAN_STATUS_SUCCESS;
1449 } /* end of assocSendDisAssocFrame() */
1450
1451
1452 /*----------------------------------------------------------------------------*/
1453 /*!
1454 * @brief This function will parse and process the incoming Disassociation frame
1455 *        if the given BSSID is matched.
1456 *
1457 * @param[in] prSwRfb            Pointer to SW RFB data structure.
1458 * @param[in] aucBSSID           Given BSSID
1459 * @param[out] pu2ReasonCode     Pointer to store the Reason Code from Deauthentication.
1460 *
1461 * @retval WLAN_STATUS_FAILURE   This is not the frame we should handle at current state.
1462 * @retval WLAN_STATUS_SUCCESS   This is the frame we should handle.
1463 */
1464 /*----------------------------------------------------------------------------*/
1465 WLAN_STATUS
1466 assocProcessRxDisassocFrame (
1467     IN P_ADAPTER_T  prAdapter,
1468     IN P_SW_RFB_T   prSwRfb,
1469     IN UINT_8       aucBSSID[],
1470     OUT PUINT_16    pu2ReasonCode
1471     )
1472 {
1473     P_WLAN_DISASSOC_FRAME_T prDisassocFrame;
1474     UINT_16 u2RxReasonCode;
1475
1476
1477     ASSERT(prSwRfb);
1478     ASSERT(aucBSSID);
1479     ASSERT(pu2ReasonCode);
1480
1481     //4 <1> locate the Disassociation Frame.
1482     prDisassocFrame = (P_WLAN_DISASSOC_FRAME_T) prSwRfb->pvHeader;
1483
1484     //4 <2> Parse the Header of Disassociation Frame.
1485     if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) < REASON_CODE_FIELD_LEN) {
1486         ASSERT(0);
1487         return WLAN_STATUS_FAILURE;
1488     }
1489
1490     /* Check if this Disassoc Frame is coming from Target BSSID */
1491     if (UNEQUAL_MAC_ADDR(prDisassocFrame->aucBSSID, aucBSSID)) {
1492         DBGLOG(SAA, LOUD, ("Ignore Disassoc Frame from other BSS ["MACSTR"]\n",
1493             MAC2STR(prDisassocFrame->aucSrcAddr)));
1494         return WLAN_STATUS_FAILURE;
1495     }
1496
1497     //4 <3> Parse the Fixed Fields of Deauthentication Frame Body.
1498     WLAN_GET_FIELD_16(&prDisassocFrame->u2ReasonCode, &u2RxReasonCode);
1499     *pu2ReasonCode = u2RxReasonCode;
1500
1501     return WLAN_STATUS_SUCCESS;
1502
1503 } /* end of assocProcessRxDisassocFrame() */
1504
1505
1506 #if CFG_SUPPORT_AAA
1507 /*----------------------------------------------------------------------------*/
1508 /*!
1509 * @brief This function will parse and process the incoming Association Req frame
1510 *        and return a Status Code.
1511 *
1512 * @param[in] prAdapter          Pointer to the Adapter structure.
1513 * @param[in] prSwRfb            Pointer to SW RFB data structure.
1514 * @param[out] pu2StatusCode     Pointer to store the Status Code for carried in Association Response.
1515 *
1516 * @retval WLAN_STATUS_FAILURE   This is not the frame we should handle at current state.
1517 * @retval WLAN_STATUS_SUCCESS   This is the frame we should handle.
1518 */
1519 /*----------------------------------------------------------------------------*/
1520 WLAN_STATUS
1521 assocProcessRxAssocReqFrame (
1522     IN P_ADAPTER_T  prAdapter,
1523     IN P_SW_RFB_T   prSwRfb,
1524     OUT PUINT_16    pu2StatusCode
1525     )
1526 {
1527     P_WLAN_ASSOC_REQ_FRAME_T prAssocReqFrame;
1528     P_STA_RECORD_T prStaRec;
1529     P_BSS_INFO_T prBssInfo;
1530     P_IE_SSID_T prIeSsid = (P_IE_SSID_T)NULL;
1531     P_RSN_INFO_ELEM_T prIeRsn = (P_RSN_INFO_ELEM_T)NULL;
1532     P_IE_SUPPORTED_RATE_T prIeSupportedRate = (P_IE_SUPPORTED_RATE_T)NULL;
1533     P_IE_EXT_SUPPORTED_RATE_T prIeExtSupportedRate = (P_IE_EXT_SUPPORTED_RATE_T)NULL;
1534     PUINT_8 pucIE, pucIEStart;
1535     UINT_16 u2IELength;
1536     UINT_16 u2Offset = 0;
1537     UINT_16 u2StatusCode = STATUS_CODE_SUCCESSFUL;
1538     UINT_16 u2RxFrameCtrl;
1539     UINT_16 u2BSSBasicRateSet;
1540     BOOLEAN fgIsUnknownBssBasicRate;
1541     UINT_32 i;
1542     UINT_8 ucFixedFieldLength;
1543     
1544
1545     ASSERT(prAdapter);
1546     ASSERT(prSwRfb);
1547     ASSERT(pu2StatusCode);
1548
1549     prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1550
1551     if (prStaRec == NULL) {
1552         return WLAN_STATUS_FAILURE;
1553     }
1554
1555     //4 <1> locate the Association Req Frame.
1556     prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T) prSwRfb->pvHeader;
1557
1558     //WLAN_GET_FIELD_16(&prAssocReqFrame->u2FrameCtrl, &u2RxFrameCtrl);
1559     u2RxFrameCtrl = prAssocReqFrame->u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1560     u2RxFrameCtrl &= MASK_FRAME_TYPE;    
1561
1562     //4 <2> Parse the Header of Association Req Frame.
1563     if (MAC_FRAME_REASSOC_REQ == u2RxFrameCtrl) {
1564         ucFixedFieldLength = CAP_INFO_FIELD_LEN + LISTEN_INTERVAL_FIELD_LEN + CURR_AP_ADDR_FIELD_LEN;
1565     }
1566     else {
1567         ucFixedFieldLength = CAP_INFO_FIELD_LEN + LISTEN_INTERVAL_FIELD_LEN;
1568     }
1569     
1570     if ((prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) <= ucFixedFieldLength) {
1571         /* Length of this (re)association req is invalid, ignore it */
1572         return WLAN_STATUS_FAILURE;
1573     }
1574
1575     prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
1576
1577     /* Check if this Disassoc Frame is coming from Target BSSID */
1578     if (UNEQUAL_MAC_ADDR(prAssocReqFrame->aucBSSID, prBssInfo->aucBSSID)) {
1579         return WLAN_STATUS_FAILURE; /* Just Ignore this MMPDU */
1580     }
1581
1582     if (MAC_FRAME_REASSOC_REQ == u2RxFrameCtrl) {
1583         prStaRec->fgIsReAssoc = TRUE;
1584
1585         u2IELength = (prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) -
1586             (UINT_16)(OFFSET_OF(WLAN_REASSOC_REQ_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN);
1587
1588         pucIEStart = pucIE = ((P_WLAN_REASSOC_REQ_FRAME_T)(prSwRfb->pvHeader))->aucInfoElem;
1589     }
1590     else {
1591         prStaRec->fgIsReAssoc = FALSE;
1592
1593         u2IELength = (prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen) -
1594             (UINT_16)(OFFSET_OF(WLAN_ASSOC_REQ_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN);
1595
1596         pucIEStart = pucIE = prAssocReqFrame->aucInfoElem;
1597     }
1598
1599
1600     //4 <3> Parse the Fixed Fields of Assoc Req Frame Body.
1601     prStaRec->u2CapInfo = prAssocReqFrame->u2CapInfo;
1602
1603 #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_HOTSPOT_PRIVACY_CHECK
1604     if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1605         if (((prStaRec->u2CapInfo & CAP_INFO_PRIVACY) &&
1606                 !kalP2PGetCipher(prAdapter->prGlueInfo))) {
1607             u2StatusCode = STATUS_CODE_CAP_NOT_SUPPORTED;
1608             DBGLOG(RSN, TRACE, ("STA Assoc req privacy bit check fail\n"));
1609             return WLAN_STATUS_SUCCESS;
1610         }
1611     }
1612 #endif
1613
1614     prStaRec->u2ListenInterval = prAssocReqFrame->u2ListenInterval;
1615     prStaRec->ucPhyTypeSet = 0;
1616
1617     /* Might be legacy client or p2p gc. */
1618     prStaRec->eStaType = STA_TYPE_LEGACY_CLIENT;
1619
1620     //4 <4> Parse the IE of Assoc Req Frame Body.
1621     IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1622         switch (IE_ID(pucIE)) {
1623         case ELEM_ID_SSID:
1624             if ((!prIeSsid) && /* NOTE(Kevin): Get SSID once */
1625                 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
1626                 prIeSsid = (P_IE_SSID_T)pucIE;
1627             }
1628             break;
1629
1630         case ELEM_ID_SUP_RATES:
1631             if ((!prIeSupportedRate) && (IE_LEN(pucIE) <= RATE_NUM)) {
1632                 prIeSupportedRate = SUP_RATES_IE(pucIE);
1633             }
1634             break;
1635
1636         case ELEM_ID_EXTENDED_SUP_RATES:
1637             if (!prIeExtSupportedRate)
1638                 prIeExtSupportedRate = EXT_SUP_RATES_IE(pucIE);
1639             break;
1640         case ELEM_ID_HT_CAP:
1641             prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HT;          
1642                         kalMemCopy(&prStaRec->u2HtCapInfo, &(HT_CAP_IE(pucIE)->u2HtCapInfo), 2);
1643             break;
1644         case ELEM_ID_RSN:
1645             #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_HOTSPOT_PRIVACY_CHECK
1646             if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1647                 prIeRsn = RSN_IE(pucIE);
1648                 rsnParserCheckForRSNCCMPPSK(prAdapter, prIeRsn, &u2StatusCode);
1649                 if (u2StatusCode != STATUS_CODE_SUCCESSFUL) {
1650                     *pu2StatusCode = u2StatusCode;
1651                     return WLAN_STATUS_SUCCESS;
1652                 }
1653             }
1654             #endif
1655             break;
1656         case ELEM_ID_VENDOR:
1657             #if CFG_ENABLE_WIFI_DIRECT
1658             {
1659                 if ((prAdapter->fgIsP2PRegistered)) {
1660                     UINT_8 ucOuiType = 0;
1661
1662                     p2pFuncParseCheckForP2PInfoElem(prAdapter, pucIE, &ucOuiType);
1663
1664                     if (ucOuiType == VENDOR_OUI_TYPE_P2P) {
1665                         DBGLOG(P2P, TRACE, ("Target Client is a P2P group client\n"));
1666                         prStaRec->eStaType = STA_TYPE_P2P_GC;
1667                     }
1668                 }
1669             }
1670             #endif
1671             break;
1672         default:
1673             for (i = 0; i < (sizeof(rxAssocReqIETable) / sizeof(VERIFY_IE_ENTRY_T)); i++) {
1674
1675                 if (((IE_ID(pucIE)) == rxAssocReqIETable[i].ucElemID) &&
1676                      (rxAssocReqIETable[i].pfnVarifyIE != NULL)) {
1677                     rxAssocReqIETable[i].pfnVarifyIE(prAdapter, prSwRfb, (P_IE_HDR_T)pucIE, &u2StatusCode);
1678
1679                     if (u2StatusCode != STATUS_CODE_SUCCESSFUL) {
1680                         *pu2StatusCode = u2StatusCode;
1681                         return WLAN_STATUS_SUCCESS;
1682                     }
1683                 }
1684             }
1685
1686             break;
1687         }
1688     } /* end of IE_FOR_EACH */
1689
1690     // parsing for WMM related information (2010/12/21)
1691     mqmProcessAssocReq(
1692         prAdapter,
1693         prSwRfb,
1694         pucIEStart,
1695         u2IELength);
1696
1697     do {
1698         if (prIeSsid) {
1699             if (UNEQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen,
1700                              prIeSsid->aucSSID, prIeSsid->ucLength)) {
1701
1702                 u2StatusCode = STATUS_CODE_UNSPECIFIED_FAILURE;
1703                 break;
1704             }
1705         }
1706         else {
1707             u2StatusCode = STATUS_CODE_UNSPECIFIED_FAILURE;
1708             break;
1709         }
1710
1711         prStaRec->u2OperationalRateSet = 0;
1712         prStaRec->u2BSSBasicRateSet = 0;
1713
1714         if (prIeSupportedRate || prIeExtSupportedRate) {
1715             rateGetRateSetFromIEs(prIeSupportedRate,
1716                                   prIeExtSupportedRate,
1717                                   &prStaRec->u2OperationalRateSet,
1718                                   &u2BSSBasicRateSet, /* Ignore any Basic Bit */
1719                                   &fgIsUnknownBssBasicRate);
1720
1721             if ((prBssInfo->u2BSSBasicRateSet & prStaRec->u2OperationalRateSet) !=
1722                  prBssInfo->u2BSSBasicRateSet) {
1723
1724                 u2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
1725                 break;
1726             }
1727
1728             /* Accpet the Sta, update BSSBasicRateSet from Bss */
1729
1730             prStaRec->u2BSSBasicRateSet = prBssInfo->u2BSSBasicRateSet;
1731
1732             prStaRec->u2DesiredNonHTRateSet = (prStaRec->u2OperationalRateSet & RATE_SET_ALL_ABG);
1733
1734             if (BAND_2G4 == HIF_RX_HDR_GET_RF_BAND(prSwRfb->prHifRxHdr)) {
1735             #if 0 /* Marked by CMC 20111024 */
1736                 /* check if support 11n */
1737                 if (!(u2BSSBasicRateSet & RATE_SET_BIT_HT_PHY)) {
1738
1739                     if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1740                         prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_ERP;
1741                     }
1742
1743
1744                     if (!(u2BSSBasicRateSet & RATE_SET_OFDM)) {
1745                         if (prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) {
1746                             prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HR_DSSS;
1747                         }
1748
1749                     }
1750
1751                 }
1752             #else
1753                 if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1754                     prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_ERP;
1755                 }
1756                 if (prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) {
1757                     prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_HR_DSSS;
1758                 }
1759             #endif
1760             }
1761             else { /* (BAND_5G == prBssDesc->eBande) */
1762             #if 0 /* Marked by CMC 20111024 */
1763                 if (!(u2BSSBasicRateSet & RATE_SET_BIT_HT_PHY)) {
1764
1765                     prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_OFDM;
1766                 }
1767                 ASSERT((prStaRec->u2OperationalRateSet & RATE_SET_HR_DSSS) == 0);
1768             #else
1769                 if (prStaRec->u2OperationalRateSet & RATE_SET_OFDM) {
1770                     prStaRec->ucPhyTypeSet |= PHY_TYPE_BIT_OFDM;
1771                 }
1772             #endif
1773             }
1774
1775         }
1776         else {
1777             ASSERT(0);
1778             u2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
1779             break;
1780         }
1781
1782 #if CFG_ENABLE_WIFI_DIRECT && CFG_ENABLE_HOTSPOT_PRIVACY_CHECK
1783         if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1784             if (prIeRsn) {
1785                 if (!kalP2PGetCipher(prAdapter->prGlueInfo)) {
1786                     u2StatusCode = STATUS_CODE_CIPHER_SUITE_REJECTED;
1787                     break;
1788                 }
1789             }
1790             else {
1791                 prStaRec->rSecInfo.fgAllowOnly1x = FALSE;
1792                 if (kalP2PGetCipher(prAdapter->prGlueInfo)) {
1793                     //Only Allow 1x
1794                     prStaRec->rSecInfo.fgAllowOnly1x = TRUE;
1795                     break;
1796                 }
1797             }
1798         }
1799 #endif
1800
1801     } while (FALSE);
1802
1803 #if CFG_ENABLE_WIFI_DIRECT
1804     if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1805         #if 1 /* ICS */
1806         {
1807             PUINT_8 cp = (PUINT_8)&prAssocReqFrame->u2CapInfo;
1808             if (prStaRec->fgIsReAssoc)
1809                 cp += 10;
1810             else
1811                 cp += 4;
1812             if (prStaRec->pucAssocReqIe) {
1813                                 kalMemFree(prStaRec->pucAssocReqIe, VIR_MEM_TYPE, prStaRec->u2AssocReqIeLen);
1814                                 prStaRec->pucAssocReqIe = NULL;
1815             }
1816             prStaRec->u2AssocReqIeLen = u2IELength;
1817             if (u2IELength) {
1818                 prStaRec->pucAssocReqIe = kalMemAlloc(u2IELength, VIR_MEM_TYPE);
1819                 kalMemCopy(prStaRec->pucAssocReqIe, cp, u2IELength);
1820             }
1821         }
1822         #endif
1823             kalP2PUpdateAssocInfo(prAdapter->prGlueInfo, (PUINT_8)&prAssocReqFrame->u2CapInfo, u2IELength + (prStaRec->fgIsReAssoc ? 10 : 4), prStaRec->fgIsReAssoc);
1824         }
1825 #endif
1826
1827     *pu2StatusCode = u2StatusCode;
1828
1829     return WLAN_STATUS_SUCCESS;
1830
1831 } /* end of assocProcessRxAssocReqFrame() */
1832
1833
1834 /*----------------------------------------------------------------------------*/
1835 /*!
1836 * @brief This function is used to compose Common Information Elements for Association
1837 *        Response Frame.
1838 *
1839 * @param[in] prMsduInfo     Pointer to the composed MSDU_INFO_T.
1840 * @param[in] prBssInfo      Pointer to the BSS_INFO_T.
1841 *
1842 * @return (none)
1843 */
1844 /*----------------------------------------------------------------------------*/
1845 __KAL_INLINE__ VOID
1846 assocBuildReAssocRespFrameCommonIEs (
1847     IN P_ADAPTER_T prAdapter,
1848     IN P_MSDU_INFO_T prMsduInfo,
1849     IN P_BSS_INFO_T prBssInfo
1850     )
1851 {
1852     PUINT_8 pucBuffer;
1853     P_STA_RECORD_T prStaRec;
1854     UINT_8 ucSupRatesLen;
1855     UINT_8 ucExtSupRatesLen;
1856
1857
1858     ASSERT(prMsduInfo);
1859     ASSERT(prMsduInfo->eSrc == TX_PACKET_MGMT);
1860
1861     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
1862     ASSERT(prStaRec);
1863
1864
1865     pucBuffer = (PUINT_8)((UINT_32)prMsduInfo->prPacket +
1866                           (UINT_32)prMsduInfo->u2FrameLength);
1867     ASSERT(pucBuffer);
1868
1869     if (prBssInfo->ucAllSupportedRatesLen > ELEM_MAX_LEN_SUP_RATES) {
1870
1871         ucSupRatesLen = ELEM_MAX_LEN_SUP_RATES;
1872         ucExtSupRatesLen = prBssInfo->ucAllSupportedRatesLen - ELEM_MAX_LEN_SUP_RATES;
1873     }
1874     else {
1875         ucSupRatesLen = prBssInfo->ucAllSupportedRatesLen;
1876         ucExtSupRatesLen = 0;
1877     }
1878
1879     /* Fill the Supported Rates element. */
1880     if (ucSupRatesLen) {
1881         SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_SUP_RATES;
1882         SUP_RATES_IE(pucBuffer)->ucLength = ucSupRatesLen;
1883         kalMemCopy(SUP_RATES_IE(pucBuffer)->aucSupportedRates,
1884                    prBssInfo->aucAllSupportedRates,
1885                    ucSupRatesLen);
1886
1887         prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
1888         pucBuffer += IE_SIZE(pucBuffer);
1889     }
1890
1891
1892     /* Fill the Extended Supported Rates element. */
1893     if (ucExtSupRatesLen) {
1894
1895         EXT_SUP_RATES_IE(pucBuffer)->ucId = ELEM_ID_EXTENDED_SUP_RATES;
1896         EXT_SUP_RATES_IE(pucBuffer)->ucLength = ucExtSupRatesLen;
1897
1898         kalMemCopy(EXT_SUP_RATES_IE(pucBuffer)->aucExtSupportedRates,
1899                    &prBssInfo->aucAllSupportedRates[ucSupRatesLen],
1900                    ucExtSupRatesLen);
1901
1902         prMsduInfo->u2FrameLength += IE_SIZE(pucBuffer);
1903     }
1904
1905     return;
1906 } /* end of assocBuildReAssocRespFrameCommonIEs() */
1907
1908
1909 /*----------------------------------------------------------------------------*/
1910 /*!
1911 * @brief This function will compose the (Re)Association Response frame
1912 *
1913 * @param[in] prStaRec               Pointer to the STA_RECORD_T
1914 * @param[in] pucBuffer              Pointer to the frame buffer.
1915 * @param[in] aucBssid               Given BSSID.
1916 * @param[in] u2CapInfo              Capability Field of current BSS.
1917 * @param[in out] pu2PayloadLen      Return the length of the composed fixed fields
1918 *
1919 * @return (none)
1920 */
1921 /*----------------------------------------------------------------------------*/
1922 __KAL_INLINE__ VOID
1923 assocComposeReAssocRespFrameHeaderAndFF (
1924     IN P_STA_RECORD_T prStaRec,
1925     IN PUINT_8 pucBuffer,
1926     IN UINT_8 aucBSSID[],
1927     IN UINT_16 u2CapInfo,
1928     IN OUT PUINT_16 pu2PayloadLen
1929     )
1930 {
1931     P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
1932     BOOLEAN fgIsReAssoc;
1933
1934     UINT_16 u2FrameCtrl;
1935
1936
1937     ASSERT(prStaRec);
1938     ASSERT(pucBuffer);
1939     ASSERT(aucBSSID);
1940     ASSERT(pu2PayloadLen);
1941
1942     prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T)pucBuffer;
1943     fgIsReAssoc = prStaRec->fgIsReAssoc;
1944
1945     //4 <1> Compose the frame header of the (Re)Association Request  frame.
1946     /* Fill the Frame Control field. */
1947     if (fgIsReAssoc) {
1948         u2FrameCtrl = MAC_FRAME_REASSOC_RSP;
1949     }
1950     else {
1951         u2FrameCtrl = MAC_FRAME_ASSOC_RSP;
1952     }
1953     //WLAN_SET_FIELD_16(&prAssocFrame->u2FrameCtrl, u2FrameCtrl);
1954     prAssocRspFrame->u2FrameCtrl = u2FrameCtrl; // NOTE(Kevin): Optimized for ARM
1955
1956     /* Fill the DA field with Target MAC Address. */
1957     COPY_MAC_ADDR(prAssocRspFrame->aucDestAddr, prStaRec->aucMacAddr);
1958
1959     /* Fill the SA field with current BSSID. */
1960     COPY_MAC_ADDR(prAssocRspFrame->aucSrcAddr, aucBSSID);
1961
1962     /* Fill the BSSID field with current BSSID. */
1963     COPY_MAC_ADDR(prAssocRspFrame->aucBSSID, aucBSSID);
1964
1965     /* Clear the SEQ/FRAG_NO field(HW won't overide the FRAG_NO, so we need to clear it). */
1966     prAssocRspFrame->u2SeqCtrl = 0;
1967
1968
1969     //4 <2> Compose the frame body's common fixed field part of the (Re)Association Request  frame.
1970     /* Fill the Capability Information field. */
1971     //WLAN_SET_FIELD_16(&prAssocFrame->u2CapInfo, u2CapInfo);
1972     prAssocRspFrame->u2CapInfo = u2CapInfo; // NOTE(Kevin): Optimized for ARM
1973
1974     //WLAN_SET_FIELD_16(&prAssocFrame->u2StatusCode, prStaRec->u2StatusCode);
1975     prAssocRspFrame->u2StatusCode = prStaRec->u2StatusCode; // NOTE(Kevin): Optimized for ARM
1976
1977     //WLAN_SET_FIELD_16(&prAssocFrame->u2AssocId, ((prStaRec->u2AssocId & AID_MASK) | AID_MSB));
1978     prAssocRspFrame->u2AssocId =
1979         ((prStaRec->u2AssocId & AID_MASK) | AID_MSB); // NOTE(Kevin): Optimized for ARM
1980
1981     *pu2PayloadLen = (CAP_INFO_FIELD_LEN +
1982                       STATUS_CODE_FIELD_LEN +
1983                       AID_FIELD_LEN);
1984
1985     return;
1986 } /* end of assocComposeReAssocRespFrameHeaderAndFF() */
1987
1988
1989 /*----------------------------------------------------------------------------*/
1990 /*!
1991 * @brief This function will send the (Re)Association Resp frame
1992 *
1993 * @param[in] prStaRec           Pointer to the STA_RECORD_T
1994 *
1995 * @retval WLAN_STATUS_RESOURCES No available resource for frame composing.
1996 * @retval WLAN_STATUS_SUCCESS   Successfully send frame to TX Module
1997 */
1998 /*----------------------------------------------------------------------------*/
1999 WLAN_STATUS
2000 assocSendReAssocRespFrame (
2001     IN P_ADAPTER_T      prAdapter,
2002     IN P_STA_RECORD_T   prStaRec
2003     )
2004 {
2005     P_BSS_INFO_T prBssInfo;
2006     P_MSDU_INFO_T prMsduInfo;
2007
2008     UINT_16 u2PayloadLen;
2009     UINT_16 u2EstimatedFrameLen;
2010     UINT_16 u2EstimatedExtraIELen;
2011     BOOLEAN fgIsReAssoc;
2012     UINT_32 i;
2013
2014
2015     ASSERT(prStaRec);
2016
2017
2018     //4 <1> Allocate a PKT_INFO_T for Authentication Frame
2019     fgIsReAssoc = prStaRec->fgIsReAssoc;
2020
2021     /* Init with MGMT Header Length + Length of Fixed Fields + Common IE Length */
2022     u2EstimatedFrameLen = MAC_TX_RESERVED_FIELD + \
2023                           WLAN_MAC_MGMT_HEADER_LEN + \
2024                           CAP_INFO_FIELD_LEN + \
2025                           STATUS_CODE_FIELD_LEN + \
2026                           AID_FIELD_LEN + \
2027                           (ELEM_HDR_LEN + ELEM_MAX_LEN_SUP_RATES) + \
2028                           (ELEM_HDR_LEN + (RATE_NUM - ELEM_MAX_LEN_SUP_RATES));
2029
2030     /* + Extra IE Length */
2031     u2EstimatedExtraIELen = 0;
2032
2033     for (i = 0; i < sizeof(txAssocRespIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
2034         if (txAssocRespIETable[i].u2EstimatedFixedIELen != 0) {
2035             u2EstimatedExtraIELen += txAssocRespIETable[i].u2EstimatedFixedIELen;
2036         }
2037         else if (txAssocRespIETable[i].pfnCalculateVariableIELen != NULL) {
2038             u2EstimatedExtraIELen += (UINT_16)txAssocRespIETable[i].pfnCalculateVariableIELen(prAdapter,
2039                                                                                                         prStaRec->ucNetTypeIndex,
2040                                                                                                         prStaRec);
2041         }
2042
2043     }
2044
2045     u2EstimatedFrameLen += u2EstimatedExtraIELen;
2046
2047     /* Allocate a MSDU_INFO_T */
2048     if ( (prMsduInfo = cnmMgtPktAlloc(prAdapter, u2EstimatedFrameLen)) == NULL) {
2049         DBGLOG(AAA, WARN, ("No PKT_INFO_T for sending (Re)Assoc Response.\n"));
2050         return WLAN_STATUS_RESOURCES;
2051     }
2052
2053     //4 <2> Compose (Re)Association Request frame header and fixed fields in MSDU_INfO_T.
2054     ASSERT(prStaRec->ucNetTypeIndex != NETWORK_TYPE_AIS_INDEX);
2055     prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
2056
2057     /* Compose Header and Fixed Field */
2058     assocComposeReAssocRespFrameHeaderAndFF(prStaRec,
2059                                             (PUINT_8)((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
2060                                             prBssInfo->aucBSSID,
2061                                             prBssInfo->u2CapInfo,
2062                                             &u2PayloadLen);
2063
2064     //4 <3> Update information of MSDU_INFO_T
2065     ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
2066
2067     prMsduInfo->eSrc = TX_PACKET_MGMT;
2068     prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;
2069     prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
2070     prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
2071     prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
2072     prMsduInfo->fgIs802_1x = FALSE;
2073     prMsduInfo->fgIs802_11 = TRUE;
2074     prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
2075     prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
2076     prMsduInfo->pfTxDoneHandler = aaaFsmRunEventTxDone;
2077     prMsduInfo->fgIsBasicRate = TRUE;
2078
2079     //4 <4> Compose the frame body's IEs of the (Re)Association Request  frame.
2080     assocBuildReAssocRespFrameCommonIEs(prAdapter, prMsduInfo, prBssInfo);
2081
2082
2083     //4 <5> Compose IEs in MSDU_INFO_T
2084
2085     /* Append IE */
2086     for (i = 0; i < sizeof(txAssocRespIETable)/sizeof(APPEND_VAR_IE_ENTRY_T); i++) {
2087         if (txAssocRespIETable[i].pfnAppendIE) {
2088             txAssocRespIETable[i].pfnAppendIE(prAdapter, prMsduInfo);
2089         }
2090     }
2091
2092     /* TODO(Kevin): Also release the unused tail room of the composed MMPDU */
2093
2094     //4 <6> Enqueue the frame to send this (Re)Association request frame.
2095     nicTxEnqueueMsdu(prAdapter, prMsduInfo);
2096
2097     return WLAN_STATUS_SUCCESS;
2098
2099 } /* end of assocSendReAssocRespFrame() */
2100 #endif /* CFG_SUPPORT_AAA */
2101
2102