]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
ACS: Add HT40- support in the 2.4 GHz band
authorMichael-CY Lee <michael-cy.lee@mediatek.com>
Fri, 22 Dec 2023 04:59:08 +0000 (12:59 +0800)
committerJouni Malinen <j@w1.fi>
Sat, 23 Dec 2023 13:16:57 +0000 (15:16 +0200)
Allow ACS to pick a HT40- channel in the 2.4 GHz band in addition to the
previously hardcoded HT40+ case.

Co-developed-by: Money Wang <money.wang@mediatek.com>
Signed-off-by: Michael-CY Lee <michael-cy.lee@mediatek.com>
src/ap/acs.c

index 7ab310f75a557b1854ec80bc766ad6b0997b6dc8..8c6621f0edbc22fcc3197a1df8c43617705adcfa 100644 (file)
@@ -787,6 +787,10 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
        long double factor;
        int i, j;
        unsigned int k;
+       int secondary_channel = 1, freq_offset;
+
+       if (is_24ghz_mode(mode->mode))
+               secondary_channel = iface->conf->secondary_channel;
 
        for (i = 0; i < mode->num_channels; i++) {
                double total_weight;
@@ -825,7 +829,7 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
                    iface->conf->country[2] == 0x4f)
                        continue;
 
-               if (!chan_bw_allowed(chan, bw, 1, 1)) {
+               if (!chan_bw_allowed(chan, bw, secondary_channel != -1, 1)) {
                        wpa_printf(MSG_DEBUG,
                                   "ACS: Channel %d: BW %u is not supported",
                                   chan->chan, bw);
@@ -884,7 +888,8 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
                total_weight = 1;
 
                for (j = 1; j < n_chans; j++) {
-                       adj_chan = acs_find_chan(iface, chan->freq + (j * 20));
+                       adj_chan = acs_find_chan(iface, chan->freq +
+                                                j * secondary_channel * 20);
                        if (!adj_chan)
                                break;
 
@@ -932,8 +937,9 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
                 * channel interference factor. */
                if (is_24ghz_mode(mode->mode)) {
                        for (j = 0; j < n_chans; j++) {
+                               freq_offset = j * 20 * secondary_channel;
                                adj_chan = acs_find_chan(iface, chan->freq +
-                                                        (j * 20) - 5);
+                                                        freq_offset - 5);
                                if (adj_chan && acs_usable_chan(adj_chan)) {
                                        factor += ACS_ADJ_WEIGHT *
                                                adj_chan->interference_factor;
@@ -941,7 +947,7 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
                                }
 
                                adj_chan = acs_find_chan(iface, chan->freq +
-                                                        (j * 20) - 10);
+                                                        freq_offset - 10);
                                if (adj_chan && acs_usable_chan(adj_chan)) {
                                        factor += ACS_NEXT_ADJ_WEIGHT *
                                                adj_chan->interference_factor;
@@ -949,7 +955,7 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
                                }
 
                                adj_chan = acs_find_chan(iface, chan->freq +
-                                                        (j * 20) + 5);
+                                                        freq_offset + 5);
                                if (adj_chan && acs_usable_chan(adj_chan)) {
                                        factor += ACS_ADJ_WEIGHT *
                                                adj_chan->interference_factor;
@@ -957,7 +963,7 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
                                }
 
                                adj_chan = acs_find_chan(iface, chan->freq +
-                                                        (j * 20) + 10);
+                                                        freq_offset + 10);
                                if (adj_chan && acs_usable_chan(adj_chan)) {
                                        factor += ACS_NEXT_ADJ_WEIGHT *
                                                adj_chan->interference_factor;
@@ -1042,14 +1048,6 @@ acs_find_ideal_chan(struct hostapd_iface *iface)
                goto bw_selected;
        }
 
-       /* TODO: HT40- support */
-
-       if (iface->conf->ieee80211n &&
-           iface->conf->secondary_channel == -1) {
-               wpa_printf(MSG_ERROR, "ACS: HT40- is not supported yet. Please try HT40+");
-               return NULL;
-       }
-
        if (iface->conf->ieee80211n &&
            iface->conf->secondary_channel)
                n_chans = 2;