ACS: Fix VHT80 segment picking
authorMichal Kazior <michal.kazior@tieto.com>
Wed, 5 Mar 2014 08:12:11 +0000 (09:12 +0100)
committerJouni Malinen <j@w1.fi>
Wed, 5 Mar 2014 22:01:29 +0000 (00:01 +0200)
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>
src/ap/acs.c

index f58b091..60b7580 100644 (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)
 {
        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;