qcacld-3.0: Introduce ini for roam_triggers including sta kickout trigger

Introduce ini for roaming_triggers to enable/disable specific
roaming triggers. This will be the master ini to control roaming
triggers. If this ini is set to zero, roaming will not be enabled
on the sta interface unless its enabled via vendor command.
A new roaming trigger - Sta kickout roaming is introduced in
firmware, include this bit support also in the ini.

The value of this ini will be sent over the wmi command
WMI_ROAM_ENABLE_DISABLE_TRIGGER_REASON_CMDID during RSO start.
Reset this value to 0 during RSO stop if RSO stop is due to
disconnect or roam synch failure.

Change-Id: I02f207cdde9d8fb68cd91fab07572baa9e7ac50d
CRs-Fixed: 2631712
This commit is contained in:
Pragaspathi Thilagaraj
2020-02-28 14:41:42 +05:30
parent d62d38b464
commit 63eb6363dc
13 changed files with 166 additions and 13 deletions

View File

@@ -1475,6 +1475,8 @@ static void mlme_init_roam_offload_cfg(struct wlan_objmgr_psoc *psoc,
lfr->idle_data_packet_count =
cfg_get(psoc, CFG_LFR_IDLE_ROAM_PACKET_COUNT);
lfr->idle_roam_min_rssi = cfg_get(psoc, CFG_LFR_IDLE_ROAM_MIN_RSSI);
lfr->roam_trigger_bitmap =
cfg_get(psoc, CFG_ROAM_TRIGGER_BITMAP);
lfr->idle_roam_band = cfg_get(psoc, CFG_LFR_IDLE_ROAM_BAND);
mlme_init_sae_single_pmk_cfg(psoc, lfr);
}
@@ -1886,7 +1888,7 @@ static void mlme_init_scoring_cfg(struct wlan_objmgr_psoc *psoc,
mlme_limit_max_per_index_score(
cfg_get(psoc, CFG_SCORING_OCE_WAN_SCORE_IDX_15_TO_12));
scoring_cfg->roam_trigger_bitmap =
cfg_get(psoc, CFG_ROAM_TRIGGER_BITMAP);
cfg_get(psoc, CFG_ROAM_SCORE_DELTA_TRIGGER_BITMAP);
scoring_cfg->roam_score_delta = cfg_get(psoc, CFG_ROAM_SCORE_DELTA);
scoring_cfg->apsd_enabled = (bool)cfg_default(CFG_APSD_ENABLED);
scoring_cfg->min_roam_score_delta =

View File

@@ -2340,6 +2340,47 @@
CFG_VALUE_OR_DEFAULT, \
"Band on which idle roam needs to be enabled")
/*
* <ini>
* roam_triggers - Bitmap of roaming triggers. Setting this to
* zero will disable roaming altogether for the STA interface.
* @Min: 0
* @Max: 0xFFFFFFFF
* @Default: 0xFFFF
*
* ROAM_TRIGGER_REASON_PER BIT 1
* ROAM_TRIGGER_REASON_BMISS BIT 2
* ROAM_TRIGGER_REASON_LOW_RSSI BIT 3
* ROAM_TRIGGER_REASON_HIGH_RSSI BIT 4
* ROAM_TRIGGER_REASON_PERIODIC BIT 5
* ROAM_TRIGGER_REASON_MAWC BIT 6
* ROAM_TRIGGER_REASON_DENSE BIT 7
* ROAM_TRIGGER_REASON_BACKGROUND BIT 8
* ROAM_TRIGGER_REASON_FORCED BIT 9
* ROAM_TRIGGER_REASON_BTM BIT 10
* ROAM_TRIGGER_REASON_UNIT_TEST BIT 11
* ROAM_TRIGGER_REASON_BSS_LOAD BIT 12
* ROAM_TRIGGER_REASON_DEAUTH BIT 13
* ROAM_TRIGGER_REASON_IDLE BIT 14
* ROAM_TRIGGER_REASON_STA_KICKOUT BIT 15
* ROAM_TRIGGER_REASON_MAX BIT 16
*
* Related: none
*
* Supported Feature: Roaming
*
* Usage: Internal
*
* </ini>
*/
#define CFG_ROAM_TRIGGER_BITMAP CFG_INI_UINT( \
"roam_triggers", \
0, \
0xFFFFFFFF, \
0xFFFF, \
CFG_VALUE_OR_DEFAULT, \
"Bitmap of roaming triggers")
#define ROAM_OFFLOAD_ALL \
CFG(CFG_LFR3_ROAMING_OFFLOAD) \
CFG(CFG_LFR_ENABLE_DISCONNECT_ROAM) \
@@ -2349,6 +2390,7 @@
CFG(CFG_LFR_IDLE_ROAM_PACKET_COUNT) \
CFG(CFG_LFR_IDLE_ROAM_MIN_RSSI) \
CFG(CFG_LFR_IDLE_ROAM_BAND) \
CFG(CFG_ROAM_TRIGGER_BITMAP) \
#else
#define ROAM_OFFLOAD_ALL

View File

@@ -999,7 +999,7 @@
*
* </ini>
*/
#define CFG_ROAM_TRIGGER_BITMAP CFG_INI_UINT( \
#define CFG_ROAM_SCORE_DELTA_TRIGGER_BITMAP CFG_INI_UINT( \
"roam_score_delta_bitmap", \
0, \
0xFFFFFFFF, \
@@ -1288,7 +1288,7 @@
CFG(CFG_SCORING_OCE_WAN_SCORE_IDX_7_TO_4) \
CFG(CFG_SCORING_OCE_WAN_SCORE_IDX_11_TO_8) \
CFG(CFG_SCORING_OCE_WAN_SCORE_IDX_15_TO_12) \
CFG(CFG_ROAM_TRIGGER_BITMAP) \
CFG(CFG_ROAM_SCORE_DELTA_TRIGGER_BITMAP) \
CFG(CFG_ROAM_SCORE_DELTA) \
CFG(CFG_CAND_MIN_ROAM_SCORE_DELTA) \
CFG(CFG_ENABLE_SCORING_FOR_ROAM) \

View File

@@ -2446,6 +2446,14 @@ wlan_mlme_get_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc,
QDF_STATUS
wlan_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc,
uint8_t roam_reason_vsie_enabled);
/**
* wlan_mlme_get_roaming_triggers - Get the roaming triggers bitmap
* @psoc: Pointer to PSOC object
*
* Return: Roaming triggers value
*/
uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc);
#else
static inline QDF_STATUS
wlan_mlme_get_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc,
@@ -2460,6 +2468,12 @@ wlan_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc,
{
return QDF_STATUS_E_FAILURE;
}
static inline
uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc)
{
return 0xFFFF;
}
#endif
#endif /* _WLAN_MLME_API_H_ */

View File

@@ -1438,6 +1438,7 @@ struct bss_load_trigger {
* idle roam trigger.
* @enable_roam_reason_vsie: Enable/disable incluison of roam reason
* vsie in Re(assoc) frame
* @roam_trigger_bitmap: Bitmap of roaming triggers.
* @early_stop_scan_enable: Set early stop scan
* @enable_5g_band_pref: Enable preference for 5G from INI
* @ese_enabled: Enable ESE feature
@@ -1541,6 +1542,7 @@ struct wlan_mlme_lfr_cfg {
uint32_t idle_roam_band;
int32_t idle_roam_min_rssi;
bool enable_roam_reason_vsie;
uint32_t roam_trigger_bitmap;
#endif
bool early_stop_scan_enable;
bool enable_5g_band_pref;

View File

@@ -1047,6 +1047,19 @@ ucfg_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc,
QDF_STATUS
ucfg_mlme_set_roaming_offload(struct wlan_objmgr_psoc *psoc,
bool val);
/**
* ucfg_mlme_get_roaming_triggers() - Get roaming triggers bitmap
* value
* @psoc: pointer to psoc object
*
* Return: Roaming triggers value
*/
static inline uint32_t
ucfg_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc)
{
return wlan_mlme_get_roaming_triggers(psoc);
}
#else
static inline QDF_STATUS
ucfg_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc,
@@ -1063,6 +1076,12 @@ ucfg_mlme_set_roaming_offload(struct wlan_objmgr_psoc *psoc,
{
return QDF_STATUS_SUCCESS;
}
static inline uint32_t
ucfg_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc)
{
return 0;
}
#endif
/**

View File

@@ -3853,4 +3853,15 @@ wlan_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc,
mlme_obj->cfg.lfr.enable_roam_reason_vsie = roam_reason_vsie_enable;
return QDF_STATUS_SUCCESS;
}
uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return cfg_default(CFG_ROAM_TRIGGER_BITMAP);
return mlme_obj->cfg.lfr.roam_trigger_bitmap;
}
#endif

View File

@@ -4477,6 +4477,52 @@ hdd_send_roam_full_scan_period_to_sme(struct hdd_context *hdd_ctx,
return status;
}
/**
* wlan_hdd_convert_control_roam_trigger_reason_bitmap - Convert the
* vendor specific reason code to internal reason code.
* @trigger_reason_bitmap: Vendor specific roam trigger bitmap
*
* Return: Internal roam trigger bitmap
*/
static uint32_t
wlan_hdd_convert_control_roam_trigger_bitmap(uint32_t trigger_reason_bitmap)
{
uint32_t drv_trigger_bitmap = 0, all_bitmap;
/* Enable the complete trigger bitmap when all bits are set in
* the control config bitmap
*/
all_bitmap = (QCA_ROAM_TRIGGER_REASON_BSS_LOAD << 1) - 1;
if (trigger_reason_bitmap == all_bitmap)
return BIT(ROAM_TRIGGER_REASON_MAX) - 1;
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_PER)
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_PER);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BEACON_MISS)
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_BMISS);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_POOR_RSSI)
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_LOW_RSSI);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BETTER_RSSI)
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_HIGH_RSSI);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_PERIODIC)
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_PERIODIC);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_DENSE)
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_DENSE);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BTM)
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_BTM);
if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BSS_LOAD)
drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_BSS_LOAD);
return drv_trigger_bitmap;
}
/**
* hdd_send_roam_triggers_to_sme() - Send roam trigger bitmap to SME
* @hdd_ctx: HDD context
@@ -4525,7 +4571,8 @@ hdd_send_roam_triggers_to_sme(struct hdd_context *hdd_ctx,
}
triggers.vdev_id = vdev_id;
triggers.trigger_bitmap = roam_trigger_bitmap;
triggers.trigger_bitmap =
wlan_hdd_convert_control_roam_trigger_bitmap(roam_trigger_bitmap);
status = sme_set_roam_triggers(hdd_ctx->mac_handle, &triggers);
if (QDF_IS_STATUS_ERROR(status))

View File

@@ -5049,7 +5049,7 @@ QDF_STATUS hdd_init_station_mode(struct hdd_adapter *adapter)
mac_handle_t mac_handle;
bool bval = false;
uint8_t enable_sifs_burst = 0;
uint32_t fine_time_meas_cap = 0;
uint32_t fine_time_meas_cap = 0, roam_triggers;
hdd_ctx = WLAN_HDD_GET_CTX(adapter);
mac_handle = hdd_ctx->mac_handle;
@@ -5126,8 +5126,9 @@ QDF_STATUS hdd_init_station_mode(struct hdd_adapter *adapter)
qdf_mem_zero(&adapter->rcpi, sizeof(adapter->rcpi));
if (adapter->device_mode == QDF_STA_MODE) {
roam_triggers = ucfg_mlme_get_roaming_triggers(hdd_ctx->psoc);
mlme_set_roam_trigger_bitmap(hdd_ctx->psoc, adapter->vdev_id,
DEFAULT_ROAM_TRIGGER_BITMAP);
roam_triggers);
ucfg_mlme_get_fine_time_meas_cap(hdd_ctx->psoc,
&fine_time_meas_cap);

View File

@@ -2250,6 +2250,7 @@ struct roam_offload_scan_req {
struct wmi_disconnect_roam_params disconnect_roam_params;
#endif
struct roam_ext_params roam_params;
struct roam_triggers roam_triggers;
uint8_t middle_of_roaming;
uint32_t hi_rssi_scan_max_count;
uint32_t hi_rssi_scan_rssi_delta;

View File

@@ -17534,6 +17534,9 @@ csr_update_roam_scan_offload_request(struct mac_context *mac_ctx,
if (!req_buf->roam_offload_enabled)
return;
req_buf->roam_triggers.vdev_id = session->vdev_id;
req_buf->roam_triggers.trigger_bitmap =
mlme_get_roam_trigger_bitmap(mac_ctx->psoc, session->vdev_id);
req_buf->RoamKeyMgmtOffloadEnabled = session->RoamKeyMgmtOffloadEnabled;
req_buf->pmkid_modes.fw_okc =
(pmkid_modes & CFG_PMKID_MODES_OKC) ? 1 : 0;

View File

@@ -34,6 +34,7 @@
#include "csr_neighbor_roam.h"
#include "mac_trace.h"
#include "wlan_policy_mgr_api.h"
#include "wlan_mlme_api.h"
static const char *lfr_get_config_item_string(uint8_t reason)
{
@@ -616,7 +617,7 @@ void csr_roam_reset_roam_params(struct mac_context *mac_ctx)
}
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
static void csr_roam_restore_default_config(tpAniSirGlobal mac_ctx,
static void csr_roam_restore_default_config(struct mac_context *mac_ctx,
uint8_t vdev_id)
{
struct roam_triggers triggers;
@@ -624,14 +625,14 @@ static void csr_roam_restore_default_config(tpAniSirGlobal mac_ctx,
sme_set_roam_config_enable(MAC_HANDLE(mac_ctx), vdev_id, 0);
triggers.vdev_id = vdev_id;
triggers.trigger_bitmap = 0xff;
triggers.trigger_bitmap = wlan_mlme_get_roaming_triggers(mac_ctx->psoc);
sme_debug("Reset roam trigger bitmap to 0x%x", triggers.trigger_bitmap);
sme_set_roam_triggers(MAC_HANDLE(mac_ctx), &triggers);
sme_roam_control_restore_default_config(MAC_HANDLE(mac_ctx),
vdev_id);
}
#else
static void csr_roam_restore_default_config(tpAniSirGlobal mac_ctx,
static void csr_roam_restore_default_config(struct mac_context *mac_ctx,
uint8_t vdev_id)
{
}

View File

@@ -1872,6 +1872,7 @@ QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle,
&enable_roam_reason_vsie);
wma_set_vdev_roam_reason_vsie(wma_handle, roam_req->sessionId,
enable_roam_reason_vsie);
wma_set_roam_triggers(wma_handle, &roam_req->roam_triggers);
/* Opportunistic scan runs on a timer, value set by
* EmptyRefreshScanPeriod. Age out the entries after 3 such
@@ -2071,6 +2072,18 @@ QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle,
wma_send_disconnect_roam_params(wma_handle, roam_req);
wma_send_idle_roam_params(wma_handle, roam_req);
/*
* Disable all roaming triggers if RSO stop is as part of
* disconnect
*/
if (mode == WMI_ROAM_SCAN_MODE_NONE) {
struct roam_triggers roam_triggers;
roam_triggers.vdev_id = roam_req->sessionId;
roam_triggers.trigger_bitmap = 0;
wma_set_roam_triggers(wma_handle, &roam_triggers);
}
if (roam_req->reason ==
REASON_OS_REQUESTED_ROAMING_NOW) {
struct scheduler_msg cds_msg = {0};
@@ -6296,11 +6309,8 @@ int wma_handle_btm_blacklist_event(void *handle, uint8_t *cmd_param_info,
QDF_STATUS wma_set_roam_triggers(tp_wma_handle wma,
struct roam_triggers *triggers)
{
if (!wma_is_vdev_valid(triggers->vdev_id)) {
WMA_LOGE("%s: vdev_id: %d is not active", __func__,
triggers->vdev_id);
if (!wma_is_vdev_valid(triggers->vdev_id))
return QDF_STATUS_E_INVAL;
}
return wmi_unified_set_roam_triggers(wma->wmi_handle, triggers);
}