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

Reply via email to