From 89de64c5c05f0629943fd37806e9d02269680972 Mon Sep 17 00:00:00 2001 From: Michal Kazior Date: Wed, 5 Mar 2014 09:12:11 +0100 Subject: [PATCH] ACS: Fix VHT80 segment picking For example, the previous implementation considered [44, 48, 52, 56] to be a valid VHT80 channel -- which it is not. This resulted in, e.g., failure to start CAC when channels on overlapped segments included DFS channels. Add a check similar to the HT40 one to prevent that. The check is performed this way as the ACS implementation assumes the primary channel to be the first channel in a given segment. Signed-off-by: Michal Kazior --- src/ap/acs.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/ap/acs.c b/src/ap/acs.c index f58b091e0..60b75800d 100644 --- a/src/ap/acs.c +++ b/src/ap/acs.c @@ -367,6 +367,19 @@ static int acs_usable_ht40_chan(struct hostapd_channel_data *chan) } +static int acs_usable_vht80_chan(struct hostapd_channel_data *chan) +{ + const int allowed[] = { 36, 52, 100, 116, 132, 149 }; + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(allowed); i++) + if (chan->chan == allowed[i]) + return 1; + + return 0; +} + + static int acs_survey_is_sufficient(struct freq_survey *survey) { if (!(survey->filled & SURVEY_HAS_NF)) { @@ -541,6 +554,15 @@ acs_find_ideal_chan(struct hostapd_iface *iface) continue; } + if (iface->current_mode->mode == HOSTAPD_MODE_IEEE80211A && + iface->conf->ieee80211ac && + iface->conf->vht_oper_chwidth == 1 && + !acs_usable_vht80_chan(chan)) { + wpa_printf(MSG_DEBUG, "ACS: Channel %d: not allowed as primary channel for VHT80", + chan->chan); + continue; + } + factor = 0; if (acs_usable_chan(chan)) factor = chan->interference_factor;