Changeset View
Changeset View
Standalone View
Standalone View
head/sys/net80211/ieee80211_scan_sw.c
Show First 20 Lines • Show All 420 Lines • ▼ Show 20 Lines | IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, | ||||
ss->ss_flags & IEEE80211_SCAN_ACTIVE ? "active" : "passive"); | ss->ss_flags & IEEE80211_SCAN_ACTIVE ? "active" : "passive"); | ||||
} | } | ||||
IEEE80211_UNLOCK(ic); | IEEE80211_UNLOCK(ic); | ||||
/* NB: racey, does it matter? */ | /* NB: racey, does it matter? */ | ||||
return (ic->ic_flags & IEEE80211_F_SCAN); | return (ic->ic_flags & IEEE80211_F_SCAN); | ||||
} | } | ||||
/* | |||||
* Cancel any scan currently going on for the specified vap. | |||||
*/ | |||||
static void | static void | ||||
ieee80211_swscan_cancel_scan(struct ieee80211vap *vap) | cancel_scan(struct ieee80211vap *vap, int any, const char *func) | ||||
{ | { | ||||
struct ieee80211com *ic = vap->iv_ic; | struct ieee80211com *ic = vap->iv_ic; | ||||
struct ieee80211_scan_state *ss = ic->ic_scan; | struct ieee80211_scan_state *ss = ic->ic_scan; | ||||
IEEE80211_LOCK(ic); | IEEE80211_LOCK(ic); | ||||
if ((ic->ic_flags & IEEE80211_F_SCAN) && | if ((ic->ic_flags & IEEE80211_F_SCAN) && | ||||
ss->ss_vap == vap && | (any || ss->ss_vap == vap) && | ||||
(SCAN_PRIVATE(ss)->ss_iflags & ISCAN_CANCEL) == 0) { | (SCAN_PRIVATE(ss)->ss_iflags & ISCAN_CANCEL) == 0) { | ||||
IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, | IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, | ||||
"%s: cancel %s scan\n", __func__, | "%s: cancel %s scan\n", func, | ||||
ss->ss_flags & IEEE80211_SCAN_ACTIVE ? | ss->ss_flags & IEEE80211_SCAN_ACTIVE ? | ||||
"active" : "passive"); | "active" : "passive"); | ||||
/* clear bg scan NOPICK and mark cancel request */ | /* clear bg scan NOPICK and mark cancel request */ | ||||
ss->ss_flags &= ~IEEE80211_SCAN_NOPICK; | ss->ss_flags &= ~IEEE80211_SCAN_NOPICK; | ||||
SCAN_PRIVATE(ss)->ss_iflags |= ISCAN_CANCEL; | SCAN_PRIVATE(ss)->ss_iflags |= ISCAN_CANCEL; | ||||
/* wake up the scan task */ | /* wake up the scan task */ | ||||
scan_signal(ss); | scan_signal(ss); | ||||
} else { | } else { | ||||
IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, | IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, | ||||
"%s: called; F_SCAN=%d, vap=%s, CANCEL=%d\n", | "%s: called; F_SCAN=%d, vap=%s, CANCEL=%d\n", | ||||
__func__, | func, | ||||
!! (ic->ic_flags & IEEE80211_F_SCAN), | !! (ic->ic_flags & IEEE80211_F_SCAN), | ||||
(ss->ss_vap == vap ? "match" : "nomatch"), | (ss->ss_vap == vap ? "match" : "nomatch"), | ||||
!! (SCAN_PRIVATE(ss)->ss_iflags & ISCAN_CANCEL)); | !! (SCAN_PRIVATE(ss)->ss_iflags & ISCAN_CANCEL)); | ||||
} | } | ||||
IEEE80211_UNLOCK(ic); | IEEE80211_UNLOCK(ic); | ||||
} | } | ||||
/* | /* | ||||
* Cancel any scan currently going on for the specified vap. | |||||
*/ | |||||
static void | |||||
ieee80211_swscan_cancel_scan(struct ieee80211vap *vap) | |||||
{ | |||||
cancel_scan(vap, 0, __func__); | |||||
} | |||||
/* | |||||
* Cancel any scan currently going on. | * Cancel any scan currently going on. | ||||
*/ | */ | ||||
static void | static void | ||||
ieee80211_swscan_cancel_anyscan(struct ieee80211vap *vap) | ieee80211_swscan_cancel_anyscan(struct ieee80211vap *vap) | ||||
{ | { | ||||
struct ieee80211com *ic = vap->iv_ic; | cancel_scan(vap, 1, __func__); | ||||
struct ieee80211_scan_state *ss = ic->ic_scan; | |||||
IEEE80211_LOCK(ic); | |||||
if ((ic->ic_flags & IEEE80211_F_SCAN) && | |||||
(SCAN_PRIVATE(ss)->ss_iflags & ISCAN_CANCEL) == 0) { | |||||
IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, | |||||
"%s: cancel %s scan\n", __func__, | |||||
ss->ss_flags & IEEE80211_SCAN_ACTIVE ? | |||||
"active" : "passive"); | |||||
/* clear bg scan NOPICK and mark cancel request */ | |||||
ss->ss_flags &= ~IEEE80211_SCAN_NOPICK; | |||||
SCAN_PRIVATE(ss)->ss_iflags |= ISCAN_CANCEL; | |||||
/* wake up the scan task */ | |||||
scan_signal(ss); | |||||
} else { | |||||
IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, | |||||
"%s: called; F_SCAN=%d, vap=%s, CANCEL=%d\n", | |||||
__func__, | |||||
!! (ic->ic_flags & IEEE80211_F_SCAN), | |||||
(ss->ss_vap == vap ? "match" : "nomatch"), | |||||
!! (SCAN_PRIVATE(ss)->ss_iflags & ISCAN_CANCEL)); | |||||
} | |||||
IEEE80211_UNLOCK(ic); | |||||
} | } | ||||
/* | /* | ||||
* Public access to scan_next for drivers that manage | * Public access to scan_next for drivers that manage | ||||
* scanning themselves (e.g. for firmware-based devices). | * scanning themselves (e.g. for firmware-based devices). | ||||
*/ | */ | ||||
static void | static void | ||||
ieee80211_swscan_scan_next(struct ieee80211vap *vap) | ieee80211_swscan_scan_next(struct ieee80211vap *vap) | ||||
▲ Show 20 Lines • Show All 458 Lines • Show Last 20 Lines |