On 2012/07/18 12:51, Stefan Sperling wrote: > Node cache eviction is too agressive, possibly kicking off associated > stations for no good reason. I missed that associated stations are in > state IEEE80211_S_RUN rather than IEEE80211_S_ASSOC (which means "trying > to associate").
there's ieee80211_node_state with the IEEE80211_STA_* enum .. enum ieee80211_node_state { IEEE80211_STA_CACHE, /* cached node */ IEEE80211_STA_BSS, /* ic->ic_bss, the network we joined */ IEEE80211_STA_AUTH, /* successfully authenticated */ IEEE80211_STA_ASSOC, /* successfully associated */ IEEE80211_STA_COLLECT /* This node remains in the cache while * the driver sends a de-auth message; * afterward it should be freed to make room * for a new node. */ }; and also ieee80211_state with IEEE80211_S_*, enum ieee80211_state { IEEE80211_S_INIT = 0, /* default state */ IEEE80211_S_SCAN = 1, /* scanning */ IEEE80211_S_AUTH = 2, /* try to authenticate */ IEEE80211_S_ASSOC = 3, /* try to assoc */ IEEE80211_S_RUN = 4 /* associated */ }; so I'm not sure about this, it looks like the diff changes things so that nodes in STA_COLLECT are no longer kicked off? > Also compile the debug message shown when a node is evicted from the > cache to make such problems easier to spot (won't affect install media > as it is protected by IEEE80211_STA_ONLY). OK for this bit. > > Index: ieee80211_node.c > =================================================================== > RCS file: /cvs/src/sys/net80211/ieee80211_node.c,v > retrieving revision 1.70 > diff -u -p -r1.70 ieee80211_node.c > --- ieee80211_node.c 16 Jul 2012 14:51:46 -0000 1.70 > +++ ieee80211_node.c 18 Jul 2012 10:24:59 -0000 > @@ -1176,12 +1176,12 @@ ieee80211_clean_nodes(struct ieee80211co > ic->ic_state == IEEE80211_S_RUN) { > if (cache_timeout) { > if (ni->ni_state != IEEE80211_STA_COLLECT && > - (ni->ni_state == IEEE80211_STA_ASSOC || > + (ni->ni_state >= IEEE80211_STA_ASSOC || > ni->ni_inact < IEEE80211_INACT_MAX)) > continue; > } else { > if (ic->ic_opmode == IEEE80211_M_HOSTAP && > - ((ni->ni_state == IEEE80211_STA_ASSOC && > + ((ni->ni_state >= IEEE80211_STA_ASSOC && > ni->ni_inact < IEEE80211_INACT_MAX) || > (ni->ni_state == IEEE80211_STA_AUTH && > ni->ni_inact == 0))) > @@ -1194,9 +1194,10 @@ ieee80211_clean_nodes(struct ieee80211co > continue; > } > } > + if (ifp->if_flags & IFF_DEBUG) > + printf("%s: station %s purged from node cache\n", > + ifp->if_xname, ether_sprintf(ni->ni_macaddr)); > #endif > - DPRINTF(("station %s purged from LRU cache\n", > - ether_sprintf(ni->ni_macaddr))); > /* > * If we're hostap and the node is authenticated, send > * a deauthentication frame. The node will be freed when