2 ** $Id: //Department/DaVinci/BRANCHES/MT662X_593X_WIFI_DRIVER_V2_3/mgmt/rlm.c#1 $
10 /*******************************************************************************
11 * Copyright (c) 2009 MediaTek Inc.
13 * All rights reserved. Copying, compilation, modification, distribution
14 * or any other use whatsoever of this material is strictly prohibited
15 * except in accordance with a Software License Agreement with
17 ********************************************************************************
20 /*******************************************************************************
23 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
24 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
25 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
26 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
27 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
28 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
29 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
30 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
31 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
32 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
33 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
34 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
35 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
37 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
38 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
39 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
40 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
41 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
43 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
44 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
45 * OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
46 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
47 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
49 ********************************************************************************
55 * 07 17 2012 yuche.tsai
57 * Compile no error before trial run.
61 * Check length HT cap IE about RX associate request frame
65 * Modify debug message for XLOG
69 * Add RLM and CNM debug message for XLOG
72 * [WCXRP00000997] [MT6620 Wi-Fi][Driver][FW] Handle change of BSS preamble type and slot time
73 * Fix preamble type of STA mode
76 * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
77 * Not send ERP IE if peer STA is 802.11b-only
80 * [WCXRP00001031] [All Wi-Fi][Driver] Check HT IE length to avoid wrong SCO parameter
81 * Ignore HT OP IE if its length field is not valid
85 * Add length check to reduce possibility to adopt wrong IE
88 * [WCXRP00000997] [MT6620 Wi-Fi][Driver][FW] Handle change of BSS preamble type and slot time
89 * Handle client mode about preamble type and slot time
92 * [WCXRP00000971] [MT6620 Wi-Fi][Driver][FW] Not set Beacon timeout interval when CPTT
93 * Final channel number only adopts the field from assoc response
96 * [WCXRP00000773] [MT6620 Wi-Fi][Driver] Workaround some AP fill primary channel field with its secondary channel
97 * If DS IE exists, ignore the primary channel field in HT OP IE
100 * [WCXRP00000691] [MT6620 Wi-Fi][Driver] Workaround about AP's wrong HT capability IE to have wrong channel number
101 * Fix compiling error
103 * 05 02 2011 cm.chang
104 * [WCXRP00000691] [MT6620 Wi-Fi][Driver] Workaround about AP's wrong HT capability IE to have wrong channel number
105 * Refine range of valid channel number
107 * 05 02 2011 cm.chang
108 * [WCXRP00000691] [MT6620 Wi-Fi][Driver] Workaround about AP's wrong HT capability IE to have wrong channel number
109 * Check if channel is valided before record ing BSS channel
111 * 04 14 2011 cm.chang
112 * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
115 * 04 12 2011 cm.chang
116 * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
119 * 03 29 2011 cm.chang
120 * [WCXRP00000606] [MT6620 Wi-Fi][Driver][FW] Fix klocwork warning
123 * 01 24 2011 cm.chang
124 * [WCXRP00000384] [MT6620 Wi-Fi][Driver][FW] Handle 20/40 action frame in AP mode and stop ampdu timer when sta_rec is freed
125 * Process received 20/40 coexistence action frame for AP mode
128 * [WCXRP00000260] [MT6620 Wi-Fi][Driver][Firmware] Create V1.1 branch for both firmware and driver
129 * create branch for Wi-Fi driver v1.1
131 * 12 07 2010 cm.chang
132 * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
133 * 1. BSSINFO include RLM parameter
134 * 2. free all sta records when network is disconnected
136 * 12 07 2010 cm.chang
137 * [WCXRP00000238] MT6620 Wi-Fi][Driver][FW] Support regulation domain setting from NVRAM and supplicant
138 * 1. Country code is from NVRAM or supplicant
139 * 2. Change band definition in CMD/EVENT.
141 * 10 15 2010 cm.chang
142 * [WCXRP00000094] [MT6620 Wi-Fi][Driver] Connect to 2.4GHz AP, Driver crash.
143 * Add exception handle when no mgmt buffer in free build
145 * 10 08 2010 cm.chang
147 * When 20M only setting, ignore OBSS IE
149 * 09 16 2010 cm.chang
151 * Change conditional compiling options for BOW
153 * 09 10 2010 cm.chang
155 * Always update Beacon content if FW sync OBSS info
157 * 09 03 2010 kevin.huang
159 * Refine #include sequence and solve recursive/nested #include issue
161 * 08 24 2010 cm.chang
163 * Support RLM initail channel of Ad-hoc, P2P and BOW
167 * revise constant definitions to be matched with implementation (original cmd-event definition is deprecated)
169 * 08 23 2010 chinghwa.yu
171 * Temporary add rlmUpdateParamByStaForBow() and rlmBssInitForBow().
173 * 08 23 2010 chinghwa.yu
175 * Add CFG_ENABLE_BT_OVER_WIFI.
177 * 08 23 2010 chinghwa.yu
181 * 08 20 2010 cm.chang
183 * Migrate RLM code to host from FW
185 * 08 02 2010 yuche.tsai
187 * P2P Group Negotiation Code Check in.
189 * 07 26 2010 yuche.tsai
191 * Fix compile error while enabling WiFi Direct function.
193 * 07 21 2010 yuche.tsai
195 * Add P2P Scan & Scan Result Parsing & Saving.
197 * 07 19 2010 cm.chang
199 * Set RLM parameters and enable CNM channel manager
203 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
206 * [WPD00003833][MT6620 and MT5931] Driver migration
207 * take use of RLM module for parsing/generating HT IEs for 11n capability
209 * 07 08 2010 cm.chang
210 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
211 * Check draft RLM code for HT cap
213 * 06 05 2010 cm.chang
214 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
215 * Fix channel ID definition in RFB status to primary channel instead of center channel
217 * 06 02 2010 cm.chang
218 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
219 * Add TX short GI compiling option
221 * 06 02 2010 chinghwa.yu
222 * [BORA00000563]Add WiFi CoEx BCM module
223 * Roll back to remove CFG_SUPPORT_BCM_TEST.
225 * 06 01 2010 chinghwa.yu
226 * [BORA00000563]Add WiFi CoEx BCM module
227 * Update BCM Test and RW configuration.
229 * 05 31 2010 cm.chang
230 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
231 * Add some compiling options to control 11n functions
233 * 05 28 2010 cm.chang
234 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
235 * Set RTS threshold of 2K bytes initially
237 * 05 18 2010 cm.chang
238 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
239 * Ad-hoc Beacon should not carry HT OP and OBSS IEs
241 * 05 07 2010 cm.chang
242 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
243 * Process 20/40 coexistence public action frame in AP mode
245 * 05 05 2010 cm.chang
246 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
247 * First draft support for 20/40M bandwidth for AP mode
249 * 04 24 2010 cm.chang
250 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
251 * g_aprBssInfo[] depends on CFG_SUPPORT_P2P and CFG_SUPPORT_BOW
253 * 04 22 2010 cm.chang
254 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
255 * First draft code to support protection in AP mode
257 * 04 13 2010 cm.chang
258 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
259 * Utilize status of swRfb to know channel number and band
261 * 04 07 2010 cm.chang
262 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
263 * Different invoking order for WTBL entry of associated AP
265 * 04 07 2010 cm.chang
266 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
267 * Add virtual test for OBSS scan
269 * 04 02 2010 cm.chang
270 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
271 * Process Beacon only ready for infra STA now
273 * 03 30 2010 cm.chang
274 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
275 * Support 2.4G OBSS scan
277 * 03 24 2010 cm.chang
278 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
279 * Not carry HT cap when being associated with b/g only AP
282 * [BORA00000605][WIFISYS] Phase3 Integration
283 * fixed some WHQL testing error.
285 * 03 15 2010 cm.chang
286 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
287 * Provide draft measurement and quiet functions
289 * 03 09 2010 cm.chang
290 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
291 * If bss is not 11n network, zero WTBL HT parameters
293 * 03 03 2010 cm.chang
294 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
295 * To support CFG_SUPPORT_BCM_STP
297 * 03 02 2010 cm.chang
298 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
299 * Generate HT IE only depending on own phyTypeSet
301 * 03 02 2010 cm.chang
302 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
303 * Not fill HT related IE if BssInfo does not include 11n phySet
305 * 03 01 2010 tehuang.liu
306 * [BORA00000569][WIFISYS] Phase 2 Integration Test
307 * To store field AMPDU Parameters in STA_REC
309 * 02 26 2010 cm.chang
310 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
311 * Enable RDG RX, but disable RDG TX for IOT and LongNAV
313 * 02 12 2010 cm.chang
314 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
315 * Use bss info array for concurrent handle
317 * 02 05 2010 kevin.huang
318 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
319 * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
321 * 01 22 2010 cm.chang
322 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
323 * Support protection and bandwidth switch
325 * 01 07 2010 kevin.huang
326 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
327 * Modify the parameter of rlmRecAssocRspHtInfo function
329 * 12 18 2009 cm.chang
330 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
333 * Dec 12 2009 mtk01104
334 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
335 * Fix prBssInfo->ucPrimaryChannel handle for assoc resp
337 * Dec 9 2009 mtk01104
338 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
339 * Add some function to process HT operation
341 * Nov 28 2009 mtk01104
342 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
343 * Call rlmStatisticsInit() to handle MIB counters
345 * Nov 18 2009 mtk01104
346 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
352 /*******************************************************************************
353 * C O M P I L E R F L A G S
354 ********************************************************************************
357 /*******************************************************************************
358 * E X T E R N A L R E F E R E N C E S
359 ********************************************************************************
363 /*******************************************************************************
365 ********************************************************************************
368 /*******************************************************************************
370 ********************************************************************************
373 /*******************************************************************************
374 * P U B L I C D A T A
375 ********************************************************************************
378 /*******************************************************************************
379 * P R I V A T E D A T A
380 ********************************************************************************
383 /*******************************************************************************
385 ********************************************************************************
388 /*******************************************************************************
389 * F U N C T I O N D E C L A R A T I O N S
390 ********************************************************************************
394 P_ADAPTER_T prAdapter,
395 P_BSS_INFO_T prBssInfo,
396 P_MSDU_INFO_T prMsduInfo
401 P_ADAPTER_T prAdapter,
402 P_BSS_INFO_T prBssInfo,
403 P_MSDU_INFO_T prMsduInfo
408 P_ADAPTER_T prAdapter,
409 P_BSS_INFO_T prBssInfo,
410 P_MSDU_INFO_T prMsduInfo
414 rlmRecIeInfoForClient (
415 P_ADAPTER_T prAdapter,
416 P_BSS_INFO_T prBssInfo,
422 rlmRecBcnFromNeighborForClient (
423 P_ADAPTER_T prAdapter,
424 P_BSS_INFO_T prBssInfo,
431 rlmRecBcnInfoForClient (
432 P_ADAPTER_T prAdapter,
433 P_BSS_INFO_T prBssInfo,
441 P_ADAPTER_T prAdapter,
442 P_BSS_INFO_T prBssInfo
445 /*******************************************************************************
447 ********************************************************************************
450 /*----------------------------------------------------------------------------*/
458 /*----------------------------------------------------------------------------*/
461 P_ADAPTER_T prAdapter
466 /* Note: assume TIMER_T structures are reset to zero or stopped
467 * before invoking this function.
470 /* Initialize OBSS FSM */
471 rlmObssInit(prAdapter);
474 /*----------------------------------------------------------------------------*/
482 /*----------------------------------------------------------------------------*/
485 P_ADAPTER_T prAdapter
488 P_BSS_INFO_T prBssInfo;
493 RLM_NET_FOR_EACH(ucNetIdx) {
494 prBssInfo = &prAdapter->rWifiVar.arBssInfo[ucNetIdx];
497 /* Note: all RLM timers will also be stopped.
498 * Now only one OBSS scan timer.
500 rlmBssReset(prAdapter, prBssInfo);
504 /*----------------------------------------------------------------------------*/
506 * \brief For probe request, association request
512 /*----------------------------------------------------------------------------*/
514 rlmReqGenerateHtCapIE (
515 P_ADAPTER_T prAdapter,
516 P_MSDU_INFO_T prMsduInfo
519 P_BSS_INFO_T prBssInfo;
520 P_STA_RECORD_T prStaRec;
525 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
528 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
530 if ((prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11N) &&
531 (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N))) {
533 rlmFillHtCapIE(prAdapter, prBssInfo, prMsduInfo);
537 /*----------------------------------------------------------------------------*/
539 * \brief For probe request, association request
545 /*----------------------------------------------------------------------------*/
547 rlmReqGenerateExtCapIE (
548 P_ADAPTER_T prAdapter,
549 P_MSDU_INFO_T prMsduInfo
552 P_BSS_INFO_T prBssInfo;
553 P_STA_RECORD_T prStaRec;
558 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
561 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
563 if ((prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11N) &&
564 (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N))) {
566 rlmFillExtCapIE(prAdapter, prBssInfo, prMsduInfo);
570 /*----------------------------------------------------------------------------*/
572 * \brief For probe response (GO, IBSS) and association response
578 /*----------------------------------------------------------------------------*/
580 rlmRspGenerateHtCapIE (
581 P_ADAPTER_T prAdapter,
582 P_MSDU_INFO_T prMsduInfo
585 P_BSS_INFO_T prBssInfo;
586 P_STA_RECORD_T prStaRec;
590 ASSERT(IS_NET_ACTIVE(prAdapter, prMsduInfo->ucNetworkType));
592 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
595 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
597 if (RLM_NET_IS_11N(prBssInfo) &&
598 (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N))) {
600 rlmFillHtCapIE(prAdapter, prBssInfo, prMsduInfo);
604 /*----------------------------------------------------------------------------*/
606 * \brief For probe response (GO, IBSS) and association response
612 /*----------------------------------------------------------------------------*/
614 rlmRspGenerateExtCapIE (
615 P_ADAPTER_T prAdapter,
616 P_MSDU_INFO_T prMsduInfo
619 P_BSS_INFO_T prBssInfo;
620 P_STA_RECORD_T prStaRec;
624 ASSERT(IS_NET_ACTIVE(prAdapter, prMsduInfo->ucNetworkType));
626 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
629 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
631 if (RLM_NET_IS_11N(prBssInfo) &&
632 (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N))) {
634 rlmFillExtCapIE(prAdapter, prBssInfo, prMsduInfo);
638 /*----------------------------------------------------------------------------*/
640 * \brief For probe response (GO, IBSS) and association response
646 /*----------------------------------------------------------------------------*/
648 rlmRspGenerateHtOpIE (
649 P_ADAPTER_T prAdapter,
650 P_MSDU_INFO_T prMsduInfo
653 P_BSS_INFO_T prBssInfo;
654 P_STA_RECORD_T prStaRec;
658 ASSERT(IS_NET_ACTIVE(prAdapter, prMsduInfo->ucNetworkType));
660 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
662 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
665 if (RLM_NET_IS_11N(prBssInfo) &&
666 (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N))) {
668 rlmFillHtOpIE(prAdapter, prBssInfo, prMsduInfo);
672 /*----------------------------------------------------------------------------*/
674 * \brief For probe response (GO, IBSS) and association response
680 /*----------------------------------------------------------------------------*/
682 rlmRspGenerateErpIE (
683 P_ADAPTER_T prAdapter,
684 P_MSDU_INFO_T prMsduInfo
687 P_BSS_INFO_T prBssInfo;
688 P_STA_RECORD_T prStaRec;
693 ASSERT(IS_NET_ACTIVE(prAdapter, prMsduInfo->ucNetworkType));
695 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
697 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
700 if (RLM_NET_IS_11GN(prBssInfo) && prBssInfo->eBand == BAND_2G4 &&
701 (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11GN))) {
702 prErpIe = (P_IE_ERP_T)
703 (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength);
706 prErpIe->ucId = ELEM_ID_ERP_INFO;
707 prErpIe->ucLength = 1;
709 prErpIe->ucERP = prBssInfo->fgObssErpProtectMode ?
710 ERP_INFO_USE_PROTECTION : 0;
712 if (prBssInfo->fgErpProtectMode) {
714 (ERP_INFO_NON_ERP_PRESENT | ERP_INFO_USE_PROTECTION);
717 /* Handle barker preamble */
718 if (!prBssInfo->fgUseShortPreamble) {
719 prErpIe->ucERP |= ERP_INFO_BARKER_PREAMBLE_MODE;
722 ASSERT(IE_SIZE(prErpIe) <= (ELEM_HDR_LEN+ ELEM_MAX_LEN_ERP));
724 prMsduInfo->u2FrameLength += IE_SIZE(prErpIe);
728 /*----------------------------------------------------------------------------*/
736 /*----------------------------------------------------------------------------*/
739 P_ADAPTER_T prAdapter,
740 P_BSS_INFO_T prBssInfo,
741 P_MSDU_INFO_T prMsduInfo
744 P_IE_HT_CAP_T prHtCap;
745 P_SUP_MCS_SET_FIELD prSupMcsSet;
746 BOOLEAN fg40mAllowed;
752 fg40mAllowed = prBssInfo->fgAssoc40mBwAllowed;
754 prHtCap = (P_IE_HT_CAP_T)
755 (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength);
757 /* Add HT capabilities IE */
758 prHtCap->ucId = ELEM_ID_HT_CAP;
759 prHtCap->ucLength = sizeof(IE_HT_CAP_T) - ELEM_HDR_LEN;
761 prHtCap->u2HtCapInfo = HT_CAP_INFO_DEFAULT_VAL;
763 prHtCap->u2HtCapInfo &= ~(HT_CAP_INFO_SUP_CHNL_WIDTH |
764 HT_CAP_INFO_SHORT_GI_40M | HT_CAP_INFO_DSSS_CCK_IN_40M);
766 if (prAdapter->rWifiVar.rConnSettings.fgRxShortGIDisabled) {
767 prHtCap->u2HtCapInfo &=
768 ~(HT_CAP_INFO_SHORT_GI_20M | HT_CAP_INFO_SHORT_GI_40M);
771 prHtCap->ucAmpduParam = AMPDU_PARAM_DEFAULT_VAL;
773 prSupMcsSet = &prHtCap->rSupMcsSet;
774 kalMemZero((PVOID)&prSupMcsSet->aucRxMcsBitmask[0],
775 SUP_MCS_RX_BITMASK_OCTET_NUM);
777 prSupMcsSet->aucRxMcsBitmask[0] = BITS(0, 7);
780 prSupMcsSet->aucRxMcsBitmask[32/8] = BIT(0); /* MCS32 */
782 prSupMcsSet->u2RxHighestSupportedRate = SUP_MCS_RX_DEFAULT_HIGHEST_RATE;
783 prSupMcsSet->u4TxRateInfo = SUP_MCS_TX_DEFAULT_VAL;
785 prHtCap->u2HtExtendedCap = HT_EXT_CAP_DEFAULT_VAL;
786 if (!fg40mAllowed || prBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE) {
787 prHtCap->u2HtExtendedCap &=
788 ~(HT_EXT_CAP_PCO | HT_EXT_CAP_PCO_TRANS_TIME_NONE);
791 prHtCap->u4TxBeamformingCap = TX_BEAMFORMING_CAP_DEFAULT_VAL;
793 prHtCap->ucAselCap = ASEL_CAP_DEFAULT_VAL;
796 ASSERT(IE_SIZE(prHtCap) <= (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_CAP));
798 prMsduInfo->u2FrameLength += IE_SIZE(prHtCap);
801 /*----------------------------------------------------------------------------*/
809 /*----------------------------------------------------------------------------*/
812 P_ADAPTER_T prAdapter,
813 P_BSS_INFO_T prBssInfo,
814 P_MSDU_INFO_T prMsduInfo
817 P_EXT_CAP_T prExtCap;
818 BOOLEAN fg40mAllowed;
823 fg40mAllowed = prBssInfo->fgAssoc40mBwAllowed;
825 /* Add Extended Capabilities IE */
826 prExtCap = (P_EXT_CAP_T)
827 (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength);
829 prExtCap->ucId = ELEM_ID_EXTENDED_CAP;
830 prExtCap->ucLength = 1;
831 prExtCap->aucCapabilities[0] = ELEM_EXT_CAP_DEFAULT_VAL;
834 prExtCap->aucCapabilities[0] &= ~ELEM_EXT_CAP_20_40_COEXIST_SUPPORT;
837 if (prBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE) {
838 prExtCap->aucCapabilities[0] &= ~ELEM_EXT_CAP_PSMP_CAP;
841 ASSERT(IE_SIZE(prExtCap) <= (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP));
843 prMsduInfo->u2FrameLength += IE_SIZE(prExtCap);
846 /*----------------------------------------------------------------------------*/
854 /*----------------------------------------------------------------------------*/
857 P_ADAPTER_T prAdapter,
858 P_BSS_INFO_T prBssInfo,
859 P_MSDU_INFO_T prMsduInfo
869 prHtOp = (P_IE_HT_OP_T)
870 (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength);
872 /* Add HT operation IE */
873 prHtOp->ucId = ELEM_ID_HT_OP;
874 prHtOp->ucLength = sizeof(IE_HT_OP_T) - ELEM_HDR_LEN;
876 /* RIFS and 20/40 bandwidth operations are included */
877 prHtOp->ucPrimaryChannel = prBssInfo->ucPrimaryChannel;
878 prHtOp->ucInfo1 = prBssInfo->ucHtOpInfo1;
880 /* Decide HT protection mode field */
881 if (prBssInfo->eHtProtectMode == HT_PROTECT_MODE_NON_HT) {
882 prHtOp->u2Info2 = (UINT_8) HT_PROTECT_MODE_NON_HT;
884 else if (prBssInfo->eObssHtProtectMode == HT_PROTECT_MODE_NON_MEMBER) {
885 prHtOp->u2Info2 = (UINT_8) HT_PROTECT_MODE_NON_MEMBER;
888 /* It may be SYS_PROTECT_MODE_NONE or SYS_PROTECT_MODE_20M */
889 prHtOp->u2Info2 = (UINT_8) prBssInfo->eHtProtectMode;
892 if (prBssInfo->eGfOperationMode != GF_MODE_NORMAL) {
893 /* It may be GF_MODE_PROTECT or GF_MODE_DISALLOWED
894 * Note: it will also be set in ad-hoc network
896 prHtOp->u2Info2 |= HT_OP_INFO2_NON_GF_HT_STA_PRESENT;
899 if (0 /* Regulatory class 16 */ &&
900 prBssInfo->eObssHtProtectMode == HT_PROTECT_MODE_NON_MEMBER) {
901 /* (TBD) It is HT_PROTECT_MODE_NON_MEMBER, so require protection
902 * although it is possible to have no protection by spec.
904 prHtOp->u2Info2 |= HT_OP_INFO2_OBSS_NON_HT_STA_PRESENT;
907 prHtOp->u2Info3 = prBssInfo->u2HtOpInfo3; /* To do: handle L-SIG TXOP */
909 /* No basic MCSx are needed temporarily */
910 for (i = 0; i < 16; i++) {
911 prHtOp->aucBasicMcsSet[i] = 0;
914 ASSERT(IE_SIZE(prHtOp) <= (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_OP));
916 prMsduInfo->u2FrameLength += IE_SIZE(prHtOp);
919 /*----------------------------------------------------------------------------*/
921 * \brief This function should be invoked to update parameters of associated AP.
922 * (Association response and Beacon)
928 /*----------------------------------------------------------------------------*/
930 rlmRecIeInfoForClient (
931 P_ADAPTER_T prAdapter,
932 P_BSS_INFO_T prBssInfo,
938 P_STA_RECORD_T prStaRec;
939 P_IE_HT_CAP_T prHtCap;
941 P_IE_OBSS_SCAN_PARAM_T prObssScnParam;
942 UINT_8 ucERP, ucPrimaryChannel;
943 #if CFG_SUPPORT_QUIET && 0
944 BOOLEAN fgHasQuietIE = FALSE;
951 prStaRec = prBssInfo->prStaRecOfAP;
957 prBssInfo->fgUseShortPreamble = prBssInfo->fgIsShortPreambleAllowed;
958 ucPrimaryChannel = 0;
959 prObssScnParam = NULL;
961 /* Note: HT-related members in staRec may not be zero before, so
962 * if following IE does not exist, they are still not zero.
963 * These HT-related parameters are vaild only when the corresponding
964 * BssInfo supports 802.11n, i.e., RLM_NET_IS_11N()
966 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
967 switch (IE_ID(pucIE)) {
969 if (!RLM_NET_IS_11N(prBssInfo) ||
970 IE_LEN(pucIE) != (sizeof(IE_HT_CAP_T) - 2)) {
973 prHtCap = (P_IE_HT_CAP_T) pucIE;
974 prStaRec->ucMcsSet = prHtCap->rSupMcsSet.aucRxMcsBitmask[0];
975 prStaRec->fgSupMcs32 =
976 (prHtCap->rSupMcsSet.aucRxMcsBitmask[32/8] & BIT(0)) ?
979 prStaRec->u2HtCapInfo = prHtCap->u2HtCapInfo;
980 prStaRec->ucAmpduParam = prHtCap->ucAmpduParam;
981 prStaRec->u2HtExtendedCap = prHtCap->u2HtExtendedCap;
982 prStaRec->u4TxBeamformingCap = prHtCap->u4TxBeamformingCap;
983 prStaRec->ucAselCap = prHtCap->ucAselCap;
987 if (!RLM_NET_IS_11N(prBssInfo) ||
988 IE_LEN(pucIE) != (sizeof(IE_HT_OP_T) - 2)) {
991 prHtOp = (P_IE_HT_OP_T) pucIE;
992 /* Workaround that some APs fill primary channel field by its
993 * secondary channel, but its DS IE is correct 20110610
995 if (ucPrimaryChannel == 0) {
996 ucPrimaryChannel = prHtOp->ucPrimaryChannel;
998 prBssInfo->ucHtOpInfo1 = prHtOp->ucInfo1;
999 prBssInfo->u2HtOpInfo2 = prHtOp->u2Info2;
1000 prBssInfo->u2HtOpInfo3 = prHtOp->u2Info3;
1002 if (!prBssInfo->fg40mBwAllowed) {
1003 prBssInfo->ucHtOpInfo1 &=
1004 ~(HT_OP_INFO1_SCO | HT_OP_INFO1_STA_CHNL_WIDTH);
1007 if ((prBssInfo->ucHtOpInfo1 & HT_OP_INFO1_SCO) != CHNL_EXT_RES) {
1008 prBssInfo->eBssSCO = (ENUM_CHNL_EXT_T)
1009 (prBssInfo->ucHtOpInfo1 & HT_OP_INFO1_SCO);
1012 prBssInfo->eHtProtectMode = (ENUM_HT_PROTECT_MODE_T)
1013 (prBssInfo->u2HtOpInfo2 & HT_OP_INFO2_HT_PROTECTION);
1015 /* To do: process regulatory class 16 */
1016 if ((prBssInfo->u2HtOpInfo2 & HT_OP_INFO2_OBSS_NON_HT_STA_PRESENT)
1017 && 0 /* && regulatory class is 16 */) {
1018 prBssInfo->eGfOperationMode = GF_MODE_DISALLOWED;
1020 else if (prBssInfo->u2HtOpInfo2&HT_OP_INFO2_NON_GF_HT_STA_PRESENT) {
1021 prBssInfo->eGfOperationMode = GF_MODE_PROTECT;
1024 prBssInfo->eGfOperationMode = GF_MODE_NORMAL;
1027 prBssInfo->eRifsOperationMode =
1028 (prBssInfo->ucHtOpInfo1 & HT_OP_INFO1_RIFS_MODE) ?
1029 RIFS_MODE_NORMAL : RIFS_MODE_DISALLOWED;
1033 case ELEM_ID_20_40_BSS_COEXISTENCE:
1034 if (!RLM_NET_IS_11N(prBssInfo)) {
1037 /* To do: store if scanning exemption grant to BssInfo */
1040 case ELEM_ID_OBSS_SCAN_PARAMS:
1041 if (!RLM_NET_IS_11N(prBssInfo) ||
1042 IE_LEN(pucIE) != (sizeof(IE_OBSS_SCAN_PARAM_T) - 2)) {
1045 /* Store OBSS parameters to BssInfo */
1046 prObssScnParam = (P_IE_OBSS_SCAN_PARAM_T) pucIE;
1049 case ELEM_ID_EXTENDED_CAP:
1050 if (!RLM_NET_IS_11N(prBssInfo)) {
1053 /* To do: store extended capability (PSMP, coexist) to BssInfo */
1056 case ELEM_ID_ERP_INFO:
1057 if (IE_LEN(pucIE) != (sizeof(IE_ERP_T) - 2) ||
1058 prBssInfo->eBand != BAND_2G4) {
1061 ucERP = ERP_INFO_IE(pucIE)->ucERP;
1062 prBssInfo->fgErpProtectMode =
1063 (ucERP & ERP_INFO_USE_PROTECTION) ? TRUE : FALSE;
1065 if (ucERP & ERP_INFO_BARKER_PREAMBLE_MODE) {
1066 prBssInfo->fgUseShortPreamble = FALSE;
1070 case ELEM_ID_DS_PARAM_SET:
1071 if (IE_LEN(pucIE) == ELEM_MAX_LEN_DS_PARAMETER_SET) {
1072 ucPrimaryChannel = DS_PARAM_IE(pucIE)->ucCurrChnl;
1076 #if CFG_SUPPORT_QUIET && 0
1077 /* Note: RRM code should be moved to independent RRM function by
1078 * component design rule. But we attach it to RLM temporarily
1081 rrmQuietHandleQuietIE(prBssInfo, (P_IE_QUIET_T) pucIE);
1082 fgHasQuietIE = TRUE;
1087 } /* end of switch */
1088 } /* end of IE_FOR_EACH */
1090 /* Some AP will have wrong channel number (255) when running time.
1091 * Check if correct channel number information. 20110501
1093 if ((prBssInfo->eBand == BAND_2G4 && ucPrimaryChannel > 14) ||
1094 (prBssInfo->eBand != BAND_2G4 && (ucPrimaryChannel >= 200 ||
1095 ucPrimaryChannel <= 14))) {
1096 ucPrimaryChannel = 0;
1099 #if CFG_SUPPORT_QUIET && 0
1100 if (!fgHasQuietIE) {
1101 rrmQuietIeNotExist(prAdapter, prBssInfo);
1105 /* Check if OBSS scan process will launch */
1106 if (!prAdapter->fgEnOnlineScan || !prObssScnParam ||
1107 !(prStaRec->u2HtCapInfo & HT_CAP_INFO_SUP_CHNL_WIDTH) ||
1108 prBssInfo->eBand != BAND_2G4 || !prBssInfo->fg40mBwAllowed) {
1110 /* Note: it is ok not to stop rObssScanTimer() here */
1111 prBssInfo->u2ObssScanInterval = 0;
1114 if (prObssScnParam->u2TriggerScanInterval < OBSS_SCAN_MIN_INTERVAL) {
1115 prObssScnParam->u2TriggerScanInterval = OBSS_SCAN_MIN_INTERVAL;
1117 if (prBssInfo->u2ObssScanInterval !=
1118 prObssScnParam->u2TriggerScanInterval) {
1120 prBssInfo->u2ObssScanInterval =
1121 prObssScnParam->u2TriggerScanInterval;
1123 /* Start timer to trigger OBSS scanning */
1124 cnmTimerStartTimer(prAdapter, &prBssInfo->rObssScanTimer,
1125 prBssInfo->u2ObssScanInterval * MSEC_PER_SEC);
1129 return ucPrimaryChannel;
1132 /*----------------------------------------------------------------------------*/
1134 * \brief AIS or P2P GC.
1140 /*----------------------------------------------------------------------------*/
1142 rlmRecBcnFromNeighborForClient (
1143 P_ADAPTER_T prAdapter,
1144 P_BSS_INFO_T prBssInfo,
1150 UINT_16 u2Offset, i;
1151 UINT_8 ucPriChannel, ucSecChannel;
1152 ENUM_CHNL_EXT_T eSCO;
1153 BOOLEAN fgHtBss, fg20mReq;
1156 ASSERT(prBssInfo && prSwRfb);
1159 /* Record it to channel list to change 20/40 bandwidth */
1161 eSCO = CHNL_EXT_SCN;
1166 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1167 switch (IE_ID(pucIE)) {
1168 case ELEM_ID_HT_CAP:
1170 P_IE_HT_CAP_T prHtCap;
1172 if (IE_LEN(pucIE) != (sizeof(IE_HT_CAP_T) - 2)) {
1176 prHtCap = (P_IE_HT_CAP_T) pucIE;
1177 if (prHtCap->u2HtCapInfo & HT_CAP_INFO_40M_INTOLERANT) {
1185 P_IE_HT_OP_T prHtOp;
1187 if (IE_LEN(pucIE) != (sizeof(IE_HT_OP_T) - 2)) {
1191 prHtOp = (P_IE_HT_OP_T) pucIE;
1192 /* Workaround that some APs fill primary channel field by its
1193 * secondary channel, but its DS IE is correct 20110610
1195 if (ucPriChannel == 0) {
1196 ucPriChannel = prHtOp->ucPrimaryChannel;
1199 if ((prHtOp->ucInfo1 & HT_OP_INFO1_SCO) != CHNL_EXT_RES) {
1200 eSCO = (ENUM_CHNL_EXT_T) (prHtOp->ucInfo1 & HT_OP_INFO1_SCO);
1204 case ELEM_ID_20_40_BSS_COEXISTENCE:
1206 P_IE_20_40_COEXIST_T prCoexist;
1208 if (IE_LEN(pucIE) != (sizeof(IE_20_40_COEXIST_T) - 2)) {
1212 prCoexist = (P_IE_20_40_COEXIST_T) pucIE;
1213 if (prCoexist->ucData & BSS_COEXIST_40M_INTOLERANT) {
1218 case ELEM_ID_DS_PARAM_SET:
1219 if (IE_LEN(pucIE) != (sizeof(IE_DS_PARAM_SET_T) - 2)) {
1222 ucPriChannel = DS_PARAM_IE(pucIE)->ucCurrChnl;
1231 /* To do: Update channel list and 5G band. All channel lists have the same
1232 * update procedure. We should give it the entry pointer of desired
1235 if (HIF_RX_HDR_GET_RF_BAND(prSwRfb->prHifRxHdr) != BAND_2G4) {
1239 if (ucPriChannel == 0 || ucPriChannel > 14) {
1240 ucPriChannel = HIF_RX_HDR_GET_CHNL_NUM(prSwRfb->prHifRxHdr);
1244 ASSERT(prBssInfo->auc2G_PriChnlList[0] <= CHNL_LIST_SZ_2G);
1245 for (i = 1; i <= prBssInfo->auc2G_PriChnlList[0] &&
1246 i <= CHNL_LIST_SZ_2G; i++) {
1247 if (prBssInfo->auc2G_PriChnlList[i] == ucPriChannel) {
1251 if ((i > prBssInfo->auc2G_PriChnlList[0]) && (i <= CHNL_LIST_SZ_2G)) {
1252 prBssInfo->auc2G_PriChnlList[i] = ucPriChannel;
1253 prBssInfo->auc2G_PriChnlList[0]++;
1256 /* Update secondary channel */
1257 if (eSCO != CHNL_EXT_SCN) {
1258 ucSecChannel = (eSCO == CHNL_EXT_SCA) ?
1259 (ucPriChannel + 4) : (ucPriChannel - 4);
1261 ASSERT(prBssInfo->auc2G_SecChnlList[0] <= CHNL_LIST_SZ_2G);
1262 for (i = 1; i <= prBssInfo->auc2G_SecChnlList[0] &&
1263 i <= CHNL_LIST_SZ_2G; i++) {
1264 if (prBssInfo->auc2G_SecChnlList[i] == ucSecChannel) {
1268 if ((i > prBssInfo->auc2G_SecChnlList[0])&& (i <= CHNL_LIST_SZ_2G)){
1269 prBssInfo->auc2G_SecChnlList[i] = ucSecChannel;
1270 prBssInfo->auc2G_SecChnlList[0]++;
1274 /* Update 20M bandwidth request channels */
1276 ASSERT(prBssInfo->auc2G_20mReqChnlList[0] <= CHNL_LIST_SZ_2G);
1277 for (i = 1; i <= prBssInfo->auc2G_20mReqChnlList[0] &&
1278 i <= CHNL_LIST_SZ_2G; i++) {
1279 if (prBssInfo->auc2G_20mReqChnlList[i] == ucPriChannel) {
1283 if ((i > prBssInfo->auc2G_20mReqChnlList[0]) &&
1284 (i <= CHNL_LIST_SZ_2G)){
1285 prBssInfo->auc2G_20mReqChnlList[i] = ucPriChannel;
1286 prBssInfo->auc2G_20mReqChnlList[0]++;
1291 /* Update non-HT channel list */
1292 ASSERT(prBssInfo->auc2G_NonHtChnlList[0] <= CHNL_LIST_SZ_2G);
1293 for (i = 1; i <= prBssInfo->auc2G_NonHtChnlList[0] &&
1294 i <= CHNL_LIST_SZ_2G; i++) {
1295 if (prBssInfo->auc2G_NonHtChnlList[i] == ucPriChannel) {
1299 if ((i > prBssInfo->auc2G_NonHtChnlList[0]) && (i <= CHNL_LIST_SZ_2G)) {
1300 prBssInfo->auc2G_NonHtChnlList[i] = ucPriChannel;
1301 prBssInfo->auc2G_NonHtChnlList[0]++;
1310 /*----------------------------------------------------------------------------*/
1312 * \brief AIS or P2P GC.
1318 /*----------------------------------------------------------------------------*/
1320 rlmRecBcnInfoForClient (
1321 P_ADAPTER_T prAdapter,
1322 P_BSS_INFO_T prBssInfo,
1329 ASSERT(prBssInfo && prSwRfb);
1332 #if 0 /* SW migration 2010/8/20 */
1333 /* Note: we shall not update parameters when scanning, otherwise
1334 * channel and bandwidth will not be correct or asserted failure
1336 * Note: remove channel checking. All received Beacons should be processed
1337 * if measurement or other actions are executed in adjacent channels
1338 * and Beacon content checking mechanism is not disabled.
1340 if (IS_SCAN_ACTIVE()
1341 /* || prBssInfo->ucPrimaryChannel != CHNL_NUM_BY_SWRFB(prSwRfb) */) {
1346 /* Handle change of slot time */
1347 prBssInfo->u2CapInfo =
1348 ((P_WLAN_BEACON_FRAME_T)(prSwRfb->pvHeader))->u2CapInfo;
1349 prBssInfo->fgUseShortSlotTime =
1350 (prBssInfo->u2CapInfo & CAP_INFO_SHORT_SLOT_TIME) ? TRUE : FALSE;
1352 rlmRecIeInfoForClient(prAdapter, prBssInfo, pucIE, u2IELength);
1357 /*----------------------------------------------------------------------------*/
1365 /*----------------------------------------------------------------------------*/
1368 P_ADAPTER_T prAdapter,
1374 P_BSS_INFO_T prBssInfo;
1375 BOOLEAN fgNewParameter;
1382 fgNewParameter = FALSE;
1384 /* When concurrent networks exist, GO shall have the same handle as
1385 * the other BSS, so the Beacon shall be procesed for bandwidth and
1386 * protection mechanism.
1387 * Note1: we do not have 2 AP (GO) cases simultaneously now.
1388 * Note2: If we are GO, concurrent AIS AP should detect it and reflect
1389 * action in its Beacon, so AIS STA just follows Beacon from AP.
1391 RLM_NET_FOR_EACH_NO_BOW(ucNetIdx) {
1392 prBssInfo = &prAdapter->rWifiVar.arBssInfo[ucNetIdx];
1395 if (IS_BSS_ACTIVE(prBssInfo)) {
1396 if (prBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE &&
1397 prBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
1398 /* P2P client or AIS infra STA */
1399 if (EQUAL_MAC_ADDR(prBssInfo->aucBSSID,
1400 ((P_WLAN_MAC_MGMT_HEADER_T)
1401 (prSwRfb->pvHeader))->aucBSSID)) {
1403 fgNewParameter = rlmRecBcnInfoForClient(prAdapter,
1404 prBssInfo, prSwRfb, pucIE, u2IELength);
1407 fgNewParameter = rlmRecBcnFromNeighborForClient(prAdapter,
1408 prBssInfo, prSwRfb, pucIE, u2IELength);
1411 #if CFG_ENABLE_WIFI_DIRECT
1412 else if (prAdapter->fgIsP2PRegistered &&
1413 (prBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT ||
1414 prBssInfo->eCurrentOPMode == OP_MODE_P2P_DEVICE)) {
1415 /* AP scan to check if 20/40M bandwidth is permitted */
1416 rlmRecBcnFromNeighborForClient(prAdapter,
1417 prBssInfo, prSwRfb, pucIE, u2IELength);
1420 else if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
1424 /* Appy new parameters if necessary */
1425 if (fgNewParameter) {
1426 rlmSyncOperationParams(prAdapter, prBssInfo);
1427 fgNewParameter = FALSE;
1429 } /* end of IS_BSS_ACTIVE() */
1430 } /* end of RLM_NET_FOR_EACH_NO_BOW */
1433 /*----------------------------------------------------------------------------*/
1435 * \brief This function should be invoked after judging successful association.
1441 /*----------------------------------------------------------------------------*/
1443 rlmProcessAssocRsp (
1444 P_ADAPTER_T prAdapter,
1450 P_BSS_INFO_T prBssInfo;
1451 P_STA_RECORD_T prStaRec;
1452 UINT_8 ucPriChannel;
1458 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1463 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1465 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
1466 ASSERT(prStaRec == prBssInfo->prStaRecOfAP);
1468 /* To do: the invoked function is used to clear all members. It may be
1469 * done by center mechanism in invoker.
1471 rlmBssReset(prAdapter, prBssInfo);
1473 prBssInfo->fgUseShortSlotTime =
1474 (prBssInfo->u2CapInfo & CAP_INFO_SHORT_SLOT_TIME) ? TRUE : FALSE;
1477 rlmRecIeInfoForClient(prAdapter, prBssInfo, pucIE, u2IELength)) > 0) {
1478 prBssInfo->ucPrimaryChannel = ucPriChannel;
1481 if (!RLM_NET_IS_11N(prBssInfo) ||
1482 !(prStaRec->u2HtCapInfo & HT_CAP_INFO_SUP_CHNL_WIDTH)) {
1483 prBssInfo->fg40mBwAllowed = FALSE;
1486 /* Note: Update its capabilities to WTBL by cnmStaRecChangeState(), which
1487 * shall be invoked afterwards.
1488 * Update channel, bandwidth and protection mode by nicUpdateBss()
1492 /*----------------------------------------------------------------------------*/
1494 * \brief This function should be invoked after judging successful association.
1500 /*----------------------------------------------------------------------------*/
1502 rlmFillSyncCmdParam (
1503 P_CMD_SET_BSS_RLM_PARAM_T prCmdBody,
1504 P_BSS_INFO_T prBssInfo
1507 ASSERT(prCmdBody && prBssInfo);
1508 if (!prCmdBody || !prBssInfo) {
1512 prCmdBody->ucNetTypeIndex = prBssInfo->ucNetTypeIndex;
1513 prCmdBody->ucRfBand = (UINT_8) prBssInfo->eBand;
1514 prCmdBody->ucPrimaryChannel = prBssInfo->ucPrimaryChannel;
1515 prCmdBody->ucRfSco = (UINT_8) prBssInfo->eBssSCO;
1516 prCmdBody->ucErpProtectMode = (UINT_8) prBssInfo->fgErpProtectMode;
1517 prCmdBody->ucHtProtectMode = (UINT_8) prBssInfo->eHtProtectMode;
1518 prCmdBody->ucGfOperationMode = (UINT_8) prBssInfo->eGfOperationMode;
1519 prCmdBody->ucTxRifsMode = (UINT_8) prBssInfo->eRifsOperationMode;
1520 prCmdBody->u2HtOpInfo3 = prBssInfo->u2HtOpInfo3;
1521 prCmdBody->u2HtOpInfo2 = prBssInfo->u2HtOpInfo2;
1522 prCmdBody->ucHtOpInfo1 = prBssInfo->ucHtOpInfo1;
1523 prCmdBody->ucUseShortPreamble = prBssInfo->fgUseShortPreamble;
1524 prCmdBody->ucUseShortSlotTime = prBssInfo->fgUseShortSlotTime;
1525 prCmdBody->ucCheckId = 0x72;
1527 if (RLM_NET_PARAM_VALID(prBssInfo)) {
1528 DBGLOG(RLM, INFO, ("N=%d b=%d c=%d s=%d e=%d h=%d I=0x%02x l=%d p=%d\n",
1529 prCmdBody->ucNetTypeIndex, prCmdBody->ucRfBand,
1530 prCmdBody->ucPrimaryChannel, prCmdBody->ucRfSco,
1531 prCmdBody->ucErpProtectMode, prCmdBody->ucHtProtectMode,
1532 prCmdBody->ucHtOpInfo1, prCmdBody->ucUseShortSlotTime,
1533 prCmdBody->ucUseShortPreamble));
1536 DBGLOG(RLM, INFO, ("N=%d closed\n", prCmdBody->ucNetTypeIndex));
1540 /*----------------------------------------------------------------------------*/
1542 * \brief This function will operation parameters based on situations of
1543 * concurrent networks. Channel, bandwidth, protection mode, supported
1544 * rate will be modified.
1550 /*----------------------------------------------------------------------------*/
1552 rlmSyncOperationParams (
1553 P_ADAPTER_T prAdapter,
1554 P_BSS_INFO_T prBssInfo
1557 P_CMD_SET_BSS_RLM_PARAM_T prCmdBody;
1558 WLAN_STATUS rStatus;
1563 prCmdBody = (P_CMD_SET_BSS_RLM_PARAM_T)
1564 cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_SET_BSS_RLM_PARAM_T));
1567 /* To do: exception handle */
1569 DBGLOG(RLM, WARN, ("No buf for sync RLM params (Net=%d)\n",
1570 prBssInfo->ucNetTypeIndex));
1574 rlmFillSyncCmdParam(prCmdBody, prBssInfo);
1576 rStatus = wlanSendSetQueryCmd (
1577 prAdapter, /* prAdapter */
1578 CMD_ID_SET_BSS_RLM_PARAM, /* ucCID */
1579 TRUE, /* fgSetQuery */
1580 FALSE, /* fgNeedResp */
1581 FALSE, /* fgIsOid */
1582 NULL, /* pfCmdDoneHandler */
1583 NULL, /* pfCmdTimeoutHandler */
1584 sizeof(CMD_SET_BSS_RLM_PARAM_T), /* u4SetQueryInfoLen */
1585 (PUINT_8) prCmdBody, /* pucInfoBuffer */
1586 NULL, /* pvSetQueryBuffer */
1587 0 /* u4SetQueryBufferLen */
1590 ASSERT(rStatus == WLAN_STATUS_PENDING);
1592 cnmMemFree(prAdapter, prCmdBody);
1596 /*----------------------------------------------------------------------------*/
1598 * \brief This function should be invoked after judging successful association.
1604 /*----------------------------------------------------------------------------*/
1606 rlmProcessAssocReq (
1607 P_ADAPTER_T prAdapter,
1613 P_BSS_INFO_T prBssInfo;
1614 P_STA_RECORD_T prStaRec;
1616 P_IE_HT_CAP_T prHtCap;
1622 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1627 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1629 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
1631 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1632 switch (IE_ID(pucIE)) {
1633 case ELEM_ID_HT_CAP:
1634 if (!RLM_NET_IS_11N(prBssInfo) ||
1635 IE_LEN(pucIE) != (sizeof(IE_HT_CAP_T) - 2)) {
1638 prHtCap = (P_IE_HT_CAP_T) pucIE;
1639 prStaRec->ucMcsSet = prHtCap->rSupMcsSet.aucRxMcsBitmask[0];
1640 prStaRec->fgSupMcs32 =
1641 (prHtCap->rSupMcsSet.aucRxMcsBitmask[32/8] & BIT(0)) ?
1644 prStaRec->u2HtCapInfo = prHtCap->u2HtCapInfo;
1645 prStaRec->ucAmpduParam = prHtCap->ucAmpduParam;
1646 prStaRec->u2HtExtendedCap = prHtCap->u2HtExtendedCap;
1647 prStaRec->u4TxBeamformingCap = prHtCap->u4TxBeamformingCap;
1648 prStaRec->ucAselCap = prHtCap->ucAselCap;
1653 } /* end of switch */
1654 } /* end of IE_FOR_EACH */
1656 #endif /* CFG_SUPPORT_AAA */
1658 /*----------------------------------------------------------------------------*/
1660 * \brief It is for both STA and AP modes
1666 /*----------------------------------------------------------------------------*/
1668 rlmBssInitForAPandIbss (
1669 P_ADAPTER_T prAdapter,
1670 P_BSS_INFO_T prBssInfo
1676 #if CFG_ENABLE_WIFI_DIRECT
1677 if (prAdapter->fgIsP2PRegistered &&
1678 prBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT) {
1680 rlmBssInitForAP(prAdapter, prBssInfo);
1685 /*----------------------------------------------------------------------------*/
1687 * \brief It is for both STA and AP modes
1693 /*----------------------------------------------------------------------------*/
1696 P_ADAPTER_T prAdapter,
1697 P_BSS_INFO_T prBssInfo
1703 rlmBssReset(prAdapter, prBssInfo);
1705 prBssInfo->fg40mBwAllowed = FALSE;
1706 prBssInfo->fgAssoc40mBwAllowed = FALSE;
1708 /* Assume FW state is updated by CMD_ID_SET_BSS_INFO, so
1709 * the sync CMD is not needed here.
1713 /*----------------------------------------------------------------------------*/
1715 * \brief All RLM timers will also be stopped.
1721 /*----------------------------------------------------------------------------*/
1724 P_ADAPTER_T prAdapter,
1725 P_BSS_INFO_T prBssInfo
1731 /* HT related parameters */
1732 prBssInfo->ucHtOpInfo1 = 0; /* RIFS disabled. 20MHz */
1733 prBssInfo->u2HtOpInfo2 = 0;
1734 prBssInfo->u2HtOpInfo3 = 0;
1736 prBssInfo->eBssSCO = 0;
1737 prBssInfo->fgErpProtectMode = 0;
1738 prBssInfo->eHtProtectMode = 0;
1739 prBssInfo->eGfOperationMode = 0;
1740 prBssInfo->eRifsOperationMode = 0;
1742 /* OBSS related parameters */
1743 prBssInfo->auc2G_20mReqChnlList[0] = 0;
1744 prBssInfo->auc2G_NonHtChnlList[0] = 0;
1745 prBssInfo->auc2G_PriChnlList[0] = 0;
1746 prBssInfo->auc2G_SecChnlList[0] = 0;
1747 prBssInfo->auc5G_20mReqChnlList[0] = 0;
1748 prBssInfo->auc5G_NonHtChnlList[0] = 0;
1749 prBssInfo->auc5G_PriChnlList[0] = 0;
1750 prBssInfo->auc5G_SecChnlList[0] = 0;
1752 /* All RLM timers will also be stopped */
1753 cnmTimerStopTimer(prAdapter, &prBssInfo->rObssScanTimer);
1754 prBssInfo->u2ObssScanInterval = 0;
1756 prBssInfo->fgObssErpProtectMode = 0; /* GO only */
1757 prBssInfo->eObssHtProtectMode = 0; /* GO only */
1758 prBssInfo->eObssGfOperationMode = 0; /* GO only */
1759 prBssInfo->fgObssRifsOperationMode = 0; /* GO only */
1760 prBssInfo->fgObssActionForcedTo20M = 0; /* GO only */
1761 prBssInfo->fgObssBeaconForcedTo20M = 0; /* GO only */