]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
ACS: Introduce acs_get_bw_center_chan()
authorNicolas Escande <nico.escande@gmail.com>
Wed, 27 Apr 2022 13:37:00 +0000 (15:37 +0200)
committerJouni Malinen <j@w1.fi>
Mon, 28 Nov 2022 21:22:35 +0000 (23:22 +0200)
When using 40/80/160 MHz bandwidth, instead of computing the index of
the segment center freq based on the selected channel, lets look it up
in the bw_desc[] table.

This is preparative work to allow selecting a primary channel which is
not the first of the segment.

Signed-off-by: Nicolas Escande <nico.escande@gmail.com>
src/ap/acs.c

index 03761aec865389fd0675ff0ec2b5c8e240e062b7..703a7a80c81a7529c9db4f73e6e128627a6bdefb 100644 (file)
@@ -436,6 +436,21 @@ static bool acs_usable_bw_chan(const struct hostapd_channel_data *chan,
 }
 
 
+static int acs_get_bw_center_chan(int freq, enum bw_type bw)
+{
+       unsigned int i = 0;
+
+       while (bw_desc[bw][i].first != -1) {
+               if (freq >= bw_desc[bw][i].first &&
+                   freq <= bw_desc[bw][i].last)
+                       return bw_desc[bw][i].center_chan;
+               i++;
+       }
+
+       return 0;
+}
+
+
 static int acs_survey_is_sufficient(struct freq_survey *survey)
 {
        if (!(survey->filled & SURVEY_HAS_NF)) {
@@ -944,19 +959,26 @@ bw_selected:
 
 static void acs_adjust_center_freq(struct hostapd_iface *iface)
 {
-       int offset;
+       int center;
 
        wpa_printf(MSG_DEBUG, "ACS: Adjusting VHT center frequency");
 
        switch (hostapd_get_oper_chwidth(iface->conf)) {
        case CONF_OPER_CHWIDTH_USE_HT:
-               offset = 2 * iface->conf->secondary_channel;
+               if (iface->conf->secondary_channel &&
+                   iface->freq >= 2400 && iface->freq < 2500)
+                       center = iface->conf->channel +
+                               2 * iface->conf->secondary_channel;
+               else if (iface->conf->secondary_channel)
+                       center = acs_get_bw_center_chan(iface->freq, ACS_BW40);
+               else
+                       center = iface->conf->channel;
                break;
        case CONF_OPER_CHWIDTH_80MHZ:
-               offset = 6;
+               center = acs_get_bw_center_chan(iface->freq, ACS_BW80);
                break;
        case CONF_OPER_CHWIDTH_160MHZ:
-               offset = 14;
+               center = acs_get_bw_center_chan(iface->freq, ACS_BW160);
                break;
        default:
                /* TODO: How can this be calculated? Adjust
@@ -966,8 +988,7 @@ static void acs_adjust_center_freq(struct hostapd_iface *iface)
                return;
        }
 
-       hostapd_set_oper_centr_freq_seg0_idx(iface->conf,
-                                            iface->conf->channel + offset);
+       hostapd_set_oper_centr_freq_seg0_idx(iface->conf, center);
 }