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