From: Johannes Berg <johannes.berg@xxxxxxxxx> Check the EHT membership selector and don't use the BSS if required but not supported by HW. Signed-off-by: Johannes Berg <johannes.berg@xxxxxxxxx> Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@xxxxxxxxx> --- src/drivers/driver.h | 3 +++ src/drivers/driver_common.c | 15 +++++++++++++++ src/drivers/driver_nl80211_capa.c | 3 ++- wpa_supplicant/events.c | 11 +++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/drivers/driver.h b/src/drivers/driver.h index cb68bc8ff0..b937d5ccd3 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -213,6 +213,7 @@ struct eht_capabilities { #define HOSTAPD_MODE_FLAG_HT_INFO_KNOWN BIT(0) #define HOSTAPD_MODE_FLAG_VHT_INFO_KNOWN BIT(1) #define HOSTAPD_MODE_FLAG_HE_INFO_KNOWN BIT(2) +#define HOSTAPD_MODE_FLAG_EHT_INFO_KNOWN BIT(3) enum ieee80211_op_mode { @@ -6565,6 +6566,8 @@ int ht_supported(const struct hostapd_hw_modes *mode); int vht_supported(const struct hostapd_hw_modes *mode); int he_supported(const struct hostapd_hw_modes *hw_mode, enum ieee80211_op_mode op_mode); +int eht_supported(const struct hostapd_hw_modes *hw_mode, + enum ieee80211_op_mode op_mode); struct wowlan_triggers * wpa_get_wowlan_triggers(const char *wowlan_triggers, diff --git a/src/drivers/driver_common.c b/src/drivers/driver_common.c index 7a82f3a5f9..430dacfc2e 100644 --- a/src/drivers/driver_common.c +++ b/src/drivers/driver_common.c @@ -200,6 +200,21 @@ int he_supported(const struct hostapd_hw_modes *hw_mode, } +int eht_supported(const struct hostapd_hw_modes *hw_mode, + enum ieee80211_op_mode op_mode) +{ + if (!(hw_mode->flags & HOSTAPD_MODE_FLAG_EHT_INFO_KNOWN)) { + /* + * The driver did not indicate whether it supports EHT. Assume + * it does to avoid connection issues. + */ + return 1; + } + + return hw_mode->eht_capab[op_mode].eht_supported; +} + + static int wpa_check_wowlan_trigger(const char *start, const char *trigger, int capa_trigger, u8 *param_trigger) { diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c index 959f7f37de..c84db2d87d 100644 --- a/src/drivers/driver_nl80211_capa.c +++ b/src/drivers/driver_nl80211_capa.c @@ -2025,7 +2025,8 @@ static int phy_info_band(struct phy_info_arg *phy_info, struct nlattr *nl_band) mode->mode = NUM_HOSTAPD_MODES; mode->flags = HOSTAPD_MODE_FLAG_HT_INFO_KNOWN | HOSTAPD_MODE_FLAG_VHT_INFO_KNOWN | - HOSTAPD_MODE_FLAG_HE_INFO_KNOWN; + HOSTAPD_MODE_FLAG_HE_INFO_KNOWN | + HOSTAPD_MODE_FLAG_EHT_INFO_KNOWN; /* * Unsupported VHT MCS stream is defined as value 3, so the VHT diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index 77f0b661a7..a2d3a39ef8 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -975,6 +975,17 @@ static int rate_match(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, continue; } + if (flagged && ((rate_ie[j] & 0x7f) == + BSS_MEMBERSHIP_SELECTOR_EHT_PHY)) { + if (!eht_supported(mode, IEEE80211_MODE_INFRA)) { + if (debug_print) + wpa_dbg(wpa_s, MSG_DEBUG, + " hardware does not support EHT PHY"); + return 0; + } + continue; + } + #ifdef CONFIG_SAE if (flagged && ((rate_ie[j] & 0x7f) == BSS_MEMBERSHIP_SELECTOR_SAE_H2E_ONLY)) { -- 2.25.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap