wlan: Add support for PER based roaming #1
In congested environments, it could be possible that in station
mode client gets good RSSI from AP however it's not able to
transfer data at good rates. DUT should roam to a better AP if
available, if it faces congestion in home channel.
Following changes are added for this functionality:
1. Add changes to monitor Rx and Tx rates to trigger roam scan
in case data rates are low below a preconfigured value.
2. Implement a new AP selection algorithm which will consider AP
capability, channel conditions and RSSI to select new bss.
Add required HDD changes for same.
Change-Id: I8dfa2bdc9643cb597b58b919489eb36eff83621d
CRs-Fixed: 1031345
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 63cdf9f..74e6d78 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -903,6 +903,78 @@
#define CFG_ROAM_SCAN_OFFLOAD_ENABLED_MIN (0)
#define CFG_ROAM_SCAN_OFFLOAD_ENABLED_MAX (1)
#define CFG_ROAM_SCAN_OFFLOAD_ENABLED_DEFAULT (1)
+
+/* Enable/disable PER based roaming */
+#define CFG_PER_ROAM_SCAN_OFFLOAD_ENABLED "gPERRoamEnable"
+#define CFG_PER_ROAM_SCAN_OFFLOAD_ENABLED_MIN (0)
+#define CFG_PER_ROAM_SCAN_OFFLOAD_ENABLED_MAX (1)
+#define CFG_PER_ROAM_SCAN_OFFLOAD_ENABLED_DEFAULT (0)
+
+/*
+ * Rate at which to stop monitoring data rates for PER based Roam
+ * Value: MBPS * 10
+ * Min: Minimum rate of data transfer
+ * Max: Max rate for 1x1 transmission
+ */
+#define CFG_PER_ROAM_SCAN_RATE_UP_THRESHOLD "gPERRoamUpThresholdRate"
+#define CFG_PER_ROAM_SCAN_RATE_UP_THRESHOLD_MIN (10)
+#define CFG_PER_ROAM_SCAN_RATE_UP_THRESHOLD_MAX (3330)
+#define CFG_PER_ROAM_SCAN_RATE_UP_THRESHOLD_DEFAULT (400)
+
+/*
+ * rate at which to start monitoring data rates for PER based roam
+ * Value: MBPS * 10
+ */
+#define CFG_PER_ROAM_SCAN_RATE_DOWN_THRESHOLD "gPERRoamDownThresholdRate"
+#define CFG_PER_ROAM_SCAN_RATE_DOWN_THRESHOLD_MIN (10)
+#define CFG_PER_ROAM_SCAN_RATE_DOWN_THRESHOLD_MAX (3330)
+#define CFG_PER_ROAM_SCAN_RATE_DOWN_THRESHOLD_DEFAULT (100)
+
+/*
+ * time to wait before start monitoring again once a roam scan has been
+ * triggered. (Minimum time difference between two scans)
+ * Value : seconds
+ */
+#define CFG_PER_ROAM_SCAN_WAIT_TIME "gPERRoamScanInterval"
+#define CFG_PER_ROAM_SCAN_WAIT_TIME_MIN (0)
+#define CFG_PER_ROAM_SCAN_WAIT_TIME_MAX (3600)
+#define CFG_PER_ROAM_SCAN_WAIT_TIME_DEFAULT (1200)
+
+/* Time to collect stats to trigger roam scan for Tx path */
+#define CFG_PER_ROAM_SCAN_PER_TIME_THRESHOLD "gPERRoamStatsTime"
+#define CFG_PER_ROAM_SCAN_PER_TIME_THRESHOLD_MIN (0)
+#define CFG_PER_ROAM_SCAN_PER_TIME_THRESHOLD_MAX (25)
+#define CFG_PER_ROAM_SCAN_PER_TIME_THRESHOLD_DEFAULT (20)
+
+/* Rx monitoring is enabled to trigger a PER based roam scan */
+#define CFG_PER_ROAM_SCAN_RX_MONITOR_ENABLED "gPERRoamRxMonitorEnable"
+#define CFG_PER_ROAM_SCAN_RX_MONITOR_ENABLED_MIN (0)
+#define CFG_PER_ROAM_SCAN_RX_MONITOR_ENABLED_MAX (1)
+#define CFG_PER_ROAM_SCAN_RX_MONITOR_ENABLED_DEFAULT (0)
+
+/*
+ * Minimum number of packets required to consider if PER based roam scan
+ * needs to be triggered in Rx
+ */
+#define CFG_PER_ROAM_SCAN_RX_MIN_PACKETS "gPERRoamRxPktThreshold"
+#define CFG_PER_ROAM_SCAN_RX_MIN_PACKETS_MIN (10)
+#define CFG_PER_ROAM_SCAN_RX_MIN_PACKETS_MAX (10000)
+#define CFG_PER_ROAM_SCAN_RX_MIN_PACKETS_DEFAULT (100)
+
+/*
+ * Minimum percentage of packets needs to be below gPERRoamScanRateDownThreshold
+ * to trigger a roam scan
+ */
+#define CFG_PER_ROAM_SCAN_MIN_PERCENTAGE "gPERRoamTriggerPercent"
+#define CFG_PER_ROAM_SCAN_MIN_PERCENTAGE_MIN (20)
+#define CFG_PER_ROAM_SCAN_MIN_PERCENTAGE_MAX (100)
+#define CFG_PER_ROAM_SCAN_MIN_PERCENTAGE_DEFAULT (60)
+
+/* Channel sensing is enabled/disabled for PER based roam scan */
+#define CFG_PER_ROAM_SCAN_CCA_ENABLED "gPERRoamCCAEnabled"
+#define CFG_PER_ROAM_SCAN_CCA_ENABLED_MIN (0)
+#define CFG_PER_ROAM_SCAN_CCA_ENABLED_MAX (1)
+#define CFG_PER_ROAM_SCAN_CCA_ENABLED_DEFAULT (0)
#endif
#define CFG_QOS_WMM_PKT_CLASSIFY_BASIS_NAME "PktClassificationBasis" // DSCP or 802.1Q
@@ -2978,6 +3050,15 @@
#endif
#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
v_BOOL_t isRoamOffloadScanEnabled;
+ v_BOOL_t isPERRoamEnabled;
+ v_BOOL_t isPERRoamRxPathEnabled;
+ v_BOOL_t isPERRoamCCAEnabled;
+ v_U16_t rateUpThreshold;
+ v_U16_t rateDownThreshold;
+ v_U16_t PERroamTriggerPercent;
+ v_U32_t waitPeriodForNextPERScan;
+ v_U32_t PERtimerThreshold;
+ v_U32_t PERroamRxPktsThreshold;
#endif
hdd_wmm_classification_t PktClassificationBasis; // DSCP or 802.1Q
v_BOOL_t bImplicitQosEnabled;
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index b3889c0..5dacc1a 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -1144,6 +1144,14 @@
}
hdd_wmm_adapter_clear(pAdapter);
+ /* Clear PER based roam stats */
+#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
+ if (sme_IsFeatureSupportedByFW(PER_BASED_ROAMING) &&
+ (WLAN_HDD_INFRA_STATION == pAdapter->device_mode) &&
+ pHddCtx->cfg_ini && pHddCtx->cfg_ini->isPERRoamEnabled &&
+ pHddCtx->cfg_ini->isPERRoamRxPathEnabled)
+ sme_unset_per_roam_rxconfig(pHddCtx->hHal);
+#endif
#if defined(WLAN_FEATURE_VOWIFI_11R)
sme_FTReset(WLAN_HDD_GET_HAL_CTX(pAdapter));
#endif
@@ -1595,6 +1603,22 @@
pAdapter->maxRateFlags = pRoamInfo->maxRateFlags;
// Save the connection info from CSR...
hdd_connSaveConnectInfo( pAdapter, pRoamInfo, eCSR_BSS_TYPE_INFRASTRUCTURE );
+
+#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
+ if (sme_IsFeatureSupportedByFW(PER_BASED_ROAMING) &&
+ (WLAN_HDD_INFRA_STATION == pAdapter->device_mode) &&
+ !hddDisconInProgress &&
+ pHddCtx->cfg_ini && pHddCtx->cfg_ini->isPERRoamEnabled &&
+ pHddCtx->cfg_ini->isPERRoamRxPathEnabled)
+ sme_set_per_roam_rxconfig(pHddCtx->hHal,
+ pHddStaCtx->conn_info.staId[0],
+ pHddCtx->cfg_ini->rateDownThreshold,
+ pHddCtx->cfg_ini->rateUpThreshold,
+ pHddCtx->cfg_ini->PERroamTriggerPercent,
+ pHddCtx->cfg_ini->PERroamRxPktsThreshold,
+ pHddCtx->cfg_ini->waitPeriodForNextPERScan);
+#endif
+
#ifdef FEATURE_WLAN_WAPI
if ( pRoamInfo->u.pConnectedProfile->AuthType == eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE ||
pRoamInfo->u.pConnectedProfile->AuthType == eCSR_AUTH_TYPE_WAPI_WAI_PSK )
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index a3c8b6d..c659b1c 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -2776,6 +2776,69 @@
CFG_ENABLE_FAST_ROAM_IN_CONCURRENCY_MIN,
CFG_ENABLE_FAST_ROAM_IN_CONCURRENCY_MAX,
cbNotifySetEnableFastRoamInConcurrency, 0 ),
+
+ REG_VARIABLE(CFG_PER_ROAM_SCAN_OFFLOAD_ENABLED, WLAN_PARAM_Integer,
+ hdd_config_t, isPERRoamEnabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PER_ROAM_SCAN_OFFLOAD_ENABLED_DEFAULT,
+ CFG_PER_ROAM_SCAN_OFFLOAD_ENABLED_MIN,
+ CFG_PER_ROAM_SCAN_OFFLOAD_ENABLED_MAX),
+
+ REG_VARIABLE(CFG_PER_ROAM_SCAN_RATE_UP_THRESHOLD, WLAN_PARAM_Integer,
+ hdd_config_t, rateUpThreshold,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PER_ROAM_SCAN_RATE_UP_THRESHOLD_DEFAULT,
+ CFG_PER_ROAM_SCAN_RATE_UP_THRESHOLD_MIN,
+ CFG_PER_ROAM_SCAN_RATE_UP_THRESHOLD_MAX),
+
+ REG_VARIABLE(CFG_PER_ROAM_SCAN_RATE_DOWN_THRESHOLD, WLAN_PARAM_Integer,
+ hdd_config_t, rateDownThreshold,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PER_ROAM_SCAN_RATE_DOWN_THRESHOLD_DEFAULT,
+ CFG_PER_ROAM_SCAN_RATE_DOWN_THRESHOLD_MIN,
+ CFG_PER_ROAM_SCAN_RATE_DOWN_THRESHOLD_MAX),
+
+ REG_VARIABLE(CFG_PER_ROAM_SCAN_WAIT_TIME, WLAN_PARAM_Integer,
+ hdd_config_t, waitPeriodForNextPERScan,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PER_ROAM_SCAN_WAIT_TIME_DEFAULT,
+ CFG_PER_ROAM_SCAN_WAIT_TIME_MIN,
+ CFG_PER_ROAM_SCAN_WAIT_TIME_MAX),
+
+ REG_VARIABLE(CFG_PER_ROAM_SCAN_PER_TIME_THRESHOLD, WLAN_PARAM_Integer,
+ hdd_config_t, PERtimerThreshold,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PER_ROAM_SCAN_PER_TIME_THRESHOLD_DEFAULT,
+ CFG_PER_ROAM_SCAN_PER_TIME_THRESHOLD_MIN,
+ CFG_PER_ROAM_SCAN_PER_TIME_THRESHOLD_MAX),
+
+ REG_VARIABLE(CFG_PER_ROAM_SCAN_RX_MONITOR_ENABLED, WLAN_PARAM_Integer,
+ hdd_config_t, isPERRoamRxPathEnabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PER_ROAM_SCAN_RX_MONITOR_ENABLED_DEFAULT,
+ CFG_PER_ROAM_SCAN_RX_MONITOR_ENABLED_MIN,
+ CFG_PER_ROAM_SCAN_RX_MONITOR_ENABLED_MAX),
+
+ REG_VARIABLE(CFG_PER_ROAM_SCAN_MIN_PERCENTAGE, WLAN_PARAM_Integer,
+ hdd_config_t, PERroamTriggerPercent,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PER_ROAM_SCAN_MIN_PERCENTAGE_DEFAULT,
+ CFG_PER_ROAM_SCAN_MIN_PERCENTAGE_MIN,
+ CFG_PER_ROAM_SCAN_MIN_PERCENTAGE_MAX),
+
+ REG_VARIABLE(CFG_PER_ROAM_SCAN_RX_MIN_PACKETS, WLAN_PARAM_Integer,
+ hdd_config_t, PERroamRxPktsThreshold,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PER_ROAM_SCAN_RX_MIN_PACKETS_DEFAULT,
+ CFG_PER_ROAM_SCAN_RX_MIN_PACKETS_MIN,
+ CFG_PER_ROAM_SCAN_RX_MIN_PACKETS_MAX),
+
+ REG_VARIABLE(CFG_PER_ROAM_SCAN_CCA_ENABLED, WLAN_PARAM_Integer,
+ hdd_config_t, isPERRoamCCAEnabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PER_ROAM_SCAN_CCA_ENABLED_DEFAULT,
+ CFG_PER_ROAM_SCAN_CCA_ENABLED_MIN,
+ CFG_PER_ROAM_SCAN_CCA_ENABLED_MAX),
#endif
REG_VARIABLE( CFG_ENABLE_ADAPT_RX_DRAIN_NAME, WLAN_PARAM_Integer,
@@ -4148,6 +4211,44 @@
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
"Name = [%s] Value = [%u] ", CFG_SAP_PROBE_RESP_OFFLOAD_NAME,
pHddCtx->cfg_ini->sap_probe_resp_offload);
+
+#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [gPERRoamStatsTime] Value = [%lu] ",
+ (long unsigned int)pHddCtx->cfg_ini->PERtimerThreshold);
+
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [gPERRoamRxMonitorEnabled] Value = [%u] ",
+ pHddCtx->cfg_ini->isPERRoamRxPathEnabled);
+
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [gPERRoamTriggerPercent] Value = [%u] ",
+ pHddCtx->cfg_ini->PERroamTriggerPercent);
+
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [gPERRoamRxPktThreshold] Value = [%u] ",
+ pHddCtx->cfg_ini->PERroamRxPktsThreshold);
+
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [gPERRoamCCAEnabled] Value = [%u] ",
+ pHddCtx->cfg_ini->isPERRoamCCAEnabled);
+
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [gPERRoamScanInterval] Value = [%lu] ",
+ (long unsigned int)pHddCtx->cfg_ini->waitPeriodForNextPERScan);
+
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [gPERRoamDownThresholdRate] Value = [%u] ",
+ pHddCtx->cfg_ini->rateDownThreshold);
+
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [gPERRoamEnable] Value = [%u] ",
+ pHddCtx->cfg_ini->isPERRoamEnabled);
+
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [gPERRoamUpThresholdRate] Value = [%u] ",
+ pHddCtx->cfg_ini->rateUpThreshold);
+#endif
}
@@ -5928,8 +6029,20 @@
smeConfig->csrConfig.isWESModeEnabled = pConfig->isWESModeEnabled;
#endif
#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
- smeConfig->csrConfig.isRoamOffloadScanEnabled = pConfig->isRoamOffloadScanEnabled;
- smeConfig->csrConfig.bFastRoamInConIniFeatureEnabled = pConfig->bFastRoamInConIniFeatureEnabled;
+ smeConfig->csrConfig.isRoamOffloadScanEnabled =
+ pConfig->isRoamOffloadScanEnabled;
+ smeConfig->csrConfig.bFastRoamInConIniFeatureEnabled =
+ pConfig->bFastRoamInConIniFeatureEnabled;
+ smeConfig->csrConfig.isPERRoamEnabled =
+ pConfig->isPERRoamEnabled;
+ smeConfig->csrConfig.rateUpThreshold = pConfig->rateUpThreshold;
+ smeConfig->csrConfig.rateDownThreshold = pConfig->rateDownThreshold;
+ smeConfig->csrConfig.waitPeriodForNextPERScan =
+ pConfig->waitPeriodForNextPERScan;
+ smeConfig->csrConfig.PERtimerThreshold = pConfig->PERtimerThreshold;
+ smeConfig->csrConfig.isPERRoamCCAEnabled = pConfig->isPERRoamCCAEnabled;
+ smeConfig->csrConfig.PERroamTriggerPercent = pConfig->PERroamTriggerPercent;
+
if (0 == smeConfig->csrConfig.isRoamOffloadScanEnabled)
{