| 1 | /*	$OpenBSD: ieee80211_var.h,v 1.114 2026/03/19 16:50:32 chris Exp $	*/ |
| 2 | /*	$NetBSD: ieee80211_var.h,v 1.7 2004/05/06 03:07:10 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_var.h,v 1.15 2004/04/05 22:10:26 sam Exp $ |
| 32 | */ |
| 33 | #ifndef _NET80211_IEEE80211_VAR_H_ |
| 34 | #define _NET80211_IEEE80211_VAR_H_ |
| 35 | |
| 36 | /* |
| 37 | * Definitions for IEEE 802.11 drivers. |
| 38 | */ |
| 39 | |
| 40 | #ifdef	SMALL_KERNEL |
| 41 | #define IEEE80211_STA_ONLY	1 |
| 42 | #endif |
| 43 | |
| 44 | #include <sys/timeout.h> |
| 45 | |
| 46 | #include <net80211/ieee80211.h> |
| 47 | #include <net80211/ieee80211_crypto.h> |
| 48 | #include <net80211/ieee80211_ioctl.h>		/* for ieee80211_stats */ |
| 49 | #include <net80211/ieee80211_node.h> |
| 50 | #include <net80211/ieee80211_proto.h> |
| 51 | |
| 52 | #define	IEEE80211_CHAN_MAX	255 |
| 53 | #define	IEEE80211_CHAN_ANY	0xffff		/* token for ``any channel'' */ |
| 54 | #define	IEEE80211_CHAN_ANYC \ |
| 55 | 	((struct ieee80211_channel *) NULL) |
| 56 | |
| 57 | #define	IEEE80211_TXPOWER_MAX	100	/* max power */ |
| 58 | #define	IEEE80211_TXPOWER_MIN	-50	/* kill radio (if possible) */ |
| 59 | |
| 60 | #define IEEE80211_RSSI_THRES_2GHZ		(-60)	/* in dBm */ |
| 61 | #define IEEE80211_RSSI_THRES_5GHZ		(-70)	/* in dBm */ |
| 62 | #define IEEE80211_RSSI_THRES_RATIO_2GHZ		60	/* in percent */ |
| 63 | #define IEEE80211_RSSI_THRES_RATIO_5GHZ		50	/* in percent */ |
| 64 | |
| 65 | #define IEEE80211_BGSCAN_FAIL_MAX		512	/* units of 500 msec */ |
| 66 | |
| 67 | /* |
| 68 | * Missed beacon threshold: An access point has disappeared if this amount |
| 69 | * of consecutive beacons have been missed. |
| 70 | * This value needs to be high enough to avoid frequent re-connects to APs |
| 71 | * which suffer from occasional packet loss, and low enough to avoid a long |
| 72 | * delay before we start scanning when an AP has actually disappeared. |
| 73 | * |
| 74 | * The beacon interval is variable, but generally in the order of 100ms. |
| 75 | * So 30 beacons implies a grace period of about 3 seconds before we start |
| 76 | * searching for a new AP. |
| 77 | */ |
| 78 | #define IEEE80211_BEACON_MISS_THRES		30	/* units of beacons */ |
| 79 | |
| 80 | enum ieee80211_phytype { |
| 81 | 	IEEE80211_T_DS,			/* direct sequence spread spectrum */ |
| 82 | 	IEEE80211_T_OFDM,		/* frequency division multiplexing */ |
| 83 | 	IEEE80211_T_XR		 /* extended range mode */ |
| 84 | }; |
| 85 | #define	IEEE80211_T_CCK	IEEE80211_T_DS	/* more common nomenclature */ |
| 86 | |
| 87 | /* XXX not really a mode; there are really multiple PHY's */ |
| 88 | enum ieee80211_phymode { |
| 89 | 	IEEE80211_MODE_AUTO	= 0,	/* autoselect */ |
| 90 | 	IEEE80211_MODE_11A	= 1,	/* 5GHz, OFDM */ |
| 91 | 	IEEE80211_MODE_11B	= 2,	/* 2GHz, CCK */ |
| 92 | 	IEEE80211_MODE_11G	= 3,	/* 2GHz, OFDM */ |
| 93 | 	IEEE80211_MODE_11N	= 4,	/* 2GHz/5GHz, OFDM/HT */ |
| 94 | 	IEEE80211_MODE_11AC	= 5,	/* 5GHz, OFDM/VHT */ |
| 95 | 	IEEE80211_MODE_11AX	= 6,	/* 2GHz/5GHz, OFDM/HE */ |
| 96 | }; |
| 97 | #define	IEEE80211_MODE_MAX	(IEEE80211_MODE_11AX+1) |
| 98 | |
| 99 | enum ieee80211_opmode { |
| 100 | 	IEEE80211_M_STA		= 1,	/* infrastructure station */ |
| 101 | #ifndef IEEE80211_STA_ONLY |
| 102 | 	IEEE80211_M_IBSS	= 0,	/* IBSS (adhoc) station */ |
| 103 | 	IEEE80211_M_AHDEMO	= 3,	/* Old lucent compatible adhoc demo */ |
| 104 | 	IEEE80211_M_HOSTAP	= 6,	/* Software Access Point */ |
| 105 | #endif |
| 106 | 	IEEE80211_M_MONITOR	= 8	/* Monitor mode */ |
| 107 | }; |
| 108 | |
| 109 | /* |
| 110 | * 802.11g protection mode. |
| 111 | */ |
| 112 | enum ieee80211_protmode { |
| 113 | 	IEEE80211_PROT_NONE	= 0,	/* no protection */ |
| 114 | 	IEEE80211_PROT_CTSONLY	= 1,	/* CTS to self */ |
| 115 | 	IEEE80211_PROT_RTSCTS	= 2	/* RTS-CTS */ |
| 116 | }; |
| 117 | |
| 118 | /* |
| 119 | * Channels are specified by frequency and attributes. |
| 120 | */ |
| 121 | struct ieee80211_channel { |
| 122 | 	u_int16_t	ic_freq;	/* setting in MHz */ |
| 123 | 	u_int16_t	ic_flags;	/* see below */ |
| 124 | 	u_int32_t	ic_xflags;	/* extra flags; see below */ |
| 125 | }; |
| 126 | |
| 127 | /* |
| 128 | * Channel attributes (XXX must keep in sync with radiotap flags). |
| 129 | */ |
| 130 | #define IEEE80211_CHAN_CCK	0x0020	/* CCK channel */ |
| 131 | #define IEEE80211_CHAN_OFDM	0x0040	/* OFDM channel */ |
| 132 | #define IEEE80211_CHAN_2GHZ	0x0080	/* 2 GHz spectrum channel */ |
| 133 | #define IEEE80211_CHAN_5GHZ	0x0100	/* 5 GHz spectrum channel */ |
| 134 | #define IEEE80211_CHAN_PASSIVE	0x0200	/* Only passive scan allowed */ |
| 135 | #define IEEE80211_CHAN_DYN	0x0400	/* Dynamic CCK-OFDM channel */ |
| 136 | #define IEEE80211_CHAN_XR	0x1000	/* Extended range OFDM channel */ |
| 137 | #define IEEE80211_CHAN_HT	0x2000	/* 11n/HT channel */ |
| 138 | #define IEEE80211_CHAN_VHT	0x4000	/* 11ac/VHT channel */ |
| 139 | #define IEEE80211_CHAN_40MHZ	0x8000	/* use of 40 MHz is allowed */ |
| 140 | |
| 141 | /* |
| 142 | * Extra channel flags. |
| 143 | */ |
| 144 | #define IEEE80211_CHANX_80MHZ	0x00000001 /* use of 80 MHz is allowed */ |
| 145 | #define IEEE80211_CHANX_160MHZ	0x00000002 /* use of 160 MHz is allowed */ |
| 146 | #define IEEE80211_CHANX_HE	0x00000004 /* 11ax/HE channel */ |
| 147 | |
| 148 | /* |
| 149 | * Useful combinations of channel characteristics. |
| 150 | */ |
| 151 | #define IEEE80211_CHAN_A \ |
| 152 | 	(IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM) |
| 153 | #define IEEE80211_CHAN_B \ |
| 154 | 	(IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK) |
| 155 | #define IEEE80211_CHAN_PUREG \ |
| 156 | 	(IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM) |
| 157 | #define IEEE80211_CHAN_G \ |
| 158 | 	(IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN) |
| 159 | |
| 160 | #define	IEEE80211_IS_CHAN_A(_c) \ |
| 161 | 	(((_c)->ic_flags & IEEE80211_CHAN_A) == IEEE80211_CHAN_A) |
| 162 | #define	IEEE80211_IS_CHAN_B(_c) \ |
| 163 | 	(((_c)->ic_flags & IEEE80211_CHAN_B) == IEEE80211_CHAN_B) |
| 164 | #define	IEEE80211_IS_CHAN_PUREG(_c) \ |
| 165 | 	(((_c)->ic_flags & IEEE80211_CHAN_PUREG) == IEEE80211_CHAN_PUREG) |
| 166 | #define	IEEE80211_IS_CHAN_G(_c) \ |
| 167 | 	(((_c)->ic_flags & IEEE80211_CHAN_G) == IEEE80211_CHAN_G) |
| 168 | #define	IEEE80211_IS_CHAN_N(_c) \ |
| 169 | 	(((_c)->ic_flags & IEEE80211_CHAN_HT) == IEEE80211_CHAN_HT) |
| 170 | #define	IEEE80211_IS_CHAN_AC(_c) \ |
| 171 | 	(((_c)->ic_flags & IEEE80211_CHAN_VHT) == IEEE80211_CHAN_VHT) |
| 172 | |
| 173 | #define	IEEE80211_IS_CHAN_2GHZ(_c) \ |
| 174 | 	(((_c)->ic_flags & IEEE80211_CHAN_2GHZ) != 0) |
| 175 | #define	IEEE80211_IS_CHAN_5GHZ(_c) \ |
| 176 | 	(((_c)->ic_flags & IEEE80211_CHAN_5GHZ) != 0) |
| 177 | #define	IEEE80211_IS_CHAN_OFDM(_c) \ |
| 178 | 	(((_c)->ic_flags & IEEE80211_CHAN_OFDM) != 0) |
| 179 | #define	IEEE80211_IS_CHAN_CCK(_c) \ |
| 180 | 	(((_c)->ic_flags & IEEE80211_CHAN_CCK) != 0) |
| 181 | #define	IEEE80211_IS_CHAN_XR(_c) \ |
| 182 | 	(((_c)->ic_flags & IEEE80211_CHAN_XR) != 0) |
| 183 | |
| 184 | #define	IEEE80211_CHAN_40MHZ_ALLOWED(_c) \ |
| 185 | 	(((_c)->ic_flags & IEEE80211_CHAN_40MHZ) != 0) |
| 186 | #define	IEEE80211_CHAN_80MHZ_ALLOWED(_c) \ |
| 187 | 	(((_c)->ic_xflags & IEEE80211_CHANX_80MHZ) != 0) |
| 188 | #define	IEEE80211_CHAN_160MHZ_ALLOWED(_c) \ |
| 189 | 	(((_c)->ic_xflags & IEEE80211_CHANX_160MHZ) != 0) |
| 190 | #define	IEEE80211_CHAN_HE(_c) \ |
| 191 | 	(((_c)->ic_xflags & IEEE80211_CHANX_HE) != 0) |
| 192 | |
| 193 | /* |
| 194 | * EDCA AC parameters. |
| 195 | */ |
| 196 | struct ieee80211_edca_ac_params { |
| 197 | 	u_int8_t	ac_ecwmin;	/* CWmin = 2^ECWmin - 1 */ |
| 198 | 	u_int8_t	ac_ecwmax;	/* CWmax = 2^ECWmax - 1 */ |
| 199 | 	u_int8_t	ac_aifsn; |
| 200 | 	u_int16_t	ac_txoplimit;	/* 32TU */ |
| 201 | #define IEEE80211_TXOP_TO_US(txop)	((txop) * 32) |
| 202 | |
| 203 | 	u_int8_t	ac_acm; |
| 204 | }; |
| 205 | |
| 206 | extern const struct ieee80211_edca_ac_params |
| 207 | 	 ieee80211_edca_table[IEEE80211_MODE_MAX][EDCA_NUM_AC]; |
| 208 | extern const struct ieee80211_edca_ac_params |
| 209 | 	 ieee80211_qap_edca_table[IEEE80211_MODE_MAX][EDCA_NUM_AC]; |
| 210 | |
| 211 | #define IEEE80211_DEFRAG_SIZE	3	/* must be >= 3 according to spec */ |
| 212 | /* |
| 213 | * Entry in the fragment cache. |
| 214 | */ |
| 215 | struct ieee80211_defrag { |
| 216 | 	struct timeout	df_to; |
| 217 | 	struct mbuf	*df_m; |
| 218 | 	u_int16_t	df_seq; |
| 219 | 	u_int8_t	df_frag; |
| 220 | }; |
| 221 | |
| 222 | #define IEEE80211_PROTO_NONE	0 |
| 223 | #define IEEE80211_PROTO_RSN	(1 << 0) |
| 224 | #define IEEE80211_PROTO_WPA	(1 << 1) |
| 225 | |
| 226 | #define	IEEE80211_SCAN_UNLOCKED	0x0 |
| 227 | #define	IEEE80211_SCAN_LOCKED	0x1 |
| 228 | #define	IEEE80211_SCAN_REQUEST	0x2 |
| 229 | #define	IEEE80211_SCAN_RESUME	0x4 |
| 230 | |
| 231 | #define IEEE80211_GROUP_NKID	6 |
| 232 | |
| 233 | struct ieee80211_node_switch_bss_arg; |
| 234 | |
| 235 | struct ieee80211com { |
| 236 | 	struct arpcom		ic_ac; |
| 237 | 	LIST_ENTRY(ieee80211com) ic_list;	/* chain of all ieee80211com */ |
| 238 | 	void			(*ic_recv_mgmt)(struct ieee80211com *, |
| 239 | 				 struct mbuf *, struct ieee80211_node *, |
| 240 | 				 struct ieee80211_rxinfo *, int); |
| 241 | 	int			(*ic_send_mgmt)(struct ieee80211com *, |
| 242 | 				 struct ieee80211_node *, int, int, int); |
| 243 | 	int			(*ic_newstate)(struct ieee80211com *, |
| 244 | 				 enum ieee80211_state, int); |
| 245 | 	int			(*ic_newauth)(struct ieee80211com *, |
| 246 | 				 struct ieee80211_node *, int, uint16_t); |
| 247 | 	void			(*ic_newassoc)(struct ieee80211com *, |
| 248 | 				 struct ieee80211_node *, int); |
| 249 | 	void			(*ic_node_leave)(struct ieee80211com *, |
| 250 | 				 struct ieee80211_node *); |
| 251 | 	void			(*ic_updateslot)(struct ieee80211com *); |
| 252 | 	void			(*ic_updateedca)(struct ieee80211com *); |
| 253 | 	void			(*ic_set_tim)(struct ieee80211com *, int, int); |
| 254 | 	int			(*ic_set_key)(struct ieee80211com *, |
| 255 | 				 struct ieee80211_node *, |
| 256 | 				 struct ieee80211_key *); |
| 257 | 	void			(*ic_delete_key)(struct ieee80211com *, |
| 258 | 				 struct ieee80211_node *, |
| 259 | 				 struct ieee80211_key *); |
| 260 | 	int			(*ic_ampdu_tx_start)(struct ieee80211com *, |
| 261 | 				 struct ieee80211_node *, u_int8_t); |
| 262 | 	void			(*ic_ampdu_tx_stop)(struct ieee80211com *, |
| 263 | 				 struct ieee80211_node *, u_int8_t); |
| 264 | 	int			(*ic_ampdu_rx_start)(struct ieee80211com *, |
| 265 | 				 struct ieee80211_node *, u_int8_t); |
| 266 | 	void			(*ic_ampdu_rx_stop)(struct ieee80211com *, |
| 267 | 				 struct ieee80211_node *, u_int8_t); |
| 268 | 	void			(*ic_updateprot)(struct ieee80211com *); |
| 269 | 	void			(*ic_updatechan)(struct ieee80211com *); |
| 270 | 	void			(*ic_updatedtim)(struct ieee80211com *); |
| 271 | 	int			(*ic_bgscan_start)(struct ieee80211com *); |
| 272 | 	void			(*ic_bgscan_done)(struct ieee80211com *, |
| 273 | 				 struct ieee80211_node_switch_bss_arg *, |
| 274 | 				 size_t); |
| 275 | 	struct timeout		ic_bgscan_timeout; |
| 276 | 	uint32_t		ic_bgscan_fail; |
| 277 | 	u_int8_t		ic_myaddr[IEEE80211_ADDR_LEN]; |
| 278 | 	struct ieee80211_rateset ic_sup_rates[IEEE80211_MODE_MAX]; |
| 279 | 	struct ieee80211_channel ic_channels[IEEE80211_CHAN_MAX+1]; |
| 280 | 	u_char			ic_chan_avail[howmany(IEEE80211_CHAN_MAX,NBBY)]; |
| 281 | 	u_char			ic_chan_active[howmany(IEEE80211_CHAN_MAX, NBBY)]; |
| 282 | 	u_char			ic_chan_scan[howmany(IEEE80211_CHAN_MAX,NBBY)]; |
| 283 | 	struct mbuf_queue	ic_mgtq; |
| 284 | 	struct mbuf_queue	ic_pwrsaveq; |
| 285 | 	u_int8_t		ic_scan_count;	/* count scans */ |
| 286 | 	u_int32_t		ic_flags;	/* state flags */ |
| 287 | 	u_int32_t		ic_xflags;	/* more flags */ |
| 288 | 	u_int32_t		ic_userflags;	/* yet more flags */ |
| 289 | 	u_int32_t		ic_caps;	/* capabilities */ |
| 290 | 	u_int16_t		ic_modecaps;	/* set of mode capabilities */ |
| 291 | 	u_int16_t		ic_curmode;	/* current mode */ |
| 292 | 	enum ieee80211_phytype	ic_phytype;	/* XXX wrong for multi-mode */ |
| 293 | 	enum ieee80211_opmode	ic_opmode;	/* operation mode */ |
| 294 | 	enum ieee80211_state	ic_state;	/* 802.11 state */ |
| 295 | 	u_int32_t		*ic_aid_bitmap; |
| 296 | 	u_int16_t		ic_max_aid; |
| 297 | 	enum ieee80211_protmode	ic_protmode;	/* 802.11g/n protection mode */ |
| 298 | 	struct ifmedia		ic_media;	/* interface media config */ |
| 299 | 	caddr_t			ic_rawbpf;	/* packet filter structure */ |
| 300 | 	struct ieee80211_node	*ic_bss;	/* information for this node */ |
| 301 | 	struct ieee80211_channel *ic_ibss_chan; |
| 302 | 	int			ic_fixed_rate;	/* index to ic_sup_rates[] */ |
| 303 | 	u_int16_t		ic_rtsthreshold; |
| 304 | 	u_int16_t		ic_fragthreshold; |
| 305 | 	u_int			ic_scangen;	/* gen# for timeout scan */ |
| 306 | 	struct ieee80211_node	*(*ic_node_alloc)(struct ieee80211com *); |
| 307 | 	void			(*ic_node_free)(struct ieee80211com *, |
| 308 | 					struct ieee80211_node *); |
| 309 | 	void			(*ic_node_copy)(struct ieee80211com *, |
| 310 | 					struct ieee80211_node *, |
| 311 | 					const struct ieee80211_node *); |
| 312 | 	u_int8_t		(*ic_node_getrssi)(struct ieee80211com *, |
| 313 | 					const struct ieee80211_node *); |
| 314 | 	int			(*ic_node_checkrssi)(struct ieee80211com *, |
| 315 | 					const struct ieee80211_node *); |
| 316 | 	u_int8_t		ic_max_rssi; |
| 317 | 	struct ieee80211_tree	ic_tree; |
| 318 | 	int			ic_nnodes;	/* length of ic_nnodes */ |
| 319 | 	int			ic_max_nnodes;	/* max length of ic_nnodes */ |
| 320 | 	u_int16_t		ic_lintval;	/* listen interval */ |
| 321 | 	int16_t			ic_txpower;	/* tx power setting (dBm) */ |
| 322 | 	int			ic_bmissthres;	/* beacon miss threshold */ |
| 323 | 	int			ic_mgt_timer;	/* mgmt timeout */ |
| 324 | #ifndef IEEE80211_STA_ONLY |
| 325 | 	struct timeout		ic_inact_timeout; /* node inactivity timeout */ |
| 326 | 	struct timeout		ic_node_cache_timeout; |
| 327 | #endif |
| 328 | 	struct task		ic_rtm_80211info_task; |
| 329 | 	int			ic_des_esslen; |
| 330 | 	u_int8_t		ic_des_essid[IEEE80211_NWID_LEN]; |
| 331 | 	struct ieee80211_channel *ic_des_chan;	/* desired channel */ |
| 332 | 	u_int8_t		ic_des_bssid[IEEE80211_ADDR_LEN]; |
| 333 | 	struct ieee80211_key	ic_nw_keys[IEEE80211_GROUP_NKID]; |
| 334 | 	int			ic_def_txkey;	/* group data key index */ |
| 335 | #define ic_wep_txkey	ic_def_txkey |
| 336 | 	int			ic_igtk_kid;	/* IGTK key index */ |
| 337 | 	u_int32_t		ic_iv;		/* initial vector for wep */ |
| 338 | 	struct ieee80211_stats	ic_stats;	/* statistics */ |
| 339 | 	struct timeval		ic_last_merge_print;	/* for rate-limiting |
| 340 | 							 * IBSS merge print-outs |
| 341 | 							 */ |
| 342 | 	struct ieee80211_edca_ac_params ic_edca_ac[EDCA_NUM_AC]; |
| 343 | 	u_int			ic_edca_updtcount; |
| 344 | 	u_int			ic_edca_txop_count[EDCA_NUM_AC]; |
| 345 | 	struct timeval		ic_edca_txop_time[EDCA_NUM_AC]; |
| 346 | 	u_int16_t		ic_tid_noack; |
| 347 | 	u_int8_t		ic_globalcnt[EAPOL_KEY_NONCE_LEN]; |
| 348 | 	u_int8_t		ic_nonce[EAPOL_KEY_NONCE_LEN]; |
| 349 | 	u_int8_t		ic_psk[IEEE80211_PMK_LEN]; |
| 350 | 	struct timeout		ic_rsn_timeout; |
| 351 | 	time_t			ic_tkip_micfail; |
| 352 | 	u_int64_t		ic_tkip_micfail_last_tsc; |
| 353 | #ifndef IEEE80211_STA_ONLY |
| 354 | 	struct timeout		ic_tkip_micfail_timeout; |
| 355 | #endif |
| 356 | |
| 357 | 	TAILQ_HEAD(, ieee80211_pmk) ic_pmksa;	/* PMKSA cache */ |
| 358 | 	u_int			ic_rsnprotos; |
| 359 | 	u_int			ic_rsnakms; |
| 360 | 	u_int			ic_rsnciphers; |
| 361 | 	enum ieee80211_cipher	ic_rsngroupcipher; |
| 362 | 	enum ieee80211_cipher	ic_rsngroupmgmtcipher; |
| 363 | |
| 364 | #ifdef notyet |
| 365 | 	struct ieee80211_defrag	ic_defrag[IEEE80211_DEFRAG_SIZE]; |
| 366 | 	int			ic_defrag_cur; |
| 367 | #endif |
| 368 | |
| 369 | 	u_int8_t		*ic_tim_bitmap; |
| 370 | 	u_int			ic_tim_len; |
| 371 | 	u_int			ic_tim_mcast_pending; |
| 372 | 	u_int			ic_dtim_period; |
| 373 | 	u_int			ic_dtim_count; |
| 374 | |
| 375 | 	u_int32_t		ic_txbfcaps; |
| 376 | 	u_int16_t		ic_htcaps; |
| 377 | 	u_int8_t		ic_ampdu_params; |
| 378 | 	u_int8_t		ic_sup_mcs[howmany(80, NBBY)]; |
| 379 | 	u_int16_t		ic_max_rxrate;	/* in Mb/s, 0 <= rate <= 1023 */ |
| 380 | 	u_int8_t		ic_tx_mcs_set; |
| 381 | 	u_int16_t		ic_htxcaps; |
| 382 | 	u_int8_t		ic_aselcaps; |
| 383 | 	u_int8_t		ic_dialog_token; |
| 384 | 	int			ic_fixed_mcs; |
| 385 | |
| 386 | 	uint32_t		ic_vhtcaps; |
| 387 | 	uint16_t		ic_vht_rxmcs; |
| 388 | 	uint16_t		ic_vht_rx_max_lgi_mbit_s; |
| 389 | 	uint16_t		ic_vht_txmcs; |
| 390 | 	uint16_t		ic_vht_tx_max_lgi_mbit_s; |
| 391 | |
| 392 | 	u_int8_t		ic_he_mac_cap[IEEE80211_HE_MAC_CAPS_LEN]; |
| 393 | 	u_int8_t		ic_he_phy_cap[IEEE80211_HE_PHY_CAPS_LEN]; |
| 394 | 	uint16_t		ic_he_rxmcs_80; |
| 395 | 	uint16_t		ic_he_txmcs_80; |
| 396 | 	uint16_t		ic_he_rxmcs_160; |
| 397 | 	uint16_t		ic_he_txmcs_160; |
| 398 | 	uint16_t		ic_he_rxmcs_80p80; |
| 399 | 	uint16_t		ic_he_txmcs_80p80; |
| 400 | |
| 401 | 	TAILQ_HEAD(, ieee80211_ess)	 ic_ess; |
| 402 | }; |
| 403 | #define	ic_if		ic_ac.ac_if |
| 404 | #define	ic_softc	ic_if.if_softc |
| 405 | |
| 406 | /* list of APs we want to automatically use */ |
| 407 | /* all data is copied from struct ieee80211com */ |
| 408 | struct ieee80211_ess { |
| 409 | 	/* nwid */ |
| 410 | 	int			esslen; |
| 411 | 	u_int8_t		essid[IEEE80211_NWID_LEN]; |
| 412 | |
| 413 | 	/* clear/wep/wpa */ |
| 414 | 	u_int32_t		flags; |
| 415 | |
| 416 | 	/* nwkey */ |
| 417 | 	struct ieee80211_key nw_keys[IEEE80211_GROUP_NKID]; |
| 418 | 	int			def_txkey; |
| 419 | |
| 420 | 	/* wpakey */ |
| 421 | 	u_int8_t		psk[IEEE80211_PMK_LEN]; |
| 422 | 	u_int			rsnprotos; |
| 423 | 	u_int			rsnakms; |
| 424 | 	u_int			rsnciphers; |
| 425 | 	enum ieee80211_cipher	rsngroupcipher; |
| 426 | |
| 427 | 	TAILQ_ENTRY(ieee80211_ess) ess_next; |
| 428 | }; |
| 429 | |
| 430 | #define	IEEE80211_ADDR_EQ(a1,a2)	(memcmp(a1,a2,IEEE80211_ADDR_LEN) == 0) |
| 431 | #define	IEEE80211_ADDR_COPY(dst,src)	memcpy(dst,src,IEEE80211_ADDR_LEN) |
| 432 | |
| 433 | /* ic_flags */ |
| 434 | #define	IEEE80211_F_ASCAN	0x00000001	/* STATUS: active scan */ |
| 435 | #define	IEEE80211_F_SIBSS	0x00000002	/* STATUS: start IBSS */ |
| 436 | #define	IEEE80211_F_WEPON	0x00000100	/* CONF: WEP enabled */ |
| 437 | #define	IEEE80211_F_IBSSON	0x00000200	/* CONF: IBSS creation enable */ |
| 438 | #define	IEEE80211_F_PMGTON	0x00000400	/* CONF: Power mgmt enable */ |
| 439 | #define	IEEE80211_F_DESBSSID	0x00000800	/* CONF: des_bssid is set */ |
| 440 | #define	IEEE80211_F_ROAMING	0x00002000	/* CONF: roaming enabled */ |
| 441 | #define	IEEE80211_F_TXPMGT	0x00018000	/* STATUS: tx power */ |
| 442 | #define IEEE80211_F_TXPOW_OFF	0x00000000	/* TX Power: radio disabled */ |
| 443 | #define IEEE80211_F_TXPOW_FIXED	0x00008000	/* TX Power: fixed rate */ |
| 444 | #define IEEE80211_F_TXPOW_AUTO	0x00010000	/* TX Power: undefined */ |
| 445 | #define	IEEE80211_F_SHSLOT	0x00020000	/* STATUS: short slot time */ |
| 446 | #define	IEEE80211_F_SHPREAMBLE	0x00040000	/* STATUS: short preamble */ |
| 447 | #define IEEE80211_F_QOS		0x00080000	/* CONF: QoS enabled */ |
| 448 | #define	IEEE80211_F_USEPROT	0x00100000	/* STATUS: protection enabled */ |
| 449 | #define	IEEE80211_F_RSNON	0x00200000	/* CONF: RSN enabled */ |
| 450 | #define	IEEE80211_F_PSK		0x00400000	/* CONF: pre-shared key set */ |
| 451 | #define IEEE80211_F_COUNTERM	0x00800000	/* STATUS: countermeasures */ |
| 452 | #define IEEE80211_F_MFPR	0x01000000	/* CONF: MFP required */ |
| 453 | #define	IEEE80211_F_HTON	0x02000000	/* CONF: HT enabled */ |
| 454 | #define	IEEE80211_F_PBAR	0x04000000	/* CONF: PBAC required */ |
| 455 | #define	IEEE80211_F_BGSCAN	0x08000000	/* STATUS: background scan */ |
| 456 | #define IEEE80211_F_AUTO_JOIN	0x10000000	/* CONF: auto-join active */ |
| 457 | #define	IEEE80211_F_VHTON	0x20000000	/* CONF: VHT enabled */ |
| 458 | #define	IEEE80211_F_HEON	0x40000000	/* CONF: HE enabled */ |
| 459 | |
| 460 | /* ic_xflags */ |
| 461 | #define	IEEE80211_F_TX_MGMT_ONLY 0x00000001	/* leave data frames on ifq */ |
| 462 | |
| 463 | /* ic_caps */ |
| 464 | #define	IEEE80211_C_WEP		0x00000001	/* CAPABILITY: WEP available */ |
| 465 | #define	IEEE80211_C_IBSS	0x00000002	/* CAPABILITY: IBSS available */ |
| 466 | #define	IEEE80211_C_PMGT	0x00000004	/* CAPABILITY: Power mgmt */ |
| 467 | #define	IEEE80211_C_HOSTAP	0x00000008	/* CAPABILITY: HOSTAP avail */ |
| 468 | #define	IEEE80211_C_AHDEMO	0x00000010	/* CAPABILITY: Old Adhoc Demo */ |
| 469 | #define	IEEE80211_C_APPMGT	0x00000020	/* CAPABILITY: AP power mgmt */ |
| 470 | #define	IEEE80211_C_TXPMGT	0x00000040	/* CAPABILITY: tx power mgmt */ |
| 471 | #define	IEEE80211_C_SHSLOT	0x00000080	/* CAPABILITY: short slottime */ |
| 472 | #define	IEEE80211_C_SHPREAMBLE	0x00000100	/* CAPABILITY: short preamble */ |
| 473 | #define	IEEE80211_C_MONITOR	0x00000200	/* CAPABILITY: monitor mode */ |
| 474 | #define IEEE80211_C_SCANALL	0x00000400	/* CAPABILITY: scan all chan */ |
| 475 | #define IEEE80211_C_QOS		0x00000800	/* CAPABILITY: QoS avail */ |
| 476 | #define IEEE80211_C_RSN		0x00001000	/* CAPABILITY: RSN avail */ |
| 477 | #define IEEE80211_C_MFP		0x00002000	/* CAPABILITY: MFP avail */ |
| 478 | #define IEEE80211_C_RAWCTL	0x00004000	/* CAPABILITY: raw ctl */ |
| 479 | #define IEEE80211_C_SCANALLBAND	0x00008000	/* CAPABILITY: scan all bands */ |
| 480 | #define IEEE80211_C_TX_AMPDU	0x00010000	/* CAPABILITY: send A-MPDU */ |
| 481 | #define IEEE80211_C_ADDBA_OFFLOAD 0x00020000	/* CAPABILITY: ADDBA offload */ |
| 482 | |
| 483 | /* flags for ieee80211_fix_rate() */ |
| 484 | #define	IEEE80211_F_DOSORT	0x00000001	/* sort rate list */ |
| 485 | #define	IEEE80211_F_DOFRATE	0x00000002	/* use fixed rate */ |
| 486 | #define	IEEE80211_F_DONEGO	0x00000004	/* calc negotiated rate */ |
| 487 | #define	IEEE80211_F_DODEL	0x00000008	/* delete ignore rate */ |
| 488 | |
| 489 | void	ieee80211_ifattach(struct ifnet *); |
| 490 | void	ieee80211_ifdetach(struct ifnet *); |
| 491 | void	ieee80211_channel_init(struct ifnet *); |
| 492 | void	ieee80211_media_init(struct ifnet *, ifm_change_cb_t, ifm_stat_cb_t); |
| 493 | int	ieee80211_media_change(struct ifnet *); |
| 494 | void	ieee80211_media_status(struct ifnet *, struct ifmediareq *); |
| 495 | int	ieee80211_ioctl(struct ifnet *, u_long, caddr_t); |
| 496 | int	ieee80211_get_rate(struct ieee80211com *); |
| 497 | void	ieee80211_watchdog(struct ifnet *); |
| 498 | int	ieee80211_fix_rate(struct ieee80211com *, struct ieee80211_node *, int); |
| 499 | uint64_t	ieee80211_rate2media(struct ieee80211com *, int, |
| 500 | 		 enum ieee80211_phymode); |
| 501 | int	ieee80211_media2rate(uint64_t); |
| 502 | uint64_t	ieee80211_mcs2media(struct ieee80211com *, int, |
| 503 | 		 enum ieee80211_phymode); |
| 504 | int	ieee80211_media2mcs(uint64_t); |
| 505 | u_int8_t ieee80211_rate2plcp(u_int8_t, enum ieee80211_phymode); |
| 506 | u_int8_t ieee80211_plcp2rate(u_int8_t, enum ieee80211_phymode); |
| 507 | u_int	ieee80211_mhz2ieee(u_int, u_int); |
| 508 | u_int	ieee80211_chan2ieee(struct ieee80211com *, |
| 509 | 		const struct ieee80211_channel *); |
| 510 | u_int	ieee80211_ieee2mhz(u_int, u_int); |
| 511 | int	ieee80211_min_basic_rate(struct ieee80211com *); |
| 512 | int	ieee80211_max_basic_rate(struct ieee80211com *); |
| 513 | int	ieee80211_setmode(struct ieee80211com *, enum ieee80211_phymode); |
| 514 | enum ieee80211_phymode ieee80211_next_mode(struct ifnet *); |
| 515 | void	ieee80211_disable_wep(struct ieee80211com *); |
| 516 | void	ieee80211_disable_rsn(struct ieee80211com *); |
| 517 | int	ieee80211_add_ess(struct ieee80211com *, struct ieee80211_join *); |
| 518 | void	ieee80211_del_ess(struct ieee80211com *, char *, int, int); |
| 519 | void	ieee80211_set_ess(struct ieee80211com *, struct ieee80211_ess *, |
| 520 | 	 struct ieee80211_node *); |
| 521 | void	ieee80211_deselect_ess(struct ieee80211com *); |
| 522 | struct ieee80211_ess *ieee80211_get_ess(struct ieee80211com *, const char *, int); |
| 523 | void	ieee80211_begin_bgscan(struct ifnet *); |
| 524 | |
| 525 | extern	int ieee80211_cache_size; |
| 526 | |
| 527 | #endif /* _NET80211_IEEE80211_VAR_H_ */ |