[PATCH 3/4] ACS: add supported channel BW checking

Dmitrii Lebed dlebed at quantenna.com
Thu Mar 1 03:49:28 PST 2018


From: Dmitry Lebed <dlebed at quantenna.com>

While doing automatic channel selection we need
to take into account supported BW for each channel
provided via nl80211.
Without this modification hostapd can select unsupported
channel, will fail to use it and eventually will not start.

Signed-off-by: Dmitry Lebed <dlebed at quantenna.com>
---
 src/ap/acs.c | 28 +++++++++++++++++++++++-----
 1 file changed, 23 insertions(+), 5 deletions(-)

diff --git a/src/ap/acs.c b/src/ap/acs.c
index aa5905894..9ce5ca8f6 100644
--- a/src/ap/acs.c
+++ b/src/ap/acs.c
@@ -13,6 +13,7 @@
 #include "utils/common.h"
 #include "utils/list.h"
 #include "common/ieee802_11_defs.h"
+#include "common/hw_features_common.h"
 #include "common/wpa_ctrl.h"
 #include "drivers/driver.h"
 #include "hostapd.h"
@@ -565,6 +566,7 @@ acs_find_ideal_chan(struct hostapd_iface *iface)
        long double factor, ideal_factor = 0;
        int i, j;
        int n_chans = 1;
+       u32 bw;
        unsigned int k;

        /* TODO: HT40- support */
@@ -583,12 +585,12 @@ acs_find_ideal_chan(struct hostapd_iface *iface)
            iface->conf->vht_oper_chwidth == 1)
                n_chans = 4;

+       bw = num_chan_to_bw(n_chans);
+
        /* TODO: VHT80+80, VHT160. Update acs_adjust_vht_center_freq() too. */

-       wpa_printf(MSG_DEBUG, "ACS: Survey analysis for selected bandwidth %d MHz",
-                  n_chans == 1 ? 20 :
-                  n_chans == 2 ? 40 :
-                  80);
+       wpa_printf(MSG_DEBUG, "ACS: Survey analysis for selected bandwidth %u MHz",
+                  bw);

        for (i = 0; i < iface->current_mode->num_channels; i++) {
                double total_weight;
@@ -596,12 +598,22 @@ acs_find_ideal_chan(struct hostapd_iface *iface)

                chan = &iface->current_mode->channels[i];

-               if (chan->flag & HOSTAPD_CHAN_DISABLED)
+               /* Since in current ACS implementation first channel is
+                * always a primary channel, skip channels not available as
+                * primary until more sophisticated channel selection will be
+                * implemented */
+               if (!chan_pri_allowed(chan))
                        continue;

                if (!is_in_chanlist(iface, chan))
                        continue;

+               if (!chan_bw_allowed(chan, bw, 1, 1)) {
+                       wpa_printf(MSG_DEBUG, "ACS: Channel %d: BW %u is not supported",
+                                  chan->chan, bw);
+                       continue;
+               }
+
                /* HT40 on 5 GHz has a limited set of primary channels as per
                 * 11n Annex J */
                if (iface->current_mode->mode == HOSTAPD_MODE_IEEE80211A &&
@@ -632,6 +644,12 @@ acs_find_ideal_chan(struct hostapd_iface *iface)
                        if (!adj_chan)
                                break;

+                       if (!chan_bw_allowed(adj_chan, bw, 1, 0)) {
+                               wpa_printf(MSG_DEBUG, "ACS: PRI Channel %d: secondary channel %d BW %u is not supported",
+                                          chan->chan, adj_chan->chan, bw);
+                               break;
+                       }
+
                        if (acs_usable_chan(adj_chan)) {
                                factor += adj_chan->interference_factor;
                                total_weight += 1;
--
2.16.1



This email, including its contents and any attachment(s), may contain confidential information of Quantenna Communications, Inc. and is solely for the intended recipient(s). If you may have received this in error, please contact the sender and permanently delete this email, its contents and any attachment(s).



More information about the Hostap mailing list