From: Johannes Berg <johannes.berg@xxxxxxxxx> Check the HE 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 15d539af29..cb68bc8ff0 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -212,6 +212,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) enum ieee80211_op_mode { @@ -6562,6 +6563,8 @@ int channel_width_to_int(enum chan_width width); 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); 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 0ac0aa6de6..7a82f3a5f9 100644 --- a/src/drivers/driver_common.c +++ b/src/drivers/driver_common.c @@ -185,6 +185,21 @@ 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) +{ + if (!(hw_mode->flags & HOSTAPD_MODE_FLAG_HE_INFO_KNOWN)) { + /* + * The driver did not indicate whether it supports HE. Assume + * it does to avoid connection issues. + */ + return 1; + } + + return hw_mode->he_capab[op_mode].he_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 e0c3e416a7..959f7f37de 100644 --- a/src/drivers/driver_nl80211_capa.c +++ b/src/drivers/driver_nl80211_capa.c @@ -2024,7 +2024,8 @@ static int phy_info_band(struct phy_info_arg *phy_info, struct nlattr *nl_band) os_memset(mode, 0, sizeof(*mode)); mode->mode = NUM_HOSTAPD_MODES; mode->flags = HOSTAPD_MODE_FLAG_HT_INFO_KNOWN | - HOSTAPD_MODE_FLAG_VHT_INFO_KNOWN; + HOSTAPD_MODE_FLAG_VHT_INFO_KNOWN | + HOSTAPD_MODE_FLAG_HE_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 e55dbce5a3..77f0b661a7 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -964,6 +964,17 @@ static int rate_match(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, continue; } + if (flagged && ((rate_ie[j] & 0x7f) == + BSS_MEMBERSHIP_SELECTOR_HE_PHY)) { + if (!he_supported(mode, IEEE80211_MODE_INFRA)) { + if (debug_print) + wpa_dbg(wpa_s, MSG_DEBUG, + " hardware does not support HE 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