xref: /openbsd/sys/net/if_media.h (revision 56645681)
1 /*	$OpenBSD: if_media.h,v 1.45 2022/07/14 13:46:25 bluhm Exp $	*/
2 /*	$NetBSD: if_media.h,v 1.22 2000/02/17 21:53:16 sommerfeld Exp $	*/
3 
4 /*-
5  * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
6  * All rights reserved.
7  *
8  * This code is derived from software contributed to The NetBSD Foundation
9  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
10  * NASA Ames Research Center.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
25  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 /*
35  * Copyright (c) 1997
36  *	Jonathan Stone and Jason R. Thorpe.  All rights reserved.
37  *
38  * This software is derived from information provided by Matt Thomas.
39  *
40  * Redistribution and use in source and binary forms, with or without
41  * modification, are permitted provided that the following conditions
42  * are met:
43  * 1. Redistributions of source code must retain the above copyright
44  *    notice, this list of conditions and the following disclaimer.
45  * 2. Redistributions in binary form must reproduce the above copyright
46  *    notice, this list of conditions and the following disclaimer in the
47  *    documentation and/or other materials provided with the distribution.
48  * 3. All advertising materials mentioning features or use of this software
49  *    must display the following acknowledgement:
50  *	This product includes software developed by Jonathan Stone
51  *	and Jason R. Thorpe for the NetBSD Project.
52  * 4. The names of the authors may not be used to endorse or promote products
53  *    derived from this software without specific prior written permission.
54  *
55  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
56  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
57  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
58  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
59  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
60  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
61  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
62  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
63  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
64  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
65  * SUCH DAMAGE.
66  */
67 
68 #ifndef _NET_IF_MEDIA_H_
69 #define _NET_IF_MEDIA_H_
70 
71 #ifdef _KERNEL
72 
73 struct ifnet;
74 extern struct mutex ifmedia_mtx;
75 
76 #include <sys/queue.h>
77 /*
78  * Driver callbacks for media status and change requests.
79  */
80 typedef	int (*ifm_change_cb_t)(struct ifnet *);
81 typedef	void (*ifm_stat_cb_t)(struct ifnet *, struct ifmediareq *);
82 
83 /*
84  * Locks used to protect struct members in this file:
85  *	M	ifmedia_mtx		interface media mutex
86  */
87 
88 /*
89  * In-kernel representation of a single supported media type.
90  */
91 struct ifmedia_entry {
92 	TAILQ_ENTRY(ifmedia_entry) ifm_list;
93 	uint64_t	ifm_media;	/* description of this media attachment */
94 	u_int	ifm_data;	/* for driver-specific use */
95 	void	*ifm_aux;	/* for driver-specific use */
96 };
97 
98 TAILQ_HEAD(ifmedia_list, ifmedia_entry);
99 /*
100  * One of these goes into a network interface's softc structure.
101  * It is used to keep general media state.
102  */
103 struct ifmedia {
104 	uint64_t	ifm_mask;	/* mask of changes we don't care about */
105 	uint64_t	ifm_media;	/* current user-set media word */
106 	struct ifmedia_entry *ifm_cur;	/* [M] currently selected media */
107 	struct ifmedia_list ifm_list;	/* [M] list of all supported media */
108 	size_t		ifm_nwords;	/* [M] number of ifm_list entries */
109 	ifm_change_cb_t	ifm_change_cb;	/* media change driver callback */
110 	ifm_stat_cb_t	ifm_status_cb;	/* media status driver callback */
111 };
112 
113 /* Initialize an interface's struct if_media field. */
114 void	ifmedia_init(struct ifmedia *, uint64_t, ifm_change_cb_t,
115 	     ifm_stat_cb_t);
116 
117 /* Add one supported medium to a struct ifmedia. */
118 void	ifmedia_add(struct ifmedia *, uint64_t, int, void *);
119 
120 /* Add an array (of ifmedia_entry) media to a struct ifmedia. */
121 void	ifmedia_list_add(struct ifmedia *, struct ifmedia_entry *,
122 	    int);
123 
124 /* Set default media type on initialization. */
125 void	ifmedia_set(struct ifmedia *, uint64_t);
126 
127 /* Common ioctl function for getting/setting media, called by driver. */
128 int	ifmedia_ioctl(struct ifnet *, struct ifreq *, struct ifmedia *,
129 	    u_long);
130 
131 /* Locate a media entry */
132 int	ifmedia_match(struct ifmedia *, uint64_t, uint64_t);
133 
134 /* Delete all media for a given media instance */
135 void	ifmedia_delete_instance(struct ifmedia *, uint64_t);
136 
137 /* Compute baudrate for a given media. */
138 uint64_t	ifmedia_baudrate(uint64_t);
139 #endif /*_KERNEL */
140 
141 /*
142  * if_media Options word:
143  *	Bits	Use
144  *	----	-------
145  *	0-7	Media subtype		MAX SUBTYPE == 255!
146  *	8-15	Media type
147  *	16-31	Type specific options
148  *	32-39	Mode (for multi-mode devices)
149  *	40-55	Shared (global) options
150  *	56-63	Instance
151  */
152 
153 /*
154  * Ethernet
155  */
156 #define IFM_ETHER	0x0000000000000100ULL
157 #define	IFM_10_T	3		/* 10BaseT - RJ45 */
158 #define	IFM_10_2	4		/* 10Base2 - Thinnet */
159 #define	IFM_10_5	5		/* 10Base5 - AUI */
160 #define	IFM_100_TX	6		/* 100BaseTX - RJ45 */
161 #define	IFM_100_FX	7		/* 100BaseFX - Fiber */
162 #define	IFM_100_T4	8		/* 100BaseT4 - 4 pair cat 3 */
163 #define	IFM_100_VG	9		/* 100VG-AnyLAN */
164 #define	IFM_100_T2	10		/* 100BaseT2 */
165 #define	IFM_1000_SX	11		/* 1000BaseSX - multi-mode fiber */
166 #define	IFM_10_STP	12		/* 10BaseT over shielded TP */
167 #define	IFM_10_FL	13		/* 10BaseFL - Fiber */
168 #define	IFM_1000_LX	14		/* 1000baseLX - single-mode fiber */
169 #define	IFM_1000_CX	15		/* 1000baseCX - 150ohm STP */
170 #define	IFM_1000_T	16		/* 1000baseT - 4 pair cat 5 */
171 #define	IFM_1000_TX	IFM_1000_T	/* for backwards compatibility */
172 #define	IFM_HPNA_1	17		/* HomePNA 1.0 (1Mb/s) */
173 #define	IFM_10G_LR	18		/* 10GBase-LR - single-mode fiber */
174 #define	IFM_10G_SR	19		/* 10GBase-SR - multi-mode fiber */
175 #define	IFM_10G_CX4	20		/* 10GBase-CX4 - copper */
176 #define	IFM_2500_SX	21		/* 2500baseSX - multi-mode fiber */
177 #define	IFM_10G_T	22		/* 10GbaseT cat 6 */
178 #define	IFM_10G_SFP_CU	23		/* 10G SFP+ direct attached cable */
179 #define	IFM_10G_LRM	24		/* 10GBase-LRM 850nm Multi-mode */
180 #define	IFM_40G_CR4	25		/* 40GBase-CR4 */
181 #define	IFM_40G_SR4	26		/* 40GBase-SR4 */
182 #define	IFM_40G_LR4	27		/* 40GBase-LR4 */
183 #define	IFM_1000_KX	28		/* 1000Base-KX backplane */
184 #define	IFM_10G_KX4	29		/* 10GBase-KX4 backplane */
185 #define	IFM_10G_KR	30		/* 10GBase-KR backplane */
186 #define	IFM_10G_CR1	31		/* 10GBase-CR1 Twinax splitter */
187 #define	IFM_20G_KR2	32		/* 20GBase-KR2 backplane */
188 #define	IFM_2500_KX	33		/* 2500Base-KX backplane */
189 #define	IFM_2500_T	34		/* 2500Base-T - RJ45 (NBaseT) */
190 #define	IFM_5000_T	35		/* 5000Base-T - RJ45 (NBaseT) */
191 #define	IFM_1000_SGMII	36		/* 1G media interface */
192 #define	IFM_10G_SFI	37		/* 10G media interface */
193 #define	IFM_40G_XLPPI	38		/* 40G media interface */
194 #define	IFM_1000_CX_SGMII 39		/* 1000Base-CX-SGMII */
195 #define	IFM_40G_KR4	40		/* 40GBase-KR4 */
196 #define	IFM_10G_ER	41		/* 10GBase-ER */
197 #define	IFM_100G_CR4	42		/* 100GBase-CR4 */
198 #define	IFM_100G_SR4	43		/* 100GBase-SR4 */
199 #define	IFM_100G_KR4	44		/* 100GBase-KR4 */
200 #define	IFM_100G_LR4	45		/* 100GBase-LR4 */
201 #define	IFM_56G_R4	46		/* 56GBase-R4 */
202 #define	IFM_25G_CR	47		/* 25GBase-CR */
203 #define	IFM_25G_KR	48		/* 25GBase-KR */
204 #define	IFM_25G_SR	49		/* 25GBase-SR */
205 #define	IFM_50G_CR2	50		/* 50GBase-CR2 */
206 #define	IFM_50G_KR2	51		/* 50GBase-KR2 */
207 #define	IFM_25G_LR	52		/* 25GBase-LR */
208 #define	IFM_25G_ER	53		/* 25GBase-ER */
209 #define	IFM_10G_AOC	54		/* 10G Active Optical Cable */
210 #define	IFM_25G_AOC	55		/* 25G Active Optical Cable */
211 #define	IFM_40G_AOC	56		/* 40G Active Optical Cable */
212 #define	IFM_100G_AOC	57		/* 100G Active Optical Cable */
213 
214 #define	IFM_ETH_MASTER	0x0000000000010000ULL	/* master mode (1000baseT) */
215 #define	IFM_ETH_RXPAUSE	0x0000000000020000ULL	/* receive PAUSE frames */
216 #define	IFM_ETH_TXPAUSE	0x0000000000040000ULL	/* transmit PAUSE frames */
217 
218 /*
219  * FDDI
220  */
221 #define	IFM_FDDI	0x0000000000000300ULL
222 #define	IFM_FDDI_SMF	3		/* Single-mode fiber */
223 #define	IFM_FDDI_MMF	4		/* Multi-mode fiber */
224 #define IFM_FDDI_UTP	5		/* CDDI / UTP */
225 #define IFM_FDDI_DA	0x00000100	/* Dual attach / single attach */
226 
227 /*
228  * IEEE 802.11 Wireless
229  */
230 #define	IFM_IEEE80211	0x0000000000000400ULL
231 #define	IFM_IEEE80211_FH1	3	/* Frequency Hopping 1Mbps */
232 #define	IFM_IEEE80211_FH2	4	/* Frequency Hopping 2Mbps */
233 #define	IFM_IEEE80211_DS2	5	/* Direct Sequence 2Mbps */
234 #define	IFM_IEEE80211_DS5	6	/* Direct Sequence 5Mbps*/
235 #define	IFM_IEEE80211_DS11	7	/* Direct Sequence 11Mbps*/
236 #define	IFM_IEEE80211_DS1	8	/* Direct Sequence  1Mbps*/
237 #define IFM_IEEE80211_DS22	9	/* Direct Sequence 22Mbps */
238 #define IFM_IEEE80211_OFDM6	10	/* OFDM 6Mbps */
239 #define IFM_IEEE80211_OFDM9	11	/* OFDM 9Mbps */
240 #define IFM_IEEE80211_OFDM12	12	/* OFDM 12Mbps */
241 #define IFM_IEEE80211_OFDM18	13	/* OFDM 18Mbps */
242 #define IFM_IEEE80211_OFDM24	14	/* OFDM 24Mbps */
243 #define IFM_IEEE80211_OFDM36	15	/* OFDM 36Mbps */
244 #define IFM_IEEE80211_OFDM48	16	/* OFDM 48Mbps */
245 #define IFM_IEEE80211_OFDM54	17	/* OFDM 54Mbps */
246 #define IFM_IEEE80211_OFDM72	18	/* OFDM 72Mbps */
247 #define IFM_IEEE80211_HT_MCS0	19	/* 11n MCS 0 */
248 #define IFM_IEEE80211_HT_MCS1	20	/* 11n MCS 1 */
249 #define IFM_IEEE80211_HT_MCS2	21	/* 11n MCS 2 */
250 #define IFM_IEEE80211_HT_MCS3	22	/* 11n MCS 3 */
251 #define IFM_IEEE80211_HT_MCS4	23	/* 11n MCS 4 */
252 #define IFM_IEEE80211_HT_MCS5	24	/* 11n MCS 5 */
253 #define IFM_IEEE80211_HT_MCS6	25	/* 11n MCS 6 */
254 #define IFM_IEEE80211_HT_MCS7	26	/* 11n MCS 7 */
255 #define IFM_IEEE80211_HT_MCS8	27	/* 11n MCS 8 */
256 #define IFM_IEEE80211_HT_MCS9	28	/* 11n MCS 9 */
257 #define IFM_IEEE80211_HT_MCS10	29	/* 11n MCS 10 */
258 #define IFM_IEEE80211_HT_MCS11	30	/* 11n MCS 11 */
259 #define IFM_IEEE80211_HT_MCS12	31	/* 11n MCS 12 */
260 #define IFM_IEEE80211_HT_MCS13	32	/* 11n MCS 13 */
261 #define IFM_IEEE80211_HT_MCS14	33	/* 11n MCS 14 */
262 #define IFM_IEEE80211_HT_MCS15	34	/* 11n MCS 15 */
263 #define IFM_IEEE80211_HT_MCS16	35	/* 11n MCS 16 */
264 #define IFM_IEEE80211_HT_MCS17	36	/* 11n MCS 17 */
265 #define IFM_IEEE80211_HT_MCS18	37	/* 11n MCS 18 */
266 #define IFM_IEEE80211_HT_MCS19	38	/* 11n MCS 19 */
267 #define IFM_IEEE80211_HT_MCS20	39	/* 11n MCS 20 */
268 #define IFM_IEEE80211_HT_MCS21	40	/* 11n MCS 21 */
269 #define IFM_IEEE80211_HT_MCS22	41	/* 11n MCS 22 */
270 #define IFM_IEEE80211_HT_MCS23	42	/* 11n MCS 23 */
271 #define IFM_IEEE80211_HT_MCS24	43	/* 11n MCS 24 */
272 #define IFM_IEEE80211_HT_MCS25	44	/* 11n MCS 25 */
273 #define IFM_IEEE80211_HT_MCS26	45	/* 11n MCS 26 */
274 #define IFM_IEEE80211_HT_MCS27	46	/* 11n MCS 27 */
275 #define IFM_IEEE80211_HT_MCS28	47	/* 11n MCS 28 */
276 #define IFM_IEEE80211_HT_MCS29	48	/* 11n MCS 29 */
277 #define IFM_IEEE80211_HT_MCS30	49	/* 11n MCS 30 */
278 #define IFM_IEEE80211_HT_MCS31	50	/* 11n MCS 31 */
279 #define IFM_IEEE80211_HT_MCS32	51	/* 11n MCS 32 */
280 #define IFM_IEEE80211_HT_MCS33	52	/* 11n MCS 33 */
281 #define IFM_IEEE80211_HT_MCS34	53	/* 11n MCS 34 */
282 #define IFM_IEEE80211_HT_MCS35	54	/* 11n MCS 35 */
283 #define IFM_IEEE80211_HT_MCS36	55	/* 11n MCS 36 */
284 #define IFM_IEEE80211_HT_MCS37	56	/* 11n MCS 37 */
285 #define IFM_IEEE80211_HT_MCS38	57	/* 11n MCS 38 */
286 #define IFM_IEEE80211_HT_MCS39	58	/* 11n MCS 39 */
287 #define IFM_IEEE80211_HT_MCS40	59	/* 11n MCS 40 */
288 #define IFM_IEEE80211_HT_MCS41	60	/* 11n MCS 41 */
289 #define IFM_IEEE80211_HT_MCS42	61	/* 11n MCS 42 */
290 #define IFM_IEEE80211_HT_MCS43	62	/* 11n MCS 43 */
291 #define IFM_IEEE80211_HT_MCS44	63	/* 11n MCS 44 */
292 #define IFM_IEEE80211_HT_MCS45	64	/* 11n MCS 45 */
293 #define IFM_IEEE80211_HT_MCS46	65	/* 11n MCS 46 */
294 #define IFM_IEEE80211_HT_MCS47	66	/* 11n MCS 47 */
295 #define IFM_IEEE80211_HT_MCS48	67	/* 11n MCS 48 */
296 #define IFM_IEEE80211_HT_MCS49	68	/* 11n MCS 49 */
297 #define IFM_IEEE80211_HT_MCS50	69	/* 11n MCS 50 */
298 #define IFM_IEEE80211_HT_MCS51	70	/* 11n MCS 51 */
299 #define IFM_IEEE80211_HT_MCS52	71	/* 11n MCS 52 */
300 #define IFM_IEEE80211_HT_MCS53	72	/* 11n MCS 53 */
301 #define IFM_IEEE80211_HT_MCS54	73	/* 11n MCS 54 */
302 #define IFM_IEEE80211_HT_MCS55	74	/* 11n MCS 55 */
303 #define IFM_IEEE80211_HT_MCS56	75	/* 11n MCS 56 */
304 #define IFM_IEEE80211_HT_MCS57	76	/* 11n MCS 57 */
305 #define IFM_IEEE80211_HT_MCS58	77	/* 11n MCS 58 */
306 #define IFM_IEEE80211_HT_MCS59	78	/* 11n MCS 59 */
307 #define IFM_IEEE80211_HT_MCS60	79	/* 11n MCS 60 */
308 #define IFM_IEEE80211_HT_MCS61	80	/* 11n MCS 61 */
309 #define IFM_IEEE80211_HT_MCS62	81	/* 11n MCS 62 */
310 #define IFM_IEEE80211_HT_MCS63	82	/* 11n MCS 63 */
311 #define IFM_IEEE80211_HT_MCS64	83	/* 11n MCS 64 */
312 #define IFM_IEEE80211_HT_MCS65	84	/* 11n MCS 65 */
313 #define IFM_IEEE80211_HT_MCS66	85	/* 11n MCS 66 */
314 #define IFM_IEEE80211_HT_MCS67	86	/* 11n MCS 67 */
315 #define IFM_IEEE80211_HT_MCS68	87	/* 11n MCS 68 */
316 #define IFM_IEEE80211_HT_MCS69	88	/* 11n MCS 69 */
317 #define IFM_IEEE80211_HT_MCS70	89	/* 11n MCS 70 */
318 #define IFM_IEEE80211_HT_MCS71	90	/* 11n MCS 71 */
319 #define IFM_IEEE80211_HT_MCS72	91	/* 11n MCS 72 */
320 #define IFM_IEEE80211_HT_MCS73	92	/* 11n MCS 73 */
321 #define IFM_IEEE80211_HT_MCS74	93	/* 11n MCS 74 */
322 #define IFM_IEEE80211_HT_MCS75	94	/* 11n MCS 75 */
323 #define IFM_IEEE80211_HT_MCS76	95	/* 11n MCS 76 */
324 #define IFM_IEEE80211_VHT_MCS0	96	/* 11ac MCS 0 */
325 #define IFM_IEEE80211_VHT_MCS1	97	/* 11ac MCS 1 */
326 #define IFM_IEEE80211_VHT_MCS2	98	/* 11ac MCS 2 */
327 #define IFM_IEEE80211_VHT_MCS3	99	/* 11ac MCS 3 */
328 #define IFM_IEEE80211_VHT_MCS4	100	/* 11ac MCS 4 */
329 #define IFM_IEEE80211_VHT_MCS5	101	/* 11ac MCS 5 */
330 #define IFM_IEEE80211_VHT_MCS6	102	/* 11ac MCS 6 */
331 #define IFM_IEEE80211_VHT_MCS7	103	/* 11ac MCS 7 */
332 #define IFM_IEEE80211_VHT_MCS8	104	/* 11ac MCS 8 */
333 #define IFM_IEEE80211_VHT_MCS9	105	/* 11ac MCS 9 */
334 
335 #define	IFM_IEEE80211_ADHOC	0x0000000000010000ULL	/* Operate in Adhoc mode */
336 #define	IFM_IEEE80211_HOSTAP	0x0000000000020000ULL	/* Operate in Host AP mode */
337 #define	IFM_IEEE80211_IBSS	0x0000000000040000ULL	/* Operate in IBSS mode */
338 #define	IFM_IEEE80211_IBSSMASTER 0x0000000000080000ULL	/* Operate as an IBSS master */
339 #define	IFM_IEEE80211_MONITOR	0x0000000000100000ULL	/* Operate in Monitor mode */
340 
341 /* operating mode for multi-mode devices */
342 #define IFM_IEEE80211_11A	0x0000000100000000ULL	/* 5GHz, OFDM mode */
343 #define IFM_IEEE80211_11B	0x0000000200000000ULL	/* Direct Sequence mode */
344 #define IFM_IEEE80211_11G	0x0000000300000000ULL	/* 2GHz, CCK mode */
345 #define IFM_IEEE80211_FH	0x0000000400000000ULL	/* 2GHz, GFSK mode */
346 #define IFM_IEEE80211_11N	0x0000000800000000ULL	/* 11n/HT 2GHz/5GHz */
347 #define IFM_IEEE80211_11AC	0x0000001000000000ULL	/* 11ac/VHT 5GHz */
348 
349 /*
350  * Digitally multiplexed "Carrier" Serial Interfaces
351  */
352 #define	IFM_TDM		0x0000000000000500ULL
353 #define IFM_TDM_T1		3	/* T1 B8ZS+ESF 24 ts */
354 #define IFM_TDM_T1_AMI		4	/* T1 AMI+SF 24 ts */
355 #define IFM_TDM_E1		5	/* E1 HDB3+G.703 clearchannel 32 ts */
356 #define IFM_TDM_E1_G704		6	/* E1 HDB3+G.703+G.704 channelized 31 ts */
357 #define IFM_TDM_E1_AMI		7	/* E1 AMI+G.703 32 ts */
358 #define IFM_TDM_E1_AMI_G704	8	/* E1 AMI+G.703+G.704 31 ts */
359 #define IFM_TDM_T3		9	/* T3 B3ZS+C-bit 672 ts */
360 #define IFM_TDM_T3_M13		10	/* T3 B3ZS+M13 672 ts */
361 #define IFM_TDM_E3		11	/* E3 HDB3+G.751 512? ts */
362 #define IFM_TDM_E3_G751		12	/* E3 G.751 512 ts */
363 #define IFM_TDM_E3_G832		13	/* E3 G.832 512 ts */
364 #define IFM_TDM_E1_G704_CRC4	14	/* E1 HDB3+G.703+G.704 31 ts + CRC4 */
365 /*
366  * 6 major ways that networks talk: Drivers enforce independent selection,
367  * meaning, a driver will ensure that only one of these is set at a time.
368  * Default is cisco hdlc mode with 32 bit CRC.
369  */
370 #define IFM_TDM_HDLC_CRC16	0x0100	/* Use 16-bit CRC for HDLC instead */
371 #define IFM_TDM_PPP		0x0200	/* SPPP (dumb) */
372 #define IFM_TDM_FR_ANSI		0x0400	/* Frame Relay + LMI ANSI "Annex D" */
373 #define IFM_TDM_FR_CISCO	0x0800	/* Frame Relay + LMI Cisco */
374 #define IFM_TDM_FR_ITU		0x1000	/* Frame Relay + LMI ITU "Q933A" */
375 
376 /* operating mode */
377 #define IFM_TDM_MASTER		0x0000000100000000ULL	/* aka clock source internal */
378 
379 /*
380  * Common Access Redundancy Protocol
381  */
382 #define	IFM_CARP		0x0000000000000600ULL
383 
384 /*
385  * Shared media sub-types
386  */
387 #define	IFM_AUTO	0ULL		/* Autoselect best media */
388 #define	IFM_MANUAL	1ULL		/* Jumper/dipswitch selects media */
389 #define	IFM_NONE	2ULL		/* Deselect all media */
390 
391 /*
392  * Shared options
393  */
394 #define IFM_FDX		0x0000010000000000ULL	/* Force full duplex */
395 #define	IFM_HDX		0x0000020000000000ULL	/* Force half duplex */
396 #define	IFM_FLOW	0x0000040000000000ULL	/* enable hardware flow control */
397 #define IFM_FLAG0	0x0000100000000000ULL	/* Driver defined flag */
398 #define IFM_FLAG1	0x0000200000000000ULL	/* Driver defined flag */
399 #define IFM_FLAG2	0x0000400000000000ULL	/* Driver defined flag */
400 #define	IFM_LOOP	0x0000800000000000ULL	/* Put hardware in loopback */
401 
402 /*
403  * Masks
404  */
405 #define	IFM_NMASK	0x000000000000ff00ULL	/* Network type */
406 #define	IFM_NSHIFT	8			/* Network type shift */
407 #define	IFM_TMASK	0x00000000000000ffULL	/* Media sub-type */
408 #define	IFM_TSHIFT	0			/* Sub-type shift */
409 #define	IFM_IMASK	0xff00000000000000ULL	/* Instance */
410 #define	IFM_ISHIFT	56			/* Instance shift */
411 #define	IFM_OMASK	0x00000000ffff0000ULL	/* Type specific options */
412 #define	IFM_OSHIFT	16			/* Specific options shift */
413 #define	IFM_MMASK	0x000000ff00000000ULL	/* Mode */
414 #define	IFM_MSHIFT	32			/* Mode shift */
415 #define	IFM_GMASK	0x00ffff0000000000ULL	/* Global options */
416 #define	IFM_GSHIFT	40			/* Global options shift */
417 
418 /* Ethernet flow control mask */
419 #define	IFM_ETH_FMASK	(IFM_FLOW|IFM_ETH_RXPAUSE|IFM_ETH_TXPAUSE)
420 
421 #define	IFM_NMIN	IFM_ETHER	/* lowest Network type */
422 #define	IFM_NMAX	IFM_NMASK	/* highest Network type */
423 
424 /*
425  * Status bits
426  */
427 #define	IFM_AVALID	0x0000000000000001ULL	/* Active bit valid */
428 #define	IFM_ACTIVE	0x0000000000000002ULL	/* Interface attached to working net */
429 
430 /* Mask of "status valid" bits, for ifconfig(8). */
431 #define	IFM_STATUS_VALID	IFM_AVALID
432 
433 /* List of "status valid" bits, for ifconfig(8). */
434 #define	IFM_STATUS_VALID_LIST {						\
435 	IFM_AVALID,							\
436 	0								\
437 }
438 
439 /*
440  * Macros to extract various bits of information from the media word.
441  */
442 #define	IFM_TYPE(x)	((x) & IFM_NMASK)
443 #define	IFM_SUBTYPE(x)	((x) & IFM_TMASK)
444 #define	IFM_INST(x)	(((x) & IFM_IMASK) >> IFM_ISHIFT)
445 #define	IFM_OPTIONS(x)	((x) & (IFM_OMASK|IFM_GMASK))
446 #define	IFM_MODE(x)	((x) & IFM_MMASK)
447 
448 #define	IFM_INST_MAX	IFM_INST(IFM_IMASK)
449 #define	IFM_INST_ANY	((uint64_t) -1)
450 
451 /*
452  * Macro to create a media word.
453  * All arguments are IFM_* macros, except 'instance' which is a 64-bit integer.
454  * XXX 'operating mode' is not included here?!?
455  */
456 #define	IFM_MAKEWORD(type, subtype, options, instance)			\
457 	((type) | (subtype) | (options) | \
458 	((uint64_t)(instance) << IFM_ISHIFT))
459 
460 /*
461  * NetBSD extension not defined in the BSDI API.  This is used in various
462  * places to get the canonical description for a given type/subtype.
463  *
464  * In the subtype and mediaopt descriptions, the valid TYPE bits are OR'd
465  * in to indicate which TYPE the subtype/option corresponds to.  If no
466  * TYPE is present, it is a shared media/mediaopt.
467  *
468  * Note that these are parsed case-insensitive.
469  *
470  * Order is important.  The first matching entry is the canonical name
471  * for a media type; subsequent matches are aliases.
472  */
473 struct ifmedia_description {
474 	uint64_t	ifmt_word;	/* word value; may be masked */
475 	const char	*ifmt_string;	/* description */
476 };
477 
478 #define	IFM_TYPE_DESCRIPTIONS {						\
479 	{ IFM_ETHER,			"Ethernet" },			\
480 	{ IFM_ETHER,			"ether" },			\
481 	{ IFM_FDDI,			"FDDI" },			\
482 	{ IFM_IEEE80211,		"IEEE802.11" },			\
483 	{ IFM_TDM,			"TDM" },			\
484 	{ IFM_CARP,			"CARP" },			\
485 	{ 0, NULL },							\
486 }
487 
488 #define	IFM_TYPE_MATCH(dt, t)						\
489 	(IFM_TYPE((dt)) == 0 || IFM_TYPE((dt)) == IFM_TYPE((t)))
490 
491 #define	IFM_SUBTYPE_DESCRIPTIONS {					\
492 	{ IFM_AUTO,			"autoselect" },			\
493 	{ IFM_AUTO,			"auto" },			\
494 	{ IFM_MANUAL,			"manual" },			\
495 	{ IFM_NONE,			"none" },			\
496 									\
497 	{ IFM_ETHER|IFM_10_T,		"10baseT" },			\
498 	{ IFM_ETHER|IFM_10_T,		"10baseT/UTP" },		\
499 	{ IFM_ETHER|IFM_10_T,		"UTP" },			\
500 	{ IFM_ETHER|IFM_10_T,		"10UTP" },			\
501 	{ IFM_ETHER|IFM_10_2,		"10base2" },			\
502 	{ IFM_ETHER|IFM_10_2,		"10base2/BNC" },		\
503 	{ IFM_ETHER|IFM_10_2,		"BNC" },			\
504 	{ IFM_ETHER|IFM_10_2,		"10BNC" },			\
505 	{ IFM_ETHER|IFM_10_5,		"10base5" },			\
506 	{ IFM_ETHER|IFM_10_5,		"10base5/AUI" },		\
507 	{ IFM_ETHER|IFM_10_5,		"AUI" },			\
508 	{ IFM_ETHER|IFM_10_5,		"10AUI" },			\
509 	{ IFM_ETHER|IFM_100_TX,		"100baseTX" },			\
510 	{ IFM_ETHER|IFM_100_TX,		"100TX" },			\
511 	{ IFM_ETHER|IFM_100_FX,		"100baseFX" },			\
512 	{ IFM_ETHER|IFM_100_FX,		"100FX" },			\
513 	{ IFM_ETHER|IFM_100_T4,		"100baseT4" },			\
514 	{ IFM_ETHER|IFM_100_T4,		"100T4" },			\
515 	{ IFM_ETHER|IFM_100_VG,		"100baseVG" },			\
516 	{ IFM_ETHER|IFM_100_VG,		"100VG" },			\
517 	{ IFM_ETHER|IFM_100_T2,		"100baseT2" },			\
518 	{ IFM_ETHER|IFM_100_T2,		"100T2" },			\
519 	{ IFM_ETHER|IFM_1000_SX,	"1000baseSX" },			\
520 	{ IFM_ETHER|IFM_1000_SX,	"1000SX" },			\
521 	{ IFM_ETHER|IFM_10_STP,		"10baseSTP" },			\
522 	{ IFM_ETHER|IFM_10_STP,		"STP" },			\
523 	{ IFM_ETHER|IFM_10_STP,		"10STP" },			\
524 	{ IFM_ETHER|IFM_10_FL,		"10baseFL" },			\
525 	{ IFM_ETHER|IFM_10_FL,		"FL" },				\
526 	{ IFM_ETHER|IFM_10_FL,		"10FL" },			\
527 	{ IFM_ETHER|IFM_1000_LX,	"1000baseLX" },			\
528 	{ IFM_ETHER|IFM_1000_LX,	"1000LX" },			\
529 	{ IFM_ETHER|IFM_1000_CX,	"1000baseCX" },			\
530 	{ IFM_ETHER|IFM_1000_CX,	"1000CX" },			\
531 	{ IFM_ETHER|IFM_1000_T,		"1000baseT" },			\
532 	{ IFM_ETHER|IFM_1000_T,		"1000T" },			\
533 	{ IFM_ETHER|IFM_1000_T,		"1000baseTX" },			\
534 	{ IFM_ETHER|IFM_1000_T,		"1000TX" },			\
535 	{ IFM_ETHER|IFM_HPNA_1,		"HomePNA1" },			\
536 	{ IFM_ETHER|IFM_HPNA_1,		"HPNA1" },			\
537 	{ IFM_ETHER|IFM_10G_LR,		"10GbaseLR" },			\
538 	{ IFM_ETHER|IFM_10G_LR,		"10GLR" },			\
539 	{ IFM_ETHER|IFM_10G_LR,		"10GBASE-LR" },			\
540 	{ IFM_ETHER|IFM_10G_SR,		"10GbaseSR" },			\
541 	{ IFM_ETHER|IFM_10G_SR,		"10GSR" },			\
542 	{ IFM_ETHER|IFM_10G_SR,		"10GBASE-SR" },			\
543 	{ IFM_ETHER|IFM_10G_CX4,	"10GbaseCX4" },			\
544 	{ IFM_ETHER|IFM_10G_CX4,	"10GCX4" },			\
545 	{ IFM_ETHER|IFM_10G_CX4,	"10GBASE-CX4" },		\
546 	{ IFM_ETHER|IFM_2500_SX,	"2500baseSX" },			\
547 	{ IFM_ETHER|IFM_2500_SX,	"2500SX" },			\
548 	{ IFM_ETHER|IFM_10G_T,		"10GbaseT" },			\
549 	{ IFM_ETHER|IFM_10G_T,		"10GT" },			\
550 	{ IFM_ETHER|IFM_10G_T,		"10GBASE-T" },			\
551 	{ IFM_ETHER|IFM_10G_SFP_CU,	"10GSFP+Cu" },			\
552 	{ IFM_ETHER|IFM_10G_SFP_CU,	"10GCu" },			\
553 	{ IFM_ETHER|IFM_10G_LRM,	"10GbaseLRM" },			\
554 	{ IFM_ETHER|IFM_10G_LRM,	"10GBASE-LRM" },		\
555 	{ IFM_ETHER|IFM_40G_CR4,	"40GbaseCR4" },			\
556 	{ IFM_ETHER|IFM_40G_CR4,	"40GBASE-CR4" },		\
557 	{ IFM_ETHER|IFM_40G_SR4,	"40GbaseSR4" },			\
558 	{ IFM_ETHER|IFM_40G_SR4,	"40GBASE-SR4" },		\
559 	{ IFM_ETHER|IFM_40G_LR4,	"40GbaseLR4" },			\
560 	{ IFM_ETHER|IFM_40G_LR4,	"40GBASE-LR4" },		\
561 	{ IFM_ETHER|IFM_1000_KX,	"1000base-KX" },		\
562 	{ IFM_ETHER|IFM_1000_KX,	"1000BASE-KX" },		\
563 	{ IFM_ETHER|IFM_10G_KX4,	"10GbaseKX4" },			\
564 	{ IFM_ETHER|IFM_10G_KX4,	"10GBASE-KX4" },		\
565 	{ IFM_ETHER|IFM_10G_KR,		"10GbaseKR" },			\
566 	{ IFM_ETHER|IFM_10G_KR,		"10GBASE-KR" },			\
567 	{ IFM_ETHER|IFM_10G_CR1,	"10GbaseCR1" },			\
568 	{ IFM_ETHER|IFM_10G_CR1,	"10GBASE-CR1" },		\
569 	{ IFM_ETHER|IFM_10G_AOC,	"10G-AOC" },			\
570 	{ IFM_ETHER|IFM_20G_KR2,	"20GbaseKR2" },			\
571 	{ IFM_ETHER|IFM_20G_KR2,	"20GBASE-KR2" },		\
572 	{ IFM_ETHER|IFM_2500_KX,	"2500baseKX" },			\
573 	{ IFM_ETHER|IFM_2500_KX,	"2500BASE-KX" },		\
574 	{ IFM_ETHER|IFM_2500_T,		"2500baseT" },			\
575 	{ IFM_ETHER|IFM_2500_T,		"2500BASE-T" },			\
576 	{ IFM_ETHER|IFM_5000_T,		"5000baseT" },			\
577 	{ IFM_ETHER|IFM_5000_T,		"5000BASE-T" },			\
578 	{ IFM_ETHER|IFM_1000_SGMII,	"1000base-SGMII" },		\
579 	{ IFM_ETHER|IFM_1000_SGMII,	"1000BASE-SGMII" },		\
580 	{ IFM_ETHER|IFM_10G_SFI,	"10GbaseSFI" },			\
581 	{ IFM_ETHER|IFM_10G_SFI,	"10GBASE-SFI" },		\
582 	{ IFM_ETHER|IFM_40G_XLPPI,	"40GbaseXLPPI" },		\
583 	{ IFM_ETHER|IFM_40G_XLPPI,	"40GBASE-XLPPI" },		\
584 	{ IFM_ETHER|IFM_1000_CX_SGMII,	"1000baseCX-SGMII" },		\
585 	{ IFM_ETHER|IFM_1000_CX_SGMII,	"1000BASE-CX-SGMII" },		\
586 	{ IFM_ETHER|IFM_40G_KR4,	"40GbaseKR4" },			\
587 	{ IFM_ETHER|IFM_40G_KR4,	"40GBASE-KR4" },		\
588 	{ IFM_ETHER|IFM_40G_AOC,	"40G-AOC" },			\
589 	{ IFM_ETHER|IFM_10G_ER,		"10GbaseER" },			\
590 	{ IFM_ETHER|IFM_10G_ER,		"10GBASE-ER" },			\
591 	{ IFM_ETHER|IFM_100G_CR4,	"100GbaseCR4" },		\
592 	{ IFM_ETHER|IFM_100G_CR4,	"100GBASE-CR4" },		\
593 	{ IFM_ETHER|IFM_100G_SR4,	"100GbaseSR4" },		\
594 	{ IFM_ETHER|IFM_100G_SR4,	"100GBASE-SR4" },		\
595 	{ IFM_ETHER|IFM_100G_KR4,	"100GbaseKR4" },		\
596 	{ IFM_ETHER|IFM_100G_KR4,	"100GBASE-KR4" },		\
597 	{ IFM_ETHER|IFM_100G_LR4,	"100GbaseLR4" },		\
598 	{ IFM_ETHER|IFM_100G_LR4,	"100GBASE-LR4" },		\
599 	{ IFM_ETHER|IFM_100G_AOC,	"100G-AOC" },			\
600 	{ IFM_ETHER|IFM_56G_R4,		"56GbaseR4" },			\
601 	{ IFM_ETHER|IFM_56G_R4,		"56GBASE-R4" },			\
602 	{ IFM_ETHER|IFM_25G_CR,		"25GbaseCR" },			\
603 	{ IFM_ETHER|IFM_25G_CR,		"25GBASE-CR" },			\
604 	{ IFM_ETHER|IFM_25G_KR,		"25GbaseKR" },			\
605 	{ IFM_ETHER|IFM_25G_KR,		"25GBASE-KR" },			\
606 	{ IFM_ETHER|IFM_25G_SR,		"25GbaseSR" },			\
607 	{ IFM_ETHER|IFM_25G_SR,		"25GBASE-SR" },			\
608 	{ IFM_ETHER|IFM_25G_LR,		"25GbaseLR" },			\
609 	{ IFM_ETHER|IFM_25G_LR,		"25GBASE-LR" },			\
610 	{ IFM_ETHER|IFM_25G_ER,		"25GbaseER" },			\
611 	{ IFM_ETHER|IFM_25G_ER,		"25GBASE-ER" },			\
612 	{ IFM_ETHER|IFM_25G_AOC,	"25G-AOC" },			\
613 	{ IFM_ETHER|IFM_50G_CR2,	"50GbaseCR2" },			\
614 	{ IFM_ETHER|IFM_50G_CR2,	"50GBASE-CR2" },		\
615 	{ IFM_ETHER|IFM_50G_KR2,	"50GbaseKR2" },			\
616 	{ IFM_ETHER|IFM_50G_KR2,	"50GBASE-KR2" },		\
617 									\
618 	{ IFM_FDDI|IFM_FDDI_SMF,	"Single-mode" },		\
619 	{ IFM_FDDI|IFM_FDDI_SMF,	"SMF" },			\
620 	{ IFM_FDDI|IFM_FDDI_MMF,	"Multi-mode" },			\
621 	{ IFM_FDDI|IFM_FDDI_MMF,	"MMF" },			\
622 	{ IFM_FDDI|IFM_FDDI_UTP,	"UTP" },			\
623 	{ IFM_FDDI|IFM_FDDI_UTP,	"CDDI" },			\
624 									\
625 	{ IFM_IEEE80211|IFM_IEEE80211_FH1,	"FH1" },		\
626 	{ IFM_IEEE80211|IFM_IEEE80211_FH2,	"FH2" },		\
627 	{ IFM_IEEE80211|IFM_IEEE80211_DS2,	"DS2" },		\
628 	{ IFM_IEEE80211|IFM_IEEE80211_DS5,	"DS5" },		\
629 	{ IFM_IEEE80211|IFM_IEEE80211_DS11,	"DS11" },		\
630 	{ IFM_IEEE80211|IFM_IEEE80211_DS1,	"DS1" },		\
631 	{ IFM_IEEE80211|IFM_IEEE80211_DS22,	"DS22" },		\
632 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM6,	"OFDM6" },		\
633 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM9,	"OFDM9" },		\
634 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM12,	"OFDM12" },		\
635 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM18,	"OFDM18" },		\
636 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM24,	"OFDM24" },		\
637 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM36,	"OFDM36" },		\
638 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM48,	"OFDM48" },		\
639 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM54,	"OFDM54" },		\
640 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM72,	"OFDM72" },		\
641 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS0,	"HT-MCS0" },		\
642 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS1,	"HT-MCS1" },		\
643 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS2,	"HT-MCS2" },		\
644 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS3,	"HT-MCS3" },		\
645 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS4,	"HT-MCS4" },		\
646 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS5,	"HT-MCS5" },		\
647 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS6,	"HT-MCS6" },		\
648 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS7,	"HT-MCS7" },		\
649 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS8,	"HT-MCS8" },		\
650 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS9,	"HT-MCS9" },		\
651 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS10,	"HT-MCS10" },		\
652 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS11,	"HT-MCS11" },		\
653 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS12,	"HT-MCS12" },		\
654 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS13,	"HT-MCS13" },		\
655 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS14,	"HT-MCS14" },		\
656 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS15,	"HT-MCS15" },		\
657 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS16,	"HT-MCS16" },		\
658 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS17,	"HT-MCS17" },		\
659 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS18,	"HT-MCS18" },		\
660 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS19,	"HT-MCS19" },		\
661 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS20,	"HT-MCS20" },		\
662 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS21,	"HT-MCS21" },		\
663 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS22,	"HT-MCS22" },		\
664 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS23,	"HT-MCS23" },		\
665 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS24,	"HT-MCS24" },		\
666 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS25,	"HT-MCS25" },		\
667 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS26,	"HT-MCS26" },		\
668 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS27,	"HT-MCS27" },		\
669 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS28,	"HT-MCS28" },		\
670 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS29,	"HT-MCS29" },		\
671 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS30,	"HT-MCS30" },		\
672 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS31,	"HT-MCS31" },		\
673 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS32,	"HT-MCS32" },		\
674 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS33,	"HT-MCS33" },		\
675 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS34,	"HT-MCS34" },		\
676 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS35,	"HT-MCS35" },		\
677 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS36,	"HT-MCS36" },		\
678 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS37,	"HT-MCS37" },		\
679 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS38,	"HT-MCS38" },		\
680 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS39,	"HT-MCS39" },		\
681 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS40,	"HT-MCS40" },		\
682 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS41,	"HT-MCS41" },		\
683 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS42,	"HT-MCS42" },		\
684 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS43,	"HT-MCS43" },		\
685 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS44,	"HT-MCS44" },		\
686 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS45,	"HT-MCS45" },		\
687 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS46,	"HT-MCS46" },		\
688 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS47,	"HT-MCS47" },		\
689 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS48,	"HT-MCS48" },		\
690 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS49,	"HT-MCS49" },		\
691 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS50,	"HT-MCS50" },		\
692 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS51,	"HT-MCS51" },		\
693 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS52,	"HT-MCS52" },		\
694 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS53,	"HT-MCS53" },		\
695 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS54,	"HT-MCS54" },		\
696 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS55,	"HT-MCS55" },		\
697 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS56,	"HT-MCS56" },		\
698 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS57,	"HT-MCS57" },		\
699 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS58,	"HT-MCS58" },		\
700 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS59,	"HT-MCS59" },		\
701 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS60,	"HT-MCS60" },		\
702 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS61,	"HT-MCS61" },		\
703 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS62,	"HT-MCS62" },		\
704 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS63,	"HT-MCS63" },		\
705 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS64,	"HT-MCS64" },		\
706 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS65,	"HT-MCS65" },		\
707 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS66,	"HT-MCS66" },		\
708 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS67,	"HT-MCS67" },		\
709 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS68,	"HT-MCS68" },		\
710 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS69,	"HT-MCS69" },		\
711 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS70,	"HT-MCS70" },		\
712 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS71,	"HT-MCS71" },		\
713 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS72,	"HT-MCS72" },		\
714 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS73,	"HT-MCS73" },		\
715 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS74,	"HT-MCS74" },		\
716 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS75,	"HT-MCS75" },		\
717 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS76,	"HT-MCS76" },		\
718 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS0,	"VHT-MCS0" },		\
719 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS1,	"VHT-MCS1" },		\
720 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS2,	"VHT-MCS2" },		\
721 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS3,	"VHT-MCS3" },		\
722 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS4,	"VHT-MCS4" },		\
723 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS5,	"VHT-MCS5" },		\
724 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS6,	"VHT-MCS6" },		\
725 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS7,	"VHT-MCS7" },		\
726 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS8,	"VHT-MCS8" },		\
727 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS9,	"VHT-MCS9" },		\
728 									\
729 	{ IFM_TDM|IFM_TDM_T1,		"t1" },				\
730 	{ IFM_TDM|IFM_TDM_T1_AMI,	"t1-ami" },			\
731 	{ IFM_TDM|IFM_TDM_E1,		"e1" },				\
732 	{ IFM_TDM|IFM_TDM_E1_G704,	"e1-g.704" },			\
733 	{ IFM_TDM|IFM_TDM_E1_AMI,	"e1-ami" },			\
734 	{ IFM_TDM|IFM_TDM_E1_AMI_G704,	"e1-ami-g.704" },		\
735 	{ IFM_TDM|IFM_TDM_T3,		"t3" },				\
736 	{ IFM_TDM|IFM_TDM_T3_M13,	"t3-m13" },			\
737 	{ IFM_TDM|IFM_TDM_E3,		"e3" },				\
738 	{ IFM_TDM|IFM_TDM_E3_G751,	"e3-g.751" },			\
739 	{ IFM_TDM|IFM_TDM_E3_G832,	"e3-g.832" },			\
740 	{ IFM_TDM|IFM_TDM_E1_G704_CRC4,	"e1-g.704-crc4" },		\
741 									\
742 	{ 0, NULL },							\
743 }
744 
745 #define IFM_MODE_DESCRIPTIONS {						\
746 	{ IFM_AUTO,				"autoselect" },		\
747 	{ IFM_AUTO,				"auto" },		\
748 	{ IFM_IEEE80211|IFM_IEEE80211_11A,	"11a" },		\
749 	{ IFM_IEEE80211|IFM_IEEE80211_11B,	"11b" },		\
750 	{ IFM_IEEE80211|IFM_IEEE80211_11G,	"11g" },		\
751 	{ IFM_IEEE80211|IFM_IEEE80211_FH,	"fh" },			\
752 	{ IFM_IEEE80211|IFM_IEEE80211_11N,	"11n" },		\
753 	{ IFM_IEEE80211|IFM_IEEE80211_11AC,	"11ac" },		\
754 	{ IFM_TDM|IFM_TDM_MASTER,		"master" },		\
755 	{ 0, NULL },							\
756 }
757 
758 #define	IFM_OPTION_DESCRIPTIONS {					\
759 	{ IFM_FDX,			"full-duplex" },		\
760 	{ IFM_FDX,			"fdx" },			\
761 	{ IFM_HDX,			"half-duplex" },		\
762 	{ IFM_HDX,			"hdx" },			\
763 	{ IFM_FLAG0,			"flag0" },			\
764 	{ IFM_FLAG1,			"flag1" },			\
765 	{ IFM_FLAG2,			"flag2" },			\
766 	{ IFM_LOOP,			"loopback" },			\
767 	{ IFM_LOOP,			"hw-loopback"},			\
768 	{ IFM_LOOP,			"loop" },			\
769 									\
770 	{ IFM_ETHER|IFM_ETH_MASTER,	"master" },			\
771 	{ IFM_ETHER|IFM_ETH_RXPAUSE,	"rxpause" },			\
772 	{ IFM_ETHER|IFM_ETH_TXPAUSE,	"txpause" },			\
773 									\
774 	{ IFM_FDDI|IFM_FDDI_DA,		"dual-attach" },		\
775 	{ IFM_FDDI|IFM_FDDI_DA,		"das" },			\
776 									\
777 	{ IFM_IEEE80211|IFM_IEEE80211_ADHOC,	"adhoc" },		\
778 	{ IFM_IEEE80211|IFM_IEEE80211_HOSTAP,	"hostap" },		\
779 	{ IFM_IEEE80211|IFM_IEEE80211_IBSS,	"ibss" },		\
780 	{ IFM_IEEE80211|IFM_IEEE80211_IBSSMASTER, "ibss-master" },	\
781 	{ IFM_IEEE80211|IFM_IEEE80211_MONITOR,	"monitor" },		\
782 									\
783 	{ IFM_TDM|IFM_TDM_HDLC_CRC16,	"hdlc-crc16" },			\
784 	{ IFM_TDM|IFM_TDM_PPP,		"ppp" },			\
785 	{ IFM_TDM|IFM_TDM_FR_ANSI,	"framerelay-ansi" },		\
786 	{ IFM_TDM|IFM_TDM_FR_CISCO,	"framerelay-cisco" },		\
787 	{ IFM_TDM|IFM_TDM_FR_ANSI,	"framerelay-itu" },		\
788 									\
789 	{ 0, NULL },							\
790 }
791 
792 /*
793  * Baudrate descriptions for the various media types.
794  */
795 struct ifmedia_baudrate {
796 	uint64_t	ifmb_word;		/* media word */
797 	uint64_t	ifmb_baudrate;		/* corresponding baudrate */
798 };
799 
800 #define	IFM_BAUDRATE_DESCRIPTIONS {					\
801 	{ IFM_ETHER|IFM_10_T,		IF_Mbps(10) },			\
802 	{ IFM_ETHER|IFM_10_2,		IF_Mbps(10) },			\
803 	{ IFM_ETHER|IFM_10_5,		IF_Mbps(10) },			\
804 	{ IFM_ETHER|IFM_100_TX,		IF_Mbps(100) },			\
805 	{ IFM_ETHER|IFM_100_FX,		IF_Mbps(100) },			\
806 	{ IFM_ETHER|IFM_100_T4,		IF_Mbps(100) },			\
807 	{ IFM_ETHER|IFM_100_VG,		IF_Mbps(100) },			\
808 	{ IFM_ETHER|IFM_100_T2,		IF_Mbps(100) },			\
809 	{ IFM_ETHER|IFM_1000_SX,	IF_Mbps(1000) },		\
810 	{ IFM_ETHER|IFM_10_STP,		IF_Mbps(10) },			\
811 	{ IFM_ETHER|IFM_10_FL,		IF_Mbps(10) },			\
812 	{ IFM_ETHER|IFM_1000_LX,	IF_Mbps(1000) },		\
813 	{ IFM_ETHER|IFM_1000_CX,	IF_Mbps(1000) },		\
814 	{ IFM_ETHER|IFM_1000_T,		IF_Mbps(1000) },		\
815 	{ IFM_ETHER|IFM_HPNA_1,		IF_Mbps(1) },			\
816 	{ IFM_ETHER|IFM_10G_LR,		IF_Gbps(10) },			\
817 	{ IFM_ETHER|IFM_10G_SR,		IF_Gbps(10) },			\
818 	{ IFM_ETHER|IFM_10G_CX4,	IF_Gbps(10) },			\
819 	{ IFM_ETHER|IFM_2500_SX,	IF_Mbps(2500) },		\
820 	{ IFM_ETHER|IFM_10G_T,		IF_Gbps(10) },			\
821 	{ IFM_ETHER|IFM_10G_SFP_CU,	IF_Gbps(10) },			\
822 									\
823 	{ IFM_FDDI|IFM_FDDI_SMF,	IF_Mbps(100) },			\
824 	{ IFM_FDDI|IFM_FDDI_MMF,	IF_Mbps(100) },			\
825 	{ IFM_FDDI|IFM_FDDI_UTP,	IF_Mbps(100) },			\
826 									\
827 	{ IFM_IEEE80211|IFM_IEEE80211_FH1, IF_Mbps(1) },		\
828 	{ IFM_IEEE80211|IFM_IEEE80211_FH2, IF_Mbps(2) },		\
829 	{ IFM_IEEE80211|IFM_IEEE80211_DS1, IF_Mbps(1) },		\
830 	{ IFM_IEEE80211|IFM_IEEE80211_DS2, IF_Mbps(2) },		\
831 	{ IFM_IEEE80211|IFM_IEEE80211_DS5, IF_Mbps(5) },		\
832 	{ IFM_IEEE80211|IFM_IEEE80211_DS11, IF_Mbps(11) },		\
833 	{ IFM_IEEE80211|IFM_IEEE80211_DS22, IF_Mbps(22) },		\
834 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM6, IF_Mbps(6) },		\
835 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM9, IF_Mbps(9) },		\
836 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM12, IF_Mbps(12) },		\
837 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM18, IF_Mbps(18) },		\
838 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM24, IF_Mbps(24) },		\
839 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM36, IF_Mbps(36) },		\
840 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM48, IF_Mbps(48) },		\
841 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM54, IF_Mbps(54) },		\
842 	{ IFM_IEEE80211|IFM_IEEE80211_OFDM72, IF_Mbps(72) },		\
843 	/* These HT rates correspond to 20 MHz channel with no SGI. */	\
844 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS0, IF_Kbps(6500) },		\
845 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS1, IF_Mbps(13) },		\
846 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS2, IF_Kbps(19500) },	\
847 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS3, IF_Mbps(26) },		\
848 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS4, IF_Mbps(39) },		\
849 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS5, IF_Mbps(52) },		\
850 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS6, IF_Kbps(58500) },	\
851 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS7, IF_Mbps(65) },		\
852 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS8, IF_Mbps(13) },		\
853 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS9, IF_Mbps(26) },		\
854 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS10, IF_Mbps(39) },		\
855 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS11, IF_Mbps(52) },		\
856 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS12, IF_Mbps(78) },		\
857 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS13, IF_Mbps(104) },		\
858 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS14, IF_Mbps(117) },		\
859 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS15, IF_Mbps(130) },		\
860 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS16, IF_Kbps(19500) },	\
861 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS17, IF_Mbps(39) },		\
862 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS18, IF_Kbps(58500) },	\
863 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS19, IF_Mbps(78) },		\
864 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS20, IF_Mbps(117) },		\
865 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS21, IF_Mbps(156) },		\
866 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS22, IF_Kbps(175500) },	\
867 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS23, IF_Mbps(195) },		\
868 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS24, IF_Mbps(26) },		\
869 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS25, IF_Mbps(52) },		\
870 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS26, IF_Mbps(78) },		\
871 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS27, IF_Mbps(104) },		\
872 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS28, IF_Mbps(156) },		\
873 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS29, IF_Mbps(208) },		\
874 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS30, IF_Mbps(234) },		\
875 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS31, IF_Mbps(260) },		\
876 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS32, IF_Mbps(0) },		\
877 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS33, IF_Mbps(39) },		\
878 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS34, IF_Mbps(52) },		\
879 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS35, IF_Mbps(65) },		\
880 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS36, IF_Kbps(58500) },	\
881 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS37, IF_Mbps(78) },		\
882 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS38, IF_Kbps(97500) },	\
883 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS39, IF_Mbps(52) },		\
884 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS40, IF_Mbps(65) },		\
885 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS41, IF_Mbps(65) },		\
886 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS42, IF_Mbps(78) },		\
887 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS43, IF_Mbps(91) },		\
888 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS44, IF_Mbps(91) },		\
889 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS45, IF_Mbps(104) },		\
890 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS46, IF_Mbps(78) },		\
891 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS47, IF_Kbps(97500) },	\
892 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS48, IF_Kbps(97500) },	\
893 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS49, IF_Mbps(117) },		\
894 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS50, IF_Kbps(136500) },	\
895 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS51, IF_Kbps(136500) },	\
896 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS52, IF_Mbps(156) },		\
897 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS53, IF_Mbps(65) },		\
898 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS54, IF_Mbps(78) },		\
899 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS55, IF_Mbps(91) },		\
900 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS56, IF_Mbps(78) },		\
901 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS57, IF_Mbps(91) },		\
902 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS58, IF_Mbps(104) },		\
903 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS59, IF_Mbps(117) },		\
904 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS60, IF_Mbps(104) },		\
905 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS61, IF_Mbps(117) },		\
906 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS62, IF_Mbps(130) },		\
907 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS63, IF_Mbps(130) },		\
908 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS64, IF_Mbps(143) },		\
909 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS65, IF_Kbps(97500) },	\
910 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS66, IF_Mbps(117) },		\
911 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS67, IF_Kbps(136500) },	\
912 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS68, IF_Mbps(117) },		\
913 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS69, IF_Kbps(136500) },	\
914 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS70, IF_Mbps(156) },		\
915 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS71, IF_Kbps(175500) },	\
916 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS72, IF_Mbps(156) },		\
917 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS73, IF_Kbps(175500) },	\
918 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS74, IF_Mbps(195) },		\
919 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS75, IF_Mbps(195) },		\
920 	{ IFM_IEEE80211|IFM_IEEE80211_HT_MCS76, IF_Kbps(214500) },	\
921 	/* These VHT rates correspond to 1 SS, no SGI, 40 MHz channel.*/\
922 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS0, IF_Kbps(13500) },	\
923 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS1, IF_Mbps(27) },		\
924 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS2, IF_Kbps(40500) },	\
925 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS3, IF_Mbps(54) },		\
926 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS4, IF_Mbps(81) },		\
927 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS5, IF_Mbps(108) },		\
928 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS6, IF_Kbps(121500) },	\
929 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS7, IF_Mbps(135) },		\
930 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS8, IF_Mbps(162) },		\
931 	{ IFM_IEEE80211|IFM_IEEE80211_VHT_MCS9, IF_Mbps(180) },		\
932 									\
933 	{ IFM_TDM|IFM_TDM_T1,		IF_Kbps(1536) },		\
934 	{ IFM_TDM|IFM_TDM_T1_AMI,	IF_Kbps(1536) },		\
935 	{ IFM_TDM|IFM_TDM_E1,		IF_Kbps(2048) },		\
936 	{ IFM_TDM|IFM_TDM_E1_G704,	IF_Kbps(2048) },		\
937 	{ IFM_TDM|IFM_TDM_E1_AMI,	IF_Kbps(2048) },		\
938 	{ IFM_TDM|IFM_TDM_E1_AMI_G704,	IF_Kbps(2048) },		\
939 	{ IFM_TDM|IFM_TDM_T3,		IF_Kbps(44736) },		\
940 	{ IFM_TDM|IFM_TDM_T3_M13,	IF_Kbps(44736) },		\
941 	{ IFM_TDM|IFM_TDM_E3,		IF_Kbps(34368) },		\
942 	{ IFM_TDM|IFM_TDM_E3_G751,	IF_Kbps(34368) },		\
943 	{ IFM_TDM|IFM_TDM_E3_G832,	IF_Kbps(34368) },		\
944 	{ IFM_TDM|IFM_TDM_E1_G704_CRC4,	IF_Kbps(2048) },		\
945 									\
946 	{ 0, 0 },							\
947 }
948 
949 /*
950  * Status bit descriptions for the various media types.
951  */
952 struct ifmedia_status_description {
953 	uint64_t	ifms_type;
954 	uint64_t	ifms_valid;
955 	uint64_t	ifms_bit;
956 	const char *ifms_string[2];
957 };
958 
959 #define	IFM_STATUS_DESC(ifms, bit)					\
960 	(ifms)->ifms_string[((ifms)->ifms_bit & (bit)) ? 1 : 0]
961 
962 #define	IFM_STATUS_DESCRIPTIONS {					\
963 	{ IFM_ETHER,		IFM_AVALID,	IFM_ACTIVE,		\
964 	    { "no carrier", "active" } },				\
965 	{ IFM_FDDI,		IFM_AVALID,	IFM_ACTIVE,		\
966 	    { "no ring", "inserted" } },				\
967 	{ IFM_IEEE80211,	IFM_AVALID,	IFM_ACTIVE,		\
968 	    { "no network", "active" } },				\
969 	{ IFM_TDM,		IFM_AVALID,	IFM_ACTIVE,		\
970 	    { "no carrier", "active" } },				\
971 	{ IFM_CARP,		IFM_AVALID,	IFM_ACTIVE,		\
972 	    { "backup", "master" } },					\
973 	{ 0,			0,		0,			\
974 	    { NULL, NULL } }						\
975 }
976 #endif	/* _NET_IF_MEDIA_H_ */
977