Lines Matching +full:scan +full:- +full:interval

1 /*-
2 * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
58 #define ISCAN_INTERRUPT 0x0004 /* interrupt current scan */
59 #define ISCAN_CANCEL 0x0008 /* cancel current scan */
61 #define ISCAN_ABORT 0x0010 /* end the scan immediately */
62 #define ISCAN_RUNNING 0x0020 /* scan was started */
65 unsigned long ss_scanend; /* time scan must stop */
66 u_int ss_duration; /* duration for next scan */
67 struct task ss_scan_start; /* scan start */
68 struct timeout_task ss_scan_curchan; /* scan execution */
73 * Amount of time to go off-channel during a background
74 * scan. This value should be large enough to catch most
75 * ap's but short enough that we can return on-channel
76 * before our listen interval expires.
79 * XXX check against configured listen interval
92 MALLOC_DEFINE(M_80211_SCAN, "80211scan", "802.11 scan state");
97 struct ieee80211_scan_state *ss = ic->ic_scan; in ieee80211_swscan_detach()
101 ieee80211_draintask(ic, &SCAN_PRIVATE(ss)->ss_scan_start); in ieee80211_swscan_detach()
102 taskqueue_drain_timeout(ic->ic_tq, in ieee80211_swscan_detach()
103 &SCAN_PRIVATE(ss)->ss_scan_curchan); in ieee80211_swscan_detach()
104 KASSERT((ic->ic_flags & IEEE80211_F_SCAN) == 0, in ieee80211_swscan_detach()
105 ("scan still running")); in ieee80211_swscan_detach()
114 if (ss->ss_ops != NULL) { in ieee80211_swscan_detach()
115 ss->ss_ops->scan_detach(ss); in ieee80211_swscan_detach()
116 ss->ss_ops = NULL; in ieee80211_swscan_detach()
118 ic->ic_scan = NULL; in ieee80211_swscan_detach()
128 * TODO: all of the vap scan calls should be methods! in ieee80211_swscan_vattach()
136 struct ieee80211com *ic = vap->iv_ic; in ieee80211_swscan_vdetach()
137 struct ieee80211_scan_state *ss = ic->ic_scan; in ieee80211_swscan_vdetach()
141 if (ss != NULL && ss->ss_vap == vap && in ieee80211_swscan_vdetach()
142 (ic->ic_flags & IEEE80211_F_SCAN)) in ieee80211_swscan_vdetach()
149 struct ieee80211com *ic = vap->iv_ic; in ieee80211_swscan_set_scan_duration()
150 struct ieee80211_scan_state *ss = ic->ic_scan; in ieee80211_swscan_set_scan_duration()
155 SCAN_PRIVATE(ss)->ss_iflags |= ISCAN_DISCARD; in ieee80211_swscan_set_scan_duration()
156 SCAN_PRIVATE(ss)->ss_duration = duration; in ieee80211_swscan_set_scan_duration()
160 * Start a scan unless one is already going.
163 ieee80211_swscan_start_scan_locked(const struct ieee80211_scanner *scan, in ieee80211_swscan_start_scan_locked() argument
168 struct ieee80211com *ic = vap->iv_ic; in ieee80211_swscan_start_scan_locked()
169 struct ieee80211_scan_state *ss = ic->ic_scan; in ieee80211_swscan_start_scan_locked()
173 if (ic->ic_flags & IEEE80211_F_CSAPENDING) { in ieee80211_swscan_start_scan_locked()
175 "%s: scan inhibited by pending channel change\n", __func__); in ieee80211_swscan_start_scan_locked()
176 } else if ((ic->ic_flags & IEEE80211_F_SCAN) == 0) { in ieee80211_swscan_start_scan_locked()
178 "%s: %s scan, duration %u mindwell %u maxdwell %u, desired mode %s, %s%s%s%s%s%s\n" in ieee80211_swscan_start_scan_locked()
182 , ieee80211_phymode_name[vap->iv_des_mode] in ieee80211_swscan_start_scan_locked()
191 ieee80211_scan_update_locked(vap, scan); in ieee80211_swscan_start_scan_locked()
192 if (ss->ss_ops != NULL) { in ieee80211_swscan_start_scan_locked()
196 ss->ss_flags = flags & IEEE80211_SCAN_PUBLIC_MASK; in ieee80211_swscan_start_scan_locked()
197 if (ss->ss_flags & IEEE80211_SCAN_ACTIVE) in ieee80211_swscan_start_scan_locked()
198 vap->iv_stats.is_scan_active++; in ieee80211_swscan_start_scan_locked()
200 vap->iv_stats.is_scan_passive++; in ieee80211_swscan_start_scan_locked()
202 ss->ss_ops->scan_flush(ss); in ieee80211_swscan_start_scan_locked()
204 if ((vap->iv_flags & IEEE80211_F_BGSCAN) != 0 && in ieee80211_swscan_start_scan_locked()
206 ic->ic_flags_ext |= IEEE80211_FEXT_BGSCAN; in ieee80211_swscan_start_scan_locked()
208 /* Set duration for this particular scan */ in ieee80211_swscan_start_scan_locked()
211 ss->ss_next = 0; in ieee80211_swscan_start_scan_locked()
212 ss->ss_mindwell = mindwell; in ieee80211_swscan_start_scan_locked()
213 ss->ss_maxdwell = maxdwell; in ieee80211_swscan_start_scan_locked()
214 /* NB: scan_start must be before the scan runtask */ in ieee80211_swscan_start_scan_locked()
215 ss->ss_ops->scan_start(ss, vap); in ieee80211_swscan_start_scan_locked()
220 ic->ic_flags |= IEEE80211_F_SCAN; in ieee80211_swscan_start_scan_locked()
222 /* Start scan task */ in ieee80211_swscan_start_scan_locked()
223 ieee80211_runtask(ic, &SCAN_PRIVATE(ss)->ss_scan_start); in ieee80211_swscan_start_scan_locked()
228 "%s: %s scan already in progress\n", __func__, in ieee80211_swscan_start_scan_locked()
229 ss->ss_flags & IEEE80211_SCAN_ACTIVE ? "active" : "passive"); in ieee80211_swscan_start_scan_locked()
235 * Start a scan unless one is already going.
240 ieee80211_swscan_start_scan(const struct ieee80211_scanner *scan, in ieee80211_swscan_start_scan() argument
245 struct ieee80211com *ic = vap->iv_ic; in ieee80211_swscan_start_scan()
251 result = ieee80211_swscan_start_scan_locked(scan, vap, flags, duration, in ieee80211_swscan_start_scan()
259 * Check the scan cache for an ap/channel to use; if that
260 * fails then kick off a new scan.
267 ieee80211_swscan_check_scan(const struct ieee80211_scanner *scan, in ieee80211_swscan_check_scan() argument
272 struct ieee80211com *ic = vap->iv_ic; in ieee80211_swscan_check_scan()
273 struct ieee80211_scan_state *ss = ic->ic_scan; in ieee80211_swscan_check_scan()
278 if (ss->ss_ops != NULL) { in ieee80211_swscan_check_scan()
279 /* XXX verify ss_ops matches vap->iv_opmode */ in ieee80211_swscan_check_scan()
288 if ((ic->ic_flags & IEEE80211_F_SCAN) == 0 && in ieee80211_swscan_check_scan()
290 ieee80211_time_before(ticks, ic->ic_lastscan + vap->iv_scanvalid)) { in ieee80211_swscan_check_scan()
295 * something is already in the scan cache we can in ieee80211_swscan_check_scan()
301 ic->ic_lastscan, in ieee80211_swscan_check_scan()
302 vap->iv_scanvalid, in ieee80211_swscan_check_scan()
304 SCAN_PRIVATE(ss)->ss_iflags |= ISCAN_DISCARD; in ieee80211_swscan_check_scan()
305 ic->ic_flags |= IEEE80211_F_SCAN; in ieee80211_swscan_check_scan()
308 ss->ss_flags = flags & IEEE80211_SCAN_PUBLIC_MASK; in ieee80211_swscan_check_scan()
309 result = ss->ss_ops->scan_end(ss, vap); in ieee80211_swscan_check_scan()
311 ic->ic_flags &= ~IEEE80211_F_SCAN; in ieee80211_swscan_check_scan()
312 SCAN_PRIVATE(ss)->ss_iflags &= ~ISCAN_DISCARD; in ieee80211_swscan_check_scan()
321 result = ieee80211_swscan_start_scan_locked(scan, vap, flags, duration, in ieee80211_swscan_check_scan()
328 * Restart a previous scan. If the previous scan completed
332 ieee80211_swscan_bg_scan(const struct ieee80211_scanner *scan, in ieee80211_swscan_bg_scan() argument
335 struct ieee80211com *ic = vap->iv_ic; in ieee80211_swscan_bg_scan()
336 struct ieee80211_scan_state *ss = ic->ic_scan; in ieee80211_swscan_bg_scan()
343 KASSERT((vap->iv_flags & IEEE80211_F_BGSCAN) != 0, in ieee80211_swscan_bg_scan()
345 __func__, vap, vap->iv_flags)); in ieee80211_swscan_bg_scan()
347 scanning = ic->ic_flags & IEEE80211_F_SCAN; in ieee80211_swscan_bg_scan()
351 * Go off-channel for a fixed interval that is large in ieee80211_swscan_bg_scan()
353 * we can return on-channel before our listen interval in ieee80211_swscan_bg_scan()
359 "%s: %s scan, ticks %u duration %u\n", __func__, in ieee80211_swscan_bg_scan()
360 ss->ss_flags & IEEE80211_SCAN_ACTIVE ? "active" : "passive", in ieee80211_swscan_bg_scan()
363 ieee80211_scan_update_locked(vap, scan); in ieee80211_swscan_bg_scan()
364 if (ss->ss_ops != NULL) { in ieee80211_swscan_bg_scan()
365 ss->ss_vap = vap; in ieee80211_swscan_bg_scan()
367 * A background scan does not select a new sta; it in ieee80211_swscan_bg_scan()
368 * just refreshes the scan cache. Also, indicate in ieee80211_swscan_bg_scan()
369 * the scan logic should follow the beacon schedule: in ieee80211_swscan_bg_scan()
370 * we go off-channel and scan for a while, then in ieee80211_swscan_bg_scan()
372 * then go off-channel again. All during this time in ieee80211_swscan_bg_scan()
374 * the scan is complete we leave power save mode. in ieee80211_swscan_bg_scan()
377 * (and background scan) automatically by way of the in ieee80211_swscan_bg_scan()
380 ss->ss_flags |= IEEE80211_SCAN_NOPICK in ieee80211_swscan_bg_scan()
384 /* if previous scan completed, restart */ in ieee80211_swscan_bg_scan()
385 if (ss->ss_next >= ss->ss_last) { in ieee80211_swscan_bg_scan()
386 if (ss->ss_flags & IEEE80211_SCAN_ACTIVE) in ieee80211_swscan_bg_scan()
387 vap->iv_stats.is_scan_active++; in ieee80211_swscan_bg_scan()
389 vap->iv_stats.is_scan_passive++; in ieee80211_swscan_bg_scan()
391 * NB: beware of the scan cache being flushed; in ieee80211_swscan_bg_scan()
395 ss->ss_next = 0; in ieee80211_swscan_bg_scan()
396 if (ss->ss_last != 0) { in ieee80211_swscan_bg_scan()
398 ss->ss_ops->scan_restart(ss, vap); in ieee80211_swscan_bg_scan()
400 ss->ss_ops->scan_start(ss, vap); in ieee80211_swscan_bg_scan()
408 ss->ss_maxdwell = duration; in ieee80211_swscan_bg_scan()
409 ic->ic_flags |= IEEE80211_F_SCAN; in ieee80211_swscan_bg_scan()
410 ic->ic_flags_ext |= IEEE80211_FEXT_BGSCAN; in ieee80211_swscan_bg_scan()
412 &SCAN_PRIVATE(ss)->ss_scan_start); in ieee80211_swscan_bg_scan()
419 "%s: %s scan already in progress\n", __func__, in ieee80211_swscan_bg_scan()
420 ss->ss_flags & IEEE80211_SCAN_ACTIVE ? "active" : "passive"); in ieee80211_swscan_bg_scan()
428 * Taskqueue work to cancel a scan.
430 * Note: for offload scan devices, we may want to call into the
436 struct ieee80211com *ic = vap->iv_ic; in cancel_scan()
437 struct ieee80211_scan_state *ss = ic->ic_scan; in cancel_scan()
443 if ((ic->ic_flags & IEEE80211_F_SCAN) && in cancel_scan()
444 (any || ss->ss_vap == vap) && in cancel_scan()
445 (ss_priv->ss_iflags & signal) == 0) { in cancel_scan()
447 "%s: %s %s scan\n", func, in cancel_scan()
449 ss->ss_flags & IEEE80211_SCAN_ACTIVE ? in cancel_scan()
452 /* clear bg scan NOPICK */ in cancel_scan()
453 ss->ss_flags &= ~IEEE80211_SCAN_NOPICK; in cancel_scan()
454 /* mark request and wake up the scan task */ in cancel_scan()
460 !! (ic->ic_flags & IEEE80211_F_SCAN), in cancel_scan()
461 (ss->ss_vap == vap ? "match" : "nomatch"), in cancel_scan()
462 !! (ss_priv->ss_iflags & signal)); in cancel_scan()
468 * Cancel any scan currently going on for the specified vap.
477 * Cancel any scan currently going on.
483 /* XXX for now - just don't do this per packet. */ in ieee80211_swscan_cancel_anyscan()
484 if (vap->iv_flags_ext & IEEE80211_FEXT_SCAN_OFFLOAD) in ieee80211_swscan_cancel_anyscan()
493 * (e.g. for firmware-based devices).
498 struct ieee80211_scan_state *ss = vap->iv_ic->ic_scan; in ieee80211_swscan_scan_next()
502 /* wake up the scan task */ in ieee80211_swscan_scan_next()
507 * Manually stop a scan that is currently running.
508 * Provided for drivers that are not able to scan single channels
509 * (e.g. for firmware-based devices).
514 struct ieee80211com *ic = vap->iv_ic; in ieee80211_swscan_scan_done()
515 struct ieee80211_scan_state *ss = ic->ic_scan; in ieee80211_swscan_scan_done()
524 * If the channel is not marked passive-only then send
532 struct ieee80211com *ic = vap->iv_ic; in ieee80211_swscan_probe_curchan()
533 struct ieee80211_scan_state *ss = ic->ic_scan; in ieee80211_swscan_probe_curchan()
537 * Full-offload scan devices don't require this. in ieee80211_swscan_probe_curchan()
539 if (vap->iv_flags_ext & IEEE80211_FEXT_SCAN_OFFLOAD) in ieee80211_swscan_probe_curchan()
545 * XXX remove dependence on ic/vap->iv_bss in ieee80211_swscan_probe_curchan()
547 for (i = 0; i < ss->ss_nssid; i++) in ieee80211_swscan_probe_curchan()
548 ieee80211_send_probereq(vap->iv_bss, in ieee80211_swscan_probe_curchan()
549 vap->iv_myaddr, in ieee80211_swscan_probe_curchan()
552 ss->ss_ssid[i].ssid, ss->ss_ssid[i].len); in ieee80211_swscan_probe_curchan()
553 if ((ss->ss_flags & IEEE80211_SCAN_NOBCAST) == 0) in ieee80211_swscan_probe_curchan()
554 ieee80211_send_probereq(vap->iv_bss, in ieee80211_swscan_probe_curchan()
555 vap->iv_myaddr, in ieee80211_swscan_probe_curchan()
562 * Scan curchan. If this is an active scan and the channel
569 struct ieee80211vap *vap = ss->ss_vap; in scan_curchan()
570 struct ieee80211com *ic = ss->ss_ic; in scan_curchan()
577 if (ss->ss_flags & IEEE80211_SCAN_ACTIVE) in scan_curchan()
579 taskqueue_enqueue_timeout(ic->ic_tq, in scan_curchan()
580 &SCAN_PRIVATE(ss)->ss_scan_curchan, maxdwell); in scan_curchan()
587 struct ieee80211com *ic = ss->ss_ic; in scan_signal()
600 struct timeout_task *scan_task = &ss_priv->ss_scan_curchan; in scan_signal_locked()
601 struct ieee80211com *ic = ss->ss_ic; in scan_signal_locked()
605 ss_priv->ss_iflags |= iflags; in scan_signal_locked()
606 if (ss_priv->ss_iflags & ISCAN_RUNNING) { in scan_signal_locked()
607 if (taskqueue_cancel_timeout(ic->ic_tq, scan_task, NULL) == 0) in scan_signal_locked()
608 taskqueue_enqueue_timeout(ic->ic_tq, scan_task, 0); in scan_signal_locked()
620 IEEE80211_DPRINTF(ss->ss_vap, IEEE80211_MSG_SCAN, "%s: called\n", in scan_mindwell()
632 struct ieee80211vap *vap = ss->ss_vap; in scan_start()
633 struct ieee80211com *ic = ss->ss_ic; in scan_start()
636 if (vap == NULL || (ic->ic_flags & IEEE80211_F_SCAN) == 0 || in scan_start()
637 (ss_priv->ss_iflags & ISCAN_ABORT)) { in scan_start()
643 if (ss->ss_next == ss->ss_last) { in scan_start()
645 "%s: no channels to scan\n", __func__); in scan_start()
653 * This is only required if we're not a full-offload devices; in scan_start()
654 * those devices manage scan/traffic differently. in scan_start()
656 if (((vap->iv_flags_ext & IEEE80211_FEXT_SCAN_OFFLOAD) == 0) && in scan_start()
657 vap->iv_opmode == IEEE80211_M_STA && in scan_start()
658 vap->iv_state == IEEE80211_S_RUN) { in scan_start()
659 if ((vap->iv_bss->ni_flags & IEEE80211_NODE_PWR_MGT) == 0) { in scan_start()
661 vap->iv_sta_ps(vap, 1); in scan_start()
665 if (ss_priv->ss_iflags & ISCAN_ABORT) { in scan_start()
672 ss_priv->ss_scanend = ticks + ss_priv->ss_duration; in scan_start()
674 /* XXX scan state can change! Re-validate scan state! */ in scan_start()
678 ic->ic_scan_start(ic); /* notify driver */ in scan_start()
688 struct ieee80211com *ic = ss->ss_ic; in scan_curchan_task()
696 * Note: only /end/ the scan if we're CANCEL rather than in scan_curchan_task()
699 * We can stop the scan if we hit cancel, but we shouldn't in scan_curchan_task()
700 * call scan_end(ss, 1) if we're just PAUSEing the scan. in scan_curchan_task()
702 scandone = (ss->ss_next >= ss->ss_last) || in scan_curchan_task()
703 ((ss_priv->ss_iflags & ISCAN_PAUSE) == ISCAN_CANCEL); in scan_curchan_task()
704 scanstop = (ss->ss_next >= ss->ss_last) || in scan_curchan_task()
705 ((ss_priv->ss_iflags & ISCAN_CANCEL) != 0); in scan_curchan_task()
707 IEEE80211_DPRINTF(ss->ss_vap, IEEE80211_MSG_SCAN, in scan_curchan_task()
712 (uint32_t) ss_priv->ss_iflags, in scan_curchan_task()
713 (uint32_t) ss->ss_next, in scan_curchan_task()
714 (uint32_t) ss->ss_last); in scan_curchan_task()
716 if (scanstop || (ss->ss_flags & IEEE80211_SCAN_GOTPICK) || in scan_curchan_task()
717 (ss_priv->ss_iflags & ISCAN_ABORT) || in scan_curchan_task()
718 ieee80211_time_after(ticks + ss->ss_mindwell, ss_priv->ss_scanend)) { in scan_curchan_task()
719 ss_priv->ss_iflags &= ~ISCAN_RUNNING; in scan_curchan_task()
723 ss_priv->ss_iflags |= ISCAN_RUNNING; in scan_curchan_task()
725 chan = ss->ss_chans[ss->ss_next++]; in scan_curchan_task()
728 * Watch for truncation due to the scan end time. in scan_curchan_task()
730 if (ieee80211_time_after(ticks + ss->ss_maxdwell, ss_priv->ss_scanend)) in scan_curchan_task()
731 maxdwell = ss_priv->ss_scanend - ticks; in scan_curchan_task()
733 maxdwell = ss->ss_maxdwell; in scan_curchan_task()
735 IEEE80211_DPRINTF(ss->ss_vap, IEEE80211_MSG_SCAN, in scan_curchan_task()
736 "%s: chan %3d%c -> %3d%c [%s, dwell min %lums max %lums]\n", in scan_curchan_task()
738 ieee80211_chan2ieee(ic, ic->ic_curchan), in scan_curchan_task()
739 ieee80211_channel_type_char(ic->ic_curchan), in scan_curchan_task()
742 (ss->ss_flags & IEEE80211_SCAN_ACTIVE) && in scan_curchan_task()
743 (chan->ic_flags & IEEE80211_CHAN_PASSIVE) == 0 ? in scan_curchan_task()
745 ticks_to_msecs(ss->ss_mindwell), ticks_to_msecs(maxdwell)); in scan_curchan_task()
750 ic->ic_curchan = chan; in scan_curchan_task()
751 ic->ic_rt = ieee80211_get_ratetable(chan); in scan_curchan_task()
754 * Perform the channel change and scan unlocked so the driver in scan_curchan_task()
758 ic->ic_set_channel(ic); in scan_curchan_task()
762 * Scan curchan. Drivers for "intelligent hardware" in scan_curchan_task()
769 * prepare/initiate the hardware for the scan (if at all). in scan_curchan_task()
771 ic->ic_scan_curchan(ss, maxdwell); in scan_curchan_task()
774 /* XXX scan state can change! Re-validate scan state! */ in scan_curchan_task()
776 ss_priv->ss_chanmindwell = ticks + ss->ss_mindwell; in scan_curchan_task()
778 ss_priv->ss_iflags &= ~ISCAN_REP; in scan_curchan_task()
780 if (ss_priv->ss_iflags & (ISCAN_CANCEL|ISCAN_ABORT)) { in scan_curchan_task()
781 taskqueue_cancel_timeout(ic->ic_tq, &ss_priv->ss_scan_curchan, in scan_curchan_task()
786 IEEE80211_DPRINTF(ss->ss_vap, IEEE80211_MSG_SCAN, "%s: waiting\n", in scan_curchan_task()
795 struct ieee80211vap *vap = ss->ss_vap; in scan_end()
796 struct ieee80211com *ic = ss->ss_ic; in scan_end()
802 if (ss_priv->ss_iflags & ISCAN_ABORT) { in scan_end()
808 ic->ic_scan_end(ic); /* notify driver */ in scan_end()
810 /* XXX scan state can change! Re-validate scan state! */ in scan_end()
816 if ((scandone == 0) && ((ss_priv->ss_iflags & ISCAN_PAUSE) == ISCAN_CANCEL)) { in scan_end()
818 "%s: OOPS! scan cancelled during driver call (1) (ss_iflags=0x%x)!\n", in scan_end()
819 __func__, ss_priv->ss_iflags); in scan_end()
824 * Record scan complete time. Note that we also do in scan_end()
825 * this when canceled so any background scan will in scan_end()
829 ic->ic_lastscan = ticks; in scan_end()
831 if (ic->ic_bsschan != IEEE80211_CHAN_ANYC && in scan_end()
832 ic->ic_curchan != ic->ic_bsschan) { in scan_end()
833 ieee80211_setupcurchan(ic, ic->ic_bsschan); in scan_end()
835 ic->ic_set_channel(ic); in scan_end()
840 ss_priv->ss_iflags &= ~ISCAN_REP; in scan_end()
841 ss->ss_flags &= ~IEEE80211_SCAN_GOTPICK; in scan_end()
844 * If not canceled and scan completed, do post-processing. in scan_end()
847 * notify the driver to end the scan above to avoid having in scan_end()
848 * rx frames alter the scan candidate list. in scan_end()
850 if ((ss_priv->ss_iflags & ISCAN_CANCEL) == 0 && in scan_end()
851 !ss->ss_ops->scan_end(ss, vap) && in scan_end()
852 (ss->ss_flags & IEEE80211_SCAN_ONCE) == 0 && in scan_end()
853 ieee80211_time_before(ticks + ss->ss_mindwell, ss_priv->ss_scanend)) { in scan_end()
858 ticks, ss->ss_mindwell, ss_priv->ss_scanend); in scan_end()
859 ss->ss_next = 0; /* reset to beginning */ in scan_end()
860 if (ss->ss_flags & IEEE80211_SCAN_ACTIVE) in scan_end()
861 vap->iv_stats.is_scan_active++; in scan_end()
863 vap->iv_stats.is_scan_passive++; in scan_end()
866 ss->ss_ops->scan_restart(ss, vap); /* XXX? */ in scan_end()
867 ieee80211_runtask(ic, &ss_priv->ss_scan_start); in scan_end()
873 if ((ss->ss_flags & IEEE80211_SCAN_BGSCAN) == 0) in scan_end()
879 ticks, ss->ss_mindwell, ss_priv->ss_scanend); in scan_end()
885 if (scandone == 0 && (ss_priv->ss_iflags & ISCAN_PAUSE) == ISCAN_CANCEL) { in scan_end()
887 "%s: OOPS! scan cancelled during driver call (2) (ss_iflags=0x%x)!\n", in scan_end()
888 __func__, ss_priv->ss_iflags); in scan_end()
899 struct ieee80211com *ic = ss->ss_ic; in scan_done()
900 struct ieee80211vap *vap = ss->ss_vap; in scan_done()
905 * Clear the SCAN bit first in case frames are in scan_done()
910 ic->ic_flags &= ~IEEE80211_F_SCAN; in scan_done()
913 * Drop out of power save mode when a scan has in scan_done()
914 * completed. If this scan was prematurely terminated in scan_done()
915 * because it is a background scan then don't notify in scan_done()
923 * If we're not a scan offload device, come back out of in scan_done()
926 if ((vap->iv_flags_ext & IEEE80211_FEXT_SCAN_OFFLOAD) == 0) in scan_done()
927 vap->iv_sta_ps(vap, 0); in scan_done()
928 if (ss->ss_next >= ss->ss_last) { in scan_done()
930 "%s: Dropping out of scan; ss_next=%u, ss_last=%u\n", in scan_done()
932 (uint32_t) ss->ss_next, in scan_done()
933 (uint32_t) ss->ss_last); in scan_done()
934 ic->ic_flags_ext &= ~IEEE80211_FEXT_BGSCAN; in scan_done()
937 /* send 'scan done' event if not interrupted due to traffic. */ in scan_done()
938 if (!(ss_priv->ss_iflags & ISCAN_INTERRUPT) || in scan_done()
939 (ss->ss_next >= ss->ss_last)) in scan_done()
942 ss_priv->ss_iflags &= ~(ISCAN_PAUSE | ISCAN_ABORT); in scan_done()
943 ss_priv->ss_scanend = 0; in scan_done()
944 ss->ss_flags &= ~(IEEE80211_SCAN_ONCE | IEEE80211_SCAN_PICK1ST); in scan_done()
959 struct ieee80211com *ic = vap->iv_ic; in ieee80211_swscan_add_scan()
960 struct ieee80211_scan_state *ss = ic->ic_scan; in ieee80211_swscan_add_scan()
965 * using scan state setup on the initial entry to the timer in ieee80211_swscan_add_scan()
970 if (SCAN_PRIVATE(ss)->ss_iflags & ISCAN_DISCARD) in ieee80211_swscan_add_scan()
973 if (ieee80211_msg_scan(vap) && (ic->ic_flags & IEEE80211_F_SCAN)) in ieee80211_swscan_add_scan()
974 ieee80211_scan_dump_probe_beacon(subtype, 1, wh->i_addr2, sp, rssi); in ieee80211_swscan_add_scan()
976 if (ss->ss_ops != NULL && in ieee80211_swscan_add_scan()
977 ss->ss_ops->scan_add(ss, curchan, sp, wh, subtype, rssi, noise)) { in ieee80211_swscan_add_scan()
982 if ((SCAN_PRIVATE(ss)->ss_iflags & ISCAN_MINDWELL) == 0 && in ieee80211_swscan_add_scan()
983 ieee80211_time_after_eq(ticks, SCAN_PRIVATE(ss)->ss_chanmindwell)) { in ieee80211_swscan_add_scan()
987 ieee80211_chan2ieee(ic, ic->ic_curchan), in ieee80211_swscan_add_scan()
988 ieee80211_channel_type_char(ic->ic_curchan), in ieee80211_swscan_add_scan()
989 ticks, SCAN_PRIVATE(ss)->ss_chanmindwell); in ieee80211_swscan_add_scan()
990 SCAN_PRIVATE(ss)->ss_iflags |= ISCAN_MINDWELL; in ieee80211_swscan_add_scan()
995 ic->ic_scan_mindwell(ss); in ieee80211_swscan_add_scan()
1018 * Default scan attach method.
1028 ic->ic_scan_methods = &swscan_methods; in ieee80211_swscan_attach()
1030 /* Allocate initial scan state */ in ieee80211_swscan_attach()
1034 ic->ic_scan = NULL; in ieee80211_swscan_attach()
1037 TASK_INIT(&ss->ss_scan_start, 0, scan_start, ss); in ieee80211_swscan_attach()
1038 TIMEOUT_TASK_INIT(ic->ic_tq, &ss->ss_scan_curchan, 0, in ieee80211_swscan_attach()
1041 ic->ic_scan = &ss->base; in ieee80211_swscan_attach()
1042 ss->base.ss_ic = ic; in ieee80211_swscan_attach()
1044 ic->ic_scan_curchan = scan_curchan; in ieee80211_swscan_attach()
1045 ic->ic_scan_mindwell = scan_mindwell; in ieee80211_swscan_attach()