[RFC PATCH 3/4] ACS: introduce acs_adjust_secondary
Nicolas Escande
nico.escande at gmail.com
Fri Mar 25 08:26:45 PDT 2022
On Thu Mar 24, 2022 at 3:19 PM CET, Nicolas Escande wrote:
> When using 40/80/160MHz over 5G/6G, enforce the secondary channel to be
> the other channel of the corresponding 40MHz segment.
>
> Even if this is useless for now, this is preparatory work to allow
> ACS to select a primary channel which is not the first of it's segment.
>
> Signed-off-by: Nicolas Escande <nico.escande at gmail.com>
> ---
> src/ap/acs.c | 43 ++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 42 insertions(+), 1 deletion(-)
>
> diff --git a/src/ap/acs.c b/src/ap/acs.c
> index 30f2e8d08..9e1810901 100644
> --- a/src/ap/acs.c
> +++ b/src/ap/acs.c
> @@ -670,6 +670,24 @@ acs_find_chan_mode(struct hostapd_hw_modes *mode, int freq)
> return NULL;
> }
>
> +static enum hostapd_hw_mode
> +acs_find_mode(struct hostapd_iface *iface, int freq)
> +{
> + int i;
> + struct hostapd_hw_modes *mode;
> + struct hostapd_channel_data *chan;
> +
> + for (i = 0; i < iface->num_hw_features; i++) {
> + mode = &iface->hw_features[i];
> + if (!hostapd_hw_skip_mode(iface, mode)) {
> + chan = acs_find_chan_mode(mode, freq);
> + if (chan)
> + return mode->mode;
> + }
> + }
> +
> + return HOSTAPD_MODE_IEEE80211ANY;
> +}
>
> static struct hostapd_channel_data *
> acs_find_chan(struct hostapd_iface *iface, int freq)
> @@ -981,6 +999,27 @@ bw_selected:
> }
>
>
> +static void acs_adjust_secondary(struct hostapd_iface *iface)
> +{
> + unsigned int i;
> +
> + /* When working with bw > 20 on 5G/6G, ACS can return a secondary wich
> + * is not channel the first of the segment & wee need to abjust */
> + if (!iface->conf->secondary_channel ||
> + acs_find_mode(iface, iface->freq) != HOSTAPD_MODE_IEEE80211A)
> + return;
> +
> + wpa_printf(MSG_DEBUG, "ACS: Adjusting HT/VHT/HE secondary frequency");
> +
> + for (i = 0; i < ARRAY_SIZE(bw40_seg); i++) {
> + if (iface->freq == bw40_seg[i].first)
> + iface->conf->secondary_channel = 1;
> + else /* (iface->freq == bw40_seg[i].last) */
This one should read else if (iface->freq == bw40_seg[i].last)
I'll send and updated V2 later on with other remarks if any
> + iface->conf->secondary_channel = -1;
> + }
> +}
> +
> +
> static void acs_adjust_center_freq(struct hostapd_iface *iface)
> {
> int center;
> @@ -1063,8 +1102,10 @@ static void acs_study(struct hostapd_iface *iface)
> iface->conf->channel = ideal_chan->chan;
> iface->freq = ideal_chan->freq;
>
> - if (iface->conf->ieee80211ac || iface->conf->ieee80211ax)
> + if (iface->conf->ieee80211ac || iface->conf->ieee80211ax) {
> + acs_adjust_secondary(iface);
> acs_adjust_center_freq(iface);
> + }
>
> err = 0;
> fail:
> --
> 2.35.1
More information about the Hostap
mailing list