wpa_supplicant: Implement HE membership selector check
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@intel.com> Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
This commit is contained in:
parent
054fcfab6f
commit
ed0a7b4809
4 changed files with 31 additions and 1 deletions
|
@ -212,6 +212,7 @@ struct eht_capabilities {
|
||||||
|
|
||||||
#define HOSTAPD_MODE_FLAG_HT_INFO_KNOWN BIT(0)
|
#define HOSTAPD_MODE_FLAG_HT_INFO_KNOWN BIT(0)
|
||||||
#define HOSTAPD_MODE_FLAG_VHT_INFO_KNOWN BIT(1)
|
#define HOSTAPD_MODE_FLAG_VHT_INFO_KNOWN BIT(1)
|
||||||
|
#define HOSTAPD_MODE_FLAG_HE_INFO_KNOWN BIT(2)
|
||||||
|
|
||||||
|
|
||||||
enum ieee80211_op_mode {
|
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 ht_supported(const struct hostapd_hw_modes *mode);
|
||||||
int vht_supported(const struct hostapd_hw_modes *mode);
|
int vht_supported(const struct hostapd_hw_modes *mode);
|
||||||
|
bool he_supported(const struct hostapd_hw_modes *hw_mode,
|
||||||
|
enum ieee80211_op_mode op_mode);
|
||||||
|
|
||||||
struct wowlan_triggers *
|
struct wowlan_triggers *
|
||||||
wpa_get_wowlan_triggers(const char *wowlan_triggers,
|
wpa_get_wowlan_triggers(const char *wowlan_triggers,
|
||||||
|
|
|
@ -185,6 +185,21 @@ int vht_supported(const struct hostapd_hw_modes *mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool 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 true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hw_mode->he_capab[op_mode].he_supported;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int wpa_check_wowlan_trigger(const char *start, const char *trigger,
|
static int wpa_check_wowlan_trigger(const char *start, const char *trigger,
|
||||||
int capa_trigger, u8 *param_trigger)
|
int capa_trigger, u8 *param_trigger)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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));
|
os_memset(mode, 0, sizeof(*mode));
|
||||||
mode->mode = NUM_HOSTAPD_MODES;
|
mode->mode = NUM_HOSTAPD_MODES;
|
||||||
mode->flags = HOSTAPD_MODE_FLAG_HT_INFO_KNOWN |
|
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
|
* Unsupported VHT MCS stream is defined as value 3, so the VHT
|
||||||
|
|
|
@ -964,6 +964,17 @@ static int rate_match(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
|
||||||
continue;
|
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
|
#ifdef CONFIG_SAE
|
||||||
if (flagged && ((rate_ie[j] & 0x7f) ==
|
if (flagged && ((rate_ie[j] & 0x7f) ==
|
||||||
BSS_MEMBERSHIP_SELECTOR_SAE_H2E_ONLY)) {
|
BSS_MEMBERSHIP_SELECTOR_SAE_H2E_ONLY)) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue