summaryrefslogtreecommitdiffstats
path: root/sys/net80211/ieee80211_node.c
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2005-07-27 02:53:09 +0000
committersam <sam@FreeBSD.org>2005-07-27 02:53:09 +0000
commit63e3a582cc3be070218e00f0593588904151caf3 (patch)
treea26e1fbcf261e08cacb50551ac594d234436ebe4 /sys/net80211/ieee80211_node.c
parent42b03e9a5ad68055ace81d6df2405fefdc43e82b (diff)
downloadFreeBSD-src-63e3a582cc3be070218e00f0593588904151caf3.zip
FreeBSD-src-63e3a582cc3be070218e00f0593588904151caf3.tar.gz
bandaid ni_fails handling so ap's with association failures are
reconsidered after a bit; a proper fix involves more changes to the scanning infrastructure Reviewed by: avatar, David Young MFC after: 5 days
Diffstat (limited to 'sys/net80211/ieee80211_node.c')
-rw-r--r--sys/net80211/ieee80211_node.c42
1 files changed, 24 insertions, 18 deletions
diff --git a/sys/net80211/ieee80211_node.c b/sys/net80211/ieee80211_node.c
index 79a04ae..81f6138 100644
--- a/sys/net80211/ieee80211_node.c
+++ b/sys/net80211/ieee80211_node.c
@@ -446,6 +446,9 @@ ieee80211_reset_bss(struct ieee80211com *ic)
}
}
+/* XXX tunable */
+#define STA_FAILS_MAX 2 /* assoc failures before ignored */
+
static int
ieee80211_match_bss(struct ieee80211com *ic, struct ieee80211_node *ni)
{
@@ -483,9 +486,12 @@ ieee80211_match_bss(struct ieee80211com *ic, struct ieee80211_node *ni)
if ((ic->ic_flags & IEEE80211_F_DESBSSID) &&
!IEEE80211_ADDR_EQ(ic->ic_des_bssid, ni->ni_bssid))
fail |= 0x20;
+ if (ni->ni_fails >= STA_FAILS_MAX)
+ fail |= 0x40;
#ifdef IEEE80211_DEBUG
if (ieee80211_msg_scan(ic)) {
- printf(" %c %s", fail ? '-' : '+',
+ printf(" %c %s",
+ fail & 0x40 ? '=' : fail & 0x80 ? '^' : fail ? '-' : '+',
ether_sprintf(ni->ni_macaddr));
printf(" %s%c", ether_sprintf(ni->ni_bssid),
fail & 0x20 ? '!' : ' ');
@@ -532,6 +538,7 @@ ieee80211_node_compare(struct ieee80211com *ic,
{
u_int8_t maxa, maxb;
u_int8_t rssia, rssib;
+ int weight;
/* privacy support preferred */
if ((a->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) &&
@@ -541,6 +548,11 @@ ieee80211_node_compare(struct ieee80211com *ic,
(b->ni_capinfo & IEEE80211_CAPINFO_PRIVACY))
return -1;
+ /* compare count of previous failures */
+ weight = b->ni_fails - a->ni_fails;
+ if (abs(weight) > 1)
+ return weight;
+
rssia = ic->ic_node_getrssi(a);
rssib = ic->ic_node_getrssi(b);
if (abs(rssib - rssia) < 5) {
@@ -658,6 +670,17 @@ ieee80211_end_scan(struct ieee80211com *ic)
return;
}
/*
+ * Decrement the failure counts so entries will be
+ * reconsidered the next time around. We really want
+ * to do this only for sta's where we've previously
+ had some success.
+ */
+ IEEE80211_NODE_LOCK(nt);
+ TAILQ_FOREACH(ni, &nt->nt_node, ni_list)
+ if (ni->ni_fails)
+ ni->ni_fails--;
+ IEEE80211_NODE_UNLOCK(nt);
+ /*
* Reset the list of channels to scan and start again.
*/
ieee80211_reset_scan(ic);
@@ -670,23 +693,6 @@ ieee80211_end_scan(struct ieee80211com *ic)
"macaddr bssid chan rssi rate flag wep essid");
IEEE80211_NODE_LOCK(nt);
TAILQ_FOREACH(ni, &nt->nt_node, ni_list) {
- if (ni->ni_fails) {
- /*
- * The configuration of the access points may change
- * during my scan. So delete the entry for the AP
- * and retry to associate if there is another beacon.
- */
- IEEE80211_DPRINTF(ic, IEEE80211_MSG_SCAN,
- "%s: skip scan candidate %s, fails %u\n",
- __func__, ether_sprintf(ni->ni_macaddr),
- ni->ni_fails);
- ni->ni_fails++;
-#if 0
- if (ni->ni_fails++ > 2)
- ieee80211_free_node(ni);
-#endif
- continue;
- }
if (ieee80211_match_bss(ic, ni) == 0) {
if (selbs == NULL)
selbs = ni;
OpenPOWER on IntegriCloud