42#include <sys/malloc.h>
43#include <sys/kernel.h>
45#include <sys/socket.h>
46#include <sys/sockio.h>
47#include <sys/endian.h>
50#include <sys/sysctl.h>
53#include <net/if_media.h>
54#include <net/if_llc.h>
56#include <net/if_var.h>
57#include <net/ethernet.h>
64#ifdef IEEE80211_SUPPORT_SUPERG
71#define IEEE80211_RATE2MBS(r) (((r) & IEEE80211_RATE_VAL) / 2)
126 "beacon miss, mode %s state %s\n",
159#ifdef IEEE80211_SUPPORT_SUPERG
353 switch (arg & 0xff) {
366 switch (arg & 0xff) {
416#ifdef IEEE80211_DEBUG
417 if (ieee80211_msg_debug(vap)) {
418 ieee80211_note(vap,
"%s with %s ssid ",
420 "associated" :
"synchronized"),
425 printf(
" channel %d start %uMb\n",
469 "%s: unexpected state transition %s -> %s\n", __func__,
483#define QWH4(wh) ((const struct ieee80211_qosframe_addr4 *)wh)
484#define WH4(wh) ((const struct ieee80211_frame_addr4 *)wh)
545 struct ifnet *ifp = vap->
iv_ifp;
548 struct ether_header *eh;
549 int hdrspace, need_tap = 1;
550 uint8_t dir, type, subtype, qos;
552 int is_hw_decrypted = 0;
553 int has_decrypted = 0;
555 KASSERT(ni != NULL, (
"%s: null node, mbuf %p", __func__, m));
571 "too short (1): len %u", m->m_pkthdr.len);
578 ni->
ni_macaddr, NULL,
"wrong version, fc %02x:%02x",
625 bssid, NULL,
"%s",
"not to bss");
647 bssid, NULL,
"not to cur sta: lladdr=%6D, addr1=%6D",
648 IF_LLADDR(ifp),
":", wh->
i_addr1,
":");
669 if (m->m_len < hdrspace &&
670 (m = m_pullup(m, hdrspace)) == NULL) {
673 "data too short: expecting %u", hdrspace);
692 if ((ifp->if_flags & IFF_SIMPLEX) &&
701 wh,
"data",
"%s",
"multicast echo");
715 "3-address data",
"%s",
"DWDS enabled");
723 "%s",
"DWDS not enabled");
727 if ((ifp->if_flags & IFF_SIMPLEX) &&
736 "4-address data",
"%s",
"multicast echo");
742 "data",
"incorrect dir 0x%x", dir);
776 wh,
"WEP",
"%s",
"PRIVACY off");
787 wh->
i_fc[1] &= ~IEEE80211_FC1_PROTECTED;
852 eh = mtod(m,
struct ether_header *);
865 eh->ether_type != htons(ETHERTYPE_PAE)) {
868 "unknown port: ether type 0x%x len %u",
869 eh == NULL ? -1 : eh->ether_type,
881 ((has_decrypted == 0) && (m->m_flags &
M_WEP) == 0) &&
882 (is_hw_decrypted == 0) &&
884 eh->ether_type != htons(ETHERTYPE_PAE))) {
899#ifdef IEEE80211_SUPPORT_SUPERG
913 wh,
"data",
"incorrect dir 0x%x", dir);
924#ifdef IEEE80211_DEBUG
925 if ((ieee80211_msg_debug(vap) &&
doprint(vap, subtype)) ||
927 if_printf(ifp,
"received %s from %s rssi %d\n",
929 ether_sprintf(wh->
i_addr2), rssi);
950 "%s",
"WEP set but not permitted");
959 wh,
"mgt",
"%s",
"WEP set but PRIVACY off");
975 wh->
i_fc[1] &= ~IEEE80211_FC1_PROTECTED;
988 wh, NULL,
"bad frame type 0x%x", type);
993 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1005 int rssi,
int nf, uint16_t seq, uint16_t status)
1023 ni,
"open auth failed (reason %d)", status);
1034 uint8_t *frm, uint8_t *efrm,
int rssi,
int nf,
1035 uint16_t seq, uint16_t status)
1051 "%s",
" PRIVACY is disabled");
1069 if (frm + 1 < efrm) {
1070 if ((frm[1] + 2) > (efrm - frm)) {
1073 "ie %d/%d too long",
1074 frm[0], (frm[1] + 2) - (efrm - frm));
1085 if (challenge == NULL) {
1088 "%s",
"no challenge");
1095 "bad challenge len %d", challenge[1]);
1113 "shared key auth failed (reason %d)", status);
1130 wh,
"shared key auth",
"bad seq %d", seq);
1162 wh,
"WME",
"too short, len %u", len);
1169 ni,
"U-APSD settings from STA: 0x%02x", ni->
ni_uapsd);
1179 u_int len = frm[1], qosinfo_count;
1187 wh,
"WME",
"too short, len %u", len);
1210 "%s: WME: %d: acm=%d aifsn=%d logcwmin=%d logcwmax=%d txopLimit=%d\n",
1244 wh,
"CSA",
"invalid mode %u", csa->
csa_mode);
1269 wh,
"CSA",
"invalid channel %u",
1274#if IEEE80211_CSA_COUNT_MIN > 0
1289 wh,
"CSA",
"count %u too small, must be >= %u",
1314 "CSA ie mismatch, initial ie <%d,%d,%d>, "
1369#ifdef IEEE80211_SUPPORT_SUPERG
1403#define ISREASSOC(_st) ((_st) == IEEE80211_FC0_SUBTYPE_REASSOC_RESP)
1408 int ht_state_change = 0, do_ht = 0;
1409 uint8_t *frm, *efrm;
1410 uint8_t *rates, *xrates, *wme, *htcap, *htinfo;
1411 uint8_t *vhtcap, *vhtopmode;
1416 frm = (uint8_t *)&wh[1];
1417 efrm = mtod(m0, uint8_t *) + m0->m_len;
1474 "erp change: was 0x%x, now 0x%x",
1480 vap->
iv_flags &= ~IEEE80211_F_USEPROT;
1489 "capabilities change: was 0x%x, now 0x%x",
1502 if (scan.
wme != NULL &&
1506 scan.
wme, wh, &qosinfo)) >= 0) {
1514 ni->
ni_flags &= ~IEEE80211_NODE_UAPSD;
1515#ifdef IEEE80211_SUPPORT_SUPERG
1516 if (scan.
ath != NULL)
1536 ht_state_change = 1;
1560 if (scan.
tim != NULL) {
1569 int ix = aid / NBBY;
1571 int max = tim->
tim_len + min - 4;
1583 if (min <= ix && ix <= max &&
1602 if (tim_ucast == 1) {
1626 if (scan.
csa != NULL &&
1656 &scan, wh, subtype, rssi, nf);
1663 ieee80211_set_pwrsave(vap, 0);
1680 if (ht_state_change)
1708 uint16_t algo, seq, status;
1717 algo = le16toh(*(uint16_t *)frm);
1718 seq = le16toh(*(uint16_t *)(frm + 2));
1719 status = le16toh(*(uint16_t *)(frm + 4));
1721 "recv auth frame with algorithm %d seq %d", algo, seq);
1726 wh,
"auth",
"%s",
"TKIP countermeasures enabled");
1742 wh,
"auth",
"unsupported alg %d", algo);
1751 uint16_t capinfo, associd;
1772 capinfo = le16toh(*(uint16_t *)frm);
1774 status = le16toh(*(uint16_t *)frm);
1778 wh->
i_addr2,
"%sassoc failed (reason %d)",
1779 ISREASSOC(subtype) ?
"re" :
"", status);
1783 associd = le16toh(*(uint16_t *)frm);
1786 rates = xrates = wme = htcap = htinfo = NULL;
1787 vhtcap = vhtopmode = NULL;
1788 while (efrm - frm > 1) {
1842 "%sassoc failed (rate set mismatch)",
1859 ni->
ni_flags &= ~IEEE80211_NODE_QOS;
1867 if (htcap != NULL && htinfo != NULL &&
1872 if ((vhtcap != NULL) && (vhtopmode != NULL) &
1879 printf(
"%s: peer %6D: VHT on 2GHz, ignoring\n",
1903#ifdef IEEE80211_SUPPORT_SUPERG
1915 vap->
iv_flags &= ~IEEE80211_F_USEBARKER;
1917 vap->
iv_flags &= ~IEEE80211_F_SHPREAMBLE;
1933 vap->
iv_flags &= ~IEEE80211_F_USEPROT;
1937 "%sassoc success at aid %d: %s preamble, %s slot time%s%s%s%s%s%s%s%s%s",
1945 (ni->
ni_chw == 40 ?
", HT40" :
", HT20") :
"",
1952 ", fast-frames" :
"",
1978 reason = le16toh(*(uint16_t *)frm);
1985 "recv deauthenticate (reason: %d (%s))", reason,
2012 reason = le16toh(*(uint16_t *)frm);
2019 "recv disassociate (reason: %d (%s))", reason,
2030 wh, NULL,
"%s",
"not for us");
2034 wh, NULL,
"wrong state %s",
2049 wh, NULL,
"%s",
"not handled");
2055 wh,
"mgt",
"subtype 0x%x not handled", subtype);
#define IEEE80211_CHAN_ALL
#define IEEE80211_RX_F_DECRYPTED
#define IEEE80211_RATE_MAXSIZE
#define IEEE80211_IS_CHAN_A(_c)
#define IEEE80211_IS_CHAN_DTURBO(_c)
#define IEEE80211_IS_CHAN_2GHZ(_c)
#define IEEE80211_CHAN_ALLTURBO
#define IEEE80211_CHAN_TURBO
#define IEEE80211_IS_CHAN_ANYG(_c)
int ieee80211_chan2ieee(struct ieee80211com *ic, const struct ieee80211_channel *c)
struct ieee80211_channel * ieee80211_find_channel_byieee(struct ieee80211com *ic, int ieee, int flags)
struct ieee80211_channel * ieee80211_lookup_channel_rxstatus(struct ieee80211vap *vap, const struct ieee80211_rx_stats *rxs)
#define IEEE80211_FC0_SUBTYPE_ASSOC_REQ
#define IEEE80211_FC0_SUBTYPE_ACTION
#define IEEE80211_FC0_TYPE_CTL
#define IEEE80211_AUTH_ALG_SHARED
#define WME_PARAM_LOGCWMAX
#define IEEE80211_FC0_TYPE_MASK
#define IEEE80211_FC0_SUBTYPE_ATIM
#define IEEE80211_FC0_SUBTYPE_REASSOC_REQ
#define IEEE80211_CSA_COUNT_MIN
#define IEEE80211_FC0_SUBTYPE_PROBE_REQ
#define IEEE80211_FC1_PROTECTED
#define IEEE80211_CAPINFO_SHORT_SLOTTIME
#define IEEE80211_HAS_SEQ(type, subtype)
#define IEEE80211_FC0_SUBTYPE_ASSOC_RESP
#define IEEE80211_FC0_VERSION_MASK
#define IEEE80211_FC0_SUBTYPE_DEAUTH
#define WME_PARAM_LOGCWMIN
#define IEEE80211_FC1_DIR_DSTODS
#define IEEE80211_FC0_SUBTYPE_BAR
#define IEEE80211_FC0_TYPE_MGT
#define IEEE80211_FC0_SUBTYPE_PROBE_RESP
#define IEEE80211_RATE_BASIC
#define IEEE80211_FC0_TYPE_DATA
#define WME_CAPINFO_IE_OFFSET
#define IEEE80211_IS_MULTICAST(_a)
#define WME_QOSINFO_COUNT
#define IEEE80211_QOS_HAS_SEQ(wh)
@ IEEE80211_AUTH_OPEN_RESPONSE
#define IEEE80211_FC0_SUBTYPE_TIMING_ADV
#define IEEE80211_FC0_SUBTYPE_DISASSOC
#define IEEE80211_CAPINFO_SHORT_PREAMBLE
#define TID_TO_WME_AC(_tid)
#define IEEE80211_FC1_DIR_NODS
#define IEEE80211_FC1_DIR_MASK
#define IEEE80211_FC0_VERSION_0
@ IEEE80211_AUTH_SHARED_CHALLENGE
@ IEEE80211_AUTH_SHARED_PASS
@ IEEE80211_AUTH_SHARED_RESPONSE
#define IEEE80211_FC0_SUBTYPE_NODATA
#define IEEE80211_AUTH_ALG_OPEN
#define IEEE80211_FC0_SUBTYPE_REASSOC_RESP
#define IEEE80211_FC0_SUBTYPE_QOS
#define IEEE80211_FC1_DIR_FROMDS
#define IEEE80211_FC0_SUBTYPE_ACTION_NOACK
#define IEEE80211_FC0_SUBTYPE_QOS_NULL
@ IEEE80211_STATUS_TIMEOUT
@ IEEE80211_REASON_AUTH_LEAVE
@ IEEE80211_REASON_MIC_FAILURE
@ IEEE80211_STATUS_SUCCESS
@ IEEE80211_REASON_ASSOC_NOT_AUTHED
@ IEEE80211_REASON_NOT_AUTHED
@ IEEE80211_REASON_NOT_ASSOCED
@ IEEE80211_REASON_ASSOC_LEAVE
@ IEEE80211_REASON_ASSOC_EXPIRE
#define IEEE80211_QOS_AMSDU
#define WME_CAPINFO_UAPSD_EN
@ IEEE80211_ELEMID_VENDOR
@ IEEE80211_ELEMID_CHALLENGE
@ IEEE80211_ELEMID_VHT_OPMODE
@ IEEE80211_ELEMID_XRATES
@ IEEE80211_ELEMID_HTINFO
@ IEEE80211_ELEMID_VHT_CAP
#define IEEE80211_FC0_SUBTYPE_MASK
#define IEEE80211_FC0_SUBTYPE_BEACON
#define IEEE80211_ERP_USE_PROTECTION
#define IEEE80211_FC0_SUBTYPE_AUTH
#define IEEE80211_CHALLENGE_LEN
int ieee80211_crypto_decap(struct ieee80211_node *ni, struct mbuf *m, int hdrlen, struct ieee80211_key **key)
int ieee80211_crypto_demic(struct ieee80211vap *vap, struct ieee80211_key *k, struct mbuf *m, int force)
void ieee80211_notify_node_join(struct ieee80211_node *ni, int newassoc)
#define ieee80211_time_after(a, b)
#define IEEE80211_UNLOCK(_ic)
#define IEEE80211_LOCK_ASSERT(_ic)
#define IEEE80211_LOCK(_ic)
void ieee80211_recv_bar(struct ieee80211_node *ni, struct mbuf *m0)
int ieee80211_ht_updateparams_final(struct ieee80211_node *ni, const uint8_t *htcapie, const uint8_t *htinfoie)
void ieee80211_ht_node_init(struct ieee80211_node *ni)
int ieee80211_ampdu_reorder(struct ieee80211_node *ni, struct mbuf *m, const struct ieee80211_rx_stats *rxs)
int ieee80211_setup_htrates(struct ieee80211_node *ni, const uint8_t *ie, int flags)
void ieee80211_setup_basic_htrates(struct ieee80211_node *ni, const uint8_t *ie)
struct mbuf * ieee80211_decap_amsdu(struct ieee80211_node *ni, struct mbuf *m)
void ieee80211_ht_updateparams(struct ieee80211_node *ni, const uint8_t *htcapie, const uint8_t *htinfoie)
void ieee80211_reset_bss(struct ieee80211vap *vap)
void ieee80211_node_setuptxparms(struct ieee80211_node *ni)
void ieee80211_node_authorize(struct ieee80211_node *ni)
void ieee80211_sta_leave(struct ieee80211_node *ni)
void ieee80211_update_chw(struct ieee80211com *ic)
void ieee80211_sync_curchan(struct ieee80211com *ic)
#define IEEE80211_RSSI_LPF(x, y)
#define IEEE80211_NODE_TURBOP
static __inline int ieee80211_node_is_authorized(const struct ieee80211_node *ni)
#define IEEE80211_NODE_FF
#define IEEE80211_NODE_MIMO_RTS
#define IEEE80211_NODE_AMSDU
#define IEEE80211_NODE_QOS
#define IEEE80211_NODE_STAT(ni, stat)
#define IEEE80211_NODE_AID(ni)
#define IEEE80211_NODE_MIMO_PS
#define IEEE80211_NODE_RIFS
#define IEEE80211_NODE_UAPSD
#define IEEE80211_NODE_AMPDU
#define IEEE80211_NODE_HT
int ieee80211_send_probereq(struct ieee80211_node *ni, const uint8_t sa[IEEE80211_ADDR_LEN], const uint8_t da[IEEE80211_ADDR_LEN], const uint8_t bssid[IEEE80211_ADDR_LEN], const uint8_t *ssid, size_t ssidlen)
void ieee80211_sta_tim_notify(struct ieee80211vap *vap, int set)
void ieee80211_sta_ps_timer_check(struct ieee80211vap *vap)
const char * ieee80211_reason_to_string(uint16_t reason)
void ieee80211_swbmiss(void *arg)
void ieee80211_csa_startswitch(struct ieee80211com *ic, struct ieee80211_channel *c, int mode, int count)
void ieee80211_vap_update_preamble(struct ieee80211vap *vap)
void ieee80211_print_essid(const uint8_t *essid, int len)
int ieee80211_new_state(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
const char * ieee80211_state_name[IEEE80211_S_MAX]
void ieee80211_csa_cancelswitch(struct ieee80211com *ic)
void ieee80211_wme_updateparams(struct ieee80211vap *vap)
void ieee80211_csa_completeswitch(struct ieee80211com *ic)
void ieee80211_vap_update_erp_protmode(struct ieee80211vap *vap)
void ieee80211_vap_set_shortslottime(struct ieee80211vap *vap, int onoff)
const char * ieee80211_opmode_name[IEEE80211_OPMODE_MAX]
void ieee80211_dturbo_switch(struct ieee80211vap *, int newflags)
#define IEEE80211_F_DODEL
#define IEEE80211_F_DONEGO
#define IEEE80211_F_DOBRS
#define IEEE80211_F_DOSORT
static __inline uint8_t ieee80211_gettid(const struct ieee80211_frame *wh)
static __inline uint8_t * ieee80211_getqos(void *data)
static __inline const char * ieee80211_mgt_subtype_name(uint8_t subtype)
#define IEEE80211_SEND_MGMT(_ni, _type, _arg)
static __inline int ieee80211_anyhdrsize(const void *data)
#define IEEE80211_F_DOFRATE
void ieee80211_radiotap_rx(struct ieee80211vap *vap0, struct mbuf *m)
static __inline void ieee80211_ratectl_node_init(struct ieee80211_node *ni)
int ieee80211_bg_scan(struct ieee80211vap *vap, int flags)
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)
void ieee80211_scan_assoc_fail(struct ieee80211vap *vap, const uint8_t mac[], int reason)
void ieee80211_cancel_scan(struct ieee80211vap *vap)
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[])
int ieee80211_check_scan_current(struct ieee80211vap *vap)
void ieee80211_probe_curchan(struct ieee80211vap *vap, int force)
void ieee80211_scan_assoc_success(struct ieee80211vap *vap, const uint8_t mac[])
@ IEEE80211_SCAN_FAIL_STATUS
void ieee80211_sta_detach(struct ieee80211com *ic)
static void sta_recv_mgmt(struct ieee80211_node *, struct mbuf *, int subtype, const struct ieee80211_rx_stats *, int rssi, int nf)
static void sta_auth_shared(struct ieee80211_node *ni, struct ieee80211_frame *wh, uint8_t *frm, uint8_t *efrm, int rssi, int nf, uint16_t seq, uint16_t status)
void ieee80211_sta_attach(struct ieee80211com *ic)
static void sta_authretry(struct ieee80211vap *vap, struct ieee80211_node *ni, int reason)
static __inline int isfromds_mcastecho(struct ieee80211vap *vap, const struct ieee80211_frame *wh)
static __inline int isdstods_mcastecho(struct ieee80211vap *vap, const struct ieee80211_frame *wh)
static int sta_input(struct ieee80211_node *, struct mbuf *, const struct ieee80211_rx_stats *, int, int)
int ieee80211_parse_wmeie(uint8_t *frm, const struct ieee80211_frame *wh, struct ieee80211_node *ni)
static void sta_beacon_miss(struct ieee80211vap *)
static __inline int doprint(struct ieee80211vap *vap, int subtype)
static __inline int startbgscan(struct ieee80211vap *vap)
static void sta_vattach(struct ieee80211vap *)
#define IEEE80211_RATE2MBS(r)
static int sta_newstate(struct ieee80211vap *, enum ieee80211_state, int)
int ieee80211_parse_wmeparams(struct ieee80211vap *vap, uint8_t *frm, const struct ieee80211_frame *wh, uint8_t *qosinfo)
static void ieee80211_parse_csaparams(struct ieee80211vap *vap, uint8_t *frm, const struct ieee80211_frame *wh)
static void sta_recv_ctl(struct ieee80211_node *, struct mbuf *, int subtype)
static void sta_swbmiss_start(struct ieee80211vap *vap)
static __inline int contbgscan(struct ieee80211vap *vap)
static void sta_vdetach(struct ieee80211vap *vap)
static void sta_auth_open(struct ieee80211_node *ni, struct ieee80211_frame *wh, int rssi, int nf, uint16_t seq, uint16_t status)
void ieee80211_ff_node_init(struct ieee80211_node *)
int ieee80211_parse_athparams(struct ieee80211_node *, uint8_t *, const struct ieee80211_frame *)
static __inline struct mbuf * ieee80211_decap_fastframe(struct ieee80211vap *vap, struct ieee80211_node *ni, struct mbuf *m)
#define IEEE80211_MSG_AUTH
static __inline int ieee80211_radiotap_active_vap(const struct ieee80211vap *vap)
#define IEEE80211_MSG_STATE
#define IEEE80211_DISCARD_IE(_vap, _m, _wh, _type, _fmt,...)
#define IEEE80211_FEXT_PROBECHAN
static __inline int ieee80211_hdrspace(struct ieee80211com *ic, const void *data)
#define IEEE80211_NOTE_FRAME(_vap, _m, _wh, _fmt,...)
#define IEEE80211_FEXT_BGSCAN
#define _IEEE80211_MASKSHIFT(_v, _f)
#define IEEE80211_MSG_CRYPTO
#define IEEE80211_MSG_ANY
#define IEEE80211_F_COUNTERM
#define IEEE80211_F_USEBARKER
#define IEEE80211_F_SHPREAMBLE
#define IEEE80211_MSG_ELEMID
#define IEEE80211_TU_TO_TICKS(x)
#define IEEE80211_NOTE_MAC(_vap, _m, _mac, _fmt,...)
#define IEEE80211_F_CSAPENDING
#define IEEE80211_FEXT_SWBMISS
#define IEEE80211_ADDR_EQ(a1, a2)
#define IEEE80211_MSG_DOTH
#define IEEE80211_F_PRIVACY
#define IEEE80211_MSG_DEBUG
#define IEEE80211_NOTE(_vap, _m, _ni, _fmt,...)
#define IEEE80211_FVHT_VHT
#define IEEE80211_MSG_POWER
#define IEEE80211_DISCARD_MAC(_vap, _m, _mac, _type, _fmt,...)
#define IEEE80211_FHT_HTCOMPAT
#define IEEE80211_MSG_WME
#define IEEE80211_F_USEPROT
#define IEEE80211_DPRINTF(_vap, _m, _fmt,...)
#define IEEE80211_FEXT_SCAN_OFFLOAD
#define IEEE80211_ATH_CAP(vap, ni, bit)
#define IEEE80211_MSG_INPUT
#define IEEE80211_F_SHSLOT
#define IEEE80211_DISCARD(_vap, _m, _wh, _type, _fmt,...)
#define ieee80211_msg_dumppkts(_vap)
#define IEEE80211_F_BGSCAN
#define IEEE80211_FEXT_SCANREQ
#define IEEE80211_MSG_ASSOC
#define IEEE80211_F_DROPUNENC
void ieee80211_vht_node_init(struct ieee80211_node *ni)
void ieee80211_setup_vht_rates(struct ieee80211_node *ni, const uint8_t *vhtcap_ie, const uint8_t *vhtop_ie)
int ieee80211_vht_updateparams(struct ieee80211_node *ni, const uint8_t *vhtcap_ie, const uint8_t *vhtop_ie)
struct wmeParams cap_wmeParams[WME_NUM_AC]
void(* ia_detach)(struct ieee80211vap *)
uint8_t i_addr1[IEEE80211_ADDR_LEN]
uint8_t i_addr2[IEEE80211_ADDR_LEN]
uint8_t i_addr3[IEEE80211_ADDR_LEN]
struct ieee80211com * ni_ic
struct ieee80211_quiet_ie ni_quiet_ie
uint8_t ni_macaddr[IEEE80211_ADDR_LEN]
uint8_t ni_bssid[IEEE80211_ADDR_LEN]
struct ieee80211vap * ni_vap
union ieee80211_node::@24 ni_tstamp
struct ieee80211_channel * ni_chan
uint8_t ni_essid[IEEE80211_NWID_LEN]
uint32_t is_rx_badversion
uint32_t is_rx_auth_unsupported
uint32_t is_rx_badsubtype
uint32_t is_rx_mgtdiscard
uint32_t is_rx_auth_countermeasures
uint8_t is_rx_disassoc_code
uint32_t is_rx_assoc_norate
uint8_t is_rx_deauth_code
uint8_t is_rx_authfail_code
uint32_t is_rx_unencrypted
struct chanAccParams wme_wmeChanParams
struct ieee80211_channel * ic_bsschan
struct ieee80211_channel * ic_csa_newchan
ieee80211vap_attach ic_vattach[IEEE80211_OPMODE_MAX]
int(* ic_set_quiet)(struct ieee80211_node *, u_int8_t *quiet_elm)
struct ieee80211_wme_state ic_wme
int(* ic_recv_action)(struct ieee80211_node *, const struct ieee80211_frame *, const uint8_t *frm, const uint8_t *efrm)
struct ieee80211_channel * ic_curchan
void(* ic_newassoc)(struct ieee80211_node *, int)
struct ieee80211com * iv_ic
struct ieee80211_node * iv_bss
uint8_t iv_bmissthreshold
enum ieee80211_roamingmode iv_roaming
enum ieee80211_opmode iv_opmode
uint16_t iv_swbmiss_count
uint8_t iv_myaddr[IEEE80211_ADDR_LEN]
struct ieee80211_stats iv_stats
void(* iv_recv_mgmt)(struct ieee80211_node *, struct mbuf *, int, const struct ieee80211_rx_stats *, int, int)
u_int iv_scanreq_mindwell
const struct ieee80211_authenticator * iv_auth
enum ieee80211_state iv_state
u_int iv_scanreq_maxdwell
void(* iv_opdetach)(struct ieee80211vap *)
uint16_t iv_scanreq_flags
void(* iv_bmiss)(struct ieee80211vap *)
struct callout iv_swbmiss
void(* iv_recv_ctl)(struct ieee80211_node *, struct mbuf *, int)
int(* iv_input)(struct ieee80211_node *, struct mbuf *, const struct ieee80211_rx_stats *, int, int)
struct ieee80211_scan_ssid iv_scanreq_ssid[IEEE80211_SCAN_MAX_SSID]
void(* iv_sta_ps)(struct ieee80211vap *, int)
struct callout iv_mgtsend
uint16_t iv_swbmiss_period
u_int iv_scanreq_duration
int(* iv_newstate)(struct ieee80211vap *, enum ieee80211_state, int)