Merge tag 'LA.UM.9.14.r1-21600-LAHAINA.QSSI14.0' of https://git.codelinaro.org/clo/la/platform/vendor/qcom-opensource/wlan/qca-wifi-host-cmn into android13-5.4-lahaina

"LA.UM.9.14.r1-21600-LAHAINA.QSSI14.0"

* tag 'LA.UM.9.14.r1-21600-LAHAINA.QSSI14.0' of https://git.codelinaro.org/clo/la/platform/vendor/qcom-opensource/wlan/qca-wifi-host-cmn:
  qcacmn: Add new INI to separate scan policy for rest of world users
  qcacmn: Fix OOB in util_gen_new_ie
  qcacmn: Fix out-of-bounds of src_freq
  qcacmn: Fix 6 GHz bss HE capable beamformee score
  qcacmn: Send driver disconnect internal reason code to user space

Change-Id: Ie83ace9a22b421c8e2866173c8334e92cbba87cc
This commit is contained in:
Michael Bestas 2023-06-08 11:42:45 +03:00
commit 723a2cf1ee
No known key found for this signature in database
GPG key ID: CC95044519BE6669
7 changed files with 96 additions and 7 deletions

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2022-2023 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
@ -140,6 +141,8 @@
* MBSSID TX VDEV status index
* @QCA_NL80211_VENDOR_SUBCMD_CONFIG_TWT_INDEX: TWT config index
* @QCA_NL80211_VENDOR_SUBCMD_PEER_CFR_CAPTURE_CFG_INDEX: CFR data event index
* @QCA_NL80211_VENDOR_SUBCMD_DRIVER_DISCONNECT_REASON_INDEX:
* Driver disconnect reason index
*/
enum qca_nl80211_vendor_subcmds_index {
@ -232,6 +235,7 @@ enum qca_nl80211_vendor_subcmds_index {
QCA_NL80211_VENDOR_SUBCMD_UPDATE_SSID_INDEX,
QCA_NL80211_VENDOR_SUBCMD_WIFI_FW_STATS_INDEX,
QCA_NL80211_VENDOR_SUBCMD_MBSSID_TX_VDEV_STATUS_INDEX,
QCA_NL80211_VENDOR_SUBCMD_DRIVER_DISCONNECT_REASON_INDEX,
#ifdef WLAN_SUPPORT_TWT
QCA_NL80211_VENDOR_SUBCMD_CONFIG_TWT_INDEX,
#endif

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 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
@ -1400,11 +1400,16 @@ struct wlan_ie_vhtop {
uint16_t vhtop_basic_mcs_set;
} qdf_packed;
#define WLAN_HE_PHYCAP_SU_BFER_OFFSET 3
#define WLAN_HE_PHYCAP_SU_BFER_IDX 7
#define WLAN_HE_PHYCAP_SU_BFER_BITS 1
#define WLAN_HE_PHYCAP_160_SUPPORT BIT(2)
#define WLAN_HE_PHYCAP_80_80_SUPPORT BIT(3)
#define WLAN_HE_MACCAP_LEN 6
#define WLAN_HE_PHYCAP_LEN 11
#define WLAN_HE_MAX_MCS_MAPS 3
/**
* struct wlan_ie_hecaps - HT capabilities
* @elem_id: HE caps IE

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2022-2023 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
@ -1416,6 +1417,7 @@ static int cm_calculate_bss_score(struct wlan_objmgr_psoc *psoc,
bool same_bucket = false;
bool ap_su_beam_former = false;
struct wlan_ie_vhtcaps *vht_cap;
struct wlan_ie_hecaps *he_cap;
struct scoring_cfg *score_config;
struct weight_cfg *weight_config;
uint32_t sta_nss;
@ -1504,8 +1506,17 @@ static int cm_calculate_bss_score(struct wlan_objmgr_psoc *psoc,
score_config->rssi_score.bad_rssi_bucket_size);
vht_cap = (struct wlan_ie_vhtcaps *)util_scan_entry_vhtcap(entry);
if (vht_cap && vht_cap->su_beam_former)
he_cap = (struct wlan_ie_hecaps *)util_scan_entry_hecap(entry);
if (vht_cap && vht_cap->su_beam_former) {
ap_su_beam_former = true;
} else if (he_cap && QDF_GET_BITS(*(he_cap->he_phy_cap.phy_cap_bytes +
WLAN_HE_PHYCAP_SU_BFER_OFFSET), WLAN_HE_PHYCAP_SU_BFER_IDX,
WLAN_HE_PHYCAP_SU_BFER_BITS)) {
ap_su_beam_former = true;
}
if (phy_config->beamformee_cap && is_vht &&
ap_su_beam_former &&
(entry->rssi_raw > rssi_pref_5g_rssi_thresh) && !same_bucket)
@ -1897,6 +1908,30 @@ bool wlan_cm_get_check_6ghz_security(struct wlan_objmgr_psoc *psoc)
return mlme_psoc_obj->psoc_cfg.score_config.check_6ghz_security;
}
void wlan_cm_set_standard_6ghz_conn_policy(struct wlan_objmgr_psoc *psoc,
bool value)
{
struct psoc_mlme_obj *mlme_psoc_obj;
mlme_psoc_obj = wlan_psoc_mlme_get_cmpt_obj(psoc);
if (!mlme_psoc_obj)
return;
mlme_debug("6ghz standard connection policy val %x", value);
mlme_psoc_obj->psoc_cfg.score_config.standard_6ghz_conn_policy = value;
}
bool wlan_cm_get_standard_6ghz_conn_policy(struct wlan_objmgr_psoc *psoc)
{
struct psoc_mlme_obj *mlme_psoc_obj;
mlme_psoc_obj = wlan_psoc_mlme_get_cmpt_obj(psoc);
if (!mlme_psoc_obj)
return false;
return mlme_psoc_obj->psoc_cfg.score_config.standard_6ghz_conn_policy;
}
void wlan_cm_set_6ghz_key_mgmt_mask(struct wlan_objmgr_psoc *psoc,
uint32_t value)
{

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2023 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
@ -129,6 +130,7 @@ struct per_slot_score {
* @check_assoc_disallowed: Should assoc be disallowed if MBO OCE IE indicate so
* @vendor_roam_score_algorithm: Preferred ETP vendor roam score algorithm
* @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
*/
struct scoring_cfg {
@ -143,6 +145,7 @@ struct scoring_cfg {
bool check_assoc_disallowed;
bool vendor_roam_score_algorithm;
uint8_t check_6ghz_security;
uint8_t standard_6ghz_conn_policy:1;
uint32_t key_mgmt_mask_6ghz;
};
@ -291,6 +294,18 @@ void wlan_cm_set_6ghz_key_mgmt_mask(struct wlan_objmgr_psoc *psoc,
*/
uint32_t wlan_cm_get_6ghz_key_mgmt_mask(struct wlan_objmgr_psoc *psoc);
void wlan_cm_set_standard_6ghz_conn_policy(struct wlan_objmgr_psoc *psoc,
bool value);
/**
* wlan_cm_get_standard_6ghz_conn_policy() - Get 6Ghz standard connection
* policy
* @psoc: pointer to psoc object
*
* Return: value
*/
bool wlan_cm_get_standard_6ghz_conn_policy(struct wlan_objmgr_psoc *psoc);
#else
static inline bool
wlan_cm_6ghz_allowed_for_akm(struct wlan_objmgr_psoc *psoc,
@ -314,6 +329,18 @@ bool wlan_cm_get_check_6ghz_security(struct wlan_objmgr_psoc *psoc)
return false;
}
static inline
void wlan_cm_set_standard_6ghz_conn_policy(struct wlan_objmgr_psoc *psoc,
uint32_t value)
{
}
static inline
bool wlan_cm_get_standard_6ghz_conn_policy(struct wlan_objmgr_psoc *psoc)
{
return false;
}
static inline
void wlan_cm_set_6ghz_key_mgmt_mask(struct wlan_objmgr_psoc *psoc,
uint32_t value) {}

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 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
@ -1166,7 +1166,8 @@ QDF_STATUS __scm_handle_bcn_probe(struct scan_bcn_probe_event *bcn)
* enabled. wlan_cm_get_check_6ghz_security API returns true if
* neither Safe mode nor RF test mode are enabled.
*/
if (!scm_is_bss_allowed_for_country(psoc, scan_entry) &&
if (!wlan_cm_get_standard_6ghz_conn_policy(psoc) &&
!scm_is_bss_allowed_for_country(psoc, scan_entry) &&
wlan_cm_get_check_6ghz_security(psoc)) {
scm_info_rl(
"Drop frame from "QDF_MAC_ADDR_FMT

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2023 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
@ -2135,7 +2135,7 @@ static uint32_t util_gen_new_ie(uint8_t *ie, uint32_t ielen,
*/
tmp_new = sub_copy;
while (((tmp_new + tmp_new[1] + MIN_IE_LEN) - sub_copy) <=
subie_len) {
(subie_len - 1)) {
if (!(tmp_new[0] == WLAN_ELEMID_NONTX_BSSID_CAP ||
tmp_new[0] == WLAN_ELEMID_SSID ||
tmp_new[0] == WLAN_ELEMID_MULTI_BSSID_IDX ||
@ -2149,7 +2149,7 @@ static uint32_t util_gen_new_ie(uint8_t *ie, uint32_t ielen,
}
}
if (((tmp_new + tmp_new[1] + MIN_IE_LEN) - sub_copy) >=
subie_len)
(subie_len - 1))
break;
tmp_new += tmp_new[1] + MIN_IE_LEN;
}

View file

@ -14279,6 +14279,15 @@ extract_roam_scan_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
dst->num_chan = MAX_ROAM_SCAN_CHAN;
src_chan = &param_buf->roam_scan_chan_info[chan_idx];
if ((dst->num_chan + chan_idx) >
param_buf->num_roam_scan_chan_info) {
wmi_err("Invalid TLV. num_chan %d chan_idx %d num_roam_scan_chan_info %d",
dst->num_chan, chan_idx,
param_buf->num_roam_scan_chan_info);
return QDF_STATUS_SUCCESS;
}
for (i = 0; i < dst->num_chan; i++) {
dst->chan_freq[i] = src_chan->channel;
src_chan++;
@ -14387,6 +14396,14 @@ extract_roam_11kv_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
if (dst->num_freq > MAX_ROAM_SCAN_CHAN)
dst->num_freq = MAX_ROAM_SCAN_CHAN;
if ((dst->num_freq + rpt_idx) >
param_buf->num_roam_neighbor_report_chan_info) {
wmi_err("Invalid TLV. num_freq %d rpt_idx %d num_roam_neighbor_report_chan_info %d",
dst->num_freq, rpt_idx,
param_buf->num_roam_scan_chan_info);
return QDF_STATUS_SUCCESS;
}
for (i = 0; i < dst->num_freq; i++) {
dst->freq[i] = src_freq->channel;
src_freq++;