summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChandrasekaran, Manishekar <cmshekar@qti.qualcomm.com>2015-02-09 14:16:02 +0530
committerAnjaneeDevi Kapparapu <c_akappa@qti.qualcomm.com>2015-02-17 17:13:16 +0530
commit74dfc6d808f8fdf7fcc924aa3fd2590daa0fe320 (patch)
treef9dc131d8dbff8804df7016106859e0685188a03
parent0ad694f099d6e50349bbb84699d3429b4a21396a (diff)
qcacld: Prioritize non-DFS channels on radar detection
This change will prioritize non-DFS channels over DFS channels while selecting the new channel after radar detection. After radar detection, if DUT moves to DFS channel, the connection between the peer and DUT will get terminated due to CAC time. To avoid this, the new channel chosen will be a non-DFS channel. Only when non-DFS channels are unavailable, the DFS channels will be chosen as the new channel for SAP/P2P GO INI entry 'gPreferNonDfsChanOnRadar' can be used to select if this preference to select non-DFS channels is required. By default this entry will be zero, i.e., the channel selected can be either DFS or non-DFS. Only when this INI entry is set to its max value of 1, the prioritization of non-DFS channel will happen. Change-Id: I19fe9a47110ad99173a4594e50a3b02337587156 CRs-Fixed: 792996
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h6
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c11
-rw-r--r--CORE/MAC/inc/aniGlobal.h1
-rw-r--r--CORE/SAP/src/sapFsm.c65
-rw-r--r--CORE/SME/inc/sme_Api.h1
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c4
6 files changed, 68 insertions, 20 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index f7471f3b8edb..17a542fb1081 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -2751,6 +2751,11 @@ enum dot11p_mode {
#define CFG_SAP_MCC_CHANNEL_AVOIDANCE_DEFAULT ( 0 )
#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
+#define CFG_ENABLE_NON_DFS_CHAN_ON_RADAR "gPreferNonDfsChanOnRadar"
+#define CFG_ENABLE_NON_DFS_CHAN_ON_RADAR_MIN (0)
+#define CFG_ENABLE_NON_DFS_CHAN_ON_RADAR_MAX (1)
+#define CFG_ENABLE_NON_DFS_CHAN_ON_RADAR_DEFAULT (0)
+
/*---------------------------------------------------------------------------
Type declarations
-------------------------------------------------------------------------*/
@@ -3350,6 +3355,7 @@ typedef struct
#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
bool sap_channel_avoidance;
#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
+ uint8_t prefer_non_dfs_on_radar;
} hdd_config_t;
#ifdef WLAN_FEATURE_MBSSID
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 4d593e57370c..fc41b3abd017 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -3566,6 +3566,14 @@ REG_TABLE_ENTRY g_registry_table[] =
CFG_SAP_MCC_CHANNEL_AVOIDANCE_MIN,
CFG_SAP_MCC_CHANNEL_AVOIDANCE_MAX ),
#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
+
+ REG_VARIABLE(CFG_ENABLE_NON_DFS_CHAN_ON_RADAR, WLAN_PARAM_Integer,
+ hdd_config_t, prefer_non_dfs_on_radar,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_NON_DFS_CHAN_ON_RADAR_DEFAULT,
+ CFG_ENABLE_NON_DFS_CHAN_ON_RADAR_MIN,
+ CFG_ENABLE_NON_DFS_CHAN_ON_RADAR_MAX),
+
};
#ifdef WLAN_FEATURE_MBSSID
@@ -6041,6 +6049,9 @@ VOS_STATUS hdd_set_sme_config( hdd_context_t *pHddCtx )
pHddCtx->cfg_ini->sap_channel_avoidance;
#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
+ smeConfig->f_prefer_non_dfs_on_radar =
+ pHddCtx->cfg_ini->prefer_non_dfs_on_radar;
+
halStatus = sme_UpdateConfig( pHddCtx->hHal, smeConfig);
if ( !HAL_STATUS_SUCCESS( halStatus ) )
{
diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h
index 21f657136f00..20b5de7c630d 100644
--- a/CORE/MAC/inc/aniGlobal.h
+++ b/CORE/MAC/inc/aniGlobal.h
@@ -1050,6 +1050,7 @@ typedef struct sAniSirGlobal
/* 802.11p enable */
bool enable_dot11p;
uint32_t f_sta_miracast_mcc_rest_time_val;
+ uint8_t f_prefer_non_dfs_on_radar;
} tAniSirGlobal;
typedef enum
diff --git a/CORE/SAP/src/sapFsm.c b/CORE/SAP/src/sapFsm.c
index 14eb4e322a89..ba176574f5eb 100644
--- a/CORE/SAP/src/sapFsm.c
+++ b/CORE/SAP/src/sapFsm.c
@@ -1362,8 +1362,12 @@ static v_U8_t sapRandomChannelSel(ptSapContext sapContext)
{
v_U32_t random_byte = 0;
v_U8_t available_chnl_count = 0;
+ uint8_t avail_dfs_chan_count = 0;
+ uint8_t avail_non_dfs_chan_count = 0;
v_U8_t valid_chnl_count = 0;
v_U8_t availableChannels[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0,};
+ uint8_t avail_dfs_chan_list[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0,};
+ uint8_t avail_non_dfs_chan_list[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0,};
v_U8_t target_channel = 0;
v_BOOL_t isChannelNol = VOS_FALSE;
v_BOOL_t isOutOfRange = VOS_FALSE;
@@ -1671,30 +1675,51 @@ static v_U8_t sapRandomChannelSel(ptSapContext sapContext)
* no channels are avaialbe
*/
if (available_chnl_count) {
- vos_rand_get_bytes(0, (v_U8_t*)&random_byte, 1);
- i = (random_byte + vos_timer_get_system_ticks()) %
- available_chnl_count;
- /* Random channel selection from available list */
- target_channel = availableChannels[i];
- pMac->sap.SapDfsInfo.new_chanWidth = chanWidth;
- pMac->sap.SapDfsInfo.new_cbMode = cbModeCurrent;
- VOS_TRACE(VOS_MODULE_ID_SAP,
- VOS_TRACE_LEVEL_INFO_LOW,
- FL("sapdfs: New CB mode = %d"),
- pMac->sap.SapDfsInfo.new_cbMode);
- VOS_TRACE(VOS_MODULE_ID_SAP,
- VOS_TRACE_LEVEL_INFO_LOW,
- FL("sapdfs: New Channel width = %d"),
- pMac->sap.SapDfsInfo.new_chanWidth);
- VOS_TRACE(VOS_MODULE_ID_SAP,
- VOS_TRACE_LEVEL_INFO_LOW,
- FL("sapdfs: target_channel = %d"), target_channel);
- }
- else {
+ for (i=0;i<available_chnl_count;i++) {
+ if (VOS_IS_DFS_CH(availableChannels[i])) {
+ avail_dfs_chan_list[avail_dfs_chan_count++] =
+ availableChannels[i];
+ } else {
+ avail_non_dfs_chan_list[avail_non_dfs_chan_count++] =
+ availableChannels[i];
+ }
+ }
+ } else {
VOS_TRACE(VOS_MODULE_ID_SAP,
VOS_TRACE_LEVEL_INFO_LOW,
FL("No target channel found"));
+ break;
}
+
+ vos_rand_get_bytes(0, (v_U8_t*)&random_byte, 1);
+ /* Give preference to non-DFS channel */
+ if (!pMac->f_prefer_non_dfs_on_radar) {
+ i = (random_byte + vos_timer_get_system_ticks()) %
+ available_chnl_count;
+ target_channel = availableChannels[i];
+ } else if (avail_non_dfs_chan_count) {
+ i = (random_byte + vos_timer_get_system_ticks()) %
+ avail_non_dfs_chan_count;
+ target_channel = avail_non_dfs_chan_list[i];
+ } else {
+ i = (random_byte + vos_timer_get_system_ticks()) %
+ avail_dfs_chan_count;
+ target_channel = avail_dfs_chan_list[i];
+ }
+
+ pMac->sap.SapDfsInfo.new_chanWidth = chanWidth;
+ pMac->sap.SapDfsInfo.new_cbMode = cbModeCurrent;
+ VOS_TRACE(VOS_MODULE_ID_SAP,
+ VOS_TRACE_LEVEL_INFO_LOW,
+ FL("sapdfs: New CB mode = %d"),
+ pMac->sap.SapDfsInfo.new_cbMode);
+ VOS_TRACE(VOS_MODULE_ID_SAP,
+ VOS_TRACE_LEVEL_INFO_LOW,
+ FL("sapdfs: New Channel width = %d"),
+ pMac->sap.SapDfsInfo.new_chanWidth);
+ VOS_TRACE(VOS_MODULE_ID_SAP,
+ VOS_TRACE_LEVEL_INFO_LOW,
+ FL("sapdfs: target_channel = %d"), target_channel);
break;
} while(1); /* this loop will iterate at max 3 times */
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 2ce58971a33b..c1fe2444fa93 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -125,6 +125,7 @@ typedef struct _smeConfigParams
#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
bool sap_channel_avoidance;
#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
+ uint8_t f_prefer_non_dfs_on_radar;
} tSmeConfigParams, *tpSmeConfigParams;
typedef enum
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 0915f94f1d50..f4a5c6969eb4 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -1670,6 +1670,9 @@ eHalStatus sme_UpdateConfig(tHalHandle hHal, tpSmeConfigParams pSmeConfigParams)
pMac->sap.sap_channel_avoidance = pSmeConfigParams->sap_channel_avoidance;
#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
+ pMac->f_prefer_non_dfs_on_radar =
+ pSmeConfigParams->f_prefer_non_dfs_on_radar;
+
return status;
}
@@ -4447,6 +4450,7 @@ eHalStatus sme_GetConfigParam(tHalHandle hHal, tSmeConfigParams *pParam)
#ifdef FEATURE_BUS_AUTO_SUSPEND
pParam->enable_bus_auto_suspend = pMac->sme.enable_bus_auto_suspend;
#endif
+ pParam->f_prefer_non_dfs_on_radar = pMac->f_prefer_non_dfs_on_radar;
sme_ReleaseGlobalLock( &pMac->sme );
}