On Tue, Oct 08, 2019 at 11:31:02AM +0200, Tobias Heider wrote:
> Restore the BSS channel only if iee80211_input() has not changed the BSS.
> The same change was added to iwm a year ago, for a more detailed explanation
> see https://marc.info/?l=openbsd-tech&m=153407168731621&w=2
> 
> ok?
> 
> Index: sys/dev/pci/if_iwn.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_iwn.c,v
> retrieving revision 1.217
> diff -u -p -r1.217 if_iwn.c
> --- sys/dev/pci/if_iwn.c      18 Sep 2019 23:52:32 -0000      1.217
> +++ sys/dev/pci/if_iwn.c      8 Oct 2019 09:21:18 -0000
> @@ -2017,6 +2017,7 @@ iwn_rx_done(struct iwn_softc *sc, struct
>       struct ieee80211_rxinfo rxi;
>       struct ieee80211_node *ni;
>       struct ieee80211_channel *bss_chan = NULL;
> +     uint8_t saved_bssid[IEEE80211_ADDR_LEN] = { 0 };
>       struct mbuf *m, *m1;
>       struct iwn_rx_stat *stat;
>       caddr_t head;
> @@ -2183,8 +2184,14 @@ iwn_rx_done(struct iwn_softc *sc, struct
>               chan = IEEE80211_CHAN_MAX;
>  
>       /* Fix current channel. */
> -     if (ni == ic->ic_bss)
> +     if (ni == ic->ic_bss) {
> +             /*
> +              * We may switch ic_bss's channel during scans.
> +              * Record the current channel so we can restore it later.
> +              */
>               bss_chan = ni->ni_chan;
> +             IEEE80211_ADDR_COPY(&saved_bssid, ni->ni_macaddr);
> +     }
>       ni->ni_chan = &ic->ic_channels[chan];
>  
>  #if NBPFILTER > 0
> @@ -2236,8 +2243,11 @@ iwn_rx_done(struct iwn_softc *sc, struct
>       rxi.rxi_tstamp = 0;     /* unused */
>       ieee80211_inputm(ifp, m, ni, &rxi, ml);
>  
> -     /* Restore BSS channel. */
> -     if (ni == ic->ic_bss)
> +     /*
> +      * ieee80211_input() might have changed our BSS.
 
The above comment is using an outdated function name.
This function is now called ieee80211_inputm().
OK with that fixed.

Thanks for following up on this. I forgot about fixing this driver :-/
Could you check if any other drivers may need a similar fix?

> +      * Restore ic_bss's channel if we are still in the same BSS.
> +      */
> +     if (ni == ic->ic_bss && IEEE80211_ADDR_EQ(saved_bssid, ni->ni_macaddr))
>               ni->ni_chan = bss_chan;
>  
>       /* Node is no longer needed. */
> 

Reply via email to