PERFORCE change 116492 for review
Sam Leffler
sam at FreeBSD.org
Sat Mar 24 15:57:17 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=116492
Change 116492 by sam at sam_ebb on 2007/03/24 15:56:53
checkpoint scanning changes for iwi & co.
Affected files ...
.. //depot/projects/wifi/sys/net80211/ieee80211_scan.c#11 edit
.. //depot/projects/wifi/sys/net80211/ieee80211_scan.h#6 edit
.. //depot/projects/wifi/sys/net80211/ieee80211_var.h#52 edit
Differences ...
==== //depot/projects/wifi/sys/net80211/ieee80211_scan.c#11 (text+ko) ====
@@ -88,6 +88,8 @@
#define ROAM_RATE_11BONLY_DEFAULT 2*1 /* tx rate thresh for 11b-only bss */
static void scan_restart_pwrsav(void *);
+static void scan_curchan(struct ieee80211com *, unsigned long);
+static void scan_mindwell(struct ieee80211com *);
static void scan_next(void *);
MALLOC_DEFINE(M_80211_SCAN, "80211scan", "802.11 scan state");
@@ -108,6 +110,9 @@
callout_init(&ss->ss_scan_timer, CALLOUT_MPSAFE);
ic->ic_scan = &ss->base;
+ ic->ic_scan_curchan = scan_curchan;
+ ic->ic_scan_mindwell = scan_mindwell;
+
ic->ic_bgscanidle = (IEEE80211_BGSCAN_IDLE_DEFAULT*1000)/hz;
ic->ic_bgscanintvl = IEEE80211_BGSCAN_INTVAL_DEFAULT*hz;
ic->ic_scanvalid = IEEE80211_SCAN_VALID_DEFAULT*hz;
@@ -610,6 +615,73 @@
}
/*
+ * Public access to scan_next for drivers that manage
+ * scanning themselves (e.g. for firmware-based devices).
+ */
+void
+ieee80211_scan_next(struct ieee80211com *ic)
+{
+ /*
+ * XXX: We might need/want to decouple context here by either:
+ * callout_reset(&SCAN_PRIVATE(ss)->ss_scan_timer, 0, scan_next, ss);
+ * or using a taskqueue. Let's see what kind of problems direct
+ * dispatch has for now.
+ */
+ scan_next(ic->ic_scan);
+}
+
+/*
+ * Scan curchan. If this is an active scan and the channel
+ * is not marked passive then send probe request frame(s).
+ * Arrange for the channel change after maxdwell ticks.
+ */
+static void
+scan_curchan(struct ieee80211com *ic, unsigned long maxdwell)
+{
+ struct ieee80211_scan_state *ss = ic->ic_scan;
+
+ if ((ss->ss_flags & IEEE80211_SCAN_ACTIVE) &&
+ (ic->ic_curchan->ic_flags & IEEE80211_CHAN_PASSIVE) == 0) {
+ struct ifnet *ifp = ic->ic_ifp;
+ int i;
+
+ /*
+ * Send a broadcast probe request followed by
+ * any specified directed probe requests.
+ * XXX suppress broadcast probe req?
+ * XXX remove dependence on ic/ic->ic_bss
+ * XXX move to policy code?
+ */
+ ieee80211_send_probereq(ic->ic_bss,
+ ic->ic_myaddr, ifp->if_broadcastaddr,
+ ifp->if_broadcastaddr,
+ "", 0,
+ ic->ic_opt_ie, ic->ic_opt_ie_len);
+ for (i = 0; i < ss->ss_nssid; i++)
+ ieee80211_send_probereq(ic->ic_bss,
+ ic->ic_myaddr, ifp->if_broadcastaddr,
+ ifp->if_broadcastaddr,
+ ss->ss_ssid[i].ssid,
+ ss->ss_ssid[i].len,
+ ic->ic_opt_ie, ic->ic_opt_ie_len);
+ }
+ callout_reset(&SCAN_PRIVATE(ss)->ss_scan_timer,
+ maxdwell, scan_next, ss);
+}
+
+/*
+ * Handle mindwell requirements completed; initiate a channel
+ * change to the next channel asap.
+ */
+static void
+scan_mindwell(struct ieee80211com *ic)
+{
+ struct ieee80211_scan_state *ss = ic->ic_scan;
+
+ callout_reset(&SCAN_PRIVATE(ss)->ss_scan_timer, 0, scan_next, ss);
+}
+
+/*
* Switch to the next channel marked for scanning.
*/
static void
@@ -620,7 +692,7 @@
struct ieee80211com *ic = ss->ss_ic;
struct ieee80211_channel *chan;
unsigned long maxdwell, scanend;
- int scanning, scandone, i;
+ int scanning, scandone;
IEEE80211_LOCK(ic);
scanning = (ic->ic_flags & IEEE80211_F_SCAN) != 0;
@@ -663,36 +735,15 @@
change_channel(ic, chan);
/*
- * If doing an active scan and the channel is not
- * marked passive-only then send a probe request.
- * Otherwise just listen for traffic on the channel.
+ * Scan curchan. Drivers for "intelligent hardware"
+ * override ic_scan_curchan to tell the device to do
+ * the work. Otherwise we manage the work outselves;
+ * sending a probe request (as needed), and arming the
+ * timeout to switch channels after maxdwell ticks.
*/
- if ((ss->ss_flags & IEEE80211_SCAN_ACTIVE) &&
- (chan->ic_flags & IEEE80211_CHAN_PASSIVE) == 0) {
- struct ifnet *ifp = ic->ic_ifp;
- /*
- * Send a broadcast probe request followed by
- * any specified directed probe requests.
- * XXX suppress broadcast probe req?
- * XXX remove dependence on ic/ic->ic_bss
- * XXX move to policy code?
- */
- ieee80211_send_probereq(ic->ic_bss,
- ic->ic_myaddr, ifp->if_broadcastaddr,
- ifp->if_broadcastaddr,
- "", 0,
- ic->ic_opt_ie, ic->ic_opt_ie_len);
- for (i = 0; i < ss->ss_nssid; i++)
- ieee80211_send_probereq(ic->ic_bss,
- ic->ic_myaddr, ifp->if_broadcastaddr,
- ifp->if_broadcastaddr,
- ss->ss_ssid[i].ssid,
- ss->ss_ssid[i].len,
- ic->ic_opt_ie, ic->ic_opt_ie_len);
- }
+ ic->ic_scan_curchan(ic, maxdwell);
+
SCAN_PRIVATE(ss)->ss_chanmindwell = ticks + ss->ss_mindwell;
- callout_reset(&SCAN_PRIVATE(ss)->ss_scan_timer,
- maxdwell, scan_next, ss);
/* clear mindwell lock and initial channel change flush */
SCAN_PRIVATE(ss)->ss_iflags &= ~ISCAN_REP;
} else {
@@ -861,9 +912,11 @@
#else
SCAN_PRIVATE(ss)->ss_iflags |= ISCAN_DISCARD;
#endif
- /* NB: trigger at next clock tick */
- callout_reset(&SCAN_PRIVATE(ss)->ss_scan_timer,
- 0, scan_next, ss);
+ /*
+ * NB: trigger at next clock tick or wait for the
+ * hardware
+ */
+ ic->ic_scan_mindwell(ic);
}
}
}
==== //depot/projects/wifi/sys/net80211/ieee80211_scan.h#6 (text+ko) ====
@@ -88,6 +88,7 @@
u_int nssid, const struct ieee80211_scan_ssid ssids[]);
int ieee80211_bg_scan(struct ieee80211com *);
void ieee80211_cancel_scan(struct ieee80211com *);
+void ieee80211_scan_next(struct ieee80211com *);
struct ieee80211_scanparams;
void ieee80211_add_scan(struct ieee80211com *,
==== //depot/projects/wifi/sys/net80211/ieee80211_var.h#52 (text+ko) ====
@@ -249,6 +249,9 @@
void (*ic_scan_start)(struct ieee80211com *);
void (*ic_scan_end)(struct ieee80211com *);
void (*ic_set_channel)(struct ieee80211com *);
+ void (*ic_scan_curchan)(struct ieee80211com *,
+ unsigned long);
+ void (*ic_scan_mindwell)(struct ieee80211com *);
/* per-vap eventually... */
int (*ic_newstate)(struct ieee80211com *,
enum ieee80211_state, int);
More information about the p4-projects
mailing list