diff --git a/Kbuild b/Kbuild index 88b25caba8c3..25a11c8b7074 100644 --- a/Kbuild +++ b/Kbuild @@ -878,7 +878,6 @@ UMAC_TARGET_SCAN_INC := -I$(WLAN_COMMON_INC)/target_if/scan/inc UMAC_SCAN_INC := -I$(WLAN_COMMON_INC)/$(UMAC_SCAN_DISP_INC_DIR) UMAC_SCAN_OBJS := $(UMAC_SCAN_CORE_DIR)/wlan_scan_cache_db.o \ $(UMAC_SCAN_CORE_DIR)/wlan_scan_11d.o \ - $(UMAC_SCAN_CORE_DIR)/wlan_scan_bss_score.o \ $(UMAC_SCAN_CORE_DIR)/wlan_scan_filter.o \ $(UMAC_SCAN_CORE_DIR)/wlan_scan_main.o \ $(UMAC_SCAN_CORE_DIR)/wlan_scan_manager.o \ @@ -1165,7 +1164,8 @@ UMAC_MLME_INC := -I$(WLAN_COMMON_INC)/umac/mlme \ -I$(WLAN_COMMON_INC)/umac/mlme/mlme_objmgr/dispatcher/inc \ -I$(WLAN_COMMON_INC)/umac/mlme/vdev_mgr/dispatcher/inc \ -I$(WLAN_COMMON_INC)/umac/mlme/pdev_mgr/dispatcher/inc \ - -I$(WLAN_COMMON_INC)/umac/mlme/psoc_mgr/dispatcher/inc + -I$(WLAN_COMMON_INC)/umac/mlme/psoc_mgr/dispatcher/inc \ + -I$(WLAN_COMMON_INC)/umac/mlme/connection_mgr/dispatcher/inc UMAC_MLME_OBJS := $(WLAN_COMMON_ROOT)/umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.o \ $(WLAN_COMMON_ROOT)/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.o \ @@ -1179,7 +1179,8 @@ UMAC_MLME_OBJS := $(WLAN_COMMON_ROOT)/umac/mlme/mlme_objmgr/dispatcher/src/wlan_ $(WLAN_COMMON_ROOT)/umac/mlme/mlme_objmgr/dispatcher/src/wlan_pdev_mlme_main.o \ $(WLAN_COMMON_ROOT)/umac/mlme/pdev_mgr/dispatcher/src/wlan_pdev_mlme_api.o \ $(WLAN_COMMON_ROOT)/umac/mlme/mlme_objmgr/dispatcher/src/wlan_psoc_mlme_main.o \ - $(WLAN_COMMON_ROOT)/umac/mlme/psoc_mgr/dispatcher/src/wlan_psoc_mlme_api.o + $(WLAN_COMMON_ROOT)/umac/mlme/psoc_mgr/dispatcher/src/wlan_psoc_mlme_api.o \ + $(WLAN_COMMON_ROOT)/umac/mlme/connection_mgr/core/src/wlan_cm_bss_scoring.o ######## MLME ############## MLME_DIR := components/mlme diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index b787c67620fa..baee6f56bbaa 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -1696,21 +1696,6 @@ static void mlme_init_lfr_cfg(struct wlan_objmgr_psoc *psoc, mlme_init_subnet_detection(psoc, lfr); } -static uint32_t -mlme_limit_max_per_index_score(uint32_t per_index_score) -{ - uint8_t i, score; - - for (i = 0; i < MAX_INDEX_PER_INI; i++) { - score = WLAN_GET_SCORE_PERCENTAGE(per_index_score, i); - if (score > MAX_PCT_SCORE) - WLAN_SET_SCORE_PERCENTAGE(per_index_score, - MAX_PCT_SCORE, i); - } - - return per_index_score; -} - static void mlme_init_power_cfg(struct wlan_objmgr_psoc *psoc, struct wlan_mlme_power *power) { @@ -1739,145 +1724,13 @@ static void mlme_init_power_cfg(struct wlan_objmgr_psoc *psoc, (uint8_t)cfg_default(CFG_LOCAL_POWER_CONSTRAINT); } -static void mlme_init_scoring_cfg(struct wlan_objmgr_psoc *psoc, - struct wlan_mlme_scoring_cfg *scoring_cfg) +static void mlme_init_roam_scoring_cfg(struct wlan_objmgr_psoc *psoc, + struct wlan_mlme_roam_scoring_cfg *scoring_cfg) { - uint32_t total_weight; - scoring_cfg->vendor_roam_score_algorithm = cfg_get(psoc, CFG_VENDOR_ROAM_SCORE_ALGORITHM); scoring_cfg->enable_scoring_for_roam = cfg_get(psoc, CFG_ENABLE_SCORING_FOR_ROAM); - scoring_cfg->weight_cfg.rssi_weightage = - cfg_get(psoc, CFG_SCORING_RSSI_WEIGHTAGE); - scoring_cfg->weight_cfg.ht_caps_weightage = - cfg_get(psoc, CFG_SCORING_HT_CAPS_WEIGHTAGE); - scoring_cfg->weight_cfg.vht_caps_weightage = - cfg_get(psoc, CFG_SCORING_VHT_CAPS_WEIGHTAGE); - scoring_cfg->weight_cfg.he_caps_weightage = - cfg_get(psoc, CFG_SCORING_HE_CAPS_WEIGHTAGE); - scoring_cfg->weight_cfg.chan_width_weightage = - cfg_get(psoc, CFG_SCORING_CHAN_WIDTH_WEIGHTAGE); - scoring_cfg->weight_cfg.chan_band_weightage = - cfg_get(psoc, CFG_SCORING_CHAN_BAND_WEIGHTAGE); - scoring_cfg->weight_cfg.nss_weightage = - cfg_get(psoc, CFG_SCORING_NSS_WEIGHTAGE); - scoring_cfg->weight_cfg.beamforming_cap_weightage = - cfg_get(psoc, CFG_SCORING_BEAMFORM_CAP_WEIGHTAGE); - scoring_cfg->weight_cfg.pcl_weightage = - cfg_get(psoc, CFG_SCORING_PCL_WEIGHTAGE); - scoring_cfg->weight_cfg.channel_congestion_weightage = - cfg_get(psoc, CFG_SCORING_CHAN_CONGESTION_WEIGHTAGE); - scoring_cfg->weight_cfg.oce_wan_weightage = - cfg_get(psoc, CFG_SCORING_OCE_WAN_WEIGHTAGE); - scoring_cfg->weight_cfg.oce_ap_tx_pwr_weightage = - cfg_get(psoc, CFG_OCE_AP_TX_PWR_WEIGHTAGE); - scoring_cfg->weight_cfg.oce_subnet_id_weightage = - cfg_get(psoc, CFG_OCE_SUBNET_ID_WEIGHTAGE); - - total_weight = scoring_cfg->weight_cfg.rssi_weightage + - scoring_cfg->weight_cfg.ht_caps_weightage + - scoring_cfg->weight_cfg.vht_caps_weightage + - scoring_cfg->weight_cfg.he_caps_weightage + - scoring_cfg->weight_cfg.chan_width_weightage + - scoring_cfg->weight_cfg.chan_band_weightage + - scoring_cfg->weight_cfg.nss_weightage + - scoring_cfg->weight_cfg.beamforming_cap_weightage + - scoring_cfg->weight_cfg.pcl_weightage + - scoring_cfg->weight_cfg.channel_congestion_weightage + - scoring_cfg->weight_cfg.oce_wan_weightage + - scoring_cfg->weight_cfg.oce_ap_tx_pwr_weightage + - scoring_cfg->weight_cfg.oce_subnet_id_weightage; - - /* - * If configured weights are greater than max weight, - * fallback to default weights - */ - if (total_weight > BEST_CANDIDATE_MAX_WEIGHT) { - mlme_legacy_err("Total weight greater than %d, using default weights", - BEST_CANDIDATE_MAX_WEIGHT); - scoring_cfg->weight_cfg.rssi_weightage = RSSI_WEIGHTAGE; - scoring_cfg->weight_cfg.ht_caps_weightage = - HT_CAPABILITY_WEIGHTAGE; - scoring_cfg->weight_cfg.vht_caps_weightage = - VHT_CAP_WEIGHTAGE; - scoring_cfg->weight_cfg.he_caps_weightage = HE_CAP_WEIGHTAGE; - scoring_cfg->weight_cfg.chan_width_weightage = - CHAN_WIDTH_WEIGHTAGE; - scoring_cfg->weight_cfg.chan_band_weightage = - CHAN_BAND_WEIGHTAGE; - scoring_cfg->weight_cfg.nss_weightage = NSS_WEIGHTAGE; - scoring_cfg->weight_cfg.beamforming_cap_weightage = - BEAMFORMING_CAP_WEIGHTAGE; - scoring_cfg->weight_cfg.pcl_weightage = PCL_WEIGHT; - scoring_cfg->weight_cfg.channel_congestion_weightage = - CHANNEL_CONGESTION_WEIGHTAGE; - scoring_cfg->weight_cfg.oce_wan_weightage = OCE_WAN_WEIGHTAGE; - scoring_cfg->weight_cfg.oce_ap_tx_pwr_weightage = - OCE_AP_TX_POWER_WEIGHTAGE; - scoring_cfg->weight_cfg.oce_subnet_id_weightage = - OCE_SUBNET_ID_WEIGHTAGE; - } - - scoring_cfg->rssi_score.best_rssi_threshold = - cfg_get(psoc, CFG_SCORING_BEST_RSSI_THRESHOLD); - scoring_cfg->rssi_score.good_rssi_threshold = - cfg_get(psoc, CFG_SCORING_GOOD_RSSI_THRESHOLD); - scoring_cfg->rssi_score.bad_rssi_threshold = - cfg_get(psoc, CFG_SCORING_BAD_RSSI_THRESHOLD); - - scoring_cfg->rssi_score.good_rssi_pcnt = - cfg_get(psoc, CFG_SCORING_GOOD_RSSI_PERCENT); - scoring_cfg->rssi_score.bad_rssi_pcnt = - cfg_get(psoc, CFG_SCORING_BAD_RSSI_PERCENT); - - scoring_cfg->rssi_score.good_rssi_bucket_size = - cfg_get(psoc, CFG_SCORING_GOOD_RSSI_BUCKET_SIZE); - scoring_cfg->rssi_score.bad_rssi_bucket_size = - cfg_get(psoc, CFG_SCORING_BAD_RSSI_BUCKET_SIZE); - - scoring_cfg->rssi_score.rssi_pref_5g_rssi_thresh = - cfg_get(psoc, CFG_SCORING_RSSI_PREF_5G_THRESHOLD); - - scoring_cfg->bandwidth_weight_per_index = - mlme_limit_max_per_index_score( - cfg_get(psoc, CFG_SCORING_BW_WEIGHT_PER_IDX)); - scoring_cfg->nss_weight_per_index = - mlme_limit_max_per_index_score( - cfg_get(psoc, CFG_SCORING_NSS_WEIGHT_PER_IDX)); - scoring_cfg->band_weight_per_index = - mlme_limit_max_per_index_score( - cfg_get(psoc, CFG_SCORING_BAND_WEIGHT_PER_IDX)); - - scoring_cfg->esp_qbss_scoring.num_slot = - cfg_get(psoc, CFG_SCORING_NUM_ESP_QBSS_SLOTS); - scoring_cfg->esp_qbss_scoring.score_pcnt3_to_0 = - mlme_limit_max_per_index_score( - cfg_get(psoc, CFG_SCORING_ESP_QBSS_SCORE_IDX_3_TO_0)); - scoring_cfg->esp_qbss_scoring.score_pcnt7_to_4 = - mlme_limit_max_per_index_score( - cfg_get(psoc, CFG_SCORING_ESP_QBSS_SCORE_IDX_7_TO_4)); - scoring_cfg->esp_qbss_scoring.score_pcnt11_to_8 = - mlme_limit_max_per_index_score( - cfg_get(psoc, CFG_SCORING_ESP_QBSS_SCORE_IDX_11_TO_8)); - scoring_cfg->esp_qbss_scoring.score_pcnt15_to_12 = - mlme_limit_max_per_index_score( - cfg_get(psoc, CFG_SCORING_ESP_QBSS_SCORE_IDX_15_TO_12)); - - scoring_cfg->oce_wan_scoring.num_slot = - cfg_get(psoc, CFG_SCORING_NUM_OCE_WAN_SLOTS); - scoring_cfg->oce_wan_scoring.score_pcnt3_to_0 = - mlme_limit_max_per_index_score( - cfg_get(psoc, CFG_SCORING_OCE_WAN_SCORE_IDX_3_TO_0)); - scoring_cfg->oce_wan_scoring.score_pcnt7_to_4 = - mlme_limit_max_per_index_score( - cfg_get(psoc, CFG_SCORING_OCE_WAN_SCORE_IDX_7_TO_4)); - scoring_cfg->oce_wan_scoring.score_pcnt11_to_8 = - mlme_limit_max_per_index_score( - cfg_get(psoc, CFG_SCORING_OCE_WAN_SCORE_IDX_11_TO_8)); - scoring_cfg->oce_wan_scoring.score_pcnt15_to_12 = - mlme_limit_max_per_index_score( - cfg_get(psoc, CFG_SCORING_OCE_WAN_SCORE_IDX_15_TO_12)); scoring_cfg->roam_trigger_bitmap = cfg_get(psoc, CFG_ROAM_SCORE_DELTA_TRIGGER_BITMAP); scoring_cfg->roam_score_delta = cfg_get(psoc, CFG_ROAM_SCORE_DELTA); @@ -2379,7 +2232,7 @@ QDF_STATUS mlme_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc) mlme_init_twt_cfg(psoc, &mlme_cfg->twt_cfg); mlme_init_lfr_cfg(psoc, &mlme_cfg->lfr); mlme_init_feature_flag_in_cfg(psoc, &mlme_cfg->feature_flags); - mlme_init_scoring_cfg(psoc, &mlme_cfg->scoring); + mlme_init_roam_scoring_cfg(psoc, &mlme_cfg->roam_scoring); mlme_init_dot11_mode_cfg(&mlme_cfg->dot11_mode); mlme_init_threshold_cfg(psoc, &mlme_cfg->threshold); mlme_init_acs_cfg(psoc, &mlme_cfg->acs); diff --git a/components/mlme/dispatcher/inc/cfg_mlme.h b/components/mlme/dispatcher/inc/cfg_mlme.h index cd2af63c608d..c171228441e4 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme.h +++ b/components/mlme/dispatcher/inc/cfg_mlme.h @@ -48,7 +48,7 @@ #include "cfg_mlme_sap.h" #include "cfg_mlme_stats.h" #include "cfg_mlme_twt.h" -#include "cfg_mlme_scoring.h" +#include "cfg_mlme_roam_scoring.h" #include "cfg_mlme_oce.h" #include "cfg_mlme_threshold.h" #include "cfg_mlme_feature_flag.h" @@ -88,7 +88,7 @@ CFG_REG_ALL \ CFG_SAP_ALL \ CFG_SAP_PROTECTION_ALL \ - CFG_SCORING_ALL \ + CFG_ROAM_SCORING_ALL \ CFG_STA_ALL \ CFG_STATS_ALL \ CFG_THRESHOLD_ALL \ diff --git a/components/mlme/dispatcher/inc/cfg_mlme_roam_scoring.h b/components/mlme/dispatcher/inc/cfg_mlme_roam_scoring.h new file mode 100644 index 000000000000..1d52767f8e86 --- /dev/null +++ b/components/mlme/dispatcher/inc/cfg_mlme_roam_scoring.h @@ -0,0 +1,330 @@ +/* + * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * DOC: This file contains roam specific SCORING related CFG/INI Items. + */ + +#ifndef __CFG_MLME_ROAM_SCORING_H +#define __CFG_MLME_ROAM_SCORING_H + +/* + * + * roam_score_delta_bitmap - bitmap to enable roam triggers on + * which roam score delta is to be applied during roam candidate + * selection + * @Min: 0 + * @Max: 0xffffffff + * @Default: 0xffffffff + * + * Bitmap value of the following roam triggers: + * ROAM_TRIGGER_REASON_NONE - B0, + * ROAM_TRIGGER_REASON_PER - B1, + * ROAM_TRIGGER_REASON_BMISS - B2, + * ROAM_TRIGGER_REASON_LOW_RSSI - B3, + * ROAM_TRIGGER_REASON_HIGH_RSSI - B4, + * ROAM_TRIGGER_REASON_PERIODIC - B5, + * ROAM_TRIGGER_REASON_MAWC - B6, + * ROAM_TRIGGER_REASON_DENSE - B7, + * ROAM_TRIGGER_REASON_BACKGROUND - B8, + * ROAM_TRIGGER_REASON_FORCED - B9, + * ROAM_TRIGGER_REASON_BTM - B10, + * ROAM_TRIGGER_REASON_UNIT_TEST - B11, + * ROAM_TRIGGER_REASON_BSS_LOAD - B12 + * ROAM_TRIGGER_REASON_DISASSOC - B13 + * ROAM_TRIGGER_REASON_IDLE_ROAM - B14 + * + * When the bit corresponding to a particular roam trigger reason + * is set, the value of "roam_score_delta" is expected over the + * roam score of the current connected AP, for that triggered roam + * + * Related: None + * + * Supported Feature: Roaming + * + * Usage: External + * + * + */ +#define CFG_ROAM_SCORE_DELTA_TRIGGER_BITMAP CFG_INI_UINT( \ + "roam_score_delta_bitmap", \ + 0, \ + 0xFFFFFFFF, \ + 0xFFFFFFFF, \ + CFG_VALUE_OR_DEFAULT, \ + "Bitmap for various roam triggers") + +/* + * + * roam_score_delta - Percentage increment in roam score value + * that is expected from a roaming candidate AP. + * @Min: 0 + * @Max: 100 + * @Default: 0 + * + * This ini is used to provide the percentage increment value over roam + * score for the candidate APs so that they can be preferred over current + * AP for roaming. + * + * Related: None + * + * Supported Feature: Roaming + * + * Usage: External + * + * + */ +#define CFG_ROAM_SCORE_DELTA CFG_INI_UINT( \ + "roam_score_delta", \ + 0, \ + 100, \ + 0, \ + CFG_VALUE_OR_DEFAULT, \ + "candidate AP's percentage roam score delta") + +/* + * + * min_roam_score_delta - Difference of roam score values between connected + * AP and roam candidate AP. + * @Min: 0 + * @Max: 10000 + * @Default: 0 + * + * This ini is used during CU and low rssi based roam triggers, consider + * AP as roam candidate only if its roam score is better than connected + * AP score by at least min_roam_score_delta. + * If user configured "roam_score_delta" and "min_roam_score_delta" both, + * then firmware selects roam candidate AP by considering values of both + * INIs. + * Example: If DUT is connected with AP1 and roam candidate AP2 has roam + * score greater than roam_score_delta and min_roam_score_delta then only + * firmware will trigger roaming to AP2. + * + * Related: roam_score_delta + * + * Supported Feature: Roaming + * + * Usage: Internal + * + * + */ +#define CFG_CAND_MIN_ROAM_SCORE_DELTA CFG_INI_UINT( \ + "min_roam_score_delta", \ + 0, \ + 10000, \ + 0, \ + CFG_VALUE_OR_DEFAULT, \ + "Diff between connected AP's and candidate AP's roam score") + +/* + * + * enable_scoring_for_roam - enable/disable scoring logic in FW for candidate + * selection during roaming + * + * @Min: 0 + * @Max: 1 + * @Default: 1 + * + * This ini is used to enable/disable scoring logic in FW for candidate + * selection during roaming. + * + * Supported Feature: STA Candidate selection by FW during roaming based on + * scoring logic. + * + * Usage: External + * + * + */ +#define CFG_ENABLE_SCORING_FOR_ROAM CFG_INI_BOOL( \ + "enable_scoring_for_roam", \ + 1, \ + "Enable Scoring for Roam") + +/* + * + * apsd_enabled - Enable automatic power save delivery + * @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: 0 + * + * 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, \ + 0, \ + 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: 0 + * + * 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, \ + 0, \ + CFG_VALUE_OR_DEFAULT, \ + "Roam score delta for BTM roam trigger") + +/* + * + * vendor_roam_score_algorithm - Algorithm to calculate AP score + * @Min: 0 + * @Max: 1 + * @Default: 0 + * + * By default the value is 0 and default roam algorithm will be used. + * When the value is 1, the V2 roaming algorithm will be used: + * For this V2 algo, AP score calculation is based on below equation: + * AP Score = (RSSIfactor * rssiweight(0.65)) + (CUfactor *cuweight(0.35)) + * + * Related: None + * + * Supported Feature: roam score algorithm + * + * Usage: External + * + * + */ +#define CFG_VENDOR_ROAM_SCORE_ALGORITHM CFG_INI_UINT( \ + "vendor_roam_score_algorithm", \ + 0, \ + 1, \ + 0, \ + CFG_VALUE_OR_DEFAULT, \ + "Roam candidate selection score algorithm") + +#define CFG_ROAM_SCORING_ALL \ + CFG(CFG_ROAM_SCORE_DELTA_TRIGGER_BITMAP) \ + CFG(CFG_ROAM_SCORE_DELTA) \ + CFG(CFG_CAND_MIN_ROAM_SCORE_DELTA) \ + CFG(CFG_ENABLE_SCORING_FOR_ROAM) \ + 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) \ + CFG(CFG_VENDOR_ROAM_SCORE_ALGORITHM) + +#endif /* __CFG_MLME_ROAM_SCORING_H */ diff --git a/components/mlme/dispatcher/inc/cfg_mlme_scoring.h b/components/mlme/dispatcher/inc/cfg_mlme_scoring.h deleted file mode 100644 index e11e31341a96..000000000000 --- a/components/mlme/dispatcher/inc/cfg_mlme_scoring.h +++ /dev/null @@ -1,1370 +0,0 @@ -/* - * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved. - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/** - * DOC: This file contains MLME SCORING related CFG/INI Items. - */ - -#ifndef __CFG_MLME_SCORING_H -#define __CFG_MLME_SCORING_H - -/* - * - * rssi_weightage - RSSI Weightage to calculate best candidate - * @Min: 0 - * @Max: 100 - * @Default: 20 - * - * This ini is used to increase/decrease RSSI weightage in best candidate - * selection. AP with better RSSI will get more weightage. - * - * Related: None - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_RSSI_WEIGHTAGE CFG_INI_UINT( \ - "rssi_weightage", \ - 0, \ - 100, \ - 20, \ - CFG_VALUE_OR_DEFAULT, \ - "RSSI Weightage") - -/* - * - * ht_caps_weightage - HT caps weightage to calculate best candidate - * @Min: 0 - * @Max: 100 - * @Default: 2 - * - * This ini is used to increase/decrease HT caps weightage in best candidate - * selection. If AP supports HT caps, AP will get additional Weightage with - * this param. Weightage will be given only if dot11mode is HT capable. - * - * Related: None - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_HT_CAPS_WEIGHTAGE CFG_INI_UINT( \ - "ht_caps_weightage", \ - 0, \ - 100, \ - 2, \ - CFG_VALUE_OR_DEFAULT, \ - "HT Caps Weightage") - -/* - * - * vht_caps_weightage - VHT caps Weightage to calculate best candidate - * @Min: 0 - * @Max: 100 - * @Default: 1 - * - * This ini is used to increase/decrease VHT caps weightage in best candidate - * selection. If AP supports VHT caps, AP will get additional weightage with - * this param. Weightage will be given only if dot11mode is VHT capable. - * - * Related: None - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_VHT_CAPS_WEIGHTAGE CFG_INI_UINT( \ - "vht_caps_weightage", \ - 0, \ - 100, \ - 1, \ - CFG_VALUE_OR_DEFAULT, \ - "HT Caps Weightage") - -/* - * - * he_caps_weightage - HE caps Weightage to calculate best candidate - * @Min: 0 - * @Max: 100 - * @Default: 2 - * - * This ini is used to increase/decrease HE caps weightage in best candidate - * selection. If AP supports HE caps, AP will get additional weightage with - * this param. Weightage will be given only if dot11mode is HE capable. - * - * Related: None - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_HE_CAPS_WEIGHTAGE CFG_INI_UINT( \ - "he_caps_weightage", \ - 0, \ - 100, \ - 2, \ - CFG_VALUE_OR_DEFAULT, \ - "HE Caps Weightage") - -/* - * - * chan_width_weightage - Channel Width Weightage to calculate best candidate - * @Min: 0 - * @Max: 100 - * @Default: 12 - * - * This ini is used to increase/decrease Channel Width weightage in best - * candidate selection. AP with Higher channel width will get higher weightage - * - * Related: bandwidth_weight_per_index - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_CHAN_WIDTH_WEIGHTAGE CFG_INI_UINT( \ - "chan_width_weightage", \ - 0, \ - 100, \ - 12, \ - CFG_VALUE_OR_DEFAULT, \ - "Channel width weightage") - -/* - * - * chan_band_weightage - Channel Band perferance to 5GHZ to - * calculate best candidate - * @Min: 0 - * @Max: 100 - * @Default: 2 - * - * This ini is used to increase/decrease Channel Band Preference weightage - * in best candidate selection. 5GHZ AP get this additional boost compare to - * 2GHZ AP before rssi_pref_5g_rssi_thresh and 2.4Ghz get weightage after - * rssi_pref_5g_rssi_thresh. - * - * Related: rssi_pref_5g_rssi_thresh, band_weight_per_index - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_CHAN_BAND_WEIGHTAGE CFG_INI_UINT( \ - "chan_band_weightage", \ - 0, \ - 100, \ - 2, \ - CFG_VALUE_OR_DEFAULT, \ - "Channel Band Weightage") - -/* - * - * nss_weightage - NSS Weightage to calculate best candidate - * @Min: 0 - * @Max: 100 - * @Default: 16 - * - * This ini is used to increase/decrease NSS weightage in best candidate - * selection. If there are two AP, one AP supports 2x2 and another one supports - * 1x1 and station supports 2X2, first A will get this additional weightage - * depending on self-capability. - * - * Related: nss_weight_per_index - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_NSS_WEIGHTAGE CFG_INI_UINT( \ - "nss_weightage", \ - 0, \ - 100, \ - 16, \ - CFG_VALUE_OR_DEFAULT, \ - "NSS Weightage") -/* - * - * beamforming_cap_weightage - Beam Forming Weightage to - * calculate best candidate - * @Min: 0 - * @Max: 100 - * @Default: 2 - * - * This ini is used to increase/decrease Beam forming Weightage if some AP - * support Beam forming or not. If AP supports Beam forming, that AP will get - * additional boost of this weightage. - * - * Related: None - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_BEAMFORM_CAP_WEIGHTAGE CFG_INI_UINT( \ - "beamforming_cap_weightage", \ - 0, \ - 100, \ - 2, \ - CFG_VALUE_OR_DEFAULT, \ - "Beamforming Cap Weightage") - -/* - * - * pcl_weightage - PCL Weightage to calculate best candidate - * @Min: 0 - * @Max: 100 - * @Default: 10 - * - * This ini is used to increase/decrease PCL weightage in best candidate - * selection. If some APs are in PCL list, those AP will get addition - * weightage. - * - * Related: None - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_PCL_WEIGHTAGE CFG_INI_UINT( \ - "pcl_weightage", \ - 0, \ - 100, \ - 10, \ - CFG_VALUE_OR_DEFAULT, \ - "PCL Weightage") - -/* - * - * channel_congestion_weightage - channel Congestion Weightage to - * calculate best candidate - * @Min: 0 - * @Max: 100 - * @Default: 25 - * - * This ini is used to increase/decrease channel congestion weightage in - * candidate selection. Congestion is measured with the help of ESP/QBSS load. - * - * Related: num_esp_qbss_slots - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_CHAN_CONGESTION_WEIGHTAGE CFG_INI_UINT( \ - "channel_congestion_weightage", \ - 0, \ - 100, \ - 25, \ - CFG_VALUE_OR_DEFAULT, \ - "Channel Congestion Weightage") - -/* - * - * oce_wan_weightage - OCE WAN DL capacity Weightage to calculate best candidate - * @Min: 0 - * @Max: 100 - * @Default: 2 - * - * This ini is used to increase/decrease OCE WAN caps weightage in best - * candidate selection. If AP have OCE WAN information, give weightage depending - * on the downaload available capacity. - * - * Related: num_oce_wan_slots - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_OCE_WAN_WEIGHTAGE CFG_INI_UINT( \ - "oce_wan_weightage", \ - 0, \ - 100, \ - 2, \ - CFG_VALUE_OR_DEFAULT, \ - "OCE WAN Weightage") - -/* - * - * best_rssi_threshold - Best Rssi for score calculation - * @Min: 0 - * @Max: 96 - * @Default: 55 - * - * This ini tells limit for best RSSI. RSSI better than this limit are - * considered as best RSSI. The best RSSI is given full rssi_weightage. - * - * Related: rssi_weightage - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_BEST_RSSI_THRESHOLD CFG_INI_UINT( \ - "best_rssi_threshold", \ - 0, \ - 96, \ - 55, \ - CFG_VALUE_OR_DEFAULT, \ - "Best RSSI threshold") - -/* - * - * good_rssi_threshold - Good Rssi for score calculation - * @Min: 0 - * @Max: 96 - * @Default: 70 - * - * This ini tells limit for good RSSI. RSSI better than this limit and less - * than best_rssi_threshold is considered as good RSSI. - * - * Related: rssi_weightage, best_rssi_threshold - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_GOOD_RSSI_THRESHOLD CFG_INI_UINT( \ - "good_rssi_threshold", \ - 0, \ - 96, \ - 70, \ - CFG_VALUE_OR_DEFAULT, \ - "Good RSSI threshold") - -/* - * - * bad_rssi_threshold - Bad Rssi for score calculation - * @Min: 0 - * @Max: 96 - * @Default: 80 - * - * This ini tells limit for Bad RSSI. RSSI greater then bad_rssi_threshold - * is considered as bad RSSI. - * - * Related: rssi_weightage, good_rssi_threshold - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_BAD_RSSI_THRESHOLD CFG_INI_UINT( \ - "bad_rssi_threshold", \ - 0, \ - 96, \ - 80, \ - CFG_VALUE_OR_DEFAULT, \ - "Bad RSSI threshold") - -/* - * - * good_rssi_pcnt - Percent Score to Good RSSI out of total RSSI score. - * @Min: 0 - * @Max: 100 - * @Default: 80 - * - * This ini tells about how much percent should be given to good RSSI(RSSI - * between best_rssi_threshold and good_rssi_threshold) out of RSSI weightage. - * - * Related: rssi_weightage, best_rssi_threshold, good_rssi_threshold - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_GOOD_RSSI_PERCENT CFG_INI_UINT( \ - "good_rssi_pcnt", \ - 0, \ - 100, \ - 80, \ - CFG_VALUE_OR_DEFAULT, \ - "Good RSSI Percent") - -/* - * - * bad_rssi_pcnt - Percent Score to BAD RSSI out of total RSSI score. - * @Min: 0 - * @Max: 100 - * @Default: 25 - * - * This ini tells about how much percent should be given to bad RSSI (RSSI - * between good_rssi_threshold and bad_rssi_threshold) out of RSSI weightage. - * - * Related: rssi_weightage, good_rssi_threshold, bad_rssi_threshold - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_BAD_RSSI_PERCENT CFG_INI_UINT( \ - "bad_rssi_pcnt", \ - 0, \ - 100, \ - 25, \ - CFG_VALUE_OR_DEFAULT, \ - "Bad RSSI Percent") - -/* - * - * good_rssi_bucket_size - Bucket size between best and good RSSI to score. - * @Min: 1 - * @Max: 10 - * @Default: 5 - * - * This ini tells about bucket size for scoring between best and good RSSI. - * Below Best RSSI, 100% score will be given. Between best and good RSSI, RSSI - * is divided in buckets and score will be assigned bucket wise starting from - * good_rssi_pcnt. - * - * Related: rssi_weightage, good_rssi_pcnt - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_GOOD_RSSI_BUCKET_SIZE CFG_INI_UINT( \ - "good_rssi_bucket_size", \ - 1, \ - 10, \ - 5, \ - CFG_VALUE_OR_DEFAULT, \ - "Good RSSI Bucket Size") - -/* - * - * bad_rssi_bucket_size - Bucket size between good and bad RSSI to score. - * @Min: 1 - * @Max: 10 - * @Default: 5 - * - * This ini tells about bucket size for scoring between good and bad RSSI. - * Between good and bad RSSI, RSSI is divided in buckets and score will be - * assigned bucket wise starting from bad_rssi_pcnt. - * - * Related: rssi_weightage, bad_rssi_pcnt - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_BAD_RSSI_BUCKET_SIZE CFG_INI_UINT( \ - "bad_rssi_bucket_size", \ - 1, \ - 10, \ - 5, \ - CFG_VALUE_OR_DEFAULT, \ - "Bad RSSI Bucket Size") - -/* - * - * rssi_pref_5g_rssi_thresh - A RSSI threshold above which 5 GHz is not favored - * @Min: 0 - * @Max: 96 - * @Default: 76 - * - * 5G AP are given chan_band_weightage. This ini tells about RSSI threshold - * above which 5GHZ is not favored. - * - * Related: chan_band_weightage - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_RSSI_PREF_5G_THRESHOLD CFG_INI_UINT( \ - "rssi_pref_5g_rssi_thresh", \ - 0, \ - 96, \ - 76, \ - CFG_VALUE_OR_DEFAULT, \ - "RSSI Pref 5G Threshold") - -/* - * - * bandwidth_weight_per_index - percentage as per bandwidth - * @Min: 0x00000000 - * @Max: 0x64646464 - * @Default: 0x6432190C - * - * This INI give percentage value of chan_width_weightage to be used as per - * peer bandwidth. Self BW is also considered while calculating score. Eg if - * self BW is 20 MHZ 10% will be given for all AP irrespective of the AP - * capability. - * - * Indexes are defined in this way. - * 0 Index (BITS 0-7): 20 MHz - Def 12% - * 1 Index (BITS 8-15): 40 MHz - Def 25% - * 2 Index (BITS 16-23): 80 MHz - Def 50% - * 3 Index (BITS 24-31): 160 MHz - Def 100% - * These percentage values are stored in HEX. For any index max value, can be 64 - * - * Related: chan_width_weightage - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_BW_WEIGHT_PER_IDX CFG_INI_UINT( \ - "bandwidth_weight_per_index", \ - 0x00000000, \ - 0x64646464, \ - 0x6432190C, \ - CFG_VALUE_OR_DEFAULT, \ - "Bandwidth weight per index") - -/* - * - * nss_weight_per_index - percentage as per NSS - * @Min: 0x00000000 - * @Max: 0x64646464 - * @Default: 0x6432190C - * - * This INI give percentage value of nss_weightage to be used as per peer NSS. - * Self NSS capability is also considered. Eg if self NSS is 1x1 10% will be - * given for all AP irrespective of the AP capability. - * - * Indexes are defined in this way. - * 0 Index (BITS 0-7): 1X1- Def 12% - * 1 Index (BITS 8-15): 2X2- Def 25% - * 2 Index (BITS 16-23): 3X3- Def 50% - * 3 Index (BITS 24-31): 4X4- Def 100% - * These percentage values are stored in HEX. For any index max value, can be 64 - * - * Related: nss_weightage - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_NSS_WEIGHT_PER_IDX CFG_INI_UINT( \ - "nss_weight_per_index", \ - 0x00000000, \ - 0x64646464, \ - 0x6432190C, \ - CFG_VALUE_OR_DEFAULT, \ - "NSS weight per index") - -/* - * - * band_weight_per_index - percentage as per band - * @Min: 0x00000000 - * @Max: 0x64646464 - * @Default: 0x0000644B - * - * This INI give percentage value of chan_band_weightage to be used as per band. - * If RSSI is greater than rssi_pref_5g_rssi_thresh preference is given for 5Ghz - * else, it's given for 2.4Ghz. - * - * Indexes are defined in this way. - * 0 Index (BITS 0-7): 2.4GHz - Def 10% - * 1 Index (BITS 8-15): 5GHz - Def 20% - * 2 Index (BITS 16-23): 6Ghz - Def - 100% - * 3 Index (BITS 24-31): Reserved - * These percentage values are stored in HEX. For any index max value, can be 64 - * - * Related: chan_band_weightage, rssi_pref_5g_rssi_thresh - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_BAND_WEIGHT_PER_IDX CFG_INI_UINT( \ - "band_weight_per_index", \ - 0x00000000, \ - 0x64646464, \ - 0x00644B32, \ - CFG_VALUE_OR_DEFAULT, \ - "Band weight per index") - -/* - * - * num_esp_qbss_slots - number of slots in which the esp/qbss load will - * be divided - * - * @Min: 1 - * @Max: 15 - * @Default: 8 - * - * Number of slots in which the esp/qbss load will be divided. Max 15. index 0 - * is used for 'not_present. Num_slot will equally divide 100. e.g, if - * num_slot = 4 slot 1 = 0-25% load, slot 2 = 26-50% load, slot 3 = 51-75% load, - * slot 4 = 76-100% load. Remaining unused index can be 0. - * Following is load percentage, score percentage and score of num_slot = 8, - * weight=25. - * 0-12% 13-25% 26-38% 39-50% 51-63 %64-75% 76-88% 87-100% Not Present - * 100% 90% 80% 70% 50% 25% 10% 5% 50% - * 2500 2250 2000 1750 1250 625 250 125 1250 - * - * Usage: External - * - * - */ -#define CFG_SCORING_NUM_ESP_QBSS_SLOTS CFG_INI_UINT( \ - "num_esp_qbss_slots", \ - 1, \ - 15, \ - 8, \ - CFG_VALUE_OR_DEFAULT, \ - "Num ESP QPSS Slots") - -/* - * - * esp_qbss_score_idx3_to_0 - percentage for esp/qbss load for slots 0-3 - * @Min: 0x00000000 - * @Max: 0x64646464 - * @Default: 0x505A6432 - * - * This INI give percentage value of channel_congestion_weightage to be used as - * index in which the load value falls. Index 0 is for percentage when ESP/QBSS - * is not present. - * - * Indexes are defined in this way. - * 0 Index (BITS 0-7): when ESP/QBSS is not present - * 1 Index (BITS 8-15): SLOT_1 - * 2 Index (BITS 16-23): SLOT_2 - * 3 Index (BITS 24-31): SLOT_3 - * These percentage values are stored in HEX. For any index max value, can be 64 - * - * Related: channel_congestion_weightage, num_esp_qbss_slots - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_ESP_QBSS_SCORE_IDX_3_TO_0 CFG_INI_UINT( \ - "esp_qbss_score_idx3_to_0", \ - 0x00000000, \ - 0x64646464, \ - 0x505A6432, \ - CFG_VALUE_OR_DEFAULT, \ - "ESP QPSS Score Index 3 to 0") - -/* - * - * esp_qbss_score_idx7_to_4 - percentage for esp/qbss load for slots 4-7 - * @Min: 0x00000000 - * @Max: 0x64646464 - * @Default: 0x0A193246 - * - * This INI give percentage value of channel_congestion_weightage to be used as - * index in which the load value falls. Used only if num_esp_qbss_slots is - * greater than 3. - * - * Indexes are defined in this way. - * 0 Index (BITS 0-7): SLOT_4 - * 1 Index (BITS 8-15): SLOT_5 - * 2 Index (BITS 16-23): SLOT_6 - * 3 Index (BITS 24-31): SLOT_7 - * These percentage values are stored in HEX. For any index max value, can be 64 - * - * Related: channel_congestion_weightage, num_esp_qbss_slots - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_ESP_QBSS_SCORE_IDX_7_TO_4 CFG_INI_UINT( \ - "esp_qbss_score_idx7_to_4", \ - 0x00000000, \ - 0x64646464, \ - 0x0A193246, \ - CFG_VALUE_OR_DEFAULT, \ - "ESP QPSS Score Index 7 to 4") - -/* - * - * esp_qbss_score_idx11_to_8 - percentage for esp/qbss load for slots 8-11 - * @Min: 0x00000000 - * @Max: 0x64646464 - * @Default: 0x00000005 - * - * This INI give percentage value of channel_congestion_weightage to be used as - * index in which the load value falls. Used only if num_esp_qbss_slots is - * greater than 7. - * - * Indexes are defined in this way. - * 0 Index (BITS 0-7): SLOT_8 - * 1 Index (BITS 8-15): SLOT_9 - * 2 Index (BITS 16-23): SLOT_10 - * 3 Index (BITS 24-31): SLOT_11 - * These percentage values are stored in HEX. For any index max value, can be 64 - * - * Related: channel_congestion_weightage, num_esp_qbss_slots - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_ESP_QBSS_SCORE_IDX_11_TO_8 CFG_INI_UINT( \ - "esp_qbss_score_idx11_to_8", \ - 0x00000000, \ - 0x64646464, \ - 0x00000005, \ - CFG_VALUE_OR_DEFAULT, \ - "ESP QPSS Score Index 11 to 8") - -/* - * - * esp_qbss_score_idx15_to_12 - percentage for esp/qbss load for slots 12-15 - * @Min: 0x00000000 - * @Max: 0x64646464 - * @Default: 0x00000000 - * - * This INI give percentage value of channel_congestion_weightage to be used as - * index in which the load value falls. Used only if num_esp_qbss_slots is - * greater than 11. - * - * Indexes are defined in this way. - * 0 Index (BITS 0-7): SLOT_12 - * 1 Index (BITS 8-15): SLOT_13 - * 2 Index (BITS 16-23): SLOT_14 - * 3 Index (BITS 24-31): SLOT_15 - * These percentage values are stored in HEX. For any index max value, can be 64 - * - * Related: channel_congestion_weightage, num_esp_qbss_slots - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_ESP_QBSS_SCORE_IDX_15_TO_12 CFG_INI_UINT( \ - "esp_qbss_score_idx15_to_12", \ - 0x00000000, \ - 0x64646464, \ - 0x00000000, \ - CFG_VALUE_OR_DEFAULT, \ - "ESP QPSS Score Index 15 to 12") - -/* - * - * num_oce_wan_slots - number of slots in which the oce wan metrics will - * be divided - * - * @Min: 1 - * @Max: 15 - * @Default: 8 - * - * Number of slots in which the oce wan metrics will be divided. Max 15. index 0 - * is used for not_present. Num_slot will equally divide 100. e.g, if - * num_slot = 4 slot 1 = 0-3 DL CAP, slot 2 = 4-7 DL CAP, slot 3 = 8-11 DL CAP, - * slot 4 = 12-15 DL CAP. Remaining unused index can be 0. - * - * Related: oce_wan_weightage - * - * Usage: External - * - * - */ -#define CFG_SCORING_NUM_OCE_WAN_SLOTS CFG_INI_UINT( \ - "num_oce_wan_slots", \ - 1, \ - 15, \ - 15, \ - CFG_VALUE_OR_DEFAULT, \ - "Num OCE WAN Slots") - -/* - * - * oce_wan_score_idx3_to_0 - percentage for OCE WAN metrics score for slots 0-3 - * @Min: 0x00000000 - * @Max: 0x64646464 - * @Default: 0x00000032 - * - * This INI give percentage value of OCE WAN metrics DL CAP, to be used as - * index in which the DL CAP value falls. Index 0 is for percentage when - * OCE WAN metrics DL CAP is not present. - * - * Indexes are defined in this way. - * 0 Index (BITS 0-7): when OCE WAN metrics DL CAP is not present - * 1 Index (BITS 8-15): SLOT_1 - * 2 Index (BITS 16-23): SLOT_2 - * 3 Index (BITS 24-31): SLOT_3 - * These percentage values are stored in HEX. For any index max value, can be 64 - * - * Related: num_oce_wan_slots, oce_wan_weightage - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_OCE_WAN_SCORE_IDX_3_TO_0 CFG_INI_UINT( \ - "oce_wan_score_idx3_to_0", \ - 0x00000000, \ - 0x64646464, \ - 0x00000032, \ - CFG_VALUE_OR_DEFAULT, \ - "OCE WAN Score Index 3 to 0") - -/* - * - * oce_wan_score_idx7_to_4 - percentage for OCE WAN metrics score for slots 4-7 - * @Min: 0x00000000 - * @Max: 0x64646464 - * @Default: 0x00000000 - * - * This INI give percentage value of OCE WAN metrics DL CAP, to be used as - * index in which the DL CAP value falls. Used only if num_oce_wan_slots is - * greater than 3. - * - * Indexes are defined in this way. - * 0 Index (BITS 0-7): SLOT_4 - * 1 Index (BITS 8-15): SLOT_5 - * 2 Index (BITS 16-23): SLOT_6 - * 3 Index (BITS 24-31): SLOT_7 - * These percentage values are stored in HEX. For any index max value, can be 64 - * - * Related: num_oce_wan_slots, oce_wan_weightage - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_OCE_WAN_SCORE_IDX_7_TO_4 CFG_INI_UINT( \ - "oce_wan_score_idx7_to_4", \ - 0x00000000, \ - 0x64646464, \ - 0x00000000, \ - CFG_VALUE_OR_DEFAULT, \ - "OCE WAN Score Index 7 to 4") - -/* - * - * oce_wan_score_idx11_to_8 - percentage for OCE WAN metrics score for slot 8-11 - * @Min: 0x00000000 - * @Max: 0x64646464 - * @Default: 0x06030000 - * - * This INI give percentage value of OCE WAN metrics DL CAP, to be used as - * index in which the DL CAP value falls. Used only if num_oce_wan_slots is - * greater than 7. - * - * Indexes are defined in this way. - * 0 Index (BITS 0-7): SLOT_8 - * 1 Index (BITS 8-15): SLOT_9 - * 2 Index (BITS 16-23): SLOT_10 - * 3 Index (BITS 24-31): SLOT_11 - * These percentage values are stored in HEX. For any index max value, can be 64 - * - * Related: num_oce_wan_slots, oce_wan_weightage - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_OCE_WAN_SCORE_IDX_11_TO_8 CFG_INI_UINT( \ - "oce_wan_score_idx11_to_8", \ - 0x00000000, \ - 0x64646464, \ - 0x06030000, \ - CFG_VALUE_OR_DEFAULT, \ - "OCE WAN Score Index 11 to 8") - -/* - * - * oce_wan_score_idx15_to_12 - % for OCE WAN metrics score for slot 12-15 - * @Min: 0x00000000 - * @Max: 0x64646464 - * @Default: 0x6432190C - * - * This INI give percentage value of OCE WAN metrics DL CAP, to be used as - * index in which the DL CAP value falls. Used only if num_oce_wan_slots is - * greater than 11. - * - * Indexes are defined in this way. - * 0 Index (BITS 0-7): SLOT_12 - * 1 Index (BITS 8-15): SLOT_13 - * 2 Index (BITS 16-23): SLOT_14 - * 3 Index (BITS 24-31): SLOT_15 - * These percentage values are stored in HEX. For any index max value, can be 64 - * - * Related: num_oce_wan_slots, oce_wan_weightage - * - * Supported Feature: STA Candidate selection - * - * Usage: External - * - * - */ -#define CFG_SCORING_OCE_WAN_SCORE_IDX_15_TO_12 CFG_INI_UINT( \ - "oce_wan_score_idx15_to_12", \ - 0x00000000, \ - 0x64646464, \ - 0x6432190C, \ - CFG_VALUE_OR_DEFAULT, \ - "OCE WAN Score Index 15 to 12") - -/* - * - * roam_score_delta_bitmap - bitmap to enable roam triggers on - * which roam score delta is to be applied during roam candidate - * selection - * @Min: 0 - * @Max: 0xffffffff - * @Default: 0xffffffff - * - * Bitmap value of the following roam triggers: - * ROAM_TRIGGER_REASON_NONE - B0, - * ROAM_TRIGGER_REASON_PER - B1, - * ROAM_TRIGGER_REASON_BMISS - B2, - * ROAM_TRIGGER_REASON_LOW_RSSI - B3, - * ROAM_TRIGGER_REASON_HIGH_RSSI - B4, - * ROAM_TRIGGER_REASON_PERIODIC - B5, - * ROAM_TRIGGER_REASON_MAWC - B6, - * ROAM_TRIGGER_REASON_DENSE - B7, - * ROAM_TRIGGER_REASON_BACKGROUND - B8, - * ROAM_TRIGGER_REASON_FORCED - B9, - * ROAM_TRIGGER_REASON_BTM - B10, - * ROAM_TRIGGER_REASON_UNIT_TEST - B11, - * ROAM_TRIGGER_REASON_BSS_LOAD - B12 - * ROAM_TRIGGER_REASON_DISASSOC - B13 - * ROAM_TRIGGER_REASON_IDLE_ROAM - B14 - * - * When the bit corresponding to a particular roam trigger reason - * is set, the value of "roam_score_delta" is expected over the - * roam score of the current connected AP, for that triggered roam - * - * Related: None - * - * Supported Feature: Roaming - * - * Usage: External - * - * - */ -#define CFG_ROAM_SCORE_DELTA_TRIGGER_BITMAP CFG_INI_UINT( \ - "roam_score_delta_bitmap", \ - 0, \ - 0xFFFFFFFF, \ - 0xFFFFFFFF, \ - CFG_VALUE_OR_DEFAULT, \ - "Bitmap for various roam triggers") - -/* - * - * roam_score_delta - Percentage increment in roam score value - * that is expected from a roaming candidate AP. - * @Min: 0 - * @Max: 100 - * @Default: 0 - * - * This ini is used to provide the percentage increment value over roam - * score for the candidate APs so that they can be preferred over current - * AP for roaming. - * - * Related: None - * - * Supported Feature: Roaming - * - * Usage: External - * - * - */ -#define CFG_ROAM_SCORE_DELTA CFG_INI_UINT( \ - "roam_score_delta", \ - 0, \ - 100, \ - 0, \ - CFG_VALUE_OR_DEFAULT, \ - "candidate AP's percentage roam score delta") - -/* - * - * min_roam_score_delta - Difference of roam score values between connected - * AP and roam candidate AP. - * @Min: 0 - * @Max: 10000 - * @Default: 0 - * - * This ini is used during CU and low rssi based roam triggers, consider - * AP as roam candidate only if its roam score is better than connected - * AP score by at least min_roam_score_delta. - * If user configured "roam_score_delta" and "min_roam_score_delta" both, - * then firmware selects roam candidate AP by considering values of both - * INIs. - * Example: If DUT is connected with AP1 and roam candidate AP2 has roam - * score greater than roam_score_delta and min_roam_score_delta then only - * firmware will trigger roaming to AP2. - * - * Related: roam_score_delta - * - * Supported Feature: Roaming - * - * Usage: Internal - * - * - */ -#define CFG_CAND_MIN_ROAM_SCORE_DELTA CFG_INI_UINT( \ - "min_roam_score_delta", \ - 0, \ - 10000, \ - 0, \ - CFG_VALUE_OR_DEFAULT, \ - "Diff between connected AP's and candidate AP's roam score") - -/* - * - * enable_scoring_for_roam - enable/disable scoring logic in FW for candidate - * selection during roaming - * - * @Min: 0 - * @Max: 1 - * @Default: 1 - * - * This ini is used to enable/disable scoring logic in FW for candidate - * selection during roaming. - * - * Supported Feature: STA Candidate selection by FW during roaming based on - * scoring logic. - * - * Usage: External - * - * - */ -#define CFG_ENABLE_SCORING_FOR_ROAM CFG_INI_BOOL( \ - "enable_scoring_for_roam", \ - 1, \ - "Enable Scoring for Roam") - -/* - * - * apsd_enabled - Enable automatic power save delivery - * @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: 0 - * - * 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, \ - 0, \ - 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: 0 - * - * 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, \ - 0, \ - CFG_VALUE_OR_DEFAULT, \ - "Roam score delta for BTM roam trigger") - -/* - * - * vendor_roam_score_algorithm - Algorithm to calculate AP score - * @Min: 0 - * @Max: 1 - * @Default: 0 - * - * By default the value is 0 and default roam algorithm will be used. - * When the value is 1, the V2 roaming algorithm will be used: - * For this V2 algo, AP score calculation is based on below equation: - * AP Score = (RSSIfactor * rssiweight(0.65)) + (CUfactor *cuweight(0.35)) - * - * Related: None - * - * Supported Feature: roam score algorithm - * - * Usage: External - * - * - */ -#define CFG_VENDOR_ROAM_SCORE_ALGORITHM CFG_INI_UINT( \ - "vendor_roam_score_algorithm", \ - 0, \ - 1, \ - 0, \ - CFG_VALUE_OR_DEFAULT, \ - "Roam candidate selection score algorithm") - -/* - * - * oce_ap_tx_pwr_weightage - update scoring param based on ap tx power - * @Min: 0 - * @Max: 10 - * @Default: 5 - * - * This ini is used to store calculate weightage based on ap tx power. - * - * Related: None - * - * Supported Feature: STA - * - * Usage: External - * - * - */ -#define CFG_OCE_AP_TX_PWR_WEIGHTAGE CFG_INI_UINT( \ - "oce_ap_tx_pwr_weightage", \ - 0, \ - 10, \ - 5, \ - CFG_VALUE_OR_DEFAULT,\ - "AP weigtage for OCE ap tx power") - -/* - * - * oce_subnet_id_weightage - update scoring param based on subnet id - * @Min: 0 - * @Max: 10 - * @Default: 3 - * - * This ini is used to calculate subnet id weightage in roam score. - * If the MBO-OCE ie has "IP subnet indication attribute", then host - * considers 50% of the "oce_subnet_id_weightage" value to calculate - * roam score for the initial connection and 100% of the - * "oce_subnet_id_weightage" value to calculate roam score for roaming - * case. - * "oce_ap_tx_pwr_weightage" adds a small amount of percentage advantage - * in roam score while selection of an AP candidate within the same subnet - * ID. If "oce_ap_tx_pwr_weightage" value is 0(min), roam score doesn't - * include percentage weightage for subnet id and if "oce_ap_tx_pwr_weightage" - * value is 10(max), then the weightage given because of same subnet ID is - * more in roam score. This ini is also used for WFA certification. - * - * Related: None - * - * Supported Feature: STA - * - * Usage: External - * - * - */ -#define CFG_OCE_SUBNET_ID_WEIGHTAGE CFG_INI_UINT( \ - "oce_subnet_id_weightage", \ - 0, \ - 10, \ - 3, \ - CFG_VALUE_OR_DEFAULT,\ - "AP weigtage for OCE subnet id") - -#define CFG_SCORING_ALL \ - CFG(CFG_SCORING_RSSI_WEIGHTAGE) \ - CFG(CFG_SCORING_HT_CAPS_WEIGHTAGE) \ - CFG(CFG_SCORING_VHT_CAPS_WEIGHTAGE) \ - CFG(CFG_SCORING_HE_CAPS_WEIGHTAGE) \ - CFG(CFG_SCORING_CHAN_WIDTH_WEIGHTAGE) \ - CFG(CFG_SCORING_CHAN_BAND_WEIGHTAGE) \ - CFG(CFG_SCORING_NSS_WEIGHTAGE) \ - CFG(CFG_SCORING_BEAMFORM_CAP_WEIGHTAGE) \ - CFG(CFG_SCORING_PCL_WEIGHTAGE) \ - CFG(CFG_SCORING_CHAN_CONGESTION_WEIGHTAGE) \ - CFG(CFG_SCORING_OCE_WAN_WEIGHTAGE) \ - CFG(CFG_SCORING_BEST_RSSI_THRESHOLD) \ - CFG(CFG_SCORING_GOOD_RSSI_THRESHOLD) \ - CFG(CFG_SCORING_BAD_RSSI_THRESHOLD) \ - CFG(CFG_SCORING_GOOD_RSSI_PERCENT) \ - CFG(CFG_SCORING_BAD_RSSI_PERCENT) \ - CFG(CFG_SCORING_GOOD_RSSI_BUCKET_SIZE) \ - CFG(CFG_SCORING_BAD_RSSI_BUCKET_SIZE) \ - CFG(CFG_SCORING_RSSI_PREF_5G_THRESHOLD) \ - CFG(CFG_SCORING_BW_WEIGHT_PER_IDX) \ - CFG(CFG_SCORING_NSS_WEIGHT_PER_IDX) \ - CFG(CFG_SCORING_BAND_WEIGHT_PER_IDX) \ - CFG(CFG_SCORING_NUM_ESP_QBSS_SLOTS) \ - CFG(CFG_SCORING_ESP_QBSS_SCORE_IDX_3_TO_0) \ - CFG(CFG_SCORING_ESP_QBSS_SCORE_IDX_7_TO_4) \ - CFG(CFG_SCORING_ESP_QBSS_SCORE_IDX_11_TO_8) \ - CFG(CFG_SCORING_ESP_QBSS_SCORE_IDX_15_TO_12) \ - CFG(CFG_SCORING_NUM_OCE_WAN_SLOTS) \ - CFG(CFG_SCORING_OCE_WAN_SCORE_IDX_3_TO_0) \ - CFG(CFG_SCORING_OCE_WAN_SCORE_IDX_7_TO_4) \ - CFG(CFG_SCORING_OCE_WAN_SCORE_IDX_11_TO_8) \ - CFG(CFG_SCORING_OCE_WAN_SCORE_IDX_15_TO_12) \ - CFG(CFG_ROAM_SCORE_DELTA_TRIGGER_BITMAP) \ - CFG(CFG_ROAM_SCORE_DELTA) \ - CFG(CFG_CAND_MIN_ROAM_SCORE_DELTA) \ - CFG(CFG_ENABLE_SCORING_FOR_ROAM) \ - 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) \ - CFG(CFG_VENDOR_ROAM_SCORE_ALGORITHM) \ - CFG(CFG_OCE_AP_TX_PWR_WEIGHTAGE) \ - CFG(CFG_OCE_SUBNET_ID_WEIGHTAGE) \ - -#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 ecb83d66c46d..746a6ccee088 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -1873,52 +1873,9 @@ struct wlan_mlme_rssi_cfg_score { uint32_t rssi_pref_5g_rssi_thresh; }; -/** - * struct wlan_mlme_per_slot_scoring - define % score for differents slots - * for a scoring param. - * num_slot: number of slots in which the param will be divided. - * Max 15. index 0 is used for 'not_present. Num_slot will - * equally divide 100. e.g, if num_slot = 4 slot 0 = 0-25%, slot - * 1 = 26-50% slot 2 = 51-75%, slot 3 = 76-100% - * score_pcnt3_to_0: Conatins score percentage for slot 0-3 - * BITS 0-7 :- the scoring pcnt when not present - * BITS 8-15 :- SLOT_1 - * BITS 16-23 :- SLOT_2 - * BITS 24-31 :- SLOT_3 - * score_pcnt7_to_4: Conatins score percentage for slot 4-7 - * BITS 0-7 :- SLOT_4 - * BITS 8-15 :- SLOT_5 - * BITS 16-23 :- SLOT_6 - * BITS 24-31 :- SLOT_7 - * score_pcnt11_to_8: Conatins score percentage for slot 8-11 - * BITS 0-7 :- SLOT_8 - * BITS 8-15 :- SLOT_9 - * BITS 16-23 :- SLOT_10 - * BITS 24-31 :- SLOT_11 - * score_pcnt15_to_12: Conatins score percentage for slot 12-15 - * BITS 0-7 :- SLOT_12 - * BITS 8-15 :- SLOT_13 - * BITS 16-23 :- SLOT_14 - * BITS 24-31 :- SLOT_15 - */ -struct wlan_mlme_per_slot_scoring { - uint32_t num_slot; - uint32_t score_pcnt3_to_0; - uint32_t score_pcnt7_to_4; - uint32_t score_pcnt11_to_8; - uint32_t score_pcnt15_to_12; -}; - /* - * struct wlan_mlme_score_config - MLME BSS Scoring related config + * struct wlan_mlme_roam_scoring_cfg - MLME roam related scoring config * @enable_scoring_for_roam: Enable/disable BSS Scoring for Roaming - * @weight_cfg: Various Weight related Scoring Configs - * @rssi_score: RSSI Scoring related thresholds/percentages config - * @esp_qbss_scoring: ESP QBSS Scoring configs - * @oce_wan_scoring: OCE WAN Scoring Configs - * @bandwidth_weight_per_index: Bandwidth weight per index for scoring logic - * @nss_weight_per_index: NSS weight per index for scoring logic - * @band_weight_per_index: Band weight per index for scoring logic * @roam_trigger_bitmap: bitmap for various roam triggers * @roam_score_delta: percentage delta in roam score * @apsd_enabled: Enable automatic power save delivery @@ -1926,15 +1883,8 @@ struct wlan_mlme_per_slot_scoring { * @min_roam_score_delta: Minimum difference between connected AP's and * candidate AP's roam score to start roaming. */ -struct wlan_mlme_scoring_cfg { +struct wlan_mlme_roam_scoring_cfg { bool enable_scoring_for_roam; - struct wlan_mlme_weight_config weight_cfg; - struct wlan_mlme_rssi_cfg_score rssi_score; - struct wlan_mlme_per_slot_scoring esp_qbss_scoring; - struct wlan_mlme_per_slot_scoring oce_wan_scoring; - uint32_t bandwidth_weight_per_index; - uint32_t nss_weight_per_index; - uint32_t band_weight_per_index; uint32_t roam_trigger_bitmap; uint32_t roam_score_delta; bool apsd_enabled; @@ -2297,7 +2247,7 @@ struct wlan_mlme_cfg { struct wlan_mlme_nss_chains nss_chains_ini_cfg; struct wlan_mlme_sta_cfg sta; struct wlan_mlme_stats_cfg stats; - struct wlan_mlme_scoring_cfg scoring; + struct wlan_mlme_roam_scoring_cfg roam_scoring; struct wlan_mlme_oce oce; struct wlan_mlme_threshold threshold; struct wlan_mlme_timeout timeouts; diff --git a/components/wmi/inc/wmi_unified_roam_param.h b/components/wmi/inc/wmi_unified_roam_param.h index 8556cebbf4db..b7759265cc1a 100644 --- a/components/wmi/inc/wmi_unified_roam_param.h +++ b/components/wmi/inc/wmi_unified_roam_param.h @@ -24,6 +24,7 @@ #define _WMI_UNIFIED_ROAM_PARAM_H_ #include +#include /** * struct gateway_update_req_param - gateway parameter update request @@ -296,69 +297,6 @@ struct ap_profile { uint32_t rssi_abs_thresh; }; -/** - * struct rssi_scoring - rssi scoring param to sortlist selected AP - * @best_rssi_threshold: Roamable AP RSSI equal or better than this threshold, - * full rssi score 100. Units in dBm. - * @good_rssi_threshold: Below threshold, scoring linear percentage between - * rssi_good_pnt and 100. Units in dBm. - * @bad_rssi_threshold: Between good and bad rssi threshold, scoring linear - * % between rssi_bad_pcnt and rssi_good_pct in dBm. - * @good_rssi_pcnt: Used to assigned scoring percentage of each slot between - * best to good rssi threshold. Units in percentage. - * @bad_rssi_pcnt: Used to assigned scoring percentage of each slot between good - * to bad rssi threshold. Unites in percentage. - * @good_bucket_size : bucket size of slot in good zone - * @bad_bucket_size : bucket size of slot in bad zone - * @rssi_pref_5g_rssi_thresh: Below rssi threshold, 5G AP have given preference - * of band percentage. Units in dBm. - */ -struct rssi_scoring { - int32_t best_rssi_threshold; - int32_t good_rssi_threshold; - int32_t bad_rssi_threshold; - uint32_t good_rssi_pcnt; - uint32_t bad_rssi_pcnt; - uint32_t good_bucket_size; - uint32_t bad_bucket_size; - int32_t rssi_pref_5g_rssi_thresh; -}; - -/** - * struct param_slot_scoring - define % score for differents slots for a - * scoring param. - * @num_slot: number of slots in which the param will be divided. - * Max 15. index 0 is used for 'not_present. Num_slot will - * equally divide 100. e.g, if num_slot = 4 slot 0 = 0-25%, slot - * 1 = 26-50% slot 2 = 51-75%, slot 3 = 76-100% - * @score_pcnt3_to_0: Conatins score percentage for slot 0-3 - * BITS 0-7 :- the scoring pcnt when not present - * BITS 8-15 :- SLOT_1 - * BITS 16-23 :- SLOT_2 - * BITS 24-31 :- SLOT_3 - * @score_pcnt7_to_4: Conatins score percentage for slot 4-7 - * BITS 0-7 :- SLOT_4 - * BITS 8-15 :- SLOT_5 - * BITS 16-23 :- SLOT_6 - * BITS 24-31 :- SLOT_7 - * @score_pcnt11_to_8: Conatins score percentage for slot 8-11 - * BITS 0-7 :- SLOT_8 - * BITS 8-15 :- SLOT_9 - * BITS 16-23 :- SLOT_10 - * BITS 24-31 :- SLOT_11 - * @score_pcnt15_to_12: Conatins score percentage for slot 12-15 - * BITS 0-7 :- SLOT_12 - * BITS 8-15 :- SLOT_13 - * BITS 16-23 :- SLOT_14 - * BITS 24-31 :- SLOT_15 - */ -struct param_slot_scoring { - uint32_t num_slot; - uint32_t score_pcnt3_to_0; - uint32_t score_pcnt7_to_4; - uint32_t score_pcnt11_to_8; - uint32_t score_pcnt15_to_12; -}; /** * struct scoring_param - scoring param to sortlist selected AP @@ -427,9 +365,9 @@ struct scoring_param { uint32_t roam_trigger_bitmap; uint32_t vendor_roam_score_algorithm; uint32_t cand_min_roam_score_delta; - struct rssi_scoring rssi_scoring; - struct param_slot_scoring esp_qbss_scoring; - struct param_slot_scoring oce_wan_scoring; + struct rssi_config_score rssi_scoring; + struct per_slot_score esp_qbss_scoring; + struct per_slot_score oce_wan_scoring; }; /* diff --git a/components/wmi/src/wmi_unified_roam_tlv.c b/components/wmi/src/wmi_unified_roam_tlv.c index 307a6726c65c..1db412130d37 100644 --- a/components/wmi/src/wmi_unified_roam_tlv.c +++ b/components/wmi/src/wmi_unified_roam_tlv.c @@ -1654,9 +1654,9 @@ send_roam_scan_offload_ap_profile_cmd_tlv(wmi_unified_t wmi_handle, score_param->rssi_scoring.bad_rssi_pcnt = ap_profile->param.rssi_scoring.bad_rssi_pcnt; score_param->rssi_scoring.good_bucket_size = - ap_profile->param.rssi_scoring.good_bucket_size; + ap_profile->param.rssi_scoring.good_rssi_bucket_size; score_param->rssi_scoring.bad_bucket_size = - ap_profile->param.rssi_scoring.bad_bucket_size; + ap_profile->param.rssi_scoring.bad_rssi_bucket_size; score_param->rssi_scoring.rssi_pref_5g_rssi_thresh = (-1) * ap_profile->param.rssi_scoring.rssi_pref_5g_rssi_thresh; diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index 61e3859673dd..70b5a7f0b9c5 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -3892,13 +3892,11 @@ void hdd_set_rx_mode_rps(bool enable); /** * hdd_update_score_config - API to update candidate scoring related params * configuration parameters - * @score_config: score config to update - * @cfg: config params + * @hdd_ctx: hdd context * * Return: QDF_STATUS */ -QDF_STATUS hdd_update_score_config( - struct scoring_config *score_config, struct hdd_context *hdd_ctx); +QDF_STATUS hdd_update_score_config(struct hdd_context *hdd_ctx); /** * hdd_get_stainfo() - get stainfo for the specified peer diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 27d87f7b2015..7614d8c2a385 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -2469,6 +2469,9 @@ int hdd_update_tgt_cfg(hdd_handle_t hdd_handle, struct wma_tgt_cfg *cfg) else hdd_debug("bcast twt is disable in ini, fw cap %d", cfg->bcast_twt_support); + + hdd_update_score_config(hdd_ctx); + return 0; dispatcher_close: @@ -16577,60 +16580,13 @@ void hdd_update_ie_whitelist_attr(struct probe_req_whitelist_attr *ie_whitelist, ie_whitelist->voui[i] = whitelist.probe_req_voui[i]; } -QDF_STATUS hdd_update_score_config( - struct scoring_config *score_config, struct hdd_context *hdd_ctx) +QDF_STATUS hdd_update_score_config(struct hdd_context *hdd_ctx) { struct hdd_config *cfg = hdd_ctx->config; - QDF_STATUS status; - struct wlan_mlme_nss_chains vdev_ini_cfg; - bool bval = false; - uint32_t channel_bonding_mode; + eCsrPhyMode phy_mode = hdd_cfg_xlate_to_csr_phy_mode(cfg->dot11Mode); - qdf_mem_zero(&vdev_ini_cfg, sizeof(struct wlan_mlme_nss_chains)); - /* Populate the nss chain params from ini for this vdev type */ - sme_populate_nss_chain_params(hdd_ctx->mac_handle, &vdev_ini_cfg, - QDF_STA_MODE, - hdd_ctx->num_rf_chains); - - score_config->vdev_nss_24g = vdev_ini_cfg.rx_nss[NSS_CHAINS_BAND_2GHZ]; - score_config->vdev_nss_5g = vdev_ini_cfg.rx_nss[NSS_CHAINS_BAND_5GHZ]; - - sme_update_score_config(hdd_ctx->mac_handle, score_config); - - ucfg_mlme_get_channel_bonding_24ghz(hdd_ctx->psoc, - &channel_bonding_mode); - score_config->cb_mode_24G = channel_bonding_mode; - ucfg_mlme_get_channel_bonding_5ghz(hdd_ctx->psoc, - &channel_bonding_mode); - score_config->cb_mode_5G = channel_bonding_mode; - - if (cfg->dot11Mode == eHDD_DOT11_MODE_AUTO || - cfg->dot11Mode == eHDD_DOT11_MODE_11ax || - cfg->dot11Mode == eHDD_DOT11_MODE_11ax_ONLY) - score_config->he_cap = 1; - - if (score_config->he_cap || - cfg->dot11Mode == eHDD_DOT11_MODE_11ac || - cfg->dot11Mode == eHDD_DOT11_MODE_11ac_ONLY) - score_config->vht_cap = 1; - - if (score_config->vht_cap || cfg->dot11Mode == eHDD_DOT11_MODE_11n || - cfg->dot11Mode == eHDD_DOT11_MODE_11n_ONLY) - score_config->ht_cap = 1; - - status = ucfg_mlme_get_vht_for_24ghz(hdd_ctx->psoc, &bval); - if (!QDF_IS_STATUS_SUCCESS(status)) - hdd_err("Failed to get vht_for_24ghz"); - if (score_config->vht_cap && bval) - score_config->vht_24G_cap = 1; - - status = ucfg_mlme_get_vht_enable_tx_bf(hdd_ctx->psoc, - &bval); - if (!QDF_IS_STATUS_SUCCESS(status)) - hdd_err("unable to get vht_enable_tx_bf"); - - if (bval) - score_config->beamformee_cap = 1; + sme_update_score_config(hdd_ctx->mac_handle, phy_mode, + hdd_ctx->num_rf_chains); return QDF_STATUS_SUCCESS; } @@ -16681,12 +16637,6 @@ static int hdd_update_scan_config(struct hdd_context *hdd_ctx) scan_cfg.sta_miracast_mcc_rest_time = mcast_mcc_rest_time; hdd_update_ie_whitelist_attr(&scan_cfg.ie_whitelist, hdd_ctx); - status = hdd_update_score_config(&scan_cfg.score_config, hdd_ctx); - if (QDF_IS_STATUS_ERROR(status)) { - hdd_err("Failed to update scoring config"); - return -EINVAL; - } - status = ucfg_scan_update_user_config(psoc, &scan_cfg); if (status != QDF_STATUS_SUCCESS) { hdd_err("failed pmo psoc configuration"); diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index 636492addfa3..5e7e0e302c5d 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -69,8 +69,6 @@ #include #include -#define ASCII_SPACE_CHARACTER 0x20 - /** ------------------------------------------------------------- \fn lim_delete_dialogue_token_list \brief deletes the complete lim dialogue token linked list. @@ -8332,7 +8330,7 @@ QDF_STATUS lim_get_capability_info(struct mac_context *mac, uint16_t *pcap, pcap_info->qos = 1; /* APSD bit */ - if (mac->mlme_cfg->scoring.apsd_enabled) + if (mac->mlme_cfg->roam_scoring.apsd_enabled) pcap_info->apsd = 1; pcap_info->rrm = mac->rrm.rrmConfig.rrm_enabled; diff --git a/core/mac/src/sys/legacy/src/utils/src/parser_api.c b/core/mac/src/sys/legacy/src/utils/src/parser_api.c index f73515f58805..459121f0779e 100644 --- a/core/mac/src/sys/legacy/src/utils/src/parser_api.c +++ b/core/mac/src/sys/legacy/src/utils/src/parser_api.c @@ -5980,7 +5980,7 @@ populate_dot11f_timing_advert_frame(struct mac_context *mac_ctx, if (mac_ctx->mlme_cfg->wmm_params.qos_enabled) frame->Capabilities.qos = 1; - if (mac_ctx->mlme_cfg->scoring.apsd_enabled) + if (mac_ctx->mlme_cfg->roam_scoring.apsd_enabled) frame->Capabilities.apsd = 1; val = mac_ctx->mlme_cfg->feature_flags.enable_block_ack; diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index a95cfae288b0..7bcb0ff0f862 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -3699,12 +3699,13 @@ sme_get_roam_scan_stats(mac_handle_t mac_handle, roam_scan_stats_cb cb, /** * sme_update_score_config() - Update the Scoring Config from MLME * @mac_handle: Mac Handle - * @score_config: Pointer to the scoring config structure to be populated + * @phy_mode: Phymode to be used + * @num_rf_chains: num of RF chains supported by HW * * Return: None */ -void sme_update_score_config(mac_handle_t mac_handle, - struct scoring_config *score_config); +void sme_update_score_config(mac_handle_t mac_handle, eCsrPhyMode phy_mode, + uint8_t num_rf_chains); /** * sme_enable_fw_module_log_level() - enable fw module log level diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index e607403c5b14..e6bce3d5b533 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -62,6 +62,7 @@ #include #include "wlan_crypto_global_api.h" #include "wlan_mlme_ucfg_api.h" +#include "wlan_psoc_mlme_api.h" static QDF_STATUS init_sme_cmd_list(struct mac_context *mac); @@ -2542,7 +2543,7 @@ QDF_STATUS sme_scan_get_result(mac_handle_t mac_handle, uint8_t vdev_id, 0)); status = sme_acquire_global_lock(&mac->sme); if (QDF_IS_STATUS_SUCCESS(status)) { - status = csr_scan_get_result(mac, filter, phResult); + status = csr_scan_get_result(mac, filter, phResult, false); sme_release_global_lock(&mac->sme); } @@ -2632,7 +2633,7 @@ QDF_STATUS sme_get_ap_channel_from_scan_cache( status = sme_acquire_global_lock(&mac_ctx->sme); if (QDF_STATUS_SUCCESS == status) { status = csr_scan_get_result(mac_ctx, scan_filter, - &filtered_scan_result); + &filtered_scan_result, false); if (QDF_STATUS_SUCCESS == status) { csr_get_bssdescr_from_scan_handle(filtered_scan_result, &first_ap_profile); @@ -6804,7 +6805,7 @@ sme_restore_default_roaming_params(struct mac_context *mac, tCsrNeighborRoamControlInfo *roam_info) { roam_info->cfgParams.enable_scoring_for_roam = - mac->mlme_cfg->scoring.enable_scoring_for_roam; + mac->mlme_cfg->roam_scoring.enable_scoring_for_roam; roam_info->cfgParams.emptyScanRefreshPeriod = mac->mlme_cfg->lfr.empty_scan_refresh_period; roam_info->cfgParams.full_roam_scan_period = @@ -13740,7 +13741,8 @@ QDF_STATUS sme_get_rssi_snr_by_bssid(mac_handle_t mac_handle, qdf_mem_copy(scan_filter->bssid_list[0].bytes, bssid, sizeof(struct qdf_mac_addr)); - status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle); + status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle, + false); qdf_mem_free(scan_filter); if (QDF_STATUS_SUCCESS != status) { sme_debug("parse_scan_result failed"); @@ -13804,7 +13806,8 @@ QDF_STATUS sme_get_beacon_frm(mac_handle_t mac_handle, qdf_mem_copy(scan_filter->bssid_list[0].bytes, bssid, sizeof(struct qdf_mac_addr)); - status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle); + status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle, + false); qdf_mem_free(scan_filter); if (QDF_STATUS_SUCCESS != status) { sme_err("parse_scan_result failed"); @@ -15217,86 +15220,66 @@ sme_get_roam_scan_stats(mac_handle_t mac_handle, return status; } -void sme_update_score_config(mac_handle_t mac_handle, - struct scoring_config *score_config) +void sme_update_score_config(mac_handle_t mac_handle, eCsrPhyMode phy_mode, + uint8_t num_rf_chains) { struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle); - struct wlan_mlme_scoring_cfg *mlme_scoring_cfg; + struct wlan_mlme_nss_chains vdev_ini_cfg; + bool bval = false; + uint32_t channel_bonding_mode; + QDF_STATUS status; + struct psoc_phy_config config; - mlme_scoring_cfg = &mac_ctx->mlme_cfg->scoring; + qdf_mem_zero(&vdev_ini_cfg, sizeof(struct wlan_mlme_nss_chains)); + /* Populate the nss chain params from ini for this vdev type */ + sme_populate_nss_chain_params(mac_handle, &vdev_ini_cfg, + QDF_STA_MODE, num_rf_chains); - score_config->weight_cfg.rssi_weightage = - mlme_scoring_cfg->weight_cfg.rssi_weightage; - score_config->weight_cfg.ht_caps_weightage = - mlme_scoring_cfg->weight_cfg.ht_caps_weightage; - score_config->weight_cfg.vht_caps_weightage = - mlme_scoring_cfg->weight_cfg.vht_caps_weightage; - score_config->weight_cfg.he_caps_weightage = - mlme_scoring_cfg->weight_cfg.he_caps_weightage; - score_config->weight_cfg.chan_width_weightage = - mlme_scoring_cfg->weight_cfg.chan_width_weightage; - score_config->weight_cfg.chan_band_weightage = - mlme_scoring_cfg->weight_cfg.chan_band_weightage; - score_config->weight_cfg.nss_weightage = - mlme_scoring_cfg->weight_cfg.nss_weightage; - score_config->weight_cfg.beamforming_cap_weightage = - mlme_scoring_cfg->weight_cfg.beamforming_cap_weightage; - score_config->weight_cfg.pcl_weightage = - mlme_scoring_cfg->weight_cfg.pcl_weightage; - score_config->weight_cfg.channel_congestion_weightage = - mlme_scoring_cfg->weight_cfg.channel_congestion_weightage; - score_config->weight_cfg.oce_wan_weightage = - mlme_scoring_cfg->weight_cfg.oce_wan_weightage; - score_config->weight_cfg.oce_ap_tx_pwr_weightage = - mlme_scoring_cfg->weight_cfg.oce_ap_tx_pwr_weightage; - score_config->weight_cfg.oce_subnet_id_weightage = - mlme_scoring_cfg->weight_cfg.oce_subnet_id_weightage; + config.vdev_nss_24g = vdev_ini_cfg.rx_nss[NSS_CHAINS_BAND_2GHZ]; + config.vdev_nss_5g = vdev_ini_cfg.rx_nss[NSS_CHAINS_BAND_5GHZ]; - score_config->bandwidth_weight_per_index = - mlme_scoring_cfg->bandwidth_weight_per_index; - score_config->nss_weight_per_index = - mlme_scoring_cfg->nss_weight_per_index; - score_config->band_weight_per_index = - mlme_scoring_cfg->band_weight_per_index; + if (phy_mode == eCSR_DOT11_MODE_AUTO || + phy_mode == eCSR_DOT11_MODE_11ax || + phy_mode == eCSR_DOT11_MODE_11ax_ONLY) + config.he_cap = 1; - score_config->rssi_score.best_rssi_threshold = - mlme_scoring_cfg->rssi_score.best_rssi_threshold; - score_config->rssi_score.good_rssi_threshold = - mlme_scoring_cfg->rssi_score.good_rssi_threshold; - score_config->rssi_score.bad_rssi_threshold = - mlme_scoring_cfg->rssi_score.bad_rssi_threshold; - score_config->rssi_score.good_rssi_pcnt = - mlme_scoring_cfg->rssi_score.good_rssi_pcnt; - score_config->rssi_score.bad_rssi_pcnt = - mlme_scoring_cfg->rssi_score.bad_rssi_pcnt; - score_config->rssi_score.good_rssi_bucket_size = - mlme_scoring_cfg->rssi_score.good_rssi_bucket_size; - score_config->rssi_score.bad_rssi_bucket_size = - mlme_scoring_cfg->rssi_score.bad_rssi_bucket_size; - score_config->rssi_score.rssi_pref_5g_rssi_thresh = - mlme_scoring_cfg->rssi_score.rssi_pref_5g_rssi_thresh; + if (config.he_cap || + phy_mode == eCSR_DOT11_MODE_11ac || + phy_mode == eCSR_DOT11_MODE_11ac_ONLY) + config.vht_cap = 1; - score_config->esp_qbss_scoring.num_slot = - mlme_scoring_cfg->esp_qbss_scoring.num_slot; - score_config->esp_qbss_scoring.score_pcnt3_to_0 = - mlme_scoring_cfg->esp_qbss_scoring.score_pcnt3_to_0; - score_config->esp_qbss_scoring.score_pcnt7_to_4 = - mlme_scoring_cfg->esp_qbss_scoring.score_pcnt7_to_4; - score_config->esp_qbss_scoring.score_pcnt11_to_8 = - mlme_scoring_cfg->esp_qbss_scoring.score_pcnt11_to_8; - score_config->esp_qbss_scoring.score_pcnt15_to_12 = - mlme_scoring_cfg->esp_qbss_scoring.score_pcnt15_to_12; + if (config.vht_cap || phy_mode == eCSR_DOT11_MODE_11n || + phy_mode == eCSR_DOT11_MODE_11n_ONLY) + config.ht_cap = 1; - score_config->oce_wan_scoring.num_slot = - mlme_scoring_cfg->oce_wan_scoring.num_slot; - score_config->oce_wan_scoring.score_pcnt3_to_0 = - mlme_scoring_cfg->oce_wan_scoring.score_pcnt3_to_0; - score_config->oce_wan_scoring.score_pcnt7_to_4 = - mlme_scoring_cfg->oce_wan_scoring.score_pcnt7_to_4; - score_config->oce_wan_scoring.score_pcnt11_to_8 = - mlme_scoring_cfg->oce_wan_scoring.score_pcnt11_to_8; - score_config->oce_wan_scoring.score_pcnt15_to_12 = - mlme_scoring_cfg->oce_wan_scoring.score_pcnt15_to_12; + if (!IS_FEATURE_SUPPORTED_BY_FW(DOT11AX)) + config.he_cap = 0; + + if (!IS_FEATURE_SUPPORTED_BY_FW(DOT11AC)) + config.vht_cap = 0; + + status = wlan_mlme_get_vht_for_24ghz(mac_ctx->psoc, &bval); + if (!QDF_IS_STATUS_SUCCESS(status)) + sme_err("Failed to get vht_for_24ghz"); + if (config.vht_cap && bval) + config.vht_24G_cap = 1; + + status = wlan_mlme_get_vht_enable_tx_bf(mac_ctx->psoc, + &bval); + if (!QDF_IS_STATUS_SUCCESS(status)) + sme_err("unable to get vht_enable_tx_bf"); + + if (bval) + config.beamformee_cap = 1; + + ucfg_mlme_get_channel_bonding_24ghz(mac_ctx->psoc, + &channel_bonding_mode); + config.bw_above_20_24ghz = channel_bonding_mode; + ucfg_mlme_get_channel_bonding_5ghz(mac_ctx->psoc, + &channel_bonding_mode); + config.bw_above_20_5ghz = channel_bonding_mode; + + wlan_psoc_set_phy_config(mac_ctx->psoc, &config); } void sme_enable_fw_module_log_level(mac_handle_t mac_handle, int vdev_id) diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 587221329de9..45b6393f3a20 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -25,6 +25,7 @@ #include "wma_types.h" #include "wma_if.h" /* for STA_INVALID_IDX. */ #include "csr_inside_api.h" +#include #include "sme_trace.h" #include "sme_qos_internal.h" #include "sme_inside.h" @@ -70,6 +71,7 @@ #include #include "wlan_pkt_capture_ucfg_api.h" +#include "wlan_psoc_mlme_api.h" #define RSN_AUTH_KEY_MGMT_SAE WLAN_RSN_SEL(WLAN_AKM_SAE) #define MAX_PWR_FCC_CHAN_12 8 @@ -8346,7 +8348,8 @@ QDF_STATUS csr_roam_connect(struct mac_context *mac, uint32_t sessionId, qdf_mem_free(filter); goto error; } - status = csr_scan_get_result(mac, filter, &hBSSList); + status = csr_scan_get_result(mac, filter, &hBSSList, + opmode == QDF_STA_MODE ? true : false); qdf_mem_free(filter); csr_roam_print_candidate_aps(hBSSList); if (QDF_IS_STATUS_SUCCESS(status)) { @@ -9766,7 +9769,7 @@ csr_check_profile_in_scan_cache(struct mac_context *mac_ctx, qdf_mem_free(scan_filter); return false; } - status = csr_scan_get_result(mac_ctx, scan_filter, hBSSList); + status = csr_scan_get_result(mac_ctx, scan_filter, hBSSList, true); qdf_mem_free(scan_filter); if (!QDF_IS_STATUS_SUCCESS(status)) { sme_err( @@ -10653,53 +10656,6 @@ static void csr_copy_ssids_from_profile(tCsrSSIDs *ssid_list, &ssid_list->SSIDList[i].SSID); } -#ifdef WLAN_ADAPTIVE_11R -static void -csr_update_adaptive_11r_scan_filter(struct mac_context *mac_ctx, - struct scan_filter *filter) -{ - filter->enable_adaptive_11r = - mac_ctx->mlme_cfg->lfr.enable_adaptive_11r; -} -#else -static inline void -csr_update_adaptive_11r_scan_filter(struct mac_context *mac_ctx, - struct scan_filter *filter) -{ - filter->enable_adaptive_11r = false; -} -#endif - -void csr_update_connect_n_roam_cmn_filter(struct mac_context *mac_ctx, - struct scan_filter *filter, - enum QDF_OPMODE opmode) -{ - enum policy_mgr_con_mode pm_mode; - uint32_t num_entries = 0, pcl_freq_list[NUM_CHANNELS] = {0}; - QDF_STATUS status; - - /* enable bss scoring for only STA mode */ - if (opmode == QDF_STA_MODE) - filter->bss_scoring_required = true; - - csr_update_adaptive_11r_scan_filter(mac_ctx, filter); - - if (filter->num_of_bssid) - return; - - if (policy_mgr_map_concurrency_mode(&opmode, &pm_mode)) { - status = policy_mgr_get_pcl(mac_ctx->psoc, pm_mode, - pcl_freq_list, &num_entries, - filter->pcl_weight_list, - NUM_CHANNELS); - if (QDF_IS_STATUS_ERROR(status)) - return; - qdf_mem_copy(filter->pcl_freq_list, pcl_freq_list, - num_entries * sizeof(pcl_freq_list[0])); - filter->num_of_pcl_channels = num_entries; - } -} - #ifdef FEATURE_WLAN_WAPI /** * csr_update_phy_mode: Updates phy mode for wapi @@ -10933,8 +10889,7 @@ csr_roam_get_scan_filter_from_profile(struct mac_context *mac_ctx, csr_update_fils_scan_filter(filter, profile); - csr_update_connect_n_roam_cmn_filter(mac_ctx, filter, - profile->csrPersona); + csr_update_adaptive_11r_scan_filter(mac_ctx, filter); return QDF_STATUS_SUCCESS; } @@ -18307,17 +18262,27 @@ static void csr_update_score_params(struct mac_context *mac_ctx, tpCsrNeighborRoamControlInfo roam_info) { struct scoring_param *req_score_params; - struct rssi_scoring *req_rssi_score; - struct wlan_mlme_scoring_cfg *bss_score_params; - struct wlan_mlme_weight_config *weight_config; - struct wlan_mlme_rssi_cfg_score *rssi_score; + struct rssi_config_score *req_rssi_score; + struct wlan_mlme_roam_scoring_cfg *roam_score_params; + struct weight_cfg *weight_config; + struct rssi_config_score *rssi_score; + struct psoc_mlme_obj *mlme_psoc_obj; + struct per_slot_score *esp_qbss_scoring; + struct per_slot_score *oce_wan_scoring; + + mlme_psoc_obj = wlan_psoc_mlme_get_cmpt_obj(mac_ctx->psoc); + + if (!mlme_psoc_obj) + return; req_score_params = &req_buffer->score_params; req_rssi_score = &req_score_params->rssi_scoring; - bss_score_params = &mac_ctx->mlme_cfg->scoring; - weight_config = &bss_score_params->weight_cfg; - rssi_score = &bss_score_params->rssi_score; + roam_score_params = &mac_ctx->mlme_cfg->roam_scoring; + weight_config = &mlme_psoc_obj->score_config.weight_config; + rssi_score = &mlme_psoc_obj->score_config.rssi_score; + esp_qbss_scoring = &mlme_psoc_obj->score_config.esp_qbss_scoring; + oce_wan_scoring = &mlme_psoc_obj->score_config.oce_wan_scoring; if (!roam_info->cfgParams.enable_scoring_for_roam) req_score_params->disable_bitmap = @@ -18343,52 +18308,54 @@ static void csr_update_score_params(struct mac_context *mac_ctx, weight_config->oce_subnet_id_weightage; req_score_params->bw_index_score = - bss_score_params->bandwidth_weight_per_index; + mlme_psoc_obj->score_config.bandwidth_weight_per_index; req_score_params->band_index_score = - bss_score_params->band_weight_per_index; + mlme_psoc_obj->score_config.band_weight_per_index; req_score_params->nss_index_score = - bss_score_params->nss_weight_per_index; + mlme_psoc_obj->score_config.nss_weight_per_index; req_score_params->vendor_roam_score_algorithm = - bss_score_params->vendor_roam_score_algorithm; + roam_score_params->vendor_roam_score_algorithm; - req_score_params->roam_score_delta = bss_score_params->roam_score_delta; + req_score_params->roam_score_delta = + roam_score_params->roam_score_delta; req_score_params->roam_trigger_bitmap = - bss_score_params->roam_trigger_bitmap; + roam_score_params->roam_trigger_bitmap; req_rssi_score->best_rssi_threshold = rssi_score->best_rssi_threshold; req_rssi_score->good_rssi_threshold = rssi_score->good_rssi_threshold; req_rssi_score->bad_rssi_threshold = rssi_score->bad_rssi_threshold; req_rssi_score->good_rssi_pcnt = rssi_score->good_rssi_pcnt; req_rssi_score->bad_rssi_pcnt = rssi_score->bad_rssi_pcnt; - req_rssi_score->good_bucket_size = rssi_score->good_rssi_bucket_size; - req_rssi_score->bad_bucket_size = rssi_score->bad_rssi_bucket_size; + req_rssi_score->good_rssi_bucket_size = + rssi_score->good_rssi_bucket_size; + req_rssi_score->bad_rssi_bucket_size = rssi_score->bad_rssi_bucket_size; req_rssi_score->rssi_pref_5g_rssi_thresh = rssi_score->rssi_pref_5g_rssi_thresh; req_score_params->esp_qbss_scoring.num_slot = - bss_score_params->esp_qbss_scoring.num_slot; + esp_qbss_scoring->num_slot; req_score_params->esp_qbss_scoring.score_pcnt3_to_0 = - bss_score_params->esp_qbss_scoring.score_pcnt3_to_0; + esp_qbss_scoring->score_pcnt3_to_0; req_score_params->esp_qbss_scoring.score_pcnt7_to_4 = - bss_score_params->esp_qbss_scoring.score_pcnt7_to_4; + esp_qbss_scoring->score_pcnt7_to_4; req_score_params->esp_qbss_scoring.score_pcnt11_to_8 = - bss_score_params->esp_qbss_scoring.score_pcnt11_to_8; + esp_qbss_scoring->score_pcnt11_to_8; req_score_params->esp_qbss_scoring.score_pcnt15_to_12 = - bss_score_params->esp_qbss_scoring.score_pcnt15_to_12; + esp_qbss_scoring->score_pcnt15_to_12; req_score_params->oce_wan_scoring.num_slot = - bss_score_params->oce_wan_scoring.num_slot; + oce_wan_scoring->num_slot; req_score_params->oce_wan_scoring.score_pcnt3_to_0 = - bss_score_params->oce_wan_scoring.score_pcnt3_to_0; + oce_wan_scoring->score_pcnt3_to_0; req_score_params->oce_wan_scoring.score_pcnt7_to_4 = - bss_score_params->oce_wan_scoring.score_pcnt7_to_4; + oce_wan_scoring->score_pcnt7_to_4; req_score_params->oce_wan_scoring.score_pcnt11_to_8 = - bss_score_params->oce_wan_scoring.score_pcnt11_to_8; + oce_wan_scoring->score_pcnt11_to_8; req_score_params->oce_wan_scoring.score_pcnt15_to_12 = - bss_score_params->oce_wan_scoring.score_pcnt15_to_12; + oce_wan_scoring->score_pcnt15_to_12; req_score_params->cand_min_roam_score_delta = - bss_score_params->min_roam_score_delta; + roam_score_params->min_roam_score_delta; } uint8_t csr_get_roam_enabled_sta_sessionid(struct mac_context *mac_ctx) diff --git a/core/sme/src/csr/csr_api_scan.c b/core/sme/src/csr/csr_api_scan.c index ecf2078c32cf..42a3fa213efc 100644 --- a/core/sme/src/csr/csr_api_scan.c +++ b/core/sme/src/csr/csr_api_scan.c @@ -53,6 +53,7 @@ #include "qdf_crypto.h" #include #include "wlan_reg_ucfg_api.h" +#include "wlan_cm_bss_score_param.h" static void csr_set_cfg_valid_channel_list(struct mac_context *mac, uint32_t *pchan_freq_list, @@ -163,7 +164,7 @@ QDF_STATUS csr_scan_handle_search_for_ssid(struct mac_context *mac_ctx, qdf_mem_free(filter); break; } - status = csr_scan_get_result(mac_ctx, filter, &hBSSList); + status = csr_scan_get_result(mac_ctx, filter, &hBSSList, true); qdf_mem_free(filter); if (!QDF_IS_STATUS_SUCCESS(status)) break; @@ -2423,9 +2424,52 @@ static void csr_remove_ap_with_assoc_disallowed(struct mac_context *mac_ctx, } } +static void csr_get_pcl_chan_weigtage_for_sta(struct mac_context *mac_ctx, + struct pcl_freq_weight_list *pcl_lst) +{ + enum QDF_OPMODE opmode = QDF_STA_MODE; + enum policy_mgr_con_mode pm_mode; + uint32_t num_entries = 0; + QDF_STATUS status; + + if (!pcl_lst) + return; + + if (policy_mgr_map_concurrency_mode(&opmode, &pm_mode)) { + status = policy_mgr_get_pcl(mac_ctx->psoc, pm_mode, + pcl_lst->pcl_freq_list, + &num_entries, + pcl_lst->pcl_weight_list, + NUM_CHANNELS); + if (QDF_IS_STATUS_ERROR(status)) + return; + pcl_lst->num_of_pcl_channels = num_entries; + } +} + +static void csr_calculate_scores(struct mac_context *mac_ctx, + struct scan_filter *filter, qdf_list_t *list) +{ + struct pcl_freq_weight_list *pcl_lst = NULL; + + if (!filter->num_of_bssid) { + pcl_lst = qdf_mem_malloc(sizeof(*pcl_lst)); + csr_get_pcl_chan_weigtage_for_sta(mac_ctx, pcl_lst); + if (pcl_lst && !pcl_lst->num_of_pcl_channels) { + qdf_mem_free(pcl_lst); + pcl_lst = NULL; + } + } + wlan_cm_calculate_bss_score(mac_ctx->psoc, pcl_lst, list, + &filter->bssid_hint); + if (pcl_lst) + qdf_mem_free(pcl_lst); +} + QDF_STATUS csr_scan_get_result(struct mac_context *mac_ctx, struct scan_filter *filter, - tScanResultHandle *results) + tScanResultHandle *results, + bool scoring_required) { QDF_STATUS status; struct scan_result_list *ret_list = NULL; @@ -2449,9 +2493,11 @@ QDF_STATUS csr_scan_get_result(struct mac_context *mac_ctx, sme_debug("num_entries %d", num_bss); } - /* Filter the scan list with the blacklist, rssi reject, avoided APs */ - if (filter && filter->bss_scoring_required) + if (num_bss && filter && scoring_required) { + csr_calculate_scores(mac_ctx, filter, list); + /* Filter the blacklisted APs and avoided APs */ wlan_blm_filter_bssid(pdev, list); + } if (!list || (list && !qdf_list_size(list))) { sme_debug("scan list empty"); @@ -2475,7 +2521,7 @@ QDF_STATUS csr_scan_get_result(struct mac_context *mac_ctx, /* Fail or No one wants the result. */ csr_scan_result_purge(mac_ctx, (tScanResultHandle) ret_list); else { - if (filter && filter->bss_scoring_required) + if (scoring_required) csr_remove_ap_with_assoc_disallowed(mac_ctx, ret_list); if (!csr_ll_count(&ret_list->List)) { @@ -2529,7 +2575,7 @@ QDF_STATUS csr_scan_get_result_for_bssid(struct mac_context *mac_ctx, QDF_MAC_ADDR_SIZE); status = csr_scan_get_result(mac_ctx, scan_filter, - &filtered_scan_result); + &filtered_scan_result, false); if (!QDF_IS_STATUS_SUCCESS(status)) { sme_err("Failed to get scan result"); diff --git a/core/sme/src/csr/csr_host_scan_roam.c b/core/sme/src/csr/csr_host_scan_roam.c index 6655425fb700..4c6b6f10e54c 100644 --- a/core/sme/src/csr/csr_host_scan_roam.c +++ b/core/sme/src/csr/csr_host_scan_roam.c @@ -377,7 +377,7 @@ QDF_STATUS csr_neighbor_roam_process_scan_complete(struct mac_context *mac, qdf_mem_free(filter); return QDF_STATUS_E_FAILURE; } - hstatus = csr_scan_get_result(mac, filter, &scanResult); + hstatus = csr_scan_get_result(mac, filter, &scanResult, true); qdf_mem_free(filter); if (hstatus != QDF_STATUS_SUCCESS) sme_err("Get Scan Result status code %d", hstatus); diff --git a/core/sme/src/csr/csr_inside_api.h b/core/sme/src/csr/csr_inside_api.h index 909a46e21281..f4795329f1da 100644 --- a/core/sme/src/csr/csr_inside_api.h +++ b/core/sme/src/csr/csr_inside_api.h @@ -394,17 +394,29 @@ enum csr_cfgdot11mode csr_find_best_phy_mode(struct mac_context *mac, void csr_copy_ssids_from_roam_params(struct roam_ext_params *roam_params, struct scan_filter *filter); +#ifdef WLAN_ADAPTIVE_11R /* - * csr_update_connect_n_roam_cmn_filter() - update common scan filter - * @mac_ctx: pointer to mac context + * csr_update_adaptive_11r_scan_filter() - fill adaptive 11r support in filter + * @mac_ctx: mac ctx * @filter: scan filter - * @opmode: opmode * * Return void */ -void csr_update_connect_n_roam_cmn_filter(struct mac_context *mac_ctx, - struct scan_filter *filter, - enum QDF_OPMODE opmode); +static inline void +csr_update_adaptive_11r_scan_filter(struct mac_context *mac_ctx, + struct scan_filter *filter) +{ + filter->enable_adaptive_11r = + mac_ctx->mlme_cfg->lfr.enable_adaptive_11r; +} +#else +static inline void +csr_update_adaptive_11r_scan_filter(struct mac_context *mac_ctx, + struct scan_filter *filter) +{ + filter->enable_adaptive_11r = false; +} +#endif /* * csr_covert_enc_type_new() - convert csr enc type to wlan enc type @@ -462,12 +474,14 @@ csr_neighbor_roam_get_scan_filter_from_profile(struct mac_context *mac, * @mac: Pointer to Global MAC structure * @filter: If pFilter is NULL, all cached results are returned * @phResult: an object for the result. + * @scoring_required: if scoding is required for AP * * Return QDF_STATUS */ QDF_STATUS csr_scan_get_result(struct mac_context *mac, struct scan_filter *filter, - tScanResultHandle *phResult); + tScanResultHandle *phResult, + bool scoring_required); /** * csr_scan_get_result_for_bssid - gets the scan result from scan cache for the diff --git a/core/sme/src/csr/csr_neighbor_roam.c b/core/sme/src/csr/csr_neighbor_roam.c index 769be0298c40..c2a786b8986c 100644 --- a/core/sme/src/csr/csr_neighbor_roam.c +++ b/core/sme/src/csr/csr_neighbor_roam.c @@ -350,7 +350,6 @@ csr_neighbor_roam_get_scan_filter_from_profile(struct mac_context *mac, struct roam_ext_params *roam_params; tCsrChannelInfo *chan_info; uint8_t num_ch = 0; - enum QDF_OPMODE opmode = QDF_STA_MODE; if (!filter) return QDF_STATUS_E_FAILURE; @@ -425,7 +424,7 @@ csr_neighbor_roam_get_scan_filter_from_profile(struct mac_context *mac, csr_update_pmf_cap_from_connected_profile(profile, filter); - csr_update_connect_n_roam_cmn_filter(mac, filter, opmode); + csr_update_adaptive_11r_scan_filter(mac, filter); return QDF_STATUS_SUCCESS; } @@ -1080,7 +1079,7 @@ QDF_STATUS csr_neighbor_roam_init(struct mac_context *mac, uint8_t sessionId) pNeighborRoamInfo->cfgParams.full_roam_scan_period = mac->mlme_cfg->lfr.roam_full_scan_period; pNeighborRoamInfo->cfgParams.enable_scoring_for_roam = - mac->mlme_cfg->scoring.enable_scoring_for_roam; + mac->mlme_cfg->roam_scoring.enable_scoring_for_roam; pNeighborRoamInfo->cfgParams.roam_scan_n_probes = mac->mlme_cfg->lfr.roam_scan_n_probes; pNeighborRoamInfo->cfgParams.roam_scan_home_away_time = @@ -1365,7 +1364,7 @@ static QDF_STATUS csr_neighbor_roam_process_handoff_req( session_id); sme_debug("Filter creation status: %d", status); status = csr_scan_get_result(mac_ctx, scan_filter, - &scan_result); + &scan_result, true); qdf_mem_free(scan_filter); csr_neighbor_roam_process_scan_results(mac_ctx, session_id, &scan_result); diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 253b79492448..bf031286fa1a 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -3953,7 +3953,7 @@ QDF_STATUS wma_roam_scan_fill_self_caps(tp_wma_handle wma_handle, if (mac->mlme_cfg->wmm_params.qos_enabled) selfCaps.qos = 1; - if (mac->mlme_cfg->scoring.apsd_enabled) + if (mac->mlme_cfg->roam_scoring.apsd_enabled) selfCaps.apsd = 1; selfCaps.rrm = mac->rrm.rrmConfig.rrm_enabled;