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