39#include <sys/kernel.h>
40#include <sys/malloc.h>
41#include <sys/condvar.h>
43#include <sys/socket.h>
46#include <net/if_var.h>
47#include <net/if_media.h>
48#include <net/ethernet.h>
63#define ROAM_RSSI_11A_DEFAULT 14
64#define ROAM_RSSI_11B_DEFAULT 14
65#define ROAM_RSSI_11BONLY_DEFAULT 14
67#define ROAM_RATE_11A_DEFAULT 2*12
68#define ROAM_RATE_11B_DEFAULT 2*5
69#define ROAM_RATE_11BONLY_DEFAULT 2*1
70#define ROAM_RATE_HALF_DEFAULT 2*6
71#define ROAM_RATE_QUARTER_DEFAULT 2*3
72#define ROAM_MCS_11N_DEFAULT (1 | IEEE80211_RATE_MCS)
73#define ROAM_MCS_11AC_DEFAULT (1 | IEEE80211_RATE_MCS)
163 if (ss != NULL && ss->
ss_vap == vap) {
243#ifdef IEEE80211_DEBUG
246 "%s: current scanner is <%s:%s>, switch to <%s:%s>\n",
266 if (scan == NULL || ss->
ss_ops == NULL ||
288 for (i = ss->
ss_next; i < ss->ss_last; i++) {
297#ifdef IEEE80211_DEBUG
303 if_printf(vap->
iv_ifp,
"scan set ");
305 printf(
" dwell min %ums max %ums\n",
317 "%s: too many ssid %d, ignoring all of them\n",
321 memcpy(ss->
ss_ssid, ssids, nssid *
sizeof(ssids[0]));
330 u_int duration, u_int mindwell, u_int maxdwell,
339 "%s: no scanner support for %s mode\n",
346 mindwell, maxdwell, nssid, ssids);
355 u_int duration, u_int mindwell, u_int maxdwell,
366 "%s: no scanner support for %s mode\n",
379 "%s: %s scan, %s%s%s%s%s\n"
400 mindwell, maxdwell, nssid, ssids);
435 "%s: no scanner support for %s mode\n",
529#ifdef IEEE80211_DEBUG
531dump_country(
const uint8_t *ie)
538 printf(
" <bogus country ie, len %d>", cie->
len);
541 printf(
" country [%c%c%c", cie->
cc[0], cie->
cc[1], cie->
cc[2]);
542 nbands = (cie->
len - 3) /
sizeof(cie->
band[0]);
543 for (i = 0; i < nbands; i++) {
561 printf(
"[%s] %s%s on chan %u (bss chan %u) ",
562 ether_sprintf(
mac), isnew ?
"new " :
"",
565 printf(
" rssi %d\n", rssi);
568 printf(
"[%s] caps 0x%x bintval %u erp 0x%x",
585 int subtype,
int rssi,
int noise)
616 mac,
"%s", __func__);
626 const uint8_t
mac[],
int reason)
632 "%s: reason %u", __func__, reason);
675 if (ss == NULL || ss->
ss_ops == NULL || ss->
ss_vap == NULL) {
681 "%s: scan module does not support picking a channel, "
@ IEEE80211_MODE_STURBO_A
@ IEEE80211_MODE_VHT_2GHZ
@ IEEE80211_MODE_VHT_5GHZ
#define IEEE80211_CHAN_PASSIVE
#define IEEE80211_OPMODE_MAX
#define IEEE80211_MODE_MAX
int ieee80211_chan2ieee(struct ieee80211com *ic, const struct ieee80211_channel *c)
char ieee80211_channel_type_char(const struct ieee80211_channel *c)
#define IEEE80211_ADDR_LEN
static const struct ieee80211_aclator mac
void ieee80211_load_module(const char *modname)
#define IEEE80211_UNLOCK(_ic)
#define ticks_to_msecs(t)
#define IEEE80211_LOCK_ASSERT(_ic)
#define IEEE80211_LOCK(_ic)
void ieee80211_print_essid(const uint8_t *essid, int len)
const char * ieee80211_opmode_name[IEEE80211_OPMODE_MAX]
static __inline const char * ieee80211_mgt_subtype_name(uint8_t subtype)
const struct ieee80211_scanner * ieee80211_scanner_get(enum ieee80211_opmode mode)
#define ROAM_RATE_11B_DEFAULT
#define ROAM_MCS_11N_DEFAULT
#define ROAM_RSSI_11B_DEFAULT
void ieee80211_scan_detach(struct ieee80211com *ic)
int ieee80211_bg_scan(struct ieee80211vap *vap, int flags)
static const struct ieee80211_roamparam defroam[IEEE80211_MODE_MAX]
#define ROAM_RSSI_11A_DEFAULT
void ieee80211_scan_copy_ssid(struct ieee80211vap *vap, struct ieee80211_scan_state *ss, int nssid, const struct ieee80211_scan_ssid ssids[])
void ieee80211_scan_dump_channels(const struct ieee80211_scan_state *ss)
#define ROAM_RSSI_11BONLY_DEFAULT
void ieee80211_scanner_unregister(enum ieee80211_opmode mode, const struct ieee80211_scanner *scan)
#define ROAM_RATE_11A_DEFAULT
void ieee80211_cancel_anyscan(struct ieee80211vap *vap)
#define ROAM_RATE_11BONLY_DEFAULT
void ieee80211_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)
#define ROAM_RATE_QUARTER_DEFAULT
void ieee80211_scan_iterate(struct ieee80211vap *vap, ieee80211_scan_iter_func *f, void *arg)
void ieee80211_scan_assoc_fail(struct ieee80211vap *vap, const uint8_t mac[], int reason)
int ieee80211_start_scan(struct ieee80211vap *vap, int flags, u_int duration, u_int mindwell, u_int maxdwell, u_int nssid, const struct ieee80211_scan_ssid ssids[])
void ieee80211_scanner_unregister_all(const struct ieee80211_scanner *scan)
struct ieee80211_channel * ieee80211_scan_pickchannel(struct ieee80211com *ic, int flags)
void ieee80211_cancel_scan(struct ieee80211vap *vap)
void ieee80211_scan_vdetach(struct ieee80211vap *vap)
#define ROAM_RATE_HALF_DEFAULT
void ieee80211_scan_attach(struct ieee80211com *ic)
static const char * scan_modnames[IEEE80211_OPMODE_MAX]
int ieee80211_check_scan(struct ieee80211vap *vap, int flags, u_int duration, u_int mindwell, u_int maxdwell, u_int nssid, const struct ieee80211_scan_ssid ssids[])
#define ROAM_MCS_11AC_DEFAULT
void ieee80211_scan_done(struct ieee80211vap *vap)
void ieee80211_scan_timeout(struct ieee80211com *ic)
int ieee80211_check_scan_current(struct ieee80211vap *vap)
void ieee80211_scanner_register(enum ieee80211_opmode mode, const struct ieee80211_scanner *scan)
void ieee80211_scan_next(struct ieee80211vap *vap)
void ieee80211_scan_vattach(struct ieee80211vap *vap)
void ieee80211_scan_update_locked(struct ieee80211vap *vap, const struct ieee80211_scanner *scan)
void ieee80211_scan_flush(struct ieee80211vap *vap)
static const struct ieee80211_scanner * scanners[IEEE80211_OPMODE_MAX]
void ieee80211_probe_curchan(struct ieee80211vap *vap, int force)
void ieee80211_scan_assoc_success(struct ieee80211vap *vap, const uint8_t mac[])
#define IEEE80211_SCAN_ONCE
#define IEEE80211_SCAN_PICK1ST
#define IEEE80211_SCAN_NOJOIN
void ieee80211_scan_iter_func(void *, const struct ieee80211_scan_entry *)
#define IEEE80211_SCAN_FOREVER
#define IEEE80211_SCAN_NOPICK
#define IEEE80211_SCAN_ACTIVE
#define IEEE80211_SCAN_FLUSH
void ieee80211_scan_dump_probe_beacon(uint8_t subtype, int isnew, const uint8_t mac[IEEE80211_ADDR_LEN], const struct ieee80211_scanparams *sp, int rssi)
void ieee80211_scan_dump(struct ieee80211_scan_state *ss)
#define IEEE80211_SCAN_MAX_SSID
void ieee80211_swscan_attach(struct ieee80211com *ic)
#define IEEE80211_FEXT_PROBECHAN
#define IEEE80211_BGSCAN_INTVAL_DEFAULT
#define IEEE80211_MSG_SCAN
#define IEEE80211_SCAN_VALID_DEFAULT
#define IEEE80211_NOTE_MAC(_vap, _m, _mac, _fmt,...)
#define IEEE80211_BGSCAN_IDLE_DEFAULT
#define IEEE80211_DPRINTF(_vap, _m, _fmt,...)
struct ieee80211_country_ie::@5 band[1]
void(* sc_cancel_anyscan)(struct ieee80211vap *)
int(* sc_start_scan)(const struct ieee80211_scanner *, struct ieee80211vap *, int, u_int, u_int, u_int, u_int, const struct ieee80211_scan_ssid ssids[])
void(* sc_add_scan)(struct ieee80211vap *, struct ieee80211_channel *, const struct ieee80211_scanparams *, const struct ieee80211_frame *, int, int, int)
void(* sc_vattach)(struct ieee80211vap *)
void(* sc_scan_done)(struct ieee80211vap *)
void(* sc_scan_next)(struct ieee80211vap *)
int(* sc_check_scan)(const struct ieee80211_scanner *, struct ieee80211vap *, int, u_int, u_int, u_int, u_int, const struct ieee80211_scan_ssid ssids[])
void(* sc_attach)(struct ieee80211com *)
void(* sc_detach)(struct ieee80211com *)
void(* sc_scan_probe_curchan)(struct ieee80211vap *, int)
int(* sc_bg_scan)(const struct ieee80211_scanner *, struct ieee80211vap *, int)
void(* sc_cancel_scan)(struct ieee80211vap *)
void(* sc_vdetach)(struct ieee80211vap *)
unsigned long ss_maxdwell
const struct ieee80211_scanner * ss_ops
struct ieee80211com * ss_ic
struct ieee80211_channel * ss_chans[IEEE80211_SCAN_MAX]
struct ieee80211_scan_ssid ss_ssid[IEEE80211_SCAN_MAX_SSID]
struct ieee80211vap * ss_vap
unsigned long ss_mindwell
int(* scan_flush)(struct ieee80211_scan_state *)
int(* scan_detach)(struct ieee80211_scan_state *)
void(* scan_assoc_success)(struct ieee80211_scan_state *, const uint8_t macaddr[IEEE80211_ADDR_LEN])
int(* scan_attach)(struct ieee80211_scan_state *)
void(* scan_assoc_fail)(struct ieee80211_scan_state *, const uint8_t macaddr[IEEE80211_ADDR_LEN], int reason)
void(* scan_age)(struct ieee80211_scan_state *)
void(* scan_iterate)(struct ieee80211_scan_state *, ieee80211_scan_iter_func *, void *)
struct ieee80211_channel *(* scan_pickchan)(struct ieee80211_scan_state *, int)
struct ieee80211_scan_methods * ic_scan_methods
uint8_t ic_modecaps[IEEE80211_MODE_BYTES]
struct ieee80211_scan_state * ic_scan
struct ieee80211_channel * ic_curchan
struct ieee80211com * iv_ic
enum ieee80211_roamingmode iv_roaming
enum ieee80211_opmode iv_opmode
struct ieee80211_roamparam iv_roamparms[IEEE80211_MODE_MAX]
struct ieee80211_scan_ssid iv_des_ssid[1]