On Wed, Sep 10, 2014 at 02:06:15PM +0200, Marcin Piotr Pawlowski wrote:
> On 09/10/14 10:15, Stefan Sperling wrote:
> > On Tue, Sep 09, 2014 at 10:17:59PM +0200, Fabian Raetz wrote:
> >> Hm interesting ... i can reproduce it here with an 2.4GHz AP.
> >> The entry isn't cleared when scanning and the interface is up.
> >>
> >> Scanning when the interface is down works correct for me.
> >> I will take a look at it tommorow :)
> >>
> >> 2014-09-09 21:48 GMT+02:00 Stuart Henderson <st...@openbsd.org>:
> >>
> >>> I have just noticed one thing with this; the 5GHz AP which I powered up 
> >>> for
> >>> a test is still showing in my current scan result long after I turned it
> >>> off
> >>> again. Caching issue somewhere?
> >>>
> >>>
> > 
> > Try this with other wifi cards, too. The AP could be lingering
> > in the net80211 node cache which is device independent.
> > 
> 
> I think that the hypothesis with net80211 node cache was correct. And
> following diff solves this issue for me.
> 
> Best regards,
> mpp

> Index: ieee80211_ioctl.c
> ===================================================================
> RCS file: /cvs/src/sys/net80211/ieee80211_ioctl.c,v
> retrieving revision 1.35
> diff -u -r1.35 ieee80211_ioctl.c
> --- ieee80211_ioctl.c 10 Jul 2014 14:32:28 -0000      1.35
> +++ ieee80211_ioctl.c 10 Sep 2014 12:04:13 -0000
> @@ -645,6 +645,7 @@
>                       error = ENETDOWN;
>                       break;
>               }
> +             ieee80211_clean_cached(ic);

Perhaps I'm wrong but couldn't this remove cached nodes while
a scan is already in progress?

Wouldn't it be better to only clean the cache before the
ieee80211_new_state(ic, IEEE80211_S_SCAN, -1); call
within the following if statement?

>               if ((ic->ic_scan_lock & IEEE80211_SCAN_REQUEST) == 0) {
>                       if (ic->ic_scan_lock & IEEE80211_SCAN_LOCKED)
>                               ic->ic_scan_lock |= IEEE80211_SCAN_RESUME;
> Index: ieee80211_node.c
> ===================================================================
> RCS file: /cvs/src/sys/net80211/ieee80211_node.c,v
> retrieving revision 1.82
> diff -u -r1.82 ieee80211_node.c
> --- ieee80211_node.c  8 Aug 2014 15:16:39 -0000       1.82
> +++ ieee80211_node.c  10 Sep 2014 12:04:13 -0000
> @@ -1134,6 +1134,21 @@
>               ieee80211_node_cleanup(ic, ic->ic_bss); /* for station mode */
>  }
>  
> +void
> +ieee80211_clean_cached(struct ieee80211com *ic)
> +{
> +     struct ieee80211_node *ni, *next_ni;
> +     int s;
> +
> +     s = splnet();
> +     for (ni = RB_MIN(ieee80211_tree, &ic->ic_tree);
> +         ni != NULL; ni = next_ni) {
> +             next_ni = RB_NEXT(ieee80211_tree, &ic->ic_tree, ni);
> +             if (ni->ni_state == IEEE80211_STA_CACHE)
> +                     ieee80211_free_node(ic, ni);
> +     }
> +     splx(s);
> +}
>  /*
>   * Timeout inactive nodes.
>   *
> Index: ieee80211_node.h
> ===================================================================
> RCS file: /cvs/src/sys/net80211/ieee80211_node.h,v
> retrieving revision 1.45
> diff -u -r1.45 ieee80211_node.h
> --- ieee80211_node.h  20 Mar 2014 13:19:06 -0000      1.45
> +++ ieee80211_node.h  10 Sep 2014 12:04:13 -0000
> @@ -325,6 +325,7 @@
>  typedef void ieee80211_iter_func(void *, struct ieee80211_node *);
>  extern       void ieee80211_iterate_nodes(struct ieee80211com *ic,
>               ieee80211_iter_func *, void *);
> +extern       void ieee80211_clean_cached(struct ieee80211com *ic);
>  extern       void ieee80211_clean_nodes(struct ieee80211com *, int);
>  extern       int ieee80211_setup_rates(struct ieee80211com *,
>           struct ieee80211_node *, const u_int8_t *, const u_int8_t *, int);

Reply via email to