wpa_supplicant: Add HE override support

Add HE override support under the build parameter CONFIG_HE_OVERRIDES=y.
The disable_he=1 network profile parameter can be used to disable HE.
This requires a fallback to VHT on the 5 GHz band and to HT on the 2.4
GHz band.

There is no nl80211 support for configuring the driver to disable HE, so
for now, this applies only to IBSS and mesh cases.

Signed-off-by: P Praneesh <ppranees@codeaurora.org>
This commit is contained in:
P Praneesh 2020-03-09 16:23:50 +05:30 committed by Jouni Malinen
parent e149051ced
commit 7c8f540ee0
10 changed files with 66 additions and 0 deletions

View file

@ -1096,6 +1096,13 @@ struct wpa_driver_associate_params {
const struct ieee80211_vht_capabilities *vhtcaps_mask; const struct ieee80211_vht_capabilities *vhtcaps_mask;
#endif /* CONFIG_VHT_OVERRIDES */ #endif /* CONFIG_VHT_OVERRIDES */
#ifdef CONFIG_HE_OVERRIDES
/**
* disable_he - Disable HE for this connection
*/
int disable_he;
#endif /* CONFIG_HE_OVERRIDES */
/** /**
* req_key_mgmt_offload - Request key management offload for connection * req_key_mgmt_offload - Request key management offload for connection
* *

View file

@ -166,6 +166,10 @@ ifdef CONFIG_VHT_OVERRIDES
L_CFLAGS += -DCONFIG_VHT_OVERRIDES L_CFLAGS += -DCONFIG_VHT_OVERRIDES
endif endif
ifdef CONFIG_HE_OVERRIDES
L_CFLAGS += -DCONFIG_HE_OVERRIDES
endif
ifndef CONFIG_BACKEND ifndef CONFIG_BACKEND
CONFIG_BACKEND=file CONFIG_BACKEND=file
endif endif

View file

@ -198,6 +198,10 @@ ifdef CONFIG_VHT_OVERRIDES
CFLAGS += -DCONFIG_VHT_OVERRIDES CFLAGS += -DCONFIG_VHT_OVERRIDES
endif endif
ifdef CONFIG_HE_OVERRIDES
CFLAGS += -DCONFIG_HE_OVERRIDES
endif
ifndef CONFIG_BACKEND ifndef CONFIG_BACKEND
CONFIG_BACKEND=file CONFIG_BACKEND=file
endif endif

View file

@ -2544,6 +2544,9 @@ static const struct parse_data ssid_fields[] = {
{ INT_RANGE(vht_tx_mcs_nss_7, -1, 3) }, { INT_RANGE(vht_tx_mcs_nss_7, -1, 3) },
{ INT_RANGE(vht_tx_mcs_nss_8, -1, 3) }, { INT_RANGE(vht_tx_mcs_nss_8, -1, 3) },
#endif /* CONFIG_VHT_OVERRIDES */ #endif /* CONFIG_VHT_OVERRIDES */
#ifdef CONFIG_HE_OVERRIDES
{ INT_RANGE(disable_he, 0, 1)},
#endif /* CONFIG_HE_OVERRIDES */
{ INT(ap_max_inactivity) }, { INT(ap_max_inactivity) },
{ INT(dtim_period) }, { INT(dtim_period) },
{ INT(beacon_int) }, { INT(beacon_int) },

View file

@ -971,6 +971,9 @@ static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid)
INT_DEF(vht_tx_mcs_nss_7, -1); INT_DEF(vht_tx_mcs_nss_7, -1);
INT_DEF(vht_tx_mcs_nss_8, -1); INT_DEF(vht_tx_mcs_nss_8, -1);
#endif /* CONFIG_VHT_OVERRIDES */ #endif /* CONFIG_VHT_OVERRIDES */
#ifdef CONFIG_HE_OVERRIDES
INT(disable_he);
#endif /* CONFIG_HE_OVERRIDES */
#undef STR #undef STR
#undef INT #undef INT

View file

@ -779,6 +779,16 @@ struct wpa_ssid {
vht_tx_mcs_nss_7, vht_tx_mcs_nss_8; vht_tx_mcs_nss_7, vht_tx_mcs_nss_8;
#endif /* CONFIG_VHT_OVERRIDES */ #endif /* CONFIG_VHT_OVERRIDES */
#ifdef CONFIG_HE_OVERRIDES
/**
* disable_he - Disable HE (IEEE 802.11ax) for this network
*
* By default, use it if it is available, but this can be configured
* to 1 to have it disabled.
*/
int disable_he;
#endif /* CONFIG_HE_OVERRIDES */
/** /**
* ap_max_inactivity - Timeout in seconds to detect STA's inactivity * ap_max_inactivity - Timeout in seconds to detect STA's inactivity
* *

View file

@ -1869,6 +1869,9 @@ pfs_fail:
params.vhtcaps_mask = &vhtcaps_mask; params.vhtcaps_mask = &vhtcaps_mask;
wpa_supplicant_apply_vht_overrides(wpa_s, wpa_s->current_ssid, &params); wpa_supplicant_apply_vht_overrides(wpa_s, wpa_s->current_ssid, &params);
#endif /* CONFIG_VHT_OVERRIDES */ #endif /* CONFIG_VHT_OVERRIDES */
#ifdef CONFIG_HE_OVERRIDES
wpa_supplicant_apply_he_overrides(wpa_s, wpa_s->current_ssid, &params);
#endif /* CONFIG_HE_OVERRIDES */
#ifdef CONFIG_IEEE80211R #ifdef CONFIG_IEEE80211R
if (auth_type == WLAN_AUTH_FT && wpa_s->sme.ft_ies && if (auth_type == WLAN_AUTH_FT && wpa_s->sme.ft_ies &&
get_ie(wpa_s->sme.ft_ies, wpa_s->sme.ft_ies_len, get_ie(wpa_s->sme.ft_ies, wpa_s->sme.ft_ies_len,

View file

@ -1460,6 +1460,9 @@ static const char *network_fields[] = {
"vht_tx_mcs_nss_3", "vht_tx_mcs_nss_4", "vht_tx_mcs_nss_5", "vht_tx_mcs_nss_3", "vht_tx_mcs_nss_4", "vht_tx_mcs_nss_5",
"vht_tx_mcs_nss_6", "vht_tx_mcs_nss_7", "vht_tx_mcs_nss_8", "vht_tx_mcs_nss_6", "vht_tx_mcs_nss_7", "vht_tx_mcs_nss_8",
#endif /* CONFIG_VHT_OVERRIDES */ #endif /* CONFIG_VHT_OVERRIDES */
#ifdef CONFIG_HE_OVERRIDES
"disable_he",
#endif /* CONFIG_HE_OVERRIDES */
"ap_max_inactivity", "dtim_period", "beacon_int", "ap_max_inactivity", "dtim_period", "beacon_int",
#ifdef CONFIG_MACSEC #ifdef CONFIG_MACSEC
"macsec_policy", "macsec_policy",

View file

@ -2406,6 +2406,10 @@ void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
/* Allow HE on 2.4 GHz without VHT: see nl80211_put_freq_params() */ /* Allow HE on 2.4 GHz without VHT: see nl80211_put_freq_params() */
if (is_24ghz) if (is_24ghz)
freq->he_enabled = mode->he_capab[ieee80211_mode].he_supported; freq->he_enabled = mode->he_capab[ieee80211_mode].he_supported;
#ifdef CONFIG_HE_OVERRIDES
if (is_24ghz && ssid->disable_he)
freq->he_enabled = 0;
#endif /* CONFIG_HE_OVERRIDES */
/* Setup higher BW only for 5 GHz */ /* Setup higher BW only for 5 GHz */
if (mode->mode != HOSTAPD_MODE_IEEE80211A) if (mode->mode != HOSTAPD_MODE_IEEE80211A)
@ -2604,6 +2608,12 @@ skip_ht40:
#endif /* CONFIG_HT_OVERRIDES */ #endif /* CONFIG_HT_OVERRIDES */
} }
#ifdef CONFIG_HE_OVERRIDES
if (ssid->disable_he) {
vht_freq.he_enabled = 0;
freq->he_enabled = 0;
}
#endif /* CONFIG_HE_OVERRIDES */
if (hostapd_set_freq_params(&vht_freq, mode->mode, freq->freq, if (hostapd_set_freq_params(&vht_freq, mode->mode, freq->freq,
freq->channel, ssid->enable_edmg, freq->channel, ssid->enable_edmg,
ssid->edmg_channel, freq->ht_enabled, ssid->edmg_channel, freq->ht_enabled,
@ -3710,6 +3720,9 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
params.vhtcaps_mask = &vhtcaps_mask; params.vhtcaps_mask = &vhtcaps_mask;
wpa_supplicant_apply_vht_overrides(wpa_s, ssid, &params); wpa_supplicant_apply_vht_overrides(wpa_s, ssid, &params);
#endif /* CONFIG_VHT_OVERRIDES */ #endif /* CONFIG_VHT_OVERRIDES */
#ifdef CONFIG_HE_OVERRIDES
wpa_supplicant_apply_he_overrides(wpa_s, ssid, &params);
#endif /* CONFIG_HE_OVERRIDES */
#ifdef CONFIG_P2P #ifdef CONFIG_P2P
/* /*
@ -5272,6 +5285,19 @@ void wpa_supplicant_apply_vht_overrides(
#endif /* CONFIG_VHT_OVERRIDES */ #endif /* CONFIG_VHT_OVERRIDES */
#ifdef CONFIG_HE_OVERRIDES
void wpa_supplicant_apply_he_overrides(
struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
struct wpa_driver_associate_params *params)
{
if (!ssid)
return;
params->disable_he = ssid->disable_he;
}
#endif /* CONFIG_HE_OVERRIDES */
static int pcsc_reader_init(struct wpa_supplicant *wpa_s) static int pcsc_reader_init(struct wpa_supplicant *wpa_s)
{ {
#ifdef PCSC_FUNCS #ifdef PCSC_FUNCS

View file

@ -1311,6 +1311,9 @@ void wpa_supplicant_apply_ht_overrides(
void wpa_supplicant_apply_vht_overrides( void wpa_supplicant_apply_vht_overrides(
struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
struct wpa_driver_associate_params *params); struct wpa_driver_associate_params *params);
void wpa_supplicant_apply_he_overrides(
struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
struct wpa_driver_associate_params *params);
int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid); int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid);
int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s, int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,