42#include <sys/kernel.h>
43#include <sys/malloc.h>
45#include <sys/socket.h>
46#include <sys/sockio.h>
49#include <net/if_var.h>
50#include <net/if_media.h>
51#include <net/ethernet.h>
58#ifdef IEEE80211_SUPPORT_MESH
65#define AGGRESSIVE_MODE_SWITCH_HYSTERESIS 3
66#define HIGH_PRI_SWITCH_THRESH 10
69 "assoc_req",
"assoc_resp",
"reassoc_req",
"reassoc_resp",
70 "probe_req",
"probe_resp",
"timing_adv",
"reserved#7",
71 "beacon",
"atim",
"disassoc",
"auth",
72 "deauth",
"action",
"action_noack",
"reserved#15"
75 "reserved#0",
"reserved#1",
"reserved#2",
"reserved#3",
76 "reserved#4",
"reserved#5",
"reserved#6",
"control_wrap",
77 "bar",
"ba",
"ps_poll",
"rts",
78 "cts",
"ack",
"cf_end",
"cf_end_ack"
116 return (
"unspecified");
118 return (
"previous authentication is expired");
120 return (
"sending STA is leaving/has left IBSS or ESS");
122 return (
"disassociated due to inactivity");
124 return (
"too many associated STAs");
126 return (
"class 2 frame received from nonauthenticated STA");
128 return (
"class 3 frame received from nonassociated STA");
130 return (
"sending STA is leaving/has left BSS");
132 return (
"STA requesting (re)association is not authenticated");
134 return (
"information in the Power Capability element is "
137 return (
"information in the Supported Channels element is "
140 return (
"invalid element");
142 return (
"MIC failure");
144 return (
"4-Way handshake timeout");
146 return (
"group key update timeout");
148 return (
"element in 4-Way handshake different from "
149 "(re)association request/probe response/beacon frame");
151 return (
"invalid group cipher");
153 return (
"invalid pairwise cipher");
155 return (
"invalid AKMP");
157 return (
"unsupported version in RSN IE");
159 return (
"invalid capabilities in RSN IE");
161 return (
"IEEE 802.1X authentication failed");
163 return (
"cipher suite rejected because of the security "
166 return (
"unspecified (QoS-related)");
168 return (
"QoS AP lacks sufficient bandwidth for this QoS STA");
170 return (
"too many frames need to be acknowledged");
172 return (
"STA is transmitting outside the limits of its TXOPs");
174 return (
"requested from peer STA (the STA is "
175 "resetting/leaving the BSS)");
177 return (
"requested from peer STA (it does not want to use "
180 return (
"requested from peer STA (setup is required for the "
183 return (
"requested from peer STA (timeout)");
185 return (
"SME cancels the mesh peering instance (not related "
186 "to the maximum number of peer mesh STAs)");
188 return (
"maximum number of peer mesh STAs was reached");
190 return (
"the received information violates the Mesh "
191 "Configuration policy configured in the mesh STA "
194 return (
"the mesh STA has received a Mesh Peering Close "
195 "message requesting to close the mesh peering");
197 return (
"the mesh STA has resent dot11MeshMaxRetries Mesh "
198 "Peering Open messages, without receiving a Mesh "
199 "Peering Confirm message");
201 return (
"the confirmTimer for the mesh peering instance times "
204 return (
"the mesh STA fails to unwrap the GTK or the values "
205 "in the wrapped contents do not match");
207 return (
"the mesh STA receives inconsistent information about "
208 "the mesh parameters between Mesh Peering Management "
211 return (
"the mesh STA fails the authenticated mesh peering "
212 "exchange because due to failure in selecting "
213 "pairwise/group ciphersuite");
215 return (
"the mesh STA does not have proxy information for "
216 "this external destination");
218 return (
"the mesh STA does not have forwarding information "
219 "for this destination");
221 return (
"the mesh STA determines that the link to the next "
222 "hop of an active path in its forwarding information "
223 "is no longer usable");
225 return (
"the MAC address of the STA already exists in the "
228 return (
"the mesh STA performs channel switch to meet "
229 "regulatory requirements");
231 return (
"the mesh STA performs channel switch with "
232 "unspecified reason");
234 return (
"reserved/unknown");
258 ic_printf(ni->
ni_ic,
"missing ic_raw_xmit callback, drop frame\n");
274 if (ALIGN(hdrlen) > max_linkhdr) {
276 max_linkhdr = ALIGN(hdrlen);
277 max_hdr = max_linkhdr + max_protohdr;
278 max_datalen = MHLEN - max_hdr;
301#ifdef IEEE80211_SUPPORT_MESH
311#ifdef IEEE80211_SUPPORT_MESH
329 struct ifnet *ifp = vap->
iv_ifp;
405#define FREEAPPIE(ie) do { \
407 IEEE80211_FREE(ie, M_80211_NODE_IE); \
440#define IEEE80211_AUTH_MAX (IEEE80211_AUTH_WPA+1)
456 .ia_node_join = NULL,
457 .ia_node_leave = NULL,
509 printf(
"wlan: %s acl policy registered\n", iac->
iac_name);
518 printf(
"wlan: %s acl policy unregistered\n", iac->
iac_name);
526 return acl != NULL && strcmp(
acl->iac_name, name) == 0 ?
acl : NULL;
538 for (i = 0, p = essid; i < len; i++, p++) {
539 if (*p < ' ' || *p > 0x7e)
544 for (i = 0, p = essid; i < len; i++, p++)
549 for (i = 0, p = essid; i < len; i++, p++)
556 const uint8_t *buf,
int len,
int rate,
int rssi)
564 printf(
"NODS %s", ether_sprintf(wh->
i_addr2));
565 printf(
"->%s", ether_sprintf(wh->
i_addr1));
566 printf(
"(%s)", ether_sprintf(wh->
i_addr3));
569 printf(
"TODS %s", ether_sprintf(wh->
i_addr2));
570 printf(
"->%s", ether_sprintf(wh->
i_addr3));
571 printf(
"(%s)", ether_sprintf(wh->
i_addr1));
574 printf(
"FRDS %s", ether_sprintf(wh->
i_addr3));
575 printf(
"->%s", ether_sprintf(wh->
i_addr1));
576 printf(
"(%s)", ether_sprintf(wh->
i_addr2));
579 printf(
"DSDS %s", ether_sprintf((
const uint8_t *)&wh[1]));
580 printf(
"->%s", ether_sprintf(wh->i_addr3));
581 printf(
"(%s", ether_sprintf(wh->i_addr2));
582 printf(
"->%s)", ether_sprintf(wh->i_addr1));
606 printf(
" WEP [IV %.02x %.02x %.02x",
607 buf[off+0], buf[off+1], buf[off+2]);
609 printf(
" %.02x %.02x %.02x",
610 buf[off+4], buf[off+5], buf[off+6]);
614 printf(
" %dM", rate / 2);
616 printf(
" +%d", rssi);
619 for (i = 0; i < len; i++) {
622 printf(
"%02x", buf[i]);
645 int i, j, rix, error;
646 int okrate, badrate, fixedrate, ucastrate;
651 okrate = badrate = 0;
666 if (ucastrate & 0x80) {
668 flags &= ~IEEE80211_F_DOFRATE;
669 }
else if ((ucastrate & 0x80) == 0) {
671 flags &= ~IEEE80211_F_DOFMCS;
695 for (j = i + 1; j < nrs->
rs_nrates; j++) {
748 if (okrate == 0 || error != 0 ||
750 fixedrate != ucastrate)) {
752 "%s: flags 0x%x okrate %d error %d fixedrate 0x%x "
753 "ucastrate %x\n", __func__, fixedrate, ucastrate, flags);
775 vap->
iv_flags &= ~IEEE80211_F_USEPROT;
782 vap->
iv_flags &= ~IEEE80211_F_USEBARKER;
784 vap->
iv_flags &= ~IEEE80211_F_SHPREAMBLE;
811 ic->
ic_flags &= ~IEEE80211_F_USEPROT;
818 ic->
ic_flags &= ~IEEE80211_F_USEBARKER;
820 ic->
ic_flags &= ~IEEE80211_F_SHPREAMBLE;
851 int num_shslot = 0, num_lgslot = 0;
874 TAILQ_FOREACH(iv, &ic->ic_vaps, iv_next) {
888 ic->
ic_flags &= ~IEEE80211_F_SHSLOT;
889 else if (num_lgslot == 0)
924 int enable_protmode = 0;
925 int non_erp_present = 0;
936 TAILQ_FOREACH(iv, &ic->ic_vaps, iv_next) {
946 ic->
ic_flags &= ~IEEE80211_F_USEPROT;
959 "%s: called; enable_protmode=%d, non_erp_present=%d\n",
960 __func__, enable_protmode, non_erp_present);
990 int barker_count = 0, short_preamble_count = 0, count = 0;
1001 TAILQ_FOREACH(iv, &ic->ic_vaps, iv_next) {
1005 short_preamble_count++;
1014 "%s: called; barker_count=%d, short_preamble_count=%d\n",
1015 __func__, barker_count, short_preamble_count);
1021 if (barker_count == 0 && short_preamble_count == count) {
1023 ic->
ic_flags &= ~IEEE80211_F_USEBARKER;
1025 ic->
ic_flags &= ~IEEE80211_F_SHPREAMBLE;
1029 "%s: global barker=%d preamble=%d\n",
1056 int num_vaps = 0, num_pure = 0, num_mixed = 0;
1057 int num_optional = 0, num_ht2040 = 0, num_nonht = 0;
1058 int num_ht_sta = 0, num_ht40_sta = 0, num_sta = 0;
1059 int num_nonhtpr = 0;
1079 TAILQ_FOREACH(iv, &ic->ic_vaps, iv_next) {
1103 "%s: vap %s: nonht_pr=%d, curhtprotmode=0x%02x\n",
1141 if (num_pure == num_vaps)
1144 if (num_optional == num_vaps)
1151 if ((num_ht2040 > 0) ||
1152 ((num_ht_sta > 0) && (num_ht40_sta > 0) &&
1153 (num_ht_sta != num_ht40_sta)))
1160 if (num_ht_sta != num_sta)
1167 if (num_nonhtpr > 0)
1171 TAILQ_FOREACH(iv, &ic->ic_vaps, iv_next)
1177 "%s: global: nonht_pr=%d ht_opmode=0x%02x\n",
1205 vap->
iv_flags &= ~IEEE80211_F_SHSLOT;
1208 "%s: called; onoff=%d\n", __func__, onoff);
1230 "%s: called\n", __func__);
1247 "%s: called\n", __func__);
1264 "%s: called\n", __func__);
1276 static const int rates[] = { 2, 4, 11, 22, 12, 24, 48 };
1281 for (i = 0; i < nitems(rates); i++) {
1329 for (j = 0; j < basic[mode].
rs_nrates; j++)
1499 "set %s (%s) [acm %u aifsn %u logcwmin %u logcwmax %u txop %u]\n",
1510 const paramType *pPhyParam, *pBssPhyParam;
1572 if (vap->
iv_bss != NULL) {
1624 int do_aggrmode = 0;
1707 aggrParam[mode].txopLimit : 0;
1709 "update %s (chan+bss) [acm %u aifsn %u logcwmin %u "
1744 "update %s (chan+bss) logcwmin %u\n",
1752 "%s: WME params updated, cap_info 0x%x\n", __func__,
1918 taskqueue_block(ic->
ic_tq);
1925 taskqueue_unblock(ic->
ic_tq);
1971 struct ifnet *ifp = vap->
iv_ifp;
1978 "start running, %d vaps running\n", ic->
ic_nrunning);
1980 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
1989 ifp->if_drv_flags |= IFF_DRV_RUNNING;
2003 "%s: up parent %s\n", __func__, ic->
ic_name);
2075 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
2076 struct ifnet *ifp = vap->
iv_ifp;
2094 struct ifnet *ifp = vap->
iv_ifp;
2099 "stop running, %d vaps running\n", ic->
ic_nrunning);
2102 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
2103 ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
2108 "down parent %s\n", ic->
ic_name);
2133 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
2134 struct ifnet *ifp = vap->
iv_ifp;
2153 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
2154 struct ifnet *ifp = vap->
iv_ifp;
2174 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
2175 struct ifnet *ifp = vap->
iv_ifp;
2216 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
2258 (
"wrong state %d", vap->
iv_state));
2305 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
2328 ic->
ic_flags &= ~IEEE80211_F_CSAPENDING;
2330 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
2356 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
2392 (
"wrong state %d", vap0->
iv_state));
2395 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
2420 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
2451 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
2489 "%s: %s -> %s arg %d\n", __func__,
2515 "%s: %s -> %s arg %d\n", __func__,
2523 KASSERT(rc != EINPROGRESS, (
"iv_newstate was deferred"));
2525 (
"INIT state change failed"));
2527 "%s: %s returned error %d\n", __func__,
2533 if (ostate == nstate)
2545 vap->
iv_ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
2604 int nrunning, nscanning;
2620 "%s: %s -> %s (%s) transition discarded\n",
2630 "%s: pending %s -> %s transition lost\n", __func__,
2636 "%s: pending %s -> %s transition lost\n",
2643 nrunning = nscanning = 0;
2645 TAILQ_FOREACH(vp, &ic->ic_vaps, iv_next) {
2657 "%s: %s -> %s (arg %d) (nrunning %d nscanning %d)\n", __func__,
2659 nrunning, nscanning);
2666 KASSERT(!(nscanning && nrunning),
2667 (
"%d scanning and %d running", nscanning, nrunning));
2674 "%s: defer %s -> %s\n",
2691#ifdef IEEE80211_DEBUG
2695 "%s: override, now %s -> %s\n",
2714 "%s: defer %s -> %s (legacy WDS)\n", __func__,
2732 "%s: override %s -> %s (DFS)\n", __func__,
@ IEEE80211_MODE_STURBO_A
@ IEEE80211_MODE_VHT_2GHZ
@ IEEE80211_MODE_VHT_5GHZ
#define IEEE80211_C_SHSLOT
#define IEEE80211_IS_CHAN_HT(_c)
#define IEEE80211_IS_CHAN_NOADHOC(_c)
#define IEEE80211_IS_CHAN_DFS(_c)
#define IEEE80211_IS_CHAN_CACDONE(_c)
#define IEEE80211_IS_CHAN_A(_c)
#define IEEE80211_OPMODE_MAX
@ IEEE80211_ROAMING_MANUAL
#define IEEE80211_CHAN_ANYC
#define IEEE80211_C_SHPREAMBLE
#define IEEE80211_MODE_MAX
#define IEEE80211_IS_CHAN_ANYG(_c)
#define IEEE80211_IS_CHAN_NOHOSTAP(_c)
#define IEEE80211_RATE_MCS
int ic_printf(struct ieee80211com *ic, const char *fmt,...)
const struct ieee80211_rateset * ieee80211_get_suprates(struct ieee80211com *ic, const struct ieee80211_channel *c)
enum ieee80211_phymode ieee80211_chan2mode(const struct ieee80211_channel *chan)
const struct ieee80211_htrateset * ieee80211_get_suphtrates(struct ieee80211com *ic, const struct ieee80211_channel *c)
#define IEEE80211_FC0_TYPE_MASK
#define IEEE80211_WEP_KIDLEN
#define IEEE80211_WEP_IVLEN
#define IEEE80211_HTINFO_OPMODE_MIXED
#define IEEE80211_FC1_PROTECTED
#define IEEE80211_FC1_DIR_DSTODS
#define IEEE80211_RATE_VAL
#define IEEE80211_FC0_TYPE_MGT
#define IEEE80211_RATE_BASIC
#define IEEE80211_FC0_TYPE_DATA
#define IEEE80211_HTINFO_NONHT_PRESENT
#define WME_QOSINFO_COUNT
#define IEEE80211_QOS_HAS_SEQ(wh)
#define IEEE80211_FC1_DIR_NODS
#define IEEE80211_FC1_DIR_MASK
#define IEEE80211_HTINFO_OPMODE_PURE
#define IEEE80211_FC1_DIR_FROMDS
#define IEEE80211_FC1_DIR_TODS
#define IEEE80211_NWID_LEN
@ IEEE80211_REASON_MESH_MAX_PEERS
@ IEEE80211_REASON_MESH_INVALID_GTK
@ IEEE80211_REASON_AUTH_LEAVE
@ IEEE80211_REASON_TIMEOUT
@ IEEE80211_REASON_AKMP_INVALID
@ IEEE80211_REASON_IE_INVALID
@ IEEE80211_REASON_DISASSOC_PWRCAP_BAD
@ IEEE80211_REASON_MESH_CHAN_SWITCH_UNSPEC
@ IEEE80211_REASON_MIC_FAILURE
@ IEEE80211_REASON_GROUP_KEY_UPDATE_TIMEOUT
@ IEEE80211_REASON_4WAY_HANDSHAKE_TIMEOUT
@ IEEE80211_REASON_MESH_PERR_NO_PROXY
@ IEEE80211_REASON_MESH_INCONS_PARAMS
@ IEEE80211_REASON_IE_IN_4WAY_DIFFERS
@ IEEE80211_REASON_UNSPECIFIED_QOS
@ IEEE80211_REASON_OUTSIDE_TXOP
@ IEEE80211_REASON_LEAVING_QBSS
@ IEEE80211_REASON_INSUFFICIENT_BW
@ IEEE80211_REASON_UNSUPP_RSN_IE_VERSION
@ IEEE80211_REASON_MESH_CPVIOLATION
@ IEEE80211_REASON_MESH_CONFIRM_TIMEOUT
@ IEEE80211_REASON_MESH_PERR_NO_FI
@ IEEE80211_REASON_SETUP_NEEDED
@ IEEE80211_REASON_BAD_MECHANISM
@ IEEE80211_REASON_ASSOC_NOT_AUTHED
@ IEEE80211_REASON_NOT_AUTHED
@ IEEE80211_REASON_802_1X_AUTH_FAILED
@ IEEE80211_REASON_MESH_INVALID_SECURITY
@ IEEE80211_REASON_MESH_MAX_RETRIES
@ IEEE80211_REASON_MESH_CLOSE_RCVD
@ IEEE80211_REASON_ASSOC_TOOMANY
@ IEEE80211_REASON_MESH_CHAN_SWITCH_REG
@ IEEE80211_REASON_NOT_ASSOCED
@ IEEE80211_REASON_GROUP_CIPHER_INVALID
@ IEEE80211_REASON_MESH_PERR_DEST_UNREACH
@ IEEE80211_REASON_MESH_MAC_ALRDY_EXISTS_MBSS
@ IEEE80211_REASON_TOOMANY_FRAMES
@ IEEE80211_REASON_UNSPECIFIED
@ IEEE80211_REASON_AUTH_EXPIRE
@ IEEE80211_REASON_PAIRWISE_CIPHER_INVALID
@ IEEE80211_REASON_DISASSOC_SUPCHAN_BAD
@ IEEE80211_REASON_ASSOC_LEAVE
@ IEEE80211_REASON_PEER_LINK_CANCELED
@ IEEE80211_REASON_INVALID_RSN_IE_CAP
@ IEEE80211_REASON_ASSOC_EXPIRE
@ IEEE80211_REASON_CIPHER_SUITE_REJECTED
#define IEEE80211_WEP_EXTIVLEN
#define IEEE80211_HTINFO_OPMODE
#define IEEE80211_HTINFO_OPMODE_HT20PR
#define IEEE80211_QOS_TID
#define IEEE80211_QOS_ACKPOLICY
#define IEEE80211_HTINFO_OPMODE_PROTOPT
#define IEEE80211_WEP_EXTIV
void ieee80211_adhoc_attach(struct ieee80211com *ic)
void ieee80211_adhoc_detach(struct ieee80211com *ic)
void ieee80211_notify_csa(struct ieee80211com *ic, const struct ieee80211_channel *c, int mode, int count)
void ieee80211_notify_ifnet_change(struct ieee80211vap *vap)
const char * ieee80211_get_vap_ifname(struct ieee80211vap *vap)
void ieee80211_load_module(const char *modname)
#define IFNET_IS_UP_RUNNING(_ifp)
#define IEEE80211_UNLOCK(_ic)
#define IEEE80211_LOCK_ASSERT(_ic)
#define IEEE80211_LOCK(_ic)
#define IEEE80211_LOCK_OBJ(_ic)
void ieee80211_hostap_attach(struct ieee80211com *ic)
void ieee80211_hostap_detach(struct ieee80211com *ic)
void ieee80211_htinfo_notify(struct ieee80211vap *vap)
void ieee80211_mesh_detach(struct ieee80211com *ic)
void ieee80211_mesh_attach(struct ieee80211com *ic)
void ieee80211_monitor_detach(struct ieee80211com *ic)
void ieee80211_monitor_attach(struct ieee80211com *ic)
void ieee80211_setcurchan(struct ieee80211com *ic, struct ieee80211_channel *c)
void ieee80211_notify_erp_locked(struct ieee80211com *ic)
#define IEEE80211_NODE_QOS
int ieee80211_send_mgmt(struct ieee80211_node *ni, int type, int arg)
static const struct phyParamType phyParamForAC_BK[IEEE80211_MODE_MAX]
void ieee80211_proto_vattach(struct ieee80211vap *vap)
static void setbasicrates(struct ieee80211_rateset *rs, enum ieee80211_phymode mode, int add)
const struct ieee80211_authenticator * ieee80211_authenticator_get(int auth)
void ieee80211_restart_all(struct ieee80211com *ic)
static void ieee80211_start_reset_chan(struct ieee80211vap *vap)
void ieee80211_stop_locked(struct ieee80211vap *vap)
static const struct phyParamType phyParamForAC_VO[IEEE80211_MODE_MAX]
void ieee80211_addbasicrates(struct ieee80211_rateset *rs, enum ieee80211_phymode mode)
const char * ieee80211_wme_acnames[]
void ieee80211_start_locked(struct ieee80211vap *vap)
const char * ieee80211_reason_to_string(uint16_t reason)
void ieee80211_swbmiss(void *arg)
static const struct phyParamType bssPhyParamForAC_VI[IEEE80211_MODE_MAX]
static void ieee80211_wme_initparams_locked(struct ieee80211vap *vap)
static void vap_update_ht_protmode(void *, int)
#define HIGH_PRI_SWITCH_THRESH
void ieee80211_csa_startswitch(struct ieee80211com *ic, struct ieee80211_channel *c, int mode, int count)
void ieee80211_vap_update_ht_protmode(struct ieee80211vap *vap)
static void restart_vaps(void *, int)
static const struct ieee80211_authenticator auth_internal
void ieee80211_setbasicrates(struct ieee80211_rateset *rs, enum ieee80211_phymode mode)
int ieee80211_wme_vap_ac_is_noack(struct ieee80211vap *vap, int ac)
static const struct phyParamType bssPhyParamForAC_BE[IEEE80211_MODE_MAX]
static const char * auth_modnames[IEEE80211_AUTH_MAX]
void ieee80211_suspend_all(struct ieee80211com *ic)
void ieee80211_proto_vdetach(struct ieee80211vap *vap)
static void vap_update_preamble(void *, int)
static const struct phyParamType phyParamForAC_VI[IEEE80211_MODE_MAX]
static void update_mcast(void *, int)
const char * mgt_subtype_name[]
static const struct ieee80211_aclator * acl
static const struct phyParamType phyParamForAC_BE[IEEE80211_MODE_MAX]
void ieee80211_aclator_register(const struct ieee80211_aclator *iac)
void ieee80211_vap_update_preamble(struct ieee80211vap *vap)
void ieee80211_print_essid(const uint8_t *essid, int len)
int ieee80211_iserp_rateset(const struct ieee80211_rateset *rs)
int ieee80211_new_state(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
const char * ieee80211_state_name[IEEE80211_S_MAX]
void ieee80211_authenticator_unregister(int type)
void ieee80211_csa_cancelswitch(struct ieee80211com *ic)
static void setwmeparams(struct ieee80211vap *vap, const char *type, int ac, struct wmeParams *wmep, const paramType *phy)
void ieee80211_stop(struct ieee80211vap *vap)
static void markwaiting(struct ieee80211vap *vap0)
void ieee80211_aclator_unregister(const struct ieee80211_aclator *iac)
void ieee80211_stop_all(struct ieee80211com *ic)
void ieee80211_cac_completeswitch(struct ieee80211vap *vap0)
static __inline int findrix(const struct ieee80211_rateset *rs, int r)
void ieee80211_resume_all(struct ieee80211com *ic)
void ieee80211_start_all(struct ieee80211com *ic)
static const struct ieee80211_authenticator * authenticators[IEEE80211_AUTH_MAX]
void ieee80211_reset_erp(struct ieee80211com *ic)
void ieee80211_wme_updateparams(struct ieee80211vap *vap)
void ieee80211_csa_completeswitch(struct ieee80211com *ic)
int ieee80211_new_state_locked(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
void ieee80211_init(void *arg)
static void null_update_beacon(struct ieee80211vap *vap, int item)
void ieee80211_vap_update_erp_protmode(struct ieee80211vap *vap)
int ieee80211_fix_rate(struct ieee80211_node *ni, struct ieee80211_rateset *nrs, int flags)
static void vap_update_wme(void *, int)
const char * ctl_subtype_name[]
struct phyParamType paramType
static void ieee80211_auth_setup(void)
static void ieee80211_newstate_cb(void *, int)
static void vap_update_slot(void *, int)
void ieee80211_proto_attach(struct ieee80211com *ic)
static void beacon_miss(void *, int)
static void wakeupwaiting(struct ieee80211vap *vap0)
void ieee80211_vap_reset_erp(struct ieee80211vap *vap)
static void parent_updown(void *, int)
static void update_promisc(void *, int)
const struct ieee80211_aclator * ieee80211_aclator_get(const char *name)
static void _setifsparams(struct wmeParams *wmep, const paramType *phy)
static void csa_completeswitch(struct ieee80211com *ic)
void ieee80211_wme_vap_getparams(struct ieee80211vap *vap, struct chanAccParams *wp)
void ieee80211_vap_set_shortslottime(struct ieee80211vap *vap, int onoff)
#define IEEE80211_AUTH_MAX
SYSINIT(wlan_auth, SI_SUB_DRIVERS, SI_ORDER_FIRST, ieee80211_auth_setup, NULL)
void ieee80211_wme_updateparams_locked(struct ieee80211vap *vap)
void ieee80211_wme_initparams(struct ieee80211vap *vap)
const char * ieee80211_opmode_name[IEEE80211_OPMODE_MAX]
void ieee80211_dump_pkt(struct ieee80211com *ic, const uint8_t *buf, int len, int rate, int rssi)
static int ieee80211_start_check_reset_chan(struct ieee80211vap *vap)
static const struct phyParamType bssPhyParamForAC_VO[IEEE80211_MODE_MAX]
void ieee80211_proto_detach(struct ieee80211com *ic)
static int null_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, const struct ieee80211_bpf_params *params)
static void update_channel(void *, int)
void ieee80211_beacon_miss(struct ieee80211com *ic)
void ieee80211_authenticator_register(int type, const struct ieee80211_authenticator *auth)
static void vap_update_erp_protmode(void *, int)
static void update_chw(void *, int)
#define AGGRESSIVE_MODE_SWITCH_HYSTERESIS
void ieee80211_wme_ic_getparams(struct ieee80211com *ic, struct chanAccParams *wp)
void ieee80211_waitfor_parent(struct ieee80211com *ic)
static void beacon_swmiss(void *, int)
#define IEEE80211_F_DODEL
#define IEEE80211_F_DONEGO
#define IEEE80211_F_DOBRS
#define IEEE80211_F_DOSORT
#define IEEE80211_F_DOFMCS
static __inline const char * ieee80211_mgt_subtype_name(uint8_t subtype)
#define IEEE80211_F_DOFRATE
void ieee80211_radiotap_chan_change(struct ieee80211com *ic)
void ieee80211_cancel_scan(struct ieee80211vap *vap)
void ieee80211_scan_flush(struct ieee80211vap *vap)
void ieee80211_sta_detach(struct ieee80211com *ic)
void ieee80211_sta_attach(struct ieee80211com *ic)
#define IEEE80211_FEXT_DFS
#define IEEE80211_MSG_STATE
static __inline int ieee80211_anyhdrspace(struct ieee80211com *ic, const void *data)
#define IEEE80211_TXMAX_DEFAULT
#define IEEE80211_MSG_XRATE
#define IEEE80211_FEXT_NONERP_PR
#define IEEE80211_RTS_DEFAULT
#define IEEE80211_F_USEBARKER
#define IEEE80211_F_SHPREAMBLE
#define IEEE80211_F_BURST
#define IEEE80211_FEXT_WDSLEGACY
#define IEEE80211_FIXED_RATE_NONE
#define IEEE80211_BMISS_MAX
#define IEEE80211_FEXT_REINIT
#define IEEE80211_MSG_11N
#define IEEE80211_F_CSAPENDING
#define IEEE80211_FEXT_STATEWAIT
#define IEEE80211_FRAG_DEFAULT
#define IEEE80211_FHT_NONHT_PR
#define IEEE80211_MSG_DEBUG
#define IEEE80211_NOTE(_vap, _m, _ni, _fmt,...)
#define IEEE80211_MSG_WME
#define IEEE80211_F_USEPROT
static __inline void ieee80211_runtask(struct ieee80211com *ic, struct task *task)
#define IEEE80211_DPRINTF(_vap, _m, _fmt,...)
#define IEEE80211_F_SHSLOT
#define IEEE80211_FEXT_RESUME
#define IEEE80211_FEXT_SCANWAIT
static __inline void ieee80211_beacon_notify(struct ieee80211vap *vap, int what)
static __inline void ieee80211_draintask(struct ieee80211com *ic, struct task *task)
void ieee80211_wds_attach(struct ieee80211com *ic)
void ieee80211_wds_detach(struct ieee80211com *ic)
struct wmeParams cap_wmeParams[WME_NUM_AC]
void(* iac_detach)(struct ieee80211vap *)
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 ieee80211vap * ni_vap
struct ieee80211_channel * ni_chan
uint8_t rs_rates[IEEE80211_RATE_MAXSIZE]
int(* wme_update)(struct ieee80211com *)
u_int wme_hipri_switch_hysteresis
struct chanAccParams wme_wmeChanParams
struct chanAccParams wme_chanParams
struct chanAccParams wme_bssChanParams
struct chanAccParams wme_wmeBssChanParams
u_int wme_hipri_switch_thresh
struct ieee80211_channel * ic_bsschan
struct ieee80211_channel * ic_csa_newchan
enum ieee80211_opmode ic_opmode
void(* ic_update_promisc)(struct ieee80211com *)
int(* ic_raw_xmit)(struct ieee80211_node *, struct mbuf *, const struct ieee80211_bpf_params *)
struct task ic_restart_task
ieee80211vap_attach ic_vattach[IEEE80211_OPMODE_MAX]
void(* ic_update_mcast)(struct ieee80211com *)
struct ieee80211_channel ic_channels[IEEE80211_CHAN_MAX]
struct ieee80211_rateset ic_sup_rates[IEEE80211_MODE_MAX]
struct task ic_parent_task
struct task ic_mcast_task
void(* ic_parent)(struct ieee80211com *)
struct ieee80211_wme_state ic_wme
int(* ic_send_mgmt)(struct ieee80211_node *, int, int)
uint8_t ic_modecaps[IEEE80211_MODE_BYTES]
void(* ic_update_chw)(struct ieee80211com *)
struct task ic_bmiss_task
void(* ic_set_channel)(struct ieee80211com *)
struct task ic_promisc_task
struct ieee80211_channel * ic_curchan
void(* ic_updateslot)(struct ieee80211com *)
struct ieee80211_appie * iv_appie_assocreq
struct ieee80211com * iv_ic
struct task iv_swbmiss_task
void(* iv_update_beacon)(struct ieee80211vap *, int)
struct ieee80211_node * iv_bss
enum ieee80211_roamingmode iv_roaming
enum ieee80211_opmode iv_opmode
uint16_t iv_swbmiss_count
enum ieee80211_protmode iv_protmode
uint16_t iv_fragthreshold
struct task iv_erp_protmode_task
struct ieee80211_appie * iv_appie_proberesp
struct ieee80211_appie * iv_appie_probereq
const struct ieee80211_authenticator * iv_auth
void(* iv_updateslot)(struct ieee80211vap *)
enum ieee80211_state iv_state
uint16_t iv_ht40_sta_assoc
enum ieee80211_state iv_nstate
void(* iv_opdetach)(struct ieee80211vap *)
void(* iv_erp_protmode_update)(struct ieee80211vap *)
struct ieee80211_txparam iv_txparms[IEEE80211_MODE_MAX]
struct task iv_preamble_task
struct ieee80211_appie * iv_appie_wpa
void(* iv_ht_protmode_update)(struct ieee80211vap *)
void(* iv_bmiss)(struct ieee80211vap *)
struct task iv_ht_protmode_task
struct ieee80211_appie * iv_appie_beacon
struct callout iv_swbmiss
int(* iv_wme_update)(struct ieee80211vap *, const struct wmeParams *wme_params)
struct callout iv_mgtsend
void(* iv_deliver_data)(struct ieee80211vap *, struct ieee80211_node *, struct mbuf *)
uint16_t iv_swbmiss_period
struct task iv_nstate_task
struct ieee80211_appie * iv_appie_assocresp
void(* iv_preamble_update)(struct ieee80211vap *)
int(* iv_newstate)(struct ieee80211vap *, enum ieee80211_state, int)
const struct ieee80211_aclator * iv_acl