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); }