diff options
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_cfg.h | 24 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg.c | 48 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_main.c | 83 | ||||
| -rw-r--r-- | CORE/MAC/inc/sirApi.h | 2 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 16 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.h | 2 | ||||
| -rw-r--r-- | CORE/SME/inc/csrApi.h | 2 | ||||
| -rw-r--r-- | CORE/SME/inc/csrInternal.h | 2 | ||||
| -rw-r--r-- | CORE/SME/inc/csrNeighborRoam.h | 12 | ||||
| -rw-r--r-- | CORE/SME/inc/sme_Api.h | 51 | ||||
| -rw-r--r-- | CORE/SME/src/csr/csrApiRoam.c | 8 | ||||
| -rw-r--r-- | CORE/SME/src/csr/csrNeighborRoam.c | 122 | ||||
| -rw-r--r-- | CORE/SME/src/sme_common/sme_Api.c | 105 |
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 |
