diff --git a/umac/scan/core/src/wlan_scan_filter.c b/umac/scan/core/src/wlan_scan_filter.c index 0c628d15bfed..f8c6693281fd 100644 --- a/umac/scan/core/src/wlan_scan_filter.c +++ b/umac/scan/core/src/wlan_scan_filter.c @@ -590,6 +590,41 @@ static inline bool scm_is_fils_config_match(struct scan_filter *filter, } #endif +static bool scm_check_dot11mode(struct scan_cache_entry *db_entry, + struct scan_filter *filter) +{ + switch (filter->dot11mode) { + case ALLOW_ALL: + break; + case ALLOW_11N_ONLY: + if (!util_scan_entry_htcap(db_entry)) { + scm_debug(QDF_MAC_ADDR_FMT ": Ignore as dot11mode(HT only) didn't match", + QDF_MAC_ADDR_REF(db_entry->bssid.bytes)); + return false; + } + break; + case ALLOW_11AC_ONLY: + if (!util_scan_entry_vhtcap(db_entry)) { + scm_debug(QDF_MAC_ADDR_FMT ": Ignore as dot11mode(VHT only) didn't match", + QDF_MAC_ADDR_REF(db_entry->bssid.bytes)); + return false; + } + break; + case ALLOW_11AX_ONLY: + if (!util_scan_entry_hecap(db_entry)) { + scm_debug(QDF_MAC_ADDR_FMT ": Ignore as dot11mode(HE only) didn't match", + QDF_MAC_ADDR_REF(db_entry->bssid.bytes)); + return false; + } + break; + default: + scm_debug("Invalid dot11mode filter passed %d", + filter->dot11mode); + } + + return true; +} + bool scm_filter_match(struct wlan_objmgr_psoc *psoc, struct scan_cache_entry *db_entry, struct scan_filter *filter, @@ -604,6 +639,9 @@ bool scm_filter_match(struct wlan_objmgr_psoc *psoc, if (!def_param) return false; + if (filter->dot11mode && !scm_check_dot11mode(db_entry, filter)) + return false; + if (filter->age_threshold && filter->age_threshold < util_scan_entry_age(db_entry)) return false; diff --git a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h index f8ba46b73bf1..a09e5eb2a6a1 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h +++ b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h @@ -473,6 +473,20 @@ struct fils_filter_info { struct filter_arg; typedef struct filter_arg *bss_filter_arg_t; +/** + * enum dot11_mode_filter - Filter APs according to dot11mode + * @ALLOW_ALL: ignore check + * @ALLOW_11N_ONLY: allow only 11n AP + * @ALLOW_11AC_ONLY: allow only 11ac AP + * @ALLOW_11AX_ONLY: allow only 11ax AP + */ +enum dot11_mode_filter { + ALLOW_ALL, + ALLOW_11N_ONLY, + ALLOW_11AC_ONLY, + ALLOW_11AX_ONLY, +}; + /** * struct scan_filter: scan filter * @enable_adaptive_11r: flag to check if adaptive 11r ini is enabled @@ -487,8 +501,7 @@ typedef struct filter_arg *bss_filter_arg_t; * @num_of_ssid: number of ssid * @num_of_channels: number of channels * @pmf_cap: Pmf capability - * @dot11_mode: operating modes 0 mean any - * 11a , 11g, 11n , 11ac , 11b etc + * @dot11mode: Filter APs based upon dot11mode * @band: to get specific band 2.4G, 5G or 4.9 G * @rssi_threshold: AP having RSSI greater than * rssi threasholed (ignored if set 0) @@ -519,7 +532,7 @@ struct scan_filter { uint8_t num_of_ssid; uint16_t num_of_channels; enum wlan_pmf_cap pmf_cap; - enum wlan_phymode dot11_mode; + enum dot11_mode_filter dot11mode; enum wlan_band band; uint8_t rssi_threshold; uint32_t mobility_domain;