Yes, I think that it could be is possible to double clean the node cache. Updated diff with suggestion from Stefan.
Best regards, mpp On 09/10/14 14:34, Stefan Sperling wrote: > 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); >
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:39:36 -0000 @@ -649,8 +649,10 @@ if (ic->ic_scan_lock & IEEE80211_SCAN_LOCKED) ic->ic_scan_lock |= IEEE80211_SCAN_RESUME; ic->ic_scan_lock |= IEEE80211_SCAN_REQUEST; - if (ic->ic_state != IEEE80211_S_SCAN) + if (ic->ic_state != IEEE80211_S_SCAN) { + ieee80211_clean_cached(ic); ieee80211_new_state(ic, IEEE80211_S_SCAN, -1); + } } /* Let the userspace process wait for completion */ error = tsleep(&ic->ic_scan_lock, PCATCH, "80211scan", 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:39:36 -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:39:36 -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);