1 /* $OpenBSD: ieee80211_ioctl.h,v 1.41 2020/10/06 07:23:15 gerhard Exp $ */ 2 /* $NetBSD: ieee80211_ioctl.h,v 1.7 2004/04/30 22:51:04 dyoung Exp $ */ 3 4 /*- 5 * Copyright (c) 2001 Atsushi Onoe 6 * Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. The name of the author may not be used to endorse or promote products 18 * derived from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 * 31 * $FreeBSD: src/sys/net80211/ieee80211_ioctl.h,v 1.5 2004/03/30 22:57:57 sam Exp $ 32 */ 33 #ifndef _NET80211_IEEE80211_IOCTL_H_ 34 #define _NET80211_IEEE80211_IOCTL_H_ 35 36 /* 37 * IEEE 802.11 ioctls. 38 */ 39 40 /* per-interface statistics */ 41 struct ieee80211_stats { 42 u_int32_t is_rx_badversion; /* rx frame with bad version */ 43 u_int32_t is_rx_tooshort; /* rx frame too short */ 44 u_int32_t is_rx_wrongbss; /* rx from wrong bssid */ 45 u_int32_t is_rx_dup; /* rx discard 'cuz dup */ 46 u_int32_t is_rx_wrongdir; /* rx w/ wrong direction */ 47 u_int32_t is_rx_mcastecho; /* rx discard 'cuz mcast echo */ 48 u_int32_t is_rx_notassoc; /* rx discard 'cuz sta !assoc */ 49 u_int32_t is_rx_nowep; /* rx w/ wep but wep !config */ 50 u_int32_t is_rx_unencrypted; /* rx w/o wep but wep config */ 51 u_int32_t is_rx_wepfail; /* rx wep processing failed */ 52 u_int32_t is_rx_decap; /* rx decapsulation failed */ 53 u_int32_t is_rx_mgtdiscard; /* rx discard mgt frames */ 54 u_int32_t is_rx_ctl; /* rx discard ctrl frames */ 55 u_int32_t is_rx_rstoobig; /* rx rate set truncated */ 56 u_int32_t is_rx_elem_missing; /* rx required element missing*/ 57 u_int32_t is_rx_elem_toobig; /* rx element too big */ 58 u_int32_t is_rx_elem_toosmall; /* rx element too small */ 59 u_int32_t is_rx_badchan; /* rx frame w/ invalid chan */ 60 u_int32_t is_rx_chanmismatch; /* rx frame chan mismatch */ 61 u_int32_t is_rx_nodealloc; /* rx frame dropped */ 62 u_int32_t is_rx_ssidmismatch; /* rx frame ssid mismatch */ 63 u_int32_t is_rx_auth_unsupported; /* rx w/ unsupported auth alg */ 64 u_int32_t is_rx_auth_fail; /* rx sta auth failure */ 65 u_int32_t is_rx_assoc_bss; /* rx assoc from wrong bssid */ 66 u_int32_t is_rx_assoc_notauth; /* rx assoc w/o auth */ 67 u_int32_t is_rx_assoc_capmismatch;/* rx assoc w/ cap mismatch */ 68 u_int32_t is_rx_assoc_norate; /* rx assoc w/ no rate match */ 69 u_int32_t is_rx_deauth; /* rx deauthentication */ 70 u_int32_t is_rx_disassoc; /* rx disassociation */ 71 u_int32_t is_rx_badsubtype; /* rx frame w/ unknown subtype*/ 72 u_int32_t is_rx_nombuf; /* rx failed for lack of mbuf */ 73 u_int32_t is_rx_decryptcrc; /* rx decrypt failed on crc */ 74 u_int32_t is_rx_ahdemo_mgt; /* rx discard ahdemo mgt frame*/ 75 u_int32_t is_rx_bad_auth; /* rx bad auth request */ 76 u_int32_t is_tx_nombuf; /* tx failed for lack of mbuf */ 77 u_int32_t is_tx_nonode; /* tx failed for no node */ 78 u_int32_t is_tx_unknownmgt; /* tx of unknown mgt frame */ 79 u_int32_t is_scan_active; /* active scans started */ 80 u_int32_t is_scan_passive; /* passive scans started */ 81 u_int32_t is_node_timeout; /* nodes timed out inactivity */ 82 u_int32_t is_crypto_nomem; /* no memory for crypto ctx */ 83 u_int32_t is_rx_assoc_badrsnie; /* rx assoc w/ bad RSN IE */ 84 u_int32_t is_rx_unauth; /* rx port not valid */ 85 u_int32_t is_tx_noauth; /* tx port not valid */ 86 u_int32_t is_rx_eapol_key; /* rx eapol-key frames */ 87 u_int32_t is_rx_eapol_replay; /* rx replayed eapol frames */ 88 u_int32_t is_rx_eapol_badmic; /* rx eapol frames w/ bad mic */ 89 u_int32_t is_rx_remmicfail; /* rx tkip remote mic fails */ 90 u_int32_t is_rx_locmicfail; /* rx tkip local mic fails */ 91 u_int32_t is_tkip_replays; 92 u_int32_t is_tkip_icv_errs; 93 u_int32_t is_ccmp_replays; 94 u_int32_t is_ccmp_dec_errs; 95 u_int32_t is_cmac_replays; 96 u_int32_t is_cmac_icv_errs; 97 u_int32_t is_pbac_errs; 98 u_int32_t is_ht_nego_no_mandatory_mcs; 99 u_int32_t is_ht_nego_no_basic_mcs; 100 u_int32_t is_ht_nego_bad_crypto; 101 u_int32_t is_ht_prot_change; 102 u_int32_t is_ht_rx_ba_agreements; 103 u_int32_t is_ht_tx_ba_agreements; 104 u_int32_t is_ht_rx_frame_below_ba_winstart; 105 u_int32_t is_ht_rx_frame_above_ba_winend; 106 u_int32_t is_ht_rx_ba_window_slide; 107 u_int32_t is_ht_rx_ba_window_jump; 108 u_int32_t is_ht_rx_ba_no_buf; 109 u_int32_t is_ht_rx_ba_frame_lost; 110 u_int32_t is_ht_rx_ba_window_gap_timeout; 111 u_int32_t is_ht_rx_ba_timeout; 112 u_int32_t is_ht_tx_ba_timeout; 113 }; 114 115 #define SIOCG80211STATS _IOWR('i', 242, struct ifreq) 116 117 /* network identifier (ESSID), nwid is pointed at by ifr.ifr_data */ 118 struct ieee80211_nwid { 119 u_int8_t i_len; 120 u_int8_t i_nwid[IEEE80211_NWID_LEN]; 121 }; 122 123 #define SIOCS80211NWID _IOWR('i', 230, struct ifreq) 124 #define SIOCG80211NWID _IOWR('i', 231, struct ifreq) 125 126 /* network key (WEP), the first member must be matched with struct ifreq */ 127 struct ieee80211_nwkey { 128 char i_name[IFNAMSIZ]; /* if_name, e.g. "wi0" */ 129 int i_wepon; /* wep enabled flag */ 130 int i_defkid; /* default encrypt key id */ 131 struct { 132 int i_keylen; 133 u_int8_t *i_keydat; 134 } i_key[IEEE80211_WEP_NKID]; 135 }; 136 137 #define IEEE80211_NWKEY_OPEN 0 /* No privacy */ 138 #define IEEE80211_NWKEY_WEP 1 /* WEP enabled */ 139 #define IEEE80211_NWKEY_EAP 2 /* EAP enabled */ 140 #define IEEE80211_NWKEY_PERSIST 0x100 /* designate persist keyset */ 141 142 #define SIOCS80211NWKEY _IOW('i', 232, struct ieee80211_nwkey) 143 #define SIOCG80211NWKEY _IOWR('i', 233, struct ieee80211_nwkey) 144 145 /* power management parameters */ 146 struct ieee80211_power { 147 char i_name[IFNAMSIZ]; /* if_name, e.g. "wi0" */ 148 int i_enabled; /* 1 == on, 0 == off */ 149 int i_maxsleep; /* max sleep in ms */ 150 }; 151 #define SIOCS80211POWER _IOW('i', 234, struct ieee80211_power) 152 #define SIOCG80211POWER _IOWR('i', 235, struct ieee80211_power) 153 154 #define IEEE80211_AUTH_NONE 0 155 #define IEEE80211_AUTH_OPEN 1 156 #define IEEE80211_AUTH_SHARED 2 157 158 /* channel request */ 159 struct ieee80211chanreq { 160 char i_name[IFNAMSIZ]; /* if_name, e.g. "wi0" */ 161 u_int16_t i_channel; 162 }; 163 164 #ifndef _KERNEL 165 /* 166 * Channels are specified by frequency and attributes. 167 */ 168 struct ieee80211_channel { 169 u_int16_t ic_freq; /* setting in MHz */ 170 u_int16_t ic_flags; /* see below */ 171 }; 172 173 /* 174 * Channel attributes (XXX must keep in sync with radiotap flags). 175 */ 176 #define IEEE80211_CHAN_CCK 0x0020 /* CCK channel */ 177 #define IEEE80211_CHAN_OFDM 0x0040 /* OFDM channel */ 178 #define IEEE80211_CHAN_2GHZ 0x0080 /* 2 GHz spectrum channel */ 179 #define IEEE80211_CHAN_5GHZ 0x0100 /* 5 GHz spectrum channel */ 180 #define IEEE80211_CHAN_PASSIVE 0x0200 /* Only passive scan allowed */ 181 #define IEEE80211_CHAN_DYN 0x0400 /* Dynamic CCK-OFDM channel */ 182 #define IEEE80211_CHAN_XR 0x1000 /* Extended range OFDM channel */ 183 #define IEEE80211_CHAN_HT 0x2000 /* 11n/HT channel */ 184 #endif /* !_KERNEL */ 185 186 struct ieee80211_chanreq_all { 187 char i_name[IFNAMSIZ]; /* if_name, e.g. "wi0" */ 188 struct ieee80211_channel *i_chans; 189 }; 190 191 #ifndef IEEE80211_CHAN_ANY 192 #define IEEE80211_CHAN_ANY 0xffff 193 #endif 194 195 #define SIOCS80211CHANNEL _IOW('i', 238, struct ieee80211chanreq) 196 #define SIOCG80211CHANNEL _IOWR('i', 239, struct ieee80211chanreq) 197 #define SIOCG80211ALLCHANS _IOWR('i', 215, struct ieee80211_chanreq_all) 198 199 /* BSS identifier */ 200 struct ieee80211_bssid { 201 char i_name[IFNAMSIZ]; /* if_name, e.g. "wi0" */ 202 u_int8_t i_bssid[IEEE80211_ADDR_LEN]; 203 }; 204 205 #define SIOCS80211BSSID _IOW('i', 240, struct ieee80211_bssid) 206 #define SIOCG80211BSSID _IOWR('i', 241, struct ieee80211_bssid) 207 208 /* transmit power */ 209 struct ieee80211_txpower { 210 char i_name[IFNAMSIZ]; /* if_name, e.g. "wi0" */ 211 int i_mode; /* auto, manual */ 212 int16_t i_val; /* dBm */ 213 }; 214 215 #define SIOCS80211TXPOWER _IOW('i', 243, struct ieee80211_txpower) 216 #define SIOCG80211TXPOWER _IOWR('i', 244, struct ieee80211_txpower) 217 218 #define IEEE80211_TXPOWER_MODE_FIXED 0 /* fixed tx power value */ 219 #define IEEE80211_TXPOWER_MODE_AUTO 1 /* auto level control */ 220 221 struct ieee80211_wpapsk { 222 char i_name[IFNAMSIZ]; /* if_name, e.g. "wi0" */ 223 int i_enabled; 224 u_int8_t i_psk[32]; 225 }; 226 227 #define SIOCS80211WPAPSK _IOW('i', 245, struct ieee80211_wpapsk) 228 #define SIOCG80211WPAPSK _IOWR('i', 246, struct ieee80211_wpapsk) 229 230 #define IEEE80211_WPA_PROTO_WPA1 0x01 231 #define IEEE80211_WPA_PROTO_WPA2 0x02 232 233 #define IEEE80211_WPA_CIPHER_NONE 0x00 234 #define IEEE80211_WPA_CIPHER_USEGROUP 0x01 235 #define IEEE80211_WPA_CIPHER_WEP40 0x02 236 #define IEEE80211_WPA_CIPHER_TKIP 0x04 237 #define IEEE80211_WPA_CIPHER_CCMP 0x08 238 #define IEEE80211_WPA_CIPHER_WEP104 0x10 239 #define IEEE80211_WPA_CIPHER_BIP 0x20 240 241 #define IEEE80211_WPA_AKM_PSK 0x01 242 #define IEEE80211_WPA_AKM_8021X 0x02 243 #define IEEE80211_WPA_AKM_SHA256_PSK 0x04 244 #define IEEE80211_WPA_AKM_SHA256_8021X 0x08 245 246 struct ieee80211_wpaparams { 247 char i_name[IFNAMSIZ]; /* if_name, e.g. "wi0" */ 248 int i_enabled; 249 u_int i_protos; 250 u_int i_akms; 251 u_int i_ciphers; 252 u_int i_groupcipher; 253 }; 254 255 #define SIOCS80211WPAPARMS _IOW('i', 247, struct ieee80211_wpaparams) 256 #define SIOCG80211WPAPARMS _IOWR('i', 248, struct ieee80211_wpaparams) 257 258 struct ieee80211_keyavail { 259 char i_name[IFNAMSIZ]; /* if_name, e.g. "wi0" */ 260 u_int8_t i_macaddr[IEEE80211_ADDR_LEN]; 261 u_int8_t i_key[32]; 262 u_int32_t i_lifetime; 263 }; 264 265 struct ieee80211_keyrun { 266 char i_name[IFNAMSIZ]; /* if_name, e.g. "wi0" */ 267 u_int8_t i_macaddr[IEEE80211_ADDR_LEN]; 268 }; 269 270 #define SIOCS80211KEYAVAIL _IOW('i', 251, struct ieee80211_keyavail) 271 #define SIOCS80211KEYRUN _IOW('i', 252, struct ieee80211_keyrun) 272 273 /* scan request (will block) */ 274 #define IEEE80211_SCAN_TIMEOUT 30 /* timeout in seconds */ 275 276 #define SIOCS80211SCAN _IOW('i', 210, struct ifreq) 277 278 #define SIOCG80211JOINALL _IOWR('i', 218, struct ieee80211_joinreq_all) 279 #define SIOCS80211JOIN _IOWR('i', 255, struct ifreq) 280 #define SIOCG80211JOIN _IOWR('i', 0, struct ifreq) 281 282 /* join is pointed at by ifr.ifr_data */ 283 struct ieee80211_join { 284 u_int8_t i_len; /* length of i_nwid */ 285 u_int8_t i_nwid[IEEE80211_NWID_LEN]; 286 u_int32_t i_flags; 287 288 struct ieee80211_wpaparams i_wpaparams; 289 struct ieee80211_wpapsk i_wpapsk; 290 struct ieee80211_nwkey i_nwkey; 291 }; 292 293 struct ieee80211_joinreq_all { 294 char ja_ifname[IFNAMSIZ]; 295 int ja_nodes; /* returned count */ 296 size_t ja_size; /* size of node buffer */ 297 struct ieee80211_join *ja_node; /* allocated node buffer */ 298 }; 299 300 301 #define IEEE80211_JOIN_SHOW 0x01 302 #define IEEE80211_JOIN_FOUND 0x02 303 #define IEEE80211_JOIN_DEL 0x04 304 #define IEEE80211_JOIN_NWKEY 0x08 305 #define IEEE80211_JOIN_WPA 0x10 306 #define IEEE80211_JOIN_WPAPSK 0x20 307 #define IEEE80211_JOIN_8021X 0x40 308 #define IEEE80211_JOIN_ANY 0x80 309 #define IEEE80211_JOIN_DEL_ALL 0x100 310 311 /* node and requests */ 312 struct ieee80211_nodereq { 313 char nr_ifname[IFNAMSIZ]; /* e.g. "ath0" */ 314 315 /* Node address and name information */ 316 u_int8_t nr_macaddr[IEEE80211_ADDR_LEN]; /* node lladdr */ 317 u_int8_t nr_bssid[IEEE80211_ADDR_LEN]; /* bssid */ 318 u_int8_t nr_nwid_len; /* ESSID length */ 319 u_int8_t nr_nwid[IEEE80211_NWID_LEN]; /* ESSID */ 320 321 /* Channel and rates */ 322 u_int16_t nr_channel; /* last channel */ 323 u_int16_t nr_chan_flags; /* channel flags */ 324 u_int8_t nr_nrates; /* rate count */ 325 u_int8_t nr_rates[IEEE80211_RATE_MAXSIZE]; /* rate set */ 326 327 /* Node status information */ 328 int8_t nr_rssi; /* received signal strength */ 329 int8_t nr_max_rssi; /* maximum rssi */ 330 u_int8_t nr_tstamp[8]; /* from last received beacon */ 331 u_int16_t nr_intval; /* beacon interval */ 332 u_int16_t nr_capinfo; /* capabilities */ 333 u_int8_t nr_erp; /* 11g only */ 334 u_int8_t nr_pwrsave; /* power saving mode */ 335 u_int16_t nr_associd; /* assoc response */ 336 u_int16_t nr_txseq; /* seq to be transmitted */ 337 u_int16_t nr_rxseq; /* seq previous received */ 338 u_int32_t nr_fails; /* failure count to associate */ 339 u_int32_t nr_inact; /* inactivity mark count */ 340 u_int8_t nr_txrate; /* index to nr_rates[] */ 341 u_int16_t nr_state; /* node state in the cache */ 342 343 /* RSN */ 344 u_int nr_rsnprotos; 345 u_int nr_rsnciphers; 346 u_int nr_rsnakms; 347 348 /* Node flags */ 349 u_int8_t nr_flags; 350 351 /* HT */ 352 uint16_t nr_htcaps; 353 uint8_t nr_rxmcs[howmany(80,NBBY)]; 354 uint16_t nr_max_rxrate; /* in Mb/s, 0 <= rate <= 1023 */ 355 uint8_t nr_tx_mcs_set; 356 357 /* HT / VHT */ 358 uint8_t nr_txmcs; 359 360 /* VHT */ 361 uint8_t nr_vht_ss; 362 363 u_int32_t nr_assoc_fail; /* association failure reasons */ 364 }; 365 366 #define IEEE80211_NODEREQ_STATE(_s) (1 << _s) 367 #define IEEE80211_NODEREQ_STATE_BITS \ 368 "\20\01CACHE\02BSS\03AUTH\04ASSOC\05COLLECT" 369 370 #define IEEE80211_NODEREQ_RSSI(_nr) \ 371 ((u_int)(((float)(_nr)->nr_rssi / (_nr)->nr_max_rssi) * 100)) 372 373 #define IEEE80211_NODEREQ_STA 0x00 /* station */ 374 #define IEEE80211_NODEREQ_AP 0x01 /* access point */ 375 #define IEEE80211_NODEREQ_AP_BSS 0x02 /* current bss access point */ 376 #define IEEE80211_NODEREQ_COPY 0x04 /* add node with flags */ 377 #define IEEE80211_NODEREQ_HT 0x08 /* HT negotiated */ 378 #define IEEE80211_NODEREQ_VHT 0x10 /* VHT negotiated */ 379 380 #define SIOCG80211NODE _IOWR('i', 211, struct ieee80211_nodereq) 381 #define SIOCS80211NODE _IOW('i', 212, struct ieee80211_nodereq) 382 #define SIOCS80211DELNODE _IOW('i', 213, struct ieee80211_nodereq) 383 384 #define IEEE80211_NODEREQ_ASSOCFAIL_CHAN 0x01 385 #define IEEE80211_NODEREQ_ASSOCFAIL_IBSS 0x02 386 #define IEEE80211_NODEREQ_ASSOCFAIL_PRIVACY 0x04 387 #define IEEE80211_NODEREQ_ASSOCFAIL_BASIC_RATE 0x08 388 #define IEEE80211_NODEREQ_ASSOCFAIL_ESSID 0x10 389 #define IEEE80211_NODEREQ_ASSOCFAIL_BSSID 0x20 390 #define IEEE80211_NODEREQ_ASSOCFAIL_WPA_PROTO 0x40 391 #define IEEE80211_NODEREQ_ASSOCFAIL_WPA_KEY 0x80 392 #define IEEE80211_NODEREQ_ASSOCFAIL_BITS \ 393 "\20\1!CHAN\2!IBSS\3!PRIVACY\4!BASICRATE\5!ESSID\6!BSSID\7!WPAPROTO" \ 394 "\10!WPAKEY" 395 396 /* get the entire node cache */ 397 struct ieee80211_nodereq_all { 398 char na_ifname[IFNAMSIZ]; /* e.g. "ath0" */ 399 400 int na_nodes; /* returned count */ 401 size_t na_size; /* size of node buffer */ 402 struct ieee80211_nodereq *na_node; /* allocated node buffer */ 403 404 /* Match nodes by flag */ 405 u_int8_t na_flags; /* IEEE80211_NODEREQ_* */ 406 }; 407 408 #define SIOCG80211ALLNODES _IOWR('i', 214, struct ieee80211_nodereq_all) 409 410 /* net80211 specific interface flags */ 411 #define IEEE80211_F_HIDENWID 0x00000001 /* CONF: hidden ssid mode */ 412 #define IEEE80211_F_NOBRIDGE 0x00000002 /* CONF: no internal bridging */ 413 #define IEEE80211_F_HOSTAPMASK 0x00000003 414 #define IEEE80211_F_STAYAUTH 0x00000004 /* CONF: ignore deauth */ 415 #define IEEE80211_F_NOMIMO 0x00000008 /* CONF: disable MIMO */ 416 #define IEEE80211_F_USERBITS "\20\01HIDENWID\02NOBRIDGE\03STAYAUTH\04NOMIMO" 417 418 struct ieee80211_flags { 419 const char *f_name; 420 u_int f_flag; 421 }; 422 423 #define IEEE80211_FLAGS { \ 424 { "hidenwid", IEEE80211_F_HIDENWID }, \ 425 { "nobridge", IEEE80211_F_NOBRIDGE }, \ 426 { "stayauth", IEEE80211_F_STAYAUTH }, \ 427 { "nomimo", IEEE80211_F_NOMIMO } \ 428 } 429 430 #define SIOCG80211FLAGS _IOWR('i', 216, struct ifreq) 431 #define SIOCS80211FLAGS _IOW('i', 217, struct ifreq) 432 433 #endif /* _NET80211_IEEE80211_IOCTL_H_ */ 434