From: Johannes Berg <johannes.berg@xxxxxxxxx> Add the ability to require EHT, advertising that via the BSS membership selector as well as rejecting association without EHT. Signed-off-by: Johannes Berg <johannes.berg@xxxxxxxxx> Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@xxxxxxxxx> --- hostapd/config_file.c | 2 ++ hostapd/hostapd.conf | 3 +++ src/ap/ap_config.h | 1 + src/ap/ieee802_11.c | 30 ++++++++++++++++++++++++++++++ src/common/ieee802_11_defs.h | 2 ++ 5 files changed, 38 insertions(+) diff --git a/hostapd/config_file.c b/hostapd/config_file.c index bde81c8b42..7c21ffd599 100644 --- a/hostapd/config_file.c +++ b/hostapd/config_file.c @@ -4734,6 +4734,8 @@ static int hostapd_config_fill(struct hostapd_config *conf, #ifdef CONFIG_IEEE80211BE } else if (os_strcmp(buf, "ieee80211be") == 0) { conf->ieee80211be = atoi(pos); + } else if (os_strcmp(buf, "require_eht") == 0) { + conf->require_eht = atoi(pos); } else if (os_strcmp(buf, "eht_oper_chwidth") == 0) { conf->eht_oper_chwidth = atoi(pos); } else if (os_strcmp(buf, "eht_oper_centr_freq_seg0_idx") == 0) { diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf index c5e74a6a2b..460db46c7c 100644 --- a/hostapd/hostapd.conf +++ b/hostapd/hostapd.conf @@ -1000,6 +1000,9 @@ wmm_ac_vo_acm=0 # 1 = enabled #ieee80211be=1 +# Require stations to support EHT PHY (reject association if they do not) +#require_eht=1 + #disable_11be: Boolean (0/1) to disable EHT for a specific BSS #disable_11be=0 diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h index 86bc2e759d..c94ba46a59 100644 --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h @@ -1141,6 +1141,7 @@ struct hostapd_config { enum oper_chan_width eht_oper_chwidth; u8 eht_oper_centr_freq_seg0_idx; struct eht_phy_capabilities_info eht_phy_capab; + int require_eht; #endif /* CONFIG_IEEE80211BE */ /* EHT enable/disable config from CHAN_SWITCH */ diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index 2ac19006a4..132ac3bb68 100644 --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -118,6 +118,10 @@ u8 * hostapd_eid_supp_rates(struct hostapd_data *hapd, u8 *eid) #ifdef CONFIG_IEEE80211AX if (hapd->iconf->ieee80211ax && hapd->iconf->require_he) num++; +#endif +#ifdef CONFIG_IEEE80211BE + if (hapd->iconf->ieee80211be && hapd->iconf->require_eht) + num++; #endif h2e_required = (hapd->conf->sae_pwe == SAE_PWE_HASH_TO_ELEMENT || hostapd_sae_pw_id_in_use(hapd->conf) == 2) && @@ -158,6 +162,13 @@ u8 * hostapd_eid_supp_rates(struct hostapd_data *hapd, u8 *eid) } #endif +#ifdef CONFIG_IEEE80211BE + if (hapd->iconf->ieee80211be && hapd->iconf->require_eht && count < 8) { + count++; + *pos++ = 0x80 | BSS_MEMBERSHIP_SELECTOR_EHT_PHY; + } +#endif + if (h2e_required && count < 8) { count++; *pos++ = 0x80 | BSS_MEMBERSHIP_SELECTOR_SAE_H2E_ONLY; @@ -185,6 +196,10 @@ u8 * hostapd_eid_ext_supp_rates(struct hostapd_data *hapd, u8 *eid) #ifdef CONFIG_IEEE80211AX if (hapd->iconf->ieee80211ax && hapd->iconf->require_he) num++; +#endif +#ifdef CONFIG_IEEE80211BE + if (hapd->iconf->ieee80211be && hapd->iconf->require_eht) + num++; #endif h2e_required = (hapd->conf->sae_pwe == SAE_PWE_HASH_TO_ELEMENT || hostapd_sae_pw_id_in_use(hapd->conf) == 2) && @@ -229,6 +244,14 @@ u8 * hostapd_eid_ext_supp_rates(struct hostapd_data *hapd, u8 *eid) } #endif +#ifdef CONFIG_IEEE80211BE + if (hapd->iconf->ieee80211be && hapd->iconf->require_eht) { + count++; + if (count > 8) + *pos++ = 0x80 | BSS_MEMBERSHIP_SELECTOR_EHT_PHY; + } +#endif + if (h2e_required) { count++; if (count > 8) @@ -3759,6 +3782,13 @@ static int check_assoc_ies(struct hostapd_data *hapd, struct sta_info *sta, elems.eht_capabilities_len); if (resp != WLAN_STATUS_SUCCESS) return resp; + + if (hapd->iconf->require_eht && !(sta->flags & WLAN_STA_EHT)) { + hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211, + HOSTAPD_LEVEL_INFO, "Station does not support " + "mandatory EHT PHY - reject association"); + return WLAN_STATUS_DENIED_EHT_NOT_SUPPORTED; + } } #endif /* CONFIG_IEEE80211BE */ diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h index 6f8332af65..4e383bdf85 100644 --- a/src/common/ieee802_11_defs.h +++ b/src/common/ieee802_11_defs.h @@ -209,6 +209,7 @@ #define WLAN_STATUS_DENIED_HE_NOT_SUPPORTED 124 #define WLAN_STATUS_SAE_HASH_TO_ELEMENT 126 #define WLAN_STATUS_SAE_PK 127 +#define WLAN_STATUS_DENIED_EHT_NOT_SUPPORTED 135 /* Reason codes (IEEE Std 802.11-2016, 9.4.1.7, Table 9-45) */ #define WLAN_REASON_UNSPECIFIED 1 @@ -1293,6 +1294,7 @@ struct ieee80211_ampe_ie { #define BSS_MEMBERSHIP_SELECTOR_HT_PHY 127 #define BSS_MEMBERSHIP_SELECTOR_SAE_H2E_ONLY 123 #define BSS_MEMBERSHIP_SELECTOR_HE_PHY 122 +#define BSS_MEMBERSHIP_SELECTOR_EHT_PHY 121 /* VHT Defines */ #define VHT_CAP_MAX_MPDU_LENGTH_7991 ((u32) BIT(0)) -- 2.25.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap