summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h24
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c48
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c83
-rw-r--r--CORE/MAC/inc/sirApi.h2
-rw-r--r--CORE/SERVICES/WMA/wma.c16
-rw-r--r--CORE/SERVICES/WMA/wma.h2
-rw-r--r--CORE/SME/inc/csrApi.h2
-rw-r--r--CORE/SME/inc/csrInternal.h2
-rw-r--r--CORE/SME/inc/csrNeighborRoam.h12
-rw-r--r--CORE/SME/inc/sme_Api.h51
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c8
-rw-r--r--CORE/SME/src/csr/csrNeighborRoam.c122
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c105
13 files changed, 468 insertions, 9 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 4f7a8c7debfa..2137fbd00d72 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -1215,6 +1215,28 @@ typedef enum
#define CFG_NEIGHBOR_LOOKUP_RSSI_THRESHOLD_MAX (120)
#define CFG_NEIGHBOR_LOOKUP_RSSI_THRESHOLD_DEFAULT (78)
+/*
+ * This parameter is the drop in RSSI value that will trigger a precautionary
+ * scan by firmware.
+ * MAX value is choose so that this type of scan can be disabled by user.
+ */
+#define CFG_ROAM_RESCAN_RSSI_DIFF_NAME "gRoamRescanRssiDiff"
+#define CFG_ROAM_RESCAN_RSSI_DIFF_MIN (0)
+#define CFG_ROAM_RESCAN_RSSI_DIFF_MAX (100)
+#define CFG_ROAM_RESCAN_RSSI_DIFF_DEFAULT (5)
+
+/*
+ * This parameter is the RSSI diff above neighbor lookup threshold, when
+ * opportunistic scan should be triggered.
+ * MAX value is choose so that this type of scan can be always enabled by user.
+ * MIN value will cause opportunistic scan to be triggered in neighbor lookup
+ * RSSI range.
+ */
+#define CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_NAME "gOpportunisticThresholdDiff"
+#define CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_MIN (0)
+#define CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_MAX (127)
+#define CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_DEFAULT (30)
+
#define CFG_NEIGHBOR_SCAN_CHAN_LIST_NAME "gNeighborScanChannelList"
#define CFG_NEIGHBOR_SCAN_CHAN_LIST_DEFAULT ""
@@ -2303,6 +2325,8 @@ typedef struct
v_U16_t nNeighborScanPeriod;
v_U8_t nNeighborReassocRssiThreshold;
v_U8_t nNeighborLookupRssiThreshold;
+ v_U8_t nOpportunisticThresholdDiff;
+ v_U8_t nRoamRescanRssiDiff;
v_U8_t neighborScanChanList[WNI_CFG_VALID_CHANNEL_LIST_LEN];
v_U16_t nNeighborScanMinChanTime;
v_U16_t nNeighborScanMaxChanTime;
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index a2e7f6ca6e23..943d40c3a808 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -159,6 +159,28 @@ static void cbNotifySetFwRssiMonitoring(hdd_context_t *pHddCtx, unsigned long No
}
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
+static void cbNotifySetOpportunisticScanThresholdDiff(hdd_context_t *pHddCtx,
+ unsigned long NotifyId)
+{
+ /*
+ * at the point this routine is called, the value in the cfg_ini table
+ * has already been updated
+ */
+ sme_SetRoamOpportunisticScanThresholdDiff((tHalHandle)(pHddCtx->hHal),
+ pHddCtx->cfg_ini->nOpportunisticThresholdDiff );
+}
+
+static void cbNotifySetRoamRescanRssiDiff(hdd_context_t *pHddCtx,
+ unsigned long NotifyId)
+{
+ /*
+ * at the point this routine is called, the value in the cfg_ini table
+ * has already been updated
+ */
+ sme_SetRoamRescanRssiDiff((tHalHandle)(pHddCtx->hHal),
+ pHddCtx->cfg_ini->nRoamRescanRssiDiff);
+}
+
static void cbNotifySetNeighborLookupRssiThreshold(hdd_context_t *pHddCtx, unsigned long NotifyId)
{
// at the point this routine is called, the value in the cfg_ini table has already been updated
@@ -1859,6 +1881,22 @@ REG_TABLE_ENTRY g_registry_table[] =
CFG_NEIGHBOR_LOOKUP_RSSI_THRESHOLD_MAX,
cbNotifySetNeighborLookupRssiThreshold, 0 ),
+ REG_DYNAMIC_VARIABLE( CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, nOpportunisticThresholdDiff,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_DEFAULT,
+ CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_MIN,
+ CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_MAX,
+ cbNotifySetOpportunisticScanThresholdDiff, 0 ),
+
+ REG_DYNAMIC_VARIABLE( CFG_ROAM_RESCAN_RSSI_DIFF_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, nRoamRescanRssiDiff,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ROAM_RESCAN_RSSI_DIFF_DEFAULT,
+ CFG_ROAM_RESCAN_RSSI_DIFF_MIN,
+ CFG_ROAM_RESCAN_RSSI_DIFF_MAX,
+ cbNotifySetRoamRescanRssiDiff, 0 ),
+
REG_VARIABLE_STRING( CFG_NEIGHBOR_SCAN_CHAN_LIST_NAME, WLAN_PARAM_String,
hdd_config_t, neighborScanChanList,
VAR_FLAGS_OPTIONAL,
@@ -3376,6 +3414,12 @@ static void print_hdd_cfg(hdd_context_t *pHddCtx)
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [nNeighborReassocRssiThreshold] Value = [%u] ",pHddCtx->cfg_ini->nNeighborReassocRssiThreshold);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [nNeighborLookupRssiThreshold] Value = [%u] ",pHddCtx->cfg_ini->nNeighborLookupRssiThreshold);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [nOpportunisticThresholdDiff] Value = [%u] ",
+ pHddCtx->cfg_ini->nOpportunisticThresholdDiff);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [nRoamRescanRssiDiff] Value = [%u] ",
+ pHddCtx->cfg_ini->nRoamRescanRssiDiff);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [nNeighborScanMinChanTime] Value = [%u] ",pHddCtx->cfg_ini->nNeighborScanMinChanTime);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [nNeighborScanMaxChanTime] Value = [%u] ",pHddCtx->cfg_ini->nNeighborScanMaxChanTime);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [nMaxNeighborRetries] Value = [%u] ",pHddCtx->cfg_ini->nMaxNeighborReqTries);
@@ -4960,6 +5004,10 @@ VOS_STATUS hdd_set_sme_config( hdd_context_t *pHddCtx )
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
smeConfig.csrConfig.neighborRoamConfig.nNeighborReassocRssiThreshold = pConfig->nNeighborReassocRssiThreshold;
smeConfig.csrConfig.neighborRoamConfig.nNeighborLookupRssiThreshold = pConfig->nNeighborLookupRssiThreshold;
+ smeConfig.csrConfig.neighborRoamConfig.nOpportunisticThresholdDiff =
+ pConfig->nOpportunisticThresholdDiff;
+ smeConfig.csrConfig.neighborRoamConfig.nRoamRescanRssiDiff =
+ pConfig->nRoamRescanRssiDiff;
smeConfig.csrConfig.neighborRoamConfig.nNeighborScanMaxChanTime = pConfig->nNeighborScanMaxChanTime;
smeConfig.csrConfig.neighborRoamConfig.nNeighborScanMinChanTime = pConfig->nNeighborScanMinChanTime;
smeConfig.csrConfig.neighborRoamConfig.nNeighborScanTimerPeriod = pConfig->nNeighborScanPeriod;
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index b72aea7c7290..d311e4c4b0da 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -3218,6 +3218,89 @@ int hdd_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
goto exit;
}
}
+ else if (strncmp(command, "SETOPPORTUNISTICRSSIDIFF", 24) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U8 nOpportunisticThresholdDiff = CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_DEFAULT;
+
+ /* Move pointer to ahead of SETOPPORTUNISTICRSSIDIFF<delimiter> */
+ value = value + 25;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou8(value, 10, &nOpportunisticThresholdDiff);
+ if (ret < 0)
+ {
+ /* If the input value is greater than max value of datatype, then also
+ kstrtou8 fails */
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: kstrtou8 failed.", __func__);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to Set Opportunistic Threshold diff = %d",
+ __func__,
+ nOpportunisticThresholdDiff);
+
+ sme_SetRoamOpportunisticScanThresholdDiff((tHalHandle)(pHddCtx->hHal),
+ nOpportunisticThresholdDiff);
+ }
+ else if (strncmp(priv_data.buf, "GETOPPORTUNISTICRSSIDIFF", 24) == 0)
+ {
+ tANI_S8 val = sme_GetRoamOpportunisticScanThresholdDiff((tHalHandle)(pHddCtx->hHal));
+ char extra[32];
+ tANI_U8 len = 0;
+
+ len = scnprintf(extra, sizeof(extra), "%s %d", command, val);
+ if (copy_to_user(priv_data.buf, &extra, len + 1))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to copy data to user buffer", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+ }
+ else if (strncmp(command, "SETROAMRESCANRSSIDIFF", 21) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U8 nRoamRescanRssiDiff = CFG_ROAM_RESCAN_RSSI_DIFF_DEFAULT;
+
+ /* Move pointer to ahead of SETROAMRESCANRSSIDIFF<delimiter> */
+ value = value + 22;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou8(value, 10, &nRoamRescanRssiDiff);
+ if (ret < 0)
+ {
+ /* If the input value is greater than max value of datatype, then also
+ kstrtou8 fails */
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: kstrtou8 failed.", __func__);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to Set Roam Rescan RSSI Diff = %d",
+ __func__,
+ nRoamRescanRssiDiff);
+ sme_SetRoamRescanRssiDiff((tHalHandle)(pHddCtx->hHal),
+ nRoamRescanRssiDiff);
+ }
+ else if (strncmp(priv_data.buf, "GETROAMRESCANRSSIDIFF", 21) == 0)
+ {
+ tANI_U8 val = sme_GetRoamRescanRssiDiff((tHalHandle)(pHddCtx->hHal));
+ char extra[32];
+ tANI_U8 len = 0;
+
+ len = scnprintf(extra, sizeof(extra), "%s %d", command, val);
+ if (copy_to_user(priv_data.buf, &extra, len + 1))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to copy data to user buffer", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+ }
#endif /* WLAN_FEATURE_VOWIFI_11R || FEATURE_WLAN_CCX || FEATURE_WLAN_LFR */
#ifdef FEATURE_WLAN_LFR
else if (strncmp(command, "SETFASTROAM", 11) == 0)
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index c0a204d08be7..9a018334673e 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -3802,6 +3802,8 @@ typedef struct sSirRoamOffloadScanReq
eAniBoolean RoamScanOffloadEnabled;
eAniBoolean MAWCEnabled;
tANI_S8 LookupThreshold;
+ tANI_U8 OpportunisticScanThresholdDiff;
+ tANI_U8 RoamRescanRssiDiff;
tANI_U8 RoamRssiDiff;
tANI_U8 ChannelCacheType;
tANI_U8 Command;
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 868aedc4df47..0e5804f8b6a0 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -4463,11 +4463,12 @@ VOS_STATUS wma_roam_scan_offload_init_connect(tp_wma_handle wma_handle)
*/
/* rssi_thresh = 10 is low enough */
vos_status = wma_roam_scan_offload_rssi_thresh(wma_handle, WMA_ROAM_LOW_RSSI_TRIGGER_VERYLOW,
- WMA_ROAM_RSSI_THRESH_DIFF_DEFAULT);
+ pMac->roam.configParam.neighborRoamConfig.nOpportunisticThresholdDiff);
vos_status = wma_roam_scan_offload_scan_period(wma_handle,
WMA_ROAM_OPP_SCAN_PERIOD_DEFAULT, WMA_ROAM_OPP_SCAN_AGING_PERIOD_DEFAULT);
vos_status = wma_roam_scan_offload_rssi_change(wma_handle,
- WMA_ROAM_RSSI_CHANGE_RESCAN_DEFAULT, WMA_ROAM_BEACON_WEIGHT_DEFAULT);
+ pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff,
+ WMA_ROAM_BEACON_WEIGHT_DEFAULT);
wma_roam_scan_fill_ap_profile(wma_handle, pMac, NULL, &ap_profile);
vos_status = wma_roam_scan_offload_ap_profile(wma_handle, &ap_profile);
@@ -4532,9 +4533,10 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
/* First parameter is positive rssi value to trigger rssi based scan.
* Opportunistic scan is started at 30 dB higher that trigger rssi.
*/
+
vos_status = wma_roam_scan_offload_rssi_thresh(wma_handle,
- (roam_req->LookupThreshold - WMA_NOISE_FLOOR_DBM_DEFAULT),
- WMA_ROAM_RSSI_THRESH_DIFF_DEFAULT);
+ (roam_req->LookupThreshold - WMA_NOISE_FLOOR_DBM_DEFAULT),
+ roam_req->OpportunisticScanThresholdDiff);
if (vos_status != VOS_STATUS_SUCCESS) {
break;
}
@@ -4552,7 +4554,7 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
* 2 times the current beacon's rssi.
*/
vos_status = wma_roam_scan_offload_rssi_change(wma_handle,
- WMA_ROAM_RSSI_CHANGE_RESCAN_DEFAULT,
+ roam_req->RoamRescanRssiDiff,
WMA_ROAM_BEACON_WEIGHT_DEFAULT);
if (vos_status != VOS_STATUS_SUCCESS) {
break;
@@ -4625,7 +4627,7 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
vos_status = wma_roam_scan_offload_rssi_thresh(wma_handle,
(roam_req->LookupThreshold - WMA_NOISE_FLOOR_DBM_DEFAULT),
- WMA_ROAM_RSSI_THRESH_DIFF_DEFAULT);
+ roam_req->OpportunisticScanThresholdDiff);
if (vos_status != VOS_STATUS_SUCCESS) {
break;
}
@@ -4638,7 +4640,7 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
}
vos_status = wma_roam_scan_offload_rssi_change(wma_handle,
- WMA_ROAM_RSSI_CHANGE_RESCAN_DEFAULT,
+ roam_req->RoamRescanRssiDiff,
WMA_ROAM_BEACON_WEIGHT_DEFAULT);
if (vos_status != VOS_STATUS_SUCCESS) {
break;
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index a493d0eab50e..3cdf793ee847 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -151,8 +151,6 @@
#define WMA_ROAM_MAX_REST_TIME_DEFAULT (500)
#define WMA_ROAM_LOW_RSSI_TRIGGER_DEFAULT (20)
#define WMA_ROAM_LOW_RSSI_TRIGGER_VERYLOW (10)
-#define WMA_ROAM_RSSI_THRESH_DIFF_DEFAULT (30)
-#define WMA_ROAM_RSSI_CHANGE_RESCAN_DEFAULT (5)
#define WMA_ROAM_BEACON_WEIGHT_DEFAULT (14)
#define WMA_ROAM_OPP_SCAN_PERIOD_DEFAULT (120000)
#define WMA_ROAM_OPP_SCAN_AGING_PERIOD_DEFAULT (WMA_ROAM_OPP_SCAN_PERIOD_DEFAULT * 5)
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 411391e22849..39da69fcbcab 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -968,6 +968,8 @@ typedef struct tagCsrNeighborRoamConfigParams
tANI_U8 nMaxNeighborRetries;
tANI_U16 nNeighborResultsRefreshPeriod;
tANI_U16 nEmptyScanRefreshPeriod;
+ tANI_U8 nOpportunisticThresholdDiff;
+ tANI_U8 nRoamRescanRssiDiff;
}tCsrNeighborRoamConfigParams;
#endif
diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h
index 879c119c22de..77b44c364692 100644
--- a/CORE/SME/inc/csrInternal.h
+++ b/CORE/SME/inc/csrInternal.h
@@ -510,6 +510,8 @@ typedef struct tagCsrNeighborRoamConfig
tANI_U8 nMaxNeighborRetries;
tANI_U16 nNeighborResultsRefreshPeriod;
tANI_U16 nEmptyScanRefreshPeriod;
+ tANI_U8 nOpportunisticThresholdDiff;
+ tANI_U8 nRoamRescanRssiDiff;
}tCsrNeighborRoamConfig;
#endif
diff --git a/CORE/SME/inc/csrNeighborRoam.h b/CORE/SME/inc/csrNeighborRoam.h
index 1c78207c0667..f0d4f143e140 100644
--- a/CORE/SME/inc/csrNeighborRoam.h
+++ b/CORE/SME/inc/csrNeighborRoam.h
@@ -69,6 +69,8 @@ typedef struct sCsrNeighborRoamCfgParams
tANI_U32 maxChannelScanTime;
tANI_U16 neighborResultsRefreshPeriod;
tANI_U16 emptyScanRefreshPeriod;
+ tANI_U8 nOpportunisticThresholdDiff;
+ tANI_U8 nRoamRescanRssiDiff;
} tCsrNeighborRoamCfgParams, *tpCsrNeighborRoamCfgParams;
#define CSR_NEIGHBOR_ROAM_INVALID_CHANNEL_INDEX 255
@@ -169,6 +171,8 @@ typedef struct sCsrNeighborRoamControlInfo
tCsrTimerInfo neighborScanTimerInfo;
tCsrNeighborRoamChannelInfo roamChannelInfo;
tANI_U8 currentNeighborLookupThreshold;
+ tANI_U8 currentOpportunisticThresholdDiff;
+ tANI_U8 currentRoamRescanRssiDiff;
tANI_BOOLEAN scanRspPending;
tANI_TIMESTAMP scanRequestTimeStamp;
tDblLinkList roamableAPList; // List of current FT candidates
@@ -226,6 +230,12 @@ tANI_BOOLEAN csrNeighborRoamStatePreauthDone(tpAniSirGlobal pMac);
tANI_BOOLEAN csrNeighborRoamScanRspPending(tHalHandle hHal);
tANI_BOOLEAN csrNeighborMiddleOfRoaming(tHalHandle hHal);
VOS_STATUS csrNeighborRoamSetLookupRssiThreshold(tpAniSirGlobal pMac, v_U8_t neighborLookupRssiThreshold);
+VOS_STATUS
+csrNeighborRoamSetOpportunisticScanThresholdDiff(tpAniSirGlobal pMac,
+ v_U8_t nOpportunisticThresholdDiff);
+VOS_STATUS
+csrNeighborRoamSetRoamRescanRssiDiff(tpAniSirGlobal pMac,
+ v_U8_t nRoamRescanRssiDiff);
VOS_STATUS csrNeighborRoamUpdateFastRoamingEnabled(tpAniSirGlobal pMac, const v_BOOL_t fastRoamEnabled);
VOS_STATUS csrNeighborRoamUpdateCcxModeEnabled(tpAniSirGlobal pMac, const v_BOOL_t ccxMode);
VOS_STATUS csrNeighborRoamChannelsFilterByCurrentBand(
@@ -268,6 +278,8 @@ VOS_STATUS csrNeighborRoamMergeChannelLists(tpAniSirGlobal pMac,
#define REASON_OS_REQUESTED_ROAMING_NOW 15
#define REASON_SCAN_CH_TIME_CHANGED 16
#define REASON_SCAN_HOME_TIME_CHANGED 17
+#define REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED 18
+#define REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED 19
eHalStatus csrRoamOffloadScan(tpAniSirGlobal pMac, tANI_U8 command, tANI_U8 reason);
eHalStatus csrNeighborRoamCandidateFoundIndHdlr(tpAniSirGlobal pMac, void* pMsg);
eHalStatus csrNeighborRoamHandoffReqHdlr(tpAniSirGlobal pMac, void* pMsg);
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 73bea8197c1f..e605b55a3d1e 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -2719,6 +2719,57 @@ eHalStatus sme_UpdateConfigFwRssiMonitoring(tHalHandle hHal,
v_BOOL_t fEnableFwRssiMonitoring);
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
+/* ---------------------------------------------------------------------------
+ \fn sme_SetRoamRescanRssiDiff
+ \brief Update Roam Rescan RSSI diff
+ This function is called through dynamic setConfig callback function
+ to configure nRoamRescanRssiDiff
+ \param hHal - HAL handle for device
+ \param nRoamRescanRssiDiff - Roam Rescan Rssi Diff
+ \return eHAL_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
+ successfully.
+ else SME is failed to update nRoamRescanRssiDiff
+ -------------------------------------------------------------------------*/
+
+eHalStatus sme_SetRoamRescanRssiDiff(tHalHandle hHal,
+ const v_U8_t nRoamRescanRssiDiff);
+
+/*--------------------------------------------------------------------------
+ \fn sme_GetRoamRescanRssiDiff
+ \brief gets Roam Rescan RSSI diff
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen
+ \return v_U8_t - nRoamRescanRssiDiff
+ \sa
+ --------------------------------------------------------------------------*/
+v_U8_t sme_GetRoamRescanRssiDiff(tHalHandle hHal);
+
+
+/* ---------------------------------------------------------------------------
+ \fn sme_SetRoamOpportunisticScanThresholdDiff
+ \brief Update Opportunistic Scan threshold diff
+ This function is called through dynamic setConfig callback function
+ to configure nOpportunisticThresholdDiff
+ \param hHal - HAL handle for device
+ \param nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
+ \return eHAL_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
+ successfully.
+ else SME is failed to update nOpportunisticThresholdDiff.
+ -------------------------------------------------------------------------*/
+
+eHalStatus sme_SetRoamOpportunisticScanThresholdDiff(tHalHandle hHal,
+ const v_U8_t nOpportunisticThresholdDiff);
+
+/*--------------------------------------------------------------------------
+ \fn sme_GetRoamOpportunisticScanThresholdDiff()
+ \brief gets Opportunistic Scan threshold diff
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen
+ \return v_U8_t - nOpportunisticThresholdDiff
+ \sa
+ --------------------------------------------------------------------------*/
+v_U8_t sme_GetRoamOpportunisticScanThresholdDiff(tHalHandle hHal);
+
/*--------------------------------------------------------------------------
\brief sme_setNeighborLookupRssiThreshold() - update neighbor lookup rssi threshold
This is a synchronuous call
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 45a49711be2e..f794967949a3 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -1079,6 +1079,8 @@ static void initConfigParam(tpAniSirGlobal pMac)
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries = 3;
pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold = 120;
+ pMac->roam.configParam.neighborRoamConfig.nOpportunisticThresholdDiff = 30;
+ pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff = 5;
pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold = 125;
pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime = 20;
pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime = 40;
@@ -1754,6 +1756,8 @@ eHalStatus csrChangeDefaultConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pPa
smsLog( pMac, LOG1, "nNeighborScanTimerPerioid = %d", pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod);
smsLog( pMac, LOG1, "nNeighborReassocRssiThreshold = %d", pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold);
smsLog( pMac, LOG1, "nNeighborLookupRssiThreshold = %d", pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold);
+ smsLog( pMac, LOG1, "nOpportunisticThresholdDiff = %d", pMac->roam.configParam.neighborRoamConfig.nOpportunisticThresholdDiff);
+ smsLog( pMac, LOG1, "nRoamRescanRssiDiff = %d", pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff);
smsLog( pMac, LOG1, "nNeighborScanMinChanTime = %d", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime);
smsLog( pMac, LOG1, "nNeighborScanMaxChanTime = %d", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime);
smsLog( pMac, LOG1, "nMaxNeighborRetries = %d", pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries);
@@ -15838,6 +15842,10 @@ eHalStatus csrRoamOffloadScan(tpAniSirGlobal pMac, tANI_U8 command, tANI_U8 reas
pMac->roam.roamSession[sessionId].connectedProfile.mcEncryptionType;
pRequestBuf->LookupThreshold =
(v_S7_t)pNeighborRoamInfo->cfgParams.neighborLookupThreshold * (-1);
+ pRequestBuf->OpportunisticScanThresholdDiff =
+ pNeighborRoamInfo->cfgParams.nOpportunisticThresholdDiff;
+ pRequestBuf->RoamRescanRssiDiff =
+ pNeighborRoamInfo->cfgParams.nRoamRescanRssiDiff;
pRequestBuf->RoamRssiDiff =
pMac->roam.configParam.RoamRssiDiff;
pRequestBuf->Command = command;
diff --git a/CORE/SME/src/csr/csrNeighborRoam.c b/CORE/SME/src/csr/csrNeighborRoam.c
index bbcc8d7730fc..22bdf60b3917 100644
--- a/CORE/SME/src/csr/csrNeighborRoam.c
+++ b/CORE/SME/src/csr/csrNeighborRoam.c
@@ -514,6 +514,112 @@ VOS_STATUS csrNeighborRoamSetLookupRssiThreshold(tpAniSirGlobal pMac, v_U8_t nei
return vosStatus;
}
+VOS_STATUS
+csrNeighborRoamSetOpportunisticScanThresholdDiff(tpAniSirGlobal pMac,
+ v_U8_t nOpportunisticThresholdDiff)
+{
+ VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
+
+ if (eCSR_NEIGHBOR_ROAM_STATE_CONNECTED
+ == pMac->roam.neighborRoamInfo.neighborRoamState)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac,
+ LOG2,
+ FL("Currently in CONNECTED state, so deregister"
+ " all and re-register for DOWN event again"));
+
+ pMac->roam.neighborRoamInfo.cfgParams.nOpportunisticThresholdDiff =
+ nOpportunisticThresholdDiff;
+ pMac->roam.neighborRoamInfo.currentOpportunisticThresholdDiff =
+ nOpportunisticThresholdDiff;
+
+ /* De-register existing lookup UP/DOWN, Rssi indications */
+#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
+ if (pMac->roam.configParam.isRoamOffloadScanEnabled)
+ {
+ csrRoamOffloadScan(pMac,
+ ROAM_SCAN_OFFLOAD_UPDATE_CFG,
+ REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
+ }
+#endif
+ }
+ else if (eCSR_NEIGHBOR_ROAM_STATE_INIT
+ == pMac->roam.neighborRoamInfo.neighborRoamState)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac,
+ LOG2,
+ FL("Currently in INIT state, safe to set"
+ " opportunistic threshold diff"));
+ pMac->roam.neighborRoamInfo.cfgParams.nOpportunisticThresholdDiff =
+ nOpportunisticThresholdDiff;
+ pMac->roam.neighborRoamInfo.currentOpportunisticThresholdDiff =
+ nOpportunisticThresholdDiff;
+ }
+ else
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac,
+ LOGE,
+ FL("Unexpected state %d"
+ " returning failure"),
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ vosStatus = VOS_STATUS_E_FAILURE;
+ }
+ return vosStatus;
+}
+
+VOS_STATUS
+csrNeighborRoamSetRoamRescanRssiDiff(tpAniSirGlobal pMac,
+ v_U8_t nRoamRescanRssiDiff)
+{
+ VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
+
+ if (eCSR_NEIGHBOR_ROAM_STATE_CONNECTED
+ == pMac->roam.neighborRoamInfo.neighborRoamState)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac,
+ LOG2,
+ FL("Currently in CONNECTED state, so deregister"
+ " all and re-register for DOWN event again"));
+
+ pMac->roam.neighborRoamInfo.cfgParams.nRoamRescanRssiDiff =
+ nRoamRescanRssiDiff;
+ pMac->roam.neighborRoamInfo.currentRoamRescanRssiDiff =
+ nRoamRescanRssiDiff;
+
+ /* De-register existing lookup UP/DOWN, Rssi indications */
+#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
+ if (pMac->roam.configParam.isRoamOffloadScanEnabled)
+ {
+ csrRoamOffloadScan(pMac,
+ ROAM_SCAN_OFFLOAD_UPDATE_CFG,
+ REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
+ }
+#endif
+ }
+ else if (eCSR_NEIGHBOR_ROAM_STATE_INIT
+ == pMac->roam.neighborRoamInfo.neighborRoamState)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac,
+ LOG2,
+ FL("Currently in INIT state, safe to set"
+ " roam rescan rssi diff"));
+ pMac->roam.neighborRoamInfo.cfgParams.nRoamRescanRssiDiff =
+ nRoamRescanRssiDiff;
+ pMac->roam.neighborRoamInfo.currentRoamRescanRssiDiff =
+ nRoamRescanRssiDiff;
+ }
+ else
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac,
+ LOGE,
+ FL("Unexpected state %d"
+ " returning failure"),
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ vosStatus = VOS_STATUS_E_FAILURE;
+ }
+ return vosStatus;
+}
+
/* ---------------------------------------------------------------------------
\fn csrNeighborRoamReassocIndCallback
@@ -712,6 +818,10 @@ static void csrNeighborRoamDeregAllRssiIndication(tpAniSirGlobal pMac)
/* Reset thresholds only after deregistering DOWN event from TL */
pNeighborRoamInfo->currentNeighborLookupThreshold =
pNeighborRoamInfo->cfgParams.neighborLookupThreshold;
+ pNeighborRoamInfo->currentOpportunisticThresholdDiff =
+ pNeighborRoamInfo->cfgParams.nOpportunisticThresholdDiff;
+ pNeighborRoamInfo->currentRoamRescanRssiDiff =
+ pNeighborRoamInfo->cfgParams.nRoamRescanRssiDiff;
#ifdef FEATURE_WLAN_LFR
pNeighborRoamInfo->uEmptyScanCount = 0;
pNeighborRoamInfo->lookupDOWNRssi = 0;
@@ -4171,6 +4281,10 @@ eHalStatus csrNeighborRoamIndicateConnect(tpAniSirGlobal pMac, tANI_U8 sessionId
pNeighborRoamInfo->neighborScanTimerInfo.sessionId = sessionId;
pNeighborRoamInfo->currentNeighborLookupThreshold =
pNeighborRoamInfo->cfgParams.neighborLookupThreshold;
+ pNeighborRoamInfo->currentOpportunisticThresholdDiff =
+ pNeighborRoamInfo->cfgParams.nOpportunisticThresholdDiff;
+ pNeighborRoamInfo->currentRoamRescanRssiDiff =
+ pNeighborRoamInfo->cfgParams.nRoamRescanRssiDiff;
#ifdef FEATURE_WLAN_LFR
pNeighborRoamInfo->uEmptyScanCount = 0;
pNeighborRoamInfo->lookupDOWNRssi = 0;
@@ -4356,6 +4470,10 @@ eHalStatus csrNeighborRoamInit(tpAniSirGlobal pMac)
pNeighborRoamInfo->cfgParams.minChannelScanTime = pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime;
pNeighborRoamInfo->cfgParams.maxNeighborRetries = 0;
pNeighborRoamInfo->cfgParams.neighborLookupThreshold = pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold;
+ pNeighborRoamInfo->cfgParams.nOpportunisticThresholdDiff =
+ pMac->roam.configParam.neighborRoamConfig.nOpportunisticThresholdDiff;
+ pNeighborRoamInfo->cfgParams.nRoamRescanRssiDiff =
+ pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff;
pNeighborRoamInfo->cfgParams.neighborReassocThreshold = pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold;
pNeighborRoamInfo->cfgParams.neighborScanPeriod = pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod;
pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod = pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod;
@@ -4380,6 +4498,10 @@ eHalStatus csrNeighborRoamInit(tpAniSirGlobal pMac)
vos_mem_set(pNeighborRoamInfo->currAPbssid, sizeof(tCsrBssid), 0);
pNeighborRoamInfo->currentNeighborLookupThreshold = pMac->roam.neighborRoamInfo.cfgParams.neighborLookupThreshold;
+ pNeighborRoamInfo->currentOpportunisticThresholdDiff =
+ pMac->roam.neighborRoamInfo.cfgParams.nOpportunisticThresholdDiff;
+ pNeighborRoamInfo->currentRoamRescanRssiDiff =
+ pMac->roam.neighborRoamInfo.cfgParams.nRoamRescanRssiDiff;
#ifdef FEATURE_WLAN_LFR
pNeighborRoamInfo->lookupDOWNRssi = 0;
pNeighborRoamInfo->uEmptyScanCount = 0;
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 28cd9257abcf..93c40bc7fe60 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -9182,6 +9182,111 @@ eHalStatus sme_UpdateConfigFwRssiMonitoring(tHalHandle hHal,
}
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
+/* ---------------------------------------------------------------------------
+ \fn sme_SetRoamOpportunisticScanThresholdDiff
+ \brief Update Opportunistic Scan threshold diff
+ This function is called through dynamic setConfig callback function
+ to configure nOpportunisticThresholdDiff
+ \param hHal - HAL handle for device
+ \param nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
+ \return eHAL_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
+ successfully.
+ else SME is failed to update nOpportunisticThresholdDiff.
+ -------------------------------------------------------------------------*/
+eHalStatus sme_SetRoamOpportunisticScanThresholdDiff(tHalHandle hHal,
+ const v_U8_t nOpportunisticThresholdDiff)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ status = csrNeighborRoamSetOpportunisticScanThresholdDiff(pMac,
+ nOpportunisticThresholdDiff);
+ if (HAL_STATUS_SUCCESS(status))
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set "
+ "opportunistic threshold diff to %d"
+ " - old value is %d - roam state is %d",
+ nOpportunisticThresholdDiff,
+ pMac->roam.configParam.neighborRoamConfig.nOpportunisticThresholdDiff,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.neighborRoamConfig.nOpportunisticThresholdDiff = nOpportunisticThresholdDiff;
+ }
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+ return status;
+}
+
+/*--------------------------------------------------------------------------
+ \fn sme_GetRoamOpportunisticScanThresholdDiff()
+ \brief gets Opportunistic Scan threshold diff
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen
+ \return v_U8_t - nOpportunisticThresholdDiff
+ \sa
+ --------------------------------------------------------------------------*/
+v_U8_t sme_GetRoamOpportunisticScanThresholdDiff(tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.configParam.neighborRoamConfig.nOpportunisticThresholdDiff;
+}
+
+/* ---------------------------------------------------------------------------
+ \fn sme_SetRoamRescanRssiDiff
+ \brief Update roam rescan rssi diff
+ This function is called through dynamic setConfig callback function
+ to configure nRoamRescanRssiDiff
+ \param hHal - HAL handle for device
+ \param nRoamRescanRssiDiff - roam rescan rssi diff
+ \return eHAL_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
+ successfully.
+ else SME is failed to update nRoamRescanRssiDiff.
+ -------------------------------------------------------------------------*/
+eHalStatus sme_SetRoamRescanRssiDiff(tHalHandle hHal,
+ const v_U8_t nRoamRescanRssiDiff)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ status = csrNeighborRoamSetRoamRescanRssiDiff(pMac,
+ nRoamRescanRssiDiff);
+ if (HAL_STATUS_SUCCESS(status))
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set "
+ "opportunistic threshold diff to %d"
+ " - old value is %d - roam state is %d",
+ nRoamRescanRssiDiff,
+ pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff =
+ nRoamRescanRssiDiff;
+ }
+ sme_ReleaseGlobalLock(&pMac->sme);
+ }
+ return status;
+}
+
+/*--------------------------------------------------------------------------
+ \fn sme_GetRoamRescanRssiDiff
+ \brief gets roam rescan rssi diff
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen
+ \return v_S7_t - nRoamRescanRssiDiff
+ \sa
+ --------------------------------------------------------------------------*/
+v_U8_t sme_GetRoamRescanRssiDiff(tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff;
+}
+
/*--------------------------------------------------------------------------
\brief sme_setNeighborLookupRssiThreshold() - update neighbor lookup rssi threshold
This is a synchronous call