2808a02bf4
results. Right now the scan infrastructure assumes the channel is under net80211 control, and that when receiving beacon frames for scanning, the current channel is indeed what ic_curchan is set to. But firmware NICs with firmware scan support need more than this - they can do background scans whilst hiding the off-channel behaviour from net80211. Ie, net80211 still thinks everything is associated and on the main channel, but it's getting scan results from all the background traffic. However sta_add() pays attention to ic_curchan and discards scan results that aren't on the right channel. CCK beacon frames can be decoded from adjacent channels so the receive path and sta_add discard these as appropriate. This is fine for software scanning like for ath(4), but not for firmware NICs. So with those, the whole concept of background firmware scanning won't work without major hacks (eg, overriding ic_curchan before calling the beacon input / scan add.) As part of my scan overhaul, modify sta_add() and the scan_add() APIs to take an explicit current channel. The normal RX path will set it to ic_curchan so it's a no-op. However, drivers may decide to (eventually!) override the scan method to set the "right" current channel based on what the firmware reports the scan state is. So for example, iwn, rsu and other NICs will eventually do this: * driver issues scan start firmware command; * firmware sends a "scan start on channel X" notify; * firmware sends a bunch of beacon RX's as part of the scan results; * .. and the driver will replace scan_add() curchan with channel X, so scan results are correct. * firmware sends a "scan start on channel Y" notify; * firmware sends more beacons... * .. the driver replaces scan_add() curchan with channel Y. Note: * Eventually, net80211 should eventually grow the idea of a per-packet current channel. It's possible in various modes (eg WAVE, P2P, etc) that individual frames can come in from different channels and that is under firmware control rather than driver/net80211 control, so we should support that.
62 lines
3.0 KiB
C
62 lines
3.0 KiB
C
/*-
|
|
* Copyright (c) 2015 Adrian Chadd <adrian@FreeBSD.org>
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
* $FreeBSD$
|
|
*/
|
|
#ifndef __NET80211_IEEE80211_SCAN_SW_H__
|
|
#define __NET80211_IEEE80211_SCAN_SW_H__
|
|
|
|
extern void ieee80211_swscan_attach(struct ieee80211com *ic);
|
|
extern void ieee80211_swscan_detach(struct ieee80211com *ic);
|
|
|
|
extern void ieee80211_swscan_vattach(struct ieee80211vap *vap);
|
|
extern void ieee80211_swscan_vdetach(struct ieee80211vap *vap);
|
|
|
|
extern int ieee80211_swscan_start_scan(const struct ieee80211_scanner *scan,
|
|
struct ieee80211vap *vap, int flags,
|
|
u_int duration, u_int mindwell, u_int maxdwell,
|
|
u_int nssid, const struct ieee80211_scan_ssid ssids[]);
|
|
extern void ieee80211_swscan_set_scan_duration(struct ieee80211vap *vap,
|
|
u_int duration);
|
|
extern void ieee80211_swscan_run_scan_task(struct ieee80211vap *vap);
|
|
extern int ieee80211_swscan_check_scan(const struct ieee80211_scanner *scan,
|
|
struct ieee80211vap *vap, int flags,
|
|
u_int duration, u_int mindwell, u_int maxdwell,
|
|
u_int nssid, const struct ieee80211_scan_ssid ssids[]);
|
|
extern int ieee80211_swscan_bg_scan(const struct ieee80211_scanner *scan,
|
|
struct ieee80211vap *vap, int flags);
|
|
extern void ieee80211_swscan_cancel_scan(struct ieee80211vap *vap);
|
|
extern void ieee80211_swscan_cancel_anyscan(struct ieee80211vap *vap);
|
|
extern void ieee80211_swscan_scan_next(struct ieee80211vap *vap);
|
|
extern void ieee80211_swscan_scan_done(struct ieee80211vap *vap);
|
|
extern void ieee80211_swscan_probe_curchan(struct ieee80211vap *vap,
|
|
int force);
|
|
extern void ieee80211_swscan_add_scan(struct ieee80211vap *vap,
|
|
struct ieee80211_channel *curchan,
|
|
const struct ieee80211_scanparams *sp,
|
|
const struct ieee80211_frame *wh,
|
|
int subtype, int rssi, int noise);
|
|
|
|
#endif /* __NET80211_IEEE80211_SCAN_SW_H__ */
|