From 2b8ea35e7196fce1ba0da2c35428c9e8a23cf9c0 Mon Sep 17 00:00:00 2001 From: Pragaspathi Thilagaraj Date: Fri, 12 Apr 2019 02:23:50 +0530 Subject: [PATCH] qcacld-3.0: Introduce new INI to configure roam trigger parameters Add new ini to configure various roam trigger parameters: 1. "minimum_btm_candidate_score" Consider the AP as roam candidate only if its score is greater than minimum_btm_candidate_score. This value will be sent over the WMI_BTM_OFFLOAD_CONFIG command. 2. "roam_scan_inactivity_time" Device inactivity monitoring time in milliseconds for which the device is considered to be inactive with data packets count is less than configured roam_inactive_count. 3. "roam_inactive_data_packet_count" Maximum allowed data packets count during roam_scan_inactivity_time. 4. "roam_scan_period_after_inactivity" Roam scan period in ms after device was in inactive state. 5. "btm_roam_score_delta" Roam scan delta value for btm triggered roam scan. This value will be sent to firmware over the WMI_ROAM_AP_PROFILE wmi command. 6. "idle_roam_score_delta" Roam scan delta value for Idle roam scan trigger reason. This value will be sent to firmware over the WMI_ROAM_AP_PROFILE wmi commnd in the roam_score_delta_param_list tlv. 7. "disconnect_roam_trigger_min_rssi" Candidate minimum rssi value for disconnect roam trigger. This value will be sent to firmware over the WMI_ROAM_AP_PROFILE wmi commnd in the roam_score_min_rssi_param_list tlv. 8. "beacon_miss_roam_min_rssi" Candidate minimum rssi value for BTM triggered roam. This value will be sent to firmware over the WMI_ROAM_AP_PROFILE wmi commnd in the roam_score_min_rssi_param_list tlv. 9. "bss_load_trigger_5g_rssi_threshold" If connected AP is in 5GHz band, then consider bss load roam triggered only if load % > bss_load_threshold && connected AP rssi is worse than bss_load_trigger_5g_rssi_threshold. 10. "bss_load_trigger_2g_rssi_threshold" If connected AP is in 2GHz band, then consider bss load roam triggered only if load % > bss_load_threshold && connected AP rssi is worse than bss_load_trigger_2g_rssi_threshold. Change-Id: Ib026251a8ec403f4376a16a91ff1b5d969336816 CRs-Fixed: 2434922 --- components/mlme/core/src/wlan_mlme_main.c | 41 +++++ components/mlme/dispatcher/inc/cfg_mlme_btm.h | 30 +++- components/mlme/dispatcher/inc/cfg_mlme_lfr.h | 158 ++++++++++++++++++ .../mlme/dispatcher/inc/cfg_mlme_scoring.h | 128 +++++++++++++- .../dispatcher/inc/wlan_mlme_public_struct.h | 25 +++ core/mac/inc/sir_api.h | 6 + core/sme/src/csr/csr_api_roam.c | 23 +++ core/wma/inc/wma_internal.h | 7 +- core/wma/src/wma_scan_roam.c | 54 +++--- 9 files changed, 447 insertions(+), 25 deletions(-) diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index 99887aaa8a..fe078ffbf2 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -1516,6 +1516,10 @@ mlme_init_bss_load_trigger_params(struct wlan_objmgr_psoc *psoc, cfg_get(psoc, CFG_ENABLE_BSS_LOAD_TRIGGERED_ROAM); bss_load_trig->threshold = cfg_get(psoc, CFG_BSS_LOAD_THRESHOLD); bss_load_trig->sample_time = cfg_get(psoc, CFG_BSS_LOAD_SAMPLE_TIME); + bss_load_trig->rssi_threshold_5ghz = + cfg_get(psoc, CFG_BSS_LOAD_TRIG_5G_RSSI_THRES); + bss_load_trig->rssi_threshold_24ghz = + cfg_get(psoc, CFG_BSS_LOAD_TRIG_2G_RSSI_THRES); } static void mlme_init_lfr_cfg(struct wlan_objmgr_psoc *psoc, @@ -1676,6 +1680,13 @@ static void mlme_init_lfr_cfg(struct wlan_objmgr_psoc *psoc, lfr->roaming_scan_policy = cfg_get(psoc, CFG_ROAM_SCAN_SCAN_POLICY); + lfr->roam_scan_inactivity_time = + cfg_get(psoc, CFG_ROAM_SCAN_INACTIVITY_TIME); + lfr->roam_inactive_data_packet_count = + cfg_get(psoc, CFG_ROAM_INACTIVE_COUNT); + lfr->roam_scan_period_after_inactivity = + cfg_get(psoc, CFG_POST_INACTIVITY_ROAM_SCAN_PERIOD); + mlme_init_roam_offload_cfg(psoc, lfr); mlme_init_ese_cfg(psoc, lfr); mlme_init_bss_load_trigger_params(psoc, &lfr->bss_load_trig); @@ -2129,7 +2140,36 @@ static void mlme_init_btm_cfg(struct wlan_objmgr_psoc *psoc, btm->disassoc_timer_threshold = cfg_get(psoc, CFG_BTM_DISASSOC_TIMER_THRESHOLD); btm->btm_query_bitmask = cfg_get(psoc, CFG_BTM_QUERY_BITMASK); + btm->btm_trig_min_candidate_score = + cfg_get(psoc, CFG_MIN_BTM_CANDIDATE_SCORE); +} +static void +mlme_init_roam_score_config(struct wlan_objmgr_psoc *psoc, + struct wlan_mlme_cfg *mlme_cfg) +{ + struct roam_trigger_score_delta *score_delta_param; + struct roam_trigger_min_rssi *min_rssi_param; + + score_delta_param = &mlme_cfg->trig_score_delta[IDLE_ROAM_TRIGGER]; + score_delta_param->roam_score_delta = + cfg_get(psoc, CFG_IDLE_ROAM_SCORE_DELTA); + score_delta_param->trigger_reason = ROAM_TRIGGER_REASON_IDLE; + + score_delta_param = &mlme_cfg->trig_score_delta[BTM_ROAM_TRIGGER]; + score_delta_param->roam_score_delta = + cfg_get(psoc, CFG_BTM_ROAM_SCORE_DELTA); + score_delta_param->trigger_reason = ROAM_TRIGGER_REASON_BTM; + + min_rssi_param = &mlme_cfg->trig_min_rssi[DEAUTH_MIN_RSSI]; + min_rssi_param->min_rssi = + cfg_get(psoc, CFG_DISCONNECT_ROAM_TRIGGER_MIN_RSSI); + min_rssi_param->trigger_reason = ROAM_TRIGGER_REASON_DEAUTH; + + min_rssi_param = &mlme_cfg->trig_min_rssi[BMISS_MIN_RSSI]; + min_rssi_param->min_rssi = + cfg_get(psoc, CFG_BMISS_ROAM_MIN_RSSI); + min_rssi_param->trigger_reason = ROAM_TRIGGER_REASON_BMISS; } /** @@ -2286,6 +2326,7 @@ QDF_STATUS mlme_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc) mlme_init_mwc_cfg(psoc, &mlme_cfg->mwc); mlme_init_reg_cfg(psoc, &mlme_cfg->reg); mlme_init_btm_cfg(psoc, &mlme_cfg->btm); + mlme_init_roam_score_config(psoc, mlme_cfg); return status; } diff --git a/components/mlme/dispatcher/inc/cfg_mlme_btm.h b/components/mlme/dispatcher/inc/cfg_mlme_btm.h index 1da6604ef7..8e3446bd07 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_btm.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_btm.h @@ -269,6 +269,33 @@ CFG_VALUE_OR_DEFAULT, \ "btm query with candidate list bitmask") +/* + * + * minimum_btm_candidate_score - Consider the AP as roam candidate only if + * its score is greater than minimum_btm_candidate_score. + * @Min: 0 + * @Max: 10000 + * @Default: 1800 + * + * This ini is applicable only for candidate selection during BTM roam trigger. + * For this roam_score_delta_bitmap bit 10 should be set to 1. + * + * Related: None + * + * Supported Feature: Roaming + * + * Usage: External + * + * + */ +#define CFG_MIN_BTM_CANDIDATE_SCORE CFG_INI_UINT( \ + "minimum_btm_candidate_score", \ + 0, \ + 10000, \ + 1800, \ + CFG_VALUE_OR_DEFAULT, \ + "Minimum BTM candidate score") + #define CFG_BTM_ALL \ CFG(CFG_PREFER_BTM_QUERY) \ CFG(CFG_ENABLE_BTM_ABRIDGE) \ @@ -278,6 +305,7 @@ CFG(CFG_BTM_STICKY_TIME) \ CFG(CFG_BTM_VALIDITY_TIMER) \ CFG(CFG_BTM_DISASSOC_TIMER_THRESHOLD) \ - CFG(CFG_BTM_QUERY_BITMASK) + CFG(CFG_BTM_QUERY_BITMASK) \ + CFG(CFG_MIN_BTM_CANDIDATE_SCORE) #endif /* CFG_MLME_BTM_H_ */ diff --git a/components/mlme/dispatcher/inc/cfg_mlme_lfr.h b/components/mlme/dispatcher/inc/cfg_mlme_lfr.h index 0273168c1a..d18a42c956 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_lfr.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_lfr.h @@ -1893,6 +1893,62 @@ CFG_VALUE_OR_DEFAULT, \ "bss load sampling time") +/* + * + * bss_load_trigger_5g_rssi_threshold - Current AP minimum RSSI in dBm below + * which roaming can be triggered if BSS load exceeds bss_load_threshold. + * @Min: -120 + * @Max: 0 + * @Default: -70 + * + * If connected AP is in 5Ghz, then consider bss load roam triggered only if + * load % > bss_load_threshold && connected AP rssi is worse than + * bss_load_trigger_5g_rssi_threshold + * + * Related: "bss_load_threshold" + * + * Supported Feature: Roaming + * + * Usage: Internal/External + * + * + */ +#define CFG_BSS_LOAD_TRIG_5G_RSSI_THRES CFG_INI_INT( \ + "bss_load_trigger_5g_rssi_threshold", \ + -120, \ + 0, \ + -70, \ + CFG_VALUE_OR_DEFAULT, \ + "Minimum RSSI of current AP in 5GHz band for BSS load roam trigger") + +/* + * + * bss_load_trigger_2g_rssi_threshold - Current AP minimum RSSI in dBm below + * which roaming can be triggered if BSS load exceeds bss_load_threshold. + * @Min: -120 + * @Max: 0 + * @Default: -60 + * + * If connected AP is in 2Ghz, then consider bss load roam triggered only if + * load % > bss_load_threshold && connected AP rssi is worse than + * bss_load_trigger_2g_rssi_threshold. + * + * Related: "bss_load_threshold" + * + * Supported Feature: Roaming + * + * Usage: Internal/External + * + * + */ +#define CFG_BSS_LOAD_TRIG_2G_RSSI_THRES CFG_INI_INT( \ + "bss_load_trigger_2g_rssi_threshold", \ + -120, \ + 0, \ + -60, \ + CFG_VALUE_OR_DEFAULT, \ + "Minimum RSSI of current AP in 2.4GHz band for BSS load roam trigger") + /* * * ho_delay_for_rx - Delay hand-off (in msec) by this duration to receive @@ -2353,6 +2409,103 @@ 0, \ "Config roam scan policy") +/* + * + * roam_scan_inactivity_time - Device inactivity monitoring time in + * milliseconds for which the device is considered to be inactive with data + * packets count is less than configured roam_inactive_data_count. + * + * @Min: 0 + * @Max: 0xFFFFFFFF + * @Default: 0 + * + * The below three ini values are used to control the roam scan after the + * firmware gets empty roam scan results during periodic roam scans. + * 1. roam_scan_inactivity_time + * 2. roam_inactive_data_count + * 3. roam_scan_period_after_inactivity + * The first two ini "roam_scan_inactivity_time" and "roam_inactive_data_count" + * is frames the criteria to detect if the DUT is inactive. If the device is + * identified to be inactive based on the above two ini, then the value, + * "roam_scan_period_after_inactivity" will be used as periodic roam scan + * duration. + * + * Related: roam_inactive_data_count + * + * Supported Feature: Roaming + * + * Usage: External + * + * + */ +#define CFG_ROAM_SCAN_INACTIVITY_TIME CFG_INI_UINT( \ + "roam_scan_inactivity_time", \ + 0, \ + 0xFFFFFFFF, \ + 0, \ + CFG_VALUE_OR_DEFAULT, \ + "Device inactivity monitoring time") + +/* + * + * roam_inactive_data_count - Maximum allowed data packets count during + * roam_scan_inactivity_time. + * + * @Min: 0 + * @Max: 0xFFFFFFFF + * @Default: 10 + * + * The DUT is said to be inactive only if the data packets count + * during this roam_scan_inactivity_time is less than the configured + * roam_inactive_data_count. + * + * Related: roam_scan_inactivity_time + * + * Supported Feature: Roaming + * + * Usage: External + * + * + */ +#define CFG_ROAM_INACTIVE_COUNT CFG_INI_UINT( \ + "roam_inactive_data_count", \ + 0, \ + 0xFFFFFFFF, \ + 10, \ + CFG_VALUE_OR_DEFAULT, \ + "Roam scan inactivity period data pkt count") + +/* + * + * roam_scan_period_after_inactivity - Roam scan duration in ms after device is + * out of inactivity state. + * + * @Min: 0 + * @Max: 0xFFFFFFFF + * @Default: 120000 + * + * If there is empty scan results during roam scan, firmware will move to + * roam scan inactive state if roam_scan_inactivity and + * roam_inactive_data_count criteria are met. + * This ini is used to configure the roam scan duration in ms once the + * inactivity is finished and roam scan can be started. + * + * Related: roam_scan_inactivity_time, roam_inactive_data_count + * + * Supported Feature: Roaming + * + * Usage: External + * + * + */ +#define CFG_POST_INACTIVITY_ROAM_SCAN_PERIOD CFG_INI_UINT( \ + "roam_scan_period_after_inactivity", \ + 0, \ + 0xFFFFFFFF, \ + 120000, \ + CFG_VALUE_OR_DEFAULT, \ + "Roam scan period post inactivity") + #define CFG_LFR_ALL \ CFG(CFG_LFR_MAWC_ROAM_ENABLED) \ CFG(CFG_LFR_MAWC_ROAM_TRAFFIC_THRESHOLD) \ @@ -2431,6 +2584,11 @@ CFG(CFG_LFR_ROAM_FT_OPEN_ENABLE) \ CFG(CFG_LFR_ROAM_FORCE_RSSI_TRIGGER) \ CFG(CFG_ROAM_SCAN_SCAN_POLICY) \ + CFG(CFG_ROAM_SCAN_INACTIVITY_TIME) \ + CFG(CFG_ROAM_INACTIVE_COUNT) \ + CFG(CFG_POST_INACTIVITY_ROAM_SCAN_PERIOD) \ + CFG(CFG_BSS_LOAD_TRIG_5G_RSSI_THRES) \ + CFG(CFG_BSS_LOAD_TRIG_2G_RSSI_THRES) \ ROAM_OFFLOAD_ALL \ LFR_ESE_ALL \ LFR_SUBNET_DETECTION_ALL diff --git a/components/mlme/dispatcher/inc/cfg_mlme_scoring.h b/components/mlme/dispatcher/inc/cfg_mlme_scoring.h index bac6cba6db..65042193c2 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_scoring.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_scoring.h @@ -1065,12 +1065,134 @@ * @Min: 0 * @Max: 1 * @Default: 0 + * + * Supported Feature: Power save + * + * Usage: Internal + * + * */ #define CFG_APSD_ENABLED CFG_BOOL( \ "apsd_enabled", \ 0, \ "Enable APSD") +/* + * + * candidate_min_rssi_for_disconnect - Candidate AP minimum RSSI in + * idle roam trigger(in dBm). + * @Min: -120 + * @Max: 0 + * @Default: -70 + * + * Minimum RSSI value of the candidate AP to consider it as candidate for + * roaming when roam trigger is Deauthentication/Disconnection from current + * AP. This value will be sent to firmware over the WMI_ROAM_AP_PROFILE + * wmi command in the roam_min_rssi_param_list tlv. + * + * Related: enable_idle_roam. + * + * Supported Feature: Roaming + * + * Usage: Internal/External + * + * + */ +#define CFG_DISCONNECT_ROAM_TRIGGER_MIN_RSSI CFG_INI_INT( \ + "candidate_min_rssi_for_disconnect", \ + -120, \ + 0, \ + -70, \ + CFG_VALUE_OR_DEFAULT, \ + "Minimum RSSI of candidate AP for Disconnect roam trigger") + +/* + * + * candidate_min_rssi_for_beacon_miss - Candidate AP minimum RSSI for beacon + * miss roam trigger (in dBm) + * @Min: -120 + * @Max: 0 + * @Default: -70 + * + * Minimum RSSI value of the candidate AP to consider it as candidate for + * roaming when roam trigger is disconnection from current AP due to beacon + * miss. This value will be sent to firmware over the WMI_ROAM_AP_PROFILE + * wmi command in the roam_min_rssi_param_list tlv. + * + * Related: None + * + * Supported Feature: Roaming + * + * Usage: Internal/External + * + * + */ +#define CFG_BMISS_ROAM_MIN_RSSI CFG_INI_INT( \ + "candidate_min_rssi_for_beacon_miss", \ + -120, \ + 0, \ + -70, \ + CFG_VALUE_OR_DEFAULT, \ + "Minimum RSSI of candidate AP for Bmiss roam trigger") + +/* + * + * idle_roam_score_delta - Roam score delta value in percentage for idle roam. + * @Min: 0 + * @Max: 100 + * @Default: 10 + * + * This ini is used to configure the minimum change in roam score + * value of the AP to consider it as candidate for + * roaming when roam trigger is due to idle state of sta. + * This value will be sent to firmware over the WMI_ROAM_AP_PROFILE wmi + * command in the roam_score_delta_param_list tlv. + * Related: None + * + * Supported Feature: Roaming + * + * Usage: External + * + * + */ +#define CFG_IDLE_ROAM_SCORE_DELTA CFG_INI_UINT( \ + "idle_roam_score_delta", \ + 0, \ + 100, \ + 10, \ + CFG_VALUE_OR_DEFAULT, \ + "Roam score delta for Idle roam trigger") + +/* + * + * btm_roam_score_delta - Roam score delta value in percentage for BTM triggered + * roaming. + * @Min: 0 + * @Max: 100 + * @Default: 10 + * + * This ini is used to configure the minimum change in roam score + * value of the AP to consider it as candidate when the sta is disconnected + * from the current AP due to BTM kickout. + * This value will be sent to firmware over the WMI_ROAM_AP_PROFILE wmi + * command in the roam_score_delta_param_list tlv. + * + * Related: None + * + * Supported Feature: Roaming + * + * Usage: External + * + * + */ +#define CFG_BTM_ROAM_SCORE_DELTA CFG_INI_UINT( \ + "btm_roam_score_delta", \ + 0, \ + 100, \ + 10, \ + CFG_VALUE_OR_DEFAULT, \ + "Roam score delta for BTM roam trigger") + #define CFG_SCORING_ALL \ CFG(CFG_SCORING_RSSI_WEIGHTAGE) \ CFG(CFG_SCORING_HT_CAPS_WEIGHTAGE) \ @@ -1107,6 +1229,10 @@ CFG(CFG_ROAM_TRIGGER_BITMAP) \ CFG(CFG_ROAM_SCORE_DELTA) \ CFG(CFG_ENABLE_SCORING_FOR_ROAM) \ - CFG(CFG_APSD_ENABLED) + CFG(CFG_APSD_ENABLED) \ + CFG(CFG_DISCONNECT_ROAM_TRIGGER_MIN_RSSI) \ + CFG(CFG_BMISS_ROAM_MIN_RSSI) \ + CFG(CFG_IDLE_ROAM_SCORE_DELTA) \ + CFG(CFG_BTM_ROAM_SCORE_DELTA) \ #endif /* __CFG_MLME_SCORING_H */ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index 3f45089907..c4961e7991 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -1248,11 +1248,19 @@ enum roaming_dfs_channel_type { * @threshold: Bss load threshold value above which roaming should start * @sample_time: Time duration in milliseconds for which the bss load value * should be monitored + * @rssi_threshold_5ghz: RSSI threshold of the current connected AP below which + * roam should be triggered if bss load threshold exceeds the configured value. + * This value is applicable only when we are connected in 5GHz band. + * @rssi_threshold_24ghz: RSSI threshold of the current connected AP below which + * roam should be triggered if bss load threshold exceeds the configured value. + * This value is applicable only when we are connected in 2.4 GHz band. */ struct bss_load_trigger { bool enabled; uint32_t threshold; uint32_t sample_time; + int32_t rssi_threshold_5ghz; + int32_t rssi_threshold_24ghz; }; /* @@ -1344,6 +1352,12 @@ struct bss_load_trigger { * @enable_ftopen: Enable/disable FT open feature * @roam_force_rssi_trigger: Force RSSI trigger or not * @roaming_scan_policy: Config roaming scan policy in fw + * @roam_scan_inactivity_time: Device inactivity monitoring time in + * milliseconds for which the device is considered to be inactive. + * @roam_inactive_data_packet_count: Maximum allowed data packets count + * during roam_scan_inactivity_time. + * @roam_scan_period_after_inactivity: Roam scan period after device was in + * inactive state */ struct wlan_mlme_lfr_cfg { bool mawc_roam_enabled; @@ -1438,6 +1452,9 @@ struct wlan_mlme_lfr_cfg { bool roam_force_rssi_trigger; struct bss_load_trigger bss_load_trig; bool roaming_scan_policy; + uint32_t roam_scan_inactivity_time; + uint32_t roam_inactive_data_packet_count; + uint32_t roam_scan_period_after_inactivity; }; /** @@ -1883,6 +1900,8 @@ struct wlan_mlme_wifi_pos_cfg { * not be triggered * @btm_query_bitmask: Bitmask to send BTM query with candidate list on * various roam + * @btm_trig_min_candidate_score: Minimum score to consider the AP as candidate + * when the roam trigger is BTM. */ struct wlan_mlme_btm { bool prefer_btm_query; @@ -1894,6 +1913,7 @@ struct wlan_mlme_btm { uint32_t rct_validity_timer; uint32_t disassoc_timer_threshold; uint32_t btm_query_bitmask; + uint32_t btm_trig_min_candidate_score; }; /** @@ -2035,6 +2055,9 @@ struct wlan_mlme_ibss_cfg { * @mwc: MWC related CFG items * @dot11_mode: dot11 mode supported * @reg: REG related CFG itmes + * @trig_score_delta: Roam score delta value for various roam triggers + * @trig_min_rssi: Expected minimum RSSI value of candidate AP for + * various roam triggers */ struct wlan_mlme_cfg { struct wlan_mlme_chainmask chainmask_cfg; @@ -2077,6 +2100,8 @@ struct wlan_mlme_cfg { struct wlan_mlme_mwc mwc; struct wlan_mlme_dot11_mode dot11_mode; struct wlan_mlme_reg reg; + struct roam_trigger_score_delta trig_score_delta[NUM_OF_ROAM_TRIGGERS]; + struct roam_trigger_min_rssi trig_min_rssi[NUM_OF_ROAM_TRIGGERS]; }; #endif diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 2aa599b9a8..7ddd9a0f0f 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -2269,6 +2269,7 @@ struct roam_offload_scan_req { uint32_t btm_sticky_time; uint32_t rct_validity_timer; uint32_t disassoc_timer_threshold; + uint32_t btm_trig_min_candidate_score; struct wmi_11k_offload_params offload_11k_params; uint32_t ho_delay_for_rx; uint32_t roam_preauth_retry_count; @@ -2280,7 +2281,12 @@ struct roam_offload_scan_req { bool bss_load_trig_enabled; struct wmi_bss_load_config bss_load_config; bool roaming_scan_policy; + uint32_t roam_scan_inactivity_time; + uint32_t roam_inactive_data_packet_count; + uint32_t roam_scan_period_after_inactivity; uint32_t btm_query_bitmask; + 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 roam_offload_scan_rsp { diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index a527b2f88a..8a5920ca40 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -17732,6 +17732,10 @@ csr_update_roam_scan_offload_request(struct mac_context *mac_ctx, mac_ctx->mlme_cfg->lfr.bss_load_trig.threshold; req_buf->bss_load_config.bss_load_sample_time = mac_ctx->mlme_cfg->lfr.bss_load_trig.sample_time; + req_buf->bss_load_config.rssi_threshold_5ghz = + mac_ctx->mlme_cfg->lfr.bss_load_trig.rssi_threshold_5ghz; + req_buf->bss_load_config.rssi_threshold_24ghz = + mac_ctx->mlme_cfg->lfr.bss_load_trig.rssi_threshold_24ghz; req_buf->bss_load_config.vdev_id = session->sessionId; /* @@ -18191,6 +18195,13 @@ csr_create_roam_scan_offload_request(struct mac_context *mac_ctx, roam_info->cfgParams.maxChannelScanTime; req_buf->EmptyRefreshScanPeriod = roam_info->cfgParams.emptyScanRefreshPeriod; + req_buf->roam_scan_inactivity_time = + mac_ctx->mlme_cfg->lfr.roam_scan_inactivity_time; + req_buf->roam_inactive_data_packet_count = + mac_ctx->mlme_cfg->lfr.roam_inactive_data_packet_count; + req_buf->roam_scan_period_after_inactivity = + mac_ctx->mlme_cfg->lfr.roam_scan_period_after_inactivity; + req_buf->RoamBmissFirstBcnt = roam_info->cfgParams.nRoamBmissFirstBcnt; req_buf->RoamBmissFinalBcnt = @@ -18205,6 +18216,16 @@ csr_create_roam_scan_offload_request(struct mac_context *mac_ctx, req_buf->mawc_roam_params.mawc_roam_ap_rssi_threshold, req_buf->mawc_roam_params.mawc_roam_rssi_high_adjust, req_buf->mawc_roam_params.mawc_roam_rssi_low_adjust); + + req_buf->min_rssi_params[DEAUTH_MIN_RSSI] = + mac_ctx->mlme_cfg->trig_min_rssi[DEAUTH_MIN_RSSI]; + req_buf->min_rssi_params[BMISS_MIN_RSSI] = + mac_ctx->mlme_cfg->trig_min_rssi[BMISS_MIN_RSSI]; + req_buf->score_delta_param[IDLE_ROAM_TRIGGER] = + mac_ctx->mlme_cfg->trig_score_delta[IDLE_ROAM_TRIGGER]; + req_buf->score_delta_param[BTM_ROAM_TRIGGER] = + mac_ctx->mlme_cfg->trig_score_delta[BTM_ROAM_TRIGGER]; + #ifdef FEATURE_WLAN_ESE req_buf->IsESEAssoc = csr_roam_is_ese_assoc(mac_ctx, session_id) && @@ -18355,6 +18376,8 @@ csr_create_roam_scan_offload_request(struct mac_context *mac_ctx, mac_ctx->mlme_cfg->btm.disassoc_timer_threshold; req_buf->btm_query_bitmask = mac_ctx->mlme_cfg->btm.btm_query_bitmask; + req_buf->btm_trig_min_candidate_score = + mac_ctx->mlme_cfg->btm.btm_trig_min_candidate_score; csr_update_roam_scan_offload_request(mac_ctx, req_buf, session); diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h index 115b160048..5196055855 100644 --- a/core/wma/inc/wma_internal.h +++ b/core/wma/inc/wma_internal.h @@ -252,10 +252,9 @@ QDF_STATUS wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle, struct roam_offload_scan_req *roam_req); -QDF_STATUS wma_roam_scan_offload_scan_period(tp_wma_handle wma_handle, - uint32_t scan_period, - uint32_t scan_age, - uint32_t vdev_id); +QDF_STATUS +wma_roam_scan_offload_scan_period(tp_wma_handle wma_handle, + struct roam_offload_scan_req *roam_req); QDF_STATUS wma_roam_scan_offload_rssi_change(tp_wma_handle wma_handle, uint32_t vdev_id, diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 9bb5ce2611..695ffa068f 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -587,27 +587,37 @@ wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle, /** * wma_roam_scan_offload_scan_period() - set roam offload scan period * @wma_handle: wma handle - * @scan_period: scan period - * @scan_age: scan age - * @vdev_id: vdev id + * @roam_req: Pointer to roam_offload_scan_req * * Send WMI_ROAM_SCAN_PERIOD parameters to fw. * * Return: QDF status */ -QDF_STATUS wma_roam_scan_offload_scan_period(tp_wma_handle wma_handle, - uint32_t scan_period, - uint32_t scan_age, - uint32_t vdev_id) +QDF_STATUS +wma_roam_scan_offload_scan_period(tp_wma_handle wma_handle, + struct roam_offload_scan_req *roam_req) { + uint8_t vdev_id; + struct roam_scan_period_params scan_period_params; + + vdev_id = roam_req->sessionId; if (!wma_is_vdev_valid(vdev_id)) { WMA_LOGE("%s: Invalid vdev id:%d", __func__, vdev_id); return QDF_STATUS_E_FAILURE; } + scan_period_params.vdev_id = vdev_id; + scan_period_params.scan_period = roam_req->EmptyRefreshScanPeriod; + scan_period_params.scan_age = (3 * roam_req->EmptyRefreshScanPeriod); + scan_period_params.roam_scan_inactivity_time = + roam_req->roam_scan_inactivity_time; + scan_period_params.roam_inactive_data_packet_count = + roam_req->roam_inactive_data_packet_count; + scan_period_params.roam_scan_period_after_inactivity = + roam_req->roam_scan_period_after_inactivity; + return wmi_unified_roam_scan_offload_scan_period(wma_handle->wmi_handle, - scan_period, scan_age, - vdev_id); + &scan_period_params); } /** @@ -1206,6 +1216,16 @@ static QDF_STATUS wma_roam_scan_offload_ap_profile(tp_wma_handle wma_handle, WMA_NOISE_FLOOR_DBM_DEFAULT; } ap_profile.param = roam_req->score_params; + ap_profile.min_rssi_params[DEAUTH_MIN_RSSI] = + roam_req->min_rssi_params[DEAUTH_MIN_RSSI]; + ap_profile.min_rssi_params[BMISS_MIN_RSSI] = + roam_req->min_rssi_params[BMISS_MIN_RSSI]; + + ap_profile.score_delta_param[IDLE_ROAM_TRIGGER] = + roam_req->score_delta_param[IDLE_ROAM_TRIGGER]; + ap_profile.score_delta_param[BTM_ROAM_TRIGGER] = + roam_req->score_delta_param[BTM_ROAM_TRIGGER]; + return wmi_unified_send_roam_scan_offload_ap_cmd(wma_handle->wmi_handle, &ap_profile); } @@ -1428,15 +1448,16 @@ wma_roam_scan_btm_offload(tp_wma_handle wma_handle, params->btm_sticky_time = roam_req->btm_sticky_time; params->disassoc_timer_threshold = roam_req->disassoc_timer_threshold; params->btm_query_bitmask = roam_req->btm_query_bitmask; + params->btm_candidate_min_score = + roam_req->btm_trig_min_candidate_score; - WMA_LOGD("%s: Sending BTM offload to FW for vdev %u btm_offload_config %u btm_query_bitmask %u", + WMA_LOGD("%s: vdev %u btm_offload:%u btm_query_bitmask:%u btm_candidate_min_score:%d", __func__, params->vdev_id, params->btm_offload_config, - params->btm_query_bitmask); + params->btm_query_bitmask, params->btm_candidate_min_score); status = wmi_unified_send_btm_config(wma_handle->wmi_handle, params); qdf_mem_free(params); - return status; } @@ -1673,9 +1694,7 @@ QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle, if (roam_req->EmptyRefreshScanPeriod > 0) { qdf_status = wma_roam_scan_offload_scan_period(wma_handle, - roam_req->EmptyRefreshScanPeriod, - roam_req->EmptyRefreshScanPeriod * 3, - roam_req->sessionId); + roam_req); if (qdf_status != QDF_STATUS_SUCCESS) break; @@ -1977,10 +1996,7 @@ QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle, if (roam_req->EmptyRefreshScanPeriod > 0) { qdf_status = wma_roam_scan_offload_scan_period( - wma_handle, - roam_req->EmptyRefreshScanPeriod, - roam_req->EmptyRefreshScanPeriod * 3, - roam_req->sessionId); + wma_handle, roam_req); if (qdf_status != QDF_STATUS_SUCCESS) break;