qcacmn: Update BSS score calculation based on Security Profile

Update BSS score calculation to consider security profile.

Change-Id: I120774ce2472442ebba15e098b4089f8a17cbfc5
CRs-Fixed: 3782206
This commit is contained in:
Srikanth Marepalli 2023-10-31 23:53:59 +05:30 • committed by Ravindra Konda
commit 4afab6c41d
2 changed files with 113 additions and 7 deletions

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. 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
@ -82,6 +82,7 @@
#define CM_CHAN_WIDTH_WEIGHTAGE 12
#define CM_CHAN_BAND_WEIGHTAGE 2
#define CM_NSS_WEIGHTAGE 16
#define CM_SECURITY_WEIGHTAGE 4
#define CM_BEAMFORMING_CAP_WEIGHTAGE 2
#define CM_PCL_WEIGHT 10
#define CM_CHANNEL_CONGESTION_WEIGHTAGE 5
@ -93,6 +94,21 @@
#define CM_MAX_PCT_SCORE 100
#define CM_MAX_INDEX_PER_INI 4
/**
* This macro give percentage value of security_weightage to be used as per
* security Eg if AP security is WPA 10% will be given for AP.
*
* Indexes are defined in this way.
* 0 Index (BITS 0-7): WPA - Def 25%
* 1 Index (BITS 8-15): WPA2- Def 50%
* 2 Index (BITS 16-23): WPA3- Def 100%
* 3 Index (BITS 24-31): reserved
*
* if AP security is Open/WEP 0% will be given for AP
* These percentage values are stored in HEX. For any index max value, can be 64
*/
#define CM_SECURITY_INDEX_WEIGHTAGE 0x00643219
#define CM_BEST_CANDIDATE_MAX_BSS_SCORE (CM_BEST_CANDIDATE_MAX_WEIGHT * 100)
#define CM_AVOID_CANDIDATE_MIN_SCORE 1
@ -535,6 +551,68 @@ static int32_t cm_calculate_nss_score(struct wlan_objmgr_psoc *psoc,
prorated_pct) / CM_MAX_PCT_SCORE;
}
static int32_t cm_calculate_security_score(struct scoring_cfg *score_config,
struct security_info neg_sec_info)
{
uint32_t authmode, key_mgmt, ucastcipherset;
uint8_t score_pct = 0;
authmode = neg_sec_info.authmodeset;
key_mgmt = neg_sec_info.key_mgmt;
ucastcipherset = neg_sec_info.ucastcipherset;
if (QDF_HAS_PARAM(authmode, WLAN_CRYPTO_AUTH_FILS_SK) ||
QDF_HAS_PARAM(authmode, WLAN_CRYPTO_AUTH_SAE) ||
QDF_HAS_PARAM(authmode, WLAN_CRYPTO_AUTH_CCKM) ||
QDF_HAS_PARAM(authmode, WLAN_CRYPTO_AUTH_RSNA) ||
QDF_HAS_PARAM(authmode, WLAN_CRYPTO_AUTH_8021X)) {
if (QDF_HAS_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_SAE) ||
QDF_HAS_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_FT_SAE) ||
QDF_HAS_PARAM(key_mgmt,
WLAN_CRYPTO_KEY_MGMT_IEEE8021X_SUITE_B) ||
QDF_HAS_PARAM(key_mgmt,
WLAN_CRYPTO_KEY_MGMT_IEEE8021X_SUITE_B_192) ||
QDF_HAS_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_FILS_SHA256) ||
QDF_HAS_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_FILS_SHA384) ||
QDF_HAS_PARAM(key_mgmt,
WLAN_CRYPTO_KEY_MGMT_FT_FILS_SHA256) ||
QDF_HAS_PARAM(key_mgmt,
WLAN_CRYPTO_KEY_MGMT_FT_FILS_SHA384) ||
QDF_HAS_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_OWE) ||
QDF_HAS_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_DPP) ||
QDF_HAS_PARAM(key_mgmt,
WLAN_CRYPTO_KEY_MGMT_FT_IEEE8021X_SHA384)) {
/*If security is WPA3, consider score_pct = 100%*/
score_pct = CM_GET_SCORE_PERCENTAGE(
score_config->security_weight_per_index,
CM_SECURITY_WPA3_INDEX);
} else if (QDF_HAS_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_PSK) ||
QDF_HAS_PARAM(key_mgmt,
WLAN_CRYPTO_KEY_MGMT_FT_IEEE8021X) ||
QDF_HAS_PARAM(key_mgmt,
WLAN_CRYPTO_KEY_MGMT_FT_PSK) ||
QDF_HAS_PARAM(key_mgmt,
WLAN_CRYPTO_KEY_MGMT_IEEE8021X_SHA256) ||
QDF_HAS_PARAM(key_mgmt,
WLAN_CRYPTO_KEY_MGMT_PSK_SHA256)) {
/*If security is WPA2, consider score_pct = 50%*/
score_pct = CM_GET_SCORE_PERCENTAGE(
score_config->security_weight_per_index,
CM_SECURITY_WPA2_INDEX);
}
} else if (QDF_HAS_PARAM(authmode, WLAN_CRYPTO_AUTH_SHARED) ||
QDF_HAS_PARAM(authmode, WLAN_CRYPTO_AUTH_WPA) ||
QDF_HAS_PARAM(authmode, WLAN_CRYPTO_AUTH_WAPI)) {
/*If security is WPA, consider score_pct = 25%*/
score_pct = CM_GET_SCORE_PERCENTAGE(
score_config->security_weight_per_index,
CM_SECURITY_WPA_INDEX);
}
return (score_config->weight_config.security_weightage * score_pct) /
CM_MAX_PCT_SCORE;
}
#ifdef WLAN_POLICY_MGR_ENABLE
static uint32_t cm_get_sta_nss(struct wlan_objmgr_psoc *psoc,
qdf_freq_t bss_channel_freq,
@ -1401,6 +1479,7 @@ static int cm_calculate_bss_score(struct wlan_objmgr_psoc *psoc,
int32_t beamformee_score = 0;
int32_t band_score = 0;
int32_t nss_score = 0;
int32_t security_score = 0;
int32_t congestion_score = 0;
int32_t congestion_pct = 0;
int32_t oce_wan_score = 0;
@ -1581,7 +1660,16 @@ static int cm_calculate_bss_score(struct wlan_objmgr_psoc *psoc,
prorated_pcnt, sta_nss);
score += nss_score;
mlme_nofl_debug("Candidate("QDF_MAC_ADDR_FMT" freq %d): rssi %d HT %d VHT %d HE %d su bfer %d phy %d air time frac %d qbss %d cong_pct %d NSS %d ap_tx_pwr_dbm %d oce_subnet_id_present %d sae_pk_cap_present %d prorated_pcnt %d",
/*
* Since older FW will stick to the single AKM for roaming,
* no need to check the fw capability.
*/
security_score = cm_calculate_security_score(score_config,
entry->neg_sec_info);
score += security_score;
mlme_nofl_debug("Candidate("QDF_MAC_ADDR_FMT" freq %d): rssi %d HT %d VHT %d HE %d su bfer %d phy %d air time frac %d qbss %d cong_pct %d NSS %d ap_tx_pwr_dbm %d oce_subnet_id_present %d sae_pk_cap_present %d prorated_pcnt %d keymgmt 0x%x",
QDF_MAC_ADDR_REF(entry->bssid.bytes),
entry->channel.chan_freq,
entry->rssi_raw, util_scan_entry_htcap(entry) ? 1 : 0,
@ -1590,14 +1678,15 @@ static int cm_calculate_bss_score(struct wlan_objmgr_psoc *psoc,
entry->phy_mode, entry->air_time_fraction,
entry->qbss_chan_load, congestion_pct, entry->nss,
ap_tx_pwr_dbm, oce_subnet_id_present,
sae_pk_cap_present, prorated_pcnt);
sae_pk_cap_present, prorated_pcnt,
entry->neg_sec_info.key_mgmt);
mlme_nofl_debug("Scores: rssi %d pcl %d ht %d vht %d he %d bfee %d bw %d band %d congestion %d nss %d oce wan %d oce ap tx pwr %d subnet %d sae_pk %d TOTAL %d",
mlme_nofl_debug("Scores: rssi %d pcl %d ht %d vht %d he %d bfee %d bw %d band %d congestion %d nss %d oce wan %d oce ap tx pwr %d subnet %d sae_pk %d security %d TOTAL %d",
rssi_score, pcl_score, ht_score,
vht_score, he_score, beamformee_score, bandwidth_score,
band_score, congestion_score, nss_score, oce_wan_score,
oce_ap_tx_pwr_score, oce_subnet_id_score,
sae_pk_score, score);
sae_pk_score, security_score, score);
entry->bss_score = score;
@ -2019,6 +2108,7 @@ void wlan_cm_init_score_config(struct wlan_objmgr_psoc *psoc,
cfg_get(psoc, CFG_OCE_SUBNET_ID_WEIGHTAGE);
score_cfg->weight_config.sae_pk_ap_weightage =
cfg_get(psoc, CFG_SAE_PK_AP_WEIGHTAGE);
score_cfg->weight_config.security_weightage = CM_SECURITY_WEIGHTAGE;
total_weight = score_cfg->weight_config.rssi_weightage +
score_cfg->weight_config.ht_caps_weightage +
@ -2033,7 +2123,8 @@ void wlan_cm_init_score_config(struct wlan_objmgr_psoc *psoc,
score_cfg->weight_config.oce_wan_weightage +
score_cfg->weight_config.oce_ap_tx_pwr_weightage +
score_cfg->weight_config.oce_subnet_id_weightage +
score_cfg->weight_config.sae_pk_ap_weightage;
score_cfg->weight_config.sae_pk_ap_weightage +
score_cfg->weight_config.security_weightage;
/*
* If configured weights are greater than max weight,
@ -2134,4 +2225,5 @@ void wlan_cm_init_score_config(struct wlan_objmgr_psoc *psoc,
cfg_get(psoc, CFG_VENDOR_ROAM_SCORE_ALGORITHM);
score_cfg->check_assoc_disallowed = true;
cm_fill_6ghz_params(psoc, score_cfg);
score_cfg->security_weight_per_index = CM_SECURITY_INDEX_WEIGHTAGE;
}

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2023-2024 Qualcomm Innovation Center, Inc. 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
@ -41,6 +41,7 @@
* @oce_ap_tx_pwr_weightage: OCE AP tx power weigtage
* @oce_subnet_id_weightage: OCE subnet id weigtage
* @sae_pk_ap_weightage: SAE-PK AP weigtage
* @security_weightage: Security weightage
*/
struct weight_cfg {
uint8_t rssi_weightage;
@ -57,6 +58,7 @@ struct weight_cfg {
uint8_t oce_ap_tx_pwr_weightage;
uint8_t oce_subnet_id_weightage;
uint8_t sae_pk_ap_weightage;
uint8_t security_weightage;
};
/**
@ -132,6 +134,8 @@ struct per_slot_score {
* @check_6ghz_security: check security for 6Ghz candidate
* @standard_6ghz_conn_policy: check for 6 GHz standard connection policy
* @key_mgmt_mask_6ghz: user configurable mask for 6ghz AKM
* @roam_tgt_score_cap: Roam score capability
* @security_weight_per_index: security weight per index
*/
struct scoring_cfg {
struct weight_cfg weight_config;
@ -147,6 +151,8 @@ struct scoring_cfg {
uint8_t check_6ghz_security;
uint8_t standard_6ghz_conn_policy:1;
uint32_t key_mgmt_mask_6ghz;
uint32_t roam_tgt_score_cap;
uint32_t security_weight_per_index;
};
/**
@ -207,6 +213,14 @@ wlan_blacklist_action_on_bssid(struct wlan_objmgr_pdev *pdev,
}
#endif
enum cm_security_idx {
CM_SECURITY_WPA_INDEX,
CM_SECURITY_WPA2_INDEX,
CM_SECURITY_WPA3_INDEX,
CM_SECURITY_WPA_OPEN_WEP_INDEX,
CM_MAX_SECURITY_INDEX
};
/**
* wlan_cm_calculate_bss_score() - calculate bss score for the scan list
* @pdev: pointer to pdev object