net80211: do not cancel scan when packet is sent.

Restore pre-r300383 behavior when a frame is sent:
- stop scan;
- send frame;
- when beacon arrives and our bit in TIM is not set - restart the scan.

NOTE:
Ideally, this should introduce new interface (ieee80211_pause_anyscan());
however, since ieee80211_cancel_anyscan() is not used by drivers and only
called by ieee80211_start_pkt() the current patch overrides it's behavior
instead.

Tested with Intel 3945BG, STA mode

Reviewed by:	adrian
Differential Revision:	https://reviews.freebsd.org/D7979
This commit is contained in:
Andriy Voskoboinyk 2016-09-30 18:43:39 +00:00
parent 1656ce0643
commit f8312481e5
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=306519

View File

@ -57,9 +57,11 @@ struct scan_state {
u_int ss_iflags; /* flags used internally */
#define ISCAN_MINDWELL 0x0001 /* min dwell time reached */
#define ISCAN_DISCARD 0x0002 /* discard rx'd frames */
#define ISCAN_CANCEL 0x0004 /* cancel current scan */
#define ISCAN_ABORT 0x0008 /* end the scan immediately */
#define ISCAN_RUNNING 0x0010 /* scan was started */
#define ISCAN_INTERRUPT 0x0004 /* interrupt current scan */
#define ISCAN_CANCEL 0x0008 /* cancel current scan */
#define ISCAN_PAUSE (ISCAN_INTERRUPT | ISCAN_CANCEL)
#define ISCAN_ABORT 0x0010 /* end the scan immediately */
#define ISCAN_RUNNING 0x0020 /* scan was started */
unsigned long ss_chanmindwell; /* min dwell on curchan */
unsigned long ss_scanend; /* time scan must stop */
@ -415,27 +417,31 @@ cancel_scan(struct ieee80211vap *vap, int any, const char *func)
{
struct ieee80211com *ic = vap->iv_ic;
struct ieee80211_scan_state *ss = ic->ic_scan;
struct scan_state *ss_priv = SCAN_PRIVATE(ss);
int signal;
IEEE80211_LOCK(ic);
signal = any ? ISCAN_PAUSE : ISCAN_CANCEL;
if ((ic->ic_flags & IEEE80211_F_SCAN) &&
(any || ss->ss_vap == vap) &&
(SCAN_PRIVATE(ss)->ss_iflags & ISCAN_CANCEL) == 0) {
(ss_priv->ss_iflags & signal) == 0) {
IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN,
"%s: cancel %s scan\n", func,
"%s: %s %s scan\n", func,
any ? "pause" : "cancel",
ss->ss_flags & IEEE80211_SCAN_ACTIVE ?
"active" : "passive");
/* clear bg scan NOPICK */
ss->ss_flags &= ~IEEE80211_SCAN_NOPICK;
/* mark cancel request and wake up the scan task */
scan_signal_locked(ss, ISCAN_CANCEL);
/* mark request and wake up the scan task */
scan_signal_locked(ss, signal);
} else {
IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN,
"%s: called; F_SCAN=%d, vap=%s, CANCEL=%d\n",
"%s: called; F_SCAN=%d, vap=%s, signal=%d\n",
func,
!! (ic->ic_flags & IEEE80211_F_SCAN),
(ss->ss_vap == vap ? "match" : "nomatch"),
!! (SCAN_PRIVATE(ss)->ss_iflags & ISCAN_CANCEL));
!! (ss_priv->ss_iflags & signal));
}
IEEE80211_UNLOCK(ic);
}
@ -868,9 +874,11 @@ scan_done(struct ieee80211_scan_state *ss, int scandone)
if (ss->ss_next >= ss->ss_last)
ic->ic_flags_ext &= ~IEEE80211_FEXT_BGSCAN;
ieee80211_notify_scan_done(vap);
/* send 'scan done' event if not interrupted due to traffic. */
if (!(ss_priv->ss_iflags & ISCAN_INTERRUPT))
ieee80211_notify_scan_done(vap);
}
ss_priv->ss_iflags &= ~(ISCAN_CANCEL|ISCAN_ABORT);
ss_priv->ss_iflags &= ~(ISCAN_PAUSE | ISCAN_ABORT);
ss_priv->ss_scanend = 0;
ss->ss_flags &= ~(IEEE80211_SCAN_ONCE | IEEE80211_SCAN_PICK1ST);
IEEE80211_UNLOCK(ic);