1*50e8fe1cSstsp /* $OpenBSD: ieee80211_var.h,v 1.111 2022/03/14 15:07:24 stsp Exp $ */ 291b2158bSmillert /* $NetBSD: ieee80211_var.h,v 1.7 2004/05/06 03:07:10 dyoung Exp $ */ 391b2158bSmillert 491b2158bSmillert /*- 591b2158bSmillert * Copyright (c) 2001 Atsushi Onoe 691b2158bSmillert * Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting 791b2158bSmillert * All rights reserved. 891b2158bSmillert * 991b2158bSmillert * Redistribution and use in source and binary forms, with or without 1091b2158bSmillert * modification, are permitted provided that the following conditions 1191b2158bSmillert * are met: 1291b2158bSmillert * 1. Redistributions of source code must retain the above copyright 1391b2158bSmillert * notice, this list of conditions and the following disclaimer. 1491b2158bSmillert * 2. Redistributions in binary form must reproduce the above copyright 1591b2158bSmillert * notice, this list of conditions and the following disclaimer in the 1691b2158bSmillert * documentation and/or other materials provided with the distribution. 1791b2158bSmillert * 3. The name of the author may not be used to endorse or promote products 1891b2158bSmillert * derived from this software without specific prior written permission. 1991b2158bSmillert * 2091b2158bSmillert * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 2191b2158bSmillert * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2291b2158bSmillert * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2391b2158bSmillert * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2491b2158bSmillert * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2591b2158bSmillert * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2691b2158bSmillert * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2791b2158bSmillert * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2891b2158bSmillert * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2991b2158bSmillert * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3091b2158bSmillert * 3191b2158bSmillert * $FreeBSD: src/sys/net80211/ieee80211_var.h,v 1.15 2004/04/05 22:10:26 sam Exp $ 3291b2158bSmillert */ 3391b2158bSmillert #ifndef _NET80211_IEEE80211_VAR_H_ 3491b2158bSmillert #define _NET80211_IEEE80211_VAR_H_ 3591b2158bSmillert 3691b2158bSmillert /* 3791b2158bSmillert * Definitions for IEEE 802.11 drivers. 3891b2158bSmillert */ 3991b2158bSmillert 403834a12aSjsg #ifdef SMALL_KERNEL 413834a12aSjsg #define IEEE80211_STA_ONLY 1 423db37152Sdamien #endif 433834a12aSjsg 44e03e709cSdamien #include <sys/timeout.h> 45e03e709cSdamien 4691b2158bSmillert #include <net80211/ieee80211.h> 4791b2158bSmillert #include <net80211/ieee80211_crypto.h> 4891b2158bSmillert #include <net80211/ieee80211_ioctl.h> /* for ieee80211_stats */ 4991b2158bSmillert #include <net80211/ieee80211_node.h> 5091b2158bSmillert #include <net80211/ieee80211_proto.h> 5191b2158bSmillert 5291b2158bSmillert #define IEEE80211_CHAN_MAX 255 5391b2158bSmillert #define IEEE80211_CHAN_ANY 0xffff /* token for ``any channel'' */ 5491b2158bSmillert #define IEEE80211_CHAN_ANYC \ 5526bc3fa3Sstsp ((struct ieee80211_channel *) NULL) 5691b2158bSmillert 5791b2158bSmillert #define IEEE80211_TXPOWER_MAX 100 /* max power */ 58eb215967Sreyk #define IEEE80211_TXPOWER_MIN -50 /* kill radio (if possible) */ 5991b2158bSmillert 6006e069b5Sstsp #define IEEE80211_RSSI_THRES_2GHZ (-60) /* in dBm */ 6106e069b5Sstsp #define IEEE80211_RSSI_THRES_5GHZ (-70) /* in dBm */ 6206e069b5Sstsp #define IEEE80211_RSSI_THRES_RATIO_2GHZ 60 /* in percent */ 6306e069b5Sstsp #define IEEE80211_RSSI_THRES_RATIO_5GHZ 50 /* in percent */ 6406e069b5Sstsp 650140f0f1Sstsp #define IEEE80211_BGSCAN_FAIL_MAX 512 /* units of 500 msec */ 6606e069b5Sstsp 67b404c609Sstsp /* 68b404c609Sstsp * Missed beacon threshold: An access point has disappeared if this amount 69b404c609Sstsp * of consecutive beacons have been missed. 70b404c609Sstsp * This value needs to be high enough to avoid frequent re-connects to APs 71b404c609Sstsp * which suffer from occasional packet loss, and low enough to avoid a long 72b404c609Sstsp * delay before we start scanning when an AP has actually disappeared. 73b404c609Sstsp * 74b404c609Sstsp * The beacon interval is variable, but generally in the order of 100ms. 75b404c609Sstsp * So 30 beacons implies a grace period of about 3 seconds before we start 76b404c609Sstsp * searching for a new AP. 77b404c609Sstsp */ 78b404c609Sstsp #define IEEE80211_BEACON_MISS_THRES 30 /* units of beacons */ 79b404c609Sstsp 8091b2158bSmillert enum ieee80211_phytype { 8191b2158bSmillert IEEE80211_T_DS, /* direct sequence spread spectrum */ 8291b2158bSmillert IEEE80211_T_OFDM, /* frequency division multiplexing */ 83972ced69Sderaadt IEEE80211_T_XR /* extended range mode */ 8491b2158bSmillert }; 8591b2158bSmillert #define IEEE80211_T_CCK IEEE80211_T_DS /* more common nomenclature */ 8691b2158bSmillert 8791b2158bSmillert /* XXX not really a mode; there are really multiple PHY's */ 8891b2158bSmillert enum ieee80211_phymode { 8991b2158bSmillert IEEE80211_MODE_AUTO = 0, /* autoselect */ 9091b2158bSmillert IEEE80211_MODE_11A = 1, /* 5GHz, OFDM */ 9191b2158bSmillert IEEE80211_MODE_11B = 2, /* 2GHz, CCK */ 9291b2158bSmillert IEEE80211_MODE_11G = 3, /* 2GHz, OFDM */ 9350d1a4aeSstsp IEEE80211_MODE_11N = 4, /* 2GHz/5GHz, OFDM/HT */ 9450d1a4aeSstsp IEEE80211_MODE_11AC = 5, /* 5GHz, OFDM/VHT */ 9591b2158bSmillert }; 9650d1a4aeSstsp #define IEEE80211_MODE_MAX (IEEE80211_MODE_11AC+1) 9791b2158bSmillert 9891b2158bSmillert enum ieee80211_opmode { 9991b2158bSmillert IEEE80211_M_STA = 1, /* infrastructure station */ 100171ac09aSdamien #ifndef IEEE80211_STA_ONLY 10191b2158bSmillert IEEE80211_M_IBSS = 0, /* IBSS (adhoc) station */ 10291b2158bSmillert IEEE80211_M_AHDEMO = 3, /* Old lucent compatible adhoc demo */ 10391b2158bSmillert IEEE80211_M_HOSTAP = 6, /* Software Access Point */ 104171ac09aSdamien #endif 10591b2158bSmillert IEEE80211_M_MONITOR = 8 /* Monitor mode */ 10691b2158bSmillert }; 10791b2158bSmillert 10891b2158bSmillert /* 10991b2158bSmillert * 802.11g protection mode. 11091b2158bSmillert */ 11191b2158bSmillert enum ieee80211_protmode { 11291b2158bSmillert IEEE80211_PROT_NONE = 0, /* no protection */ 11391b2158bSmillert IEEE80211_PROT_CTSONLY = 1, /* CTS to self */ 114972ced69Sderaadt IEEE80211_PROT_RTSCTS = 2 /* RTS-CTS */ 11591b2158bSmillert }; 11691b2158bSmillert 11791b2158bSmillert /* 11891b2158bSmillert * Channels are specified by frequency and attributes. 11991b2158bSmillert */ 12091b2158bSmillert struct ieee80211_channel { 121e959411aStom u_int16_t ic_freq; /* setting in MHz */ 12291b2158bSmillert u_int16_t ic_flags; /* see below */ 123*50e8fe1cSstsp u_int32_t ic_xflags; /* extra flags; see below */ 12491b2158bSmillert }; 12591b2158bSmillert 126a32f7078Sdamien /* 127a32f7078Sdamien * Channel attributes (XXX must keep in sync with radiotap flags). 128a32f7078Sdamien */ 129a32f7078Sdamien #define IEEE80211_CHAN_CCK 0x0020 /* CCK channel */ 130a32f7078Sdamien #define IEEE80211_CHAN_OFDM 0x0040 /* OFDM channel */ 131a32f7078Sdamien #define IEEE80211_CHAN_2GHZ 0x0080 /* 2 GHz spectrum channel */ 132a32f7078Sdamien #define IEEE80211_CHAN_5GHZ 0x0100 /* 5 GHz spectrum channel */ 133a32f7078Sdamien #define IEEE80211_CHAN_PASSIVE 0x0200 /* Only passive scan allowed */ 134a32f7078Sdamien #define IEEE80211_CHAN_DYN 0x0400 /* Dynamic CCK-OFDM channel */ 135a32f7078Sdamien #define IEEE80211_CHAN_XR 0x1000 /* Extended range OFDM channel */ 136ebc1d5f7Sstsp #define IEEE80211_CHAN_HT 0x2000 /* 11n/HT channel */ 13750d1a4aeSstsp #define IEEE80211_CHAN_VHT 0x4000 /* 11ac/VHT channel */ 138ca785ca0Sstsp #define IEEE80211_CHAN_40MHZ 0x8000 /* use of 40 MHz is allowed */ 139a32f7078Sdamien 140a32f7078Sdamien /* 141*50e8fe1cSstsp * Extra channel flags. 142*50e8fe1cSstsp */ 143*50e8fe1cSstsp #define IEEE80211_CHANX_80MHZ 0x00000001 /* use of 80 MHz is allowed */ 144*50e8fe1cSstsp #define IEEE80211_CHANX_160MHZ 0x00000002 /* use of 160 MHz is allowed */ 145*50e8fe1cSstsp 146*50e8fe1cSstsp /* 147a32f7078Sdamien * Useful combinations of channel characteristics. 148a32f7078Sdamien */ 149a32f7078Sdamien #define IEEE80211_CHAN_A \ 150a32f7078Sdamien (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM) 151a32f7078Sdamien #define IEEE80211_CHAN_B \ 152a32f7078Sdamien (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK) 153a32f7078Sdamien #define IEEE80211_CHAN_PUREG \ 154a32f7078Sdamien (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM) 155a32f7078Sdamien #define IEEE80211_CHAN_G \ 156a32f7078Sdamien (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN) 157a32f7078Sdamien 15891b2158bSmillert #define IEEE80211_IS_CHAN_A(_c) \ 15991b2158bSmillert (((_c)->ic_flags & IEEE80211_CHAN_A) == IEEE80211_CHAN_A) 16091b2158bSmillert #define IEEE80211_IS_CHAN_B(_c) \ 16191b2158bSmillert (((_c)->ic_flags & IEEE80211_CHAN_B) == IEEE80211_CHAN_B) 16291b2158bSmillert #define IEEE80211_IS_CHAN_PUREG(_c) \ 16391b2158bSmillert (((_c)->ic_flags & IEEE80211_CHAN_PUREG) == IEEE80211_CHAN_PUREG) 16491b2158bSmillert #define IEEE80211_IS_CHAN_G(_c) \ 16591b2158bSmillert (((_c)->ic_flags & IEEE80211_CHAN_G) == IEEE80211_CHAN_G) 166ebc1d5f7Sstsp #define IEEE80211_IS_CHAN_N(_c) \ 167ebc1d5f7Sstsp (((_c)->ic_flags & IEEE80211_CHAN_HT) == IEEE80211_CHAN_HT) 16850d1a4aeSstsp #define IEEE80211_IS_CHAN_AC(_c) \ 16950d1a4aeSstsp (((_c)->ic_flags & IEEE80211_CHAN_VHT) == IEEE80211_CHAN_VHT) 17091b2158bSmillert 17191b2158bSmillert #define IEEE80211_IS_CHAN_2GHZ(_c) \ 17291b2158bSmillert (((_c)->ic_flags & IEEE80211_CHAN_2GHZ) != 0) 17391b2158bSmillert #define IEEE80211_IS_CHAN_5GHZ(_c) \ 17491b2158bSmillert (((_c)->ic_flags & IEEE80211_CHAN_5GHZ) != 0) 17591b2158bSmillert #define IEEE80211_IS_CHAN_OFDM(_c) \ 17691b2158bSmillert (((_c)->ic_flags & IEEE80211_CHAN_OFDM) != 0) 17791b2158bSmillert #define IEEE80211_IS_CHAN_CCK(_c) \ 17891b2158bSmillert (((_c)->ic_flags & IEEE80211_CHAN_CCK) != 0) 1790fd4e251Sreyk #define IEEE80211_IS_CHAN_XR(_c) \ 1800fd4e251Sreyk (((_c)->ic_flags & IEEE80211_CHAN_XR) != 0) 18191b2158bSmillert 182*50e8fe1cSstsp #define IEEE80211_CHAN_40MHZ_ALLOWED(_c) \ 183*50e8fe1cSstsp (((_c)->ic_flags & IEEE80211_CHAN_40MHZ) != 0) 184*50e8fe1cSstsp #define IEEE80211_CHAN_80MHZ_ALLOWED(_c) \ 185*50e8fe1cSstsp (((_c)->ic_xflags & IEEE80211_CHANX_80MHZ) != 0) 186*50e8fe1cSstsp #define IEEE80211_CHAN_160MHZ_ALLOWED(_c) \ 187*50e8fe1cSstsp (((_c)->ic_xflags & IEEE80211_CHANX_160MHZ) != 0) 188*50e8fe1cSstsp 1893b874289Sdamien /* 190361aed72Sdamien * EDCA AC parameters. 1913b874289Sdamien */ 1923b874289Sdamien struct ieee80211_edca_ac_params { 193e8940567Sdamien u_int8_t ac_ecwmin; /* CWmin = 2^ECWmin - 1 */ 194e8940567Sdamien u_int8_t ac_ecwmax; /* CWmax = 2^ECWmax - 1 */ 195e8940567Sdamien u_int8_t ac_aifsn; 196e8940567Sdamien u_int16_t ac_txoplimit; /* 32TU */ 1973b874289Sdamien #define IEEE80211_TXOP_TO_US(txop) ((txop) * 32) 198e8940567Sdamien 199e8940567Sdamien u_int8_t ac_acm; 2003b874289Sdamien }; 2013b874289Sdamien 202e8f8f56cSstsp extern const struct ieee80211_edca_ac_params 203fca238d4Sstsp ieee80211_edca_table[IEEE80211_MODE_MAX][EDCA_NUM_AC]; 204fca238d4Sstsp extern const struct ieee80211_edca_ac_params 205e8f8f56cSstsp ieee80211_qap_edca_table[IEEE80211_MODE_MAX][EDCA_NUM_AC]; 206e8f8f56cSstsp 2070c2a2ba1Sdamien #define IEEE80211_DEFRAG_SIZE 3 /* must be >= 3 according to spec */ 2080c2a2ba1Sdamien /* 2090c2a2ba1Sdamien * Entry in the fragment cache. 2100c2a2ba1Sdamien */ 2110c2a2ba1Sdamien struct ieee80211_defrag { 2120c2a2ba1Sdamien struct timeout df_to; 2130c2a2ba1Sdamien struct mbuf *df_m; 2140c2a2ba1Sdamien u_int16_t df_seq; 2150c2a2ba1Sdamien u_int8_t df_frag; 2160c2a2ba1Sdamien }; 2170c2a2ba1Sdamien 218e03e709cSdamien #define IEEE80211_PROTO_NONE 0 219e03e709cSdamien #define IEEE80211_PROTO_RSN (1 << 0) 220e03e709cSdamien #define IEEE80211_PROTO_WPA (1 << 1) 221e03e709cSdamien 22214207dadSreyk #define IEEE80211_SCAN_UNLOCKED 0x0 22314207dadSreyk #define IEEE80211_SCAN_LOCKED 0x1 22414207dadSreyk #define IEEE80211_SCAN_REQUEST 0x2 22514207dadSreyk #define IEEE80211_SCAN_RESUME 0x4 22614207dadSreyk 2270cf6590dSdamien #define IEEE80211_GROUP_NKID 6 2280cf6590dSdamien 229de9c1173Sstsp struct ieee80211_node_switch_bss_arg; 230de9c1173Sstsp 23191b2158bSmillert struct ieee80211com { 23291b2158bSmillert struct arpcom ic_ac; 2330fd4e251Sreyk LIST_ENTRY(ieee80211com) ic_list; /* chain of all ieee80211com */ 23491b2158bSmillert void (*ic_recv_mgmt)(struct ieee80211com *, 23591b2158bSmillert struct mbuf *, struct ieee80211_node *, 23630d05aacSdamien struct ieee80211_rxinfo *, int); 23791b2158bSmillert int (*ic_send_mgmt)(struct ieee80211com *, 23845eec175Sdamien struct ieee80211_node *, int, int, int); 23991b2158bSmillert int (*ic_newstate)(struct ieee80211com *, 24091b2158bSmillert enum ieee80211_state, int); 2413d9d8072Sstsp int (*ic_newauth)(struct ieee80211com *, 2423d9d8072Sstsp struct ieee80211_node *, int, uint16_t); 24391b2158bSmillert void (*ic_newassoc)(struct ieee80211com *, 24491b2158bSmillert struct ieee80211_node *, int); 245a2be7d77Sdamien void (*ic_node_leave)(struct ieee80211com *, 246a2be7d77Sdamien struct ieee80211_node *); 2471bb78573Sdamien void (*ic_updateslot)(struct ieee80211com *); 2482ca7f10eSdamien void (*ic_updateedca)(struct ieee80211com *); 249158c4605Sdamien void (*ic_set_tim)(struct ieee80211com *, int, int); 25013cad6cdSdamien int (*ic_set_key)(struct ieee80211com *, 25113cad6cdSdamien struct ieee80211_node *, 252e03e709cSdamien struct ieee80211_key *); 25313cad6cdSdamien void (*ic_delete_key)(struct ieee80211com *, 254e03e709cSdamien struct ieee80211_node *, 255e03e709cSdamien struct ieee80211_key *); 256ec69e05aSdamien int (*ic_ampdu_tx_start)(struct ieee80211com *, 25745eec175Sdamien struct ieee80211_node *, u_int8_t); 258ec69e05aSdamien void (*ic_ampdu_tx_stop)(struct ieee80211com *, 259ec69e05aSdamien struct ieee80211_node *, u_int8_t); 260ec69e05aSdamien int (*ic_ampdu_rx_start)(struct ieee80211com *, 261ec69e05aSdamien struct ieee80211_node *, u_int8_t); 262ec69e05aSdamien void (*ic_ampdu_rx_stop)(struct ieee80211com *, 26345eec175Sdamien struct ieee80211_node *, u_int8_t); 26409268e1fSstsp void (*ic_updateprot)(struct ieee80211com *); 26588290e74Sstsp void (*ic_updatechan)(struct ieee80211com *); 2667b7ad45cSstsp void (*ic_updatedtim)(struct ieee80211com *); 26706e069b5Sstsp int (*ic_bgscan_start)(struct ieee80211com *); 268de9c1173Sstsp void (*ic_bgscan_done)(struct ieee80211com *, 269de9c1173Sstsp struct ieee80211_node_switch_bss_arg *, 270de9c1173Sstsp size_t); 27106e069b5Sstsp struct timeout ic_bgscan_timeout; 27206e069b5Sstsp uint32_t ic_bgscan_fail; 27391b2158bSmillert u_int8_t ic_myaddr[IEEE80211_ADDR_LEN]; 27491b2158bSmillert struct ieee80211_rateset ic_sup_rates[IEEE80211_MODE_MAX]; 27591b2158bSmillert struct ieee80211_channel ic_channels[IEEE80211_CHAN_MAX+1]; 276966ef700Sdamien u_char ic_chan_avail[howmany(IEEE80211_CHAN_MAX,NBBY)]; 277966ef700Sdamien u_char ic_chan_active[howmany(IEEE80211_CHAN_MAX, NBBY)]; 278966ef700Sdamien u_char ic_chan_scan[howmany(IEEE80211_CHAN_MAX,NBBY)]; 279351e1934Sdlg struct mbuf_queue ic_mgtq; 280351e1934Sdlg struct mbuf_queue ic_pwrsaveq; 28114207dadSreyk u_int8_t ic_scan_count; /* count scans */ 28291b2158bSmillert u_int32_t ic_flags; /* state flags */ 28306e069b5Sstsp u_int32_t ic_xflags; /* more flags */ 284534bf8f4Sstsp u_int32_t ic_userflags; /* yet more flags */ 28591b2158bSmillert u_int32_t ic_caps; /* capabilities */ 28691b2158bSmillert u_int16_t ic_modecaps; /* set of mode capabilities */ 28791b2158bSmillert u_int16_t ic_curmode; /* current mode */ 28891b2158bSmillert enum ieee80211_phytype ic_phytype; /* XXX wrong for multi-mode */ 28991b2158bSmillert enum ieee80211_opmode ic_opmode; /* operation mode */ 29091b2158bSmillert enum ieee80211_state ic_state; /* 802.11 state */ 2910fd4e251Sreyk u_int32_t *ic_aid_bitmap; 29291b2158bSmillert u_int16_t ic_max_aid; 2931c062f30Sstsp enum ieee80211_protmode ic_protmode; /* 802.11g/n protection mode */ 29491b2158bSmillert struct ifmedia ic_media; /* interface media config */ 29591b2158bSmillert caddr_t ic_rawbpf; /* packet filter structure */ 29691b2158bSmillert struct ieee80211_node *ic_bss; /* information for this node */ 29791b2158bSmillert struct ieee80211_channel *ic_ibss_chan; 29891b2158bSmillert int ic_fixed_rate; /* index to ic_sup_rates[] */ 29991b2158bSmillert u_int16_t ic_rtsthreshold; 30091b2158bSmillert u_int16_t ic_fragthreshold; 30191b2158bSmillert u_int ic_scangen; /* gen# for timeout scan */ 30291b2158bSmillert struct ieee80211_node *(*ic_node_alloc)(struct ieee80211com *); 30391b2158bSmillert void (*ic_node_free)(struct ieee80211com *, 30491b2158bSmillert struct ieee80211_node *); 30591b2158bSmillert void (*ic_node_copy)(struct ieee80211com *, 30691b2158bSmillert struct ieee80211_node *, 30791b2158bSmillert const struct ieee80211_node *); 30891b2158bSmillert u_int8_t (*ic_node_getrssi)(struct ieee80211com *, 309f22d9adcSdamien const struct ieee80211_node *); 31006e069b5Sstsp int (*ic_node_checkrssi)(struct ieee80211com *, 31106e069b5Sstsp const struct ieee80211_node *); 31277e58062Sreyk u_int8_t ic_max_rssi; 3133ce67372Sreyk struct ieee80211_tree ic_tree; 3140fd4e251Sreyk int ic_nnodes; /* length of ic_nnodes */ 3150fd4e251Sreyk int ic_max_nnodes; /* max length of ic_nnodes */ 31691b2158bSmillert u_int16_t ic_lintval; /* listen interval */ 317eb215967Sreyk int16_t ic_txpower; /* tx power setting (dBm) */ 318c6fb4e3cSstsp int ic_bmissthres; /* beacon miss threshold */ 31991b2158bSmillert int ic_mgt_timer; /* mgmt timeout */ 3209c2641a5Sstsp #ifndef IEEE80211_STA_ONLY 3219c2641a5Sstsp struct timeout ic_inact_timeout; /* node inactivity timeout */ 3229c2641a5Sstsp struct timeout ic_node_cache_timeout; 3239c2641a5Sstsp #endif 324e798b40eSstsp struct task ic_rtm_80211info_task; 32591b2158bSmillert int ic_des_esslen; 32691b2158bSmillert u_int8_t ic_des_essid[IEEE80211_NWID_LEN]; 32791b2158bSmillert struct ieee80211_channel *ic_des_chan; /* desired channel */ 32891b2158bSmillert u_int8_t ic_des_bssid[IEEE80211_ADDR_LEN]; 3290cf6590dSdamien struct ieee80211_key ic_nw_keys[IEEE80211_GROUP_NKID]; 3300cf6590dSdamien int ic_def_txkey; /* group data key index */ 331e03e709cSdamien #define ic_wep_txkey ic_def_txkey 3320cf6590dSdamien int ic_igtk_kid; /* IGTK key index */ 33391b2158bSmillert u_int32_t ic_iv; /* initial vector for wep */ 33491b2158bSmillert struct ieee80211_stats ic_stats; /* statistics */ 3357ad39289Sreyk struct timeval ic_last_merge_print; /* for rate-limiting 3367ad39289Sreyk * IBSS merge print-outs 3377ad39289Sreyk */ 338e8940567Sdamien struct ieee80211_edca_ac_params ic_edca_ac[EDCA_NUM_AC]; 339e8940567Sdamien u_int ic_edca_updtcount; 340ce7deb45Sdamien u_int16_t ic_tid_noack; 3411d45b923Sdamien u_int8_t ic_globalcnt[EAPOL_KEY_NONCE_LEN]; 342e03e709cSdamien u_int8_t ic_nonce[EAPOL_KEY_NONCE_LEN]; 34365ec0f04Sdamien u_int8_t ic_psk[IEEE80211_PMK_LEN]; 344e03e709cSdamien struct timeout ic_rsn_timeout; 345a03326bbScheloha time_t ic_tkip_micfail; 3463b819ab4Sdjm u_int64_t ic_tkip_micfail_last_tsc; 347dd6ea6d2Sstsp #ifndef IEEE80211_STA_ONLY 348dd6ea6d2Sstsp struct timeout ic_tkip_micfail_timeout; 349dd6ea6d2Sstsp #endif 350e03e709cSdamien 351f91ff320Sdamien TAILQ_HEAD(, ieee80211_pmk) ic_pmksa; /* PMKSA cache */ 352e03e709cSdamien u_int ic_rsnprotos; 353e03e709cSdamien u_int ic_rsnakms; 354e03e709cSdamien u_int ic_rsnciphers; 355e03e709cSdamien enum ieee80211_cipher ic_rsngroupcipher; 3560cf6590dSdamien enum ieee80211_cipher ic_rsngroupmgmtcipher; 357ece40bdcSdamien 3584d38a678Sstsp #ifdef notyet 3590c2a2ba1Sdamien struct ieee80211_defrag ic_defrag[IEEE80211_DEFRAG_SIZE]; 3600c2a2ba1Sdamien int ic_defrag_cur; 3614d38a678Sstsp #endif 3620c2a2ba1Sdamien 363ece40bdcSdamien u_int8_t *ic_tim_bitmap; 364ece40bdcSdamien u_int ic_tim_len; 36593d01030Sdamien u_int ic_tim_mcast_pending; 366ece40bdcSdamien u_int ic_dtim_period; 367ece40bdcSdamien u_int ic_dtim_count; 36845eec175Sdamien 36945eec175Sdamien u_int32_t ic_txbfcaps; 37045eec175Sdamien u_int16_t ic_htcaps; 371bb1f4a0cSstsp u_int8_t ic_ampdu_params; 372ebc1d5f7Sstsp u_int8_t ic_sup_mcs[howmany(80, NBBY)]; 373ebc1d5f7Sstsp u_int16_t ic_max_rxrate; /* in Mb/s, 0 <= rate <= 1023 */ 374ebc1d5f7Sstsp u_int8_t ic_tx_mcs_set; 37545eec175Sdamien u_int16_t ic_htxcaps; 37645eec175Sdamien u_int8_t ic_aselcaps; 37745eec175Sdamien u_int8_t ic_dialog_token; 378ebc1d5f7Sstsp int ic_fixed_mcs; 379*50e8fe1cSstsp 380*50e8fe1cSstsp uint32_t ic_vhtcaps; 381*50e8fe1cSstsp uint16_t ic_vht_rxmcs; 382*50e8fe1cSstsp uint16_t ic_vht_rx_max_lgi_mbit_s; 383*50e8fe1cSstsp uint16_t ic_vht_txmcs; 384*50e8fe1cSstsp uint16_t ic_vht_tx_max_lgi_mbit_s; 385*50e8fe1cSstsp 386020402a2Sphessler TAILQ_HEAD(, ieee80211_ess) ic_ess; 38791b2158bSmillert }; 38891b2158bSmillert #define ic_if ic_ac.ac_if 38991b2158bSmillert #define ic_softc ic_if.if_softc 39091b2158bSmillert 391020402a2Sphessler /* list of APs we want to automatically use */ 392020402a2Sphessler /* all data is copied from struct ieee80211com */ 393020402a2Sphessler struct ieee80211_ess { 394020402a2Sphessler /* nwid */ 395020402a2Sphessler int esslen; 396020402a2Sphessler u_int8_t essid[IEEE80211_NWID_LEN]; 397020402a2Sphessler 398020402a2Sphessler /* clear/wep/wpa */ 399020402a2Sphessler u_int32_t flags; 400020402a2Sphessler 401020402a2Sphessler /* nwkey */ 402020402a2Sphessler struct ieee80211_key nw_keys[IEEE80211_GROUP_NKID]; 403020402a2Sphessler int def_txkey; 404020402a2Sphessler 405020402a2Sphessler /* wpakey */ 406020402a2Sphessler u_int8_t psk[IEEE80211_PMK_LEN]; 407020402a2Sphessler u_int rsnprotos; 408020402a2Sphessler u_int rsnakms; 409020402a2Sphessler u_int rsnciphers; 410020402a2Sphessler enum ieee80211_cipher rsngroupcipher; 411020402a2Sphessler 412020402a2Sphessler TAILQ_ENTRY(ieee80211_ess) ess_next; 413020402a2Sphessler }; 414020402a2Sphessler 41591b2158bSmillert #define IEEE80211_ADDR_EQ(a1,a2) (memcmp(a1,a2,IEEE80211_ADDR_LEN) == 0) 41691b2158bSmillert #define IEEE80211_ADDR_COPY(dst,src) memcpy(dst,src,IEEE80211_ADDR_LEN) 41791b2158bSmillert 41891b2158bSmillert /* ic_flags */ 41991b2158bSmillert #define IEEE80211_F_ASCAN 0x00000001 /* STATUS: active scan */ 42091b2158bSmillert #define IEEE80211_F_SIBSS 0x00000002 /* STATUS: start IBSS */ 42191b2158bSmillert #define IEEE80211_F_WEPON 0x00000100 /* CONF: WEP enabled */ 42291b2158bSmillert #define IEEE80211_F_IBSSON 0x00000200 /* CONF: IBSS creation enable */ 42391b2158bSmillert #define IEEE80211_F_PMGTON 0x00000400 /* CONF: Power mgmt enable */ 42491b2158bSmillert #define IEEE80211_F_DESBSSID 0x00000800 /* CONF: des_bssid is set */ 42591b2158bSmillert #define IEEE80211_F_ROAMING 0x00002000 /* CONF: roaming enabled */ 42691b2158bSmillert #define IEEE80211_F_TXPMGT 0x00018000 /* STATUS: tx power */ 42791b2158bSmillert #define IEEE80211_F_TXPOW_OFF 0x00000000 /* TX Power: radio disabled */ 42891b2158bSmillert #define IEEE80211_F_TXPOW_FIXED 0x00008000 /* TX Power: fixed rate */ 42991b2158bSmillert #define IEEE80211_F_TXPOW_AUTO 0x00010000 /* TX Power: undefined */ 4301bb78573Sdamien #define IEEE80211_F_SHSLOT 0x00020000 /* STATUS: short slot time */ 4311bb78573Sdamien #define IEEE80211_F_SHPREAMBLE 0x00040000 /* STATUS: short preamble */ 4322ca7f10eSdamien #define IEEE80211_F_QOS 0x00080000 /* CONF: QoS enabled */ 43391b2158bSmillert #define IEEE80211_F_USEPROT 0x00100000 /* STATUS: protection enabled */ 434e03e709cSdamien #define IEEE80211_F_RSNON 0x00200000 /* CONF: RSN enabled */ 435e03e709cSdamien #define IEEE80211_F_PSK 0x00400000 /* CONF: pre-shared key set */ 436e03e709cSdamien #define IEEE80211_F_COUNTERM 0x00800000 /* STATUS: countermeasures */ 43745eec175Sdamien #define IEEE80211_F_MFPR 0x01000000 /* CONF: MFP required */ 43845eec175Sdamien #define IEEE80211_F_HTON 0x02000000 /* CONF: HT enabled */ 43945eec175Sdamien #define IEEE80211_F_PBAR 0x04000000 /* CONF: PBAC required */ 44006e069b5Sstsp #define IEEE80211_F_BGSCAN 0x08000000 /* STATUS: background scan */ 441b2cf04c7Sstsp #define IEEE80211_F_AUTO_JOIN 0x10000000 /* CONF: auto-join active */ 44250d1a4aeSstsp #define IEEE80211_F_VHTON 0x20000000 /* CONF: VHT enabled */ 44391b2158bSmillert 44406e069b5Sstsp /* ic_xflags */ 44506e069b5Sstsp #define IEEE80211_F_TX_MGMT_ONLY 0x00000001 /* leave data frames on ifq */ 44606e069b5Sstsp 44791b2158bSmillert /* ic_caps */ 44891b2158bSmillert #define IEEE80211_C_WEP 0x00000001 /* CAPABILITY: WEP available */ 44991b2158bSmillert #define IEEE80211_C_IBSS 0x00000002 /* CAPABILITY: IBSS available */ 45091b2158bSmillert #define IEEE80211_C_PMGT 0x00000004 /* CAPABILITY: Power mgmt */ 45191b2158bSmillert #define IEEE80211_C_HOSTAP 0x00000008 /* CAPABILITY: HOSTAP avail */ 45291b2158bSmillert #define IEEE80211_C_AHDEMO 0x00000010 /* CAPABILITY: Old Adhoc Demo */ 4532372da91Sdamien #define IEEE80211_C_APPMGT 0x00000020 /* CAPABILITY: AP power mgmt */ 45491b2158bSmillert #define IEEE80211_C_TXPMGT 0x00000040 /* CAPABILITY: tx power mgmt */ 45591b2158bSmillert #define IEEE80211_C_SHSLOT 0x00000080 /* CAPABILITY: short slottime */ 45691b2158bSmillert #define IEEE80211_C_SHPREAMBLE 0x00000100 /* CAPABILITY: short preamble */ 45791b2158bSmillert #define IEEE80211_C_MONITOR 0x00000200 /* CAPABILITY: monitor mode */ 4583c31650aSdlg #define IEEE80211_C_SCANALL 0x00000400 /* CAPABILITY: scan all chan */ 4599537e691Sdamien #define IEEE80211_C_QOS 0x00000800 /* CAPABILITY: QoS avail */ 4609537e691Sdamien #define IEEE80211_C_RSN 0x00001000 /* CAPABILITY: RSN avail */ 4618f876433Sdamien #define IEEE80211_C_MFP 0x00002000 /* CAPABILITY: MFP avail */ 462131b80deSdamien #define IEEE80211_C_RAWCTL 0x00004000 /* CAPABILITY: raw ctl */ 46337adb543Sstsp #define IEEE80211_C_SCANALLBAND 0x00008000 /* CAPABILITY: scan all bands */ 464aefc44daSstsp #define IEEE80211_C_TX_AMPDU 0x00010000 /* CAPABILITY: send A-MPDU */ 465b261fe3aSstsp #define IEEE80211_C_ADDBA_OFFLOAD 0x00020000 /* CAPABILITY: ADDBA offload */ 46691b2158bSmillert 46791b2158bSmillert /* flags for ieee80211_fix_rate() */ 46891b2158bSmillert #define IEEE80211_F_DOSORT 0x00000001 /* sort rate list */ 46991b2158bSmillert #define IEEE80211_F_DOFRATE 0x00000002 /* use fixed rate */ 47091b2158bSmillert #define IEEE80211_F_DONEGO 0x00000004 /* calc negotiated rate */ 47191b2158bSmillert #define IEEE80211_F_DODEL 0x00000008 /* delete ignore rate */ 47291b2158bSmillert 47391b2158bSmillert void ieee80211_ifattach(struct ifnet *); 47491b2158bSmillert void ieee80211_ifdetach(struct ifnet *); 47544b9b2a6Sstsp void ieee80211_channel_init(struct ifnet *); 47691b2158bSmillert void ieee80211_media_init(struct ifnet *, ifm_change_cb_t, ifm_stat_cb_t); 47791b2158bSmillert int ieee80211_media_change(struct ifnet *); 47891b2158bSmillert void ieee80211_media_status(struct ifnet *, struct ifmediareq *); 47991b2158bSmillert int ieee80211_ioctl(struct ifnet *, u_long, caddr_t); 48091b2158bSmillert int ieee80211_get_rate(struct ieee80211com *); 48191b2158bSmillert void ieee80211_watchdog(struct ifnet *); 48291b2158bSmillert int ieee80211_fix_rate(struct ieee80211com *, struct ieee80211_node *, int); 483f2a0e423Sstsp uint64_t ieee80211_rate2media(struct ieee80211com *, int, 48491b2158bSmillert enum ieee80211_phymode); 485f2a0e423Sstsp int ieee80211_media2rate(uint64_t); 4864c97d237Sstsp uint64_t ieee80211_mcs2media(struct ieee80211com *, int, 4874c97d237Sstsp enum ieee80211_phymode); 4884c97d237Sstsp int ieee80211_media2mcs(uint64_t); 489f494b02fSdamien u_int8_t ieee80211_rate2plcp(u_int8_t, enum ieee80211_phymode); 490f494b02fSdamien u_int8_t ieee80211_plcp2rate(u_int8_t, enum ieee80211_phymode); 49191b2158bSmillert u_int ieee80211_mhz2ieee(u_int, u_int); 492f22d9adcSdamien u_int ieee80211_chan2ieee(struct ieee80211com *, 493f22d9adcSdamien const struct ieee80211_channel *); 49491b2158bSmillert u_int ieee80211_ieee2mhz(u_int, u_int); 495436007ecSstsp int ieee80211_min_basic_rate(struct ieee80211com *); 496436007ecSstsp int ieee80211_max_basic_rate(struct ieee80211com *); 49791b2158bSmillert int ieee80211_setmode(struct ieee80211com *, enum ieee80211_phymode); 49814207dadSreyk enum ieee80211_phymode ieee80211_next_mode(struct ifnet *); 49991b2158bSmillert enum ieee80211_phymode ieee80211_chan2mode(struct ieee80211com *, 500f22d9adcSdamien const struct ieee80211_channel *); 501e5650b3fSphessler void ieee80211_disable_wep(struct ieee80211com *); 502e5650b3fSphessler void ieee80211_disable_rsn(struct ieee80211com *); 503d6390b08Sphessler int ieee80211_add_ess(struct ieee80211com *, struct ieee80211_join *); 504157eb8fdSphessler void ieee80211_del_ess(struct ieee80211com *, char *, int, int); 5053db57d68Sphessler void ieee80211_set_ess(struct ieee80211com *, struct ieee80211_ess *, 5063db57d68Sphessler struct ieee80211_node *); 5076b9ba65eSstsp void ieee80211_deselect_ess(struct ieee80211com *); 508d6390b08Sphessler struct ieee80211_ess *ieee80211_get_ess(struct ieee80211com *, const char *, int); 5090af58becSstsp void ieee80211_begin_bgscan(struct ifnet *); 51091b2158bSmillert 5110fd4e251Sreyk extern int ieee80211_cache_size; 51291b2158bSmillert 51391b2158bSmillert #endif /* _NET80211_IEEE80211_VAR_H_ */ 514