Date: Fri, 12 Nov 2004 23:41:32 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 64984 for review Message-ID: <200411122341.iACNfWBO042204@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=64984 Change 64984 by sam@sam_ebb on 2004/11/12 23:40:42 checkpoint background scanning work; ready to detach from the state machine Affected files ... .. //depot/projects/wifi/sys/net80211/ieee80211_input.c#12 edit .. //depot/projects/wifi/sys/net80211/ieee80211_node.c#13 edit .. //depot/projects/wifi/sys/net80211/ieee80211_output.c#8 edit .. //depot/projects/wifi/sys/net80211/ieee80211_proto.c#6 edit .. //depot/projects/wifi/sys/net80211/ieee80211_var.h#9 edit Differences ... ==== //depot/projects/wifi/sys/net80211/ieee80211_input.c#12 (text+ko) ==== @@ -69,7 +69,7 @@ { switch (subtype) { case IEEE80211_FC0_SUBTYPE_BEACON: - return (ic->ic_state == IEEE80211_S_SCAN); + return (ic->ic_flags & IEEE80211_F_SCAN); case IEEE80211_FC0_SUBTYPE_PROBE_REQ: return (ic->ic_opmode == IEEE80211_M_IBSS); } @@ -160,7 +160,7 @@ dir = wh->i_fc[1] & IEEE80211_FC1_DIR_MASK; type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; - if (ic->ic_state != IEEE80211_S_SCAN) { + if ((ic->ic_flags & IEEE80211_F_SCAN) == 0) { switch (ic->ic_opmode) { case IEEE80211_M_STA: bssid = wh->i_addr2; @@ -1644,17 +1644,16 @@ } else IEEE80211_NODE_STAT(ni, rx_proberesp); /* - * We process beacon/probe response frames for: - * o station mode when associated: to collect state - * updates such as 802.11g slot time - * o adhoc mode: to discover neighbors - * o when scanning + * We process beacon/probe response frames: + * o when scanning, or + * o station mode when associated (to collect state + * updates such as 802.11g slot time), or + * o adhoc mode (to discover neighbors) * Frames otherwise received are discarded. */ - if (!((ic->ic_opmode == IEEE80211_M_STA && ni->ni_associd != 0) - || ic->ic_opmode == IEEE80211_M_IBSS - || ic->ic_state == IEEE80211_S_SCAN)) { - /* XXX: may be useful for background scan */ + if (!((ic->ic_flags & IEEE80211_F_SCAN) || + (ic->ic_opmode == IEEE80211_M_STA && ni->ni_associd) || + ic->ic_opmode != IEEE80211_M_IBSS)) { ic->ic_stats.is_rx_mgtdiscard++; return; } @@ -1785,10 +1784,17 @@ } /* - * Station mode, check for state updates. We - * consider only 11g stuff right now. + * When operating in station mode, check for state updates. + * Be careful to ignore beacons received while doing a + * background scan. We consider only 11g stuff right now + * (XXX WME to come). */ - if (ic->ic_opmode == IEEE80211_M_STA && ni->ni_associd != 0) { + if (ni->ni_associd != 0 && + ((ic->ic_flags & IEEE80211_F_SCAN) == 0 || + IEEE80211_ADDR_EQ(wh->i_addr2, ni->ni_bssid))) { + KASSERT(ic->ic_opmode == IEEE80211_M_STA, + ("beacon in %u mode with associd 0x%x?", + ic->ic_opmode, ni->ni_associd)); if (ni->ni_erp != erp) { IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC, "erp change from %s: was 0x%x, now 0x%x\n", @@ -1817,6 +1823,7 @@ /* XXX statistic */ } ni->ni_inact = ic->ic_inact_run; + /* NB: don't need the rest of this */ return; } @@ -1834,7 +1841,7 @@ * as ibss participants so we don't populate our * neighbor table with unintersting sta's. */ - if (ic->ic_state != IEEE80211_S_SCAN) { + if ((ic->ic_flags & IEEE80211_F_SCAN) == 0) { if ((capinfo & IEEE80211_CAPINFO_IBSS) == 0) return; ni = ieee80211_fakeup_adhoc_node(ic->ic_sta, ==== //depot/projects/wifi/sys/net80211/ieee80211_node.c#13 (text+ko) ==== @@ -274,16 +274,14 @@ (ic->ic_flags & IEEE80211_F_ASCAN) ? "active" : "passive", ic->ic_scan.nt_scangen); /* - * Clear scan state and flush any previously seen - * AP's. Note that the latter assumes we don't act - * as both an AP and a station, otherwise we'll - * potentially flush state of stations associated - * with us. + * Clear scan state and flush any previously seen AP's. */ ieee80211_reset_scan(ic); if (reset) ieee80211_free_allnodes(&ic->ic_scan); + ic->ic_flags |= IEEE80211_F_SCAN; + /* Scan the next channel. */ ieee80211_next_scan(ic); } @@ -314,7 +312,22 @@ ieee80211_chan2ieee(ic, ic->ic_bss->ni_chan), ieee80211_chan2ieee(ic, chan)); ieee80211_set_chan(ic, ic->ic_bss, chan); +#ifdef notyet + /* XXX driver state change */ + /* + * Scan next channel. If doing an active scan + * and the channel is not marked passive-only + * then send a probe request. Otherwise just + * listen for beacons on the channel. + */ + if ((ic->ic_flags & IEEE80211_F_ASCAN) && + (ni->ni_chan->ic_flags & IEEE80211_CHAN_PASSIVE) == 0) { + IEEE80211_SEND_MGMT(ic, ni, + IEEE80211_FC0_SUBTYPE_PROBE_REQ, 0); + } +#else ieee80211_new_state(ic, IEEE80211_S_SCAN, -1); +#endif return 1; } } while (chan != ic->ic_bss->ni_chan); @@ -505,7 +518,7 @@ IEEE80211_DPRINTF(ic, IEEE80211_MSG_SCAN, "end %s scan\n", (ic->ic_flags & IEEE80211_F_ASCAN) ? "active" : "passive"); - ic->ic_flags &= ~IEEE80211_F_ASCAN; + ic->ic_flags &= ~(IEEE80211_F_SCAN | IEEE80211_F_ASCAN); nt = &ic->ic_scan; ni = TAILQ_FIRST(&nt->nt_node); @@ -583,6 +596,7 @@ * Reset the list of channels to scan and start again. */ ieee80211_reset_scan(ic); + ic->ic_flags |= IEEE80211_F_SCAN; ieee80211_next_scan(ic); return; } @@ -960,7 +974,7 @@ /* XXX may want scanned nodes in the neighbor table for adhoc */ if (ic->ic_opmode == IEEE80211_M_STA || ic->ic_opmode == IEEE80211_M_MONITOR || - ic->ic_state == IEEE80211_S_SCAN /*XXX*/) + (ic->ic_flags & IEEE80211_F_SCAN)) nt = &ic->ic_scan; else nt = ic->ic_sta; ==== //depot/projects/wifi/sys/net80211/ieee80211_output.c#8 (text+ko) ==== @@ -126,7 +126,8 @@ * to communicate this directly rather than do something * implicit based on surrounding state. */ - if (ni == ic->ic_bss && ic->ic_state == IEEE80211_S_SCAN) { + if (type == IEEE80211_FC0_SUBTYPE_PROBE_REQ && + (ic->ic_flags & IEEE80211_F_SCAN)) { IEEE80211_ADDR_COPY(wh->i_addr1, ifp->if_broadcastaddr); IEEE80211_ADDR_COPY(wh->i_addr2, ic->ic_myaddr); IEEE80211_ADDR_COPY(wh->i_addr3, ifp->if_broadcastaddr); ==== //depot/projects/wifi/sys/net80211/ieee80211_proto.c#6 (text+ko) ==== @@ -559,12 +559,6 @@ ic->ic_auth->ia_detach(ic); break; case IEEE80211_S_SCAN: - ic->ic_flags &= ~IEEE80211_F_SIBSS; - /* XXX initialize bss for probe request */ - ni->ni_rates = ic->ic_sup_rates[ - ieee80211_chan2mode(ic, ni->ni_chan)]; - ni->ni_associd = 0; /* XXX? */ - ni->ni_rstamp = 0; /* XXX? */ switch (ostate) { case IEEE80211_S_INIT: if ((ic->ic_opmode == IEEE80211_M_HOSTAP || @@ -599,6 +593,7 @@ "no recent beacons from %s; rescanning\n", ether_sprintf(ic->ic_bss->ni_bssid)); ieee80211_sta_leave(ic, ni); + ic->ic_flags &= ~IEEE80211_F_SIBSS; /* XXX */ /* FALLTHRU */ case IEEE80211_S_AUTH: case IEEE80211_S_ASSOC: ==== //depot/projects/wifi/sys/net80211/ieee80211_var.h#9 (text+ko) ==== @@ -291,8 +291,10 @@ #define IEEE80211_ADDR_COPY(dst,src) memcpy(dst,src,IEEE80211_ADDR_LEN) /* ic_flags */ +/* NB: bits 0x6f available */ /* NB: this is intentionally setup to be IEEE80211_CAPINFO_PRIVACY */ #define IEEE80211_F_PRIVACY 0x00000010 /* CONF: privacy enabled */ +#define IEEE80211_F_SCAN 0x00000080 /* STATUS: scanning */ #define IEEE80211_F_ASCAN 0x00000100 /* STATUS: active scan */ #define IEEE80211_F_SIBSS 0x00000200 /* STATUS: start IBSS */ /* NB: this is intentionally setup to be IEEE80211_CAPINFO_SHORT_SLOTTIME */ @@ -300,7 +302,7 @@ #define IEEE80211_F_PMGTON 0x00000800 /* CONF: Power mgmt enable */ #define IEEE80211_F_DESBSSID 0x00001000 /* CONF: des_bssid is set */ #define IEEE80211_F_WME 0x00002000 /* CONF: enable WME use */ -#define IEEE80211_F_ROAMING 0x00004000 /* CONF: roaming enabled */ +#define IEEE80211_F_ROAMING 0x00004000 /* CONF: roaming enabled (???)*/ #define IEEE80211_F_SWRETRY 0x00008000 /* CONF: sw tx retry enabled */ #define IEEE80211_F_TXPOW_FIXED 0x00010000 /* TX Power: fixed rate */ #define IEEE80211_F_IBSSON 0x00020000 /* CONF: IBSS creation enable */ @@ -333,6 +335,9 @@ #define IEEE80211_C_SHPREAMBLE 0x00008000 /* CAPABILITY: short preamble */ #define IEEE80211_C_MONITOR 0x00010000 /* CAPABILITY: monitor mode */ #define IEEE80211_C_TKIPMIC 0x00020000 /* CAPABILITY: TKIP MIC avail */ +#define IEEE80211_C_WPA1 0x00800000 /* CAPABILITY: WPA1 avail */ +#define IEEE80211_C_WPA2 0x01000000 /* CAPABILITY: WPA2 avail */ +#define IEEE80211_C_WPA 0x01800000 /* CAPABILITY: WPA1+WPA2 avail*/ /* XXX protection/barker? */ #define IEEE80211_C_CRYPTO 0x0000002f /* CAPABILITY: crypto alg's */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200411122341.iACNfWBO042204>