diff options
| author | Chandrasekaran, Manishekar <cmshekar@qti.qualcomm.com> | 2015-02-09 14:16:02 +0530 |
|---|---|---|
| committer | AnjaneeDevi Kapparapu <c_akappa@qti.qualcomm.com> | 2015-02-17 17:13:16 +0530 |
| commit | 74dfc6d808f8fdf7fcc924aa3fd2590daa0fe320 (patch) | |
| tree | f9dc131d8dbff8804df7016106859e0685188a03 | |
| parent | 0ad694f099d6e50349bbb84699d3429b4a21396a (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.h | 6 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg.c | 11 | ||||
| -rw-r--r-- | CORE/MAC/inc/aniGlobal.h | 1 | ||||
| -rw-r--r-- | CORE/SAP/src/sapFsm.c | 65 | ||||
| -rw-r--r-- | CORE/SME/inc/sme_Api.h | 1 | ||||
| -rw-r--r-- | CORE/SME/src/sme_common/sme_Api.c | 4 |
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 ); } |
