[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openbsd-tech
Subject:    Re: iwn/iwm: ignore missed beacons during background scan
From:       Stefan Sperling <stsp () stsp ! name>
Date:       2018-01-31 11:59:03
Message-ID: 20180131115903.GG98299 () ted ! stsp ! name
[Download RAW message or body]

On Wed, Jan 24, 2018 at 06:42:42PM +0100, Stefan Sperling wrote:
> I just observed iwn(4) firmware reporting a missed beacon event
> during a background scan:
> 
> Jan 24 18:24:50 laptop /bsd: iwn0: begin background scan
> Jan 24 18:24:57 laptop /bsd: iwn0: sending probe_req to xx:xx:xx:xx:xx:xx on channel 10 mode 11g
> Jan 24 18:24:59 laptop /bsd: iwn0: end background scan
> 
> Under normal conditions, a missed beacon event triggers a probe request
> being sent to our current AP. If the AP does respond, all is good. If it
> does not respond, we assume the AP has gone away and we go to SCAN state.
> 
> But in the above case the driver lost link and didn't recover (i.e. it
> never came back out of SCAN state).

Turns out lost link is a separate issue. I still think preventing bgscan
and beacon miss from stepping on each other would be worthwhile to prevent
(theoretical) problems but I am going to send a different fix soon for
the lost link issue.

> 
> One obvious solution is to ignore missed beacon events while a
> background scan is in progress. This should prevent both of these
> mechanisms from interacting with each other in unfortunate ways.
> 
> ok?
> 
> Index: if_iwm.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v
> retrieving revision 1.223
> diff -u -p -r1.223 if_iwm.c
> --- if_iwm.c	14 Jan 2018 11:51:34 -0000	1.223
> +++ if_iwm.c	24 Jan 2018 17:27:08 -0000
> @@ -3673,6 +3673,9 @@ iwm_rx_bmiss(struct iwm_softc *sc, struc
>  	    (ic->ic_state != IEEE80211_S_RUN))
>  		return;
>  
> +	if (sc->sc_flags & IWM_FLAG_BGSCAN)
> +		return;
> +
>  	bus_dmamap_sync(sc->sc_dmat, data->map, sizeof(*pkt),
>  	    sizeof(*mbn), BUS_DMASYNC_POSTREAD);
>  
> Index: if_iwn.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_iwn.c,v
> retrieving revision 1.198
> diff -u -p -r1.198 if_iwn.c
> --- if_iwn.c	9 Jan 2018 10:00:12 -0000	1.198
> +++ if_iwn.c	24 Jan 2018 17:26:24 -0000
> @@ -2530,6 +2530,9 @@ iwn_notif_intr(struct iwn_softc *sc)
>  			    (ic->ic_state != IEEE80211_S_RUN))
>  				break;
>  
> +			if (ic->ic_flags & IWN_FLAG_BGSCAN)
> +				break;
> +
>  			bus_dmamap_sync(sc->sc_dmat, data->map, sizeof (*desc),
>  			    sizeof (*miss), BUS_DMASYNC_POSTREAD);
>  			missed = letoh32(miss->consecutive);
> 

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic