| Commit | Line | Data |
|---|---|---|
| 32176cfd | 1 | /*- |
| f186073c | 2 | * Copyright (c) 2001 Atsushi Onoe |
| 32176cfd | 3 | * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting |
| f186073c JS |
4 | * All rights reserved. |
| 5 | * | |
| 6 | * Redistribution and use in source and binary forms, with or without | |
| 7 | * modification, are permitted provided that the following conditions | |
| 8 | * are met: | |
| 9 | * 1. Redistributions of source code must retain the above copyright | |
| 10 | * notice, this list of conditions and the following disclaimer. | |
| 11 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 12 | * notice, this list of conditions and the following disclaimer in the | |
| 13 | * documentation and/or other materials provided with the distribution. | |
| f186073c JS |
14 | * |
| 15 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | |
| 16 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |
| 17 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | |
| 18 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | |
| 19 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |
| 20 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| 21 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| 22 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 23 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |
| 24 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 25 | * | |
| 4028af95 | 26 | * $FreeBSD: head/sys/net80211/ieee80211_var.h 206358 2010-04-07 15:29:13Z rpaulo $ |
| 32176cfd | 27 | * $DragonFly$ |
| f186073c | 28 | */ |
| 841ab66c SZ |
29 | #ifndef _NET80211_IEEE80211_VAR_H_ |
| 30 | #define _NET80211_IEEE80211_VAR_H_ | |
| f186073c JS |
31 | |
| 32 | /* | |
| 33 | * Definitions for IEEE 802.11 drivers. | |
| 34 | */ | |
| 841ab66c | 35 | /* NB: portability glue must go first */ |
| 32176cfd | 36 | #if defined(__NetBSD__) |
| 841ab66c | 37 | #include <net80211/ieee80211_netbsd.h> |
| 32176cfd | 38 | #elif defined(__FreeBSD__) |
| 841ab66c | 39 | #include <net80211/ieee80211_freebsd.h> |
| 32176cfd | 40 | #elif defined(__linux__) |
| 841ab66c | 41 | #include <net80211/ieee80211_linux.h> |
| 32176cfd | 42 | #elif defined(__DragonFly__) |
| 841ab66c SZ |
43 | #include <netproto/802_11/ieee80211_dragonfly.h> |
| 44 | #else | |
| 45 | #error "No support for your operating system!" | |
| 46 | #endif | |
| f186073c | 47 | |
| 841ab66c | 48 | #include <netproto/802_11/_ieee80211.h> |
| f186073c | 49 | #include <netproto/802_11/ieee80211.h> |
| 32176cfd | 50 | #include <netproto/802_11/ieee80211_ageq.h> |
| f186073c | 51 | #include <netproto/802_11/ieee80211_crypto.h> |
| 32176cfd | 52 | #include <netproto/802_11/ieee80211_dfs.h> |
| 4028af95 | 53 | #include <netproto/802_11/ieee80211_ioctl.h> /* for ieee80211_stats */ |
| 32176cfd RP |
54 | #include <netproto/802_11/ieee80211_phy.h> |
| 55 | #include <netproto/802_11/ieee80211_power.h> | |
| f186073c JS |
56 | #include <netproto/802_11/ieee80211_node.h> |
| 57 | #include <netproto/802_11/ieee80211_proto.h> | |
| 32176cfd RP |
58 | #include <netproto/802_11/ieee80211_radiotap.h> |
| 59 | #include <netproto/802_11/ieee80211_scan.h> | |
| f186073c | 60 | |
| 841ab66c SZ |
61 | #define IEEE80211_TXPOWER_MAX 100 /* .5 dbM (XXX units?) */ |
| 62 | #define IEEE80211_TXPOWER_MIN 0 /* kill radio */ | |
| f186073c | 63 | |
| 841ab66c | 64 | #define IEEE80211_DTIM_DEFAULT 1 /* default DTIM period */ |
| 841ab66c | 65 | #define IEEE80211_BINTVAL_DEFAULT 100 /* default beacon interval (TU's) */ |
| f186073c | 66 | |
| 841ab66c | 67 | #define IEEE80211_BMISS_MAX 2 /* maximum consecutive bmiss allowed */ |
| 841ab66c | 68 | #define IEEE80211_HWBMISS_DEFAULT 7 /* h/w bmiss threshold (beacons) */ |
| f186073c | 69 | |
| 32176cfd RP |
70 | #define IEEE80211_BGSCAN_INTVAL_MIN 15 /* min bg scan intvl (secs) */ |
| 71 | #define IEEE80211_BGSCAN_INTVAL_DEFAULT (5*60) /* default bg scan intvl */ | |
| 72 | ||
| 73 | #define IEEE80211_BGSCAN_IDLE_MIN 100 /* min idle time (ms) */ | |
| 74 | #define IEEE80211_BGSCAN_IDLE_DEFAULT 250 /* default idle time (ms) */ | |
| 75 | ||
| 76 | #define IEEE80211_SCAN_VALID_MIN 10 /* min scan valid time (secs) */ | |
| 77 | #define IEEE80211_SCAN_VALID_DEFAULT 60 /* default scan valid time */ | |
| 78 | ||
| 841ab66c SZ |
79 | #define IEEE80211_PS_SLEEP 0x1 /* STA is in power saving mode */ |
| 80 | #define IEEE80211_PS_MAX_QUEUE 50 /* maximum saved packets */ | |
| f186073c | 81 | |
| 32176cfd RP |
82 | #define IEEE80211_FIXED_RATE_NONE 0xff |
| 83 | #define IEEE80211_TXMAX_DEFAULT 6 /* default ucast max retries */ | |
| f186073c | 84 | |
| 841ab66c SZ |
85 | #define IEEE80211_RTS_DEFAULT IEEE80211_RTS_MAX |
| 86 | #define IEEE80211_FRAG_DEFAULT IEEE80211_FRAG_MAX | |
| 87 | ||
| 34b861de SZ |
88 | #define IEEE80211_MS_TO_TU(x) (((x) * 1000) / 1024) |
| 89 | #define IEEE80211_TU_TO_MS(x) (((x) * 1024) / 1000) | |
| 90 | #define IEEE80211_TU_TO_TICKS(x)(((x) * 1024 * hz) / (1000 * 1000)) | |
| 841ab66c | 91 | |
| 32176cfd RP |
92 | /* |
| 93 | * 802.11 control state is split into a common portion that maps | |
| 94 | * 1-1 to a physical device and one or more "Virtual AP's" (VAP) | |
| 95 | * that are bound to an ieee80211com instance and share a single | |
| 96 | * underlying device. Each VAP has a corresponding OS device | |
| 97 | * entity through which traffic flows and that applications use | |
| 98 | * for issuing ioctls, etc. | |
| 99 | */ | |
| 100 | ||
| 101 | /* | |
| 102 | * Data common to one or more virtual AP's. State shared by | |
| 103 | * the underlying device and the net80211 layer is exposed here; | |
| 104 | * e.g. device-specific callbacks. | |
| 105 | */ | |
| 106 | struct ieee80211vap; | |
| 107 | typedef void (*ieee80211vap_attach)(struct ieee80211vap *); | |
| 108 | ||
| 109 | struct ieee80211_appie { | |
| 110 | uint16_t ie_len; /* size of ie_data */ | |
| 111 | uint8_t ie_data[]; /* user-specified IE's */ | |
| 112 | }; | |
| 113 | ||
| 114 | struct ieee80211_tdma_param; | |
| 115 | struct ieee80211_rate_table; | |
| 116 | struct ieee80211_tx_ampdu; | |
| 117 | struct ieee80211_rx_ampdu; | |
| 118 | struct ieee80211_superg; | |
| 119 | struct ieee80211_frame; | |
| f186073c JS |
120 | |
| 121 | struct ieee80211com { | |
| 841ab66c | 122 | struct ifnet *ic_ifp; /* associated device */ |
| 32176cfd | 123 | TAILQ_HEAD(, ieee80211vap) ic_vaps; /* list of vap instances */ |
| 4ac84526 | 124 | int ic_headroom; /* driver tx headroom needs */ |
| 32176cfd RP |
125 | enum ieee80211_phytype ic_phytype; /* XXX wrong for multi-mode */ |
| 126 | enum ieee80211_opmode ic_opmode; /* operation mode */ | |
| 127 | struct ifmedia ic_media; /* interface media config */ | |
| 128 | struct callout ic_inact; /* inactivity processing */ | |
| 129 | struct taskqueue *ic_tq; /* deferred state thread */ | |
| 130 | struct task ic_parent_task; /* deferred parent processing */ | |
| 131 | struct task ic_promisc_task;/* deferred promisc update */ | |
| 132 | struct task ic_mcast_task; /* deferred mcast update */ | |
| 133 | struct task ic_chan_task; /* deferred channel change */ | |
| 134 | struct task ic_bmiss_task; /* deferred beacon miss hndlr */ | |
| 841ab66c | 135 | |
| f186073c | 136 | uint32_t ic_flags; /* state flags */ |
| 841ab66c | 137 | uint32_t ic_flags_ext; /* extended state flags */ |
| 32176cfd RP |
138 | uint32_t ic_flags_ht; /* HT state flags */ |
| 139 | uint32_t ic_flags_ven; /* vendor state flags */ | |
| f186073c | 140 | uint32_t ic_caps; /* capabilities */ |
| 32176cfd | 141 | uint32_t ic_htcaps; /* HT capabilities */ |
| 4028af95 | 142 | uint32_t ic_htextcaps; /* HT extended capabilities */ |
| 32176cfd RP |
143 | uint32_t ic_cryptocaps; /* crypto capabilities */ |
| 144 | uint8_t ic_modecaps[2]; /* set of mode capabilities */ | |
| 145 | uint8_t ic_promisc; /* vap's needing promisc mode */ | |
| 146 | uint8_t ic_allmulti; /* vap's needing all multicast*/ | |
| 147 | uint8_t ic_nrunning; /* vap's marked running */ | |
| 148 | uint8_t ic_curmode; /* current mode */ | |
| 841ab66c | 149 | uint16_t ic_bintval; /* beacon interval */ |
| 32176cfd | 150 | uint16_t ic_lintval; /* listen interval */ |
| f186073c | 151 | uint16_t ic_holdover; /* PM hold over duration */ |
| 841ab66c | 152 | uint16_t ic_txpowlimit; /* global tx power limit */ |
| 32176cfd | 153 | struct ieee80211_rateset ic_sup_rates[IEEE80211_MODE_MAX]; |
| 841ab66c SZ |
154 | |
| 155 | /* | |
| 32176cfd RP |
156 | * Channel state: |
| 157 | * | |
| 158 | * ic_channels is the set of available channels for the device; | |
| 159 | * it is setup by the driver | |
| 160 | * ic_nchans is the number of valid entries in ic_channels | |
| 161 | * ic_chan_avail is a bit vector of these channels used to check | |
| 162 | * whether a channel is available w/o searching the channel table. | |
| 163 | * ic_chan_active is a (potentially) constrained subset of | |
| 164 | * ic_chan_avail that reflects any mode setting or user-specified | |
| 165 | * limit on the set of channels to use/scan | |
| 166 | * ic_curchan is the current channel the device is set to; it may | |
| 167 | * be different from ic_bsschan when we are off-channel scanning | |
| 168 | * or otherwise doing background work | |
| 169 | * ic_bsschan is the channel selected for operation; it may | |
| 170 | * be undefined (IEEE80211_CHAN_ANYC) | |
| 171 | * ic_prevchan is a cached ``previous channel'' used to optimize | |
| 172 | * lookups when switching back+forth between two channels | |
| 173 | * (e.g. for dynamic turbo) | |
| 841ab66c | 174 | */ |
| 32176cfd RP |
175 | int ic_nchans; /* # entries in ic_channels */ |
| 176 | struct ieee80211_channel ic_channels[IEEE80211_CHAN_MAX]; | |
| 177 | uint8_t ic_chan_avail[IEEE80211_CHAN_BYTES]; | |
| 178 | uint8_t ic_chan_active[IEEE80211_CHAN_BYTES]; | |
| 179 | uint8_t ic_chan_scan[IEEE80211_CHAN_BYTES]; | |
| 180 | struct ieee80211_channel *ic_curchan; /* current channel */ | |
| 181 | const struct ieee80211_rate_table *ic_rt; /* table for ic_curchan */ | |
| 182 | struct ieee80211_channel *ic_bsschan; /* bss channel */ | |
| 183 | struct ieee80211_channel *ic_prevchan; /* previous channel */ | |
| 184 | struct ieee80211_regdomain ic_regdomain;/* regulatory data */ | |
| 185 | struct ieee80211_appie *ic_countryie; /* calculated country ie */ | |
| 186 | struct ieee80211_channel *ic_countryie_chan; | |
| 187 | ||
| 188 | /* 802.11h/DFS state */ | |
| 189 | struct ieee80211_channel *ic_csa_newchan;/* channel for doing CSA */ | |
| 190 | short ic_csa_mode; /* mode for doing CSA */ | |
| 191 | short ic_csa_count; /* count for doing CSA */ | |
| 192 | struct ieee80211_dfs_state ic_dfs; /* DFS state */ | |
| 193 | ||
| 194 | struct ieee80211_scan_state *ic_scan; /* scan state */ | |
| 195 | int ic_lastdata; /* time of last data frame */ | |
| 196 | int ic_lastscan; /* time last scan completed */ | |
| 197 | ||
| 198 | /* NB: this is the union of all vap stations/neighbors */ | |
| 199 | int ic_max_keyix; /* max h/w key index */ | |
| 200 | struct ieee80211_node_table ic_sta; /* stations/neighbors */ | |
| 201 | struct ieee80211_ageq ic_stageq; /* frame staging queue */ | |
| 202 | uint32_t ic_hash_key; /* random key for mac hash */ | |
| 841ab66c | 203 | |
| 32176cfd RP |
204 | /* XXX multi-bss: split out common/vap parts */ |
| 205 | struct ieee80211_wme_state ic_wme; /* WME/WMM state */ | |
| 841ab66c | 206 | |
| 32176cfd RP |
207 | /* XXX multi-bss: can per-vap be done/make sense? */ |
| 208 | enum ieee80211_protmode ic_protmode; /* 802.11g protection mode */ | |
| 209 | uint16_t ic_nonerpsta; /* # non-ERP stations */ | |
| 210 | uint16_t ic_longslotsta; /* # long slot time stations */ | |
| 211 | uint16_t ic_sta_assoc; /* stations associated */ | |
| 212 | uint16_t ic_ht_sta_assoc;/* HT stations associated */ | |
| 213 | uint16_t ic_ht40_sta_assoc;/* HT40 stations associated */ | |
| 214 | uint8_t ic_curhtprotmode;/* HTINFO bss state */ | |
| 215 | enum ieee80211_protmode ic_htprotmode; /* HT protection mode */ | |
| 216 | int ic_lastnonerp; /* last time non-ERP sta noted*/ | |
| 217 | int ic_lastnonht; /* last time non-HT sta noted */ | |
| 218 | ||
| 219 | /* optional state for Atheros SuperG protocol extensions */ | |
| 220 | struct ieee80211_superg *ic_superg; | |
| 221 | ||
| 222 | /* radiotap handling */ | |
| 223 | struct ieee80211_radiotap_header *ic_th;/* tx radiotap headers */ | |
| 224 | void *ic_txchan; /* channel state in ic_th */ | |
| 225 | struct ieee80211_radiotap_header *ic_rh;/* rx radiotap headers */ | |
| 226 | void *ic_rxchan; /* channel state in ic_rh */ | |
| 227 | int ic_montaps; /* active monitor mode taps */ | |
| 228 | ||
| 229 | /* virtual ap create/delete */ | |
| 230 | struct ieee80211vap* (*ic_vap_create)(struct ieee80211com *, | |
| 231 | const char name[IFNAMSIZ], int unit, | |
| 232 | int opmode, int flags, | |
| 233 | const uint8_t bssid[IEEE80211_ADDR_LEN], | |
| 234 | const uint8_t macaddr[IEEE80211_ADDR_LEN]); | |
| 235 | void (*ic_vap_delete)(struct ieee80211vap *); | |
| 236 | /* operating mode attachment */ | |
| 237 | ieee80211vap_attach ic_vattach[IEEE80211_OPMODE_MAX]; | |
| 238 | /* return hardware/radio capabilities */ | |
| 239 | void (*ic_getradiocaps)(struct ieee80211com *, | |
| 240 | int, int *, struct ieee80211_channel []); | |
| 241 | /* check and/or prepare regdomain state change */ | |
| 242 | int (*ic_setregdomain)(struct ieee80211com *, | |
| 243 | struct ieee80211_regdomain *, | |
| 244 | int, struct ieee80211_channel []); | |
| 245 | /* send/recv 802.11 management frame */ | |
| 246 | int (*ic_send_mgmt)(struct ieee80211_node *, | |
| 247 | int, int); | |
| 248 | /* send raw 802.11 frame */ | |
| 249 | int (*ic_raw_xmit)(struct ieee80211_node *, | |
| 250 | struct mbuf *, | |
| 251 | const struct ieee80211_bpf_params *); | |
| 252 | /* update device state for 802.11 slot time change */ | |
| 253 | void (*ic_updateslot)(struct ifnet *); | |
| 254 | /* handle multicast state changes */ | |
| 255 | void (*ic_update_mcast)(struct ifnet *); | |
| 256 | /* handle promiscuous mode changes */ | |
| 257 | void (*ic_update_promisc)(struct ifnet *); | |
| 258 | /* new station association callback/notification */ | |
| 259 | void (*ic_newassoc)(struct ieee80211_node *, int); | |
| 260 | /* TDMA update notification */ | |
| 261 | void (*ic_tdma_update)(struct ieee80211_node *, | |
| 262 | const struct ieee80211_tdma_param *, int); | |
| 263 | /* node state management */ | |
| 264 | struct ieee80211_node* (*ic_node_alloc)(struct ieee80211vap *, | |
| 265 | const uint8_t [IEEE80211_ADDR_LEN]); | |
| 266 | void (*ic_node_free)(struct ieee80211_node *); | |
| 267 | void (*ic_node_cleanup)(struct ieee80211_node *); | |
| 268 | void (*ic_node_age)(struct ieee80211_node *); | |
| 269 | void (*ic_node_drain)(struct ieee80211_node *); | |
| 270 | int8_t (*ic_node_getrssi)(const struct ieee80211_node*); | |
| 271 | void (*ic_node_getsignal)(const struct ieee80211_node*, | |
| 272 | int8_t *, int8_t *); | |
| 273 | void (*ic_node_getmimoinfo)( | |
| 274 | const struct ieee80211_node*, | |
| 275 | struct ieee80211_mimo_info *); | |
| 276 | /* scanning support */ | |
| 277 | void (*ic_scan_start)(struct ieee80211com *); | |
| 278 | void (*ic_scan_end)(struct ieee80211com *); | |
| 279 | void (*ic_set_channel)(struct ieee80211com *); | |
| 280 | void (*ic_scan_curchan)(struct ieee80211_scan_state *, | |
| 281 | unsigned long); | |
| 282 | void (*ic_scan_mindwell)(struct ieee80211_scan_state *); | |
| 841ab66c SZ |
283 | |
| 284 | /* | |
| 32176cfd RP |
285 | * 802.11n ADDBA support. A simple/generic implementation |
| 286 | * of A-MPDU tx aggregation is provided; the driver may | |
| 287 | * override these methods to provide their own support. | |
| 288 | * A-MPDU rx re-ordering happens automatically if the | |
| 289 | * driver passes out-of-order frames to ieee80211_input | |
| 290 | * from an assocated HT station. | |
| 841ab66c | 291 | */ |
| 32176cfd RP |
292 | int (*ic_recv_action)(struct ieee80211_node *, |
| 293 | const struct ieee80211_frame *, | |
| 294 | const uint8_t *frm, const uint8_t *efrm); | |
| 295 | int (*ic_send_action)(struct ieee80211_node *, | |
| 296 | int category, int action, void *); | |
| 297 | /* check if A-MPDU should be enabled this station+ac */ | |
| 298 | int (*ic_ampdu_enable)(struct ieee80211_node *, | |
| 299 | struct ieee80211_tx_ampdu *); | |
| 300 | /* start/stop doing A-MPDU tx aggregation for a station */ | |
| 301 | int (*ic_addba_request)(struct ieee80211_node *, | |
| 302 | struct ieee80211_tx_ampdu *, | |
| 303 | int dialogtoken, int baparamset, | |
| 304 | int batimeout); | |
| 305 | int (*ic_addba_response)(struct ieee80211_node *, | |
| 306 | struct ieee80211_tx_ampdu *, | |
| 307 | int status, int baparamset, int batimeout); | |
| 308 | void (*ic_addba_stop)(struct ieee80211_node *, | |
| 309 | struct ieee80211_tx_ampdu *); | |
| 310 | /* BAR response received */ | |
| 311 | void (*ic_bar_response)(struct ieee80211_node *, | |
| 312 | struct ieee80211_tx_ampdu *, int status); | |
| 313 | /* start/stop doing A-MPDU rx processing for a station */ | |
| 314 | int (*ic_ampdu_rx_start)(struct ieee80211_node *, | |
| 315 | struct ieee80211_rx_ampdu *, int baparamset, | |
| 316 | int batimeout, int baseqctl); | |
| 317 | void (*ic_ampdu_rx_stop)(struct ieee80211_node *, | |
| 318 | struct ieee80211_rx_ampdu *); | |
| 4028af95 RP |
319 | uint64_t ic_spare[7]; |
| 320 | uint32_t ic_spare2; | |
| 32176cfd | 321 | }; |
| b9334f94 | 322 | |
| 32176cfd RP |
323 | struct ieee80211_aclator; |
| 324 | struct ieee80211_tdma_state; | |
| 325 | struct ieee80211_mesh_state; | |
| 326 | struct ieee80211_hwmp_state; | |
| 327 | ||
| 328 | struct ieee80211vap { | |
| 329 | struct ifmedia iv_media; /* interface media config */ | |
| 330 | struct ifnet *iv_ifp; /* associated device */ | |
| 331 | struct bpf_if *iv_rawbpf; /* packet filter structure */ | |
| 332 | struct sysctl_ctx_list *iv_sysctl; /* dynamic sysctl context */ | |
| 333 | struct sysctl_oid *iv_oid; /* net.wlan.X sysctl oid */ | |
| 334 | ||
| 335 | TAILQ_ENTRY(ieee80211vap) iv_next; /* list of vap instances */ | |
| 336 | struct ieee80211com *iv_ic; /* back ptr to common state */ | |
| 337 | uint32_t iv_debug; /* debug msg flags */ | |
| 338 | struct ieee80211_stats iv_stats; /* statistics */ | |
| 339 | ||
| 340 | uint8_t iv_myaddr[IEEE80211_ADDR_LEN]; | |
| 341 | uint32_t iv_flags; /* state flags */ | |
| 342 | uint32_t iv_flags_ext; /* extended state flags */ | |
| 343 | uint32_t iv_flags_ht; /* HT state flags */ | |
| 344 | uint32_t iv_flags_ven; /* vendor state flags */ | |
| 345 | uint32_t iv_caps; /* capabilities */ | |
| 346 | uint32_t iv_htcaps; /* HT capabilities */ | |
| 4028af95 | 347 | uint32_t iv_htextcaps; /* HT extended capabilities */ |
| 32176cfd RP |
348 | enum ieee80211_opmode iv_opmode; /* operation mode */ |
| 349 | enum ieee80211_state iv_state; /* state machine state */ | |
| 350 | enum ieee80211_state iv_nstate; /* pending state */ | |
| 351 | int iv_nstate_arg; /* pending state arg */ | |
| 352 | struct task iv_nstate_task; /* deferred state processing */ | |
| 353 | struct task iv_swbmiss_task;/* deferred iv_bmiss call */ | |
| 354 | struct callout iv_mgtsend; /* mgmt frame response timer */ | |
| 355 | /* inactivity timer settings */ | |
| 356 | int iv_inact_init; /* setting for new station */ | |
| 357 | int iv_inact_auth; /* auth but not assoc setting */ | |
| 358 | int iv_inact_run; /* authorized setting */ | |
| 359 | int iv_inact_probe; /* inactive probe time */ | |
| 360 | ||
| 361 | int iv_des_nssid; /* # desired ssids */ | |
| 362 | struct ieee80211_scan_ssid iv_des_ssid[1];/* desired ssid table */ | |
| 363 | uint8_t iv_des_bssid[IEEE80211_ADDR_LEN]; | |
| 364 | struct ieee80211_channel *iv_des_chan; /* desired channel */ | |
| 365 | uint16_t iv_des_mode; /* desired mode */ | |
| 366 | int iv_nicknamelen; /* XXX junk */ | |
| 367 | uint8_t iv_nickname[IEEE80211_NWID_LEN]; | |
| 368 | u_int iv_bgscanidle; /* bg scan idle threshold */ | |
| 369 | u_int iv_bgscanintvl; /* bg scan min interval */ | |
| 370 | u_int iv_scanvalid; /* scan cache valid threshold */ | |
| 371 | u_int iv_scanreq_duration; | |
| 372 | u_int iv_scanreq_mindwell; | |
| 373 | u_int iv_scanreq_maxdwell; | |
| 374 | uint16_t iv_scanreq_flags;/* held scan request params */ | |
| 375 | uint8_t iv_scanreq_nssid; | |
| 376 | struct ieee80211_scan_ssid iv_scanreq_ssid[IEEE80211_SCAN_MAX_SSID]; | |
| 377 | /* sta-mode roaming state */ | |
| 378 | enum ieee80211_roamingmode iv_roaming; /* roaming mode */ | |
| 379 | struct ieee80211_roamparam iv_roamparms[IEEE80211_MODE_MAX]; | |
| 380 | ||
| 381 | uint8_t iv_bmissthreshold; | |
| 382 | uint8_t iv_bmiss_count; /* current beacon miss count */ | |
| 383 | int iv_bmiss_max; /* max bmiss before scan */ | |
| 384 | uint16_t iv_swbmiss_count;/* beacons in last period */ | |
| 385 | uint16_t iv_swbmiss_period;/* s/w bmiss period */ | |
| 386 | struct callout iv_swbmiss; /* s/w beacon miss timer */ | |
| 387 | ||
| 388 | int iv_ampdu_rxmax; /* A-MPDU rx limit (bytes) */ | |
| 389 | int iv_ampdu_density;/* A-MPDU density */ | |
| 390 | int iv_ampdu_limit; /* A-MPDU tx limit (bytes) */ | |
| 391 | int iv_amsdu_limit; /* A-MSDU tx limit (bytes) */ | |
| 392 | u_int iv_ampdu_mintraffic[WME_NUM_AC]; | |
| 393 | ||
| 394 | uint32_t *iv_aid_bitmap; /* association id map */ | |
| 395 | uint16_t iv_max_aid; | |
| 396 | uint16_t iv_sta_assoc; /* stations associated */ | |
| 397 | uint16_t iv_ps_sta; /* stations in power save */ | |
| 398 | uint16_t iv_ps_pending; /* ps sta's w/ pending frames */ | |
| 399 | uint16_t iv_txseq; /* mcast xmit seq# space */ | |
| 400 | uint16_t iv_tim_len; /* ic_tim_bitmap size (bytes) */ | |
| 401 | uint8_t *iv_tim_bitmap; /* power-save stations w/ data*/ | |
| 402 | uint8_t iv_dtim_period; /* DTIM period */ | |
| 403 | uint8_t iv_dtim_count; /* DTIM count from last bcn */ | |
| 404 | /* set/unset aid pwrsav state */ | |
| 405 | int iv_csa_count; /* count for doing CSA */ | |
| 406 | ||
| 407 | struct ieee80211_node *iv_bss; /* information for this node */ | |
| 408 | struct ieee80211_txparam iv_txparms[IEEE80211_MODE_MAX]; | |
| 409 | uint16_t iv_rtsthreshold; | |
| 410 | uint16_t iv_fragthreshold; | |
| 411 | int iv_inact_timer; /* inactivity timer wait */ | |
| 412 | /* application-specified IE's to attach to mgt frames */ | |
| 413 | struct ieee80211_appie *iv_appie_beacon; | |
| 414 | struct ieee80211_appie *iv_appie_probereq; | |
| 415 | struct ieee80211_appie *iv_appie_proberesp; | |
| 416 | struct ieee80211_appie *iv_appie_assocreq; | |
| 417 | struct ieee80211_appie *iv_appie_assocresp; | |
| 418 | struct ieee80211_appie *iv_appie_wpa; | |
| 419 | uint8_t *iv_wpa_ie; | |
| 420 | uint8_t *iv_rsn_ie; | |
| 421 | uint16_t iv_max_keyix; /* max h/w key index */ | |
| 422 | ieee80211_keyix iv_def_txkey; /* default/group tx key index */ | |
| 423 | struct ieee80211_key iv_nw_keys[IEEE80211_WEP_NKID]; | |
| 424 | int (*iv_key_alloc)(struct ieee80211vap *, | |
| 425 | struct ieee80211_key *, | |
| 426 | ieee80211_keyix *, ieee80211_keyix *); | |
| 427 | int (*iv_key_delete)(struct ieee80211vap *, | |
| 428 | const struct ieee80211_key *); | |
| 429 | int (*iv_key_set)(struct ieee80211vap *, | |
| 430 | const struct ieee80211_key *, | |
| 431 | const uint8_t mac[IEEE80211_ADDR_LEN]); | |
| 432 | void (*iv_key_update_begin)(struct ieee80211vap *); | |
| 433 | void (*iv_key_update_end)(struct ieee80211vap *); | |
| 434 | ||
| 435 | const struct ieee80211_authenticator *iv_auth; /* authenticator glue */ | |
| 436 | void *iv_ec; /* private auth state */ | |
| 437 | ||
| 438 | const struct ieee80211_aclator *iv_acl; /* acl glue */ | |
| 439 | void *iv_as; /* private aclator state */ | |
| 440 | ||
| 4028af95 RP |
441 | const struct ieee80211_ratectl *iv_rate; |
| 442 | void *iv_rs; /* private ratectl state */ | |
| 443 | ||
| 32176cfd RP |
444 | struct ieee80211_tdma_state *iv_tdma; /* tdma state */ |
| 445 | struct ieee80211_mesh_state *iv_mesh; /* MBSS state */ | |
| 446 | struct ieee80211_hwmp_state *iv_hwmp; /* HWMP state */ | |
| 447 | ||
| 448 | /* operate-mode detach hook */ | |
| 449 | void (*iv_opdetach)(struct ieee80211vap *); | |
| 450 | /* receive processing */ | |
| 451 | int (*iv_input)(struct ieee80211_node *, | |
| 452 | struct mbuf *, int, int); | |
| 453 | void (*iv_recv_mgmt)(struct ieee80211_node *, | |
| 454 | struct mbuf *, int, int, int); | |
| 455 | void (*iv_recv_ctl)(struct ieee80211_node *, | |
| 456 | struct mbuf *, int); | |
| 457 | void (*iv_deliver_data)(struct ieee80211vap *, | |
| 458 | struct ieee80211_node *, struct mbuf *); | |
| 459 | #if 0 | |
| 460 | /* send processing */ | |
| 461 | int (*iv_send_mgmt)(struct ieee80211_node *, | |
| 462 | int, int); | |
| 463 | #endif | |
| 464 | /* beacon miss processing */ | |
| 465 | void (*iv_bmiss)(struct ieee80211vap *); | |
| 466 | /* reset device state after 802.11 parameter/state change */ | |
| 467 | int (*iv_reset)(struct ieee80211vap *, u_long); | |
| 468 | /* [schedule] beacon frame update */ | |
| 469 | void (*iv_update_beacon)(struct ieee80211vap *, int); | |
| 470 | /* power save handling */ | |
| 471 | void (*iv_update_ps)(struct ieee80211vap *, int); | |
| 472 | int (*iv_set_tim)(struct ieee80211_node *, int); | |
| 473 | /* state machine processing */ | |
| 474 | int (*iv_newstate)(struct ieee80211vap *, | |
| 475 | enum ieee80211_state, int); | |
| 476 | /* 802.3 output method for raw frame xmit */ | |
| 477 | int (*iv_output)(struct ifnet *, struct mbuf *, | |
| 34a60cf6 | 478 | struct sockaddr *, struct rtentry *); |
| 4028af95 | 479 | uint64_t iv_spare[6]; |
| f186073c | 480 | }; |
| 32176cfd | 481 | MALLOC_DECLARE(M_80211_VAP); |
| f186073c JS |
482 | |
| 483 | #define IEEE80211_ADDR_EQ(a1,a2) (memcmp(a1,a2,IEEE80211_ADDR_LEN) == 0) | |
| 484 | #define IEEE80211_ADDR_COPY(dst,src) memcpy(dst,src,IEEE80211_ADDR_LEN) | |
| 485 | ||
| 32176cfd RP |
486 | /* ic_flags/iv_flags */ |
| 487 | #define IEEE80211_F_TURBOP 0x00000001 /* CONF: ATH Turbo enabled*/ | |
| 488 | #define IEEE80211_F_COMP 0x00000002 /* CONF: ATH comp enabled */ | |
| 489 | #define IEEE80211_F_FF 0x00000004 /* CONF: ATH FF enabled */ | |
| 490 | #define IEEE80211_F_BURST 0x00000008 /* CONF: bursting enabled */ | |
| 841ab66c SZ |
491 | /* NB: this is intentionally setup to be IEEE80211_CAPINFO_PRIVACY */ |
| 492 | #define IEEE80211_F_PRIVACY 0x00000010 /* CONF: privacy enabled */ | |
| 493 | #define IEEE80211_F_PUREG 0x00000020 /* CONF: 11g w/o 11b sta's */ | |
| 494 | #define IEEE80211_F_SCAN 0x00000080 /* STATUS: scanning */ | |
| 495 | #define IEEE80211_F_ASCAN 0x00000100 /* STATUS: active scan */ | |
| 496 | #define IEEE80211_F_SIBSS 0x00000200 /* STATUS: start IBSS */ | |
| 497 | /* NB: this is intentionally setup to be IEEE80211_CAPINFO_SHORT_SLOTTIME */ | |
| 498 | #define IEEE80211_F_SHSLOT 0x00000400 /* STATUS: use short slot time*/ | |
| 499 | #define IEEE80211_F_PMGTON 0x00000800 /* CONF: Power mgmt enable */ | |
| 500 | #define IEEE80211_F_DESBSSID 0x00001000 /* CONF: des_bssid is set */ | |
| 501 | #define IEEE80211_F_WME 0x00002000 /* CONF: enable WME use */ | |
| 502 | #define IEEE80211_F_BGSCAN 0x00004000 /* CONF: bg scan enabled (???)*/ | |
| 503 | #define IEEE80211_F_SWRETRY 0x00008000 /* CONF: sw tx retry enabled */ | |
| 504 | #define IEEE80211_F_TXPOW_FIXED 0x00010000 /* TX Power: fixed rate */ | |
| 505 | #define IEEE80211_F_IBSSON 0x00020000 /* CONF: IBSS creation enable */ | |
| 506 | #define IEEE80211_F_SHPREAMBLE 0x00040000 /* STATUS: use short preamble */ | |
| 507 | #define IEEE80211_F_DATAPAD 0x00080000 /* CONF: do alignment pad */ | |
| f186073c JS |
508 | #define IEEE80211_F_USEPROT 0x00100000 /* STATUS: protection enabled */ |
| 509 | #define IEEE80211_F_USEBARKER 0x00200000 /* STATUS: use barker preamble*/ | |
| 32176cfd | 510 | #define IEEE80211_F_CSAPENDING 0x00400000 /* STATUS: chan switch pending*/ |
| 841ab66c SZ |
511 | #define IEEE80211_F_WPA1 0x00800000 /* CONF: WPA enabled */ |
| 512 | #define IEEE80211_F_WPA2 0x01000000 /* CONF: WPA2 enabled */ | |
| 513 | #define IEEE80211_F_WPA 0x01800000 /* CONF: WPA/WPA2 enabled */ | |
| 514 | #define IEEE80211_F_DROPUNENC 0x02000000 /* CONF: drop unencrypted */ | |
| 515 | #define IEEE80211_F_COUNTERM 0x04000000 /* CONF: TKIP countermeasures */ | |
| 516 | #define IEEE80211_F_HIDESSID 0x08000000 /* CONF: hide SSID in beacon */ | |
| 517 | #define IEEE80211_F_NOBRIDGE 0x10000000 /* CONF: dis. internal bridge */ | |
| 32176cfd RP |
518 | #define IEEE80211_F_PCF 0x20000000 /* CONF: PCF enabled */ |
| 519 | #define IEEE80211_F_DOTH 0x40000000 /* CONF: 11h enabled */ | |
| 520 | #define IEEE80211_F_DWDS 0x80000000 /* CONF: Dynamic WDS enabled */ | |
| 521 | ||
| 522 | #define IEEE80211_F_BITS \ | |
| 523 | "\20\1TURBOP\2COMP\3FF\4BURST\5PRIVACY\6PUREG\10SCAN\11ASCAN\12SIBSS" \ | |
| 524 | "\13SHSLOT\14PMGTON\15DESBSSID\16WME\17BGSCAN\20SWRETRY\21TXPOW_FIXED" \ | |
| 525 | "\22IBSSON\23SHPREAMBLE\24DATAPAD\25USEPROT\26USERBARKER\27CSAPENDING" \ | |
| 526 | "\30WPA1\31WPA2\32DROPUNENC\33COUNTERM\34HIDESSID\35NOBRIDG\36PCF" \ | |
| 527 | "\37DOTH\40DWDS" | |
| 528 | ||
| 529 | /* Atheros protocol-specific flags */ | |
| 530 | #define IEEE80211_F_ATHEROS \ | |
| 531 | (IEEE80211_F_FF | IEEE80211_F_COMP | IEEE80211_F_TURBOP) | |
| 532 | /* Check if an Atheros capability was negotiated for use */ | |
| 533 | #define IEEE80211_ATH_CAP(vap, ni, bit) \ | |
| 534 | ((vap)->iv_flags & (ni)->ni_ath_flags & (bit)) | |
| 535 | ||
| 536 | /* ic_flags_ext/iv_flags_ext */ | |
| 537 | #define IEEE80211_FEXT_INACT 0x00000002 /* CONF: sta inact handling */ | |
| 538 | #define IEEE80211_FEXT_SCANWAIT 0x00000004 /* STATUS: awaiting scan */ | |
| 841ab66c | 539 | /* 0x00000006 reserved */ |
| 32176cfd RP |
540 | #define IEEE80211_FEXT_BGSCAN 0x00000008 /* STATUS: complete bgscan */ |
| 541 | #define IEEE80211_FEXT_WPS 0x00000010 /* CONF: WPS enabled */ | |
| 542 | #define IEEE80211_FEXT_TSN 0x00000020 /* CONF: TSN enabled */ | |
| 543 | #define IEEE80211_FEXT_SCANREQ 0x00000040 /* STATUS: scan req params */ | |
| 544 | #define IEEE80211_FEXT_RESUME 0x00000080 /* STATUS: start on resume */ | |
| 545 | #define IEEE80211_FEXT_4ADDR 0x00000100 /* CONF: apply 4-addr encap */ | |
| 546 | #define IEEE80211_FEXT_NONERP_PR 0x00000200 /* STATUS: non-ERP sta present*/ | |
| 547 | #define IEEE80211_FEXT_SWBMISS 0x00000400 /* CONF: do bmiss in s/w */ | |
| 548 | #define IEEE80211_FEXT_DFS 0x00000800 /* CONF: DFS enabled */ | |
| 549 | #define IEEE80211_FEXT_DOTD 0x00001000 /* CONF: 11d enabled */ | |
| 550 | #define IEEE80211_FEXT_STATEWAIT 0x00002000 /* STATUS: awaiting state chg */ | |
| 551 | #define IEEE80211_FEXT_REINIT 0x00004000 /* STATUS: INIT state first */ | |
| 552 | #define IEEE80211_FEXT_BPF 0x00008000 /* STATUS: BPF tap present */ | |
| 553 | /* NB: immutable: should be set only when creating a vap */ | |
| 554 | #define IEEE80211_FEXT_WDSLEGACY 0x00010000 /* CONF: legacy WDS operation */ | |
| 841ab66c | 555 | #define IEEE80211_FEXT_PROBECHAN 0x00020000 /* CONF: probe passive channel*/ |
| 32176cfd RP |
556 | #define IEEE80211_FEXT_UNIQMAC 0x00040000 /* CONF: user or computed mac */ |
| 557 | ||
| 558 | #define IEEE80211_FEXT_BITS \ | |
| 559 | "\20\2INACT\3SCANWAIT\4BGSCAN\5WPS\6TSN\7SCANREQ\10RESUME" \ | |
| 560 | "\0114ADDR\12NONEPR_PR\13SWBMISS\14DFS\15DOTD\16STATEWAIT\17REINIT" \ | |
| 561 | "\20BPF\21WDSLEGACY\22PROBECHAN\23UNIQMAC" | |
| 562 | ||
| 563 | /* ic_flags_ht/iv_flags_ht */ | |
| 564 | #define IEEE80211_FHT_NONHT_PR 0x00000001 /* STATUS: non-HT sta present */ | |
| 565 | #define IEEE80211_FHT_GF 0x00040000 /* CONF: Greenfield enabled */ | |
| 566 | #define IEEE80211_FHT_HT 0x00080000 /* CONF: HT supported */ | |
| 567 | #define IEEE80211_FHT_AMPDU_TX 0x00100000 /* CONF: A-MPDU tx supported */ | |
| 568 | #define IEEE80211_FHT_AMPDU_RX 0x00200000 /* CONF: A-MPDU rx supported */ | |
| 569 | #define IEEE80211_FHT_AMSDU_TX 0x00400000 /* CONF: A-MSDU tx supported */ | |
| 570 | #define IEEE80211_FHT_AMSDU_RX 0x00800000 /* CONF: A-MSDU rx supported */ | |
| 571 | #define IEEE80211_FHT_USEHT40 0x01000000 /* CONF: 20/40 use enabled */ | |
| 572 | #define IEEE80211_FHT_PUREN 0x02000000 /* CONF: 11n w/o legacy sta's */ | |
| 573 | #define IEEE80211_FHT_SHORTGI20 0x04000000 /* CONF: short GI in HT20 */ | |
| 574 | #define IEEE80211_FHT_SHORTGI40 0x08000000 /* CONF: short GI in HT40 */ | |
| 575 | #define IEEE80211_FHT_HTCOMPAT 0x10000000 /* CONF: HT vendor OUI's */ | |
| 576 | #define IEEE80211_FHT_RIFS 0x20000000 /* CONF: RIFS enabled */ | |
| 577 | #define IEEE80211_FHT_STBC_TX 0x40000000 /* CONF: STBC tx enabled */ | |
| 578 | #define IEEE80211_FHT_STBC_RX 0x80000000 /* CONF: STBC rx enabled */ | |
| 579 | ||
| 580 | #define IEEE80211_FHT_BITS \ | |
| 581 | "\20\1NONHT_PR" \ | |
| 582 | "\23GF\24HT\25AMDPU_TX\26AMPDU_TX" \ | |
| 583 | "\27AMSDU_TX\30AMSDU_RX\31USEHT40\32PUREN\33SHORTGI20\34SHORTGI40" \ | |
| 584 | "\35HTCOMPAT\36RIFS\37STBC_TX\40STBC_RX" | |
| 585 | ||
| 586 | #define IEEE80211_FVEN_BITS "\20" | |
| 587 | ||
| 588 | /* ic_caps/iv_caps: device driver capabilities */ | |
| 589 | /* 0x2e available */ | |
| 590 | #define IEEE80211_C_STA 0x00000001 /* CAPABILITY: STA available */ | |
| 591 | #define IEEE80211_C_8023ENCAP 0x00000002 /* CAPABILITY: 802.3 encap */ | |
| 841ab66c SZ |
592 | #define IEEE80211_C_FF 0x00000040 /* CAPABILITY: ATH FF avail */ |
| 593 | #define IEEE80211_C_TURBOP 0x00000080 /* CAPABILITY: ATH Turbo avail*/ | |
| 594 | #define IEEE80211_C_IBSS 0x00000100 /* CAPABILITY: IBSS available */ | |
| 595 | #define IEEE80211_C_PMGT 0x00000200 /* CAPABILITY: Power mgmt */ | |
| 596 | #define IEEE80211_C_HOSTAP 0x00000400 /* CAPABILITY: HOSTAP avail */ | |
| 597 | #define IEEE80211_C_AHDEMO 0x00000800 /* CAPABILITY: Old Adhoc Demo */ | |
| 598 | #define IEEE80211_C_SWRETRY 0x00001000 /* CAPABILITY: sw tx retry */ | |
| 599 | #define IEEE80211_C_TXPMGT 0x00002000 /* CAPABILITY: tx power mgmt */ | |
| 600 | #define IEEE80211_C_SHSLOT 0x00004000 /* CAPABILITY: short slottime */ | |
| 601 | #define IEEE80211_C_SHPREAMBLE 0x00008000 /* CAPABILITY: short preamble */ | |
| 602 | #define IEEE80211_C_MONITOR 0x00010000 /* CAPABILITY: monitor mode */ | |
| 32176cfd RP |
603 | #define IEEE80211_C_DFS 0x00020000 /* CAPABILITY: DFS/radar avail*/ |
| 604 | #define IEEE80211_C_MBSS 0x00040000 /* CAPABILITY: MBSS available */ | |
| 605 | /* 0x7c0000 available */ | |
| 841ab66c SZ |
606 | #define IEEE80211_C_WPA1 0x00800000 /* CAPABILITY: WPA1 avail */ |
| 607 | #define IEEE80211_C_WPA2 0x01000000 /* CAPABILITY: WPA2 avail */ | |
| 608 | #define IEEE80211_C_WPA 0x01800000 /* CAPABILITY: WPA1+WPA2 avail*/ | |
| 609 | #define IEEE80211_C_BURST 0x02000000 /* CAPABILITY: frame bursting */ | |
| 610 | #define IEEE80211_C_WME 0x04000000 /* CAPABILITY: WME avail */ | |
| 611 | #define IEEE80211_C_WDS 0x08000000 /* CAPABILITY: 4-addr support */ | |
| 612 | /* 0x10000000 reserved */ | |
| 613 | #define IEEE80211_C_BGSCAN 0x20000000 /* CAPABILITY: bg scanning */ | |
| 614 | #define IEEE80211_C_TXFRAG 0x40000000 /* CAPABILITY: tx fragments */ | |
| 32176cfd | 615 | #define IEEE80211_C_TDMA 0x80000000 /* CAPABILITY: TDMA avail */ |
| 841ab66c SZ |
616 | /* XXX protection/barker? */ |
| 617 | ||
| 32176cfd RP |
618 | #define IEEE80211_C_OPMODE \ |
| 619 | (IEEE80211_C_STA | IEEE80211_C_IBSS | IEEE80211_C_HOSTAP | \ | |
| 620 | IEEE80211_C_AHDEMO | IEEE80211_C_MONITOR | IEEE80211_C_WDS | \ | |
| 621 | IEEE80211_C_TDMA | IEEE80211_C_MBSS) | |
| 622 | ||
| 623 | #define IEEE80211_C_BITS \ | |
| 624 | "\20\1STA\002803ENCAP\7FF\10TURBOP\11IBSS\12PMGT" \ | |
| 625 | "\13HOSTAP\14AHDEMO\15SWRETRY\16TXPMGT\17SHSLOT\20SHPREAMBLE" \ | |
| 626 | "\21MONITOR\22DFS\23MBSS\30WPA1\31WPA2\32BURST\33WME\34WDS\36BGSCAN" \ | |
| 627 | "\37TXFRAG\40TDMA" | |
| 628 | ||
| 629 | /* | |
| 630 | * ic_htcaps/iv_htcaps: HT-specific device/driver capabilities | |
| 631 | * | |
| 632 | * NB: the low 16-bits are the 802.11 definitions, the upper | |
| 633 | * 16-bits are used to define s/w/driver capabilities. | |
| 634 | */ | |
| 635 | #define IEEE80211_HTC_AMPDU 0x00010000 /* CAPABILITY: A-MPDU tx */ | |
| 636 | #define IEEE80211_HTC_AMSDU 0x00020000 /* CAPABILITY: A-MSDU tx */ | |
| 637 | /* NB: HT40 is implied by IEEE80211_HTCAP_CHWIDTH40 */ | |
| 638 | #define IEEE80211_HTC_HT 0x00040000 /* CAPABILITY: HT operation */ | |
| 639 | #define IEEE80211_HTC_SMPS 0x00080000 /* CAPABILITY: MIMO power save*/ | |
| 640 | #define IEEE80211_HTC_RIFS 0x00100000 /* CAPABILITY: RIFS support */ | |
| 641 | ||
| 642 | #define IEEE80211_C_HTCAP_BITS \ | |
| 643 | "\20\1LDPC\2CHWIDTH40\5GREENFIELD\6SHORTGI20\7SHORTGI40\10TXSTBC" \ | |
| 644 | "\21AMPDU\22AMSDU\23HT\24SMPS\25RIFS" | |
| 645 | ||
| 646 | void ieee80211_ifattach(struct ieee80211com *, | |
| 647 | const uint8_t macaddr[IEEE80211_ADDR_LEN]); | |
| 841ab66c | 648 | void ieee80211_ifdetach(struct ieee80211com *); |
| 32176cfd RP |
649 | int ieee80211_vap_setup(struct ieee80211com *, struct ieee80211vap *, |
| 650 | const char name[IFNAMSIZ], int unit, int opmode, int flags, | |
| 651 | const uint8_t bssid[IEEE80211_ADDR_LEN], | |
| 652 | const uint8_t macaddr[IEEE80211_ADDR_LEN]); | |
| 653 | int ieee80211_vap_attach(struct ieee80211vap *, | |
| 841ab66c | 654 | ifm_change_cb_t, ifm_stat_cb_t); |
| 32176cfd RP |
655 | void ieee80211_vap_detach(struct ieee80211vap *); |
| 656 | const struct ieee80211_rateset *ieee80211_get_suprates(struct ieee80211com *ic, | |
| 657 | const struct ieee80211_channel *); | |
| 658 | void ieee80211_announce(struct ieee80211com *); | |
| 659 | void ieee80211_announce_channels(struct ieee80211com *); | |
| 660 | void ieee80211_drain(struct ieee80211com *); | |
| 661 | void ieee80211_media_init(struct ieee80211com *); | |
| 841ab66c | 662 | struct ieee80211com *ieee80211_find_vap(const uint8_t mac[IEEE80211_ADDR_LEN]); |
| f186073c JS |
663 | int ieee80211_media_change(struct ifnet *); |
| 664 | void ieee80211_media_status(struct ifnet *, struct ifmediareq *); | |
| 34a60cf6 | 665 | int ieee80211_ioctl(struct ifnet *, u_long, caddr_t, struct ucred *); |
| f186073c JS |
666 | int ieee80211_rate2media(struct ieee80211com *, int, |
| 667 | enum ieee80211_phymode); | |
| 668 | int ieee80211_media2rate(int); | |
| 32176cfd RP |
669 | int ieee80211_mhz2ieee(u_int, u_int); |
| 670 | int ieee80211_chan2ieee(struct ieee80211com *, | |
| 47f525a7 | 671 | const struct ieee80211_channel *); |
| f186073c | 672 | u_int ieee80211_ieee2mhz(u_int, u_int); |
| 32176cfd RP |
673 | struct ieee80211_channel *ieee80211_find_channel(struct ieee80211com *, |
| 674 | int freq, int flags); | |
| 675 | struct ieee80211_channel *ieee80211_find_channel_byieee(struct ieee80211com *, | |
| 676 | int ieee, int flags); | |
| f186073c | 677 | int ieee80211_setmode(struct ieee80211com *, enum ieee80211_phymode); |
| 32176cfd RP |
678 | enum ieee80211_phymode ieee80211_chan2mode(const struct ieee80211_channel *); |
| 679 | uint32_t ieee80211_mac_hash(const struct ieee80211com *, | |
| 680 | const uint8_t addr[IEEE80211_ADDR_LEN]); | |
| 681 | ||
| 682 | void ieee80211_radiotap_attach(struct ieee80211com *, | |
| 683 | struct ieee80211_radiotap_header *th, int tlen, | |
| 684 | uint32_t tx_radiotap, | |
| 685 | struct ieee80211_radiotap_header *rh, int rlen, | |
| 686 | uint32_t rx_radiotap); | |
| 687 | void ieee80211_radiotap_detach(struct ieee80211com *); | |
| 688 | void ieee80211_radiotap_vattach(struct ieee80211vap *); | |
| 689 | void ieee80211_radiotap_vdetach(struct ieee80211vap *); | |
| 690 | void ieee80211_radiotap_chan_change(struct ieee80211com *); | |
| 691 | void ieee80211_radiotap_tx(struct ieee80211vap *, struct mbuf *); | |
| 692 | void ieee80211_radiotap_rx(struct ieee80211vap *, struct mbuf *); | |
| 693 | void ieee80211_radiotap_rx_all(struct ieee80211com *, struct mbuf *); | |
| 694 | ||
| 695 | static __inline int | |
| 696 | ieee80211_radiotap_active(const struct ieee80211com *ic) | |
| 697 | { | |
| 698 | return (ic->ic_flags_ext & IEEE80211_FEXT_BPF) != 0; | |
| 699 | } | |
| 700 | ||
| 701 | static __inline int | |
| 702 | ieee80211_radiotap_active_vap(const struct ieee80211vap *vap) | |
| 703 | { | |
| 704 | return (vap->iv_flags_ext & IEEE80211_FEXT_BPF) || | |
| 705 | vap->iv_ic->ic_montaps != 0; | |
| 706 | } | |
| 707 | ||
| 708 | /* | |
| 709 | * Enqueue a task on the state thread. | |
| 710 | */ | |
| 711 | static __inline void | |
| 712 | ieee80211_runtask(struct ieee80211com *ic, struct task *task) | |
| 713 | { | |
| 714 | taskqueue_enqueue(ic->ic_tq, task); | |
| 715 | } | |
| f186073c | 716 | |
| 32176cfd RP |
717 | /* |
| 718 | * Wait for a queued task to complete. | |
| 719 | */ | |
| 720 | static __inline void | |
| 721 | ieee80211_draintask(struct ieee80211com *ic, struct task *task) | |
| 722 | { | |
| 723 | taskqueue_drain(ic->ic_tq, task); | |
| 724 | } | |
| 841ab66c SZ |
725 | |
| 726 | /* | |
| 727 | * Key update synchronization methods. XXX should not be visible. | |
| 728 | */ | |
| 729 | static __inline void | |
| 32176cfd | 730 | ieee80211_key_update_begin(struct ieee80211vap *vap) |
| 841ab66c | 731 | { |
| 32176cfd | 732 | vap->iv_key_update_begin(vap); |
| 841ab66c SZ |
733 | } |
| 734 | static __inline void | |
| 32176cfd | 735 | ieee80211_key_update_end(struct ieee80211vap *vap) |
| 841ab66c | 736 | { |
| 32176cfd | 737 | vap->iv_key_update_end(vap); |
| 841ab66c SZ |
738 | } |
| 739 | ||
| 740 | /* | |
| 741 | * XXX these need to be here for IEEE80211_F_DATAPAD | |
| 742 | */ | |
| 743 | ||
| 744 | /* | |
| 745 | * Return the space occupied by the 802.11 header and any | |
| 746 | * padding required by the driver. This works for a | |
| 747 | * management or data frame. | |
| 748 | */ | |
| 749 | static __inline int | |
| 750 | ieee80211_hdrspace(struct ieee80211com *ic, const void *data) | |
| 751 | { | |
| 752 | int size = ieee80211_hdrsize(data); | |
| 753 | if (ic->ic_flags & IEEE80211_F_DATAPAD) | |
| 754 | size = roundup(size, sizeof(uint32_t)); | |
| 755 | return size; | |
| 756 | } | |
| 757 | ||
| 758 | /* | |
| 759 | * Like ieee80211_hdrspace, but handles any type of frame. | |
| 760 | */ | |
| 761 | static __inline int | |
| 762 | ieee80211_anyhdrspace(struct ieee80211com *ic, const void *data) | |
| 763 | { | |
| 764 | int size = ieee80211_anyhdrsize(data); | |
| 765 | if (ic->ic_flags & IEEE80211_F_DATAPAD) | |
| 766 | size = roundup(size, sizeof(uint32_t)); | |
| 767 | return size; | |
| 768 | } | |
| 769 | ||
| 32176cfd RP |
770 | /* |
| 771 | * Notify a vap that beacon state has been updated. | |
| 772 | */ | |
| 773 | static __inline void | |
| 774 | ieee80211_beacon_notify(struct ieee80211vap *vap, int what) | |
| 775 | { | |
| 776 | if (vap->iv_state == IEEE80211_S_RUN) | |
| 777 | vap->iv_update_beacon(vap, what); | |
| 778 | } | |
| 820cef05 | 779 | |
| 32176cfd RP |
780 | /* |
| 781 | * Calculate HT channel promotion flags for a channel. | |
| 782 | * XXX belongs in ieee80211_ht.h but needs IEEE80211_FHT_* | |
| 783 | */ | |
| 784 | static __inline int | |
| 785 | ieee80211_htchanflags(const struct ieee80211_channel *c) | |
| 786 | { | |
| 787 | return IEEE80211_IS_CHAN_HT40(c) ? | |
| 788 | IEEE80211_FHT_HT | IEEE80211_FHT_USEHT40 : | |
| 789 | IEEE80211_IS_CHAN_HT(c) ? IEEE80211_FHT_HT : 0; | |
| 790 | } | |
| 791 | ||
| 792 | /* | |
| 793 | * Debugging facilities compiled in when IEEE80211_DEBUG is defined. | |
| 794 | * | |
| 795 | * The intent is that any problem in the net80211 layer can be | |
| 796 | * diagnosed by inspecting the statistics (dumped by the wlanstats | |
| 797 | * program) and/or the msgs generated by net80211. Messages are | |
| 798 | * broken into functional classes and can be controlled with the | |
| 799 | * wlandebug program. Certain of these msg groups are for facilities | |
| 800 | * that are no longer part of net80211 (e.g. IEEE80211_MSG_DOT1XSM). | |
| 801 | */ | |
| 802 | #define IEEE80211_MSG_11N 0x80000000 /* 11n mode debug */ | |
| 841ab66c SZ |
803 | #define IEEE80211_MSG_DEBUG 0x40000000 /* IFF_DEBUG equivalent */ |
| 804 | #define IEEE80211_MSG_DUMPPKTS 0x20000000 /* IFF_LINK2 equivalant */ | |
| 805 | #define IEEE80211_MSG_CRYPTO 0x10000000 /* crypto work */ | |
| 806 | #define IEEE80211_MSG_INPUT 0x08000000 /* input handling */ | |
| 807 | #define IEEE80211_MSG_XRATE 0x04000000 /* rate set handling */ | |
| 808 | #define IEEE80211_MSG_ELEMID 0x02000000 /* element id parsing */ | |
| 809 | #define IEEE80211_MSG_NODE 0x01000000 /* node handling */ | |
| 810 | #define IEEE80211_MSG_ASSOC 0x00800000 /* association handling */ | |
| 811 | #define IEEE80211_MSG_AUTH 0x00400000 /* authentication handling */ | |
| 812 | #define IEEE80211_MSG_SCAN 0x00200000 /* scanning */ | |
| 813 | #define IEEE80211_MSG_OUTPUT 0x00100000 /* output handling */ | |
| 814 | #define IEEE80211_MSG_STATE 0x00080000 /* state machine */ | |
| 815 | #define IEEE80211_MSG_POWER 0x00040000 /* power save handling */ | |
| 32176cfd | 816 | #define IEEE80211_MSG_HWMP 0x00020000 /* hybrid mesh protocol */ |
| 841ab66c SZ |
817 | #define IEEE80211_MSG_DOT1XSM 0x00010000 /* 802.1x state machine */ |
| 818 | #define IEEE80211_MSG_RADIUS 0x00008000 /* 802.1x radius client */ | |
| 819 | #define IEEE80211_MSG_RADDUMP 0x00004000 /* dump 802.1x radius packets */ | |
| 32176cfd | 820 | #define IEEE80211_MSG_MESH 0x00002000 /* mesh networking */ |
| 841ab66c SZ |
821 | #define IEEE80211_MSG_WPA 0x00001000 /* WPA/RSN protocol */ |
| 822 | #define IEEE80211_MSG_ACL 0x00000800 /* ACL handling */ | |
| 823 | #define IEEE80211_MSG_WME 0x00000400 /* WME protocol */ | |
| 824 | #define IEEE80211_MSG_SUPERG 0x00000200 /* Atheros SuperG protocol */ | |
| 825 | #define IEEE80211_MSG_DOTH 0x00000100 /* 802.11h support */ | |
| 826 | #define IEEE80211_MSG_INACT 0x00000080 /* inactivity handling */ | |
| 827 | #define IEEE80211_MSG_ROAM 0x00000040 /* sta-mode roaming */ | |
| 32176cfd RP |
828 | #define IEEE80211_MSG_RATECTL 0x00000020 /* tx rate control */ |
| 829 | #define IEEE80211_MSG_ACTION 0x00000010 /* action frame handling */ | |
| 830 | #define IEEE80211_MSG_WDS 0x00000008 /* WDS handling */ | |
| 831 | #define IEEE80211_MSG_IOCTL 0x00000004 /* ioctl handling */ | |
| 832 | #define IEEE80211_MSG_TDMA 0x00000002 /* TDMA handling */ | |
| 841ab66c SZ |
833 | |
| 834 | #define IEEE80211_MSG_ANY 0xffffffff /* anything */ | |
| 835 | ||
| 32176cfd RP |
836 | #define IEEE80211_MSG_BITS \ |
| 837 | "\20\2TDMA\3IOCTL\4WDS\5ACTION\6RATECTL\7ROAM\10INACT\11DOTH\12SUPERG" \ | |
| 838 | "\13WME\14ACL\15WPA\16RADKEYS\17RADDUMP\20RADIUS\21DOT1XSM\22HWMP" \ | |
| 839 | "\23POWER\24STATE\25OUTPUT\26SCAN\27AUTH\30ASSOC\31NODE\32ELEMID" \ | |
| 840 | "\33XRATE\34INPUT\35CRYPTO\36DUPMPKTS\37DEBUG\04011N" | |
| 820cef05 | 841 | |
| f186073c | 842 | #ifdef IEEE80211_DEBUG |
| 32176cfd RP |
843 | #define ieee80211_msg(_vap, _m) ((_vap)->iv_debug & (_m)) |
| 844 | #define IEEE80211_DPRINTF(_vap, _m, _fmt, ...) do { \ | |
| 845 | if (ieee80211_msg(_vap, _m)) \ | |
| 846 | ieee80211_note(_vap, _fmt, __VA_ARGS__); \ | |
| 476d885d | 847 | } while (0) |
| 32176cfd RP |
848 | #define IEEE80211_NOTE(_vap, _m, _ni, _fmt, ...) do { \ |
| 849 | if (ieee80211_msg(_vap, _m)) \ | |
| 850 | ieee80211_note_mac(_vap, (_ni)->ni_macaddr, _fmt, __VA_ARGS__);\ | |
| 841ab66c | 851 | } while (0) |
| 32176cfd RP |
852 | #define IEEE80211_NOTE_MAC(_vap, _m, _mac, _fmt, ...) do { \ |
| 853 | if (ieee80211_msg(_vap, _m)) \ | |
| 854 | ieee80211_note_mac(_vap, _mac, _fmt, __VA_ARGS__); \ | |
| 841ab66c | 855 | } while (0) |
| 32176cfd RP |
856 | #define IEEE80211_NOTE_FRAME(_vap, _m, _wh, _fmt, ...) do { \ |
| 857 | if (ieee80211_msg(_vap, _m)) \ | |
| 858 | ieee80211_note_frame(_vap, _wh, _fmt, __VA_ARGS__); \ | |
| 841ab66c | 859 | } while (0) |
| 4028af95 RP |
860 | void ieee80211_note(const struct ieee80211vap *, const char *, ...); |
| 861 | void ieee80211_note_mac(const struct ieee80211vap *, | |
| 32176cfd | 862 | const uint8_t mac[IEEE80211_ADDR_LEN], const char *, ...); |
| 4028af95 | 863 | void ieee80211_note_frame(const struct ieee80211vap *, |
| 32176cfd RP |
864 | const struct ieee80211_frame *, const char *, ...); |
| 865 | #define ieee80211_msg_debug(_vap) \ | |
| 866 | ((_vap)->iv_debug & IEEE80211_MSG_DEBUG) | |
| 867 | #define ieee80211_msg_dumppkts(_vap) \ | |
| 868 | ((_vap)->iv_debug & IEEE80211_MSG_DUMPPKTS) | |
| 869 | #define ieee80211_msg_input(_vap) \ | |
| 870 | ((_vap)->iv_debug & IEEE80211_MSG_INPUT) | |
| 871 | #define ieee80211_msg_radius(_vap) \ | |
| 872 | ((_vap)->iv_debug & IEEE80211_MSG_RADIUS) | |
| 873 | #define ieee80211_msg_dumpradius(_vap) \ | |
| 874 | ((_vap)->iv_debug & IEEE80211_MSG_RADDUMP) | |
| 875 | #define ieee80211_msg_dumpradkeys(_vap) \ | |
| 876 | ((_vap)->iv_debug & IEEE80211_MSG_RADKEYS) | |
| 877 | #define ieee80211_msg_scan(_vap) \ | |
| 878 | ((_vap)->iv_debug & IEEE80211_MSG_SCAN) | |
| 879 | #define ieee80211_msg_assoc(_vap) \ | |
| 880 | ((_vap)->iv_debug & IEEE80211_MSG_ASSOC) | |
| 881 | ||
| 882 | /* | |
| 883 | * Emit a debug message about discarding a frame or information | |
| 884 | * element. One format is for extracting the mac address from | |
| 885 | * the frame header; the other is for when a header is not | |
| 886 | * available or otherwise appropriate. | |
| 887 | */ | |
| 888 | #define IEEE80211_DISCARD(_vap, _m, _wh, _type, _fmt, ...) do { \ | |
| 889 | if ((_vap)->iv_debug & (_m)) \ | |
| 890 | ieee80211_discard_frame(_vap, _wh, _type, _fmt, __VA_ARGS__);\ | |
| 891 | } while (0) | |
| 892 | #define IEEE80211_DISCARD_IE(_vap, _m, _wh, _type, _fmt, ...) do { \ | |
| 893 | if ((_vap)->iv_debug & (_m)) \ | |
| 894 | ieee80211_discard_ie(_vap, _wh, _type, _fmt, __VA_ARGS__);\ | |
| 841ab66c | 895 | } while (0) |
| 32176cfd RP |
896 | #define IEEE80211_DISCARD_MAC(_vap, _m, _mac, _type, _fmt, ...) do { \ |
| 897 | if ((_vap)->iv_debug & (_m)) \ | |
| 898 | ieee80211_discard_mac(_vap, _mac, _type, _fmt, __VA_ARGS__);\ | |
| 899 | } while (0) | |
| 900 | ||
| 4028af95 | 901 | void ieee80211_discard_frame(const struct ieee80211vap *, |
| 32176cfd | 902 | const struct ieee80211_frame *, const char *type, const char *fmt, ...); |
| 4028af95 | 903 | void ieee80211_discard_ie(const struct ieee80211vap *, |
| 32176cfd | 904 | const struct ieee80211_frame *, const char *type, const char *fmt, ...); |
| 4028af95 | 905 | void ieee80211_discard_mac(const struct ieee80211vap *, |
| 32176cfd RP |
906 | const uint8_t mac[IEEE80211_ADDR_LEN], const char *type, |
| 907 | const char *fmt, ...); | |
| f186073c | 908 | #else |
| 32176cfd RP |
909 | #define IEEE80211_DPRINTF(_vap, _m, _fmt, ...) |
| 910 | #define IEEE80211_NOTE(_vap, _m, _ni, _fmt, ...) | |
| 911 | #define IEEE80211_NOTE_FRAME(_vap, _m, _wh, _fmt, ...) | |
| 912 | #define IEEE80211_NOTE_MAC(_vap, _m, _mac, _fmt, ...) | |
| 913 | #define ieee80211_msg_dumppkts(_vap) 0 | |
| 914 | #define ieee80211_msg(_vap, _m) 0 | |
| 915 | ||
| 916 | #define IEEE80211_DISCARD(_vap, _m, _wh, _type, _fmt, ...) | |
| 917 | #define IEEE80211_DISCARD_IE(_vap, _m, _wh, _type, _fmt, ...) | |
| 918 | #define IEEE80211_DISCARD_MAC(_vap, _m, _mac, _type, _fmt, ...) | |
| f186073c JS |
919 | #endif |
| 920 | ||
| 841ab66c | 921 | #endif /* _NET80211_IEEE80211_VAR_H_ */ |