Date: Wed, 18 May 2005 20:23:58 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 77144 for review Message-ID: <200505182023.j4IKNwnU058547@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=77144 Change 77144 by sam@sam_ebb on 2005/05/18 20:23:41 Add simple cache management: o ignore scan cache entries where we've failed to associate (if the entry remains in the cache reset it's failure count after a period of time so it can be retried) o purge stale scan cache entries This makes us ready to add roaming now that the cache is kept warm with background scanning. Affected files ... .. //depot/projects/vap/sys/net80211/ieee80211_scan_sta.c#4 edit Differences ... ==== //depot/projects/vap/sys/net80211/ieee80211_scan_sta.c#4 (text+ko) ==== @@ -51,6 +51,19 @@ #include <net80211/ieee80211_var.h> +/* + * Parameters for managing cache entries: + * + * o a station with STA_FAILS_MAX failures is not considered + * when picking a candidate + * o a station that hasn't had an update in STA_PURGE_SCANS + * (background) scans is discarded + * o after STA_FAILS_AGE seconds we clear the failure count + */ +#define STA_FAILS_MAX 2 /* assoc failures before purge */ +#define STA_FAILS_AGE (2*60) /* time before clearing fails (secs) */ +#define STA_PURGE_SCANS 2 /* age for purging entries (scans) */ + #define RSSI_LPF_LEN 10 #define RSSI_EP_MULTIPLIER (1<<7) /* pow2 to optimize out * and / */ #define RSSI_IN(x) ((x) * RSSI_EP_MULTIPLIER) @@ -70,6 +83,7 @@ u_int8_t se_fails; /* failure to associate count */ u_int32_t se_avgrssi; /* LPF rssi state */ u_int32_t se_lastupdate; /* time of last update */ + u_int32_t se_lastfail; /* time of last failure */ u_int se_scangen; /* iterator scan gen# */ }; @@ -84,11 +98,10 @@ LIST_HEAD(, sta_entry) st_hash[STA_HASHSIZE]; struct mtx st_scanlock; /* on st_scangen */ u_int st_scangen; /* gen# for iterator */ - int st_inact; /* inactivity setting */ }; static void sta_flush_table(struct sta_table *); -static int match_bss(struct ieee80211vap *, struct ieee80211_scan_entry *); +static int match_bss(struct ieee80211vap *, const struct sta_entry *); /* * Attach prior to any scanning work. @@ -105,7 +118,6 @@ mtx_init(&st->st_lock, "stacache", "802.11 sta scan cache", MTX_DEF); mtx_init(&st->st_scanlock, "stascan", "802.11 sta scangen", MTX_DEF); TAILQ_INIT(&st->st_entry); - st->st_inact = IEEE80211_INACT_SCAN; ss->ss_priv = st; return 1; } @@ -237,6 +249,10 @@ saveie(&ise->se_wpa_ie, sp->wpa); saveie(&ise->se_ath_ie, sp->ath); + /* clear failure count after STA_FAIL_AGE passes */ + if (se->se_fails && (ticks - se->se_lastfail) > STA_FAILS_AGE*hz) + se->se_fails = 0; + se->se_lastupdate = ticks; /* update time */ mtx_unlock(&st->st_lock); @@ -602,9 +618,10 @@ * Test a scan candidate for suitability/compatibility. */ static int -match_bss(struct ieee80211vap *vap, struct ieee80211_scan_entry *se) +match_bss(struct ieee80211vap *vap, const struct sta_entry *se0) { struct ieee80211com *ic = vap->iv_ic; + const struct ieee80211_scan_entry *se = &se0->base; u_int8_t rate; int fail; @@ -636,8 +653,11 @@ if ((vap->iv_flags & IEEE80211_F_DESBSSID) && !IEEE80211_ADDR_EQ(vap->iv_des_bssid, se->se_bssid)) fail |= 0x20; + if (se0->se_fails >= STA_FAILS_MAX) + fail |= 0x40; #ifdef IEEE80211_DEBUG if (ieee80211_msg_scan(vap)) { + /* XXX se_fails */ printf(" %c %s", fail ? '-' : '+', ether_sprintf(se->se_macaddr)); printf(" %s%c", ether_sprintf(se->se_bssid), @@ -717,7 +737,7 @@ TAILQ_FOREACH(se, &st->st_entry, se_list) { /* update avg rssi */ se->base.se_rssi = RSSI_GET(se->se_avgrssi); - if (match_bss(vap, &se->base) == 0) { + if (match_bss(vap, se) == 0) { if (selbs == NULL) selbs = se; else if (sta_compare(se, selbs) > 0) @@ -737,11 +757,18 @@ sta_age(struct ieee80211_scan_state *ss) { struct sta_table *st = ss->ss_priv; - struct sta_entry *se; + struct sta_entry *se, *next; + u_int32_t droptime; + + droptime = ticks - (STA_PURGE_SCANS * ss->ss_vap->iv_bgscanintvl); mtx_lock(&st->st_lock); - TAILQ_FOREACH(se, &st->st_entry, se_list) { - /* XXX */ + TAILQ_FOREACH_SAFE(se, &st->st_entry, se_list, next) { + if (time_before(se->se_lastupdate, droptime)) { + TAILQ_REMOVE(&st->st_entry, se, se_list); + LIST_REMOVE(se, se_hash); + FREE(se, M_80211_SCAN); + } } mtx_unlock(&st->st_lock); } @@ -792,6 +819,7 @@ LIST_FOREACH(se, &st->st_hash[hash], se_hash) if (IEEE80211_ADDR_EQ(se->base.se_macaddr, macaddr)) { se->se_fails++; + se->se_lastfail = ticks; break; } mtx_unlock(&st->st_lock);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200505182023.j4IKNwnU058547>