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