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 <michal.kazior@tieto.com>
This commit is contained in:
Michal Kazior 2014-03-05 09:12:11 +01:00 committed by Jouni Malinen
parent 1f37483416
commit 89de64c5c0

View file

@ -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) static int acs_survey_is_sufficient(struct freq_survey *survey)
{ {
if (!(survey->filled & SURVEY_HAS_NF)) { if (!(survey->filled & SURVEY_HAS_NF)) {
@ -541,6 +554,15 @@ acs_find_ideal_chan(struct hostapd_iface *iface)
continue; 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; factor = 0;
if (acs_usable_chan(chan)) if (acs_usable_chan(chan))
factor = chan->interference_factor; factor = chan->interference_factor;