Search Linux Wireless

Re: [PATCH] ath9k: reset survey of current channel after a scan started

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

 



Hancheng Yang <hyang@xxxxxxxxxx> writes:

> In the `ath_set_channel()` function, we only reset surveys that are not from the current channel.
> This leads to the accumulation of survey data for the current channel indefinitely.
> Log of hostapd:
> [2023-08-17 11:21:51] ACS: Survey analysis for channel 1 (2412 MHz)
> [2023-08-17 11:21:51] ACS: 1: min_nf=-90 interference_factor=0.569833 nf=-89 time=36194 busy=20908 rx=16200
> [2023-08-17 11:21:51] ACS: 2: min_nf=-90 interference_factor=0.572018 nf=-89 time=36539 busy=21183 rx=16425
> [2023-08-17 11:21:51] ACS: 3: min_nf=-90 interference_factor=0.574311 nf=-90 time=36885 busy=21464 rx=16659
> [2023-08-17 11:21:51] ACS: 4: min_nf=-90 interference_factor=0.5773 nf=-89 time=37231 busy=21772 rx=16924
> [2023-08-17 11:21:51] ACS: 5: min_nf=-90 interference_factor=0.580108 nf=-89 time=37578 busy=22076 rx=17189
>
>
> This may not be the most optimal approach, as we want the ACS to rely on the most recent survey.
> So, reset the survey data for the current channel at the start of each scan.
>
> Or there's better approach?

Johannes, Jouni, any thoughts? :)

-Toke

>
> Signed-off-by: Hancheng Yang <hyang@xxxxxxxxxx>
> ---
>  drivers/net/wireless/ath/ath9k/main.c | 15 +++++++++++++++
>  1 file changed, 15 insertions(+)
>
> diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
> index fa5a87f021e2..3e4a711c96bb 100644
> --- a/drivers/net/wireless/ath/ath9k/main.c
> +++ b/drivers/net/wireless/ath/ath9k/main.c
> @@ -2382,7 +2382,22 @@ static void ath9k_sw_scan_start(struct ieee80211_hw *hw,
>  {
>  	struct ath_softc *sc = hw->priv;
>  	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
> +	struct cfg80211_chan_def *chandef = &sc->cur_chan->chandef;
> +	struct ieee80211_channel *chan = chandef->chan;
> +	int pos = chan->hw_value;
>  	set_bit(ATH_OP_SCANNING, &common->op_flags);
> +
> +	/* Reset current survey */
> +	if (!sc->cur_chan->offchannel) {
> +		if (sc->cur_survey != &sc->survey[pos]) {
> +			if (sc->cur_survey)
> +				sc->cur_survey->filled &= ~SURVEY_INFO_IN_USE;
> +			sc->cur_survey = &sc->survey[pos];
> +		}
> +
> +		memset(sc->cur_survey, 0, sizeof(struct survey_info));
> +		sc->cur_survey->filled |= SURVEY_INFO_IN_USE;
> +	}
>  }
>  
>  static void ath9k_sw_scan_complete(struct ieee80211_hw *hw,
> -- 
> 2.34.1



[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux