2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/rlm.c#2 $
15 * 07 17 2012 yuche.tsai
17 * Compile no error before trial run.
21 * Check length HT cap IE about RX associate request frame
25 * Modify debug message for XLOG
29 * Add RLM and CNM debug message for XLOG
32 * [WCXRP00000997] [MT6620 Wi-Fi][Driver][FW] Handle change of BSS preamble type and slot time
33 * Fix preamble type of STA mode
36 * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
37 * Not send ERP IE if peer STA is 802.11b-only
40 * [WCXRP00001031] [All Wi-Fi][Driver] Check HT IE length to avoid wrong SCO parameter
41 * Ignore HT OP IE if its length field is not valid
45 * Add length check to reduce possibility to adopt wrong IE
48 * [WCXRP00000997] [MT6620 Wi-Fi][Driver][FW] Handle change of BSS preamble type and slot time
49 * Handle client mode about preamble type and slot time
52 * [WCXRP00000971] [MT6620 Wi-Fi][Driver][FW] Not set Beacon timeout interval when CPTT
53 * Final channel number only adopts the field from assoc response
56 * [WCXRP00000773] [MT6620 Wi-Fi][Driver] Workaround some AP fill primary channel field with its secondary channel
57 * If DS IE exists, ignore the primary channel field in HT OP IE
60 * [WCXRP00000691] [MT6620 Wi-Fi][Driver] Workaround about AP's wrong HT capability IE to have wrong channel number
64 * [WCXRP00000691] [MT6620 Wi-Fi][Driver] Workaround about AP's wrong HT capability IE to have wrong channel number
65 * Refine range of valid channel number
68 * [WCXRP00000691] [MT6620 Wi-Fi][Driver] Workaround about AP's wrong HT capability IE to have wrong channel number
69 * Check if channel is valided before record ing BSS channel
72 * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
76 * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
80 * [WCXRP00000606] [MT6620 Wi-Fi][Driver][FW] Fix klocwork warning
84 * [WCXRP00000384] [MT6620 Wi-Fi][Driver][FW] Handle 20/40 action frame in AP mode and stop ampdu timer when sta_rec is freed
85 * Process received 20/40 coexistence action frame for AP mode
88 * [WCXRP00000260] [MT6620 Wi-Fi][Driver][Firmware] Create V1.1 branch for both firmware and driver
89 * create branch for Wi-Fi driver v1.1
92 * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
93 * 1. BSSINFO include RLM parameter
94 * 2. free all sta records when network is disconnected
97 * [WCXRP00000238] MT6620 Wi-Fi][Driver][FW] Support regulation domain setting from NVRAM and supplicant
98 * 1. Country code is from NVRAM or supplicant
99 * 2. Change band definition in CMD/EVENT.
101 * 10 15 2010 cm.chang
102 * [WCXRP00000094] [MT6620 Wi-Fi][Driver] Connect to 2.4GHz AP, Driver crash.
103 * Add exception handle when no mgmt buffer in free build
105 * 10 08 2010 cm.chang
107 * When 20M only setting, ignore OBSS IE
109 * 09 16 2010 cm.chang
111 * Change conditional compiling options for BOW
113 * 09 10 2010 cm.chang
115 * Always update Beacon content if FW sync OBSS info
117 * 09 03 2010 kevin.huang
119 * Refine #include sequence and solve recursive/nested #include issue
121 * 08 24 2010 cm.chang
123 * Support RLM initail channel of Ad-hoc, P2P and BOW
127 * revise constant definitions to be matched with implementation (original cmd-event definition is deprecated)
129 * 08 23 2010 chinghwa.yu
131 * Temporary add rlmUpdateParamByStaForBow() and rlmBssInitForBow().
133 * 08 23 2010 chinghwa.yu
135 * Add CFG_ENABLE_BT_OVER_WIFI.
137 * 08 23 2010 chinghwa.yu
141 * 08 20 2010 cm.chang
143 * Migrate RLM code to host from FW
145 * 08 02 2010 yuche.tsai
147 * P2P Group Negotiation Code Check in.
149 * 07 26 2010 yuche.tsai
151 * Fix compile error while enabling WiFi Direct function.
153 * 07 21 2010 yuche.tsai
155 * Add P2P Scan & Scan Result Parsing & Saving.
157 * 07 19 2010 cm.chang
159 * Set RLM parameters and enable CNM channel manager
163 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
166 * [WPD00003833][MT6620 and MT5931] Driver migration
167 * take use of RLM module for parsing/generating HT IEs for 11n capability
169 * 07 08 2010 cm.chang
170 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
171 * Check draft RLM code for HT cap
173 * 06 05 2010 cm.chang
174 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
175 * Fix channel ID definition in RFB status to primary channel instead of center channel
177 * 06 02 2010 cm.chang
178 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
179 * Add TX short GI compiling option
181 * 06 02 2010 chinghwa.yu
182 * [BORA00000563]Add WiFi CoEx BCM module
183 * Roll back to remove CFG_SUPPORT_BCM_TEST.
185 * 06 01 2010 chinghwa.yu
186 * [BORA00000563]Add WiFi CoEx BCM module
187 * Update BCM Test and RW configuration.
189 * 05 31 2010 cm.chang
190 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
191 * Add some compiling options to control 11n functions
193 * 05 28 2010 cm.chang
194 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
195 * Set RTS threshold of 2K bytes initially
197 * 05 18 2010 cm.chang
198 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
199 * Ad-hoc Beacon should not carry HT OP and OBSS IEs
201 * 05 07 2010 cm.chang
202 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
203 * Process 20/40 coexistence public action frame in AP mode
205 * 05 05 2010 cm.chang
206 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
207 * First draft support for 20/40M bandwidth for AP mode
209 * 04 24 2010 cm.chang
210 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
211 * g_aprBssInfo[] depends on CFG_SUPPORT_P2P and CFG_SUPPORT_BOW
213 * 04 22 2010 cm.chang
214 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
215 * First draft code to support protection in AP mode
217 * 04 13 2010 cm.chang
218 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
219 * Utilize status of swRfb to know channel number and band
221 * 04 07 2010 cm.chang
222 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
223 * Different invoking order for WTBL entry of associated AP
225 * 04 07 2010 cm.chang
226 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
227 * Add virtual test for OBSS scan
229 * 04 02 2010 cm.chang
230 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
231 * Process Beacon only ready for infra STA now
233 * 03 30 2010 cm.chang
234 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
235 * Support 2.4G OBSS scan
237 * 03 24 2010 cm.chang
238 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
239 * Not carry HT cap when being associated with b/g only AP
242 * [BORA00000605][WIFISYS] Phase3 Integration
243 * fixed some WHQL testing error.
245 * 03 15 2010 cm.chang
246 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
247 * Provide draft measurement and quiet functions
249 * 03 09 2010 cm.chang
250 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
251 * If bss is not 11n network, zero WTBL HT parameters
253 * 03 03 2010 cm.chang
254 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
255 * To support CFG_SUPPORT_BCM_STP
257 * 03 02 2010 cm.chang
258 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
259 * Generate HT IE only depending on own phyTypeSet
261 * 03 02 2010 cm.chang
262 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
263 * Not fill HT related IE if BssInfo does not include 11n phySet
265 * 03 01 2010 tehuang.liu
266 * [BORA00000569][WIFISYS] Phase 2 Integration Test
267 * To store field AMPDU Parameters in STA_REC
269 * 02 26 2010 cm.chang
270 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
271 * Enable RDG RX, but disable RDG TX for IOT and LongNAV
273 * 02 12 2010 cm.chang
274 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
275 * Use bss info array for concurrent handle
277 * 02 05 2010 kevin.huang
278 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
279 * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
281 * 01 22 2010 cm.chang
282 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
283 * Support protection and bandwidth switch
285 * 01 07 2010 kevin.huang
286 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
287 * Modify the parameter of rlmRecAssocRspHtInfo function
289 * 12 18 2009 cm.chang
290 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
293 * Dec 12 2009 mtk01104
294 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
295 * Fix prBssInfo->ucPrimaryChannel handle for assoc resp
297 * Dec 9 2009 mtk01104
298 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
299 * Add some function to process HT operation
301 * Nov 28 2009 mtk01104
302 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
303 * Call rlmStatisticsInit() to handle MIB counters
305 * Nov 18 2009 mtk01104
306 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
312 /*******************************************************************************
313 * C O M P I L E R F L A G S
314 ********************************************************************************
317 /*******************************************************************************
318 * E X T E R N A L R E F E R E N C E S
319 ********************************************************************************
323 /*******************************************************************************
325 ********************************************************************************
328 /*******************************************************************************
330 ********************************************************************************
333 /*******************************************************************************
334 * P U B L I C D A T A
335 ********************************************************************************
338 /*******************************************************************************
339 * P R I V A T E D A T A
340 ********************************************************************************
343 /*******************************************************************************
345 ********************************************************************************
348 /*******************************************************************************
349 * F U N C T I O N D E C L A R A T I O N S
350 ********************************************************************************
354 P_ADAPTER_T prAdapter,
355 P_BSS_INFO_T prBssInfo,
356 P_MSDU_INFO_T prMsduInfo
361 P_ADAPTER_T prAdapter,
362 P_BSS_INFO_T prBssInfo,
363 P_MSDU_INFO_T prMsduInfo
368 P_ADAPTER_T prAdapter,
369 P_BSS_INFO_T prBssInfo,
370 P_MSDU_INFO_T prMsduInfo
374 rlmRecIeInfoForClient (
375 P_ADAPTER_T prAdapter,
376 P_BSS_INFO_T prBssInfo,
382 rlmRecBcnFromNeighborForClient (
383 P_ADAPTER_T prAdapter,
384 P_BSS_INFO_T prBssInfo,
391 rlmRecBcnInfoForClient (
392 P_ADAPTER_T prAdapter,
393 P_BSS_INFO_T prBssInfo,
401 P_ADAPTER_T prAdapter,
402 P_BSS_INFO_T prBssInfo
405 /*******************************************************************************
407 ********************************************************************************
410 /*----------------------------------------------------------------------------*/
418 /*----------------------------------------------------------------------------*/
421 P_ADAPTER_T prAdapter
426 /* Note: assume TIMER_T structures are reset to zero or stopped
427 * before invoking this function.
430 /* Initialize OBSS FSM */
431 rlmObssInit(prAdapter);
434 /*----------------------------------------------------------------------------*/
442 /*----------------------------------------------------------------------------*/
445 P_ADAPTER_T prAdapter
448 P_BSS_INFO_T prBssInfo;
453 RLM_NET_FOR_EACH(ucNetIdx) {
454 prBssInfo = &prAdapter->rWifiVar.arBssInfo[ucNetIdx];
457 /* Note: all RLM timers will also be stopped.
458 * Now only one OBSS scan timer.
460 rlmBssReset(prAdapter, prBssInfo);
464 /*----------------------------------------------------------------------------*/
466 * \brief For probe request, association request
472 /*----------------------------------------------------------------------------*/
474 rlmReqGenerateHtCapIE (
475 P_ADAPTER_T prAdapter,
476 P_MSDU_INFO_T prMsduInfo
479 P_BSS_INFO_T prBssInfo;
480 P_STA_RECORD_T prStaRec;
485 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
488 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
490 if ((prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11N) &&
491 (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N))) {
493 rlmFillHtCapIE(prAdapter, prBssInfo, prMsduInfo);
497 /*----------------------------------------------------------------------------*/
499 * \brief For probe request, association request
505 /*----------------------------------------------------------------------------*/
507 rlmReqGenerateExtCapIE (
508 P_ADAPTER_T prAdapter,
509 P_MSDU_INFO_T prMsduInfo
512 P_BSS_INFO_T prBssInfo;
513 P_STA_RECORD_T prStaRec;
518 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
521 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
523 if ((prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11N) &&
524 (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N))) {
526 rlmFillExtCapIE(prAdapter, prBssInfo, prMsduInfo);
530 /*----------------------------------------------------------------------------*/
532 * \brief For probe response (GO, IBSS) and association response
538 /*----------------------------------------------------------------------------*/
540 rlmRspGenerateHtCapIE (
541 P_ADAPTER_T prAdapter,
542 P_MSDU_INFO_T prMsduInfo
545 P_BSS_INFO_T prBssInfo;
546 P_STA_RECORD_T prStaRec;
550 ASSERT(IS_NET_ACTIVE(prAdapter, prMsduInfo->ucNetworkType));
552 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
555 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
557 if (RLM_NET_IS_11N(prBssInfo) &&
558 (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N))) {
560 rlmFillHtCapIE(prAdapter, prBssInfo, prMsduInfo);
564 /*----------------------------------------------------------------------------*/
566 * \brief For probe response (GO, IBSS) and association response
572 /*----------------------------------------------------------------------------*/
574 rlmRspGenerateExtCapIE (
575 P_ADAPTER_T prAdapter,
576 P_MSDU_INFO_T prMsduInfo
579 P_BSS_INFO_T prBssInfo;
580 P_STA_RECORD_T prStaRec;
584 ASSERT(IS_NET_ACTIVE(prAdapter, prMsduInfo->ucNetworkType));
586 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
589 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
591 if (RLM_NET_IS_11N(prBssInfo) &&
592 (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N))) {
594 rlmFillExtCapIE(prAdapter, prBssInfo, prMsduInfo);
598 /*----------------------------------------------------------------------------*/
600 * \brief For probe response (GO, IBSS) and association response
606 /*----------------------------------------------------------------------------*/
608 rlmRspGenerateHtOpIE (
609 P_ADAPTER_T prAdapter,
610 P_MSDU_INFO_T prMsduInfo
613 P_BSS_INFO_T prBssInfo;
614 P_STA_RECORD_T prStaRec;
618 ASSERT(IS_NET_ACTIVE(prAdapter, prMsduInfo->ucNetworkType));
620 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
622 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
625 if (RLM_NET_IS_11N(prBssInfo) &&
626 (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N))) {
628 rlmFillHtOpIE(prAdapter, prBssInfo, prMsduInfo);
632 /*----------------------------------------------------------------------------*/
634 * \brief For probe response (GO, IBSS) and association response
640 /*----------------------------------------------------------------------------*/
642 rlmRspGenerateErpIE (
643 P_ADAPTER_T prAdapter,
644 P_MSDU_INFO_T prMsduInfo
647 P_BSS_INFO_T prBssInfo;
648 P_STA_RECORD_T prStaRec;
653 ASSERT(IS_NET_ACTIVE(prAdapter, prMsduInfo->ucNetworkType));
655 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
657 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
660 if (RLM_NET_IS_11GN(prBssInfo) && prBssInfo->eBand == BAND_2G4 &&
661 (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11GN))) {
662 prErpIe = (P_IE_ERP_T)
663 (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength);
666 prErpIe->ucId = ELEM_ID_ERP_INFO;
667 prErpIe->ucLength = 1;
669 prErpIe->ucERP = prBssInfo->fgObssErpProtectMode ?
670 ERP_INFO_USE_PROTECTION : 0;
672 if (prBssInfo->fgErpProtectMode) {
674 (ERP_INFO_NON_ERP_PRESENT | ERP_INFO_USE_PROTECTION);
677 /* Handle barker preamble */
678 if (!prBssInfo->fgUseShortPreamble) {
679 prErpIe->ucERP |= ERP_INFO_BARKER_PREAMBLE_MODE;
682 ASSERT(IE_SIZE(prErpIe) <= (ELEM_HDR_LEN+ ELEM_MAX_LEN_ERP));
684 prMsduInfo->u2FrameLength += IE_SIZE(prErpIe);
688 /*----------------------------------------------------------------------------*/
696 /*----------------------------------------------------------------------------*/
699 P_ADAPTER_T prAdapter,
700 P_BSS_INFO_T prBssInfo,
701 P_MSDU_INFO_T prMsduInfo
704 P_IE_HT_CAP_T prHtCap;
705 P_SUP_MCS_SET_FIELD prSupMcsSet;
706 BOOLEAN fg40mAllowed;
713 if(prMsduInfo->ucNetworkType==NETWORK_TYPE_P2P_INDEX)
715 DBGLOG(AIS, WARN,("Assoc:Force P2P BW to 20\n"));
716 prBssInfo->fgAssoc40mBwAllowed=FALSE;
721 fg40mAllowed = prBssInfo->fgAssoc40mBwAllowed;
723 prHtCap = (P_IE_HT_CAP_T)
724 (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength);
726 /* Add HT capabilities IE */
727 prHtCap->ucId = ELEM_ID_HT_CAP;
728 prHtCap->ucLength = sizeof(IE_HT_CAP_T) - ELEM_HDR_LEN;
730 prHtCap->u2HtCapInfo = HT_CAP_INFO_DEFAULT_VAL;
732 prHtCap->u2HtCapInfo &= ~(HT_CAP_INFO_SUP_CHNL_WIDTH |
733 HT_CAP_INFO_SHORT_GI_40M | HT_CAP_INFO_DSSS_CCK_IN_40M);
735 if (prAdapter->rWifiVar.rConnSettings.fgRxShortGIDisabled) {
736 prHtCap->u2HtCapInfo &=
737 ~(HT_CAP_INFO_SHORT_GI_20M | HT_CAP_INFO_SHORT_GI_40M);
740 if(prAdapter->rWifiVar.u8SupportRxSgi20 == 2) {
741 prHtCap->u2HtCapInfo &= ~(HT_CAP_INFO_SHORT_GI_20M);
743 if(prAdapter->rWifiVar.u8SupportRxSgi40 == 2) {
744 prHtCap->u2HtCapInfo &= ~(HT_CAP_INFO_SHORT_GI_40M);
746 if(prAdapter->rWifiVar.u8SupportRxGf == 2) {
747 prHtCap->u2HtCapInfo &= ~(HT_CAP_INFO_HT_GF);
750 prHtCap->ucAmpduParam = AMPDU_PARAM_DEFAULT_VAL;
752 prSupMcsSet = &prHtCap->rSupMcsSet;
753 kalMemZero((PVOID)&prSupMcsSet->aucRxMcsBitmask[0],
754 SUP_MCS_RX_BITMASK_OCTET_NUM);
756 prSupMcsSet->aucRxMcsBitmask[0] = BITS(0, 7);
759 prSupMcsSet->aucRxMcsBitmask[32/8] = BIT(0); /* MCS32 */
761 prSupMcsSet->u2RxHighestSupportedRate = SUP_MCS_RX_DEFAULT_HIGHEST_RATE;
762 prSupMcsSet->u4TxRateInfo = SUP_MCS_TX_DEFAULT_VAL;
764 prHtCap->u2HtExtendedCap = HT_EXT_CAP_DEFAULT_VAL;
765 if (!fg40mAllowed || prBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE) {
766 prHtCap->u2HtExtendedCap &=
767 ~(HT_EXT_CAP_PCO | HT_EXT_CAP_PCO_TRANS_TIME_NONE);
770 prHtCap->u4TxBeamformingCap = TX_BEAMFORMING_CAP_DEFAULT_VAL;
772 prHtCap->ucAselCap = ASEL_CAP_DEFAULT_VAL;
775 ASSERT(IE_SIZE(prHtCap) <= (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_CAP));
777 prMsduInfo->u2FrameLength += IE_SIZE(prHtCap);
780 /*----------------------------------------------------------------------------*/
788 /*----------------------------------------------------------------------------*/
791 P_ADAPTER_T prAdapter,
792 P_BSS_INFO_T prBssInfo,
793 P_MSDU_INFO_T prMsduInfo
796 P_EXT_CAP_T prExtCap;
797 BOOLEAN fg40mAllowed;
802 fg40mAllowed = prBssInfo->fgAssoc40mBwAllowed;
804 /* Add Extended Capabilities IE */
805 prExtCap = (P_EXT_CAP_T)
806 (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength);
808 prExtCap->ucId = ELEM_ID_EXTENDED_CAP;
809 prExtCap->ucLength = 1;
810 prExtCap->aucCapabilities[0] = ELEM_EXT_CAP_DEFAULT_VAL;
813 prExtCap->aucCapabilities[0] &= ~ELEM_EXT_CAP_20_40_COEXIST_SUPPORT;
816 if (prBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE) {
817 prExtCap->aucCapabilities[0] &= ~ELEM_EXT_CAP_PSMP_CAP;
820 ASSERT(IE_SIZE(prExtCap) <= (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP));
822 prMsduInfo->u2FrameLength += IE_SIZE(prExtCap);
825 /*----------------------------------------------------------------------------*/
833 /*----------------------------------------------------------------------------*/
836 P_ADAPTER_T prAdapter,
837 P_BSS_INFO_T prBssInfo,
838 P_MSDU_INFO_T prMsduInfo
848 prHtOp = (P_IE_HT_OP_T)
849 (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength);
851 /* Add HT operation IE */
852 prHtOp->ucId = ELEM_ID_HT_OP;
853 prHtOp->ucLength = sizeof(IE_HT_OP_T) - ELEM_HDR_LEN;
855 /* RIFS and 20/40 bandwidth operations are included */
856 prHtOp->ucPrimaryChannel = prBssInfo->ucPrimaryChannel;
857 prHtOp->ucInfo1 = prBssInfo->ucHtOpInfo1;
859 /* Decide HT protection mode field */
860 if (prBssInfo->eHtProtectMode == HT_PROTECT_MODE_NON_HT) {
861 prHtOp->u2Info2 = (UINT_8) HT_PROTECT_MODE_NON_HT;
863 else if (prBssInfo->eObssHtProtectMode == HT_PROTECT_MODE_NON_MEMBER) {
864 prHtOp->u2Info2 = (UINT_8) HT_PROTECT_MODE_NON_MEMBER;
867 /* It may be SYS_PROTECT_MODE_NONE or SYS_PROTECT_MODE_20M */
868 prHtOp->u2Info2 = (UINT_8) prBssInfo->eHtProtectMode;
871 if (prBssInfo->eGfOperationMode != GF_MODE_NORMAL) {
872 /* It may be GF_MODE_PROTECT or GF_MODE_DISALLOWED
873 * Note: it will also be set in ad-hoc network
875 prHtOp->u2Info2 |= HT_OP_INFO2_NON_GF_HT_STA_PRESENT;
878 if (0 /* Regulatory class 16 */ &&
879 prBssInfo->eObssHtProtectMode == HT_PROTECT_MODE_NON_MEMBER) {
880 /* (TBD) It is HT_PROTECT_MODE_NON_MEMBER, so require protection
881 * although it is possible to have no protection by spec.
883 prHtOp->u2Info2 |= HT_OP_INFO2_OBSS_NON_HT_STA_PRESENT;
886 prHtOp->u2Info3 = prBssInfo->u2HtOpInfo3; /* To do: handle L-SIG TXOP */
888 /* No basic MCSx are needed temporarily */
889 for (i = 0; i < 16; i++) {
890 prHtOp->aucBasicMcsSet[i] = 0;
893 ASSERT(IE_SIZE(prHtOp) <= (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_OP));
895 prMsduInfo->u2FrameLength += IE_SIZE(prHtOp);
898 /*----------------------------------------------------------------------------*/
900 * \brief This function should be invoked to update parameters of associated AP.
901 * (Association response and Beacon)
907 /*----------------------------------------------------------------------------*/
909 rlmRecIeInfoForClient (
910 P_ADAPTER_T prAdapter,
911 P_BSS_INFO_T prBssInfo,
917 P_STA_RECORD_T prStaRec;
918 P_IE_HT_CAP_T prHtCap;
920 P_IE_OBSS_SCAN_PARAM_T prObssScnParam;
921 UINT_8 ucERP, ucPrimaryChannel;
922 #if CFG_SUPPORT_QUIET && 0
923 BOOLEAN fgHasQuietIE = FALSE;
930 prStaRec = prBssInfo->prStaRecOfAP;
936 prBssInfo->fgUseShortPreamble = prBssInfo->fgIsShortPreambleAllowed;
937 ucPrimaryChannel = 0;
938 prObssScnParam = NULL;
940 /* Note: HT-related members in staRec may not be zero before, so
941 * if following IE does not exist, they are still not zero.
942 * These HT-related parameters are vaild only when the corresponding
943 * BssInfo supports 802.11n, i.e., RLM_NET_IS_11N()
945 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
946 switch (IE_ID(pucIE)) {
948 if (!RLM_NET_IS_11N(prBssInfo) ||
949 IE_LEN(pucIE) != (sizeof(IE_HT_CAP_T) - 2)) {
952 prHtCap = (P_IE_HT_CAP_T) pucIE;
953 prStaRec->ucMcsSet = prHtCap->rSupMcsSet.aucRxMcsBitmask[0];
954 prStaRec->fgSupMcs32 =
955 (prHtCap->rSupMcsSet.aucRxMcsBitmask[32/8] & BIT(0)) ?
958 prStaRec->u2HtCapInfo = prHtCap->u2HtCapInfo;
959 prStaRec->ucAmpduParam = prHtCap->ucAmpduParam;
960 prStaRec->u2HtExtendedCap = prHtCap->u2HtExtendedCap;
961 prStaRec->u4TxBeamformingCap = prHtCap->u4TxBeamformingCap;
962 prStaRec->ucAselCap = prHtCap->ucAselCap;
966 if (!RLM_NET_IS_11N(prBssInfo) ||
967 IE_LEN(pucIE) != (sizeof(IE_HT_OP_T) - 2)) {
970 prHtOp = (P_IE_HT_OP_T) pucIE;
971 /* Workaround that some APs fill primary channel field by its
972 * secondary channel, but its DS IE is correct 20110610
974 if (ucPrimaryChannel == 0) {
975 ucPrimaryChannel = prHtOp->ucPrimaryChannel;
977 prBssInfo->ucHtOpInfo1 = prHtOp->ucInfo1;
978 prBssInfo->u2HtOpInfo2 = prHtOp->u2Info2;
979 prBssInfo->u2HtOpInfo3 = prHtOp->u2Info3;
981 if (!prBssInfo->fg40mBwAllowed) {
982 prBssInfo->ucHtOpInfo1 &=
983 ~(HT_OP_INFO1_SCO | HT_OP_INFO1_STA_CHNL_WIDTH);
986 if ((prBssInfo->ucHtOpInfo1 & HT_OP_INFO1_SCO) != CHNL_EXT_RES) {
987 prBssInfo->eBssSCO = (ENUM_CHNL_EXT_T)
988 (prBssInfo->ucHtOpInfo1 & HT_OP_INFO1_SCO);
991 prBssInfo->eHtProtectMode = (ENUM_HT_PROTECT_MODE_T)
992 (prBssInfo->u2HtOpInfo2 & HT_OP_INFO2_HT_PROTECTION);
994 /* To do: process regulatory class 16 */
995 if ((prBssInfo->u2HtOpInfo2 & HT_OP_INFO2_OBSS_NON_HT_STA_PRESENT)
996 && 0 /* && regulatory class is 16 */) {
997 prBssInfo->eGfOperationMode = GF_MODE_DISALLOWED;
999 else if (prBssInfo->u2HtOpInfo2&HT_OP_INFO2_NON_GF_HT_STA_PRESENT) {
1000 prBssInfo->eGfOperationMode = GF_MODE_PROTECT;
1003 prBssInfo->eGfOperationMode = GF_MODE_NORMAL;
1006 prBssInfo->eRifsOperationMode =
1007 (prBssInfo->ucHtOpInfo1 & HT_OP_INFO1_RIFS_MODE) ?
1008 RIFS_MODE_NORMAL : RIFS_MODE_DISALLOWED;
1012 case ELEM_ID_20_40_BSS_COEXISTENCE:
1013 if (!RLM_NET_IS_11N(prBssInfo)) {
1016 /* To do: store if scanning exemption grant to BssInfo */
1019 case ELEM_ID_OBSS_SCAN_PARAMS:
1020 if (!RLM_NET_IS_11N(prBssInfo) ||
1021 IE_LEN(pucIE) != (sizeof(IE_OBSS_SCAN_PARAM_T) - 2)) {
1024 /* Store OBSS parameters to BssInfo */
1025 prObssScnParam = (P_IE_OBSS_SCAN_PARAM_T) pucIE;
1028 case ELEM_ID_EXTENDED_CAP:
1029 if (!RLM_NET_IS_11N(prBssInfo)) {
1032 /* To do: store extended capability (PSMP, coexist) to BssInfo */
1035 case ELEM_ID_ERP_INFO:
1036 if (IE_LEN(pucIE) != (sizeof(IE_ERP_T) - 2) ||
1037 prBssInfo->eBand != BAND_2G4) {
1040 ucERP = ERP_INFO_IE(pucIE)->ucERP;
1041 prBssInfo->fgErpProtectMode =
1042 (ucERP & ERP_INFO_USE_PROTECTION) ? TRUE : FALSE;
1044 if (ucERP & ERP_INFO_BARKER_PREAMBLE_MODE) {
1045 prBssInfo->fgUseShortPreamble = FALSE;
1049 case ELEM_ID_DS_PARAM_SET:
1050 if (IE_LEN(pucIE) == ELEM_MAX_LEN_DS_PARAMETER_SET) {
1051 ucPrimaryChannel = DS_PARAM_IE(pucIE)->ucCurrChnl;
1055 #if CFG_SUPPORT_QUIET && 0
1056 /* Note: RRM code should be moved to independent RRM function by
1057 * component design rule. But we attach it to RLM temporarily
1060 rrmQuietHandleQuietIE(prBssInfo, (P_IE_QUIET_T) pucIE);
1061 fgHasQuietIE = TRUE;
1066 } /* end of switch */
1067 } /* end of IE_FOR_EACH */
1069 /* Some AP will have wrong channel number (255) when running time.
1070 * Check if correct channel number information. 20110501
1072 if ((prBssInfo->eBand == BAND_2G4 && ucPrimaryChannel > 14) ||
1073 (prBssInfo->eBand != BAND_2G4 && (ucPrimaryChannel >= 200 ||
1074 ucPrimaryChannel <= 14))) {
1075 ucPrimaryChannel = 0;
1078 #if CFG_SUPPORT_QUIET && 0
1079 if (!fgHasQuietIE) {
1080 rrmQuietIeNotExist(prAdapter, prBssInfo);
1084 /* Check if OBSS scan process will launch */
1085 if (!prAdapter->fgEnOnlineScan || !prObssScnParam ||
1086 !(prStaRec->u2HtCapInfo & HT_CAP_INFO_SUP_CHNL_WIDTH) ||
1087 prBssInfo->eBand != BAND_2G4 || !prBssInfo->fg40mBwAllowed) {
1089 /* Note: it is ok not to stop rObssScanTimer() here */
1090 prBssInfo->u2ObssScanInterval = 0;
1093 if (prObssScnParam->u2TriggerScanInterval < OBSS_SCAN_MIN_INTERVAL) {
1094 prObssScnParam->u2TriggerScanInterval = OBSS_SCAN_MIN_INTERVAL;
1096 if (prBssInfo->u2ObssScanInterval !=
1097 prObssScnParam->u2TriggerScanInterval) {
1099 prBssInfo->u2ObssScanInterval =
1100 prObssScnParam->u2TriggerScanInterval;
1102 /* Start timer to trigger OBSS scanning */
1103 cnmTimerStartTimer(prAdapter, &prBssInfo->rObssScanTimer,
1104 prBssInfo->u2ObssScanInterval * MSEC_PER_SEC);
1108 return ucPrimaryChannel;
1111 /*----------------------------------------------------------------------------*/
1113 * \brief AIS or P2P GC.
1119 /*----------------------------------------------------------------------------*/
1121 rlmRecBcnFromNeighborForClient (
1122 P_ADAPTER_T prAdapter,
1123 P_BSS_INFO_T prBssInfo,
1129 UINT_16 u2Offset, i;
1130 UINT_8 ucPriChannel, ucSecChannel;
1131 ENUM_CHNL_EXT_T eSCO;
1132 BOOLEAN fgHtBss, fg20mReq;
1135 ASSERT(prBssInfo && prSwRfb);
1138 /* Record it to channel list to change 20/40 bandwidth */
1140 eSCO = CHNL_EXT_SCN;
1145 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1146 switch (IE_ID(pucIE)) {
1147 case ELEM_ID_HT_CAP:
1149 P_IE_HT_CAP_T prHtCap;
1151 if (IE_LEN(pucIE) != (sizeof(IE_HT_CAP_T) - 2)) {
1155 prHtCap = (P_IE_HT_CAP_T) pucIE;
1156 if (prHtCap->u2HtCapInfo & HT_CAP_INFO_40M_INTOLERANT) {
1164 P_IE_HT_OP_T prHtOp;
1166 if (IE_LEN(pucIE) != (sizeof(IE_HT_OP_T) - 2)) {
1170 prHtOp = (P_IE_HT_OP_T) pucIE;
1171 /* Workaround that some APs fill primary channel field by its
1172 * secondary channel, but its DS IE is correct 20110610
1174 if (ucPriChannel == 0) {
1175 ucPriChannel = prHtOp->ucPrimaryChannel;
1178 if ((prHtOp->ucInfo1 & HT_OP_INFO1_SCO) != CHNL_EXT_RES) {
1179 eSCO = (ENUM_CHNL_EXT_T) (prHtOp->ucInfo1 & HT_OP_INFO1_SCO);
1183 case ELEM_ID_20_40_BSS_COEXISTENCE:
1185 P_IE_20_40_COEXIST_T prCoexist;
1187 if (IE_LEN(pucIE) != (sizeof(IE_20_40_COEXIST_T) - 2)) {
1191 prCoexist = (P_IE_20_40_COEXIST_T) pucIE;
1192 if (prCoexist->ucData & BSS_COEXIST_40M_INTOLERANT) {
1197 case ELEM_ID_DS_PARAM_SET:
1198 if (IE_LEN(pucIE) != (sizeof(IE_DS_PARAM_SET_T) - 2)) {
1201 ucPriChannel = DS_PARAM_IE(pucIE)->ucCurrChnl;
1210 /* To do: Update channel list and 5G band. All channel lists have the same
1211 * update procedure. We should give it the entry pointer of desired
1214 if (HIF_RX_HDR_GET_RF_BAND(prSwRfb->prHifRxHdr) != BAND_2G4) {
1218 if (ucPriChannel == 0 || ucPriChannel > 14) {
1219 ucPriChannel = HIF_RX_HDR_GET_CHNL_NUM(prSwRfb->prHifRxHdr);
1223 ASSERT(prBssInfo->auc2G_PriChnlList[0] <= CHNL_LIST_SZ_2G);
1224 for (i = 1; i <= prBssInfo->auc2G_PriChnlList[0] &&
1225 i <= CHNL_LIST_SZ_2G; i++) {
1226 if (prBssInfo->auc2G_PriChnlList[i] == ucPriChannel) {
1230 if ((i > prBssInfo->auc2G_PriChnlList[0]) && (i <= CHNL_LIST_SZ_2G)) {
1231 prBssInfo->auc2G_PriChnlList[i] = ucPriChannel;
1232 prBssInfo->auc2G_PriChnlList[0]++;
1235 /* Update secondary channel */
1236 if (eSCO != CHNL_EXT_SCN) {
1237 ucSecChannel = (eSCO == CHNL_EXT_SCA) ?
1238 (ucPriChannel + 4) : (ucPriChannel - 4);
1240 ASSERT(prBssInfo->auc2G_SecChnlList[0] <= CHNL_LIST_SZ_2G);
1241 for (i = 1; i <= prBssInfo->auc2G_SecChnlList[0] &&
1242 i <= CHNL_LIST_SZ_2G; i++) {
1243 if (prBssInfo->auc2G_SecChnlList[i] == ucSecChannel) {
1247 if ((i > prBssInfo->auc2G_SecChnlList[0])&& (i <= CHNL_LIST_SZ_2G)){
1248 prBssInfo->auc2G_SecChnlList[i] = ucSecChannel;
1249 prBssInfo->auc2G_SecChnlList[0]++;
1253 /* Update 20M bandwidth request channels */
1255 ASSERT(prBssInfo->auc2G_20mReqChnlList[0] <= CHNL_LIST_SZ_2G);
1256 for (i = 1; i <= prBssInfo->auc2G_20mReqChnlList[0] &&
1257 i <= CHNL_LIST_SZ_2G; i++) {
1258 if (prBssInfo->auc2G_20mReqChnlList[i] == ucPriChannel) {
1262 if ((i > prBssInfo->auc2G_20mReqChnlList[0]) &&
1263 (i <= CHNL_LIST_SZ_2G)){
1264 prBssInfo->auc2G_20mReqChnlList[i] = ucPriChannel;
1265 prBssInfo->auc2G_20mReqChnlList[0]++;
1270 /* Update non-HT channel list */
1271 ASSERT(prBssInfo->auc2G_NonHtChnlList[0] <= CHNL_LIST_SZ_2G);
1272 for (i = 1; i <= prBssInfo->auc2G_NonHtChnlList[0] &&
1273 i <= CHNL_LIST_SZ_2G; i++) {
1274 if (prBssInfo->auc2G_NonHtChnlList[i] == ucPriChannel) {
1278 if ((i > prBssInfo->auc2G_NonHtChnlList[0]) && (i <= CHNL_LIST_SZ_2G)) {
1279 prBssInfo->auc2G_NonHtChnlList[i] = ucPriChannel;
1280 prBssInfo->auc2G_NonHtChnlList[0]++;
1289 /*----------------------------------------------------------------------------*/
1291 * \brief AIS or P2P GC.
1297 /*----------------------------------------------------------------------------*/
1299 rlmRecBcnInfoForClient (
1300 P_ADAPTER_T prAdapter,
1301 P_BSS_INFO_T prBssInfo,
1308 ASSERT(prBssInfo && prSwRfb);
1311 #if 0 /* SW migration 2010/8/20 */
1312 /* Note: we shall not update parameters when scanning, otherwise
1313 * channel and bandwidth will not be correct or asserted failure
1315 * Note: remove channel checking. All received Beacons should be processed
1316 * if measurement or other actions are executed in adjacent channels
1317 * and Beacon content checking mechanism is not disabled.
1319 if (IS_SCAN_ACTIVE()
1320 /* || prBssInfo->ucPrimaryChannel != CHNL_NUM_BY_SWRFB(prSwRfb) */) {
1325 /* Handle change of slot time */
1326 prBssInfo->u2CapInfo =
1327 ((P_WLAN_BEACON_FRAME_T)(prSwRfb->pvHeader))->u2CapInfo;
1328 prBssInfo->fgUseShortSlotTime =
1329 (prBssInfo->u2CapInfo & CAP_INFO_SHORT_SLOT_TIME) ? TRUE : FALSE;
1331 rlmRecIeInfoForClient(prAdapter, prBssInfo, pucIE, u2IELength);
1336 /*----------------------------------------------------------------------------*/
1344 /*----------------------------------------------------------------------------*/
1347 P_ADAPTER_T prAdapter,
1353 P_BSS_INFO_T prBssInfo;
1354 BOOLEAN fgNewParameter;
1361 fgNewParameter = FALSE;
1363 /* When concurrent networks exist, GO shall have the same handle as
1364 * the other BSS, so the Beacon shall be procesed for bandwidth and
1365 * protection mechanism.
1366 * Note1: we do not have 2 AP (GO) cases simultaneously now.
1367 * Note2: If we are GO, concurrent AIS AP should detect it and reflect
1368 * action in its Beacon, so AIS STA just follows Beacon from AP.
1370 RLM_NET_FOR_EACH_NO_BOW(ucNetIdx) {
1371 prBssInfo = &prAdapter->rWifiVar.arBssInfo[ucNetIdx];
1374 if (IS_BSS_ACTIVE(prBssInfo)) {
1375 if (prBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE &&
1376 prBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
1377 /* P2P client or AIS infra STA */
1378 if (EQUAL_MAC_ADDR(prBssInfo->aucBSSID,
1379 ((P_WLAN_MAC_MGMT_HEADER_T)
1380 (prSwRfb->pvHeader))->aucBSSID)) {
1382 fgNewParameter = rlmRecBcnInfoForClient(prAdapter,
1383 prBssInfo, prSwRfb, pucIE, u2IELength);
1386 fgNewParameter = rlmRecBcnFromNeighborForClient(prAdapter,
1387 prBssInfo, prSwRfb, pucIE, u2IELength);
1390 #if CFG_ENABLE_WIFI_DIRECT
1391 else if (prAdapter->fgIsP2PRegistered &&
1392 (prBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT ||
1393 prBssInfo->eCurrentOPMode == OP_MODE_P2P_DEVICE)) {
1394 /* AP scan to check if 20/40M bandwidth is permitted */
1395 rlmRecBcnFromNeighborForClient(prAdapter,
1396 prBssInfo, prSwRfb, pucIE, u2IELength);
1399 else if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
1403 /* Appy new parameters if necessary */
1404 if (fgNewParameter) {
1405 rlmSyncOperationParams(prAdapter, prBssInfo);
1406 fgNewParameter = FALSE;
1408 } /* end of IS_BSS_ACTIVE() */
1409 } /* end of RLM_NET_FOR_EACH_NO_BOW */
1412 /*----------------------------------------------------------------------------*/
1414 * \brief This function should be invoked after judging successful association.
1420 /*----------------------------------------------------------------------------*/
1422 rlmProcessAssocRsp (
1423 P_ADAPTER_T prAdapter,
1429 P_BSS_INFO_T prBssInfo;
1430 P_STA_RECORD_T prStaRec;
1431 UINT_8 ucPriChannel;
1437 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1442 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1444 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
1445 ASSERT(prStaRec == prBssInfo->prStaRecOfAP);
1447 /* To do: the invoked function is used to clear all members. It may be
1448 * done by center mechanism in invoker.
1450 rlmBssReset(prAdapter, prBssInfo);
1452 prBssInfo->fgUseShortSlotTime =
1453 (prBssInfo->u2CapInfo & CAP_INFO_SHORT_SLOT_TIME) ? TRUE : FALSE;
1456 rlmRecIeInfoForClient(prAdapter, prBssInfo, pucIE, u2IELength)) > 0) {
1457 prBssInfo->ucPrimaryChannel = ucPriChannel;
1460 if (!RLM_NET_IS_11N(prBssInfo) ||
1461 !(prStaRec->u2HtCapInfo & HT_CAP_INFO_SUP_CHNL_WIDTH)) {
1462 prBssInfo->fg40mBwAllowed = FALSE;
1465 /* Note: Update its capabilities to WTBL by cnmStaRecChangeState(), which
1466 * shall be invoked afterwards.
1467 * Update channel, bandwidth and protection mode by nicUpdateBss()
1470 if(prStaRec->ucNetTypeIndex==NETWORK_TYPE_P2P_INDEX)
1473 DBGLOG(AIS, WARN, ("Force P2P BW to 20\n"));
1474 prBssInfo->fgAssoc40mBwAllowed=FALSE;
1481 /*----------------------------------------------------------------------------*/
1483 * \brief This function should be invoked after judging successful association.
1489 /*----------------------------------------------------------------------------*/
1491 rlmFillSyncCmdParam (
1492 P_CMD_SET_BSS_RLM_PARAM_T prCmdBody,
1493 P_BSS_INFO_T prBssInfo
1496 ASSERT(prCmdBody && prBssInfo);
1497 if (!prCmdBody || !prBssInfo) {
1501 prCmdBody->ucNetTypeIndex = prBssInfo->ucNetTypeIndex;
1502 prCmdBody->ucRfBand = (UINT_8) prBssInfo->eBand;
1503 prCmdBody->ucPrimaryChannel = prBssInfo->ucPrimaryChannel;
1504 prCmdBody->ucRfSco = (UINT_8) prBssInfo->eBssSCO;
1505 prCmdBody->ucErpProtectMode = (UINT_8) prBssInfo->fgErpProtectMode;
1506 prCmdBody->ucHtProtectMode = (UINT_8) prBssInfo->eHtProtectMode;
1507 prCmdBody->ucGfOperationMode = (UINT_8) prBssInfo->eGfOperationMode;
1508 prCmdBody->ucTxRifsMode = (UINT_8) prBssInfo->eRifsOperationMode;
1509 prCmdBody->u2HtOpInfo3 = prBssInfo->u2HtOpInfo3;
1510 prCmdBody->u2HtOpInfo2 = prBssInfo->u2HtOpInfo2;
1511 prCmdBody->ucHtOpInfo1 = prBssInfo->ucHtOpInfo1;
1512 prCmdBody->ucUseShortPreamble = prBssInfo->fgUseShortPreamble;
1513 prCmdBody->ucUseShortSlotTime = prBssInfo->fgUseShortSlotTime;
1514 prCmdBody->ucCheckId = 0x72;
1516 if (RLM_NET_PARAM_VALID(prBssInfo)) {
1517 DBGLOG(RLM, INFO, ("N=%d b=%d c=%d s=%d e=%d h=%d I=0x%02x l=%d p=%d\n",
1518 prCmdBody->ucNetTypeIndex, prCmdBody->ucRfBand,
1519 prCmdBody->ucPrimaryChannel, prCmdBody->ucRfSco,
1520 prCmdBody->ucErpProtectMode, prCmdBody->ucHtProtectMode,
1521 prCmdBody->ucHtOpInfo1, prCmdBody->ucUseShortSlotTime,
1522 prCmdBody->ucUseShortPreamble));
1525 DBGLOG(RLM, INFO, ("N=%d closed\n", prCmdBody->ucNetTypeIndex));
1529 /*----------------------------------------------------------------------------*/
1531 * \brief This function will operation parameters based on situations of
1532 * concurrent networks. Channel, bandwidth, protection mode, supported
1533 * rate will be modified.
1539 /*----------------------------------------------------------------------------*/
1541 rlmSyncOperationParams (
1542 P_ADAPTER_T prAdapter,
1543 P_BSS_INFO_T prBssInfo
1546 P_CMD_SET_BSS_RLM_PARAM_T prCmdBody;
1547 WLAN_STATUS rStatus;
1552 prCmdBody = (P_CMD_SET_BSS_RLM_PARAM_T)
1553 cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_SET_BSS_RLM_PARAM_T));
1556 /* To do: exception handle */
1558 DBGLOG(RLM, WARN, ("No buf for sync RLM params (Net=%d)\n",
1559 prBssInfo->ucNetTypeIndex));
1563 rlmFillSyncCmdParam(prCmdBody, prBssInfo);
1565 rStatus = wlanSendSetQueryCmd (
1566 prAdapter, /* prAdapter */
1567 CMD_ID_SET_BSS_RLM_PARAM, /* ucCID */
1568 TRUE, /* fgSetQuery */
1569 FALSE, /* fgNeedResp */
1570 FALSE, /* fgIsOid */
1571 NULL, /* pfCmdDoneHandler */
1572 NULL, /* pfCmdTimeoutHandler */
1573 sizeof(CMD_SET_BSS_RLM_PARAM_T), /* u4SetQueryInfoLen */
1574 (PUINT_8) prCmdBody, /* pucInfoBuffer */
1575 NULL, /* pvSetQueryBuffer */
1576 0 /* u4SetQueryBufferLen */
1579 ASSERT(rStatus == WLAN_STATUS_PENDING);
1581 cnmMemFree(prAdapter, prCmdBody);
1585 /*----------------------------------------------------------------------------*/
1587 * \brief This function should be invoked after judging successful association.
1593 /*----------------------------------------------------------------------------*/
1595 rlmProcessAssocReq (
1596 P_ADAPTER_T prAdapter,
1602 P_BSS_INFO_T prBssInfo;
1603 P_STA_RECORD_T prStaRec;
1605 P_IE_HT_CAP_T prHtCap;
1611 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1616 ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1618 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
1620 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1621 switch (IE_ID(pucIE)) {
1622 case ELEM_ID_HT_CAP:
1623 if (!RLM_NET_IS_11N(prBssInfo) ||
1624 IE_LEN(pucIE) != (sizeof(IE_HT_CAP_T) - 2)) {
1627 prHtCap = (P_IE_HT_CAP_T) pucIE;
1628 prStaRec->ucMcsSet = prHtCap->rSupMcsSet.aucRxMcsBitmask[0];
1629 prStaRec->fgSupMcs32 =
1630 (prHtCap->rSupMcsSet.aucRxMcsBitmask[32/8] & BIT(0)) ?
1633 prStaRec->u2HtCapInfo = prHtCap->u2HtCapInfo;
1634 prStaRec->ucAmpduParam = prHtCap->ucAmpduParam;
1635 prStaRec->u2HtExtendedCap = prHtCap->u2HtExtendedCap;
1636 prStaRec->u4TxBeamformingCap = prHtCap->u4TxBeamformingCap;
1637 prStaRec->ucAselCap = prHtCap->ucAselCap;
1642 } /* end of switch */
1643 } /* end of IE_FOR_EACH */
1645 #endif /* CFG_SUPPORT_AAA */
1647 /*----------------------------------------------------------------------------*/
1649 * \brief It is for both STA and AP modes
1655 /*----------------------------------------------------------------------------*/
1657 rlmBssInitForAPandIbss (
1658 P_ADAPTER_T prAdapter,
1659 P_BSS_INFO_T prBssInfo
1665 #if CFG_ENABLE_WIFI_DIRECT
1666 if (prAdapter->fgIsP2PRegistered &&
1667 prBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT) {
1669 rlmBssInitForAP(prAdapter, prBssInfo);
1674 /*----------------------------------------------------------------------------*/
1676 * \brief It is for both STA and AP modes
1682 /*----------------------------------------------------------------------------*/
1685 P_ADAPTER_T prAdapter,
1686 P_BSS_INFO_T prBssInfo
1692 rlmBssReset(prAdapter, prBssInfo);
1694 prBssInfo->fg40mBwAllowed = FALSE;
1695 prBssInfo->fgAssoc40mBwAllowed = FALSE;
1697 /* Assume FW state is updated by CMD_ID_SET_BSS_INFO, so
1698 * the sync CMD is not needed here.
1702 /*----------------------------------------------------------------------------*/
1704 * \brief All RLM timers will also be stopped.
1710 /*----------------------------------------------------------------------------*/
1713 P_ADAPTER_T prAdapter,
1714 P_BSS_INFO_T prBssInfo
1720 /* HT related parameters */
1721 prBssInfo->ucHtOpInfo1 = 0; /* RIFS disabled. 20MHz */
1722 prBssInfo->u2HtOpInfo2 = 0;
1723 prBssInfo->u2HtOpInfo3 = 0;
1725 prBssInfo->eBssSCO = 0;
1726 prBssInfo->fgErpProtectMode = 0;
1727 prBssInfo->eHtProtectMode = 0;
1728 prBssInfo->eGfOperationMode = 0;
1729 prBssInfo->eRifsOperationMode = 0;
1731 /* OBSS related parameters */
1732 prBssInfo->auc2G_20mReqChnlList[0] = 0;
1733 prBssInfo->auc2G_NonHtChnlList[0] = 0;
1734 prBssInfo->auc2G_PriChnlList[0] = 0;
1735 prBssInfo->auc2G_SecChnlList[0] = 0;
1736 prBssInfo->auc5G_20mReqChnlList[0] = 0;
1737 prBssInfo->auc5G_NonHtChnlList[0] = 0;
1738 prBssInfo->auc5G_PriChnlList[0] = 0;
1739 prBssInfo->auc5G_SecChnlList[0] = 0;
1741 /* All RLM timers will also be stopped */
1742 cnmTimerStopTimer(prAdapter, &prBssInfo->rObssScanTimer);
1743 prBssInfo->u2ObssScanInterval = 0;
1745 prBssInfo->fgObssErpProtectMode = 0; /* GO only */
1746 prBssInfo->eObssHtProtectMode = 0; /* GO only */
1747 prBssInfo->eObssGfOperationMode = 0; /* GO only */
1748 prBssInfo->fgObssRifsOperationMode = 0; /* GO only */
1749 prBssInfo->fgObssActionForcedTo20M = 0; /* GO only */
1750 prBssInfo->fgObssBeaconForcedTo20M = 0; /* GO only */