diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index 5412a11f06..6c2659da64 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -1558,6 +1558,7 @@ static void mlme_init_roam_offload_cfg(struct wlan_objmgr_psoc *psoc, 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); lfr->sta_roam_disable = cfg_get(psoc, CFG_STA_DISABLE_ROAM); mlme_init_sae_single_pmk_cfg(psoc, lfr); diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index 5ac9b89c2d..c08edf4cbb 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -3010,4 +3010,5 @@ QDF_STATUS mlme_get_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst, */ QDF_STATUS mlme_set_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src, qdf_size_t len); + #endif /* _WLAN_MLME_API_H_ */ diff --git a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_api.h b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_api.h index c434bfa39f..3e3cc5f841 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_api.h +++ b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_api.h @@ -513,6 +513,31 @@ wlan_cm_roam_get_vendor_btm_params(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, struct wlan_cm_roam_vendor_btm_params *param); + +/** + * wlan_cm_update_roam_scan_scheme_bitmap() - Set roam scan scheme bitmap for + * each vdev + * @psoc: PSOC pointer + * @vdev_id: VDEV id + * @roam_scan_scheme_bitmap: bitmap of roam triggers for which partial roam + * scan needs to be enabled + * + * Return: QDF_STATUS + */ +QDF_STATUS +wlan_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, + uint32_t roam_scan_scheme_bitmap); + +/** + * wlan_cm_get_roam_scan_scheme_bitmap() - Get roam scan scheme bitmap value + * @psoc: PSOC pointer + * @vdev_id: VDEV id + * + * Return: Roam scan scheme bitmap value + */ +uint32_t wlan_cm_get_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id); #else static inline void wlan_cm_roam_activate_pcl_per_vdev(struct wlan_objmgr_psoc *psoc, @@ -570,5 +595,20 @@ wlan_cm_roam_get_vendor_btm_params(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, struct wlan_cm_roam_vendor_btm_params *param) {} + +static inline QDF_STATUS +wlan_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, + uint32_t roam_scan_scheme_bitmap) +{ + return QDF_STATUS_E_NOSUPPORT; +} + +static inline +uint32_t wlan_cm_get_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id) +{ + return 0; +} #endif /* FEATURE_ROAM_OFFLOAD */ #endif /* WLAN_CM_ROAM_API_H__ */ diff --git a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h index 6e18b33b15..4b980aebd3 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h +++ b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h @@ -94,6 +94,7 @@ #define WLAN_FILS_FT_MAX_LEN 48 #define WLAN_MAX_PMK_DUMP_BYTES 6 +#define DEFAULT_ROAM_SCAN_SCHEME_BITMAP 0 /** * enum roam_cfg_param - Type values for roaming parameters used as index @@ -1312,12 +1313,18 @@ enum roam_scan_freq_scheme { * @beacon_rssi_weight: Number of beacons to be used to calculate the average * rssi of the AP. * @hi_rssi_scan_delay: Roam scan delay in ms for High RSSI roam trigger. + * @roam_scan_scheme_bitmap: Bitmap of roam triggers for which partial channel + * map scan scheme needs to be enabled. Each bit in the bitmap corresponds to + * the bit position in the order provided by the enum roam_trigger_reason + * Ex: roam_scan_scheme_bitmap - 0x00110 will enable partial scan for below + * triggers: + * ROAM_TRIGGER_REASON_PER, ROAM_TRIGGER_REASON_BMISS */ struct wlan_cm_rso_configs { uint8_t rescan_rssi_delta; uint8_t beacon_rssi_weight; uint32_t hi_rssi_scan_delay; - + uint32_t roam_scan_scheme_bitmap; }; /** diff --git a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h index e2242ca419..39c8b22847 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h +++ b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h @@ -135,5 +135,24 @@ ucfg_cm_roaming_in_progress(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id) return wlan_cm_roaming_in_progress(pdev, vdev_id); } +#endif + +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +static inline QDF_STATUS +ucfg_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, + uint32_t roam_scan_scheme_bitmap) +{ + return wlan_cm_update_roam_scan_scheme_bitmap(psoc, vdev_id, + roam_scan_scheme_bitmap); +} +#else +static inline QDF_STATUS +ucfg_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, + uint32_t roam_scan_scheme_bitmap) +{ + return QDF_STATUS_SUCCESS; +} #endif #endif diff --git a/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c b/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c index 24c3846785..9eb559964f 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c +++ b/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c @@ -674,3 +674,65 @@ QDF_STATUS wlan_cm_update_fils_ft(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_SUCCESS; } #endif + +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +QDF_STATUS +wlan_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, + uint32_t roam_scan_scheme_bitmap) +{ + struct wlan_objmgr_vdev *vdev; + struct mlme_legacy_priv *mlme_priv; + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, + WLAN_MLME_NB_ID); + + if (!vdev) { + mlme_err("vdev%d: vdev object is NULL", vdev_id); + return QDF_STATUS_E_FAILURE; + } + + mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); + if (!mlme_priv) { + mlme_err("vdev%d: vdev legacy private object is NULL", vdev_id); + wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID); + return QDF_STATUS_E_FAILURE; + } + + mlme_priv->cm_roam.vdev_rso_config.roam_scan_scheme_bitmap = + roam_scan_scheme_bitmap; + wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID); + + return QDF_STATUS_SUCCESS; +} + +uint32_t wlan_cm_get_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id) +{ + struct wlan_objmgr_vdev *vdev; + struct mlme_legacy_priv *mlme_priv; + uint32_t roam_scan_scheme_bitmap; + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, + WLAN_MLME_NB_ID); + + if (!vdev) { + mlme_err("vdev%d: vdev object is NULL", vdev_id); + return 0; + } + + mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); + if (!mlme_priv) { + mlme_err("vdev%d: vdev legacy private object is NULL", vdev_id); + wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID); + return 0; + } + + roam_scan_scheme_bitmap = + mlme_priv->cm_roam.vdev_rso_config.roam_scan_scheme_bitmap; + + wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID); + + return roam_scan_scheme_bitmap; +} +#endif diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 94474cd87b..c32741b9dd 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -4543,6 +4543,7 @@ roam_control_policy[QCA_ATTR_ROAM_CONTROL_MAX + 1] = { [QCA_ATTR_ROAM_CONTROL_CONNECTED_RSSI_THRESHOLD] = {.type = NLA_U32}, [QCA_ATTR_ROAM_CONTROL_CANDIDATE_RSSI_THRESHOLD] = {.type = NLA_U32}, [QCA_ATTR_ROAM_CONTROL_USER_REASON] = {.type = NLA_U32}, + [QCA_ATTR_ROAM_CONTROL_SCAN_SCHEME_TRIGGERS] = {.type = NLA_U32}, }; /** @@ -4612,7 +4613,7 @@ wlan_hdd_convert_control_roam_trigger_bitmap(uint32_t trigger_reason_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; + all_bitmap = (QCA_ROAM_TRIGGER_REASON_EXTERNAL_SCAN << 1) - 1; if (trigger_reason_bitmap == all_bitmap) return BIT(ROAM_TRIGGER_REASON_MAX) - 1; @@ -4640,9 +4641,74 @@ wlan_hdd_convert_control_roam_trigger_bitmap(uint32_t trigger_reason_bitmap) if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BSS_LOAD) drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_BSS_LOAD); + if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_USER_TRIGGER) + drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_FORCED); + + if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_DEAUTH) + drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_DEAUTH); + + if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_IDLE) + drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_IDLE); + + if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_TX_FAILURES) + drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_STA_KICKOUT); + + if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_EXTERNAL_SCAN) + drv_trigger_bitmap |= BIT(ROAM_TRIGGER_REASON_BACKGROUND); + return drv_trigger_bitmap; } +/** + * wlan_hdd_convert_control_roam_scan_scheme_bitmap() - Convert the + * vendor specific roam scan scheme for roam triggers to internal roam trigger + * bitmap for partial scan. + * @trigger_reason_bitmap: Vendor specific roam trigger bitmap + * + * Return: Internal roam scan scheme bitmap + */ +static uint32_t +wlan_hdd_convert_control_roam_scan_scheme_bitmap(uint32_t trigger_reason_bitmap) +{ + uint32_t drv_scan_scheme_bitmap = 0; + + /* + * Partial scan scheme override over default scan scheme only for + * the PER, BMISS, Low RSSI, BTM, BSS_LOAD Triggers + */ + if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_PER) + drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_PER); + + if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BEACON_MISS) + drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_BMISS); + + if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_POOR_RSSI) + drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_LOW_RSSI); + + if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BTM) + drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_BTM); + + if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_BSS_LOAD) + drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_BSS_LOAD); + + if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_USER_TRIGGER) + drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_FORCED); + + if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_DEAUTH) + drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_DEAUTH); + + if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_IDLE) + drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_IDLE); + + if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_TX_FAILURES) + drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_STA_KICKOUT); + + if (trigger_reason_bitmap & QCA_ROAM_TRIGGER_REASON_EXTERNAL_SCAN) + drv_scan_scheme_bitmap |= BIT(ROAM_TRIGGER_REASON_BACKGROUND); + + return drv_scan_scheme_bitmap; +} + /** * hdd_send_roam_triggers_to_sme() - Send roam trigger bitmap to SME * @hdd_ctx: HDD context @@ -4694,6 +4760,16 @@ hdd_send_roam_triggers_to_sme(struct hdd_context *hdd_ctx, triggers.trigger_bitmap = wlan_hdd_convert_control_roam_trigger_bitmap(roam_trigger_bitmap); + /* + * roam trigger bitmap is > 0 - Roam triggers are set. + * roam trigger bitmap is 0 - Disable roaming + * + * For both the above modes, reset the roam scan scheme bitmap to + * 0. + */ + status = ucfg_cm_update_roam_scan_scheme_bitmap(hdd_ctx->psoc, + vdev_id, 0); + #ifdef ROAM_OFFLOAD_V1 status = ucfg_cm_rso_set_roam_trigger(hdd_ctx->pdev, vdev_id, &triggers); @@ -4978,6 +5054,15 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx, } } + attr = tb2[QCA_ATTR_ROAM_CONTROL_SCAN_SCHEME_TRIGGERS]; + if (attr) { + value = wlan_hdd_convert_control_roam_scan_scheme_bitmap( + nla_get_u32(attr)); + status = ucfg_cm_update_roam_scan_scheme_bitmap(hdd_ctx->psoc, + vdev_id, + value); + } + /* Scoring and roam candidate selection criteria */ attr = tb2[QCA_ATTR_ROAM_CONTROL_SELECTION_CRITERIA]; if (attr) { @@ -5004,7 +5089,9 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx, param.user_roam_reason = nla_get_u32(attr); else param.user_roam_reason = DISABLE_VENDOR_BTM_CONFIG; + wlan_cm_roam_set_vendor_btm_params(hdd_ctx->psoc, vdev_id, ¶m); + /* Sends RSO update */ sme_send_vendor_btm_params(hdd_ctx->mac_handle, vdev_id); return qdf_status_to_os_return(status); diff --git a/core/sme/src/csr/csr_neighbor_roam.c b/core/sme/src/csr/csr_neighbor_roam.c index 629dbde7c7..5eee61c375 100644 --- a/core/sme/src/csr/csr_neighbor_roam.c +++ b/core/sme/src/csr/csr_neighbor_roam.c @@ -824,6 +824,10 @@ static void csr_neighbor_roam_info_ctx_init(struct mac_context *mac, src_cfg.uint_value = mac->mlme_cfg->lfr.roam_scan_hi_rssi_delay; wlan_cm_roam_cfg_set_value(mac->psoc, session_id, HI_RSSI_DELAY_BTW_SCANS, &src_cfg); + + wlan_cm_update_roam_scan_scheme_bitmap(mac->psoc, session_id, + DEFAULT_ROAM_SCAN_SCHEME_BITMAP); + /* * Now we can clear the preauthDone that * was saved as we are connected afresh