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 ********************************************************************************
352 static VOID
rlmFillHtCapIE(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
, P_MSDU_INFO_T prMsduInfo
);
355 rlmFillExtCapIE(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
, P_MSDU_INFO_T prMsduInfo
);
357 static VOID
rlmFillHtOpIE(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
, P_MSDU_INFO_T prMsduInfo
);
360 rlmRecIeInfoForClient(P_ADAPTER_T prAdapter
,
361 P_BSS_INFO_T prBssInfo
, PUINT_8 pucIE
, UINT_16 u2IELength
);
364 rlmRecBcnFromNeighborForClient(P_ADAPTER_T prAdapter
,
365 P_BSS_INFO_T prBssInfo
,
366 P_SW_RFB_T prSwRfb
, PUINT_8 pucIE
, UINT_16 u2IELength
);
369 rlmRecBcnInfoForClient(P_ADAPTER_T prAdapter
,
370 P_BSS_INFO_T prBssInfo
,
371 P_SW_RFB_T prSwRfb
, PUINT_8 pucIE
, UINT_16 u2IELength
);
373 static VOID
rlmBssReset(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
);
375 /*******************************************************************************
377 ********************************************************************************
380 /*----------------------------------------------------------------------------*/
388 /*----------------------------------------------------------------------------*/
389 VOID
rlmFsmEventInit(P_ADAPTER_T prAdapter
)
393 /* Note: assume TIMER_T structures are reset to zero or stopped
394 * before invoking this function.
397 /* Initialize OBSS FSM */
398 rlmObssInit(prAdapter
);
401 /*----------------------------------------------------------------------------*/
409 /*----------------------------------------------------------------------------*/
410 VOID
rlmFsmEventUninit(P_ADAPTER_T prAdapter
)
412 P_BSS_INFO_T prBssInfo
;
417 RLM_NET_FOR_EACH(ucNetIdx
) {
418 prBssInfo
= &prAdapter
->rWifiVar
.arBssInfo
[ucNetIdx
];
421 /* Note: all RLM timers will also be stopped.
422 * Now only one OBSS scan timer.
424 rlmBssReset(prAdapter
, prBssInfo
);
428 /*----------------------------------------------------------------------------*/
430 * \brief For probe request, association request
436 /*----------------------------------------------------------------------------*/
437 VOID
rlmReqGenerateHtCapIE(P_ADAPTER_T prAdapter
, P_MSDU_INFO_T prMsduInfo
)
439 P_BSS_INFO_T prBssInfo
;
440 P_STA_RECORD_T prStaRec
;
445 prBssInfo
= &prAdapter
->rWifiVar
.arBssInfo
[prMsduInfo
->ucNetworkType
];
448 prStaRec
= cnmGetStaRecByIndex(prAdapter
, prMsduInfo
->ucStaRecIndex
);
450 if ((prAdapter
->rWifiVar
.ucAvailablePhyTypeSet
& PHY_TYPE_SET_802_11N
) &&
451 (!prStaRec
|| (prStaRec
->ucPhyTypeSet
& PHY_TYPE_SET_802_11N
))) {
453 rlmFillHtCapIE(prAdapter
, prBssInfo
, prMsduInfo
);
457 /*----------------------------------------------------------------------------*/
459 * \brief For probe request, association request
465 /*----------------------------------------------------------------------------*/
466 VOID
rlmReqGenerateExtCapIE(P_ADAPTER_T prAdapter
, P_MSDU_INFO_T prMsduInfo
)
468 P_BSS_INFO_T prBssInfo
;
469 P_STA_RECORD_T prStaRec
;
474 prBssInfo
= &prAdapter
->rWifiVar
.arBssInfo
[prMsduInfo
->ucNetworkType
];
477 prStaRec
= cnmGetStaRecByIndex(prAdapter
, prMsduInfo
->ucStaRecIndex
);
479 if ((prAdapter
->rWifiVar
.ucAvailablePhyTypeSet
& PHY_TYPE_SET_802_11N
) &&
480 (!prStaRec
|| (prStaRec
->ucPhyTypeSet
& PHY_TYPE_SET_802_11N
))) {
482 rlmFillExtCapIE(prAdapter
, prBssInfo
, prMsduInfo
);
486 /*----------------------------------------------------------------------------*/
488 * \brief For probe response (GO, IBSS) and association response
494 /*----------------------------------------------------------------------------*/
495 VOID
rlmRspGenerateHtCapIE(P_ADAPTER_T prAdapter
, P_MSDU_INFO_T prMsduInfo
)
497 P_BSS_INFO_T prBssInfo
;
498 P_STA_RECORD_T prStaRec
;
502 ASSERT(IS_NET_ACTIVE(prAdapter
, prMsduInfo
->ucNetworkType
));
504 prBssInfo
= &prAdapter
->rWifiVar
.arBssInfo
[prMsduInfo
->ucNetworkType
];
507 prStaRec
= cnmGetStaRecByIndex(prAdapter
, prMsduInfo
->ucStaRecIndex
);
509 if (RLM_NET_IS_11N(prBssInfo
) &&
510 (!prStaRec
|| (prStaRec
->ucPhyTypeSet
& PHY_TYPE_SET_802_11N
))) {
512 rlmFillHtCapIE(prAdapter
, prBssInfo
, prMsduInfo
);
516 /*----------------------------------------------------------------------------*/
518 * \brief For probe response (GO, IBSS) and association response
524 /*----------------------------------------------------------------------------*/
525 VOID
rlmRspGenerateExtCapIE(P_ADAPTER_T prAdapter
, P_MSDU_INFO_T prMsduInfo
)
527 P_BSS_INFO_T prBssInfo
;
528 P_STA_RECORD_T prStaRec
;
532 ASSERT(IS_NET_ACTIVE(prAdapter
, prMsduInfo
->ucNetworkType
));
534 prBssInfo
= &prAdapter
->rWifiVar
.arBssInfo
[prMsduInfo
->ucNetworkType
];
537 prStaRec
= cnmGetStaRecByIndex(prAdapter
, prMsduInfo
->ucStaRecIndex
);
539 if (RLM_NET_IS_11N(prBssInfo
) &&
540 (!prStaRec
|| (prStaRec
->ucPhyTypeSet
& PHY_TYPE_SET_802_11N
))) {
542 rlmFillExtCapIE(prAdapter
, prBssInfo
, prMsduInfo
);
546 /*----------------------------------------------------------------------------*/
548 * \brief For probe response (GO, IBSS) and association response
554 /*----------------------------------------------------------------------------*/
555 VOID
rlmRspGenerateHtOpIE(P_ADAPTER_T prAdapter
, P_MSDU_INFO_T prMsduInfo
)
557 P_BSS_INFO_T prBssInfo
;
558 P_STA_RECORD_T prStaRec
;
562 ASSERT(IS_NET_ACTIVE(prAdapter
, prMsduInfo
->ucNetworkType
));
564 prStaRec
= cnmGetStaRecByIndex(prAdapter
, prMsduInfo
->ucStaRecIndex
);
566 prBssInfo
= &prAdapter
->rWifiVar
.arBssInfo
[prMsduInfo
->ucNetworkType
];
569 if (RLM_NET_IS_11N(prBssInfo
) &&
570 (!prStaRec
|| (prStaRec
->ucPhyTypeSet
& PHY_TYPE_SET_802_11N
))) {
572 rlmFillHtOpIE(prAdapter
, prBssInfo
, prMsduInfo
);
576 /*----------------------------------------------------------------------------*/
578 * \brief For probe response (GO, IBSS) and association response
584 /*----------------------------------------------------------------------------*/
585 VOID
rlmRspGenerateErpIE(P_ADAPTER_T prAdapter
, P_MSDU_INFO_T prMsduInfo
)
587 P_BSS_INFO_T prBssInfo
;
588 P_STA_RECORD_T prStaRec
;
593 ASSERT(IS_NET_ACTIVE(prAdapter
, prMsduInfo
->ucNetworkType
));
595 prStaRec
= cnmGetStaRecByIndex(prAdapter
, prMsduInfo
->ucStaRecIndex
);
597 prBssInfo
= &prAdapter
->rWifiVar
.arBssInfo
[prMsduInfo
->ucNetworkType
];
600 if (RLM_NET_IS_11GN(prBssInfo
) && prBssInfo
->eBand
== BAND_2G4
&&
601 (!prStaRec
|| (prStaRec
->ucPhyTypeSet
& PHY_TYPE_SET_802_11GN
))) {
602 prErpIe
= (P_IE_ERP_T
)
603 (((PUINT_8
) prMsduInfo
->prPacket
) + prMsduInfo
->u2FrameLength
);
606 prErpIe
->ucId
= ELEM_ID_ERP_INFO
;
607 prErpIe
->ucLength
= 1;
609 prErpIe
->ucERP
= prBssInfo
->fgObssErpProtectMode
? ERP_INFO_USE_PROTECTION
: 0;
611 if (prBssInfo
->fgErpProtectMode
) {
612 prErpIe
->ucERP
|= (ERP_INFO_NON_ERP_PRESENT
| ERP_INFO_USE_PROTECTION
);
615 /* Handle barker preamble */
616 if (!prBssInfo
->fgUseShortPreamble
) {
617 prErpIe
->ucERP
|= ERP_INFO_BARKER_PREAMBLE_MODE
;
620 ASSERT(IE_SIZE(prErpIe
) <= (ELEM_HDR_LEN
+ ELEM_MAX_LEN_ERP
));
622 prMsduInfo
->u2FrameLength
+= IE_SIZE(prErpIe
);
626 /*----------------------------------------------------------------------------*/
634 /*----------------------------------------------------------------------------*/
635 static VOID
rlmFillHtCapIE(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
, P_MSDU_INFO_T prMsduInfo
)
637 P_IE_HT_CAP_T prHtCap
;
638 P_SUP_MCS_SET_FIELD prSupMcsSet
;
639 BOOLEAN fg40mAllowed
;
646 if (prMsduInfo
->ucNetworkType
== NETWORK_TYPE_P2P_INDEX
) {
647 DBGLOG(AIS
, WARN
, ("Assoc:Force P2P BW to 20\n"));
648 prBssInfo
->fgAssoc40mBwAllowed
= FALSE
;
653 fg40mAllowed
= prBssInfo
->fgAssoc40mBwAllowed
;
655 prHtCap
= (P_IE_HT_CAP_T
)
656 (((PUINT_8
) prMsduInfo
->prPacket
) + prMsduInfo
->u2FrameLength
);
658 /* Add HT capabilities IE */
659 prHtCap
->ucId
= ELEM_ID_HT_CAP
;
660 prHtCap
->ucLength
= sizeof(IE_HT_CAP_T
) - ELEM_HDR_LEN
;
662 prHtCap
->u2HtCapInfo
= HT_CAP_INFO_DEFAULT_VAL
;
664 prHtCap
->u2HtCapInfo
&= ~(HT_CAP_INFO_SUP_CHNL_WIDTH
|
665 HT_CAP_INFO_SHORT_GI_40M
| HT_CAP_INFO_DSSS_CCK_IN_40M
);
667 if (prAdapter
->rWifiVar
.rConnSettings
.fgRxShortGIDisabled
) {
668 prHtCap
->u2HtCapInfo
&= ~(HT_CAP_INFO_SHORT_GI_20M
| HT_CAP_INFO_SHORT_GI_40M
);
671 if (prAdapter
->rWifiVar
.u8SupportRxSgi20
== 2) {
672 prHtCap
->u2HtCapInfo
&= ~(HT_CAP_INFO_SHORT_GI_20M
);
674 if (prAdapter
->rWifiVar
.u8SupportRxSgi40
== 2) {
675 prHtCap
->u2HtCapInfo
&= ~(HT_CAP_INFO_SHORT_GI_40M
);
677 if (prAdapter
->rWifiVar
.u8SupportRxGf
== 2) {
678 prHtCap
->u2HtCapInfo
&= ~(HT_CAP_INFO_HT_GF
);
681 prHtCap
->ucAmpduParam
= AMPDU_PARAM_DEFAULT_VAL
;
683 prSupMcsSet
= &prHtCap
->rSupMcsSet
;
684 kalMemZero((PVOID
) & prSupMcsSet
->aucRxMcsBitmask
[0], SUP_MCS_RX_BITMASK_OCTET_NUM
);
686 prSupMcsSet
->aucRxMcsBitmask
[0] = BITS(0, 7);
689 prSupMcsSet
->aucRxMcsBitmask
[32 / 8] = BIT(0); /* MCS32 */
691 prSupMcsSet
->u2RxHighestSupportedRate
= SUP_MCS_RX_DEFAULT_HIGHEST_RATE
;
692 prSupMcsSet
->u4TxRateInfo
= SUP_MCS_TX_DEFAULT_VAL
;
694 prHtCap
->u2HtExtendedCap
= HT_EXT_CAP_DEFAULT_VAL
;
695 if (!fg40mAllowed
|| prBssInfo
->eCurrentOPMode
!= OP_MODE_INFRASTRUCTURE
) {
696 prHtCap
->u2HtExtendedCap
&= ~(HT_EXT_CAP_PCO
| HT_EXT_CAP_PCO_TRANS_TIME_NONE
);
699 prHtCap
->u4TxBeamformingCap
= TX_BEAMFORMING_CAP_DEFAULT_VAL
;
701 prHtCap
->ucAselCap
= ASEL_CAP_DEFAULT_VAL
;
704 ASSERT(IE_SIZE(prHtCap
) <= (ELEM_HDR_LEN
+ ELEM_MAX_LEN_HT_CAP
));
706 prMsduInfo
->u2FrameLength
+= IE_SIZE(prHtCap
);
709 /*----------------------------------------------------------------------------*/
717 /*----------------------------------------------------------------------------*/
718 static VOID
rlmFillExtCapIE(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
, P_MSDU_INFO_T prMsduInfo
)
720 P_EXT_CAP_T prExtCap
;
721 BOOLEAN fg40mAllowed
;
726 fg40mAllowed
= prBssInfo
->fgAssoc40mBwAllowed
;
728 /* Add Extended Capabilities IE */
729 prExtCap
= (P_EXT_CAP_T
)
730 (((PUINT_8
) prMsduInfo
->prPacket
) + prMsduInfo
->u2FrameLength
);
732 prExtCap
->ucId
= ELEM_ID_EXTENDED_CAP
;
733 prExtCap
->ucLength
= 1;
734 prExtCap
->aucCapabilities
[0] = ELEM_EXT_CAP_DEFAULT_VAL
;
737 prExtCap
->aucCapabilities
[0] &= ~ELEM_EXT_CAP_20_40_COEXIST_SUPPORT
;
740 if (prBssInfo
->eCurrentOPMode
!= OP_MODE_INFRASTRUCTURE
) {
741 prExtCap
->aucCapabilities
[0] &= ~ELEM_EXT_CAP_PSMP_CAP
;
744 ASSERT(IE_SIZE(prExtCap
) <= (ELEM_HDR_LEN
+ ELEM_MAX_LEN_EXT_CAP
));
746 prMsduInfo
->u2FrameLength
+= IE_SIZE(prExtCap
);
749 /*----------------------------------------------------------------------------*/
757 /*----------------------------------------------------------------------------*/
758 static VOID
rlmFillHtOpIE(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
, P_MSDU_INFO_T prMsduInfo
)
767 prHtOp
= (P_IE_HT_OP_T
)
768 (((PUINT_8
) prMsduInfo
->prPacket
) + prMsduInfo
->u2FrameLength
);
770 /* Add HT operation IE */
771 prHtOp
->ucId
= ELEM_ID_HT_OP
;
772 prHtOp
->ucLength
= sizeof(IE_HT_OP_T
) - ELEM_HDR_LEN
;
774 /* RIFS and 20/40 bandwidth operations are included */
775 prHtOp
->ucPrimaryChannel
= prBssInfo
->ucPrimaryChannel
;
776 prHtOp
->ucInfo1
= prBssInfo
->ucHtOpInfo1
;
778 /* Decide HT protection mode field */
779 if (prBssInfo
->eHtProtectMode
== HT_PROTECT_MODE_NON_HT
) {
780 prHtOp
->u2Info2
= (UINT_8
) HT_PROTECT_MODE_NON_HT
;
781 } else if (prBssInfo
->eObssHtProtectMode
== HT_PROTECT_MODE_NON_MEMBER
) {
782 prHtOp
->u2Info2
= (UINT_8
) HT_PROTECT_MODE_NON_MEMBER
;
784 /* It may be SYS_PROTECT_MODE_NONE or SYS_PROTECT_MODE_20M */
785 prHtOp
->u2Info2
= (UINT_8
) prBssInfo
->eHtProtectMode
;
788 if (prBssInfo
->eGfOperationMode
!= GF_MODE_NORMAL
) {
789 /* It may be GF_MODE_PROTECT or GF_MODE_DISALLOWED
790 * Note: it will also be set in ad-hoc network
792 prHtOp
->u2Info2
|= HT_OP_INFO2_NON_GF_HT_STA_PRESENT
;
795 if (0 /* Regulatory class 16 */ &&
796 prBssInfo
->eObssHtProtectMode
== HT_PROTECT_MODE_NON_MEMBER
) {
797 /* (TBD) It is HT_PROTECT_MODE_NON_MEMBER, so require protection
798 * although it is possible to have no protection by spec.
800 prHtOp
->u2Info2
|= HT_OP_INFO2_OBSS_NON_HT_STA_PRESENT
;
803 prHtOp
->u2Info3
= prBssInfo
->u2HtOpInfo3
; /* To do: handle L-SIG TXOP */
805 /* No basic MCSx are needed temporarily */
806 for (i
= 0; i
< 16; i
++) {
807 prHtOp
->aucBasicMcsSet
[i
] = 0;
810 ASSERT(IE_SIZE(prHtOp
) <= (ELEM_HDR_LEN
+ ELEM_MAX_LEN_HT_OP
));
812 prMsduInfo
->u2FrameLength
+= IE_SIZE(prHtOp
);
815 /*----------------------------------------------------------------------------*/
817 * \brief This function should be invoked to update parameters of associated AP.
818 * (Association response and Beacon)
824 /*----------------------------------------------------------------------------*/
826 rlmRecIeInfoForClient(P_ADAPTER_T prAdapter
,
827 P_BSS_INFO_T prBssInfo
, PUINT_8 pucIE
, UINT_16 u2IELength
)
830 P_STA_RECORD_T prStaRec
;
831 P_IE_HT_CAP_T prHtCap
;
833 P_IE_OBSS_SCAN_PARAM_T prObssScnParam
;
834 UINT_8 ucERP
, ucPrimaryChannel
;
835 #if CFG_SUPPORT_QUIET && 0
836 BOOLEAN fgHasQuietIE
= FALSE
;
843 prStaRec
= prBssInfo
->prStaRecOfAP
;
849 prBssInfo
->fgUseShortPreamble
= prBssInfo
->fgIsShortPreambleAllowed
;
850 ucPrimaryChannel
= 0;
851 prObssScnParam
= NULL
;
853 /* Note: HT-related members in staRec may not be zero before, so
854 * if following IE does not exist, they are still not zero.
855 * These HT-related parameters are vaild only when the corresponding
856 * BssInfo supports 802.11n, i.e., RLM_NET_IS_11N()
858 IE_FOR_EACH(pucIE
, u2IELength
, u2Offset
) {
859 switch (IE_ID(pucIE
)) {
861 if (!RLM_NET_IS_11N(prBssInfo
) ||
862 IE_LEN(pucIE
) != (sizeof(IE_HT_CAP_T
) - 2)) {
865 prHtCap
= (P_IE_HT_CAP_T
) pucIE
;
866 prStaRec
->ucMcsSet
= prHtCap
->rSupMcsSet
.aucRxMcsBitmask
[0];
867 prStaRec
->fgSupMcs32
=
868 (prHtCap
->rSupMcsSet
.aucRxMcsBitmask
[32 / 8] & BIT(0)) ? TRUE
: FALSE
;
870 prStaRec
->u2HtCapInfo
= prHtCap
->u2HtCapInfo
;
871 prStaRec
->ucAmpduParam
= prHtCap
->ucAmpduParam
;
872 prStaRec
->u2HtExtendedCap
= prHtCap
->u2HtExtendedCap
;
873 prStaRec
->u4TxBeamformingCap
= prHtCap
->u4TxBeamformingCap
;
874 prStaRec
->ucAselCap
= prHtCap
->ucAselCap
;
878 if (!RLM_NET_IS_11N(prBssInfo
) || IE_LEN(pucIE
) != (sizeof(IE_HT_OP_T
) - 2)) {
881 prHtOp
= (P_IE_HT_OP_T
) pucIE
;
882 /* Workaround that some APs fill primary channel field by its
883 * secondary channel, but its DS IE is correct 20110610
885 if (ucPrimaryChannel
== 0) {
886 ucPrimaryChannel
= prHtOp
->ucPrimaryChannel
;
888 prBssInfo
->ucHtOpInfo1
= prHtOp
->ucInfo1
;
889 prBssInfo
->u2HtOpInfo2
= prHtOp
->u2Info2
;
890 prBssInfo
->u2HtOpInfo3
= prHtOp
->u2Info3
;
892 if (!prBssInfo
->fg40mBwAllowed
) {
893 prBssInfo
->ucHtOpInfo1
&=
894 ~(HT_OP_INFO1_SCO
| HT_OP_INFO1_STA_CHNL_WIDTH
);
897 if ((prBssInfo
->ucHtOpInfo1
& HT_OP_INFO1_SCO
) != CHNL_EXT_RES
) {
898 prBssInfo
->eBssSCO
= (ENUM_CHNL_EXT_T
)
899 (prBssInfo
->ucHtOpInfo1
& HT_OP_INFO1_SCO
);
902 prBssInfo
->eHtProtectMode
= (ENUM_HT_PROTECT_MODE_T
)
903 (prBssInfo
->u2HtOpInfo2
& HT_OP_INFO2_HT_PROTECTION
);
905 /* To do: process regulatory class 16 */
906 if ((prBssInfo
->u2HtOpInfo2
& HT_OP_INFO2_OBSS_NON_HT_STA_PRESENT
)
907 && 0 /* && regulatory class is 16 */) {
908 prBssInfo
->eGfOperationMode
= GF_MODE_DISALLOWED
;
909 } else if (prBssInfo
->u2HtOpInfo2
& HT_OP_INFO2_NON_GF_HT_STA_PRESENT
) {
910 prBssInfo
->eGfOperationMode
= GF_MODE_PROTECT
;
912 prBssInfo
->eGfOperationMode
= GF_MODE_NORMAL
;
915 prBssInfo
->eRifsOperationMode
=
916 (prBssInfo
->ucHtOpInfo1
& HT_OP_INFO1_RIFS_MODE
) ?
917 RIFS_MODE_NORMAL
: RIFS_MODE_DISALLOWED
;
921 case ELEM_ID_20_40_BSS_COEXISTENCE
:
922 if (!RLM_NET_IS_11N(prBssInfo
)) {
925 /* To do: store if scanning exemption grant to BssInfo */
928 case ELEM_ID_OBSS_SCAN_PARAMS
:
929 if (!RLM_NET_IS_11N(prBssInfo
) ||
930 IE_LEN(pucIE
) != (sizeof(IE_OBSS_SCAN_PARAM_T
) - 2)) {
933 /* Store OBSS parameters to BssInfo */
934 prObssScnParam
= (P_IE_OBSS_SCAN_PARAM_T
) pucIE
;
937 case ELEM_ID_EXTENDED_CAP
:
938 if (!RLM_NET_IS_11N(prBssInfo
)) {
941 /* To do: store extended capability (PSMP, coexist) to BssInfo */
944 case ELEM_ID_ERP_INFO
:
945 if (IE_LEN(pucIE
) != (sizeof(IE_ERP_T
) - 2) || prBssInfo
->eBand
!= BAND_2G4
) {
948 ucERP
= ERP_INFO_IE(pucIE
)->ucERP
;
949 prBssInfo
->fgErpProtectMode
=
950 (ucERP
& ERP_INFO_USE_PROTECTION
) ? TRUE
: FALSE
;
952 if (ucERP
& ERP_INFO_BARKER_PREAMBLE_MODE
) {
953 prBssInfo
->fgUseShortPreamble
= FALSE
;
957 case ELEM_ID_DS_PARAM_SET
:
958 if (IE_LEN(pucIE
) == ELEM_MAX_LEN_DS_PARAMETER_SET
) {
959 ucPrimaryChannel
= DS_PARAM_IE(pucIE
)->ucCurrChnl
;
963 #if CFG_SUPPORT_QUIET && 0
964 /* Note: RRM code should be moved to independent RRM function by
965 * component design rule. But we attach it to RLM temporarily
968 rrmQuietHandleQuietIE(prBssInfo
, (P_IE_QUIET_T
) pucIE
);
974 } /* end of switch */
975 } /* end of IE_FOR_EACH */
977 /* Some AP will have wrong channel number (255) when running time.
978 * Check if correct channel number information. 20110501
980 if ((prBssInfo
->eBand
== BAND_2G4
&& ucPrimaryChannel
> 14) ||
981 (prBssInfo
->eBand
!= BAND_2G4
&& (ucPrimaryChannel
>= 200 || ucPrimaryChannel
<= 14))) {
982 ucPrimaryChannel
= 0;
984 #if CFG_SUPPORT_QUIET && 0
986 rrmQuietIeNotExist(prAdapter
, prBssInfo
);
990 /* Check if OBSS scan process will launch */
991 if (!prAdapter
->fgEnOnlineScan
|| !prObssScnParam
||
992 !(prStaRec
->u2HtCapInfo
& HT_CAP_INFO_SUP_CHNL_WIDTH
) ||
993 prBssInfo
->eBand
!= BAND_2G4
|| !prBssInfo
->fg40mBwAllowed
) {
995 /* Note: it is ok not to stop rObssScanTimer() here */
996 prBssInfo
->u2ObssScanInterval
= 0;
998 if (prObssScnParam
->u2TriggerScanInterval
< OBSS_SCAN_MIN_INTERVAL
) {
999 prObssScnParam
->u2TriggerScanInterval
= OBSS_SCAN_MIN_INTERVAL
;
1001 if (prBssInfo
->u2ObssScanInterval
!= prObssScnParam
->u2TriggerScanInterval
) {
1003 prBssInfo
->u2ObssScanInterval
= prObssScnParam
->u2TriggerScanInterval
;
1005 /* Start timer to trigger OBSS scanning */
1006 cnmTimerStartTimer(prAdapter
, &prBssInfo
->rObssScanTimer
,
1007 prBssInfo
->u2ObssScanInterval
* MSEC_PER_SEC
);
1011 return ucPrimaryChannel
;
1014 /*----------------------------------------------------------------------------*/
1016 * \brief AIS or P2P GC.
1022 /*----------------------------------------------------------------------------*/
1024 rlmRecBcnFromNeighborForClient(P_ADAPTER_T prAdapter
,
1025 P_BSS_INFO_T prBssInfo
,
1026 P_SW_RFB_T prSwRfb
, PUINT_8 pucIE
, UINT_16 u2IELength
)
1028 UINT_16 u2Offset
, i
;
1029 UINT_8 ucPriChannel
, ucSecChannel
;
1030 ENUM_CHNL_EXT_T eSCO
;
1031 BOOLEAN fgHtBss
, fg20mReq
;
1034 ASSERT(prBssInfo
&& prSwRfb
);
1037 /* Record it to channel list to change 20/40 bandwidth */
1039 eSCO
= CHNL_EXT_SCN
;
1044 IE_FOR_EACH(pucIE
, u2IELength
, u2Offset
) {
1045 switch (IE_ID(pucIE
)) {
1046 case ELEM_ID_HT_CAP
:
1048 P_IE_HT_CAP_T prHtCap
;
1050 if (IE_LEN(pucIE
) != (sizeof(IE_HT_CAP_T
) - 2)) {
1054 prHtCap
= (P_IE_HT_CAP_T
) pucIE
;
1055 if (prHtCap
->u2HtCapInfo
& HT_CAP_INFO_40M_INTOLERANT
) {
1063 P_IE_HT_OP_T prHtOp
;
1065 if (IE_LEN(pucIE
) != (sizeof(IE_HT_OP_T
) - 2)) {
1069 prHtOp
= (P_IE_HT_OP_T
) pucIE
;
1070 /* Workaround that some APs fill primary channel field by its
1071 * secondary channel, but its DS IE is correct 20110610
1073 if (ucPriChannel
== 0) {
1074 ucPriChannel
= prHtOp
->ucPrimaryChannel
;
1077 if ((prHtOp
->ucInfo1
& HT_OP_INFO1_SCO
) != CHNL_EXT_RES
) {
1079 (ENUM_CHNL_EXT_T
) (prHtOp
->ucInfo1
& HT_OP_INFO1_SCO
);
1083 case ELEM_ID_20_40_BSS_COEXISTENCE
:
1085 P_IE_20_40_COEXIST_T prCoexist
;
1087 if (IE_LEN(pucIE
) != (sizeof(IE_20_40_COEXIST_T
) - 2)) {
1091 prCoexist
= (P_IE_20_40_COEXIST_T
) pucIE
;
1092 if (prCoexist
->ucData
& BSS_COEXIST_40M_INTOLERANT
) {
1097 case ELEM_ID_DS_PARAM_SET
:
1098 if (IE_LEN(pucIE
) != (sizeof(IE_DS_PARAM_SET_T
) - 2)) {
1101 ucPriChannel
= DS_PARAM_IE(pucIE
)->ucCurrChnl
;
1110 /* To do: Update channel list and 5G band. All channel lists have the same
1111 * update procedure. We should give it the entry pointer of desired
1114 if (HIF_RX_HDR_GET_RF_BAND(prSwRfb
->prHifRxHdr
) != BAND_2G4
) {
1118 if (ucPriChannel
== 0 || ucPriChannel
> 14) {
1119 ucPriChannel
= HIF_RX_HDR_GET_CHNL_NUM(prSwRfb
->prHifRxHdr
);
1123 ASSERT(prBssInfo
->auc2G_PriChnlList
[0] <= CHNL_LIST_SZ_2G
);
1124 for (i
= 1; i
<= prBssInfo
->auc2G_PriChnlList
[0] && i
<= CHNL_LIST_SZ_2G
; i
++) {
1125 if (prBssInfo
->auc2G_PriChnlList
[i
] == ucPriChannel
) {
1129 if ((i
> prBssInfo
->auc2G_PriChnlList
[0]) && (i
<= CHNL_LIST_SZ_2G
)) {
1130 prBssInfo
->auc2G_PriChnlList
[i
] = ucPriChannel
;
1131 prBssInfo
->auc2G_PriChnlList
[0]++;
1134 /* Update secondary channel */
1135 if (eSCO
!= CHNL_EXT_SCN
) {
1136 ucSecChannel
= (eSCO
== CHNL_EXT_SCA
) ?
1137 (ucPriChannel
+ 4) : (ucPriChannel
- 4);
1139 ASSERT(prBssInfo
->auc2G_SecChnlList
[0] <= CHNL_LIST_SZ_2G
);
1140 for (i
= 1; i
<= prBssInfo
->auc2G_SecChnlList
[0] &&
1141 i
<= CHNL_LIST_SZ_2G
; i
++) {
1142 if (prBssInfo
->auc2G_SecChnlList
[i
] == ucSecChannel
) {
1146 if ((i
> prBssInfo
->auc2G_SecChnlList
[0]) && (i
<= CHNL_LIST_SZ_2G
)) {
1147 prBssInfo
->auc2G_SecChnlList
[i
] = ucSecChannel
;
1148 prBssInfo
->auc2G_SecChnlList
[0]++;
1152 /* Update 20M bandwidth request channels */
1154 ASSERT(prBssInfo
->auc2G_20mReqChnlList
[0] <= CHNL_LIST_SZ_2G
);
1155 for (i
= 1; i
<= prBssInfo
->auc2G_20mReqChnlList
[0] &&
1156 i
<= CHNL_LIST_SZ_2G
; i
++) {
1157 if (prBssInfo
->auc2G_20mReqChnlList
[i
] == ucPriChannel
) {
1161 if ((i
> prBssInfo
->auc2G_20mReqChnlList
[0]) && (i
<= CHNL_LIST_SZ_2G
)) {
1162 prBssInfo
->auc2G_20mReqChnlList
[i
] = ucPriChannel
;
1163 prBssInfo
->auc2G_20mReqChnlList
[0]++;
1167 /* Update non-HT channel list */
1168 ASSERT(prBssInfo
->auc2G_NonHtChnlList
[0] <= CHNL_LIST_SZ_2G
);
1169 for (i
= 1; i
<= prBssInfo
->auc2G_NonHtChnlList
[0] && i
<= CHNL_LIST_SZ_2G
; i
++) {
1170 if (prBssInfo
->auc2G_NonHtChnlList
[i
] == ucPriChannel
) {
1174 if ((i
> prBssInfo
->auc2G_NonHtChnlList
[0]) && (i
<= CHNL_LIST_SZ_2G
)) {
1175 prBssInfo
->auc2G_NonHtChnlList
[i
] = ucPriChannel
;
1176 prBssInfo
->auc2G_NonHtChnlList
[0]++;
1185 /*----------------------------------------------------------------------------*/
1187 * \brief AIS or P2P GC.
1193 /*----------------------------------------------------------------------------*/
1195 rlmRecBcnInfoForClient(P_ADAPTER_T prAdapter
,
1196 P_BSS_INFO_T prBssInfo
,
1197 P_SW_RFB_T prSwRfb
, PUINT_8 pucIE
, UINT_16 u2IELength
)
1200 ASSERT(prBssInfo
&& prSwRfb
);
1203 #if 0 /* SW migration 2010/8/20 */
1204 /* Note: we shall not update parameters when scanning, otherwise
1205 * channel and bandwidth will not be correct or asserted failure
1207 * Note: remove channel checking. All received Beacons should be processed
1208 * if measurement or other actions are executed in adjacent channels
1209 * and Beacon content checking mechanism is not disabled.
1211 if (IS_SCAN_ACTIVE()
1212 /* || prBssInfo->ucPrimaryChannel != CHNL_NUM_BY_SWRFB(prSwRfb) */
1218 /* Handle change of slot time */
1219 prBssInfo
->u2CapInfo
= ((P_WLAN_BEACON_FRAME_T
) (prSwRfb
->pvHeader
))->u2CapInfo
;
1220 prBssInfo
->fgUseShortSlotTime
=
1221 (prBssInfo
->u2CapInfo
& CAP_INFO_SHORT_SLOT_TIME
) ? TRUE
: FALSE
;
1223 rlmRecIeInfoForClient(prAdapter
, prBssInfo
, pucIE
, u2IELength
);
1228 /*----------------------------------------------------------------------------*/
1236 /*----------------------------------------------------------------------------*/
1237 VOID
rlmProcessBcn(P_ADAPTER_T prAdapter
, P_SW_RFB_T prSwRfb
, PUINT_8 pucIE
, UINT_16 u2IELength
)
1239 P_BSS_INFO_T prBssInfo
;
1240 BOOLEAN fgNewParameter
;
1247 fgNewParameter
= FALSE
;
1249 /* When concurrent networks exist, GO shall have the same handle as
1250 * the other BSS, so the Beacon shall be procesed for bandwidth and
1251 * protection mechanism.
1252 * Note1: we do not have 2 AP (GO) cases simultaneously now.
1253 * Note2: If we are GO, concurrent AIS AP should detect it and reflect
1254 * action in its Beacon, so AIS STA just follows Beacon from AP.
1256 RLM_NET_FOR_EACH_NO_BOW(ucNetIdx
) {
1257 prBssInfo
= &prAdapter
->rWifiVar
.arBssInfo
[ucNetIdx
];
1260 if (IS_BSS_ACTIVE(prBssInfo
)) {
1261 if (prBssInfo
->eCurrentOPMode
== OP_MODE_INFRASTRUCTURE
&&
1262 prBssInfo
->eConnectionState
== PARAM_MEDIA_STATE_CONNECTED
) {
1263 /* P2P client or AIS infra STA */
1264 if (EQUAL_MAC_ADDR(prBssInfo
->aucBSSID
, ((P_WLAN_MAC_MGMT_HEADER_T
)
1265 (prSwRfb
->pvHeader
))->
1268 fgNewParameter
= rlmRecBcnInfoForClient(prAdapter
,
1272 fgNewParameter
= rlmRecBcnFromNeighborForClient(prAdapter
,
1279 #if CFG_ENABLE_WIFI_DIRECT
1280 else if (prAdapter
->fgIsP2PRegistered
&&
1281 (prBssInfo
->eCurrentOPMode
== OP_MODE_ACCESS_POINT
||
1282 prBssInfo
->eCurrentOPMode
== OP_MODE_P2P_DEVICE
)) {
1283 /* AP scan to check if 20/40M bandwidth is permitted */
1284 rlmRecBcnFromNeighborForClient(prAdapter
,
1285 prBssInfo
, prSwRfb
, pucIE
,
1289 else if (prBssInfo
->eCurrentOPMode
== OP_MODE_IBSS
) {
1293 /* Appy new parameters if necessary */
1294 if (fgNewParameter
) {
1295 rlmSyncOperationParams(prAdapter
, prBssInfo
);
1296 fgNewParameter
= FALSE
;
1298 } /* end of IS_BSS_ACTIVE() */
1299 } /* end of RLM_NET_FOR_EACH_NO_BOW */
1302 /*----------------------------------------------------------------------------*/
1304 * \brief This function should be invoked after judging successful association.
1310 /*----------------------------------------------------------------------------*/
1312 rlmProcessAssocRsp(P_ADAPTER_T prAdapter
, P_SW_RFB_T prSwRfb
, PUINT_8 pucIE
, UINT_16 u2IELength
)
1314 P_BSS_INFO_T prBssInfo
;
1315 P_STA_RECORD_T prStaRec
;
1316 UINT_8 ucPriChannel
;
1322 prStaRec
= cnmGetStaRecByIndex(prAdapter
, prSwRfb
->ucStaRecIdx
);
1327 ASSERT(prStaRec
->ucNetTypeIndex
< NETWORK_TYPE_INDEX_NUM
);
1329 prBssInfo
= &prAdapter
->rWifiVar
.arBssInfo
[prStaRec
->ucNetTypeIndex
];
1330 ASSERT(prStaRec
== prBssInfo
->prStaRecOfAP
);
1332 /* To do: the invoked function is used to clear all members. It may be
1333 * done by center mechanism in invoker.
1335 rlmBssReset(prAdapter
, prBssInfo
);
1337 prBssInfo
->fgUseShortSlotTime
=
1338 (prBssInfo
->u2CapInfo
& CAP_INFO_SHORT_SLOT_TIME
) ? TRUE
: FALSE
;
1340 if ((ucPriChannel
= rlmRecIeInfoForClient(prAdapter
, prBssInfo
, pucIE
, u2IELength
)) > 0) {
1341 prBssInfo
->ucPrimaryChannel
= ucPriChannel
;
1344 if (!RLM_NET_IS_11N(prBssInfo
) || !(prStaRec
->u2HtCapInfo
& HT_CAP_INFO_SUP_CHNL_WIDTH
)) {
1345 prBssInfo
->fg40mBwAllowed
= FALSE
;
1348 /* Note: Update its capabilities to WTBL by cnmStaRecChangeState(), which
1349 * shall be invoked afterwards.
1350 * Update channel, bandwidth and protection mode by nicUpdateBss()
1353 if (prStaRec
->ucNetTypeIndex
== NETWORK_TYPE_P2P_INDEX
) {
1355 DBGLOG(AIS
, WARN
, ("Force P2P BW to 20\n"));
1356 prBssInfo
->fgAssoc40mBwAllowed
= FALSE
;
1363 /*----------------------------------------------------------------------------*/
1365 * \brief This function should be invoked after judging successful association.
1371 /*----------------------------------------------------------------------------*/
1372 VOID
rlmFillSyncCmdParam(P_CMD_SET_BSS_RLM_PARAM_T prCmdBody
, P_BSS_INFO_T prBssInfo
)
1374 ASSERT(prCmdBody
&& prBssInfo
);
1375 if (!prCmdBody
|| !prBssInfo
) {
1379 prCmdBody
->ucNetTypeIndex
= prBssInfo
->ucNetTypeIndex
;
1380 prCmdBody
->ucRfBand
= (UINT_8
) prBssInfo
->eBand
;
1381 prCmdBody
->ucPrimaryChannel
= prBssInfo
->ucPrimaryChannel
;
1382 prCmdBody
->ucRfSco
= (UINT_8
) prBssInfo
->eBssSCO
;
1383 prCmdBody
->ucErpProtectMode
= (UINT_8
) prBssInfo
->fgErpProtectMode
;
1384 prCmdBody
->ucHtProtectMode
= (UINT_8
) prBssInfo
->eHtProtectMode
;
1385 prCmdBody
->ucGfOperationMode
= (UINT_8
) prBssInfo
->eGfOperationMode
;
1386 prCmdBody
->ucTxRifsMode
= (UINT_8
) prBssInfo
->eRifsOperationMode
;
1387 prCmdBody
->u2HtOpInfo3
= prBssInfo
->u2HtOpInfo3
;
1388 prCmdBody
->u2HtOpInfo2
= prBssInfo
->u2HtOpInfo2
;
1389 prCmdBody
->ucHtOpInfo1
= prBssInfo
->ucHtOpInfo1
;
1390 prCmdBody
->ucUseShortPreamble
= prBssInfo
->fgUseShortPreamble
;
1391 prCmdBody
->ucUseShortSlotTime
= prBssInfo
->fgUseShortSlotTime
;
1392 prCmdBody
->ucCheckId
= 0x72;
1394 if (RLM_NET_PARAM_VALID(prBssInfo
)) {
1395 DBGLOG(RLM
, INFO
, ("N=%d b=%d c=%d s=%d e=%d h=%d I=0x%02x l=%d p=%d\n",
1396 prCmdBody
->ucNetTypeIndex
, prCmdBody
->ucRfBand
,
1397 prCmdBody
->ucPrimaryChannel
, prCmdBody
->ucRfSco
,
1398 prCmdBody
->ucErpProtectMode
, prCmdBody
->ucHtProtectMode
,
1399 prCmdBody
->ucHtOpInfo1
, prCmdBody
->ucUseShortSlotTime
,
1400 prCmdBody
->ucUseShortPreamble
));
1402 DBGLOG(RLM
, INFO
, ("N=%d closed\n", prCmdBody
->ucNetTypeIndex
));
1406 /*----------------------------------------------------------------------------*/
1408 * \brief This function will operation parameters based on situations of
1409 * concurrent networks. Channel, bandwidth, protection mode, supported
1410 * rate will be modified.
1416 /*----------------------------------------------------------------------------*/
1417 VOID
rlmSyncOperationParams(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
)
1419 P_CMD_SET_BSS_RLM_PARAM_T prCmdBody
;
1420 WLAN_STATUS rStatus
;
1425 prCmdBody
= (P_CMD_SET_BSS_RLM_PARAM_T
)
1426 cnmMemAlloc(prAdapter
, RAM_TYPE_BUF
, sizeof(CMD_SET_BSS_RLM_PARAM_T
));
1429 /* To do: exception handle */
1431 DBGLOG(RLM
, WARN
, ("No buf for sync RLM params (Net=%d)\n",
1432 prBssInfo
->ucNetTypeIndex
));
1436 rlmFillSyncCmdParam(prCmdBody
, prBssInfo
);
1438 rStatus
= wlanSendSetQueryCmd(prAdapter
, /* prAdapter */
1439 CMD_ID_SET_BSS_RLM_PARAM
, /* ucCID */
1440 TRUE
, /* fgSetQuery */
1441 FALSE
, /* fgNeedResp */
1442 FALSE
, /* fgIsOid */
1443 NULL
, /* pfCmdDoneHandler */
1444 NULL
, /* pfCmdTimeoutHandler */
1445 sizeof(CMD_SET_BSS_RLM_PARAM_T
), /* u4SetQueryInfoLen */
1446 (PUINT_8
) prCmdBody
, /* pucInfoBuffer */
1447 NULL
, /* pvSetQueryBuffer */
1448 0 /* u4SetQueryBufferLen */
1451 ASSERT(rStatus
== WLAN_STATUS_PENDING
);
1453 cnmMemFree(prAdapter
, prCmdBody
);
1457 /*----------------------------------------------------------------------------*/
1459 * \brief This function should be invoked after judging successful association.
1465 /*----------------------------------------------------------------------------*/
1467 rlmProcessAssocReq(P_ADAPTER_T prAdapter
, P_SW_RFB_T prSwRfb
, PUINT_8 pucIE
, UINT_16 u2IELength
)
1469 P_BSS_INFO_T prBssInfo
;
1470 P_STA_RECORD_T prStaRec
;
1472 P_IE_HT_CAP_T prHtCap
;
1478 prStaRec
= cnmGetStaRecByIndex(prAdapter
, prSwRfb
->ucStaRecIdx
);
1483 ASSERT(prStaRec
->ucNetTypeIndex
< NETWORK_TYPE_INDEX_NUM
);
1485 prBssInfo
= &prAdapter
->rWifiVar
.arBssInfo
[prStaRec
->ucNetTypeIndex
];
1487 IE_FOR_EACH(pucIE
, u2IELength
, u2Offset
) {
1488 switch (IE_ID(pucIE
)) {
1489 case ELEM_ID_HT_CAP
:
1490 if (!RLM_NET_IS_11N(prBssInfo
) ||
1491 IE_LEN(pucIE
) != (sizeof(IE_HT_CAP_T
) - 2)) {
1494 prHtCap
= (P_IE_HT_CAP_T
) pucIE
;
1495 prStaRec
->ucMcsSet
= prHtCap
->rSupMcsSet
.aucRxMcsBitmask
[0];
1496 prStaRec
->fgSupMcs32
=
1497 (prHtCap
->rSupMcsSet
.aucRxMcsBitmask
[32 / 8] & BIT(0)) ? TRUE
: FALSE
;
1499 prStaRec
->u2HtCapInfo
= prHtCap
->u2HtCapInfo
;
1500 prStaRec
->ucAmpduParam
= prHtCap
->ucAmpduParam
;
1501 prStaRec
->u2HtExtendedCap
= prHtCap
->u2HtExtendedCap
;
1502 prStaRec
->u4TxBeamformingCap
= prHtCap
->u4TxBeamformingCap
;
1503 prStaRec
->ucAselCap
= prHtCap
->ucAselCap
;
1508 } /* end of switch */
1509 } /* end of IE_FOR_EACH */
1511 #endif /* CFG_SUPPORT_AAA */
1513 /*----------------------------------------------------------------------------*/
1515 * \brief It is for both STA and AP modes
1521 /*----------------------------------------------------------------------------*/
1522 VOID
rlmBssInitForAPandIbss(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
)
1527 #if CFG_ENABLE_WIFI_DIRECT
1528 if (prAdapter
->fgIsP2PRegistered
&& prBssInfo
->eCurrentOPMode
== OP_MODE_ACCESS_POINT
) {
1530 rlmBssInitForAP(prAdapter
, prBssInfo
);
1535 /*----------------------------------------------------------------------------*/
1537 * \brief It is for both STA and AP modes
1543 /*----------------------------------------------------------------------------*/
1544 VOID
rlmBssAborted(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
)
1549 rlmBssReset(prAdapter
, prBssInfo
);
1551 prBssInfo
->fg40mBwAllowed
= FALSE
;
1552 prBssInfo
->fgAssoc40mBwAllowed
= FALSE
;
1554 /* Assume FW state is updated by CMD_ID_SET_BSS_INFO, so
1555 * the sync CMD is not needed here.
1559 /*----------------------------------------------------------------------------*/
1561 * \brief All RLM timers will also be stopped.
1567 /*----------------------------------------------------------------------------*/
1568 static VOID
rlmBssReset(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
)
1573 /* HT related parameters */
1574 prBssInfo
->ucHtOpInfo1
= 0; /* RIFS disabled. 20MHz */
1575 prBssInfo
->u2HtOpInfo2
= 0;
1576 prBssInfo
->u2HtOpInfo3
= 0;
1578 prBssInfo
->eBssSCO
= 0;
1579 prBssInfo
->fgErpProtectMode
= 0;
1580 prBssInfo
->eHtProtectMode
= 0;
1581 prBssInfo
->eGfOperationMode
= 0;
1582 prBssInfo
->eRifsOperationMode
= 0;
1584 /* OBSS related parameters */
1585 prBssInfo
->auc2G_20mReqChnlList
[0] = 0;
1586 prBssInfo
->auc2G_NonHtChnlList
[0] = 0;
1587 prBssInfo
->auc2G_PriChnlList
[0] = 0;
1588 prBssInfo
->auc2G_SecChnlList
[0] = 0;
1589 prBssInfo
->auc5G_20mReqChnlList
[0] = 0;
1590 prBssInfo
->auc5G_NonHtChnlList
[0] = 0;
1591 prBssInfo
->auc5G_PriChnlList
[0] = 0;
1592 prBssInfo
->auc5G_SecChnlList
[0] = 0;
1594 /* All RLM timers will also be stopped */
1595 cnmTimerStopTimer(prAdapter
, &prBssInfo
->rObssScanTimer
);
1596 prBssInfo
->u2ObssScanInterval
= 0;
1598 prBssInfo
->fgObssErpProtectMode
= 0; /* GO only */
1599 prBssInfo
->eObssHtProtectMode
= 0; /* GO only */
1600 prBssInfo
->eObssGfOperationMode
= 0; /* GO only */
1601 prBssInfo
->fgObssRifsOperationMode
= 0; /* GO only */
1602 prBssInfo
->fgObssActionForcedTo20M
= 0; /* GO only */
1603 prBssInfo
->fgObssBeaconForcedTo20M
= 0; /* GO only */