diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index 6f7d77b73e..b97ea81d88 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -2505,6 +2505,17 @@ wlan_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, * Return: Roaming triggers value */ uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc); + +/** + * wlan_mlme_get_roaming_offload() - Get roaming offload setting + * @psoc: pointer to psoc object + * @val: Pointer to enable/disable roaming offload + * + * Return: QDF Status + */ +QDF_STATUS +wlan_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc, + bool *val); #else static inline QDF_STATUS wlan_mlme_get_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, @@ -2525,6 +2536,15 @@ uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc) { return 0xFFFF; } + +static inline QDF_STATUS +wlan_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc, + bool *val) +{ + *val = false; + + return QDF_STATUS_SUCCESS; +} #endif /** diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index a4e9df1456..15fe080d70 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -3915,6 +3915,23 @@ uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc) return mlme_obj->cfg.lfr.roam_trigger_bitmap; } + +QDF_STATUS +wlan_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc, + bool *val) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) { + *val = cfg_default(CFG_LFR3_ROAMING_OFFLOAD); + return QDF_STATUS_E_INVAL; + } + + *val = mlme_obj->cfg.lfr.lfr3_roaming_offload; + + return QDF_STATUS_SUCCESS; +} #endif QDF_STATUS diff --git a/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c b/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c index 71e7b0d078..29f150e1e8 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c @@ -773,17 +773,7 @@ QDF_STATUS ucfg_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc, bool *val) { - struct wlan_mlme_psoc_ext_obj *mlme_obj; - - mlme_obj = mlme_get_psoc_ext_obj(psoc); - if (!mlme_obj) { - *val = cfg_default(CFG_LFR3_ROAMING_OFFLOAD); - return QDF_STATUS_E_INVAL; - } - - *val = mlme_obj->cfg.lfr.lfr3_roaming_offload; - - return QDF_STATUS_SUCCESS; + return wlan_mlme_get_roaming_offload(psoc, val); } QDF_STATUS diff --git a/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c b/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c index 63a2f5ec59..de15cb1f8b 100644 --- a/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c +++ b/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c @@ -23,6 +23,8 @@ #include "target_if.h" #include "wmi_unified_sta_api.h" #include "wlan_mlme_dbg.h" +#include "wlan_mlme_api.h" +#include "wlan_crypto_global_api.h" #if defined(WLAN_FEATURE_ROAM_OFFLOAD) || defined(ROAM_OFFLOAD_V1) static struct wmi_unified @@ -210,6 +212,36 @@ target_if_cm_roam_triggers(wmi_unified_t wmi_handle, return wmi_unified_set_roam_triggers(wmi_handle, req); } + +/** + * target_if_cm_roam_scan_get_cckm_mode() - Get the CCKM auth mode + * @vdev: vdev object + * @auth_mode: Auth mode to be converted + * + * Based on LFR2.0 or LFR3.0, return the proper auth type + * + * Return: if LFR2.0, then return WMI_AUTH_CCKM for backward compatibility + * if LFR3.0 then return the appropriate auth type + */ +static uint32_t +target_if_cm_roam_scan_get_cckm_mode(struct wlan_objmgr_vdev *vdev, + uint32_t auth_mode) +{ + struct wlan_objmgr_psoc *psoc; + bool roam_offload_enable; + + psoc = wlan_vdev_get_psoc(vdev); + if (!psoc) { + target_if_err("psoc handle is NULL"); + return WMI_AUTH_CCKM; + } + + wlan_mlme_get_roaming_offload(psoc, &roam_offload_enable); + if (roam_offload_enable) + return auth_mode; + else + return WMI_AUTH_CCKM; +} #else static void target_if_cm_roam_reason_vsie(wmi_unified_t wmi_handle, @@ -223,8 +255,14 @@ target_if_cm_roam_triggers(wmi_unified_t wmi_handle, { return QDF_STATUS_E_NOSUPPORT; } -#endif +static uint32_t +target_if_cm_roam_scan_get_cckm_mode(struct wlan_objmgr_vdev *vdev, + uint32_t auth_mode) +{ + return WMI_AUTH_CCKM; +} +#endif /** * target_if_cm_roam_scan_offload_rssi_thresh() - Send roam scan rssi threshold * commands to wmi @@ -362,6 +400,171 @@ target_if_cm_roam_scan_offload_scan_period( return wmi_unified_roam_scan_offload_scan_period(wmi_handle, req); } +#ifdef WLAN_FEATURE_11W +/** + * target_if_roam_fill_11w_params() - Fill the 11w related parameters + * for ap profile + * @vdev: vdev object + * @req: roam ap profile parameters + * + * Return: None + */ +static void +target_if_cm_roam_fill_11w_params(struct wlan_objmgr_vdev *vdev, + struct ap_profile_params *req) +{ + uint32_t group_mgmt_cipher; + uint16_t rsn_caps; + bool peer_rmf_capable = false; + uint32_t keymgmt; + + if (!vdev) { + target_if_err("Invalid vdev"); + return; + } + + rsn_caps = (uint16_t)wlan_crypto_get_param(vdev, + WLAN_CRYPTO_PARAM_RSN_CAP); + if (wlan_crypto_vdev_has_mgmtcipher( + vdev, + (1 << WLAN_CRYPTO_CIPHER_AES_GMAC) | + (1 << WLAN_CRYPTO_CIPHER_AES_GMAC_256) | + (1 << WLAN_CRYPTO_CIPHER_AES_CMAC)) && + (rsn_caps & + WLAN_CRYPTO_RSN_CAP_MFP_ENABLED)) + peer_rmf_capable = true; + + keymgmt = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_MGMT_CIPHER); + + if (keymgmt & (1 << WLAN_CRYPTO_CIPHER_AES_CMAC)) + group_mgmt_cipher = WMI_CIPHER_AES_CMAC; + else if (keymgmt & (1 << WLAN_CRYPTO_CIPHER_AES_GMAC)) + group_mgmt_cipher = WMI_CIPHER_AES_GMAC; + else if (keymgmt & (1 << WLAN_CRYPTO_CIPHER_AES_GMAC_256)) + group_mgmt_cipher = WMI_CIPHER_BIP_GMAC_256; + else + group_mgmt_cipher = WMI_CIPHER_NONE; + + if (peer_rmf_capable) { + req->profile.rsn_mcastmgmtcipherset = group_mgmt_cipher; + req->profile.flags |= WMI_AP_PROFILE_FLAG_PMF; + } else { + req->profile.rsn_mcastmgmtcipherset = WMI_CIPHER_NONE; + } +} +#else +static inline +void target_if_cm_roam_fill_11w_params(struct wlan_objmgr_vdev *vdev, + struct ap_profile_params *req) +{} +#endif + +/** + * target_if_cm_roam_scan_offload_ap_profile() - send roam ap profile to + * firmware + * @vdev: vdev object + * @wmi_handle: wmi handle + * @req: roam ap profile parameters + * + * Send WMI_ROAM_AP_PROFILE parameters to firmware + * + * Return: QDF status + */ +static QDF_STATUS +target_if_cm_roam_scan_offload_ap_profile( + struct wlan_objmgr_vdev *vdev, + wmi_unified_t wmi_handle, + struct ap_profile_params *req) +{ + uint32_t rsn_authmode; + bool db2dbm_enabled; + + if (!target_if_is_vdev_valid(req->vdev_id)) { + target_if_err("Invalid vdev id:%d", req->vdev_id); + return QDF_STATUS_E_FAILURE; + } + + rsn_authmode = req->profile.rsn_authmode; + if (rsn_authmode == WMI_AUTH_CCKM_WPA || + rsn_authmode == WMI_AUTH_CCKM_RSNA) + req->profile.rsn_authmode = + target_if_cm_roam_scan_get_cckm_mode(vdev, rsn_authmode); + + target_if_cm_roam_fill_11w_params(vdev, req); + + db2dbm_enabled = wmi_service_enabled(wmi_handle, + wmi_service_hw_db2dbm_support); + if (!req->profile.rssi_abs_thresh) { + if (db2dbm_enabled) + req->profile.rssi_abs_thresh = RSSI_MIN_VALUE; + } else { + if (!db2dbm_enabled) + req->profile.rssi_abs_thresh -= + NOISE_FLOOR_DBM_DEFAULT; + } + + if (!db2dbm_enabled) { + req->min_rssi_params[DEAUTH_MIN_RSSI].min_rssi -= + NOISE_FLOOR_DBM_DEFAULT; + req->min_rssi_params[DEAUTH_MIN_RSSI].min_rssi &= 0x000000ff; + + req->min_rssi_params[BMISS_MIN_RSSI].min_rssi -= + NOISE_FLOOR_DBM_DEFAULT; + req->min_rssi_params[BMISS_MIN_RSSI].min_rssi &= 0x000000ff; + } + + return wmi_unified_send_roam_scan_offload_ap_cmd(wmi_handle, req); +} + +/** + * target_if_cm_roam_scan_filter() - send roam scan filter to firmware + * @wmi_handle: wmi handle + * @command: rso command + * @req: roam scan filter parameters + * + * Send WMI_ROAM_FILTER_CMDID parameters to firmware + * + * Return: QDF status + */ +static QDF_STATUS +target_if_cm_roam_scan_filter(wmi_unified_t wmi_handle, uint8_t command, + struct wlan_roam_scan_filter_params *req) +{ + QDF_STATUS status = QDF_STATUS_SUCCESS; + + if (!target_if_is_vdev_valid(req->filter_params.vdev_id)) { + target_if_err("Invalid vdev id:%d", + req->filter_params.vdev_id); + return QDF_STATUS_E_FAILURE; + } + + if (command != ROAM_SCAN_OFFLOAD_STOP) { + switch (req->reason) { + case REASON_ROAM_SET_BLACKLIST_BSSID: + case REASON_ROAM_SET_SSID_ALLOWED: + case REASON_ROAM_SET_FAVORED_BSSID: + break; + case REASON_CTX_INIT: + if (command == ROAM_SCAN_OFFLOAD_START) { + req->filter_params.op_bitmap |= + ROAM_FILTER_OP_BITMAP_LCA_DISALLOW | + ROAM_FILTER_OP_BITMAP_RSSI_REJECTION_OCE; + } else { + target_if_debug("Roam Filter need not be sent"); + return QDF_STATUS_SUCCESS; + } + break; + default: + target_if_debug("Roam Filter need not be sent"); + return QDF_STATUS_SUCCESS; + } + } + + status = wmi_unified_roam_scan_filter_cmd(wmi_handle, + &req->filter_params); + return status; +} + /** * target_if_cm_roam_send_roam_start() - Send roam start related commands * to wmi @@ -414,6 +617,20 @@ target_if_cm_roam_send_roam_start(struct wlan_objmgr_vdev *vdev, goto end; } + status = target_if_cm_roam_scan_offload_ap_profile( + vdev, wmi_handle, + &req->profile_params); + if (QDF_IS_STATUS_ERROR(status)) + goto end; + + status = target_if_cm_roam_scan_filter(wmi_handle, + ROAM_SCAN_OFFLOAD_START, + &req->scan_filter_params); + if (QDF_IS_STATUS_ERROR(status)) { + target_if_err("Sending start for roam scan filter failed"); + goto end; + } + /* add other wmi commands */ end: return status; diff --git a/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c b/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c index d48eba3c16..29a5e8fb27 100644 --- a/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c +++ b/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c @@ -188,11 +188,9 @@ cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc, * process directly, generate a new function wlan_cm_roam_send_rso_cmd * for external usage. */ -QDF_STATUS -cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc, - uint8_t vdev_id, - uint8_t rso_command, - uint8_t reason) +QDF_STATUS cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, uint8_t rso_command, + uint8_t reason) { QDF_STATUS status = QDF_STATUS_E_FAILURE; @@ -279,6 +277,21 @@ cm_roam_switch_to_rso_stop(struct wlan_objmgr_pdev *pdev, return QDF_STATUS_SUCCESS; } +static void cm_roam_roam_invoke_in_progress(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, bool set) +{ + struct wlan_objmgr_vdev *vdev; + struct mlme_roam_after_data_stall *vdev_roam_params; + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, + WLAN_MLME_NB_ID); + if (!vdev) + return; + vdev_roam_params = mlme_get_roam_invoke_params(vdev); + if (vdev_roam_params) + vdev_roam_params->roam_invoke_in_progress = set; + wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID); +} /** * cm_roam_switch_to_deinit() - roam state handling for roam deinit * @pdev: pdev pointer @@ -298,6 +311,8 @@ cm_roam_switch_to_deinit(struct wlan_objmgr_pdev *pdev, struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev); enum roam_offload_state cur_state = mlme_get_roam_state(psoc, vdev_id); + cm_roam_roam_invoke_in_progress(psoc, vdev_id, false); + switch (cur_state) { /* * If RSO stop is not done already, send RSO stop first and @@ -356,6 +371,8 @@ cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev, QDF_STATUS status; struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev); + cm_roam_roam_invoke_in_progress(psoc, vdev_id, false); + dual_sta_roam_active = wlan_mlme_get_dual_sta_roaming_enabled(psoc); diff --git a/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h b/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h index 11cf8595bf..1d1eddb387 100644 --- a/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h +++ b/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h @@ -28,22 +28,6 @@ #include "wlan_cm_roam_public_srtuct.h" #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD) -/** - * cm_roam_send_rso_cmd() - Send rso command - * @psoc: psoc pointer - * @vdev_id: vdev id - * @rso_command: roam scan offload command - * @reason: reason for changing roam state for the requested vdev id - * - * This function is used to send rso command - * - * Return: QDF_STATUS - */ -QDF_STATUS -cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc, - uint8_t vdev_id, - uint8_t rso_command, - uint8_t reason); /** * cm_roam_state_change() - Post roam state change to roam state machine @@ -61,5 +45,23 @@ cm_roam_state_change(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, enum roam_offload_state requested_state, uint8_t reason); + +/** + * cm_roam_send_rso_cmd() - send rso command + * @psoc: psoc pointer + * @vdev_id: vdev id + * @rso_command: roam command to send + * @reason: reason for changing roam state for the requested vdev id + * + * similar to csr_roam_offload_scan, will be used from many legacy + * process directly, generate a new function wlan_cm_roam_send_rso_cmd + * for external usage. + * + * Return: QDF_STATUS + */ +QDF_STATUS cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, uint8_t rso_command, + uint8_t reason); + #endif #endif 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 69312191bd..52ee4510c5 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 @@ -45,21 +45,6 @@ QDF_STATUS wlan_cm_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id); -/** - * wlan_cm_start_roaming() - start roaming - * @pdev: pdev pointer - * @vdev_id: vdev id - * @reason: reason to roam - * - * This function gets called to start roaming - * - * Return: QDF_STATUS - */ -QDF_STATUS -wlan_cm_start_roaming(struct wlan_objmgr_pdev *pdev, - uint8_t vdev_id, - uint8_t reason); - /** * wlan_cm_roam_cmd_allowed() - check roam cmd is allowed or not * @psoc: pointer to psoc object @@ -93,22 +78,6 @@ wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, struct wlan_roam_start_config *req, uint8_t reason); - -/** - * wlan_cm_roam_send_rso_cmd() - Send rso command - * @psoc: psoc pointer - * @vdev_id: vdev id - * @rso_command: roam scan offload command - * @reason: reason for changing roam state for the requested vdev id - * - * This function is used to send rso command - * - * Return: QDF_STATUS - */ -QDF_STATUS wlan_cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc, - uint8_t vdev_id, - uint8_t rso_command, - uint8_t reason); #else static inline QDF_STATUS wlan_cm_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev, @@ -116,23 +85,6 @@ wlan_cm_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev, { return QDF_STATUS_E_NOSUPPORT; } - -static inline QDF_STATUS -wlan_cm_start_roaming(struct wlan_objmgr_pdev *pdev, - uint8_t vdev_id, - uint8_t reason) -{ - return QDF_STATUS_E_NOSUPPORT; -} - -static inline QDF_STATUS -wlan_cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc, - uint8_t vdev_id, - uint8_t rso_command, - uint8_t reason); -{ - return QDF_STATUS_E_NOSUPPORT; -} #endif /** @@ -157,6 +109,77 @@ QDF_STATUS cm_roam_release_lock(void); */ char *cm_roam_get_requestor_string(enum wlan_cm_rso_control_requestor requestor); + +/** + * ucfg_cm_rso_init_deinit - Init or Deinit roaming module at firmware + * @pdev: Pointer to pdev + * @vdev_id: vdev id + * @enable: true: Send RSO init and RSO enable + * false: Send RSO stop + * + * Return: QDF_STATUS + */ +QDF_STATUS wlan_cm_rso_init_deinit(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id, bool enable); + +/** + * wlan_cm_disable_rso - Disable roam scan offload to firmware + * @pdev: Pointer to pdev + * @vdev_id: vdev id + * @requestor: RSO disable requestor + * @reason: Reason for RSO disable + * + * Return: QDF_STATUS + */ +QDF_STATUS wlan_cm_disable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id, + enum wlan_cm_rso_control_requestor requestor, + uint8_t reason); + +/** + * ucfg_cm_enable_rso - Enable roam scan offload to firmware + * @pdev: Pointer to pdev + * @vdev_id: vdev id + * @requestor: RSO disable requestor + * @reason: Reason for RSO disable + * + * Return: QDF_STATUS + */ +QDF_STATUS wlan_cm_enable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id, + enum wlan_cm_rso_control_requestor requestor, + uint8_t reason); + +/** + * wlan_cm_roam_state_change() - Post roam state change to roam state machine + * @pdev: pdev pointer + * @vdev_id: vdev id + * @requested_state: roam state to be set + * @reason: reason for changing roam state for the requested vdev id + * + * This function posts roam state change to roam state machine handling + * + * Return: QDF_STATUS + */ +QDF_STATUS wlan_cm_roam_state_change(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id, + enum roam_offload_state requested_state, + uint8_t reason); + +/** + * wlan_cm_roam_send_rso_cmd() - send rso command + * @psoc: psoc pointer + * @vdev_id: vdev id + * @rso_command: roam command to send + * @reason: reason for changing roam state for the requested vdev id + * + * similar to csr_roam_offload_scan, will be used from many legacy + * process directly, generate a new function wlan_cm_roam_send_rso_cmd + * for external usage. + * + * Return: QDF_STATUS + */ +QDF_STATUS wlan_cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, uint8_t rso_command, + uint8_t reason); #endif #ifdef WLAN_FEATURE_ROAM_OFFLOAD diff --git a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_srtuct.h b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_srtuct.h index 88130d2e74..c5fe211ccc 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_srtuct.h +++ b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_srtuct.h @@ -23,6 +23,8 @@ #include "wlan_objmgr_cmn.h" #include "reg_services_public_struct.h" +#include "wlan_cm_bss_score_param.h" +#include "wlan_blm_public_struct.h" #include "wmi_unified_param.h" #include "wmi_unified_sta_param.h" @@ -117,6 +119,276 @@ struct wlan_roam_triggers { struct wlan_cm_roam_vendor_btm_params vendor_btm_param; }; +/** + * struct ap_profile - Structure ap profile to match candidate + * @flags: flags + * @rssi_threshold: the value of the the candidate AP should higher by this + * threshold than the rssi of the currrently associated AP + * @ssid: ssid vlaue to be matched + * @rsn_authmode: security params to be matched + * @rsn_ucastcipherset: unicast cipher set + * @rsn_mcastcipherset: mcast/group cipher set + * @rsn_mcastmgmtcipherset: mcast/group management frames cipher set + * @rssi_abs_thresh: the value of the candidate AP should higher than this + * absolute RSSI threshold. Zero means no absolute minimum + * RSSI is required. units are the offset from the noise + * floor in dB + */ +struct ap_profile { + uint32_t flags; + uint32_t rssi_threshold; + struct wlan_ssid ssid; + uint32_t rsn_authmode; + uint32_t rsn_ucastcipherset; + uint32_t rsn_mcastcipherset; + uint32_t rsn_mcastmgmtcipherset; + uint32_t rssi_abs_thresh; +}; + +/** + * struct scoring_param - scoring param to sortlist selected AP + * @disable_bitmap: Each bit will be either allow(0)/disallow(1) to + * considered the roam score param. + * @rssi_weightage: RSSI weightage out of total score in % + * @ht_weightage: HT weightage out of total score in %. + * @vht_weightage: VHT weightage out of total score in %. + * @he_weightaget: 11ax weightage out of total score in %. + * @bw_weightage: Bandwidth weightage out of total score in %. + * @band_weightage: Band(2G/5G) weightage out of total score in %. + * @nss_weightage: NSS(1x1 / 2x2)weightage out of total score in %. + * @esp_qbss_weightage: ESP/QBSS weightage out of total score in %. + * @beamforming_weightage: Beamforming weightage out of total score in %. + * @pcl_weightage: PCL weightage out of total score in %. + * @oce_wan_weightage OCE WAN metrics weightage out of total score in %. + * @oce_ap_tx_pwr_weightage: OCE AP TX power score in % + * @oce_subnet_id_weightage: OCE subnet id score in % + * @bw_index_score: channel BW scoring percentage information. + * BITS 0-7 :- It contains scoring percentage of 20MHz BW + * BITS 8-15 :- It contains scoring percentage of 40MHz BW + * BITS 16-23 :- It contains scoring percentage of 80MHz BW + * BITS 24-31 :- It contains scoring percentage of 1600MHz BW + * The value of each index must be 0-100 + * @band_index_score: band scording percentage information. + * BITS 0-7 :- It contains scoring percentage of 2G + * BITS 8-15 :- It contains scoring percentage of 5G + * BITS 16-23 :- reserved + * BITS 24-31 :- reserved + * The value of each index must be 0-100 + * @nss_index_score: NSS scoring percentage information. + * BITS 0-7 :- It contains scoring percentage of 1x1 + * BITS 8-15 :- It contains scoring percentage of 2x2 + * BITS 16-23 :- It contains scoring percentage of 3x3 + * BITS 24-31 :- It contains scoring percentage of 4x4 + * The value of each index must be 0-100 + * @roam_score_delta: delta value expected over the roam score of the candidate + * ap over the roam score of the current ap + * @roam_trigger_bitmap: bitmap of roam triggers on which roam_score_delta + * will be applied + * @vendor_roam_score_algorithm: Preferred algorithm for roam candidate selection + * @cand_min_roam_score_delta: candidate min roam score delta value + * @rssi_scoring: RSSI scoring information. + * @esp_qbss_scoring: ESP/QBSS scoring percentage information + * @oce_wan_scoring: OCE WAN metrics percentage information + */ +struct scoring_param { + uint32_t disable_bitmap; + int32_t rssi_weightage; + int32_t ht_weightage; + int32_t vht_weightage; + int32_t he_weightage; + int32_t bw_weightage; + int32_t band_weightage; + int32_t nss_weightage; + int32_t esp_qbss_weightage; + int32_t beamforming_weightage; + int32_t pcl_weightage; + int32_t oce_wan_weightage; + uint32_t oce_ap_tx_pwr_weightage; + uint32_t oce_subnet_id_weightage; + uint32_t bw_index_score; + uint32_t band_index_score; + uint32_t nss_index_score; + uint32_t roam_score_delta; + uint32_t roam_trigger_bitmap; + uint32_t vendor_roam_score_algorithm; + uint32_t cand_min_roam_score_delta; + struct rssi_config_score rssi_scoring; + struct per_slot_score esp_qbss_scoring; + struct per_slot_score oce_wan_scoring; +}; + +/* + * Currently roam score delta value and min rssi values are sent + * for 2 triggers + */ +#define NUM_OF_ROAM_TRIGGERS 2 +#define IDLE_ROAM_TRIGGER 0 +#define BTM_ROAM_TRIGGER 1 + +#define DEAUTH_MIN_RSSI 0 +#define BMISS_MIN_RSSI 1 + +/** + * enum roam_trigger_reason - Reason for triggering roam + * ROAM_TRIGGER_REASON_NONE: Roam trigger reason none + * ROAM_TRIGGER_REASON_PER: Roam triggered due to packet error + * ROAM_TRIGGER_REASON_BMISS: Roam triggered due to beacon miss + * ROAM_TRIGGER_REASON_LOW_RSSI: Roam triggered due to low RSSI of current + * connected AP. + * ROAM_TRIGGER_REASON_HIGH_RSSI: Roam triggered because sta is connected to + * a AP in 2.4GHz band and a better 5GHz AP is available + * ROAM_TRIGGER_REASON_PERIODIC: Roam triggered as better AP was found during + * periodic roam scan. + * ROAM_TRIGGER_REASON_MAWC: Motion Aided WiFi Connectivity triggered roam. + * ROAM_TRIGGER_REASON_DENSE: Roaming triggered due to dense environment + * detected. + * ROAM_TRIGGER_REASON_BACKGROUND: Roam triggered due to current AP having + * poor rssi and scan candidate found in scan results provided by other + * scan clients. + * ROAM_TRIGGER_REASON_FORCED: Forced roam trigger. + * ROAM_TRIGGER_REASON_BTM: Roam triggered due to AP sent BTM query with + * Disassoc imminent bit set. + * ROAM_TRIGGER_REASON_UNIT_TEST: Roam triggered due to unit test command. + * ROAM_TRIGGER_REASON_BSS_LOAD: Roam triggered due to high channel utilization + * in the current connected channel + * ROAM_TRIGGER_REASON_DEAUTH: Roam triggered due to deauth received from the + * current connected AP. + * ROAM_TRIGGER_REASON_IDLE: Roam triggered due to inactivity of the device. + * ROAM_TRIGGER_REASON_STA_KICKOUT: Roam triggered due to sta kickout event. + * ROAM_TRIGGER_REASON_ESS_RSSI: Roam triggered due to ess rssi + * ROAM_TRIGGER_REASON_WTC_BTM: Roam triggered due to WTC BTM + * ROAM_TRIGGER_REASON_MAX: Maximum number of roam triggers + */ +enum roam_trigger_reason { + ROAM_TRIGGER_REASON_NONE = 0, + ROAM_TRIGGER_REASON_PER, + ROAM_TRIGGER_REASON_BMISS, + ROAM_TRIGGER_REASON_LOW_RSSI, + ROAM_TRIGGER_REASON_HIGH_RSSI, + ROAM_TRIGGER_REASON_PERIODIC, + ROAM_TRIGGER_REASON_MAWC, + ROAM_TRIGGER_REASON_DENSE, + ROAM_TRIGGER_REASON_BACKGROUND, + ROAM_TRIGGER_REASON_FORCED, + ROAM_TRIGGER_REASON_BTM, + ROAM_TRIGGER_REASON_UNIT_TEST, + ROAM_TRIGGER_REASON_BSS_LOAD, + ROAM_TRIGGER_REASON_DEAUTH, + ROAM_TRIGGER_REASON_IDLE, + ROAM_TRIGGER_REASON_STA_KICKOUT, + ROAM_TRIGGER_REASON_ESS_RSSI, + ROAM_TRIGGER_REASON_WTC_BTM, + ROAM_TRIGGER_REASON_MAX, +}; + +/** + * struct roam_trigger_min_rssi - structure to hold minimum rssi value of + * candidate APs for each roam trigger + * @min_rssi: minimum RSSI of candidate AP for the trigger reason specified in + * trigger_id + * @trigger_reason: Roam trigger reason + */ +struct roam_trigger_min_rssi { + int32_t min_rssi; + enum roam_trigger_reason trigger_reason; +}; + +/** + * struct roam_trigger_score_delta - structure to hold roam score delta value of + * candidate APs for each roam trigger + * @roam_score_delta: delta value in score of the candidate AP for the roam + * trigger mentioned in the trigger_id. + * @trigger_reason: Roam trigger reason + */ +struct roam_trigger_score_delta { + uint32_t roam_score_delta; + enum roam_trigger_reason trigger_reason; +}; + +/** + * struct ap_profile_params - ap profile params + * @vdev_id: vdev id + * @profile: ap profile to match candidate + * @param: scoring params to short candidate + * @min_rssi_params: Min RSSI values for different roam triggers + * @score_delta_params: Roam score delta values for different triggers + */ +struct ap_profile_params { + uint8_t vdev_id; + struct ap_profile profile; + struct scoring_param param; + struct roam_trigger_min_rssi min_rssi_params[NUM_OF_ROAM_TRIGGERS]; + struct roam_trigger_score_delta score_delta_param[NUM_OF_ROAM_TRIGGERS]; +}; + +#define MAX_SSID_ALLOWED_LIST 4 +#define MAX_BSSID_AVOID_LIST 16 +#define MAX_BSSID_FAVORED 16 + +/** + * struct roam_scan_filter_params - Structure holding roaming scan + * parameters + * @op_bitmap: bitmap to determine reason of roaming + * @vdev_id: vdev id + * @num_bssid_black_list: The number of BSSID's that we should avoid + * connecting to. It is like a blacklist of BSSID's. + * @num_ssid_white_list: The number of SSID profiles that are in the + * Whitelist. When roaming, we consider the BSSID's with + * this SSID also for roaming apart from the connected + * one's + * @num_bssid_preferred_list: Number of BSSID's which have a preference over + * others + * @bssid_avoid_list: Blacklist SSID's + * @ssid_allowed_list: Whitelist SSID's + * @bssid_favored: Favorable BSSID's + * @bssid_favored_factor: RSSI to be added to this BSSID to prefer it + * @lca_disallow_config_present: LCA [Last Connected AP] disallow config + * present + * @disallow_duration: How long LCA AP will be disallowed before it can be a + * roaming candidate again, in seconds + * @rssi_channel_penalization: How much RSSI will be penalized if candidate(s) + * are found in the same channel as disallowed + * AP's, in units of db + * @num_disallowed_aps: How many APs the target should maintain in its LCA + * list + * @delta_rssi: (dB units) when AB in RSSI blacklist improved by at least + * delta_rssi,it will be removed from blacklist + * + * This structure holds all the key parameters related to + * initial connection and roaming connections. + */ + +struct roam_scan_filter_params { + uint32_t op_bitmap; + uint8_t vdev_id; + uint32_t num_bssid_black_list; + uint32_t num_ssid_white_list; + uint32_t num_bssid_preferred_list; + struct qdf_mac_addr bssid_avoid_list[MAX_BSSID_AVOID_LIST]; + struct wlan_ssid ssid_allowed_list[MAX_SSID_ALLOWED_LIST]; + struct qdf_mac_addr bssid_favored[MAX_BSSID_FAVORED]; + uint8_t bssid_favored_factor[MAX_BSSID_FAVORED]; + uint8_t lca_disallow_config_present; + uint32_t disallow_duration; + uint32_t rssi_channel_penalization; + uint32_t num_disallowed_aps; + uint32_t num_rssi_rejection_ap; + struct reject_ap_config_params + rssi_rejection_ap[MAX_RSSI_AVOID_BSSID_LIST]; + uint32_t delta_rssi; +}; + +/** + * struct wlan_roam_scan_filter_params - structure containing parameters for + * roam scan offload filter + * @reason: reason for changing roam state for the requested vdev id + * @filter_params: roam scan filter parameters + */ +struct wlan_roam_scan_filter_params { + uint8_t reason; + struct roam_scan_filter_params filter_params; +}; + #ifdef ROAM_OFFLOAD_V1 #define NOISE_FLOOR_DBM_DEFAULT (-96) #define RSSI_MIN_VALUE (-128) @@ -240,6 +512,8 @@ struct wlan_roam_scan_period_params { * @reason_vsie_enable: roam reason vsie enable parameters * @roam_triggers: roam triggers parameters * @scan_period_params: roam scan period parameters + * @profile_params: ap profile parameters + * @scan_filter_params: roam scan filter parameters */ struct wlan_roam_start_config { struct wlan_roam_offload_scan_rssi_params rssi_params; @@ -247,6 +521,8 @@ struct wlan_roam_start_config { struct wlan_roam_reason_vsie_enable reason_vsie_enable; struct wlan_roam_triggers roam_triggers; struct wlan_roam_scan_period_params scan_period_params; + struct ap_profile_params profile_params; + struct wlan_roam_scan_filter_params scan_filter_params; /* other wmi cmd structures */ }; 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 738c8ee730..f5481f7b59 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 @@ -23,7 +23,10 @@ #ifndef _WLAN_CM_ROAM_UCFG_API_H_ #define _WLAN_CM_ROAM_UCFG_API_H_ +#include "wlan_cm_roam_api.h" + #ifdef ROAM_OFFLOAD_V1 + /** * ucfg_user_space_enable_disable_rso - Enable/Disable Roam Scan offload * to firmware. @@ -40,6 +43,17 @@ ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, const bool is_fast_roam_enabled); +/* + * ucfg_cm_abort_roam_scan() -abort current roam scan cycle by roam scan + * offload module. + * @pdev: Pointer to pdev + * vdev_id - vdev Identifier + * + * Return QDF_STATUS + */ +QDF_STATUS ucfg_cm_abort_roam_scan(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id); + /** * ucfg_cm_rso_init_deinit - Init or Deinit roaming module at firmware * @pdev: Pointer to pdev @@ -49,9 +63,12 @@ ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev *pdev, * * Return: QDF_STATUS */ -QDF_STATUS -ucfg_cm_rso_init_deinit(struct wlan_objmgr_pdev *pdev, - uint8_t vdev_id, bool enable); +static inline QDF_STATUS +ucfg_cm_rso_init_deinit(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, + bool enable) +{ + return wlan_cm_rso_init_deinit(pdev, vdev_id, enable); +} /** * ucfg_cm_disable_rso - Disable roam scan offload to firmware @@ -62,9 +79,13 @@ ucfg_cm_rso_init_deinit(struct wlan_objmgr_pdev *pdev, * * Return: QDF_STATUS */ +static inline QDF_STATUS ucfg_cm_disable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id, enum wlan_cm_rso_control_requestor requestor, - uint8_t reason); + uint8_t reason) +{ + return wlan_cm_disable_rso(pdev, vdev_id, requestor, reason); +} /** * ucfg_cm_enable_rso - Enable roam scan offload to firmware @@ -75,8 +96,12 @@ QDF_STATUS ucfg_cm_disable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id, * * Return: QDF_STATUS */ +static inline QDF_STATUS ucfg_cm_enable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id, enum wlan_cm_rso_control_requestor requestor, - uint8_t reason); + uint8_t reason) +{ + return wlan_cm_enable_rso(pdev, vdev_id, requestor, reason); +} #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 2e387e5eec..0f2d415390 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 @@ -75,23 +75,115 @@ wlan_cm_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev, WLAN_ROAM_RSO_ENABLED, REASON_CTX_INIT); } +#endif -QDF_STATUS wlan_cm_start_roaming(struct wlan_objmgr_pdev *pdev, - uint8_t vdev_id, uint8_t reason) +char *cm_roam_get_requestor_string(enum wlan_cm_rso_control_requestor requestor) { - return cm_roam_state_change(pdev, vdev_id, - WLAN_ROAM_RSO_ENABLED, reason); + switch (requestor) { + case RSO_INVALID_REQUESTOR: + default: + return "No requestor"; + case RSO_START_BSS: + return "SAP start"; + case RSO_CHANNEL_SWITCH: + return "CSA"; + case RSO_CONNECT_START: + return "STA connection"; + case RSO_SAP_CHANNEL_CHANGE: + return "SAP Ch switch"; + case RSO_NDP_CON_ON_NDI: + return "NDP connection"; + case RSO_SET_PCL: + return "Set PCL"; + } +} + +QDF_STATUS +wlan_cm_rso_init_deinit(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, + bool enable) +{ + uint8_t reason = REASON_SUPPLICANT_DE_INIT_ROAMING; + QDF_STATUS status; + + status = cm_roam_acquire_lock(); + if (QDF_IS_STATUS_ERROR(status)) + return QDF_STATUS_E_FAILURE; + + if (enable) + reason = REASON_SUPPLICANT_INIT_ROAMING; + + status = cm_roam_state_change( + pdev, vdev_id, + enable ? WLAN_ROAM_RSO_ENABLED : WLAN_ROAM_DEINIT, + reason); + cm_roam_release_lock(); + + return status; +} + +QDF_STATUS wlan_cm_disable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id, + enum wlan_cm_rso_control_requestor requestor, + uint8_t reason) +{ + struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev); + QDF_STATUS status; + + status = cm_roam_acquire_lock(); + if (QDF_IS_STATUS_ERROR(status)) + return QDF_STATUS_E_FAILURE; + + if (reason == REASON_DRIVER_DISABLED && requestor) + mlme_set_operations_bitmap(psoc, vdev_id, requestor, false); + + mlme_debug("ROAM_CONFIG: vdev[%d] Disable roaming - requestor:%s", + vdev_id, cm_roam_get_requestor_string(requestor)); + + status = cm_roam_state_change(pdev, vdev_id, WLAN_ROAM_RSO_STOPPED, + REASON_DRIVER_DISABLED); + cm_roam_release_lock(); + + return status; +} + +QDF_STATUS wlan_cm_enable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id, + enum wlan_cm_rso_control_requestor requestor, + uint8_t reason) +{ + struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev); + QDF_STATUS status; + + if (reason == REASON_DRIVER_DISABLED && requestor) + mlme_set_operations_bitmap(psoc, vdev_id, requestor, true); + + status = cm_roam_acquire_lock(); + if (QDF_IS_STATUS_ERROR(status)) + return QDF_STATUS_E_FAILURE; + + mlme_debug("ROAM_CONFIG: vdev[%d] Enable roaming - requestor:%s", + vdev_id, cm_roam_get_requestor_string(requestor)); + + status = cm_roam_state_change(pdev, vdev_id, WLAN_ROAM_RSO_ENABLED, + REASON_DRIVER_ENABLED); + cm_roam_release_lock(); + + return status; +} + +QDF_STATUS wlan_cm_roam_state_change(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id, + enum roam_offload_state requested_state, + uint8_t reason) +{ + return cm_roam_state_change(pdev, vdev_id, requested_state, reason); } QDF_STATUS wlan_cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc, - uint8_t vdev_id, - uint8_t rso_command, + uint8_t vdev_id, uint8_t rso_command, uint8_t reason) { return cm_roam_send_rso_cmd(psoc, vdev_id, rso_command, reason); } #endif -#endif #ifdef WLAN_FEATURE_ROAM_OFFLOAD QDF_STATUS @@ -142,8 +234,8 @@ void wlan_cm_roam_activate_pcl_per_vdev(struct wlan_objmgr_psoc *psoc, /* value - true (vdev pcl) false - pdev pcl */ mlme_priv->cm_roam.pcl_vdev_cmd_active = pcl_per_vdev; - mlme_legacy_debug("CM_ROAM: vdev[%d] SET PCL cmd level - [%s]", vdev_id, - pcl_per_vdev ? "VDEV" : "PDEV"); + mlme_debug("CM_ROAM: vdev[%d] SET PCL cmd level - [%s]", vdev_id, + pcl_per_vdev ? "VDEV" : "PDEV"); } bool wlan_cm_roam_is_pcl_per_vdev_active(struct wlan_objmgr_psoc *psoc, @@ -227,7 +319,7 @@ wlan_cm_dual_sta_roam_update_connect_channels(struct wlan_objmgr_psoc *psoc, status = policy_mgr_get_valid_chans(psoc, channel_list, &num_channels); if (QDF_IS_STATUS_ERROR(status)) { - mlme_legacy_err("Error in getting valid channels"); + mlme_err("Error in getting valid channels"); qdf_mem_free(channel_list); return; } @@ -329,26 +421,3 @@ wlan_cm_roam_get_vendor_btm_params(struct wlan_objmgr_psoc *psoc, wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID); } #endif - -#ifdef ROAM_OFFLOAD_V1 -char *cm_roam_get_requestor_string(enum wlan_cm_rso_control_requestor requestor) -{ - switch (requestor) { - case RSO_INVALID_REQUESTOR: - default: - return "No requestor"; - case RSO_START_BSS: - return "SAP start"; - case RSO_CHANNEL_SWITCH: - return "CSA"; - case RSO_CONNECT_START: - return "STA connection"; - case RSO_SAP_CHANNEL_CHANGE: - return "SAP Ch switch"; - case RSO_NDP_CON_ON_NDI: - return "NDP connection"; - case RSO_SET_PCL: - return "Set PCL"; - } -} -#endif diff --git a/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_ucfg_api.c b/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_ucfg_api.c index ec4ca711e3..335ce45dd5 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_ucfg_api.c +++ b/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_ucfg_api.c @@ -20,7 +20,9 @@ * Implementation for roaming ucfg public functionality. */ +#include "wlan_mlme_ucfg_api.h" #include "wlan_cm_roam_ucfg_api.h" +#include "../../core/src/wlan_cm_roam_offload.h" #ifdef ROAM_OFFLOAD_V1 QDF_STATUS @@ -31,6 +33,8 @@ ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev *pdev, bool supplicant_disabled_roaming; struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev); QDF_STATUS status; + bool lfr_enabled; + enum roam_offload_state state; /* * If the ini "FastRoamEnabled" is disabled, don't allow the @@ -38,7 +42,8 @@ ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev *pdev, */ ucfg_mlme_is_lfr_enabled(psoc, &lfr_enabled); if (!lfr_enabled) { - mlme_legacy_debug("ROAM_CONFIG: Fast roam ini is disabled"); + mlme_debug("ROAM_CONFIG: Fast roam ini is disabled. is_fast_roam_enabled %d", + is_fast_roam_enabled); if (!is_fast_roam_enabled) return QDF_STATUS_SUCCESS; @@ -56,7 +61,7 @@ ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev *pdev, supplicant_disabled_roaming = mlme_get_supplicant_disabled_roaming(psoc, vdev_id); if (!is_fast_roam_enabled && supplicant_disabled_roaming) { - mlme_legacy_debug("ROAM_CONFIG: RSO already disabled by supplicant"); + mlme_debug("ROAM_CONFIG: RSO already disabled by supplicant"); return QDF_STATUS_E_ALREADY; } @@ -71,76 +76,25 @@ ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev *pdev, return status; } -/* - * Driver internally invoked RSO operation/configuration APIs. - */ -QDF_STATUS -ucfg_cm_rso_init_deinit(struct wlan_objmgr_pdev *pdev, - uint8_t vdev_id, bool enable) +QDF_STATUS ucfg_cm_abort_roam_scan(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id) { - struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev); - uint8_t reason = REASON_SUPPLICANT_DE_INIT_ROAMING; QDF_STATUS status; + struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev); + bool roam_scan_offload_enabled; + + ucfg_mlme_is_roam_scan_offload_enabled(psoc, + &roam_scan_offload_enabled); + if (!roam_scan_offload_enabled) + return QDF_STATUS_SUCCESS; status = cm_roam_acquire_lock(); if (QDF_IS_STATUS_ERROR(status)) - return QDF_STATUS_E_FAILURE; + return status; - if (enable) - reason = REASON_SUPPLICANT_INIT_ROAMING; - - status = cm_roam_state_change( - pdev, vdev_id, - enable ? WLAN_ROAM_RSO_ENABLED : WLAN_ROAM_DEINIT, - reason); - cm_roam_release_lock(); - - return status; -} - -QDF_STATUS ucfg_cm_disable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id, - enum wlan_cm_rso_control_requestor requestor, - uint8_t reason) -{ - struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev); - QDF_STATUS status; - - status = cm_roam_acquire_lock(); - if (QDF_IS_STATUS_ERROR(status)) - return QDF_STATUS_E_FAILURE; - - if (reason == REASON_DRIVER_DISABLED && requestor) - mlme_set_operations_bitmap(psoc, vdev_id, requestor, false); - - mlme_legacy_debug("ROAM_CONFIG: vdev[%d] Disable roaming - requestor:%s", - vdev_id, cm_roam_get_requestor_string(requestor)); - - status = cm_roam_state_change(pdev, vdev_id, WLAN_ROAM_RSO_STOPPED, - REASON_DRIVER_DISABLED); - cm_roam_release_lock(); - - return status; -} - -QDF_STATUS ucfg_cm_enable_rso(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id, - enum wlan_cm_rso_control_requestor requestor, - uint8_t reason) -{ - struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev); - QDF_STATUS status; - - if (reason == REASON_DRIVER_DISABLED && requestor) - mlme_set_operations_bitmap(mac->psoc, vdev_id, requestor, true); - - status = cm_roam_acquire_lock(); - if (QDF_IS_STATUS_ERROR(status)) - return QDF_STATUS_E_FAILURE; - - mlme_legacy_debug("ROAM_CONFIG: vdev[%d] Enable roaming - requestor:%s", - vdev_id, cm_roam_get_requestor_string(requestor)); - - status = cm_roam_state_change(pdev, vdev_id, WLAN_ROAM_RSO_STARTED, - REASON_DRIVER_ENABLED); + status = cm_roam_state_change(pdev, vdev_id, + ROAM_SCAN_OFFLOAD_ABORT_SCAN, + REASON_ROAM_ABORT_ROAM_SCAN); cm_roam_release_lock(); return status; diff --git a/components/wmi/inc/wmi_unified_roam_param.h b/components/wmi/inc/wmi_unified_roam_param.h index 174bda5164..71a68fc565 100644 --- a/components/wmi/inc/wmi_unified_roam_param.h +++ b/components/wmi/inc/wmi_unified_roam_param.h @@ -171,63 +171,6 @@ struct wmi_mawc_roam_params { uint8_t rssi_stationary_low_adjust; }; -#define MAX_SSID_ALLOWED_LIST 4 -#define MAX_BSSID_AVOID_LIST 16 -#define MAX_BSSID_FAVORED 16 - -/** - * struct roam_scan_filter_params - Structure holding roaming scan - * parameters - * @op_bitmap: bitmap to determine reason of roaming - * @vdev_id: vdev id - * @num_bssid_black_list: The number of BSSID's that we should avoid - * connecting to. It is like a blacklist of BSSID's. - * @num_ssid_white_list: The number of SSID profiles that are in the - * Whitelist. When roaming, we consider the BSSID's with - * this SSID also for roaming apart from the connected - * one's - * @num_bssid_preferred_list: Number of BSSID's which have a preference over - * others - * @bssid_avoid_list: Blacklist SSID's - * @ssid_allowed_list: Whitelist SSID's - * @bssid_favored: Favorable BSSID's - * @bssid_favored_factor: RSSI to be added to this BSSID to prefer it - * @lca_disallow_config_present: LCA [Last Connected AP] disallow config - * present - * @disallow_duration: How long LCA AP will be disallowed before it can be a - * roaming candidate again, in seconds - * @rssi_channel_penalization: How much RSSI will be penalized if candidate(s) - * are found in the same channel as disallowed - * AP's, in units of db - * @num_disallowed_aps: How many APs the target should maintain in its LCA - * list - * @delta_rssi: (dB units) when AB in RSSI blacklist improved by at least - * delta_rssi,it will be removed from blacklist - * - * This structure holds all the key parameters related to - * initial connection and roaming connections. - */ - -struct roam_scan_filter_params { - uint32_t op_bitmap; - uint8_t vdev_id; - uint32_t num_bssid_black_list; - uint32_t num_ssid_white_list; - uint32_t num_bssid_preferred_list; - struct qdf_mac_addr bssid_avoid_list[MAX_BSSID_AVOID_LIST]; - struct wlan_ssid ssid_allowed_list[MAX_SSID_ALLOWED_LIST]; - struct qdf_mac_addr bssid_favored[MAX_BSSID_FAVORED]; - uint8_t bssid_favored_factor[MAX_BSSID_FAVORED]; - uint8_t lca_disallow_config_present; - uint32_t disallow_duration; - uint32_t rssi_channel_penalization; - uint32_t num_disallowed_aps; - uint32_t num_rssi_rejection_ap; - struct reject_ap_config_params - rssi_rejection_ap[MAX_RSSI_AVOID_BSSID_LIST]; - uint32_t delta_rssi; -}; - #define WMI_CFG_VALID_CHANNEL_LIST_LEN 100 /* Occupied channel list remains static */ #define WMI_CHANNEL_LIST_STATIC 1 @@ -271,209 +214,6 @@ struct plm_req_params { bool enable; }; -/** - * struct ap_profile - Structure ap profile to match candidate - * @flags: flags - * @rssi_threshold: the value of the the candidate AP should higher by this - * threshold than the rssi of the currrently associated AP - * @ssid: ssid vlaue to be matched - * @rsn_authmode: security params to be matched - * @rsn_ucastcipherset: unicast cipher set - * @rsn_mcastcipherset: mcast/group cipher set - * @rsn_mcastmgmtcipherset: mcast/group management frames cipher set - * @rssi_abs_thresh: the value of the candidate AP should higher than this - * absolute RSSI threshold. Zero means no absolute minimum - * RSSI is required. units are the offset from the noise - * floor in dB - */ -struct ap_profile { - uint32_t flags; - uint32_t rssi_threshold; - struct wlan_ssid ssid; - uint32_t rsn_authmode; - uint32_t rsn_ucastcipherset; - uint32_t rsn_mcastcipherset; - uint32_t rsn_mcastmgmtcipherset; - uint32_t rssi_abs_thresh; -}; - - -/** - * struct scoring_param - scoring param to sortlist selected AP - * @disable_bitmap: Each bit will be either allow(0)/disallow(1) to - * considered the roam score param. - * @rssi_weightage: RSSI weightage out of total score in % - * @ht_weightage: HT weightage out of total score in %. - * @vht_weightage: VHT weightage out of total score in %. - * @he_weightaget: 11ax weightage out of total score in %. - * @bw_weightage: Bandwidth weightage out of total score in %. - * @band_weightage: Band(2G/5G) weightage out of total score in %. - * @nss_weightage: NSS(1x1 / 2x2)weightage out of total score in %. - * @esp_qbss_weightage: ESP/QBSS weightage out of total score in %. - * @beamforming_weightage: Beamforming weightage out of total score in %. - * @pcl_weightage: PCL weightage out of total score in %. - * @oce_wan_weightage OCE WAN metrics weightage out of total score in %. - * @oce_ap_tx_pwr_weightage: OCE AP TX power score in % - * @oce_subnet_id_weightage: OCE subnet id score in % - * @bw_index_score: channel BW scoring percentage information. - * BITS 0-7 :- It contains scoring percentage of 20MHz BW - * BITS 8-15 :- It contains scoring percentage of 40MHz BW - * BITS 16-23 :- It contains scoring percentage of 80MHz BW - * BITS 24-31 :- It contains scoring percentage of 1600MHz BW - * The value of each index must be 0-100 - * @band_index_score: band scording percentage information. - * BITS 0-7 :- It contains scoring percentage of 2G - * BITS 8-15 :- It contains scoring percentage of 5G - * BITS 16-23 :- reserved - * BITS 24-31 :- reserved - * The value of each index must be 0-100 - * @nss_index_score: NSS scoring percentage information. - * BITS 0-7 :- It contains scoring percentage of 1x1 - * BITS 8-15 :- It contains scoring percentage of 2x2 - * BITS 16-23 :- It contains scoring percentage of 3x3 - * BITS 24-31 :- It contains scoring percentage of 4x4 - * The value of each index must be 0-100 - * @roam_score_delta: delta value expected over the roam score of the candidate - * ap over the roam score of the current ap - * @roam_trigger_bitmap: bitmap of roam triggers on which roam_score_delta - * will be applied - * @vendor_roam_score_algorithm: Prefered algorithm for roam candidate selection - * @cand_min_roam_score_delta: candidate min roam score delta value - * @rssi_scoring: RSSI scoring information. - * @esp_qbss_scoring: ESP/QBSS scoring percentage information - * @oce_wan_scoring: OCE WAN metrics percentage information - */ -struct scoring_param { - uint32_t disable_bitmap; - int32_t rssi_weightage; - int32_t ht_weightage; - int32_t vht_weightage; - int32_t he_weightage; - int32_t bw_weightage; - int32_t band_weightage; - int32_t nss_weightage; - int32_t esp_qbss_weightage; - int32_t beamforming_weightage; - int32_t pcl_weightage; - int32_t oce_wan_weightage; - uint32_t oce_ap_tx_pwr_weightage; - uint32_t oce_subnet_id_weightage; - uint32_t bw_index_score; - uint32_t band_index_score; - uint32_t nss_index_score; - uint32_t roam_score_delta; - uint32_t roam_trigger_bitmap; - uint32_t vendor_roam_score_algorithm; - uint32_t cand_min_roam_score_delta; - struct rssi_config_score rssi_scoring; - struct per_slot_score esp_qbss_scoring; - struct per_slot_score oce_wan_scoring; -}; - -/* - * Currently roam score delta value and min rssi values are sent - * for 2 triggers - */ -#define NUM_OF_ROAM_TRIGGERS 2 -#define IDLE_ROAM_TRIGGER 0 -#define BTM_ROAM_TRIGGER 1 - -#define DEAUTH_MIN_RSSI 0 -#define BMISS_MIN_RSSI 1 - -/** - * enum roam_trigger_reason - Reason for triggering roam - * ROAM_TRIGGER_REASON_NONE: Roam trigger reason none - * ROAM_TRIGGER_REASON_PER: Roam triggered due to packet error - * ROAM_TRIGGER_REASON_BMISS: Roam triggered due to beacon miss - * ROAM_TRIGGER_REASON_LOW_RSSI: Roam triggered due to low RSSI of current - * connected AP. - * ROAM_TRIGGER_REASON_HIGH_RSSI: Roam triggered because sta is connected to - * a AP in 2.4GHz band and a better 5GHz AP is available - * ROAM_TRIGGER_REASON_PERIODIC: Roam triggered as better AP was found during - * periodic roam scan. - * ROAM_TRIGGER_REASON_MAWC: Motion Aided WiFi Connectivity triggered roam. - * ROAM_TRIGGER_REASON_DENSE: Roaming triggered due to dense environment - * detected. - * ROAM_TRIGGER_REASON_BACKGROUND: Roam triggered due to current AP having - * poor rssi and scan candidate found in scan results provided by other - * scan clients. - * ROAM_TRIGGER_REASON_FORCED: Forced roam trigger. - * ROAM_TRIGGER_REASON_BTM: Roam triggered due to AP sent BTM query with - * Disassoc imminent bit set. - * ROAM_TRIGGER_REASON_UNIT_TEST: Roam triggered due to unit test command. - * ROAM_TRIGGER_REASON_BSS_LOAD: Roam triggered due to high channel utilization - * in the current connected channel - * ROAM_TRIGGER_REASON_DEAUTH: Roam triggered due to deauth received from the - * current connected AP. - * ROAM_TRIGGER_REASON_IDLE: Roam triggered due to inactivity of the device. - * ROAM_TRIGGER_REASON_STA_KICKOUT: Roam triggered due to sta kickout event. - * ROAM_TRIGGER_REASON_ESS_RSSI: Roam triggered due to ess rssi - * ROAM_TRIGGER_REASON_WTC_BTM: Roam triggered due to WTC BTM - * ROAM_TRIGGER_REASON_MAX: Maximum number of roam triggers - */ -enum roam_trigger_reason { - ROAM_TRIGGER_REASON_NONE = 0, - ROAM_TRIGGER_REASON_PER, - ROAM_TRIGGER_REASON_BMISS, - ROAM_TRIGGER_REASON_LOW_RSSI, - ROAM_TRIGGER_REASON_HIGH_RSSI, - ROAM_TRIGGER_REASON_PERIODIC, - ROAM_TRIGGER_REASON_MAWC, - ROAM_TRIGGER_REASON_DENSE, - ROAM_TRIGGER_REASON_BACKGROUND, - ROAM_TRIGGER_REASON_FORCED, - ROAM_TRIGGER_REASON_BTM, - ROAM_TRIGGER_REASON_UNIT_TEST, - ROAM_TRIGGER_REASON_BSS_LOAD, - ROAM_TRIGGER_REASON_DEAUTH, - ROAM_TRIGGER_REASON_IDLE, - ROAM_TRIGGER_REASON_STA_KICKOUT, - ROAM_TRIGGER_REASON_ESS_RSSI, - ROAM_TRIGGER_REASON_WTC_BTM, - ROAM_TRIGGER_REASON_MAX, -}; - -/** - * struct roam_trigger_min_rssi - structure to hold minimum rssi value of - * candidate APs for each roam trigger - * @min_rssi: minimum RSSI of candidate AP for the trigger reason specified in - * trigger_id - * @trigger_reason: Roam trigger reason - */ -struct roam_trigger_min_rssi { - int32_t min_rssi; - enum roam_trigger_reason trigger_reason; -}; - -/** - * struct roam_trigger_score_delta - structure to hold roam score delta value of - * candidate APs for each roam trigger - * @roam_score_delta: delta value in score of the candidate AP for the roam - * trigger mentioned in the trigger_id. - * @trigger_reason: Roam trigger reason - */ -struct roam_trigger_score_delta { - uint32_t roam_score_delta; - enum roam_trigger_reason trigger_reason; -}; - -/** - * struct ap_profile_params - ap profile params - * @vdev_id: vdev id - * @profile: ap profile to match candidate - * @param: scoring params to short candidate - * @min_rssi_params: Min RSSI values for different roam triggers - * @score_delta_params: Roam score delta values for different triggers - */ -struct ap_profile_params { - uint8_t vdev_id; - struct ap_profile profile; - struct scoring_param param; - struct roam_trigger_min_rssi min_rssi_params[NUM_OF_ROAM_TRIGGERS]; - struct roam_trigger_score_delta score_delta_param[NUM_OF_ROAM_TRIGGERS]; -}; - /** * struct wmi_roam_invoke_cmd - roam invoke command * @vdev_id: vdev id diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 953c376941..6fe2173d6f 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -154,7 +154,7 @@ #include "wlan_hdd_apf.h" #include "wlan_hdd_cfr.h" #include "wlan_hdd_ioctl.h" -#include "wlan_cm_roam_api.h" +#include "wlan_cm_roam_ucfg_api.h" #define g_mode_rates_size (12) #define a_mode_rates_size (8) diff --git a/core/hdd/src/wlan_hdd_ioctl.c b/core/hdd/src/wlan_hdd_ioctl.c index 5b2ccdc360..dd7fda8818 100644 --- a/core/hdd/src/wlan_hdd_ioctl.c +++ b/core/hdd/src/wlan_hdd_ioctl.c @@ -47,6 +47,7 @@ #include "wlan_scan_ucfg_api.h" #include "wlan_reg_ucfg_api.h" #include "qdf_func_tracker.h" +#include "wlan_cm_roam_ucfg_api.h" #if defined(LINUX_QCMBR) #define SIOCIOCTLTX99 (SIOCDEVPRIVATE+13) @@ -744,6 +745,19 @@ static int hdd_parse_reassoc(struct hdd_adapter *adapter, const char *command, return ret; } +#ifdef ROAM_OFFLOAD_V1 +static inline +void hdd_abort_roam_scan(struct hdd_context *hdd_ctx, uint8_t vdev_id) +{ + ucfg_cm_abort_roam_scan(hdd_ctx->pdev, vdev_id); +} +#else +static inline +void hdd_abort_roam_scan(struct hdd_context *hdd_ctx, uint8_t vdev_id) +{ + sme_abort_roam_scan(hdd_ctx->mac_handle, vdev_id); +} +#endif /** * hdd_sendactionframe() - send a userspace-supplied action frame * @adapter: Adapter upon which the command was received @@ -839,8 +853,7 @@ hdd_sendactionframe(struct hdd_adapter *adapter, const uint8_t *bssid, * may cause long delays in sending action * frames. */ - sme_abort_roam_scan(hdd_ctx->mac_handle, - adapter->vdev_id); + hdd_abort_roam_scan(hdd_ctx, adapter->vdev_id); } else { /* * 0 is accepted as current home channel, diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 1912024321..1a100d1743 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -2025,9 +2025,7 @@ typedef enum { SIR_ROAMING_DFS_CHANNEL_ENABLED_NORMAL = 1, SIR_ROAMING_DFS_CHANNEL_ENABLED_ACTIVE = 2 } eSirDFSRoamScanMode; -#define MAX_SSID_ALLOWED_LIST 4 -#define MAX_BSSID_AVOID_LIST 16 -#define MAX_BSSID_FAVORED 16 + /** * struct roam_ext_params - Structure holding roaming parameters * @num_bssid_avoid_list: The number of BSSID's that we should diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index a8c643df78..cd4e761509 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -981,9 +981,10 @@ QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled(mac_handle_t mac_handle, const bool isFastRoamIniFeatureEnabled); +#ifndef ROAM_OFFLOAD_V1 QDF_STATUS sme_config_fast_roaming(mac_handle_t mac_handle, uint8_t session_id, const bool is_fast_roam_enabled); - +#endif QDF_STATUS sme_stop_roaming(mac_handle_t mac_handle, uint8_t sessionId, uint8_t reason, enum wlan_cm_rso_control_requestor requestor); @@ -1632,7 +1633,10 @@ QDF_STATUS sme_ext_scan_register_callback(mac_handle_t mac_handle, return QDF_STATUS_SUCCESS; } #endif /* FEATURE_WLAN_EXTSCAN */ + +#ifndef ROAM_OFFLOAD_V1 QDF_STATUS sme_abort_roam_scan(mac_handle_t mac_handle, uint8_t sessionId); +#endif /** * sme_get_vht_ch_width() - SME API to get the max supported FW chan width diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index d3732c22e4..f7f463f59a 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -6210,6 +6210,7 @@ QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled(mac_handle_t mac_handle, return QDF_STATUS_SUCCESS; } +#ifndef ROAM_OFFLOAD_V1 /** * sme_config_fast_roaming() - enable/disable LFR support at runtime * @mac_handle - The handle returned by macOpen. @@ -6268,6 +6269,7 @@ QDF_STATUS sme_config_fast_roaming(mac_handle_t mac_handle, uint8_t session_id, return QDF_STATUS_SUCCESS; } +#endif #ifdef FEATURE_WLAN_ESE int sme_add_key_krk(mac_handle_t mac_handle, uint8_t session_id, @@ -6326,6 +6328,33 @@ int sme_add_key_btk(mac_handle_t mac_handle, uint8_t session_id, } #endif +#ifdef ROAM_OFFLOAD_V1 +QDF_STATUS sme_stop_roaming(mac_handle_t mac_handle, uint8_t vdev_id, + uint8_t reason, + enum wlan_cm_rso_control_requestor requestor) +{ + struct mac_context *mac = MAC_CONTEXT(mac_handle); + struct csr_roam_session *session; + + session = CSR_GET_SESSION(mac, vdev_id); + if (!session) { + sme_err("ROAM: incorrect vdev ID %d", vdev_id); + return QDF_STATUS_E_FAILURE; + } + + return wlan_cm_disable_rso(mac->pdev, vdev_id, requestor, reason); +} + +QDF_STATUS sme_start_roaming(mac_handle_t mac_handle, uint8_t vdev_id, + uint8_t reason, + enum wlan_cm_rso_control_requestor requestor) +{ + struct mac_context *mac = MAC_CONTEXT(mac_handle); + + return wlan_cm_enable_rso(mac->pdev, vdev_id, requestor, reason); +} + +#else /** * sme_stop_roaming() - Stop roaming for a given sessionId * This is a synchronous call @@ -6396,6 +6425,7 @@ QDF_STATUS sme_start_roaming(mac_handle_t mac_handle, uint8_t sessionId, return status; } +#endif void sme_set_pcl_for_first_connected_vdev(mac_handle_t mac_handle, uint8_t vdev_id) @@ -9652,6 +9682,7 @@ QDF_STATUS sme_update_dsc_pto_up_mapping(mac_handle_t mac_handle, return status; } +#ifndef ROAM_OFFLOAD_V1 /* * sme_abort_roam_scan() - * API to abort current roam scan cycle by roam scan offload module. @@ -9680,6 +9711,7 @@ QDF_STATUS sme_abort_roam_scan(mac_handle_t mac_handle, uint8_t sessionId) return status; } +#endif QDF_STATUS sme_get_valid_channels_by_band(mac_handle_t mac_handle, uint8_t wifi_band, @@ -15990,6 +16022,24 @@ void sme_chan_to_freq_list( wlan_reg_chan_to_freq(pdev, (uint32_t)chan_list[count]); } +#ifdef ROAM_OFFLOAD_V1 +static inline +QDF_STATUS sme_rso_init_deinit(struct mac_context *mac, + struct wlan_roam_triggers *triggers) +{ + QDF_STATUS status; + + if (!triggers->trigger_bitmap) + status = wlan_cm_rso_init_deinit(mac->pdev, triggers->vdev_id, + false); + else + status = wlan_cm_rso_init_deinit(mac->pdev, triggers->vdev_id, + true); + + return status; +} +#else + static QDF_STATUS sme_enable_roaming(struct mac_context *mac, uint32_t vdev_id, bool enable) { @@ -16019,6 +16069,23 @@ static QDF_STATUS sme_enable_roaming(struct mac_context *mac, uint32_t vdev_id, return QDF_STATUS_SUCCESS; } +static inline +QDF_STATUS sme_rso_init_deinit(struct mac_context *mac, + struct wlan_roam_triggers *triggers) +{ + QDF_STATUS status; + + if (!triggers->trigger_bitmap) + status = sme_enable_roaming(mac, triggers->vdev_id, + false); + else + status = sme_enable_roaming(mac, triggers->vdev_id, + true); + + return status; +} +#endif + QDF_STATUS sme_set_roam_triggers(mac_handle_t mac_handle, struct wlan_roam_triggers *triggers) { @@ -16029,13 +16096,8 @@ QDF_STATUS sme_set_roam_triggers(mac_handle_t mac_handle, mlme_set_roam_trigger_bitmap(mac->psoc, triggers->vdev_id, triggers->trigger_bitmap); - if (!triggers->trigger_bitmap) - status = sme_enable_roaming(mac, triggers->vdev_id, - false); - else - status = sme_enable_roaming(mac, triggers->vdev_id, - true); + status = sme_rso_init_deinit(mac, triggers); if (QDF_IS_STATUS_ERROR(status)) return status; diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index e9585e3c6d..36171514cb 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -1740,6 +1740,7 @@ QDF_STATUS csr_create_bg_scan_roam_channel_list(struct mac_context *mac, return status; } +#ifndef ROAM_OFFLOAD_V1 #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD) /** * csr_check_band_freq_match() - check if passed band and ch freq match @@ -1820,6 +1821,7 @@ is_dfs_unsafe_extra_band_chan(struct mac_context *mac_ctx, uint32_t freq, return false; } #endif +#endif #ifdef FEATURE_WLAN_ESE /** @@ -2097,6 +2099,7 @@ QDF_STATUS csr_get_tsm_stats(struct mac_context *mac, return status; } +#ifndef ROAM_OFFLOAD_V1 #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD) /** * csr_fetch_ch_lst_from_received_list() - fetch channel list from received list @@ -2136,6 +2139,7 @@ csr_fetch_ch_lst_from_received_list(struct mac_context *mac_ctx, req_buf->ChannelCacheType = CHANNEL_LIST_DYNAMIC; } #endif +#endif /** * csr_set_cckm_ie() - set CCKM IE @@ -2494,6 +2498,7 @@ void csr_set_11k_offload_config_param(struct csr_config *csr_config, max_neighbor_report_req_cap; } +#ifndef ROAM_OFFLOAD_V1 static void csr_copy_mawc_config(struct mac_context *mac, struct mawc_params *mawc_config) @@ -2511,6 +2516,7 @@ csr_copy_mawc_config(struct mac_context *mac, mawc_config->mawc_roam_rssi_low_adjust = mac->mlme_cfg->lfr.mawc_roam_rssi_low_adjust; } +#endif QDF_STATUS csr_change_default_config_param(struct mac_context *mac, struct csr_config_params *pParam) @@ -16682,6 +16688,7 @@ QDF_STATUS csr_roam_set_key_mgmt_offload(struct mac_context *mac_ctx, return QDF_STATUS_SUCCESS; } +#ifndef ROAM_OFFLOAD_V1 /** * csr_update_roam_scan_ese_params() - Update ESE related params in RSO request * @req_buf: Roam Scan Offload Request buffer @@ -16911,6 +16918,7 @@ csr_update_roam_scan_offload_request(struct mac_context *mac_ctx, req_buf->roaming_scan_policy = mac_ctx->mlme_cfg->lfr.roaming_scan_policy; } +#endif #ifdef WLAN_FEATURE_FIPS QDF_STATUS @@ -16989,6 +16997,8 @@ csr_update_roam_scan_offload_request(struct mac_context *mac_ctx, #endif /* WLAN_FEATURE_ROAM_OFFLOAD */ #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD) + +#ifndef ROAM_OFFLOAD_V1 /** * csr_populate_roam_chan_list() * parameters @@ -17753,52 +17763,6 @@ csr_update_11k_offload_params(struct mac_context *mac_ctx, session->connectedProfile.SSID.length); } -QDF_STATUS csr_invoke_neighbor_report_request(uint8_t session_id, - struct sRrmNeighborReq *neighbor_report_req, - bool send_resp_to_host) -{ - struct wmi_invoke_neighbor_report_params *invoke_params; - struct scheduler_msg msg = {0}; - - if (!neighbor_report_req) { - sme_err("Invalid params"); - return QDF_STATUS_E_INVAL; - } - - invoke_params = qdf_mem_malloc(sizeof(*invoke_params)); - if (!invoke_params) - return QDF_STATUS_E_NOMEM; - - invoke_params->vdev_id = session_id; - invoke_params->send_resp_to_host = send_resp_to_host; - - if (!neighbor_report_req->no_ssid) { - invoke_params->ssid.length = neighbor_report_req->ssid.length; - qdf_mem_copy(invoke_params->ssid.ssid, - neighbor_report_req->ssid.ssId, - neighbor_report_req->ssid.length); - } else { - invoke_params->ssid.length = 0; - } - - sme_debug("Sending SIR_HAL_INVOKE_NEIGHBOR_REPORT"); - - msg.type = SIR_HAL_INVOKE_NEIGHBOR_REPORT; - msg.reserved = 0; - msg.bodyptr = invoke_params; - - if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME, - QDF_MODULE_ID_WMA, - QDF_MODULE_ID_WMA, - &msg)) { - sme_err("Not able to post message to WMA"); - qdf_mem_free(invoke_params); - return QDF_STATUS_E_FAILURE; - } - - return QDF_STATUS_SUCCESS; -} - /** * check_allowed_ssid_list() - Check the WhiteList * @req_buffer: Buffer which contains the connected profile SSID. @@ -17888,6 +17852,54 @@ csr_add_rssi_reject_ap_list(struct mac_context *mac_ctx, qdf_mem_free(reject_list); } +#endif + +QDF_STATUS csr_invoke_neighbor_report_request( + uint8_t session_id, + struct sRrmNeighborReq *neighbor_report_req, + bool send_resp_to_host) +{ + struct wmi_invoke_neighbor_report_params *invoke_params; + struct scheduler_msg msg = {0}; + + if (!neighbor_report_req) { + sme_err("Invalid params"); + return QDF_STATUS_E_INVAL; + } + + invoke_params = qdf_mem_malloc(sizeof(*invoke_params)); + if (!invoke_params) + return QDF_STATUS_E_NOMEM; + + invoke_params->vdev_id = session_id; + invoke_params->send_resp_to_host = send_resp_to_host; + + if (!neighbor_report_req->no_ssid) { + invoke_params->ssid.length = neighbor_report_req->ssid.length; + qdf_mem_copy(invoke_params->ssid.ssid, + neighbor_report_req->ssid.ssId, + neighbor_report_req->ssid.length); + } else { + invoke_params->ssid.length = 0; + } + + sme_debug("Sending SIR_HAL_INVOKE_NEIGHBOR_REPORT"); + + msg.type = SIR_HAL_INVOKE_NEIGHBOR_REPORT; + msg.reserved = 0; + msg.bodyptr = invoke_params; + + if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME, + QDF_MODULE_ID_WMA, + QDF_MODULE_ID_WMA, + &msg)) { + sme_err("Not able to post message to WMA"); + qdf_mem_free(invoke_params); + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} /* * csr_roam_send_rso_cmd() - API to send RSO command to PE @@ -17919,6 +17931,7 @@ csr_roam_send_rso_cmd(struct mac_context *mac_ctx, return status; } +#ifndef ROAM_OFFLOAD_V1 /** * csr_append_assoc_ies() - Append specific IE to assoc IE's buffer * @mac_ctx: Pointer to global mac context @@ -17998,6 +18011,7 @@ static void ese_populate_addtional_ies(struct mac_context *mac_ctx, { } #endif + /** * csr_update_driver_assoc_ies() - Append driver built IE's to assoc IE's * @mac_ctx: Pointer to global mac structure @@ -18177,6 +18191,7 @@ csr_roam_offload_per_scan(struct mac_context *mac_ctx, uint8_t session_id) } return QDF_STATUS_SUCCESS; } +#endif #if defined(WLAN_FEATURE_FILS_SK) QDF_STATUS csr_update_fils_config(struct mac_context *mac, uint8_t session_id, @@ -18200,6 +18215,7 @@ QDF_STATUS csr_update_fils_config(struct mac_context *mac, uint8_t session_id, return QDF_STATUS_SUCCESS; } +#ifndef ROAM_OFFLOAD_V1 /** * copy_all_before_char() - API to copy all character before a particular char * @str: Source string @@ -18293,26 +18309,29 @@ static void csr_update_fils_params_rso(struct mac_context *mac, roam_fils_params->next_erp_seq_num, roam_fils_params->rrk_length, roam_fils_params->realm_len); } +#endif #else + +#ifndef ROAM_OFFLOAD_V1 static inline void csr_update_fils_params_rso(struct mac_context *mac, struct csr_roam_session *session, struct roam_offload_scan_req *req_buffer) {} #endif +#endif /** * csr_update_score_params() - API to update Score params in RSO * @mac_ctx: Mac context - * @req_buffer: RSO request buffer + * @req_score_params: request score params * * Return: None */ static void csr_update_score_params(struct mac_context *mac_ctx, - struct roam_offload_scan_req *req_buffer, + struct scoring_param *req_score_params, tpCsrNeighborRoamControlInfo roam_info) { - struct scoring_param *req_score_params; struct wlan_mlme_roam_scoring_cfg *roam_score_params; struct weight_cfg *weight_config; struct psoc_mlme_obj *mlme_psoc_obj; @@ -18323,7 +18342,6 @@ static void csr_update_score_params(struct mac_context *mac_ctx, if (!mlme_psoc_obj) return; - req_score_params = &req_buffer->score_params; score_config = &mlme_psoc_obj->psoc_cfg.score_config; roam_score_params = &mac_ctx->mlme_cfg->roam_scoring; weight_config = &score_config->weight_config; @@ -18910,19 +18928,6 @@ csr_post_roam_state_change(struct mac_context *mac, uint8_t vdev_id, { return csr_handle_roam_state_change(mac, vdev_id, state, reason); } -#else -QDF_STATUS -csr_post_roam_state_change(struct mac_context *mac, uint8_t vdev_id, - enum roam_offload_state state, uint8_t reason) -{ - QDF_STATUS status = QDF_STATUS_SUCCESS; - - if (state == WLAN_ROAM_RSO_ENABLED) - status = wlan_cm_start_roaming(mac->pdev, vdev_id, reason); - - return status; -} -#endif /** * csr_roam_offload_scan() - populates roam offload scan request and sends to @@ -19172,7 +19177,9 @@ csr_roam_offload_scan(struct mac_context *mac_ctx, uint8_t session_id, session->pAddIEAssoc, session->nAddIEAssocLength); csr_update_driver_assoc_ies(mac_ctx, session, req_buf); - csr_update_score_params(mac_ctx, req_buf, roam_info); + csr_update_score_params(mac_ctx, + &req_buf->score_params, + roam_info); csr_update_fils_params_rso(mac_ctx, session, req_buf); } @@ -19212,8 +19219,23 @@ csr_roam_offload_scan(struct mac_context *mac_ctx, uint8_t session_id, return status; } -#ifdef ROAM_OFFLOAD_V1 -#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD) +#else + +QDF_STATUS +csr_post_roam_state_change(struct mac_context *mac, uint8_t vdev_id, + enum roam_offload_state state, uint8_t reason) +{ + return wlan_cm_roam_state_change(mac->pdev, vdev_id, state, reason); +} + +QDF_STATUS +csr_roam_offload_scan(struct mac_context *mac_ctx, uint8_t session_id, + uint8_t command, uint8_t reason) +{ + return wlan_cm_roam_send_rso_cmd(mac_ctx->psoc, session_id, command, + reason); +} + QDF_STATUS wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, @@ -19462,7 +19484,7 @@ wlan_cm_roam_scan_offload_rssi_thresh( * wlan_cm_roam_scan_offload_scan_period() - set roam offload scan period * parameters * @mac_ctx: global mac ctx - * @session: csr roam session + * @vdev_id: vdev id * @params: roam offload scan period related parameters * * This function is used to set roam offload scan period related parameters @@ -19472,13 +19494,13 @@ wlan_cm_roam_scan_offload_rssi_thresh( static void wlan_cm_roam_scan_offload_scan_period( struct mac_context *mac_ctx, - struct csr_roam_session *session, + uint8_t vdev_id, struct wlan_roam_scan_period_params *params) { tpCsrNeighborRoamControlInfo roam_info = - &mac_ctx->roam.neighborRoamInfo[session->vdev_id]; + &mac_ctx->roam.neighborRoamInfo[vdev_id]; - params->vdev_id = session->vdev_id; + params->vdev_id = vdev_id; params->empty_scan_refresh_period = roam_info->cfgParams.emptyScanRefreshPeriod; params->scan_period = params->empty_scan_refresh_period; @@ -19493,6 +19515,195 @@ wlan_cm_roam_scan_offload_scan_period( roam_info->cfgParams.full_roam_scan_period; } +/** + * wlan_cm_roam_scan_offload_ap_profile() - set roam ap profile parameters + * @mac_ctx: global mac ctx + * @session: sme session + * @params: roam ap profile related parameters + * + * This function is used to set roam ap profile related parameters + * + * Return: None + */ +static void +wlan_cm_roam_scan_offload_ap_profile(struct mac_context *mac_ctx, + struct csr_roam_session *session, + struct ap_profile_params *params) +{ + struct ap_profile *profile = ¶ms->profile; + struct roam_ext_params *roam_params_src = + &mac_ctx->roam.configParam.roam_params; + tpCsrNeighborRoamControlInfo roam_info = + &mac_ctx->roam.neighborRoamInfo[session->vdev_id]; + + params->vdev_id = session->vdev_id; + profile->ssid.length = session->connectedProfile.SSID.length; + qdf_mem_copy(profile->ssid.ssid, session->connectedProfile.SSID.ssId, + profile->ssid.length); + profile->rsn_authmode = + e_csr_auth_type_to_rsn_authmode( + session->connectedProfile.AuthType, + session->connectedProfile.EncryptionType); + /* Pairwise cipher suite */ + profile->rsn_ucastcipherset = + e_csr_encryption_type_to_rsn_cipherset( + session->connectedProfile.EncryptionType); + /* Group cipher suite */ + profile->rsn_mcastcipherset = + e_csr_encryption_type_to_rsn_cipherset( + session->connectedProfile.mcEncryptionType); + /* Group management cipher suite */ + + profile->rssi_threshold = roam_info->cfgParams.roam_rssi_diff; + /* + * rssi_diff which is updated via framework is equivalent to the + * INI RoamRssiDiff parameter and hence should be updated. + */ + if (roam_params_src->rssi_diff) + profile->rssi_threshold = roam_params_src->rssi_diff; + + profile->rssi_abs_thresh = + mac_ctx->mlme_cfg->lfr.roam_rssi_abs_threshold; + + csr_update_score_params(mac_ctx, ¶ms->param, roam_info); + + params->min_rssi_params[DEAUTH_MIN_RSSI] = + mac_ctx->mlme_cfg->trig_min_rssi[DEAUTH_MIN_RSSI]; + params->min_rssi_params[BMISS_MIN_RSSI] = + mac_ctx->mlme_cfg->trig_min_rssi[BMISS_MIN_RSSI]; + params->score_delta_param[IDLE_ROAM_TRIGGER] = + mac_ctx->mlme_cfg->trig_score_delta[IDLE_ROAM_TRIGGER]; + params->score_delta_param[BTM_ROAM_TRIGGER] = + mac_ctx->mlme_cfg->trig_score_delta[BTM_ROAM_TRIGGER]; +} + +/** + * wlan_cm_roam_scan_filter() - set roam scan filter parameters + * @mac_ctx: global mac ctx + * @vdev_id: vdev id + * @command: rso command + * @reason: reason to roam + * @scan_filter_params: roam scan filter related parameters + * + * There are filters such as whitelist, blacklist and preferred + * list that need to be applied to the scan results to form the + * probable candidates for roaming. + * + * Return: None + */ +static void +wlan_cm_roam_scan_filter( + struct mac_context *mac_ctx, + uint8_t vdev_id, + uint8_t command, + uint8_t reason, + struct wlan_roam_scan_filter_params *scan_filter_params) +{ + int i; + uint32_t num_bssid_black_list = 0, num_ssid_white_list = 0, + num_bssid_preferred_list = 0, num_rssi_rejection_ap = 0; + uint32_t op_bitmap = 0; + struct roam_ext_params *roam_params; + struct roam_scan_filter_params *params; + + scan_filter_params->reason = reason; + params = &scan_filter_params->filter_params; + roam_params = &mac_ctx->roam.configParam.roam_params; + if (command != ROAM_SCAN_OFFLOAD_STOP) { + switch (reason) { + case REASON_ROAM_SET_BLACKLIST_BSSID: + op_bitmap |= 0x1; + num_bssid_black_list = + roam_params->num_bssid_avoid_list; + break; + case REASON_ROAM_SET_SSID_ALLOWED: + op_bitmap |= 0x2; + num_ssid_white_list = + roam_params->num_ssid_allowed_list; + break; + case REASON_ROAM_SET_FAVORED_BSSID: + op_bitmap |= 0x4; + num_bssid_preferred_list = + roam_params->num_bssid_favored; + break; + case REASON_CTX_INIT: + if (command == ROAM_SCAN_OFFLOAD_START) { + params->lca_disallow_config_present = true; + num_rssi_rejection_ap = + roam_params->num_rssi_rejection_ap; + } else { + sme_debug("Roam Filter need not be sent, no need to fill parameters"); + return; + } + break; + default: + sme_debug("Roam Filter need not be sent, no need to fill parameters"); + return; + } + } else { + /* In case of STOP command, reset all the variables + * except for blacklist BSSID which should be retained + * across connections. + */ + op_bitmap = 0x2 | 0x4; + num_ssid_white_list = roam_params->num_ssid_allowed_list; + num_bssid_preferred_list = roam_params->num_bssid_favored; + } + + /* fill in fixed values */ + params->vdev_id = vdev_id; + params->op_bitmap = op_bitmap; + params->num_bssid_black_list = num_bssid_black_list; + params->num_ssid_white_list = num_ssid_white_list; + params->num_bssid_preferred_list = num_bssid_preferred_list; + params->num_rssi_rejection_ap = num_rssi_rejection_ap; + params->delta_rssi = + wlan_blm_get_rssi_blacklist_threshold(mac_ctx->pdev); + qdf_mem_copy(params->bssid_avoid_list, roam_params->bssid_avoid_list, + MAX_BSSID_AVOID_LIST * sizeof(struct qdf_mac_addr)); + + for (i = 0; i < num_ssid_white_list; i++) { + qdf_mem_copy(params->ssid_allowed_list[i].ssid, + roam_params->ssid_allowed_list[i].ssId, + roam_params->ssid_allowed_list[i].length); + params->ssid_allowed_list[i].length = + roam_params->ssid_allowed_list[i].length; + sme_debug("SSID %d: %.*s", i, + params->ssid_allowed_list[i].length, + params->ssid_allowed_list[i].ssid); + } + + for (i = 0; i < params->num_bssid_black_list; i++) + sme_debug("Blacklist bssid[%d]:" QDF_MAC_ADDR_STR, i, + QDF_MAC_ADDR_ARRAY(params->bssid_avoid_list[i].bytes)); + qdf_mem_copy(params->bssid_favored, roam_params->bssid_favored, + MAX_BSSID_FAVORED * sizeof(struct qdf_mac_addr)); + qdf_mem_copy(params->bssid_favored_factor, + roam_params->bssid_favored_factor, MAX_BSSID_FAVORED); + qdf_mem_copy(params->rssi_rejection_ap, + roam_params->rssi_reject_bssid_list, + MAX_RSSI_AVOID_BSSID_LIST * + sizeof(struct reject_ap_config_params)); + + for (i = 0; i < params->num_bssid_preferred_list; i++) + sme_debug("Preferred Bssid[%d]:"QDF_MAC_ADDR_STR" score: %d", i, + QDF_MAC_ADDR_ARRAY(params->bssid_favored[i].bytes), + params->bssid_favored_factor[i]); + + if (params->lca_disallow_config_present) { + params->disallow_duration + = mac_ctx->mlme_cfg->lfr.lfr3_disallow_duration; + params->rssi_channel_penalization + = mac_ctx->mlme_cfg->lfr.lfr3_rssi_channel_penalization; + params->num_disallowed_aps + = mac_ctx->mlme_cfg->lfr.lfr3_num_disallowed_aps; + sme_debug("disallow_dur %d rssi_chan_pen %d num_disallowed_aps %d", + params->disallow_duration, + params->rssi_channel_penalization, + params->num_disallowed_aps); + } +} + QDF_STATUS wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, @@ -19516,20 +19727,23 @@ wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_E_FAILURE; } - wlan_cm_roam_scan_offload_rssi_thresh(mac_ctx, - session, + wlan_cm_roam_scan_offload_rssi_thresh(mac_ctx, session, &req->rssi_params); - wlan_cm_roam_scan_offload_scan_period(mac_ctx, - session, + wlan_cm_roam_scan_offload_scan_period(mac_ctx, session->vdev_id, &req->scan_period_params); + wlan_cm_roam_scan_offload_ap_profile(mac_ctx, session, + &req->profile_params); + + wlan_cm_roam_scan_filter(mac_ctx, vdev_id, ROAM_SCAN_OFFLOAD_START, + reason, &req->scan_filter_params); + /* fill other struct similar to wlan_roam_offload_scan_rssi_params */ return status; } #endif -#endif QDF_STATUS csr_roam_offload_scan_rsp_hdlr(struct mac_context *mac,