Re: [RFC PATCH 3/4] ACS: introduce acs_adjust_secondary

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxx>
> ---
>  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


_______________________________________________
Hostap mailing list
Hostap@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/hostap



[Index of Archives]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux