From c4ed2c08adfbde9a3d523861dde48ff3914012f9 Mon Sep 17 00:00:00 2001 From: Sam Leffler Date: Thu, 12 Jul 2007 17:22:43 +0000 Subject: [PATCH] revert handling of ssid and bssid to be manadatory instead of advisory Prodded by: Kevin Gerry Reviewed by: thompsa, sephe Approved by: re (kensmith) --- sys/net80211/ieee80211_scan_sta.c | 73 +++++++++++++++++-------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/sys/net80211/ieee80211_scan_sta.c b/sys/net80211/ieee80211_scan_sta.c index 88e50903efc..fee5cab922a 100644 --- a/sys/net80211/ieee80211_scan_sta.c +++ b/sys/net80211/ieee80211_scan_sta.c @@ -81,8 +81,6 @@ struct sta_entry { uint8_t se_seen; /* seen during current scan */ uint8_t se_notseen; /* not seen in previous scans */ uint8_t se_flags; -#define STA_SSID_MATCH 0x01 -#define STA_BSSID_MATCH 0x02 uint32_t se_avgrssi; /* LPF rssi state */ unsigned long se_lastupdate; /* time of last update */ unsigned long se_lastfail; /* time of last failure */ @@ -105,6 +103,21 @@ struct sta_table { }; static void sta_flush_table(struct sta_table *); +/* + * match_bss returns a bitmask describing if an entry is suitable + * for use. If non-zero the entry was deemed not suitable and it's + * contents explains why. The following flags are or'd to to this + * mask and can be used to figure out why the entry was rejected. + */ +#define MATCH_CHANNEL 0x001 /* channel mismatch */ +#define MATCH_CAPINFO 0x002 /* capabilities mismatch, e.g. no ess */ +#define MATCH_PRIVACY 0x004 /* privacy mismatch */ +#define MATCH_RATE 0x008 /* rate set mismatch */ +#define MATCH_SSID 0x010 /* ssid mismatch */ +#define MATCH_BSSID 0x020 /* bssid mismatch */ +#define MATCH_FAILS 0x040 /* too many failed auth attempts */ +#define MATCH_NOTSEEN 0x080 /* not seen in recent scans */ +#define MATCH_RSSI 0x100 /* rssi deemed too low to use */ static int match_bss(struct ieee80211com *, const struct ieee80211_scan_state *, struct sta_entry *, int); @@ -637,10 +650,6 @@ sta_compare(const struct sta_entry *a, const struct sta_entry *b) int8_t rssia, rssib; int weight; - /* desired bssid */ - PREFER(a->se_flags, b->se_flags, STA_BSSID_MATCH); - /* desired ssid */ - PREFER(a->se_flags, b->se_flags, STA_SSID_MATCH); /* privacy support */ PREFER(a->base.se_capinfo, b->base.se_capinfo, IEEE80211_CAPINFO_PRIVACY); @@ -768,7 +777,7 @@ match_bss(struct ieee80211com *ic, fail = 0; if (isclr(ic->ic_chan_active, ieee80211_chan2ieee(ic, se->se_chan))) - fail |= 0x01; + fail |= MATCH_CHANNEL; /* * NB: normally the desired mode is used to construct * the channel list, but it's possible for the scan @@ -779,64 +788,62 @@ match_bss(struct ieee80211com *ic, if (ic->ic_des_mode != IEEE80211_MODE_AUTO && (se->se_chan->ic_flags & IEEE80211_CHAN_ALLTURBO) != chanflags[ic->ic_des_mode]) - fail |= 0x01; + fail |= MATCH_CHANNEL; if (ic->ic_opmode == IEEE80211_M_IBSS) { if ((se->se_capinfo & IEEE80211_CAPINFO_IBSS) == 0) - fail |= 0x02; + fail |= MATCH_CAPINFO; } else { if ((se->se_capinfo & IEEE80211_CAPINFO_ESS) == 0) - fail |= 0x02; + fail |= MATCH_CAPINFO; } if (ic->ic_flags & IEEE80211_F_PRIVACY) { if ((se->se_capinfo & IEEE80211_CAPINFO_PRIVACY) == 0) - fail |= 0x04; + fail |= MATCH_PRIVACY; } else { /* XXX does this mean privacy is supported or required? */ if (se->se_capinfo & IEEE80211_CAPINFO_PRIVACY) - fail |= 0x04; + fail |= MATCH_PRIVACY; } rate = check_rate(ic, se); if (rate & IEEE80211_RATE_BASIC) - fail |= 0x08; + fail |= MATCH_RATE; if (ss->ss_nssid != 0 && - match_ssid(se->se_ssid, ss->ss_nssid, ss->ss_ssid)) - se0->se_flags |= STA_SSID_MATCH; - else - se0->se_flags &= ~STA_SSID_MATCH; + !match_ssid(se->se_ssid, ss->ss_nssid, ss->ss_ssid)) + fail |= MATCH_SSID; if ((ic->ic_flags & IEEE80211_F_DESBSSID) && - IEEE80211_ADDR_EQ(ic->ic_des_bssid, se->se_bssid)) - se0->se_flags |= STA_BSSID_MATCH; - else - se0->se_flags &= ~STA_BSSID_MATCH; + !IEEE80211_ADDR_EQ(ic->ic_des_bssid, se->se_bssid)) + fail |= MATCH_BSSID; if (se0->se_fails >= STA_FAILS_MAX) - fail |= 0x40; + fail |= MATCH_FAILS; + /* NB: entries may be present awaiting purge, skip */ if (se0->se_notseen >= STA_PURGE_SCANS) - fail |= 0x80; + fail |= MATCH_NOTSEEN; if (se->se_rssi < STA_RSSI_MIN) - fail |= 0x100; + fail |= MATCH_RSSI; #ifdef IEEE80211_DEBUG if (ieee80211_msg(ic, debug)) { printf(" %c %s", - fail & 0x40 ? '=' : fail & 0x80 ? '^' : fail ? '-' : '+', - ether_sprintf(se->se_macaddr)); + fail & MATCH_FAILS ? '=' : + fail & MATCH_NOTSEEN ? '^' : + fail ? '-' : '+', ether_sprintf(se->se_macaddr)); printf(" %s%c", ether_sprintf(se->se_bssid), - se0->se_flags & STA_BSSID_MATCH ? '*' : ' '); + fail & MATCH_BSSID ? '!' : ' '); printf(" %3d%c", ieee80211_chan2ieee(ic, se->se_chan), - fail & 0x01 ? '!' : ' '); - printf(" %+4d%c", se->se_rssi, fail & 0x100 ? '!' : ' '); + fail & MATCH_CHANNEL ? '!' : ' '); + printf(" %+4d%c", se->se_rssi, fail & MATCH_RSSI ? '!' : ' '); printf(" %2dM%c", (rate & IEEE80211_RATE_VAL) / 2, - fail & 0x08 ? '!' : ' '); + fail & MATCH_RATE ? '!' : ' '); printf(" %4s%c", (se->se_capinfo & IEEE80211_CAPINFO_ESS) ? "ess" : (se->se_capinfo & IEEE80211_CAPINFO_IBSS) ? "ibss" : "????", - fail & 0x02 ? '!' : ' '); + fail & MATCH_CAPINFO ? '!' : ' '); printf(" %3s%c ", (se->se_capinfo & IEEE80211_CAPINFO_PRIVACY) ? "wep" : "no", - fail & 0x04 ? '!' : ' '); + fail & MATCH_PRIVACY ? '!' : ' '); ieee80211_print_essid(se->se_ssid+2, se->se_ssid[1]); - printf("%s\n", se0->se_flags & STA_SSID_MATCH ? "*" : ""); + printf("%s\n", fail & MATCH_SSID ? "!" : ""); } #endif return fail; -- 2.45.2