[PATCH v2 4/4] ACS: allow selecting a better channel when using 40/80/160MHz

Nicolas Escande nico.escande at gmail.com
Wed Apr 27 06:37:02 PDT 2022


When considering a channel for a bandwidth of 40/80/160MHZ on 5/6GHz,
allow selecting one of the other channels in the segment instead of the
first one. This is done only if it's interference_factor is lower than
the first one.

Signed-off-by: Nicolas Escande <nico.escande at gmail.com>
---
 src/ap/acs.c | 31 +++++++++++++++++++++++++------
 1 file changed, 25 insertions(+), 6 deletions(-)

diff --git a/src/ap/acs.c b/src/ap/acs.c
index 176b22e67..b07309c98 100644
--- a/src/ap/acs.c
+++ b/src/ap/acs.c
@@ -708,7 +708,7 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
 			 struct hostapd_channel_data **ideal_chan,
 			 long double *ideal_factor)
 {
-	struct hostapd_channel_data *chan, *adj_chan = NULL;
+	struct hostapd_channel_data *chan, *adj_chan = NULL, *best;
 	long double factor;
 	int i, j;
 	unsigned int k;
@@ -717,7 +717,7 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
 		double total_weight;
 		struct acs_bias *bias, tmp_bias;
 
-		chan = &mode->channels[i];
+		best = chan = &mode->channels[i];
 
 		/* Since in the current ACS implementation the first channel is
 		 * always a primary channel, skip channels not available as
@@ -797,10 +797,16 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
 				break;
 			}
 
-			if (acs_usable_chan(adj_chan)) {
-				factor += adj_chan->interference_factor;
-				total_weight += 1;
-			}
+			if (!acs_usable_chan(adj_chan))
+				break;
+
+			factor += adj_chan->interference_factor;
+			total_weight += 1;
+
+			/* find the best channel in this segment */
+			if (adj_chan->interference_factor <
+			    best->interference_factor)
+				best = adj_chan;
 		}
 
 		if (j != n_chans) {
@@ -809,6 +815,19 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
 			continue;
 		}
 
+		/* If the AP is in the 5/6 GHz, lets prefer a less crowded
+		 * primary channel if one was found in the segment */
+		if (iface->current_mode->mode == HOSTAPD_MODE_IEEE80211A &&
+		    chan != best) {
+			wpa_printf(MSG_DEBUG,
+				   "ACS: promoting channel %d over %d"
+				   " (less interference %Lg/%Lg)",
+				   best->chan, chan->chan,
+				   chan->interference_factor,
+				   best->interference_factor);
+			chan = best;
+		}
+
 		/* 2.4 GHz has overlapping 20 MHz channels. Include adjacent
 		 * channel interference factor. */
 		if (is_24ghz_mode(mode->mode)) {
-- 
2.36.0




More information about the Hostap mailing list