@@ -2914,6 +2914,8 @@ static int hostapd_config_fill(struct hostapd_config *conf,
errors++;
} else
conf->local_pwr_constraint = val;
+ } else if (os_strcmp(buf, "spectrum_mgmt_required") == 0) {
+ conf->spectrum_mgmt_required = atoi(pos);
} else {
wpa_printf(MSG_ERROR, "Line %d: unknown configuration "
"item '%s'", line, buf);
@@ -116,6 +116,13 @@ ssid=test
# Valid values are 0..255.
#local_pwr_constraint=3
+# Set Spectrum Managment subfield in the Capability Information field.
+# This config option forces Spectrum Management bit to be set. When this
+# option is not set then value of Spectrum Management bit depends on whether
+# DFS or TPC is reuired by regulatory authorities.This can be used only with
+# ieee80211d=1 and local_pwr_constraint configured.
+#spectrum_mgmt_required=1
+
# Operation mode (a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g,
# ad = IEEE 802.11ad (60 GHz); a/g options are used with IEEE 802.11n, too, to
# specify band)
@@ -838,6 +838,12 @@ int hostapd_config_check(struct hostapd_config *conf, int full_config)
return -1;
}
+ if (full_config && conf->spectrum_mgmt_required &&
+ conf->local_pwr_constraint == -1) {
+ wpa_printf(MSG_ERROR, "Cannot set Spectrum Management bit "
+ "without Country and Power Constraint elements");
+ return -1;
+ }
for (i = 0; i < conf->num_bss; i++) {
if (hostapd_config_check_bss(conf->bss[i], conf, full_config))
return -1;
@@ -525,6 +525,9 @@ struct hostapd_config {
*/
int local_pwr_constraint;
+ /* Control Spectrum Management bit */
+ int spectrum_mgmt_required;
+
struct hostapd_tx_queue_params tx_queue[NUM_TX_QUEUES];
/*
@@ -27,6 +27,7 @@
#include "ap_drv_ops.h"
#include "beacon.h"
#include "hs20.h"
+#include "dfs.h"
#ifdef NEED_AP_MLME
@@ -105,13 +106,44 @@ static u8 * hostapd_eid_erp_info(struct hostapd_data *hapd, u8 *eid)
static u8 * hostapd_eid_pwr_constraint(struct hostapd_data *hapd, u8 *eid)
{
u8 *pos = eid;
+ int local_pwr_constraint = 0;
+ int dfs;
- if (hapd->iconf->local_pwr_constraint == -1 ||
- hapd->iface->current_mode == NULL ||
- hapd->iface->current_mode->mode != HOSTAPD_MODE_IEEE80211A)
+ if (hapd->iface->current_mode == NULL ||
+ hapd->iface->current_mode->mode != HOSTAPD_MODE_IEEE80211A)
+ return eid;
+
+ /*
+ * There is no DFS support and power constraint was not direcly
+ * requested by config option.
+ */
+ if (!hapd->iconf->ieee80211h &&
+ hapd->iconf->local_pwr_constraint == -1)
+ return eid;
+
+ /* Check if DFS is required by regulatory. */
+ dfs = hostapd_is_dfs_required(hapd->iface);
+ if (dfs < 0 ) {
+ wpa_printf(MSG_WARNING, "Failed to check if dfs "
+ "is required ret=%d", dfs);
+ dfs = 0;
+ }
+
+ if (dfs == 0 && hapd->iconf->local_pwr_constraint == -1)
return eid;
/*
+ * ieee80211h (DFS) is enabled so Power Constraint element shall
+ * be added when running on DFS channel whenever local_pwr_constraint
+ * is configured or not. In order to meet regulations when TPC is not
+ * implemented using a transmit power that is below the legal maximum
+ * (including any mitigation factor) should help. In this case 3dB below
+ * maximum allowed transmit power.
+ */
+ if (hapd->iconf->local_pwr_constraint == -1)
+ local_pwr_constraint = 3;
+
+ /*
* CRDA provides reduced TX power than actual regulatory max TX power.
* Value of 0 to the local power constraint provides an opportunity
* for the client devices to operate at the power limit provided by CRDA
@@ -124,7 +156,10 @@ static u8 * hostapd_eid_pwr_constraint(struct hostapd_data *hapd, u8 *eid)
/* Length */
*pos++ = 1;
/* Local Power Constraint */
- *pos++ = hapd->iconf->local_pwr_constraint;
+ if (local_pwr_constraint)
+ *pos++ = local_pwr_constraint;
+ else
+ *pos++ = hapd->iconf->local_pwr_constraint;
return pos;
}
@@ -801,3 +801,22 @@ int hostapd_dfs_nop_finished(struct hostapd_iface *iface, int freq,
cf1, cf2, HOSTAPD_CHAN_DFS_USABLE);
return 0;
}
+
+int hostapd_is_dfs_required(struct hostapd_iface *iface)
+{
+ int n_chans, start_chan_idx;
+ int res = 0;
+
+ /* Get start (first) channel for current configuration */
+ start_chan_idx = dfs_get_start_chan_idx(iface);
+ if (start_chan_idx == -1)
+ return -1;
+
+ /* Get number of used channels, depend on width */
+ n_chans = dfs_get_used_n_chans(iface);
+
+ /* Check if any of configured channels require DFS */
+ res = dfs_check_chans_radar(iface, start_chan_idx, n_chans);
+
+ return res;
+}
@@ -21,5 +21,7 @@ int hostapd_dfs_radar_detected(struct hostapd_iface *iface, int freq,
int hostapd_dfs_nop_finished(struct hostapd_iface *iface, int freq,
int ht_enabled,
int chan_offset, int chan_width, int cf1, int cf2);
+int hostapd_is_dfs_required(struct hostapd_iface *iface);
+
#endif /* DFS_H */
@@ -38,6 +38,7 @@
#include "ap_drv_ops.h"
#include "wnm_ap.h"
#include "ieee802_11.h"
+#include "dfs.h"
u8 * hostapd_eid_supp_rates(struct hostapd_data *hapd, u8 *eid)
@@ -137,6 +138,15 @@ u16 hostapd_own_capab_info(struct hostapd_data *hapd, struct sta_info *sta,
{
int capab = WLAN_CAPABILITY_ESS;
int privacy;
+ int dfs;
+
+ /* Check if any of configured channels require DFS */
+ dfs = hostapd_is_dfs_required(hapd->iface);
+ if (dfs < 0 ) {
+ wpa_printf(MSG_WARNING, "Failed to check if dfs "
+ "is required ret=%d", dfs);
+ dfs = 0;
+ }
if (hapd->iface->num_sta_no_short_preamble == 0 &&
hapd->iconf->preamble == SHORT_PREAMBLE)
@@ -174,6 +184,17 @@ u16 hostapd_own_capab_info(struct hostapd_data *hapd, struct sta_info *sta,
hapd->iface->num_sta_no_short_slot_time == 0)
capab |= WLAN_CAPABILITY_SHORT_SLOT_TIME;
+ /*
+ * Currently Spectrum Management capability bit is set when directly
+ * requested in configuration by spectrum_mgmt_required or when AP is
+ * running on DFS channel.
+ * TODO: Also consider driver support for TPC to set Spectrum Mgmt bit
+ */
+ if (hapd->iface->current_mode &&
+ hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211A &&
+ (hapd->iconf->spectrum_mgmt_required || dfs))
+ capab |= WLAN_CAPABILITY_SPECTRUM_MGMT;
+
return capab;
}
From: Chaitanya T K <chaitanyatk@posedge.com> Add configuration of Spectrum Managment subfield in the Capability Information of Beacon, Probe Response and Association Response. Spectrum Management bit is set when directly requested by new configuration option spectrum_mgmt_required=1 or when AP is running on DFS channels. In future also TPC shall require this bit to be set. Signed-hostap: Srinivasan <srinivasanb@posedge.com> Signed-hostap: Chaitanya T K <chaitanyatk@posedge.com> Signed-hostap: Marek Puzyniak <marek.puzyniak@tieto.com> --- hostapd/config_file.c | 2 ++ hostapd/hostapd.conf | 7 +++++++ src/ap/ap_config.c | 6 ++++++ src/ap/ap_config.h | 3 +++ src/ap/beacon.c | 43 +++++++++++++++++++++++++++++++++++++++---- src/ap/dfs.c | 19 +++++++++++++++++++ src/ap/dfs.h | 2 ++ src/ap/ieee802_11.c | 21 +++++++++++++++++++++ 8 files changed, 99 insertions(+), 4 deletions(-)