From 241dd76cfdc83158efc3b8af0b254dae8d408022 Mon Sep 17 00:00:00 2001 From: Alexei Avshalom Lazar Date: Wed, 11 Sep 2019 12:03:07 +0300 Subject: [PATCH] hostapd: Check EDMG configuration against capability Signed-off-by: Alexei Avshalom Lazar --- src/ap/hostapd.c | 3 +++ src/ap/hw_features.c | 26 ++++++++++++++++++++++++++ src/ap/hw_features.h | 6 ++++++ 3 files changed, 35 insertions(+) diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c index 83e64743d..368643867 100644 --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c @@ -1590,6 +1590,9 @@ static int setup_interface2(struct hostapd_iface *iface) wpa_printf(MSG_DEBUG, "Interface initialization will be completed in a callback (ACS)"); return 0; } + ret = hostapd_check_edmg_capab(iface); + if (ret < 0) + goto fail; ret = hostapd_check_ht_capab(iface); if (ret < 0) goto fail; diff --git a/src/ap/hw_features.c b/src/ap/hw_features.c index a0720bad2..2a1fa0ae8 100644 --- a/src/ap/hw_features.c +++ b/src/ap/hw_features.c @@ -704,6 +704,32 @@ int hostapd_check_ht_capab(struct hostapd_iface *iface) } +int hostapd_check_edmg_capab(struct hostapd_iface *iface) +{ + struct hostapd_hw_modes *mode = iface->hw_features; + struct ieee80211_edmg_config edmg; + + if (!iface->conf->enable_edmg) + return 0; + + hostapd_encode_edmg_chan(iface->conf->enable_edmg, + iface->conf->edmg_channel, + iface->conf->channel, + &edmg); + + if (mode->edmg.channels && ieee802_edmg_is_allowed(mode->edmg, edmg)) + return 0; + + wpa_printf(MSG_WARNING, "Requested EDMG configuration is not valid"); + wpa_printf(MSG_INFO, "EDMG capab: channels 0x%x, bw_config %d", + mode->edmg.channels, mode->edmg.bw_config); + wpa_printf(MSG_INFO, + "Requested EDMG configuration: channels 0x%x, bw_config %d", + edmg.channels, edmg.bw_config); + return -1; +} + + static int hostapd_is_usable_chan(struct hostapd_iface *iface, int channel, int primary) { diff --git a/src/ap/hw_features.h b/src/ap/hw_features.h index ca7f22ba2..902a19f9f 100644 --- a/src/ap/hw_features.h +++ b/src/ap/hw_features.h @@ -21,6 +21,7 @@ const char * hostapd_hw_mode_txt(int mode); int hostapd_hw_get_freq(struct hostapd_data *hapd, int chan); int hostapd_hw_get_channel(struct hostapd_data *hapd, int freq); int hostapd_check_ht_capab(struct hostapd_iface *iface); +int hostapd_check_edmg_capab(struct hostapd_iface *iface); int hostapd_prepare_rates(struct hostapd_iface *iface, struct hostapd_hw_modes *mode); void hostapd_stop_setup_timers(struct hostapd_iface *iface); @@ -61,6 +62,11 @@ static inline int hostapd_check_ht_capab(struct hostapd_iface *iface) return 0; } +static inline int hostapd_check_edmg_capab(struct hostapd_iface *iface) +{ + return 0; +} + static inline int hostapd_prepare_rates(struct hostapd_iface *iface, struct hostapd_hw_modes *mode) {