105ac2d0dSSascha Wildner.\" 205ac2d0dSSascha Wildner.\" Copyright (c) 2009 Sam Leffler, Errno Consulting 305ac2d0dSSascha Wildner.\" All rights reserved. 405ac2d0dSSascha Wildner.\" 505ac2d0dSSascha Wildner.\" Redistribution and use in source and binary forms, with or without 605ac2d0dSSascha Wildner.\" modification, are permitted provided that the following conditions 705ac2d0dSSascha Wildner.\" are met: 805ac2d0dSSascha Wildner.\" 1. Redistributions of source code must retain the above copyright 905ac2d0dSSascha Wildner.\" notice, this list of conditions and the following disclaimer. 1005ac2d0dSSascha Wildner.\" 2. Redistributions in binary form must reproduce the above copyright 1105ac2d0dSSascha Wildner.\" notice, this list of conditions and the following disclaimer in the 1205ac2d0dSSascha Wildner.\" documentation and/or other materials provided with the distribution. 1305ac2d0dSSascha Wildner.\" 1405ac2d0dSSascha Wildner.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1505ac2d0dSSascha Wildner.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1605ac2d0dSSascha Wildner.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1705ac2d0dSSascha Wildner.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1805ac2d0dSSascha Wildner.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1905ac2d0dSSascha Wildner.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2005ac2d0dSSascha Wildner.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2105ac2d0dSSascha Wildner.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2205ac2d0dSSascha Wildner.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2305ac2d0dSSascha Wildner.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2405ac2d0dSSascha Wildner.\" SUCH DAMAGE. 2505ac2d0dSSascha Wildner.\" 26e4c06619SSascha Wildner.\" $FreeBSD: head/share/man/man9/ieee80211_scan.9 233648 2012-03-29 05:02:12Z eadler $ 2705ac2d0dSSascha Wildner.\" 2817338d27SSascha Wildner.Dd May 26, 2016 2905ac2d0dSSascha Wildner.Dt IEEE80211_SCAN 9 3005ac2d0dSSascha Wildner.Os 3105ac2d0dSSascha Wildner.Sh NAME 3205ac2d0dSSascha Wildner.Nm ieee80211_scan 3305ac2d0dSSascha Wildner.Nd 802.11 scanning support 3405ac2d0dSSascha Wildner.Sh SYNOPSIS 357d9c9280SSascha Wildner.In net/if.h 367d9c9280SSascha Wildner.In net/if_media.h 37737edb20SSascha Wildner.In netproto/802_11/ieee80211_var.h 3805ac2d0dSSascha Wildner.Pp 3905ac2d0dSSascha Wildner.Ft int 4005ac2d0dSSascha Wildner.Fo ieee80211_start_scan 4105ac2d0dSSascha Wildner.Fa "struct ieee80211vap *" 4205ac2d0dSSascha Wildner.Fa "int flags" 4305ac2d0dSSascha Wildner.Fa "u_int duration" 4405ac2d0dSSascha Wildner.Fa "u_int mindwell" 4505ac2d0dSSascha Wildner.Fa "u_int maxdwell" 4605ac2d0dSSascha Wildner.Fa "u_int nssid" 4705ac2d0dSSascha Wildner.Fa "const struct ieee80211_scan_ssid ssids[]" 4805ac2d0dSSascha Wildner.Fc 4905ac2d0dSSascha Wildner.\" 5005ac2d0dSSascha Wildner.Ft int 5105ac2d0dSSascha Wildner.Fo ieee80211_check_scan 5205ac2d0dSSascha Wildner.Fa "struct ieee80211vap *" 5305ac2d0dSSascha Wildner.Fa "int flags" 5405ac2d0dSSascha Wildner.Fa "u_int duration" 5505ac2d0dSSascha Wildner.Fa "u_int mindwell" 5605ac2d0dSSascha Wildner.Fa "u_int maxdwell" 5705ac2d0dSSascha Wildner.Fa "u_int nssid" 5805ac2d0dSSascha Wildner.Fa "const struct ieee80211_scan_ssid ssids[]" 5905ac2d0dSSascha Wildner.Fc 6005ac2d0dSSascha Wildner.\" 6105ac2d0dSSascha Wildner.Ft int 6205ac2d0dSSascha Wildner.Fn ieee80211_check_scan_current "struct ieee80211vap *" 6305ac2d0dSSascha Wildner.\" 6405ac2d0dSSascha Wildner.Ft int 6505ac2d0dSSascha Wildner.Fn ieee80211_bg_scan "struct ieee80211vap *" "int" 6605ac2d0dSSascha Wildner.\" 6705ac2d0dSSascha Wildner.Ft int 6805ac2d0dSSascha Wildner.Fn ieee80211_cancel_scan "struct ieee80211vap *" 6905ac2d0dSSascha Wildner.\" 7005ac2d0dSSascha Wildner.Ft int 71e354d347SSascha Wildner.Fn ieee80211_cancel_anyscan "struct ieee80211vap *" 7205ac2d0dSSascha Wildner.\" 7305ac2d0dSSascha Wildner.Ft int 7405ac2d0dSSascha Wildner.Fn ieee80211_scan_next "struct ieee80211vap *" 7505ac2d0dSSascha Wildner.\" 7605ac2d0dSSascha Wildner.Ft int 7705ac2d0dSSascha Wildner.Fn ieee80211_scan_done "struct ieee80211vap *" 7805ac2d0dSSascha Wildner.\" 7905ac2d0dSSascha Wildner.Ft int 8005ac2d0dSSascha Wildner.Fn ieee80211_probe_curchan "struct ieee80211vap *" "int" 8105ac2d0dSSascha Wildner.\" 8205ac2d0dSSascha Wildner.Ft void 8305ac2d0dSSascha Wildner.Fo ieee80211_add_scan 8405ac2d0dSSascha Wildner.Fa "struct ieee80211vap *" 8517338d27SSascha Wildner.Fa "struct ieee80211_channel *" 8605ac2d0dSSascha Wildner.Fa "const struct ieee80211_scanparams *" 8705ac2d0dSSascha Wildner.Fa "const struct ieee80211_frame *" 8805ac2d0dSSascha Wildner.Fa "int subtype" 8905ac2d0dSSascha Wildner.Fa "int rssi" 9005ac2d0dSSascha Wildner.Fa "int noise" 9105ac2d0dSSascha Wildner.Fc 9205ac2d0dSSascha Wildner.\" 9305ac2d0dSSascha Wildner.Ft void 9405ac2d0dSSascha Wildner.Fn ieee80211_scan_timeout "struct ieee80211com *" 9505ac2d0dSSascha Wildner.\" 9605ac2d0dSSascha Wildner.Ft void 9705ac2d0dSSascha Wildner.Fo ieee80211_scan_assoc_fail 9805ac2d0dSSascha Wildner.Fa "struct ieee80211vap *" 9905ac2d0dSSascha Wildner.Fa "const uint8_t mac[IEEE80211_ADDR_LEN]" 10005ac2d0dSSascha Wildner.Fa "int reason" 10105ac2d0dSSascha Wildner.Fc 10205ac2d0dSSascha Wildner.\" 10305ac2d0dSSascha Wildner.Ft void 10405ac2d0dSSascha Wildner.Fn ieee80211_scan_flush "struct ieee80211vap *" 10505ac2d0dSSascha Wildner.\" 10605ac2d0dSSascha Wildner.Ft void 10705ac2d0dSSascha Wildner.Fo ieee80211_scan_iterate 10805ac2d0dSSascha Wildner.Fa "struct ieee80211vap *" 10905ac2d0dSSascha Wildner.Fa "ieee80211_scan_iter_func" 11005ac2d0dSSascha Wildner.Fa "void *" 11105ac2d0dSSascha Wildner.Fc 11205ac2d0dSSascha Wildner.\" 11305ac2d0dSSascha Wildner.Ft void 11405ac2d0dSSascha Wildner.Fn ieee80211_scan_dump_channels "const struct ieee80211_scan_state *" 11505ac2d0dSSascha Wildner.\" 11605ac2d0dSSascha Wildner.Ft void 11705ac2d0dSSascha Wildner.Fo ieee80211_scanner_register 11805ac2d0dSSascha Wildner.Fa "enum ieee80211_opmode" 11905ac2d0dSSascha Wildner.Fa "const struct ieee80211_scanner *" 12005ac2d0dSSascha Wildner.Fc 12105ac2d0dSSascha Wildner.\" 12205ac2d0dSSascha Wildner.Ft void 12305ac2d0dSSascha Wildner.Fo ieee80211_scanner_unregister 12405ac2d0dSSascha Wildner.Fa "enum ieee80211_opmode" 12505ac2d0dSSascha Wildner.Fa "const struct ieee80211_scanner *" 12605ac2d0dSSascha Wildner.Fc 12705ac2d0dSSascha Wildner.\" 12805ac2d0dSSascha Wildner.Ft void 12905ac2d0dSSascha Wildner.Fn ieee80211_scanner_unregister_all "const struct ieee80211_scanner *" 13005ac2d0dSSascha Wildner.\" 13105ac2d0dSSascha Wildner.Ft const struct ieee80211_scanner * 13205ac2d0dSSascha Wildner.Fn ieee80211_scanner_get "enum ieee80211_opmode" 13305ac2d0dSSascha Wildner.Sh DESCRIPTION 13405ac2d0dSSascha WildnerThe 13505ac2d0dSSascha Wildner.Nm net80211 13605ac2d0dSSascha Wildnersoftware layer provides an extensible framework for scanning. 13705ac2d0dSSascha WildnerScanning is the procedure by which a station locates a BSS to join 13805ac2d0dSSascha Wildner(in infrastructure and IBSS mode), or a channel to use (when operating 13905ac2d0dSSascha Wildneras an AP or an IBSS master). 14005ac2d0dSSascha WildnerScans are either 14105ac2d0dSSascha Wildner.Dq active 14205ac2d0dSSascha Wildneror 14305ac2d0dSSascha Wildner.Dq passive . 14405ac2d0dSSascha WildnerAn active scan causes one or more ProbeRequest frames to be sent on 14505ac2d0dSSascha Wildnervisiting each channel. 14605ac2d0dSSascha WildnerA passive request causes each channel in the scan set to be visited but 14705ac2d0dSSascha Wildnerno frames to be transmitted; the station only listens for traffic. 14805ac2d0dSSascha WildnerNote that active scanning may still need to listen for traffic before 14905ac2d0dSSascha Wildnersending ProbeRequest frames depending on regulatory constraints. 15005ac2d0dSSascha Wildner.Pp 15105ac2d0dSSascha WildnerA scan operation involves constructing a set of channels to inspect 15205ac2d0dSSascha Wildner(the scan set), 15305ac2d0dSSascha Wildnervisiting each channel and collecting information 15405ac2d0dSSascha Wildner(e.g. what BSS are present), 15505ac2d0dSSascha Wildnerand then analyzing the results to make decisions such as which BSS to join. 15605ac2d0dSSascha WildnerThis process needs to be as fast as possible so 15705ac2d0dSSascha Wildner.Nm net80211 15805ac2d0dSSascha Wildnerdoes things like intelligently construct scan sets and dwell on a channel 15905ac2d0dSSascha Wildneronly as long as necessary. 16005ac2d0dSSascha WildnerScan results are cached and the scan cache is used to avoid scanning when 16105ac2d0dSSascha Wildnerpossible and to enable roaming between access points when operating 16205ac2d0dSSascha Wildnerin infrastructure mode. 16305ac2d0dSSascha Wildner.Pp 16405ac2d0dSSascha WildnerScanning is handled by pluggable modules that implement 16505ac2d0dSSascha Wildner.Em policy 16605ac2d0dSSascha Wildnerper-operating mode. 16705ac2d0dSSascha WildnerThe core scanning support provides an infrastructure to support these 16805ac2d0dSSascha Wildnermodules and exports a common API to the rest of the 16905ac2d0dSSascha Wildner.Nm net80211 17005ac2d0dSSascha Wildnerlayer. 17105ac2d0dSSascha WildnerPolicy modules decide what channels to visit, what state to record to 17205ac2d0dSSascha Wildnermake decisions, and selects the final station/channel to return as the 17305ac2d0dSSascha Wildnerresult of a scan. 17405ac2d0dSSascha Wildner.Pp 17505ac2d0dSSascha WildnerScanning is done synchronously when initially bringing a vap to 17605ac2d0dSSascha Wildneran operational state and optionally in the background to maintain 17705ac2d0dSSascha Wildnerthe scan cache for doing roaming and rogue AP monitoring. 17805ac2d0dSSascha WildnerScanning is not tied to the 17905ac2d0dSSascha Wildner.Nm net80211 18005ac2d0dSSascha Wildnerstate machine that governs vaps except for linkage to the 18105ac2d0dSSascha Wildner.Dv IEEE80211_S_SCAN 18205ac2d0dSSascha Wildnerstate. 18305ac2d0dSSascha WildnerOnly one vap at a time may be scanning; this scheduling policy 18405ac2d0dSSascha Wildneris handled in 18505ac2d0dSSascha Wildner.Fn ieee80211_new_state 18605ac2d0dSSascha Wildnerand is transparent to scanning code. 18705ac2d0dSSascha Wildner.Pp 18805ac2d0dSSascha WildnerScanning is controlled by a set of parameters that (potentially) 18905ac2d0dSSascha Wildnerconstrains the channel set and any desired SSID's and BSSID's. 19005ac2d0dSSascha Wildner.Nm net80211 19105ac2d0dSSascha Wildnercomes with a standard scanner module that works with all available 19205ac2d0dSSascha Wildneroperating modes and supports 19305ac2d0dSSascha Wildner.Dq background scanning 19405ac2d0dSSascha Wildnerand 19505ac2d0dSSascha Wildner.Dq roaming 19605ac2d0dSSascha Wildneroperation. 19705ac2d0dSSascha Wildner.Sh SCANNER MODULES 19805ac2d0dSSascha WildnerScanning modules use a registration mechanism to hook into the 19905ac2d0dSSascha Wildner.Nm net80211 20005ac2d0dSSascha Wildnerlayer. 20105ac2d0dSSascha WildnerUse 20205ac2d0dSSascha Wildner.Fn ieee80211_scanner_register 20305ac2d0dSSascha Wildnerto register a scan module for a particular operating mode and 20405ac2d0dSSascha Wildner.Fn ieee80211_scanner_unregister 20505ac2d0dSSascha Wildneror 20605ac2d0dSSascha Wildner.Fn ieee80211_scanner_unregister_all 20705ac2d0dSSascha Wildnerto clear entries (typically on module unload). 20805ac2d0dSSascha WildnerOnly one scanner module can be registered at any time for an operating mode. 20905ac2d0dSSascha Wildner.Sh DRIVER SUPPORT 21005ac2d0dSSascha WildnerScanning operations are usually managed by the 21105ac2d0dSSascha Wildner.Nm net80211 21205ac2d0dSSascha Wildnerlayer. 21305ac2d0dSSascha WildnerDrivers must provide 21405ac2d0dSSascha Wildner.Vt ic_scan_start 21505ac2d0dSSascha Wildnerand 21605ac2d0dSSascha Wildner.Vt ic_scan_stop 21705ac2d0dSSascha Wildnermethods that are called at the start of a scan and when the 21805ac2d0dSSascha Wildnerwork is done; these should handle work such as enabling receive 21905ac2d0dSSascha Wildnerof Beacon and ProbeResponse frames and disable any BSSID matching. 22005ac2d0dSSascha WildnerThe 22105ac2d0dSSascha Wildner.Vt ic_set_channel 22205ac2d0dSSascha Wildnermethod is used to change channels while scanning. 22305ac2d0dSSascha Wildner.Nm net80211 22405ac2d0dSSascha Wildnerwill generate ProbeRequest frames and transmit them using the 22505ac2d0dSSascha Wildner.Nm ic_raw_xmit 22605ac2d0dSSascha Wildnermethod. 22705ac2d0dSSascha WildnerFrames received while scanning are dispatched to 22805ac2d0dSSascha Wildner.Nm net80211 22905ac2d0dSSascha Wildnerusing the normal receive path. 23005ac2d0dSSascha WildnerDevices that off-load scan work to firmware most easily mesh with 23105ac2d0dSSascha Wildner.Nm net80211 23205ac2d0dSSascha Wildnerby operating on a channel-at-a-time basis as this defers control to 23305ac2d0dSSascha Wildner.Nm net80211's 23405ac2d0dSSascha Wildnerscan machine scheduler. 23505ac2d0dSSascha WildnerBut multi-channel scanning 23605ac2d0dSSascha Wildneris supported if the driver manually dispatches results using 23705ac2d0dSSascha Wildner.Fn ieee80211_add_scan 23805ac2d0dSSascha Wildnerroutine to enter results into the scan cache. 23905ac2d0dSSascha Wildner.Sh SCAN REQUESTS 24005ac2d0dSSascha WildnerScan requests occur by way of the 24105ac2d0dSSascha Wildner.Dv IEEE80211_SCAN_REQUEST 24205ac2d0dSSascha Wildnerioctl or through a change in a vap's state machine that requires 24305ac2d0dSSascha Wildnerscanning. 24405ac2d0dSSascha WildnerIn both cases the scan cache can be checked first and, if it is deemed 24505ac2d0dSSascha Wildnersuitably 24605ac2d0dSSascha Wildner.Dq warm 247*a42bad2dSSascha Wildnerthen its contents are used without leaving the current channel. 24805ac2d0dSSascha WildnerTo start a scan without checking the cache 24905ac2d0dSSascha Wildner.Fn ieee80211_start_scan 25005ac2d0dSSascha Wildnercan be called; otherwise 25105ac2d0dSSascha Wildner.Fn ieee80211_check_scan 25205ac2d0dSSascha Wildnercan be used to first check the scan cache, kicking off a scan if 25305ac2d0dSSascha Wildnerthe cache contents are out of date. 25405ac2d0dSSascha WildnerThere is also 25505ac2d0dSSascha Wildner.Fn ieee80211_check_scan_current 25605ac2d0dSSascha Wildnerwhich is a shorthand for using previously set scan parameters for 25705ac2d0dSSascha Wildnerchecking the scan cache and then scanning. 25805ac2d0dSSascha Wildner.Pp 25905ac2d0dSSascha WildnerBackground scanning is done using 26005ac2d0dSSascha Wildner.Fn ieee80211_bg_scan 26105ac2d0dSSascha Wildnerin a co-routine fashion. 26205ac2d0dSSascha WildnerThe first call to this routine will start a background scan that 26305ac2d0dSSascha Wildnerruns for a limited period of time before returning to the BSS channel. 26405ac2d0dSSascha WildnerSubsequent calls advance through the scan set until all channels are 26505ac2d0dSSascha Wildnervisited. 26605ac2d0dSSascha WildnerTypically these later calls are timed to allow receipt of 26705ac2d0dSSascha Wildnerframes buffered by an access point for the station. 26805ac2d0dSSascha Wildner.Pp 26905ac2d0dSSascha WildnerA scan operation can be canceled using 27005ac2d0dSSascha Wildner.Fn ieee80211_cancel_scan 27105ac2d0dSSascha Wildnerif it was initiated by the specified vap, or 272e354d347SSascha Wildner.Fn ieee80211_cancel_anyscan 27305ac2d0dSSascha Wildnerto force termination regardless which vap started it. 27405ac2d0dSSascha WildnerThese requests are mostly used by 27505ac2d0dSSascha Wildner.Nm net80211 27605ac2d0dSSascha Wildnerin the transmit path to cancel background scans when frames are to be sent. 27705ac2d0dSSascha WildnerDrivers should not need to use these calls (or most of the calls described 27805ac2d0dSSascha Wildneron this page). 27905ac2d0dSSascha Wildner.Pp 28005ac2d0dSSascha WildnerThe 28105ac2d0dSSascha Wildner.Fn ieee80211_scan_next 28205ac2d0dSSascha Wildnerand 28305ac2d0dSSascha Wildner.Fn ieee80211_scan_done 28405ac2d0dSSascha Wildnerroutines do explicit iteration through the scan set and should 28505ac2d0dSSascha Wildnernot normally be used by drivers. 28605ac2d0dSSascha Wildner.Fn ieee80211_probe_curchan 28705ac2d0dSSascha Wildnerhandles the work of transmitting ProbeRequest frames when visiting 28805ac2d0dSSascha Wildnera channel during an active scan. 28905ac2d0dSSascha WildnerWhen the channel attributes are marked with 29005ac2d0dSSascha Wildner.Dv IEEE80211_CHAN_PASSIVE 29105ac2d0dSSascha Wildnerthis function will arrange that before any frame is transmitted 802.11 29205ac2d0dSSascha Wildnertraffic is first received (in order to comply with regulatory constraints). 29305ac2d0dSSascha Wildner.Pp 29405ac2d0dSSascha WildnerMin/max dwell time parameters are used to constrain time spent visiting 29505ac2d0dSSascha Wildnera channel. 29605ac2d0dSSascha WildnerThe maximum dwell time constrains the time spent listening for traffic. 29705ac2d0dSSascha WildnerThe minimum dwell time is used to reduce this time--when it is reached 29805ac2d0dSSascha Wildnerand one or more frames have been received then an immediate channel 29905ac2d0dSSascha Wildnerchange will be done. 30005ac2d0dSSascha WildnerDrivers can override this behaviour through the 30105ac2d0dSSascha Wildner.Vt iv_scan_mindwell 30205ac2d0dSSascha Wildnermethod. 30305ac2d0dSSascha Wildner.Sh SCAN CACHE MANAGEMENT 30405ac2d0dSSascha WildnerThe scan cache contents are managed by the scan policy module and 30505ac2d0dSSascha Wildnerare opaque outside this module. 30605ac2d0dSSascha WildnerThe 30705ac2d0dSSascha Wildner.Nm net80211 30805ac2d0dSSascha Wildnerscan framework defines API's for interacting. 30905ac2d0dSSascha WildnerThe validity of the scan cache contents are controlled by 31005ac2d0dSSascha Wildner.Vt iv_scanvalid 31105ac2d0dSSascha Wildnerwhich is exported to user space through the 31205ac2d0dSSascha Wildner.Dv IEEE80211_SCAN_VALID 31305ac2d0dSSascha Wildnerrequest. 31405ac2d0dSSascha Wildner.Pp 31505ac2d0dSSascha WildnerThe cache contents can be explicitly flushed with 31605ac2d0dSSascha Wildner.Fn ieee80211_scan_flush 31705ac2d0dSSascha Wildneror by setting the 31805ac2d0dSSascha Wildner.Dv IEEE80211_SCAN_FLUSH 31905ac2d0dSSascha Wildnerflag when starting a scan operation. 32005ac2d0dSSascha Wildner.Pp 32105ac2d0dSSascha WildnerScan cache entries are created with the 32205ac2d0dSSascha Wildner.Fn ieee80211_add_scan 32305ac2d0dSSascha Wildnerroutine; usually on receipt of Beacon or ProbeResponse frames. 32405ac2d0dSSascha WildnerExisting entries are typically updated based on the latest information 32505ac2d0dSSascha Wildnerthough some information such as RSSI and noise floor readings may be 32605ac2d0dSSascha Wildnercombined to present an average. 32705ac2d0dSSascha Wildner.Pp 32805ac2d0dSSascha WildnerThe cache contents is aged through 32905ac2d0dSSascha Wildner.Fn ieee80211_scan_timeout 33005ac2d0dSSascha Wildnercalls. 33105ac2d0dSSascha WildnerTypically these happen together with other station table activity; every 33205ac2d0dSSascha Wildner.Dv IEEE80211_INACT_WAIT 33305ac2d0dSSascha Wildnerseconds (default 15). 33405ac2d0dSSascha Wildner.Pp 33505ac2d0dSSascha WildnerIndividual cache entries are marked usable with 33605ac2d0dSSascha Wildner.Fn ieee80211_scan_assoc_success 33705ac2d0dSSascha Wildnerand faulty with 33805ac2d0dSSascha Wildner.Fn ieee80211_scan_assoc_fail 33905ac2d0dSSascha Wildnerwith the latter taking an argument to identify if there was no response 34005ac2d0dSSascha Wildnerto Authentication/Association requests or if a negative response was 34105ac2d0dSSascha Wildnerreceived (which might hasten cache eviction or blacklist the entry). 34205ac2d0dSSascha Wildner.Pp 34305ac2d0dSSascha WildnerThe cache contents can be viewed using the 34405ac2d0dSSascha Wildner.Fn ieee80211_scan_iterate 34505ac2d0dSSascha Wildnercall. 34605ac2d0dSSascha WildnerCache entries are exported in a public format that is exported to user 34705ac2d0dSSascha Wildnerapplications through the 34805ac2d0dSSascha Wildner.Dv IEEE80211_SCAN_RESULTS 34905ac2d0dSSascha Wildnerrequest. 35005ac2d0dSSascha Wildner.Sh SEE ALSO 35105ac2d0dSSascha Wildner.Xr ioctl 2 , 35205ac2d0dSSascha Wildner.Xr ieee80211 9 , 35305ac2d0dSSascha Wildner.Xr ieee80211_proto 9 354