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 ********************************************************************************
26 rlmSyncOperationParams (
27 P_ADAPTER_T prAdapter,
28 P_BSS_INFO_T prBssInfo
31 /*******************************************************************************
33 ********************************************************************************
36 /*******************************************************************************
38 ********************************************************************************
41 /*******************************************************************************
43 ********************************************************************************
46 /*******************************************************************************
47 * P R I V A T E D A T A
48 ********************************************************************************
51 /*******************************************************************************
53 ********************************************************************************
56 /*******************************************************************************
57 * F U N C T I O N D E C L A R A T I O N S
58 ********************************************************************************
61 /*******************************************************************************
63 ********************************************************************************
66 /*----------------------------------------------------------------------------*/
74 /*----------------------------------------------------------------------------*/
77 P_ADAPTER_T prAdapter,
78 P_BSS_INFO_T prBssInfo
88 if (prBssInfo->eCurrentOPMode != OP_MODE_ACCESS_POINT) {
92 /* Operation band, channel shall be ready before invoking this function.
93 * Bandwidth may be ready if other network is connected
95 prBssInfo->fg40mBwAllowed = FALSE;
96 prBssInfo->fgAssoc40mBwAllowed = FALSE;
97 prBssInfo->eBssSCO = CHNL_EXT_SCN;
99 if (RLM_AP_IS_BW_40_ALLOWED(prAdapter, prBssInfo)) {
100 /* In this case, the first BSS's SCO is 40MHz and known, so AP can
101 * apply 40MHz bandwidth, but the first BSS's SCO may be changed
102 * later if its Beacon lost timeout occurs
104 if (cnmPreferredChannel(prAdapter, &eBand, &ucChannel, &eSCO) &&
105 eSCO != CHNL_EXT_SCN && ucChannel == prBssInfo->ucPrimaryChannel &&
106 eBand == prBssInfo->eBand) {
107 prBssInfo->eBssSCO = eSCO;
109 else if (cnmBss40mBwPermitted(prAdapter, prBssInfo->ucNetTypeIndex)) {
110 prBssInfo->eBssSCO = rlmDecideScoForAP(prAdapter, prBssInfo);
113 if (prBssInfo->eBssSCO != CHNL_EXT_SCN) {
114 prBssInfo->fg40mBwAllowed = TRUE;
115 prBssInfo->fgAssoc40mBwAllowed = TRUE;
117 prBssInfo->ucHtOpInfo1 = (UINT_8)
118 (((UINT_32) prBssInfo->eBssSCO) | HT_OP_INFO1_STA_CHNL_WIDTH);
120 rlmUpdateBwByChListForAP(prAdapter, prBssInfo);
124 DBGLOG(RLM, INFO, ("WLAN AP SCO=%d\n", prBssInfo->eBssSCO));
127 /*----------------------------------------------------------------------------*/
129 * \brief For probe response (GO, IBSS) and association response
135 /*----------------------------------------------------------------------------*/
137 rlmRspGenerateObssScanIE (
138 P_ADAPTER_T prAdapter,
139 P_MSDU_INFO_T prMsduInfo
142 P_BSS_INFO_T prBssInfo;
143 P_IE_OBSS_SCAN_PARAM_T prObssScanIe;
144 P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
148 ASSERT(IS_NET_ACTIVE(prAdapter, prMsduInfo->ucNetworkType));
150 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
152 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
155 if (RLM_NET_IS_11N(prBssInfo) && !RLM_NET_IS_BOW(prBssInfo) &&
156 prBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT &&
157 (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N)) &&
158 prBssInfo->eBand == BAND_2G4 &&
159 prBssInfo->eBssSCO != CHNL_EXT_SCN) {
161 prObssScanIe = (P_IE_OBSS_SCAN_PARAM_T)
162 (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength);
164 /* Add 20/40 BSS coexistence IE */
165 prObssScanIe->ucId = ELEM_ID_OBSS_SCAN_PARAMS;
166 prObssScanIe->ucLength = sizeof(IE_OBSS_SCAN_PARAM_T) - ELEM_HDR_LEN;
168 prObssScanIe->u2ScanPassiveDwell =
169 dot11OBSSScanPassiveDwell;
170 prObssScanIe->u2ScanActiveDwell =
171 dot11OBSSScanActiveDwell;
172 prObssScanIe->u2TriggerScanInterval =
173 dot11BSSWidthTriggerScanInterval;
174 prObssScanIe->u2ScanPassiveTotalPerChnl =
175 dot11OBSSScanPassiveTotalPerChannel;
176 prObssScanIe->u2ScanActiveTotalPerChnl =
177 dot11OBSSScanActiveTotalPerChannel;
178 prObssScanIe->u2WidthTransDelayFactor =
179 dot11BSSWidthChannelTransitionDelayFactor;
180 prObssScanIe->u2ScanActivityThres =
181 dot11OBSSScanActivityThreshold;
183 ASSERT(IE_SIZE(prObssScanIe) <= (ELEM_HDR_LEN+ ELEM_MAX_LEN_OBSS_SCAN));
185 prMsduInfo->u2FrameLength += IE_SIZE(prObssScanIe);
189 /*----------------------------------------------------------------------------*/
197 /*----------------------------------------------------------------------------*/
199 rlmUpdateBwByChListForAP (
200 P_ADAPTER_T prAdapter,
201 P_BSS_INFO_T prBssInfo
212 if (prBssInfo->eBssSCO == CHNL_EXT_SCN) {
216 ucLevel = rlmObssChnlLevel(prBssInfo, prBssInfo->eBand,
217 prBssInfo->ucPrimaryChannel, prBssInfo->eBssSCO);
219 if (ucLevel == CHNL_LEVEL0) {
220 /* Forced to 20MHz, so extended channel is SCN and STA width is zero */
221 prBssInfo->fgObssActionForcedTo20M = TRUE;
223 if (prBssInfo->ucHtOpInfo1 != (UINT_8) CHNL_EXT_SCN) {
224 prBssInfo->ucHtOpInfo1 = (UINT_8) CHNL_EXT_SCN;
228 cnmTimerStartTimer(prAdapter, &prBssInfo->rObssScanTimer,
229 OBSS_20_40M_TIMEOUT * MSEC_PER_SEC);
232 /* Clear up all channel lists */
233 prBssInfo->auc2G_20mReqChnlList[0] = 0;
234 prBssInfo->auc2G_NonHtChnlList[0] = 0;
235 prBssInfo->auc2G_PriChnlList[0] = 0;
236 prBssInfo->auc2G_SecChnlList[0] = 0;
237 prBssInfo->auc5G_20mReqChnlList[0] = 0;
238 prBssInfo->auc5G_NonHtChnlList[0] = 0;
239 prBssInfo->auc5G_PriChnlList[0] = 0;
240 prBssInfo->auc5G_SecChnlList[0] = 0;
245 /*----------------------------------------------------------------------------*/
253 /*----------------------------------------------------------------------------*/
255 rlmProcessPublicAction (
256 P_ADAPTER_T prAdapter,
260 P_ACTION_20_40_COEXIST_FRAME prRxFrame;
261 P_IE_20_40_COEXIST_T prCoexist;
262 P_IE_INTOLERANT_CHNL_REPORT_T prChnlReport;
263 P_BSS_INFO_T prBssInfo;
264 P_STA_RECORD_T prStaRec;
266 UINT_16 u2IELength, u2Offset;
272 prRxFrame = (P_ACTION_20_40_COEXIST_FRAME) prSwRfb->pvHeader;
273 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
275 if (prRxFrame->ucAction != ACTION_PUBLIC_20_40_COEXIST ||
276 !prStaRec || prStaRec->ucStaState != STA_STATE_3 ||
277 prSwRfb->u2PacketLen < (WLAN_MAC_MGMT_HEADER_LEN + 5) ||
278 HIF_RX_HDR_GET_NETWORK_IDX(prSwRfb->prHifRxHdr) !=
279 NETWORK_TYPE_P2P_INDEX) {
283 prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX];
286 if (!IS_BSS_ACTIVE(prBssInfo) ||
287 prBssInfo->eCurrentOPMode != OP_MODE_ACCESS_POINT ||
288 prBssInfo->eBssSCO == CHNL_EXT_SCN) {
292 prCoexist = &prRxFrame->rBssCoexist;
293 if (prCoexist->ucData & (BSS_COEXIST_40M_INTOLERANT|BSS_COEXIST_20M_REQ)) {
294 ASSERT(prBssInfo->auc2G_20mReqChnlList[0] <= CHNL_LIST_SZ_2G);
295 for (i = 1; i <= prBssInfo->auc2G_20mReqChnlList[0] &&
296 i <= CHNL_LIST_SZ_2G; i++) {
297 if (prBssInfo->auc2G_20mReqChnlList[i] ==
298 prBssInfo->ucPrimaryChannel) {
302 if ((i > prBssInfo->auc2G_20mReqChnlList[0]) &&
303 (i <= CHNL_LIST_SZ_2G)){
304 prBssInfo->auc2G_20mReqChnlList[i] = prBssInfo->ucPrimaryChannel;
305 prBssInfo->auc2G_20mReqChnlList[0]++;
309 /* Process intolerant channel report IE */
310 pucIE = (PUINT_8) &prRxFrame->rChnlReport;
311 u2IELength = prSwRfb->u2PacketLen - (WLAN_MAC_MGMT_HEADER_LEN + 5);
313 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
314 switch (IE_ID(pucIE)) {
315 case ELEM_ID_20_40_INTOLERANT_CHNL_REPORT:
316 prChnlReport = (P_IE_INTOLERANT_CHNL_REPORT_T) pucIE;
318 if (prChnlReport->ucLength <= 1) {
322 /* To do: process regulatory class. Now we assume 2.4G band */
324 for (j = 0; j < prChnlReport->ucLength - 1; j++) {
325 /* Update non-HT channel list */
326 ASSERT(prBssInfo->auc2G_NonHtChnlList[0] <= CHNL_LIST_SZ_2G);
327 for (i = 1; i <= prBssInfo->auc2G_NonHtChnlList[0] &&
328 i <= CHNL_LIST_SZ_2G; i++) {
329 if (prBssInfo->auc2G_NonHtChnlList[i] ==
330 prChnlReport->aucChannelList[j]) {
334 if ((i > prBssInfo->auc2G_NonHtChnlList[0]) &&
335 (i <= CHNL_LIST_SZ_2G)) {
336 prBssInfo->auc2G_NonHtChnlList[i] =
337 prChnlReport->aucChannelList[j];
338 prBssInfo->auc2G_NonHtChnlList[0]++;
346 } /* end of IE_FOR_EACH */
348 if (rlmUpdateBwByChListForAP(prAdapter, prBssInfo)) {
349 bssUpdateBeaconContent(prAdapter, prBssInfo->ucNetTypeIndex);
350 rlmSyncOperationParams(prAdapter, prBssInfo);
353 /* Check if OBSS scan exemption response should be sent */
354 if (prCoexist->ucData & BSS_COEXIST_OBSS_SCAN_EXEMPTION_REQ) {
355 rlmObssScanExemptionRsp(prAdapter, prBssInfo, prSwRfb);
359 /*----------------------------------------------------------------------------*/
367 /*----------------------------------------------------------------------------*/
370 P_ADAPTER_T prAdapter,
374 P_ACTION_NOTIFY_CHNL_WIDTH_FRAME prRxFrame;
375 P_STA_RECORD_T prStaRec;
380 prRxFrame = (P_ACTION_NOTIFY_CHNL_WIDTH_FRAME) prSwRfb->pvHeader;
381 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
383 if (prRxFrame->ucAction != ACTION_HT_NOTIFY_CHANNEL_WIDTH ||
384 !prStaRec || prStaRec->ucStaState != STA_STATE_3 ||
385 prSwRfb->u2PacketLen < sizeof(ACTION_NOTIFY_CHNL_WIDTH_FRAME)) {
389 /* To do: depending regulation class 13 and 14 based on spec
390 * Note: (ucChannelWidth==1) shall restored back to original capability,
391 * not current setting to 40MHz BW here
393 if (prRxFrame->ucChannelWidth == 0) {
394 prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_SUP_CHNL_WIDTH;
396 else if (prRxFrame->ucChannelWidth == 1) {
397 prStaRec->u2HtCapInfo |= HT_CAP_INFO_SUP_CHNL_WIDTH;
399 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
402 /*----------------------------------------------------------------------------*/
410 /*----------------------------------------------------------------------------*/
412 rlmHandleObssStatusEventPkt (
413 P_ADAPTER_T prAdapter,
414 P_EVENT_AP_OBSS_STATUS_T prObssStatus
417 P_BSS_INFO_T prBssInfo;
420 ASSERT(prObssStatus);
421 ASSERT(prObssStatus->ucNetTypeIndex == NETWORK_TYPE_P2P_INDEX);
423 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prObssStatus->ucNetTypeIndex];
424 ASSERT(prBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT);
426 prBssInfo->fgObssErpProtectMode =
427 (BOOLEAN) prObssStatus->ucObssErpProtectMode;
428 prBssInfo->eObssHtProtectMode =
429 (ENUM_HT_PROTECT_MODE_T) prObssStatus->ucObssHtProtectMode;
430 prBssInfo->eObssGfOperationMode =
431 (ENUM_GF_MODE_T) prObssStatus->ucObssGfOperationMode;
432 prBssInfo->fgObssRifsOperationMode =
433 (BOOLEAN) prObssStatus->ucObssRifsOperationMode;
434 prBssInfo->fgObssBeaconForcedTo20M =
435 (BOOLEAN) prObssStatus->ucObssBeaconForcedTo20M;
437 /* Check if Beacon content need to be updated */
438 rlmUpdateParamsForAP(prAdapter, prBssInfo, TRUE);
442 /*----------------------------------------------------------------------------*/
444 * \brief It is only for AP mode in NETWORK_TYPE_P2P_INDEX.
450 /*----------------------------------------------------------------------------*/
452 rlmUpdateParamsForAP (
453 P_ADAPTER_T prAdapter,
454 P_BSS_INFO_T prBssInfo,
455 BOOLEAN fgUpdateBeacon
459 P_STA_RECORD_T prStaRec;
460 BOOLEAN fgErpProtectMode, fgSta40mIntolerant;
461 BOOLEAN fgUseShortPreamble, fgUseShortSlotTime;
462 ENUM_HT_PROTECT_MODE_T eHtProtectMode;
463 ENUM_GF_MODE_T eGfOperationMode;
469 if (!IS_BSS_ACTIVE(prBssInfo) ||
470 prBssInfo->eCurrentOPMode != OP_MODE_ACCESS_POINT) {
474 fgErpProtectMode = FALSE;
475 eHtProtectMode = HT_PROTECT_MODE_NONE;
476 eGfOperationMode = GF_MODE_NORMAL;
477 fgSta40mIntolerant = FALSE;
478 fgUseShortPreamble = prBssInfo->fgIsShortPreambleAllowed;
479 fgUseShortSlotTime = TRUE;
480 ucHtOpInfo1 = (UINT_8) CHNL_EXT_SCN;
482 prStaList = &prBssInfo->rStaRecOfClientList;
484 LINK_FOR_EACH_ENTRY(prStaRec, prStaList, rLinkEntry, STA_RECORD_T) {
487 DBGLOG(P2P, TRACE, ("prStaRec is NULL in rlmUpdateParamsForAP() \n"));
490 if (prStaRec->fgIsInUse && prStaRec->ucStaState == STA_STATE_3 &&
491 prStaRec->ucNetTypeIndex == prBssInfo->ucNetTypeIndex) {
492 if (!(prStaRec->ucPhyTypeSet &
493 (PHY_TYPE_SET_802_11GN | PHY_TYPE_SET_802_11A))) {
494 /* B-only mode, so mode 1 (ERP protection) */
495 fgErpProtectMode = TRUE;
498 if (!(prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N)) {
499 /* BG-only or A-only */
500 eHtProtectMode = HT_PROTECT_MODE_NON_HT;
502 else if (!(prStaRec->u2HtCapInfo & HT_CAP_INFO_SUP_CHNL_WIDTH)) {
504 if (eHtProtectMode == HT_PROTECT_MODE_NONE) {
505 eHtProtectMode = HT_PROTECT_MODE_20M;
509 if (!(prStaRec->u2HtCapInfo & HT_CAP_INFO_HT_GF)) {
510 eGfOperationMode = GF_MODE_PROTECT;
513 if (!(prStaRec->u2CapInfo & CAP_INFO_SHORT_PREAMBLE)) {
514 fgUseShortPreamble = FALSE;
517 if (!(prStaRec->u2CapInfo & CAP_INFO_SHORT_SLOT_TIME)) {
518 fgUseShortSlotTime = FALSE;
521 if (prStaRec->u2HtCapInfo & HT_CAP_INFO_40M_INTOLERANT) {
522 fgSta40mIntolerant = TRUE;
525 } /* end of LINK_FOR_EACH_ENTRY */
527 /* Check if HT operation IE about 20/40M bandwidth shall be updated */
528 if (prBssInfo->eBssSCO != CHNL_EXT_SCN) {
529 if (/*!LINK_IS_EMPTY(prStaList) && */ !fgSta40mIntolerant &&
530 !prBssInfo->fgObssActionForcedTo20M &&
531 !prBssInfo->fgObssBeaconForcedTo20M) {
533 ucHtOpInfo1 = (UINT_8)
534 (((UINT_32) prBssInfo->eBssSCO) | HT_OP_INFO1_STA_CHNL_WIDTH);
538 /* Check if any new parameter may be updated */
539 if (prBssInfo->fgErpProtectMode != fgErpProtectMode ||
540 prBssInfo->eHtProtectMode != eHtProtectMode ||
541 prBssInfo->eGfOperationMode != eGfOperationMode ||
542 prBssInfo->ucHtOpInfo1 != ucHtOpInfo1 ||
543 prBssInfo->fgUseShortPreamble != fgUseShortPreamble ||
544 prBssInfo->fgUseShortSlotTime != fgUseShortSlotTime) {
546 prBssInfo->fgErpProtectMode = fgErpProtectMode;
547 prBssInfo->eHtProtectMode = eHtProtectMode;
548 prBssInfo->eGfOperationMode = eGfOperationMode;
549 prBssInfo->ucHtOpInfo1 = ucHtOpInfo1;
550 prBssInfo->fgUseShortPreamble = fgUseShortPreamble;
551 prBssInfo->fgUseShortSlotTime = fgUseShortSlotTime;
553 if (fgUseShortSlotTime) {
554 prBssInfo->u2CapInfo |= CAP_INFO_SHORT_SLOT_TIME;
557 prBssInfo->u2CapInfo &= ~CAP_INFO_SHORT_SLOT_TIME;
560 rlmSyncOperationParams(prAdapter, prBssInfo);
561 fgUpdateBeacon = TRUE;
564 /* Update Beacon content if related IE content is changed */
565 if (fgUpdateBeacon) {
566 bssUpdateBeaconContent(prAdapter, prBssInfo->ucNetTypeIndex);
571 /*----------------------------------------------------------------------------*/
573 * \brief Initial the channel list from the domain information.
574 * This function is called after P2P initial and Domain information changed.
575 * Make sure the device is disconnected while changing domain information.
577 * \param[in] prAdapter Pointer of ADAPTER_T
579 * \return boolean value if probe response frame is
581 /*----------------------------------------------------------------------------*/
583 rlmFuncInitialChannelList (
584 IN P_ADAPTER_T prAdapter
587 P_P2P_CONNECTION_SETTINGS_T prP2pConnSetting = (P_P2P_CONNECTION_SETTINGS_T)NULL;
588 P_DOMAIN_INFO_ENTRY prDomainInfoEntry = (P_DOMAIN_INFO_ENTRY)NULL;
589 P_DOMAIN_SUBBAND_INFO prDomainSubBand = (P_DOMAIN_SUBBAND_INFO)NULL;
590 P_CHANNEL_ENTRY_FIELD_T prChannelEntryField = (P_CHANNEL_ENTRY_FIELD_T)NULL;
591 UINT_32 u4Idx = 0, u4IdxII = 0;
592 UINT_8 ucBufferSize = P2P_MAX_SUPPORTED_CHANNEL_LIST_SIZE;
594 UINT_8 ucSocialChnlSupport = 0, ucAutoChnl = 0;
598 ASSERT_BREAK(prAdapter != NULL);
600 prP2pConnSetting = prAdapter->rWifiVar.prP2PConnSettings;
602 ucAutoChnl = prP2pConnSetting->ucOperatingChnl;
605 prDomainInfoEntry = rlmDomainGetDomainInfo(prAdapter);
607 ASSERT_BREAK((prDomainInfoEntry != NULL) && (prP2pConnSetting != NULL));
609 prChannelEntryField = (P_CHANNEL_ENTRY_FIELD_T)prP2pConnSetting->aucChannelEntriesField;
611 for (u4Idx = 0; u4Idx < MAX_SUBBAND_NUM; u4Idx++) {
612 prDomainSubBand = &prDomainInfoEntry->rSubBand[u4Idx];
615 if (((prDomainSubBand->ucBand == BAND_5G) && (!prAdapter->fgEnable5GBand)) ||
616 (prDomainSubBand->ucBand == BAND_NULL)) {
621 if (ucBufferSize < (P2P_ATTRI_LEN_CHANNEL_ENTRY + prDomainSubBand->ucNumChannels)) {
622 /* Buffer is not enough to include all supported channels. */
626 prChannelEntryField->ucRegulatoryClass = prDomainSubBand->ucRegClass;
627 prChannelEntryField->ucNumberOfChannels = prDomainSubBand->ucNumChannels;
629 for (u4IdxII = 0; u4IdxII < prDomainSubBand->ucNumChannels; u4IdxII++) {
630 prChannelEntryField->aucChannelList[u4IdxII] = prDomainSubBand->ucFirstChannelNum +
631 (u4IdxII * prDomainSubBand->ucChannelSpan);
634 switch (prChannelEntryField->aucChannelList[u4IdxII]) {
636 ucSocialChnlSupport = 1;
639 ucSocialChnlSupport = 6;
642 ucSocialChnlSupport = 11;
651 if (ucBufferSize >= (P2P_ATTRI_LEN_CHANNEL_ENTRY + prChannelEntryField->ucNumberOfChannels)) {
652 ucBufferSize -= (P2P_ATTRI_LEN_CHANNEL_ENTRY + prChannelEntryField->ucNumberOfChannels);
659 prChannelEntryField = (P_CHANNEL_ENTRY_FIELD_T)((UINT_32)prChannelEntryField +
660 P2P_ATTRI_LEN_CHANNEL_ENTRY +
661 (UINT_32)prChannelEntryField->ucNumberOfChannels);
666 if (prP2pConnSetting->ucListenChnl == 0) {
667 prP2pConnSetting->ucListenChnl = P2P_DEFAULT_LISTEN_CHANNEL;
669 if (ucSocialChnlSupport != 0) {
670 /* 1. User Not Set LISTEN channel.
671 * 2. Social channel is not empty.
673 prP2pConnSetting->ucListenChnl = ucSocialChnlSupport;
679 // TODO: 20110921 frog -
680 /* If LISTEN channel is not set,
681 * a random supported channel would be set.
682 * If no social channel is supported, DEFAULT channel would be set.
685 prP2pConnSetting->ucRfChannelListSize = P2P_MAX_SUPPORTED_CHANNEL_LIST_SIZE - ucBufferSize;
688 if (prP2pConnSetting->ucOperatingChnl == 0) { /* User not set OPERATE channel. */
690 if (scnQuerySparseChannel(prAdapter, NULL, &ucAutoChnl)) {
694 ucBufferSize = prP2pConnSetting->ucRfChannelListSize;
696 prChannelEntryField = (P_CHANNEL_ENTRY_FIELD_T)prP2pConnSetting->aucChannelEntriesField;
698 while (ucBufferSize != 0) {
699 if (prChannelEntryField->ucNumberOfChannels != 0) {
700 ucAutoChnl = prChannelEntryField->aucChannelList[0];
705 prChannelEntryField = (P_CHANNEL_ENTRY_FIELD_T)((UINT_32)prChannelEntryField +
706 P2P_ATTRI_LEN_CHANNEL_ENTRY +
707 (UINT_32)prChannelEntryField->ucNumberOfChannels);
709 ucBufferSize -= (P2P_ATTRI_LEN_CHANNEL_ENTRY + prChannelEntryField->ucNumberOfChannels);
719 /* We assume user would not set a channel not in the channel list.
720 * If so, the operating channel still depends on target deivce supporting capability.
723 // TODO: 20110921 frog -
724 /* If the Operating channel is not set, a channel from supported channel list is set automatically.
725 * If there is no supported channel in channel list, a DEFAULT channel is set.
731 prP2pConnSetting->ucOperatingChnl = ucAutoChnl;
734 } /* rlmFuncInitialChannelList */
736 /*----------------------------------------------------------------------------*/
738 * \brief Find a common channel list from the local channel list info & target channel list info.
740 * \param[in] prAdapter Pointer of ADAPTER_T
742 * \return boolean value if probe response frame is
744 /*----------------------------------------------------------------------------*/
746 rlmFuncCommonChannelList (
747 IN P_ADAPTER_T prAdapter,
748 IN P_CHANNEL_ENTRY_FIELD_T prChannelEntryII,
749 IN UINT_8 ucChannelListSize
752 P_P2P_CONNECTION_SETTINGS_T prP2pConnSetting = (P_P2P_CONNECTION_SETTINGS_T)NULL;
753 P_CHANNEL_ENTRY_FIELD_T prChannelEntryI = (P_CHANNEL_ENTRY_FIELD_T)NULL, prChannelEntryIII = (P_CHANNEL_ENTRY_FIELD_T)NULL;
754 UINT_8 aucCommonChannelList[P2P_MAX_SUPPORTED_CHANNEL_LIST_SIZE];
755 UINT_8 ucOriChnlSize = 0, ucNewChnlSize = 0;
760 ASSERT_BREAK(prAdapter != NULL);
762 prP2pConnSetting = prAdapter->rWifiVar.prP2PConnSettings;
764 prChannelEntryIII = (P_CHANNEL_ENTRY_FIELD_T)aucCommonChannelList;
766 while (ucChannelListSize > 0) {
768 prChannelEntryI = (P_CHANNEL_ENTRY_FIELD_T)prP2pConnSetting->aucChannelEntriesField;
769 ucOriChnlSize = prP2pConnSetting->ucRfChannelListSize;
771 while (ucOriChnlSize > 0) {
772 if (prChannelEntryI->ucRegulatoryClass == prChannelEntryII->ucRegulatoryClass) {
773 prChannelEntryIII->ucRegulatoryClass = prChannelEntryI->ucRegulatoryClass;
774 // TODO: Currently we assume that the regulatory class the same, the channels are the same.
775 kalMemCopy(prChannelEntryIII->aucChannelList, prChannelEntryII->aucChannelList, prChannelEntryII->ucNumberOfChannels);
776 prChannelEntryIII->ucNumberOfChannels = prChannelEntryII->ucNumberOfChannels;
778 ucNewChnlSize += P2P_ATTRI_LEN_CHANNEL_ENTRY + prChannelEntryIII->ucNumberOfChannels;
780 prChannelEntryIII = (P_CHANNEL_ENTRY_FIELD_T)((UINT_32)prChannelEntryIII +
781 P2P_ATTRI_LEN_CHANNEL_ENTRY +
782 (UINT_32)prChannelEntryIII->ucNumberOfChannels);
785 ucOriChnlSize -= (P2P_ATTRI_LEN_CHANNEL_ENTRY + prChannelEntryI->ucNumberOfChannels);
787 prChannelEntryI = (P_CHANNEL_ENTRY_FIELD_T)((UINT_32)prChannelEntryI +
788 P2P_ATTRI_LEN_CHANNEL_ENTRY +
789 (UINT_32)prChannelEntryI->ucNumberOfChannels);
795 ucChannelListSize -= (P2P_ATTRI_LEN_CHANNEL_ENTRY + prChannelEntryII->ucNumberOfChannels);
797 prChannelEntryII = (P_CHANNEL_ENTRY_FIELD_T)((UINT_32)prChannelEntryII +
798 P2P_ATTRI_LEN_CHANNEL_ENTRY +
799 (UINT_32)prChannelEntryII->ucNumberOfChannels);
805 kalMemCopy(prP2pConnSetting->aucChannelEntriesField, aucCommonChannelList, ucNewChnlSize);
806 prP2pConnSetting->ucRfChannelListSize = ucNewChnlSize;
811 } /* rlmFuncCommonChannelList */
814 /*----------------------------------------------------------------------------*/
822 /*----------------------------------------------------------------------------*/
824 rlmFuncFindOperatingClass (
825 IN P_ADAPTER_T prAdapter,
826 IN UINT_8 ucChannelNum
829 UINT_8 ucRegulatoryClass = 0, ucBufferSize = 0;
830 P_P2P_CONNECTION_SETTINGS_T prP2pConnSetting = (P_P2P_CONNECTION_SETTINGS_T)NULL;
831 P_CHANNEL_ENTRY_FIELD_T prChannelEntryField = (P_CHANNEL_ENTRY_FIELD_T)NULL;
835 ASSERT_BREAK(prAdapter != NULL);
837 prP2pConnSetting = prAdapter->rWifiVar.prP2PConnSettings;
838 ucBufferSize = prP2pConnSetting->ucRfChannelListSize;
839 prChannelEntryField = (P_CHANNEL_ENTRY_FIELD_T)prP2pConnSetting->aucChannelEntriesField;
841 while (ucBufferSize != 0) {
843 for (u4Idx = 0; u4Idx < prChannelEntryField->ucNumberOfChannels; u4Idx++) {
844 if (prChannelEntryField->aucChannelList[u4Idx] == ucChannelNum) {
845 ucRegulatoryClass = prChannelEntryField->ucRegulatoryClass;
852 if (ucRegulatoryClass != 0) {
856 prChannelEntryField = (P_CHANNEL_ENTRY_FIELD_T)((UINT_32)prChannelEntryField +
857 P2P_ATTRI_LEN_CHANNEL_ENTRY +
858 (UINT_32)prChannelEntryField->ucNumberOfChannels);
860 ucBufferSize -= (P2P_ATTRI_LEN_CHANNEL_ENTRY + prChannelEntryField->ucNumberOfChannels);
868 return ucRegulatoryClass;
869 } /* rlmFuncFindOperatingClass */
872 /*----------------------------------------------------------------------------*/
880 /*----------------------------------------------------------------------------*/
882 rlmFuncFindAvailableChannel (
883 IN P_ADAPTER_T prAdapter,
884 IN UINT_8 ucCheckChnl,
885 IN PUINT_8 pucSuggestChannel,
886 IN BOOLEAN fgIsSocialChannel,
887 IN BOOLEAN fgIsDefaultChannel
890 BOOLEAN fgIsResultAvailable = FALSE;
891 P_CHANNEL_ENTRY_FIELD_T prChannelEntry = (P_CHANNEL_ENTRY_FIELD_T)NULL;
892 P_P2P_CONNECTION_SETTINGS_T prP2pConnSetting = (P_P2P_CONNECTION_SETTINGS_T)NULL;
893 UINT_8 ucBufferSize = 0, ucIdx = 0, ucChannelSelected = 0;
896 ASSERT_BREAK(prAdapter != NULL);
898 if (fgIsDefaultChannel) {
899 ucChannelSelected = P2P_DEFAULT_LISTEN_CHANNEL;
903 prP2pConnSetting = prAdapter->rWifiVar.prP2PConnSettings;
904 ucBufferSize = prP2pConnSetting->ucRfChannelListSize;
905 prChannelEntry = (P_CHANNEL_ENTRY_FIELD_T)prP2pConnSetting->aucChannelEntriesField;
907 while ((ucBufferSize != 0) && (!fgIsResultAvailable)) {
909 for (ucIdx = 0; ucIdx < prChannelEntry->ucNumberOfChannels; ucIdx++) {
910 if ((!fgIsSocialChannel) ||
911 (prChannelEntry->aucChannelList[ucIdx] == 1) ||
912 (prChannelEntry->aucChannelList[ucIdx] == 6) ||
913 (prChannelEntry->aucChannelList[ucIdx] == 11)) {
915 if (prChannelEntry->aucChannelList[ucIdx] <= 11) {
917 ucChannelSelected = prChannelEntry->aucChannelList[ucIdx];
919 else if ((prChannelEntry->aucChannelList[ucIdx] < 52) &&
920 (prChannelEntry->aucChannelList[ucIdx] > 14)) {
922 ucChannelSelected = prChannelEntry->aucChannelList[ucIdx];
925 if (ucChannelSelected == ucCheckChnl) {
926 fgIsResultAvailable = TRUE;
934 ucBufferSize -= (P2P_ATTRI_LEN_CHANNEL_ENTRY + prChannelEntry->ucNumberOfChannels);
936 prChannelEntry = (P_CHANNEL_ENTRY_FIELD_T)((UINT_32)prChannelEntry +
937 P2P_ATTRI_LEN_CHANNEL_ENTRY +
938 (UINT_32)prChannelEntry->ucNumberOfChannels);
944 if ((!fgIsResultAvailable) && (pucSuggestChannel != NULL)) {
945 DBGLOG(P2P, TRACE, ("The request channel %d is not available, sugguested channel:%d\n", ucCheckChnl, ucChannelSelected));
946 // Given a suggested channel.
947 *pucSuggestChannel = ucChannelSelected;
953 return fgIsResultAvailable;
956 /*----------------------------------------------------------------------------*/
964 /*----------------------------------------------------------------------------*/
967 P_ADAPTER_T prAdapter,
968 P_BSS_INFO_T prBssInfo
971 P_DOMAIN_SUBBAND_INFO prSubband;
972 P_DOMAIN_INFO_ENTRY prDomainInfo;
973 UINT_8 ucSecondChannel, i, j;
974 ENUM_CHNL_EXT_T eSCO;
978 if (prBssInfo->eBand == BAND_2G4) {
979 if (prBssInfo->ucPrimaryChannel != 14) {
980 eSCO = (prBssInfo->ucPrimaryChannel > 7) ?
981 CHNL_EXT_SCB : CHNL_EXT_SCA;
985 prDomainInfo = rlmDomainGetDomainInfo(prAdapter);
986 ASSERT(prDomainInfo);
988 for (i = 0; i < MAX_SUBBAND_NUM; i++) {
989 prSubband = &prDomainInfo->rSubBand[i];
990 if (prSubband->ucBand == prBssInfo->eBand) {
991 for (j = 0; j < prSubband->ucNumChannels; j++) {
992 if ((prSubband->ucFirstChannelNum + j*prSubband->ucChannelSpan)
993 == prBssInfo->ucPrimaryChannel) {
994 eSCO = (j & 1) ? CHNL_EXT_SCB : CHNL_EXT_SCA;
999 if (j < prSubband->ucNumChannels) {
1006 /* Check if it is boundary channel and 40MHz BW is permitted */
1007 if (eSCO != CHNL_EXT_SCN) {
1008 ucSecondChannel = (eSCO == CHNL_EXT_SCA) ?
1009 (prBssInfo->ucPrimaryChannel+ 4) : (prBssInfo->ucPrimaryChannel- 4);
1011 if (!rlmDomainIsLegalChannel(prAdapter, prBssInfo->eBand, ucSecondChannel)){
1012 eSCO = CHNL_EXT_SCN;