From: Nicolas Escande Date: Wed, 27 Apr 2022 13:37:00 +0000 (+0200) Subject: ACS: Introduce acs_get_bw_center_chan() X-Git-Tag: hostap_2_11~1449 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=60e2934cbf713abf279cac03376e4ba2cd87b825;p=thirdparty%2Fhostap.git ACS: Introduce acs_get_bw_center_chan() 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 --- diff --git a/src/ap/acs.c b/src/ap/acs.c index 03761aec8..703a7a80c 100644 --- a/src/ap/acs.c +++ b/src/ap/acs.c @@ -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); }