From 63eb6363dcbcf2f9193a601baf9101672936afe5 Mon Sep 17 00:00:00 2001 From: Pragaspathi Thilagaraj Date: Fri, 28 Feb 2020 14:41:42 +0530 Subject: [PATCH] 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 --- components/mlme/core/src/wlan_mlme_main.c | 4 +- components/mlme/dispatcher/inc/cfg_mlme_lfr.h | 42 ++++++++++++++++ .../mlme/dispatcher/inc/cfg_mlme_scoring.h | 4 +- .../mlme/dispatcher/inc/wlan_mlme_api.h | 14 ++++++ .../dispatcher/inc/wlan_mlme_public_struct.h | 2 + .../mlme/dispatcher/inc/wlan_mlme_ucfg_api.h | 19 +++++++ .../mlme/dispatcher/src/wlan_mlme_api.c | 11 +++++ core/hdd/src/wlan_hdd_cfg80211.c | 49 ++++++++++++++++++- core/hdd/src/wlan_hdd_main.c | 5 +- core/mac/inc/sir_api.h | 1 + core/sme/src/csr/csr_api_roam.c | 3 ++ core/sme/src/csr/csr_neighbor_roam.c | 7 +-- core/wma/src/wma_scan_roam.c | 18 +++++-- 13 files changed, 166 insertions(+), 13 deletions(-) diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index 07926f04b093..bae4e4a849c1 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -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 = diff --git a/components/mlme/dispatcher/inc/cfg_mlme_lfr.h b/components/mlme/dispatcher/inc/cfg_mlme_lfr.h index 5079ca2cace5..dfbb785eb0db 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_lfr.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_lfr.h @@ -2340,6 +2340,47 @@ CFG_VALUE_OR_DEFAULT, \ "Band on which idle roam needs to be enabled") +/* + * + * 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 + * + * + */ +#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 diff --git a/components/mlme/dispatcher/inc/cfg_mlme_scoring.h b/components/mlme/dispatcher/inc/cfg_mlme_scoring.h index 26cc36939a3d..cfc85bf41a8b 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_scoring.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_scoring.h @@ -999,7 +999,7 @@ * * */ -#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) \ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index 51cdf0c02f6a..086bc5bf33f7 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -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_ */ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index a315c93894c2..39f08a1f0c77 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -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; diff --git a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h index 5342a6daacf4..b39d21c12e1d 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h @@ -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 /** diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index dcc84954a416..2407a772b77e 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -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 diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 03c7be8237e5..de65f183af67 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -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)) diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 0559a6c54957..6f574ab23533 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -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); diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 115043ff22d5..45fd323614d2 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -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; diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 057ba1c6bd82..7ebeebb8ae7c 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -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; diff --git a/core/sme/src/csr/csr_neighbor_roam.c b/core/sme/src/csr/csr_neighbor_roam.c index 748890d621fc..6d23794efbe6 100644 --- a/core/sme/src/csr/csr_neighbor_roam.c +++ b/core/sme/src/csr/csr_neighbor_roam.c @@ -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) { } diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 6bb5960bb3e0..e26ff93dea97 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -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); }