svn commit: r191636 - user/thompsa/vaptq/sys/net80211
Andrew Thompson
thompsa at FreeBSD.org
Tue Apr 28 20:36:08 UTC 2009
Author: thompsa
Date: Tue Apr 28 20:36:07 2009
New Revision: 191636
URL: http://svn.freebsd.org/changeset/base/191636
Log:
Split out the channel logic of ieee80211_setcurchan() to
ieee80211_setupcurchan() so it can be used to change the channel without
deferring the driver callback. Previously the scan would not go back to the bss
channel immediately since the channel change was requeued.
Modified:
user/thompsa/vaptq/sys/net80211/ieee80211_node.c
user/thompsa/vaptq/sys/net80211/ieee80211_node.h
user/thompsa/vaptq/sys/net80211/ieee80211_scan.c
Modified: user/thompsa/vaptq/sys/net80211/ieee80211_node.c
==============================================================================
--- user/thompsa/vaptq/sys/net80211/ieee80211_node.c Tue Apr 28 20:23:58 2009 (r191635)
+++ user/thompsa/vaptq/sys/net80211/ieee80211_node.c Tue Apr 28 20:36:07 2009 (r191636)
@@ -636,11 +636,11 @@ ieee80211_sync_curchan(struct ieee80211c
}
/*
- * Change the current channel. The request channel may be
+ * Setup the current channel. The request channel may be
* promoted if other vap's are operating with HT20/HT40.
*/
void
-ieee80211_setcurchan(struct ieee80211com *ic, struct ieee80211_channel *c)
+ieee80211_setupcurchan(struct ieee80211com *ic, struct ieee80211_channel *c)
{
if (ic->ic_htcaps & IEEE80211_HTC_HT) {
int flags = gethtadjustflags(ic);
@@ -656,10 +656,16 @@ ieee80211_setcurchan(struct ieee80211com
ic->ic_bsschan = ic->ic_curchan = c;
ic->ic_curmode = ieee80211_chan2mode(ic->ic_curchan);
ic->ic_rt = ieee80211_get_ratetable(ic->ic_curchan);
- /*
- * The channel change is guaranteed to have happened before the next
- * state change
- */
+}
+
+/*
+ * Change the current channel. The channel change is guaranteed to have
+ * happened before the next state change.
+ */
+void
+ieee80211_setcurchan(struct ieee80211com *ic, struct ieee80211_channel *c)
+{
+ ieee80211_setupcurchan(ic, c);
ieee80211_runtask(ic, &ic->ic_chan_task);
}
Modified: user/thompsa/vaptq/sys/net80211/ieee80211_node.h
==============================================================================
--- user/thompsa/vaptq/sys/net80211/ieee80211_node.h Tue Apr 28 20:23:58 2009 (r191635)
+++ user/thompsa/vaptq/sys/net80211/ieee80211_node.h Tue Apr 28 20:36:07 2009 (r191636)
@@ -286,6 +286,8 @@ void ieee80211_node_set_chan(struct ieee
void ieee80211_create_ibss(struct ieee80211vap*, struct ieee80211_channel *);
void ieee80211_reset_bss(struct ieee80211vap *);
void ieee80211_sync_curchan(struct ieee80211com *);
+void ieee80211_setupcurchan(struct ieee80211com *,
+ struct ieee80211_channel *);
void ieee80211_setcurchan(struct ieee80211com *, struct ieee80211_channel *);
int ieee80211_ibss_merge(struct ieee80211_node *);
struct ieee80211_scan_entry;
Modified: user/thompsa/vaptq/sys/net80211/ieee80211_scan.c
==============================================================================
--- user/thompsa/vaptq/sys/net80211/ieee80211_scan.c Tue Apr 28 20:23:58 2009 (r191635)
+++ user/thompsa/vaptq/sys/net80211/ieee80211_scan.c Tue Apr 28 20:36:07 2009 (r191636)
@@ -864,6 +864,7 @@ scan_task(void *arg, int pending)
/*
* Use an 1ms delay so the null data frame has a chance
* to go out.
+ * XXX Should use M_TXCB mechanism to eliminate this.
*/
cv_timedwait(&SCAN_PRIVATE(ss)->ss_scan_cv,
IEEE80211_LOCK_OBJ(ic), hz / 1000);
@@ -960,8 +961,12 @@ scan_task(void *arg, int pending)
ic->ic_lastscan = ticks;
/* return to the bss channel */
if (ic->ic_bsschan != IEEE80211_CHAN_ANYC &&
- ic->ic_curchan != ic->ic_bsschan)
- ieee80211_setcurchan(ic, ic->ic_bsschan); /* XXX */
+ ic->ic_curchan != ic->ic_bsschan) {
+ ieee80211_setupcurchan(ic, ic->ic_bsschan);
+ IEEE80211_UNLOCK(ic);
+ ic->ic_set_channel(ic);
+ IEEE80211_LOCK(ic);
+ }
/* clear internal flags and any indication of a pick */
SCAN_PRIVATE(ss)->ss_iflags &= ~ISCAN_REP;
ss->ss_flags &= ~IEEE80211_SCAN_GOTPICK;
More information about the svn-src-user
mailing list