2 ** $Id: @(#) p2p_rlm.c@@
13 /*******************************************************************************
14 * C O M P I L E R F L A G S
15 ********************************************************************************
18 /*******************************************************************************
19 * E X T E R N A L R E F E R E N C E S
20 ********************************************************************************
25 extern VOID
rlmSyncOperationParams(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
);
27 /*******************************************************************************
29 ********************************************************************************
32 /*******************************************************************************
34 ********************************************************************************
37 /*******************************************************************************
39 ********************************************************************************
42 /*******************************************************************************
43 * P R I V A T E D A T A
44 ********************************************************************************
47 /*******************************************************************************
49 ********************************************************************************
52 /*******************************************************************************
53 * F U N C T I O N D E C L A R A T I O N S
54 ********************************************************************************
57 /*******************************************************************************
59 ********************************************************************************
62 /*----------------------------------------------------------------------------*/
70 /*----------------------------------------------------------------------------*/
71 VOID
rlmBssInitForAP(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
)
80 if (prBssInfo
->eCurrentOPMode
!= OP_MODE_ACCESS_POINT
) {
84 /* Operation band, channel shall be ready before invoking this function.
85 * Bandwidth may be ready if other network is connected
87 prBssInfo
->fg40mBwAllowed
= FALSE
;
88 prBssInfo
->fgAssoc40mBwAllowed
= FALSE
;
89 prBssInfo
->eBssSCO
= CHNL_EXT_SCN
;
91 if (RLM_AP_IS_BW_40_ALLOWED(prAdapter
, prBssInfo
)) {
92 /* In this case, the first BSS's SCO is 40MHz and known, so AP can
93 * apply 40MHz bandwidth, but the first BSS's SCO may be changed
94 * later if its Beacon lost timeout occurs
96 if (cnmPreferredChannel(prAdapter
, &eBand
, &ucChannel
, &eSCO
) &&
97 eSCO
!= CHNL_EXT_SCN
&& ucChannel
== prBssInfo
->ucPrimaryChannel
&&
98 eBand
== prBssInfo
->eBand
) {
99 prBssInfo
->eBssSCO
= eSCO
;
100 } else if (cnmBss40mBwPermitted(prAdapter
, prBssInfo
->ucNetTypeIndex
)) {
101 prBssInfo
->eBssSCO
= rlmDecideScoForAP(prAdapter
, prBssInfo
);
104 if (prBssInfo
->eBssSCO
!= CHNL_EXT_SCN
) {
105 prBssInfo
->fg40mBwAllowed
= TRUE
;
106 prBssInfo
->fgAssoc40mBwAllowed
= TRUE
;
108 prBssInfo
->ucHtOpInfo1
= (UINT_8
)
109 (((UINT_32
) prBssInfo
->eBssSCO
) | HT_OP_INFO1_STA_CHNL_WIDTH
);
111 rlmUpdateBwByChListForAP(prAdapter
, prBssInfo
);
115 DBGLOG(RLM
, INFO
, ("WLAN AP SCO=%d\n", prBssInfo
->eBssSCO
));
118 /*----------------------------------------------------------------------------*/
120 * \brief For probe response (GO, IBSS) and association response
126 /*----------------------------------------------------------------------------*/
127 VOID
rlmRspGenerateObssScanIE(P_ADAPTER_T prAdapter
, P_MSDU_INFO_T prMsduInfo
)
129 P_BSS_INFO_T prBssInfo
;
130 P_IE_OBSS_SCAN_PARAM_T prObssScanIe
;
131 P_STA_RECORD_T prStaRec
= (P_STA_RECORD_T
) NULL
;
135 ASSERT(IS_NET_ACTIVE(prAdapter
, prMsduInfo
->ucNetworkType
));
137 prStaRec
= cnmGetStaRecByIndex(prAdapter
, prMsduInfo
->ucStaRecIndex
);
139 prBssInfo
= &prAdapter
->rWifiVar
.arBssInfo
[prMsduInfo
->ucNetworkType
];
142 if (RLM_NET_IS_11N(prBssInfo
) && !RLM_NET_IS_BOW(prBssInfo
) &&
143 prBssInfo
->eCurrentOPMode
== OP_MODE_ACCESS_POINT
&&
144 (!prStaRec
|| (prStaRec
->ucPhyTypeSet
& PHY_TYPE_SET_802_11N
)) &&
145 prBssInfo
->eBand
== BAND_2G4
&& prBssInfo
->eBssSCO
!= CHNL_EXT_SCN
) {
147 prObssScanIe
= (P_IE_OBSS_SCAN_PARAM_T
)
148 (((PUINT_8
) prMsduInfo
->prPacket
) + prMsduInfo
->u2FrameLength
);
150 /* Add 20/40 BSS coexistence IE */
151 prObssScanIe
->ucId
= ELEM_ID_OBSS_SCAN_PARAMS
;
152 prObssScanIe
->ucLength
= sizeof(IE_OBSS_SCAN_PARAM_T
) - ELEM_HDR_LEN
;
154 prObssScanIe
->u2ScanPassiveDwell
= dot11OBSSScanPassiveDwell
;
155 prObssScanIe
->u2ScanActiveDwell
= dot11OBSSScanActiveDwell
;
156 prObssScanIe
->u2TriggerScanInterval
= dot11BSSWidthTriggerScanInterval
;
157 prObssScanIe
->u2ScanPassiveTotalPerChnl
= dot11OBSSScanPassiveTotalPerChannel
;
158 prObssScanIe
->u2ScanActiveTotalPerChnl
= dot11OBSSScanActiveTotalPerChannel
;
159 prObssScanIe
->u2WidthTransDelayFactor
= dot11BSSWidthChannelTransitionDelayFactor
;
160 prObssScanIe
->u2ScanActivityThres
= dot11OBSSScanActivityThreshold
;
162 ASSERT(IE_SIZE(prObssScanIe
) <= (ELEM_HDR_LEN
+ ELEM_MAX_LEN_OBSS_SCAN
));
164 prMsduInfo
->u2FrameLength
+= IE_SIZE(prObssScanIe
);
168 /*----------------------------------------------------------------------------*/
176 /*----------------------------------------------------------------------------*/
177 BOOLEAN
rlmUpdateBwByChListForAP(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
)
187 if (prBssInfo
->eBssSCO
== CHNL_EXT_SCN
) {
191 ucLevel
= rlmObssChnlLevel(prBssInfo
, prBssInfo
->eBand
,
192 prBssInfo
->ucPrimaryChannel
, prBssInfo
->eBssSCO
);
194 if (ucLevel
== CHNL_LEVEL0
) {
195 /* Forced to 20MHz, so extended channel is SCN and STA width is zero */
196 prBssInfo
->fgObssActionForcedTo20M
= TRUE
;
198 if (prBssInfo
->ucHtOpInfo1
!= (UINT_8
) CHNL_EXT_SCN
) {
199 prBssInfo
->ucHtOpInfo1
= (UINT_8
) CHNL_EXT_SCN
;
203 cnmTimerStartTimer(prAdapter
, &prBssInfo
->rObssScanTimer
,
204 OBSS_20_40M_TIMEOUT
* MSEC_PER_SEC
);
207 /* Clear up all channel lists */
208 prBssInfo
->auc2G_20mReqChnlList
[0] = 0;
209 prBssInfo
->auc2G_NonHtChnlList
[0] = 0;
210 prBssInfo
->auc2G_PriChnlList
[0] = 0;
211 prBssInfo
->auc2G_SecChnlList
[0] = 0;
212 prBssInfo
->auc5G_20mReqChnlList
[0] = 0;
213 prBssInfo
->auc5G_NonHtChnlList
[0] = 0;
214 prBssInfo
->auc5G_PriChnlList
[0] = 0;
215 prBssInfo
->auc5G_SecChnlList
[0] = 0;
220 /*----------------------------------------------------------------------------*/
228 /*----------------------------------------------------------------------------*/
229 VOID
rlmProcessPublicAction(P_ADAPTER_T prAdapter
, P_SW_RFB_T prSwRfb
)
231 P_ACTION_20_40_COEXIST_FRAME prRxFrame
;
232 P_IE_20_40_COEXIST_T prCoexist
;
233 P_IE_INTOLERANT_CHNL_REPORT_T prChnlReport
;
234 P_BSS_INFO_T prBssInfo
;
235 P_STA_RECORD_T prStaRec
;
237 UINT_16 u2IELength
, u2Offset
;
243 prRxFrame
= (P_ACTION_20_40_COEXIST_FRAME
) prSwRfb
->pvHeader
;
244 prStaRec
= cnmGetStaRecByIndex(prAdapter
, prSwRfb
->ucStaRecIdx
);
246 if (prRxFrame
->ucAction
!= ACTION_PUBLIC_20_40_COEXIST
||
247 !prStaRec
|| prStaRec
->ucStaState
!= STA_STATE_3
||
248 prSwRfb
->u2PacketLen
< (WLAN_MAC_MGMT_HEADER_LEN
+ 5) ||
249 HIF_RX_HDR_GET_NETWORK_IDX(prSwRfb
->prHifRxHdr
) != NETWORK_TYPE_P2P_INDEX
) {
253 prBssInfo
= &prAdapter
->rWifiVar
.arBssInfo
[NETWORK_TYPE_P2P_INDEX
];
256 if (!IS_BSS_ACTIVE(prBssInfo
) ||
257 prBssInfo
->eCurrentOPMode
!= OP_MODE_ACCESS_POINT
||
258 prBssInfo
->eBssSCO
== CHNL_EXT_SCN
) {
262 prCoexist
= &prRxFrame
->rBssCoexist
;
263 if (prCoexist
->ucData
& (BSS_COEXIST_40M_INTOLERANT
| BSS_COEXIST_20M_REQ
)) {
264 ASSERT(prBssInfo
->auc2G_20mReqChnlList
[0] <= CHNL_LIST_SZ_2G
);
265 for (i
= 1; i
<= prBssInfo
->auc2G_20mReqChnlList
[0] && i
<= CHNL_LIST_SZ_2G
; i
++) {
266 if (prBssInfo
->auc2G_20mReqChnlList
[i
] == prBssInfo
->ucPrimaryChannel
) {
270 if ((i
> prBssInfo
->auc2G_20mReqChnlList
[0]) && (i
<= CHNL_LIST_SZ_2G
)) {
271 prBssInfo
->auc2G_20mReqChnlList
[i
] = prBssInfo
->ucPrimaryChannel
;
272 prBssInfo
->auc2G_20mReqChnlList
[0]++;
276 /* Process intolerant channel report IE */
277 pucIE
= (PUINT_8
) &prRxFrame
->rChnlReport
;
278 u2IELength
= prSwRfb
->u2PacketLen
- (WLAN_MAC_MGMT_HEADER_LEN
+ 5);
280 IE_FOR_EACH(pucIE
, u2IELength
, u2Offset
) {
281 switch (IE_ID(pucIE
)) {
282 case ELEM_ID_20_40_INTOLERANT_CHNL_REPORT
:
283 prChnlReport
= (P_IE_INTOLERANT_CHNL_REPORT_T
) pucIE
;
285 if (prChnlReport
->ucLength
<= 1) {
289 /* To do: process regulatory class. Now we assume 2.4G band */
291 for (j
= 0; j
< prChnlReport
->ucLength
- 1; j
++) {
292 /* Update non-HT channel list */
293 ASSERT(prBssInfo
->auc2G_NonHtChnlList
[0] <= CHNL_LIST_SZ_2G
);
294 for (i
= 1; i
<= prBssInfo
->auc2G_NonHtChnlList
[0] &&
295 i
<= CHNL_LIST_SZ_2G
; i
++) {
296 if (prBssInfo
->auc2G_NonHtChnlList
[i
] ==
297 prChnlReport
->aucChannelList
[j
]) {
301 if ((i
> prBssInfo
->auc2G_NonHtChnlList
[0]) &&
302 (i
<= CHNL_LIST_SZ_2G
)) {
303 prBssInfo
->auc2G_NonHtChnlList
[i
] =
304 prChnlReport
->aucChannelList
[j
];
305 prBssInfo
->auc2G_NonHtChnlList
[0]++;
313 } /* end of IE_FOR_EACH */
315 if (rlmUpdateBwByChListForAP(prAdapter
, prBssInfo
)) {
316 bssUpdateBeaconContent(prAdapter
, prBssInfo
->ucNetTypeIndex
);
317 rlmSyncOperationParams(prAdapter
, prBssInfo
);
320 /* Check if OBSS scan exemption response should be sent */
321 if (prCoexist
->ucData
& BSS_COEXIST_OBSS_SCAN_EXEMPTION_REQ
) {
322 rlmObssScanExemptionRsp(prAdapter
, prBssInfo
, prSwRfb
);
326 /*----------------------------------------------------------------------------*/
334 /*----------------------------------------------------------------------------*/
335 VOID
rlmProcessHtAction(P_ADAPTER_T prAdapter
, P_SW_RFB_T prSwRfb
)
337 P_ACTION_NOTIFY_CHNL_WIDTH_FRAME prRxFrame
;
338 P_STA_RECORD_T prStaRec
;
343 prRxFrame
= (P_ACTION_NOTIFY_CHNL_WIDTH_FRAME
) prSwRfb
->pvHeader
;
344 prStaRec
= cnmGetStaRecByIndex(prAdapter
, prSwRfb
->ucStaRecIdx
);
346 if (prRxFrame
->ucAction
!= ACTION_HT_NOTIFY_CHANNEL_WIDTH
||
347 !prStaRec
|| prStaRec
->ucStaState
!= STA_STATE_3
||
348 prSwRfb
->u2PacketLen
< sizeof(ACTION_NOTIFY_CHNL_WIDTH_FRAME
)) {
352 /* To do: depending regulation class 13 and 14 based on spec
353 * Note: (ucChannelWidth==1) shall restored back to original capability,
354 * not current setting to 40MHz BW here
356 if (prRxFrame
->ucChannelWidth
== 0) {
357 prStaRec
->u2HtCapInfo
&= ~HT_CAP_INFO_SUP_CHNL_WIDTH
;
358 } else if (prRxFrame
->ucChannelWidth
== 1) {
359 prStaRec
->u2HtCapInfo
|= HT_CAP_INFO_SUP_CHNL_WIDTH
;
361 cnmStaRecChangeState(prAdapter
, prStaRec
, STA_STATE_3
);
364 /*----------------------------------------------------------------------------*/
372 /*----------------------------------------------------------------------------*/
373 VOID
rlmHandleObssStatusEventPkt(P_ADAPTER_T prAdapter
, P_EVENT_AP_OBSS_STATUS_T prObssStatus
)
375 P_BSS_INFO_T prBssInfo
;
378 ASSERT(prObssStatus
);
379 ASSERT(prObssStatus
->ucNetTypeIndex
== NETWORK_TYPE_P2P_INDEX
);
381 prBssInfo
= &prAdapter
->rWifiVar
.arBssInfo
[prObssStatus
->ucNetTypeIndex
];
382 ASSERT(prBssInfo
->eCurrentOPMode
== OP_MODE_ACCESS_POINT
);
384 prBssInfo
->fgObssErpProtectMode
= (BOOLEAN
) prObssStatus
->ucObssErpProtectMode
;
385 prBssInfo
->eObssHtProtectMode
= (ENUM_HT_PROTECT_MODE_T
) prObssStatus
->ucObssHtProtectMode
;
386 prBssInfo
->eObssGfOperationMode
= (ENUM_GF_MODE_T
) prObssStatus
->ucObssGfOperationMode
;
387 prBssInfo
->fgObssRifsOperationMode
= (BOOLEAN
) prObssStatus
->ucObssRifsOperationMode
;
388 prBssInfo
->fgObssBeaconForcedTo20M
= (BOOLEAN
) prObssStatus
->ucObssBeaconForcedTo20M
;
390 /* Check if Beacon content need to be updated */
391 rlmUpdateParamsForAP(prAdapter
, prBssInfo
, TRUE
);
395 /*----------------------------------------------------------------------------*/
397 * \brief It is only for AP mode in NETWORK_TYPE_P2P_INDEX.
403 /*----------------------------------------------------------------------------*/
404 VOID
rlmUpdateParamsForAP(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
, BOOLEAN fgUpdateBeacon
)
407 P_STA_RECORD_T prStaRec
;
408 BOOLEAN fgErpProtectMode
, fgSta40mIntolerant
;
409 BOOLEAN fgUseShortPreamble
, fgUseShortSlotTime
;
410 ENUM_HT_PROTECT_MODE_T eHtProtectMode
;
411 ENUM_GF_MODE_T eGfOperationMode
;
417 if (!IS_BSS_ACTIVE(prBssInfo
) || prBssInfo
->eCurrentOPMode
!= OP_MODE_ACCESS_POINT
) {
421 fgErpProtectMode
= FALSE
;
422 eHtProtectMode
= HT_PROTECT_MODE_NONE
;
423 eGfOperationMode
= GF_MODE_NORMAL
;
424 fgSta40mIntolerant
= FALSE
;
425 fgUseShortPreamble
= prBssInfo
->fgIsShortPreambleAllowed
;
426 fgUseShortSlotTime
= TRUE
;
427 ucHtOpInfo1
= (UINT_8
) CHNL_EXT_SCN
;
429 prStaList
= &prBssInfo
->rStaRecOfClientList
;
431 LINK_FOR_EACH_ENTRY(prStaRec
, prStaList
, rLinkEntry
, STA_RECORD_T
) {
432 /* ASSERT(prStaRec); */
434 DBGLOG(P2P
, TRACE
, ("prStaRec is NULL in rlmUpdateParamsForAP()\n"));
437 if (prStaRec
->fgIsInUse
&& prStaRec
->ucStaState
== STA_STATE_3
&&
438 prStaRec
->ucNetTypeIndex
== prBssInfo
->ucNetTypeIndex
) {
439 if (!(prStaRec
->ucPhyTypeSet
&
440 (PHY_TYPE_SET_802_11GN
| PHY_TYPE_SET_802_11A
))) {
441 /* B-only mode, so mode 1 (ERP protection) */
442 fgErpProtectMode
= TRUE
;
445 if (!(prStaRec
->ucPhyTypeSet
& PHY_TYPE_SET_802_11N
)) {
446 /* BG-only or A-only */
447 eHtProtectMode
= HT_PROTECT_MODE_NON_HT
;
448 } else if (!(prStaRec
->u2HtCapInfo
& HT_CAP_INFO_SUP_CHNL_WIDTH
)) {
450 if (eHtProtectMode
== HT_PROTECT_MODE_NONE
) {
451 eHtProtectMode
= HT_PROTECT_MODE_20M
;
455 if (!(prStaRec
->u2HtCapInfo
& HT_CAP_INFO_HT_GF
)) {
456 eGfOperationMode
= GF_MODE_PROTECT
;
459 if (!(prStaRec
->u2CapInfo
& CAP_INFO_SHORT_PREAMBLE
)) {
460 fgUseShortPreamble
= FALSE
;
463 if (!(prStaRec
->u2CapInfo
& CAP_INFO_SHORT_SLOT_TIME
)) {
464 fgUseShortSlotTime
= FALSE
;
467 if (prStaRec
->u2HtCapInfo
& HT_CAP_INFO_40M_INTOLERANT
) {
468 fgSta40mIntolerant
= TRUE
;
471 } /* end of LINK_FOR_EACH_ENTRY */
473 /* Check if HT operation IE about 20/40M bandwidth shall be updated */
474 if (prBssInfo
->eBssSCO
!= CHNL_EXT_SCN
) {
475 if (/*!LINK_IS_EMPTY(prStaList) && */ !fgSta40mIntolerant
&&
476 !prBssInfo
->fgObssActionForcedTo20M
&& !prBssInfo
->fgObssBeaconForcedTo20M
) {
478 ucHtOpInfo1
= (UINT_8
)
479 (((UINT_32
) prBssInfo
->eBssSCO
) | HT_OP_INFO1_STA_CHNL_WIDTH
);
483 /* Check if any new parameter may be updated */
484 if (prBssInfo
->fgErpProtectMode
!= fgErpProtectMode
||
485 prBssInfo
->eHtProtectMode
!= eHtProtectMode
||
486 prBssInfo
->eGfOperationMode
!= eGfOperationMode
||
487 prBssInfo
->ucHtOpInfo1
!= ucHtOpInfo1
||
488 prBssInfo
->fgUseShortPreamble
!= fgUseShortPreamble
||
489 prBssInfo
->fgUseShortSlotTime
!= fgUseShortSlotTime
) {
491 prBssInfo
->fgErpProtectMode
= fgErpProtectMode
;
492 prBssInfo
->eHtProtectMode
= eHtProtectMode
;
493 prBssInfo
->eGfOperationMode
= eGfOperationMode
;
494 prBssInfo
->ucHtOpInfo1
= ucHtOpInfo1
;
495 prBssInfo
->fgUseShortPreamble
= fgUseShortPreamble
;
496 prBssInfo
->fgUseShortSlotTime
= fgUseShortSlotTime
;
498 if (fgUseShortSlotTime
) {
499 prBssInfo
->u2CapInfo
|= CAP_INFO_SHORT_SLOT_TIME
;
501 prBssInfo
->u2CapInfo
&= ~CAP_INFO_SHORT_SLOT_TIME
;
504 rlmSyncOperationParams(prAdapter
, prBssInfo
);
505 fgUpdateBeacon
= TRUE
;
508 /* Update Beacon content if related IE content is changed */
509 if (fgUpdateBeacon
) {
510 bssUpdateBeaconContent(prAdapter
, prBssInfo
->ucNetTypeIndex
);
515 /*----------------------------------------------------------------------------*/
517 * \brief Initial the channel list from the domain information.
518 * This function is called after P2P initial and Domain information changed.
519 * Make sure the device is disconnected while changing domain information.
521 * \param[in] prAdapter Pointer of ADAPTER_T
523 * \return boolean value if probe response frame is
525 /*----------------------------------------------------------------------------*/
526 VOID
rlmFuncInitialChannelList(IN P_ADAPTER_T prAdapter
)
528 P_P2P_CONNECTION_SETTINGS_T prP2pConnSetting
= (P_P2P_CONNECTION_SETTINGS_T
) NULL
;
529 P_DOMAIN_INFO_ENTRY prDomainInfoEntry
= (P_DOMAIN_INFO_ENTRY
) NULL
;
530 P_DOMAIN_SUBBAND_INFO prDomainSubBand
= (P_DOMAIN_SUBBAND_INFO
) NULL
;
531 P_CHANNEL_ENTRY_FIELD_T prChannelEntryField
= (P_CHANNEL_ENTRY_FIELD_T
) NULL
;
532 UINT_32 u4Idx
= 0, u4IdxII
= 0;
533 UINT_8 ucBufferSize
= P2P_MAX_SUPPORTED_CHANNEL_LIST_SIZE
;
535 UINT_8 ucSocialChnlSupport
= 0, ucAutoChnl
= 0;
539 ASSERT_BREAK(prAdapter
!= NULL
);
541 prP2pConnSetting
= prAdapter
->rWifiVar
.prP2PConnSettings
;
543 ucAutoChnl
= prP2pConnSetting
->ucOperatingChnl
;
546 prDomainInfoEntry
= rlmDomainGetDomainInfo(prAdapter
);
548 ASSERT_BREAK((prDomainInfoEntry
!= NULL
) && (prP2pConnSetting
!= NULL
));
550 prChannelEntryField
=
551 (P_CHANNEL_ENTRY_FIELD_T
) prP2pConnSetting
->aucChannelEntriesField
;
553 for (u4Idx
= 0; u4Idx
< MAX_SUBBAND_NUM
; u4Idx
++) {
554 prDomainSubBand
= &prDomainInfoEntry
->rSubBand
[u4Idx
];
557 if (((prDomainSubBand
->ucBand
== BAND_5G
) && (!prAdapter
->fgEnable5GBand
))
558 || (prDomainSubBand
->ucBand
== BAND_NULL
)) {
564 (P2P_ATTRI_LEN_CHANNEL_ENTRY
+ prDomainSubBand
->ucNumChannels
)) {
565 /* Buffer is not enough to include all supported channels. */
569 prChannelEntryField
->ucRegulatoryClass
= prDomainSubBand
->ucRegClass
;
570 prChannelEntryField
->ucNumberOfChannels
= prDomainSubBand
->ucNumChannels
;
572 for (u4IdxII
= 0; u4IdxII
< prDomainSubBand
->ucNumChannels
; u4IdxII
++) {
573 prChannelEntryField
->aucChannelList
[u4IdxII
] =
574 prDomainSubBand
->ucFirstChannelNum
+
575 (u4IdxII
* prDomainSubBand
->ucChannelSpan
);
578 switch (prChannelEntryField
->aucChannelList
[u4IdxII
]) {
580 ucSocialChnlSupport
= 1;
583 ucSocialChnlSupport
= 6;
586 ucSocialChnlSupport
= 11;
596 (P2P_ATTRI_LEN_CHANNEL_ENTRY
+
597 prChannelEntryField
->ucNumberOfChannels
)) {
599 (P2P_ATTRI_LEN_CHANNEL_ENTRY
+
600 prChannelEntryField
->ucNumberOfChannels
);
606 prChannelEntryField
=
607 (P_CHANNEL_ENTRY_FIELD_T
) ((UINT_32
) prChannelEntryField
+
608 P2P_ATTRI_LEN_CHANNEL_ENTRY
+
609 (UINT_32
) prChannelEntryField
->
615 if (prP2pConnSetting
->ucListenChnl
== 0) {
616 prP2pConnSetting
->ucListenChnl
= P2P_DEFAULT_LISTEN_CHANNEL
;
618 if (ucSocialChnlSupport
!= 0) {
619 /* 1. User Not Set LISTEN channel.
620 * 2. Social channel is not empty.
622 prP2pConnSetting
->ucListenChnl
= ucSocialChnlSupport
;
627 /* TODO: 20110921 frog - */
628 /* If LISTEN channel is not set,
629 * a random supported channel would be set.
630 * If no social channel is supported, DEFAULT channel would be set.
633 prP2pConnSetting
->ucRfChannelListSize
=
634 P2P_MAX_SUPPORTED_CHANNEL_LIST_SIZE
- ucBufferSize
;
637 if (prP2pConnSetting
->ucOperatingChnl
== 0) { /* User not set OPERATE channel. */
639 if (scnQuerySparseChannel(prAdapter
, NULL
, &ucAutoChnl
)) {
643 ucBufferSize
= prP2pConnSetting
->ucRfChannelListSize
;
645 prChannelEntryField
=
646 (P_CHANNEL_ENTRY_FIELD_T
) prP2pConnSetting
->aucChannelEntriesField
;
648 while (ucBufferSize
!= 0) {
649 if (prChannelEntryField
->ucNumberOfChannels
!= 0) {
650 ucAutoChnl
= prChannelEntryField
->aucChannelList
[0];
655 prChannelEntryField
=
656 (P_CHANNEL_ENTRY_FIELD_T
) ((UINT_32
) prChannelEntryField
658 P2P_ATTRI_LEN_CHANNEL_ENTRY
+
660 prChannelEntryField
->
664 (P2P_ATTRI_LEN_CHANNEL_ENTRY
+
665 prChannelEntryField
->ucNumberOfChannels
);
674 /* We assume user would not set a channel not in the channel list.
675 * If so, the operating channel still depends on target deivce supporting capability.
678 /* TODO: 20110921 frog - */
679 /* If the Operating channel is not set, a channel from supported channel list is set automatically.
680 * If there is no supported channel in channel list, a DEFAULT channel is set.
686 prP2pConnSetting
->ucOperatingChnl
= ucAutoChnl
;
689 } /* rlmFuncInitialChannelList */
691 /*----------------------------------------------------------------------------*/
693 * \brief Find a common channel list from the local channel list info & target channel list info.
695 * \param[in] prAdapter Pointer of ADAPTER_T
697 * \return boolean value if probe response frame is
699 /*----------------------------------------------------------------------------*/
701 rlmFuncCommonChannelList(IN P_ADAPTER_T prAdapter
,
702 IN P_CHANNEL_ENTRY_FIELD_T prChannelEntryII
, IN UINT_8 ucChannelListSize
)
704 P_P2P_CONNECTION_SETTINGS_T prP2pConnSetting
= (P_P2P_CONNECTION_SETTINGS_T
) NULL
;
705 P_CHANNEL_ENTRY_FIELD_T prChannelEntryI
=
706 (P_CHANNEL_ENTRY_FIELD_T
) NULL
, prChannelEntryIII
= (P_CHANNEL_ENTRY_FIELD_T
) NULL
;
707 UINT_8 aucCommonChannelList
[P2P_MAX_SUPPORTED_CHANNEL_LIST_SIZE
];
708 UINT_8 ucOriChnlSize
= 0, ucNewChnlSize
= 0;
713 ASSERT_BREAK(prAdapter
!= NULL
);
715 prP2pConnSetting
= prAdapter
->rWifiVar
.prP2PConnSettings
;
717 prChannelEntryIII
= (P_CHANNEL_ENTRY_FIELD_T
) aucCommonChannelList
;
719 while (ucChannelListSize
> 0) {
722 (P_CHANNEL_ENTRY_FIELD_T
) prP2pConnSetting
->aucChannelEntriesField
;
723 ucOriChnlSize
= prP2pConnSetting
->ucRfChannelListSize
;
725 while (ucOriChnlSize
> 0) {
726 if (prChannelEntryI
->ucRegulatoryClass
==
727 prChannelEntryII
->ucRegulatoryClass
) {
728 prChannelEntryIII
->ucRegulatoryClass
=
729 prChannelEntryI
->ucRegulatoryClass
;
730 /* TODO: Currently we assume that the regulatory class the same, the channels are the same. */
731 kalMemCopy(prChannelEntryIII
->aucChannelList
,
732 prChannelEntryII
->aucChannelList
,
733 prChannelEntryII
->ucNumberOfChannels
);
734 prChannelEntryIII
->ucNumberOfChannels
=
735 prChannelEntryII
->ucNumberOfChannels
;
738 P2P_ATTRI_LEN_CHANNEL_ENTRY
+
739 prChannelEntryIII
->ucNumberOfChannels
;
742 (P_CHANNEL_ENTRY_FIELD_T
) ((UINT_32
) prChannelEntryIII
+
743 P2P_ATTRI_LEN_CHANNEL_ENTRY
+
744 (UINT_32
) prChannelEntryIII
->
749 (P2P_ATTRI_LEN_CHANNEL_ENTRY
+
750 prChannelEntryI
->ucNumberOfChannels
);
753 (P_CHANNEL_ENTRY_FIELD_T
) ((UINT_32
) prChannelEntryI
+
754 P2P_ATTRI_LEN_CHANNEL_ENTRY
+
755 (UINT_32
) prChannelEntryI
->
763 (P2P_ATTRI_LEN_CHANNEL_ENTRY
+ prChannelEntryII
->ucNumberOfChannels
);
765 prChannelEntryII
= (P_CHANNEL_ENTRY_FIELD_T
) ((UINT_32
) prChannelEntryII
+
766 P2P_ATTRI_LEN_CHANNEL_ENTRY
+
767 (UINT_32
) prChannelEntryII
->
774 kalMemCopy(prP2pConnSetting
->aucChannelEntriesField
, aucCommonChannelList
,
776 prP2pConnSetting
->ucRfChannelListSize
= ucNewChnlSize
;
781 } /* rlmFuncCommonChannelList */
784 /*----------------------------------------------------------------------------*/
792 /*----------------------------------------------------------------------------*/
793 UINT_8
rlmFuncFindOperatingClass(IN P_ADAPTER_T prAdapter
, IN UINT_8 ucChannelNum
)
795 UINT_8 ucRegulatoryClass
= 0, ucBufferSize
= 0;
796 P_P2P_CONNECTION_SETTINGS_T prP2pConnSetting
= (P_P2P_CONNECTION_SETTINGS_T
) NULL
;
797 P_CHANNEL_ENTRY_FIELD_T prChannelEntryField
= (P_CHANNEL_ENTRY_FIELD_T
) NULL
;
801 ASSERT_BREAK(prAdapter
!= NULL
);
803 prP2pConnSetting
= prAdapter
->rWifiVar
.prP2PConnSettings
;
804 ucBufferSize
= prP2pConnSetting
->ucRfChannelListSize
;
805 prChannelEntryField
=
806 (P_CHANNEL_ENTRY_FIELD_T
) prP2pConnSetting
->aucChannelEntriesField
;
808 while (ucBufferSize
!= 0) {
810 for (u4Idx
= 0; u4Idx
< prChannelEntryField
->ucNumberOfChannels
; u4Idx
++) {
811 if (prChannelEntryField
->aucChannelList
[u4Idx
] == ucChannelNum
) {
812 ucRegulatoryClass
= prChannelEntryField
->ucRegulatoryClass
;
819 if (ucRegulatoryClass
!= 0) {
822 prChannelEntryField
=
823 (P_CHANNEL_ENTRY_FIELD_T
) ((UINT_32
) prChannelEntryField
+
824 P2P_ATTRI_LEN_CHANNEL_ENTRY
+
825 (UINT_32
) prChannelEntryField
->
829 (P2P_ATTRI_LEN_CHANNEL_ENTRY
+
830 prChannelEntryField
->ucNumberOfChannels
);
838 return ucRegulatoryClass
;
839 } /* rlmFuncFindOperatingClass */
842 /*----------------------------------------------------------------------------*/
850 /*----------------------------------------------------------------------------*/
852 rlmFuncFindAvailableChannel(IN P_ADAPTER_T prAdapter
,
853 IN UINT_8 ucCheckChnl
,
854 IN PUINT_8 pucSuggestChannel
,
855 IN BOOLEAN fgIsSocialChannel
, IN BOOLEAN fgIsDefaultChannel
)
857 BOOLEAN fgIsResultAvailable
= FALSE
;
858 P_CHANNEL_ENTRY_FIELD_T prChannelEntry
= (P_CHANNEL_ENTRY_FIELD_T
) NULL
;
859 P_P2P_CONNECTION_SETTINGS_T prP2pConnSetting
= (P_P2P_CONNECTION_SETTINGS_T
) NULL
;
860 UINT_8 ucBufferSize
= 0, ucIdx
= 0, ucChannelSelected
= 0;
863 ASSERT_BREAK(prAdapter
!= NULL
);
865 if (fgIsDefaultChannel
) {
866 ucChannelSelected
= P2P_DEFAULT_LISTEN_CHANNEL
;
870 prP2pConnSetting
= prAdapter
->rWifiVar
.prP2PConnSettings
;
871 ucBufferSize
= prP2pConnSetting
->ucRfChannelListSize
;
872 prChannelEntry
= (P_CHANNEL_ENTRY_FIELD_T
) prP2pConnSetting
->aucChannelEntriesField
;
874 while ((ucBufferSize
!= 0) && (!fgIsResultAvailable
)) {
876 for (ucIdx
= 0; ucIdx
< prChannelEntry
->ucNumberOfChannels
; ucIdx
++) {
877 if ((!fgIsSocialChannel
) ||
878 (prChannelEntry
->aucChannelList
[ucIdx
] == 1) ||
879 (prChannelEntry
->aucChannelList
[ucIdx
] == 6) ||
880 (prChannelEntry
->aucChannelList
[ucIdx
] == 11)) {
882 if (prChannelEntry
->aucChannelList
[ucIdx
] <= 11) {
885 prChannelEntry
->aucChannelList
[ucIdx
];
886 } else if ((prChannelEntry
->aucChannelList
[ucIdx
] < 52)
887 && (prChannelEntry
->aucChannelList
[ucIdx
] >
891 prChannelEntry
->aucChannelList
[ucIdx
];
894 if (ucChannelSelected
== ucCheckChnl
) {
895 fgIsResultAvailable
= TRUE
;
904 (P2P_ATTRI_LEN_CHANNEL_ENTRY
+ prChannelEntry
->ucNumberOfChannels
);
906 prChannelEntry
= (P_CHANNEL_ENTRY_FIELD_T
) ((UINT_32
) prChannelEntry
+
907 P2P_ATTRI_LEN_CHANNEL_ENTRY
+
908 (UINT_32
) prChannelEntry
->
915 if ((!fgIsResultAvailable
) && (pucSuggestChannel
!= NULL
)) {
917 ("The request channel %d is not available, sugguested channel:%d\n",
918 ucCheckChnl
, ucChannelSelected
));
919 /* Given a suggested channel. */
920 *pucSuggestChannel
= ucChannelSelected
;
926 return fgIsResultAvailable
;
929 /*----------------------------------------------------------------------------*/
937 /*----------------------------------------------------------------------------*/
938 ENUM_CHNL_EXT_T
rlmDecideScoForAP(P_ADAPTER_T prAdapter
, P_BSS_INFO_T prBssInfo
)
940 P_DOMAIN_SUBBAND_INFO prSubband
;
941 P_DOMAIN_INFO_ENTRY prDomainInfo
;
942 UINT_8 ucSecondChannel
, i
, j
;
943 ENUM_CHNL_EXT_T eSCO
;
947 if (prBssInfo
->eBand
== BAND_2G4
) {
948 if (prBssInfo
->ucPrimaryChannel
!= 14) {
949 eSCO
= (prBssInfo
->ucPrimaryChannel
> 7) ? CHNL_EXT_SCB
: CHNL_EXT_SCA
;
952 prDomainInfo
= rlmDomainGetDomainInfo(prAdapter
);
953 ASSERT(prDomainInfo
);
955 for (i
= 0; i
< MAX_SUBBAND_NUM
; i
++) {
956 prSubband
= &prDomainInfo
->rSubBand
[i
];
957 if (prSubband
->ucBand
== prBssInfo
->eBand
) {
958 for (j
= 0; j
< prSubband
->ucNumChannels
; j
++) {
959 if ((prSubband
->ucFirstChannelNum
+
960 j
* prSubband
->ucChannelSpan
)
961 == prBssInfo
->ucPrimaryChannel
) {
962 eSCO
= (j
& 1) ? CHNL_EXT_SCB
: CHNL_EXT_SCA
;
967 if (j
< prSubband
->ucNumChannels
) {
974 /* Check if it is boundary channel and 40MHz BW is permitted */
975 if (eSCO
!= CHNL_EXT_SCN
) {
976 ucSecondChannel
= (eSCO
== CHNL_EXT_SCA
) ?
977 (prBssInfo
->ucPrimaryChannel
+ 4) : (prBssInfo
->ucPrimaryChannel
- 4);
979 if (!rlmDomainIsLegalChannel(prAdapter
, prBssInfo
->eBand
, ucSecondChannel
)) {