Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / net / if_media.h @ 14

History | View | Annotate | Download (24.4 KB)

1 13 up20180614
/*        $NetBSD: if_media.h,v 1.56 2012/10/25 10:59:43 msaitoh Exp $        */
2
3
/*-
4
 * Copyright (c) 1998, 2000, 2001 The NetBSD Foundation, Inc.
5
 * All rights reserved.
6
 *
7
 * This code is derived from software contributed to The NetBSD Foundation
8
 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9
 * NASA Ames Research Center.
10
 *
11
 * Redistribution and use in source and binary forms, with or without
12
 * modification, are permitted provided that the following conditions
13
 * are met:
14
 * 1. Redistributions of source code must retain the above copyright
15
 *    notice, this list of conditions and the following disclaimer.
16
 * 2. Redistributions in binary form must reproduce the above copyright
17
 *    notice, this list of conditions and the following disclaimer in the
18
 *    documentation and/or other materials provided with the distribution.
19
 *
20
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
 * POSSIBILITY OF SUCH DAMAGE.
31
 */
32
33
/*
34
 * Copyright (c) 1997
35
 *        Jonathan Stone and Jason R. Thorpe.  All rights reserved.
36
 *
37
 * This software is derived from information provided by Matt Thomas.
38
 *
39
 * Redistribution and use in source and binary forms, with or without
40
 * modification, are permitted provided that the following conditions
41
 * are met:
42
 * 1. Redistributions of source code must retain the above copyright
43
 *    notice, this list of conditions and the following disclaimer.
44
 * 2. Redistributions in binary form must reproduce the above copyright
45
 *    notice, this list of conditions and the following disclaimer in the
46
 *    documentation and/or other materials provided with the distribution.
47
 * 3. All advertising materials mentioning features or use of this software
48
 *    must display the following acknowledgement:
49
 *        This product includes software developed by Jonathan Stone
50
 *        and Jason R. Thorpe for the NetBSD Project.
51
 * 4. The names of the authors may not be used to endorse or promote products
52
 *    derived from this software without specific prior written permission.
53
 *
54
 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
55
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
56
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
57
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
58
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
59
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
60
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
61
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
62
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
63
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
64
 * SUCH DAMAGE.
65
 */
66
67
#ifndef _NET_IF_MEDIA_H_
68
#define _NET_IF_MEDIA_H_
69
70
/*
71
 * Prototypes and definitions for BSD/OS-compatible network interface
72
 * media selection.
73
 *
74
 * Where it is safe to do so, this code strays slightly from the BSD/OS
75
 * design.  Software which uses the API (device drivers, basically)
76
 * shouldn't notice any difference.
77
 *
78
 * Many thanks to Matt Thomas for providing the information necessary
79
 * to implement this interface.
80
 */
81
82
#ifdef _KERNEL
83
84
#include <sys/queue.h>
85
86
/*
87
 * Driver callbacks for media status and change requests.
88
 */
89
typedef        int (*ifm_change_cb_t)(struct ifnet *);
90
typedef        void (*ifm_stat_cb_t)(struct ifnet *, struct ifmediareq *);
91
92
/*
93
 * In-kernel representation of a single supported media type.
94
 */
95
struct ifmedia_entry {
96
        TAILQ_ENTRY(ifmedia_entry) ifm_list;
97
        u_int        ifm_media;        /* description of this media attachment */
98
        u_int        ifm_data;        /* for driver-specific use */
99
        void        *ifm_aux;        /* for driver-specific use */
100
};
101
102
/*
103
 * One of these goes into a network interface's softc structure.
104
 * It is used to keep general media state.
105
 */
106
struct ifmedia {
107
        u_int        ifm_mask;        /* mask of changes we don't care about */
108
        u_int        ifm_media;        /* current user-set media word */
109
        struct ifmedia_entry *ifm_cur;        /* currently selected media */
110
        TAILQ_HEAD(, ifmedia_entry) ifm_list; /* list of all supported media */
111
        ifm_change_cb_t        ifm_change;        /* media change driver callback */
112
        ifm_stat_cb_t        ifm_status;        /* media status driver callback */
113
};
114
115
/* Initialize an interface's struct if_media field. */
116
void        ifmedia_init(struct ifmedia *, int, ifm_change_cb_t, ifm_stat_cb_t);
117
118
int ifmedia_change(struct ifmedia *, struct ifnet *);
119
120
/* Add one supported medium to a struct ifmedia. */
121
void        ifmedia_add(struct ifmedia *, int, int, void *);
122
123
/* Add an array (of ifmedia_entry) media to a struct ifmedia. */
124
void        ifmedia_list_add(struct ifmedia *, struct ifmedia_entry *, int);
125
126
/* Set default media type on initialization. */
127
void        ifmedia_set(struct ifmedia *ifm, int mword);
128
129
/* Common ioctl function for getting/setting media, called by driver. */
130
int        ifmedia_ioctl(struct ifnet *, struct ifreq *, struct ifmedia *, u_long);
131
132
/* Look up a media entry. */
133
struct ifmedia_entry *ifmedia_match(struct ifmedia *, u_int, u_int);
134
135
/* Delete all media for a given media instance */
136
void        ifmedia_delete_instance(struct ifmedia *, u_int);
137
138
/* Compute baudrate for a given media. */
139
uint64_t        ifmedia_baudrate(int);
140
141
/* Remove all media */
142
void                ifmedia_removeall(struct ifmedia *);
143
144
#endif /*_KERNEL */
145
146
/*
147
 * if_media Options word:
148
 *        Bits        Use
149
 *        ----        -------
150
 *        0-4        Media subtype                MAX SUBTYPE == 31!
151
 *        5-7        Media type
152
 *        8-15        Type specific options
153
 *        16-18        Mode (for multi-mode devices)
154
 *        19        RFU
155
 *        20-27        Shared (global) options
156
 *        28-31        Instance
157
 */
158
159
/*
160
 * Ethernet
161
 */
162
#define        IFM_ETHER        0x00000020
163
#define        IFM_10_T        3                /* 10BaseT - RJ45 */
164
#define        IFM_10_2        4                /* 10Base2 - Thinnet */
165
#define        IFM_10_5        5                /* 10Base5 - AUI */
166
#define        IFM_100_TX        6                /* 100BaseTX - RJ45 */
167
#define        IFM_100_FX        7                /* 100BaseFX - Fiber */
168
#define        IFM_100_T4        8                /* 100BaseT4 - 4 pair cat 3 */
169
#define        IFM_100_VG        9                /* 100VG-AnyLAN */
170
#define        IFM_100_T2        10                /* 100BaseT2 */
171
#define        IFM_1000_SX        11                /* 1000BaseSX - multi-mode fiber */
172
#define        IFM_10_STP        12                /* 10BaseT over shielded TP */
173
#define        IFM_10_FL        13                /* 10BaseFL - Fiber */
174
#define        IFM_1000_LX        14                /* 1000baseLX - single-mode fiber */
175
#define        IFM_1000_CX        15                /* 1000baseCX - 150ohm STP */
176
#define        IFM_1000_T        16                /* 1000baseT - 4 pair cat 5 */
177
#define        IFM_HPNA_1        17                /* HomePNA 1.0 (1Mb/s) */
178
#define        IFM_10G_LR        18                /* 10GbaseLR - single-mode fiber */
179
#define        IFM_10G_SR        19                /* 10GBase-SR 850nm Multi-mode */
180
#define        IFM_10G_CX4        20                /* 10GBase CX4 copper */
181
#define        IFM_2500_SX        21                /* 2500baseSX - multi-mode fiber */
182
#define        IFM_1000_BX10        22                /* 1000base-BX10 */
183
#define        IFM_10G_TWINAX        23                /* 10GBase Twinax copper */
184
#define        IFM_10G_TWINAX_LONG        24        /* 10GBase Twinax Long copper */
185
#define        IFM_10G_LRM        25                /* 10GBase-LRM 850nm Multi-mode */
186
#define        IFM_10G_T        26                /* 10GBase-T - RJ45 */
187
188
#define        IFM_ETH_MASTER        0x00000100        /* master mode (1000baseT) */
189
#define        IFM_ETH_RXPAUSE        0x00000200        /* receive PAUSE frames */
190
#define        IFM_ETH_TXPAUSE        0x00000400        /* transmit PAUSE frames */
191
192
/*
193
 * Token ring
194
 */
195
#define        IFM_TOKEN        0x00000040
196
#define        IFM_TOK_STP4        3                /* Shielded twisted pair 4m - DB9 */
197
#define        IFM_TOK_STP16        4                /* Shielded twisted pair 16m - DB9 */
198
#define        IFM_TOK_UTP4        5                /* Unshielded twisted pair 4m - RJ45 */
199
#define        IFM_TOK_UTP16        6                /* Unshielded twisted pair 16m - RJ45 */
200
#define        IFM_TOK_ETR        0x00000200        /* Early token release */
201
#define        IFM_TOK_SRCRT        0x00000400        /* Enable source routing features */
202
#define        IFM_TOK_ALLR        0x00000800        /* All routes / Single route bcast */
203
204
/*
205
 * FDDI
206
 */
207
#define        IFM_FDDI        0x00000060
208
#define        IFM_FDDI_SMF        3                /* Single-mode fiber */
209
#define        IFM_FDDI_MMF        4                /* Multi-mode fiber */
210
#define        IFM_FDDI_UTP        5                /* CDDI / UTP */
211
#define        IFM_FDDI_DA        0x00000100        /* Dual attach / single attach */
212
213
/*
214
 * IEEE 802.11 Wireless
215
 */
216
#define        IFM_IEEE80211        0x00000080
217
#define        IFM_IEEE80211_FH1        3        /* Frequency Hopping 1Mbps */
218
#define        IFM_IEEE80211_FH2        4        /* Frequency Hopping 2Mbps */
219
#define        IFM_IEEE80211_DS2        5        /* Direct Sequence 2Mbps */
220
#define        IFM_IEEE80211_DS5        6        /* Direct Sequence 5Mbps*/
221
#define        IFM_IEEE80211_DS11        7        /* Direct Sequence 11Mbps*/
222
#define        IFM_IEEE80211_DS1        8        /* Direct Sequence 1Mbps */
223
#define        IFM_IEEE80211_DS22        9        /* Direct Sequence 22Mbps */
224
#define        IFM_IEEE80211_OFDM6        10        /* OFDM 6Mbps */
225
#define        IFM_IEEE80211_OFDM9        11        /* OFDM 9Mbps */
226
#define        IFM_IEEE80211_OFDM12        12        /* OFDM 12Mbps */
227
#define        IFM_IEEE80211_OFDM18        13        /* OFDM 18Mbps */
228
#define        IFM_IEEE80211_OFDM24        14        /* OFDM 24Mbps */
229
#define        IFM_IEEE80211_OFDM36        15        /* OFDM 36Mbps */
230
#define        IFM_IEEE80211_OFDM48        16        /* OFDM 48Mbps */
231
#define        IFM_IEEE80211_OFDM54        17        /* OFDM 54Mbps */
232
#define        IFM_IEEE80211_OFDM72        18        /* OFDM 72Mbps */
233
#define        IFM_IEEE80211_DS354k        19        /* Direct Sequence 354Kbps */
234
#define        IFM_IEEE80211_DS512k        20        /* Direct Sequence 512Kbps */
235
#define        IFM_IEEE80211_OFDM3        21        /* OFDM 3Mbps */
236
#define        IFM_IEEE80211_OFDM4        22        /* OFDM 4.5Mbps */
237
#define        IFM_IEEE80211_OFDM27        23        /* OFDM 27Mbps */
238
/* NB: not enough bits to express MCS fully */
239
#define        IFM_IEEE80211_MCS        24        /* HT MCS rate */
240
241
#define        IFM_IEEE80211_ADHOC        0x00000100        /* Operate in Adhoc mode */
242
#define        IFM_IEEE80211_HOSTAP        0x00000200        /* Operate in Host AP mode */
243
#define        IFM_IEEE80211_MONITOR        0x00000400        /* Operate in Monitor mode */
244
#define        IFM_IEEE80211_TURBO        0x00000800        /* Operate in Turbo mode */
245
#define        IFM_IEEE80211_IBSS        0x00001000        /* Operate in IBSS mode */
246
#define        IFM_IEEE80211_WDS         0x00002000        /* Operate as an WDS master */
247
#define        IFM_IEEE80211_MBSS        0x00004000        /* Operate in MBSS mode */
248
249
/* operating mode for multi-mode devices */
250
#define        IFM_IEEE80211_11A        0x00010000        /* 5 GHz, OFDM mode */
251
#define        IFM_IEEE80211_11B        0x00020000        /* Direct Sequence mode */
252
#define        IFM_IEEE80211_11G        0x00030000        /* 2 GHz, CCK mode */
253
#define        IFM_IEEE80211_FH        0x00040000        /* 2 GHz, GFSK mode */
254
#define        IFM_IEEE80211_11NA        0x00050000        /* 5Ghz, HT mode */
255
#define        IFM_IEEE80211_11NG        0x00060000        /* 2Ghz, HT mode */
256
257
258
/*
259
 * Common Address Redundancy Protocol
260
 */
261
#define        IFM_CARP                0x000000c0
262
263
/*
264
 * Shared media sub-types
265
 */
266
#define        IFM_AUTO        0                /* Autoselect best media */
267
#define        IFM_MANUAL        1                /* Jumper/dipswitch selects media */
268
#define        IFM_NONE        2                /* Deselect all media */
269
270
/*
271
 * Shared options
272
 */
273
#define        IFM_FDX                0x00100000        /* Force full duplex */
274
#define        IFM_HDX                0x00200000        /* Force half duplex */
275
#define        IFM_FLOW        0x00400000        /* enable hardware flow control */
276
#define        IFM_FLAG0        0x01000000        /* Driver defined flag */
277
#define        IFM_FLAG1        0x02000000        /* Driver defined flag */
278
#define        IFM_FLAG2        0x04000000        /* Driver defined flag */
279
#define        IFM_LOOP        0x08000000        /* Put hardware in loopback */
280
281
/*
282
 * Masks
283
 */
284
#define        IFM_NMASK        0x000000e0        /* Network type */
285
#define        IFM_TMASK        0x0000001f        /* Media sub-type */
286
#define        IFM_IMASK        0xf0000000        /* Instance */
287
#define        IFM_ISHIFT        28                /* Instance shift */
288
#define        IFM_OMASK        0x0000ff00        /* Type specific options */
289
#define        IFM_MMASK        0x00070000        /* Mode */
290
#define        IFM_MSHIFT        16                /* Mode shift */
291
#define        IFM_GMASK        0x0ff00000        /* Global options */
292
293
        /* Ethernet flow control mask */
294
#define        IFM_ETH_FMASK        (IFM_FLOW | IFM_ETH_RXPAUSE | IFM_ETH_TXPAUSE)
295
296
#define        IFM_NMIN        IFM_ETHER        /* lowest Network type */
297
#define        IFM_NMAX        IFM_NMASK        /* highest Network type */
298
299
/*
300
 * Status bits
301
 */
302
#define        IFM_AVALID        0x00000001        /* Active bit valid */
303
#define        IFM_ACTIVE        0x00000002        /* Interface attached to working net */
304
305
/* Mask of "status valid" bits, for ifconfig(8). */
306
#define        IFM_STATUS_VALID IFM_AVALID
307
308
/* List of "status valid" bits, for ifconfig(8). */
309
#define        IFM_STATUS_VALID_LIST {                                                \
310
        IFM_AVALID,                                                        \
311
        0,                                                                \
312
}
313
314
/*
315
 * Macros to extract various bits of information from the media word.
316
 */
317
#define        IFM_TYPE(x)        ((x) & IFM_NMASK)
318
#define        IFM_SUBTYPE(x)        ((x) & IFM_TMASK)
319
#define        IFM_INST(x)        (((x) & IFM_IMASK) >> IFM_ISHIFT)
320
#define        IFM_OPTIONS(x)        ((x) & (IFM_OMASK | IFM_GMASK))
321
#define        IFM_MODE(x)        ((x) & IFM_MMASK)
322
323
#define        IFM_INST_MAX        IFM_INST(IFM_IMASK)
324
#define        IFM_INST_ANY        ((u_int) -1)
325
326
/*
327
 * Macro to create a media word.
328
 */
329
#define        IFM_MAKEWORD(type, subtype, options, instance)                        \
330
        ((type) | (subtype) | (options) | ((instance) << IFM_ISHIFT))
331
#define        IFM_MAKEMODE(mode) \
332
        (((mode) << IFM_MSHIFT) & IFM_MMASK)
333
334
/*
335
 * NetBSD extension not defined in the BSDI API.  This is used in various
336
 * places to get the canonical description for a given type/subtype.
337
 *
338
 * In the subtype and mediaopt descriptions, the valid TYPE bits are OR'd
339
 * in to indicate which TYPE the subtype/option corresponds to.  If no
340
 * TYPE is present, it is a shared media/mediaopt.
341
 *
342
 * Note that these are parsed case-insensitive.
343
 *
344
 * Order is important.  The first matching entry is the canonical name
345
 * for a media type; subsequent matches are aliases.
346
 */
347
struct ifmedia_description {
348
        int        ifmt_word;                /* word value; may be masked */
349
        const char *ifmt_string;        /* description */
350
};
351
352
#define        IFM_TYPE_DESCRIPTIONS {                                                \
353
        { IFM_ETHER,                        "Ethernet" },                        \
354
        { IFM_ETHER,                        "ether" },                        \
355
        { IFM_TOKEN,                        "TokenRing" },                        \
356
        { IFM_TOKEN,                        "token" },                        \
357
        { IFM_FDDI,                        "FDDI" },                        \
358
        { IFM_IEEE80211,                "IEEE802.11" },                        \
359
        { IFM_CARP,                        "CARP" },                        \
360
        { 0, NULL },                                                        \
361
}
362
363
#define        IFM_TYPE_MATCH(dt, t)                                                \
364
        (IFM_TYPE((dt)) == 0 || IFM_TYPE((dt)) == IFM_TYPE((t)))
365
366
#define        IFM_SUBTYPE_DESCRIPTIONS {                                        \
367
        { IFM_AUTO,                        "autoselect" },                        \
368
        { IFM_AUTO,                        "auto" },                        \
369
        { IFM_MANUAL,                        "manual" },                        \
370
        { IFM_NONE,                        "none" },                        \
371
                                                                        \
372
        { IFM_ETHER | IFM_10_T,                "10baseT" },                        \
373
        { IFM_ETHER | IFM_10_T,                "10baseT/UTP" },                \
374
        { IFM_ETHER | IFM_10_T,                "UTP" },                        \
375
        { IFM_ETHER | IFM_10_T,                "10UTP" },                        \
376
        { IFM_ETHER | IFM_10_T,                "10BASE-T" },                        \
377
        { IFM_ETHER | IFM_10_2,                "10base2" },                        \
378
        { IFM_ETHER | IFM_10_2,                "10base2/BNC" },                \
379
        { IFM_ETHER | IFM_10_2,                "BNC" },                        \
380
        { IFM_ETHER | IFM_10_2,                "10BNC" },                        \
381
        { IFM_ETHER | IFM_10_2,                "10BASE2" },                        \
382
        { IFM_ETHER | IFM_10_5,                "10base5" },                        \
383
        { IFM_ETHER | IFM_10_5,                "10base5/AUI" },                \
384
        { IFM_ETHER | IFM_10_5,                "AUI" },                        \
385
        { IFM_ETHER | IFM_10_5,                "10AUI" },                        \
386
        { IFM_ETHER | IFM_10_5,                "10BASE5" },                        \
387
        { IFM_ETHER | IFM_100_TX,        "100baseTX" },                        \
388
        { IFM_ETHER | IFM_100_TX,        "100TX" },                        \
389
        { IFM_ETHER | IFM_100_TX,        "100BASE-TX" },                        \
390
        { IFM_ETHER | IFM_100_FX,        "100baseFX" },                        \
391
        { IFM_ETHER | IFM_100_FX,        "100FX" },                        \
392
        { IFM_ETHER | IFM_100_FX,        "100BASE-FX" },                        \
393
        { IFM_ETHER | IFM_100_T4,        "100baseT4" },                        \
394
        { IFM_ETHER | IFM_100_T4,        "100T4" },                        \
395
        { IFM_ETHER | IFM_100_T4,        "100BASE-T4" },                        \
396
        { IFM_ETHER | IFM_100_VG,        "100baseVG" },                        \
397
        { IFM_ETHER | IFM_100_VG,        "100VG" },                        \
398
        { IFM_ETHER | IFM_100_VG,        "100VG-AnyLAN" },                \
399
        { IFM_ETHER | IFM_100_T2,        "100baseT2" },                        \
400
        { IFM_ETHER | IFM_100_T2,        "100T2" },                        \
401
        { IFM_ETHER | IFM_100_T2,        "100BASE-T2" },                        \
402
        { IFM_ETHER | IFM_1000_SX,        "1000baseSX" },                        \
403
        { IFM_ETHER | IFM_1000_SX,        "1000SX" },                        \
404
        { IFM_ETHER | IFM_1000_SX,        "1000BASE-SX" },                \
405
        { IFM_ETHER | IFM_10_STP,        "10baseSTP" },                        \
406
        { IFM_ETHER | IFM_10_STP,        "STP" },                        \
407
        { IFM_ETHER | IFM_10_STP,        "10STP" },                        \
408
        { IFM_ETHER | IFM_10_STP,        "10BASE-STP" },                        \
409
        { IFM_ETHER | IFM_10_FL,        "10baseFL" },                        \
410
        { IFM_ETHER | IFM_10_FL,        "FL" },                                \
411
        { IFM_ETHER | IFM_10_FL,        "10FL" },                        \
412
        { IFM_ETHER | IFM_10_FL,        "10BASE-FL" },                        \
413
        { IFM_ETHER | IFM_1000_LX,        "1000baseLX" },                        \
414
        { IFM_ETHER | IFM_1000_LX,        "1000LX" },                        \
415
        { IFM_ETHER | IFM_1000_LX,        "1000BASE-LX" },                \
416
        { IFM_ETHER | IFM_1000_CX,        "1000baseCX" },                        \
417
        { IFM_ETHER | IFM_1000_CX,        "1000CX" },                        \
418
        { IFM_ETHER | IFM_1000_CX,        "1000BASE-CX" },                \
419
        { IFM_ETHER | IFM_1000_BX10,        "1000BASE-BX10" },                \
420
        { IFM_ETHER | IFM_1000_T,        "1000baseT" },                        \
421
        { IFM_ETHER | IFM_1000_T,        "1000T" },                        \
422
        { IFM_ETHER | IFM_1000_T,        "1000BASE-T" },                        \
423
        { IFM_ETHER | IFM_HPNA_1,        "HomePNA1" },                        \
424
        { IFM_ETHER | IFM_HPNA_1,        "HPNA1" },                        \
425
        { IFM_ETHER | IFM_10G_LR,        "10GbaseLR" },                        \
426
        { IFM_ETHER | IFM_10G_LR,        "10GLR" },                        \
427
        { IFM_ETHER | IFM_10G_LR,        "10GBASE-LR" },                        \
428
        { IFM_ETHER | IFM_10G_SR,        "10GbaseSR" },                        \
429
        { IFM_ETHER | IFM_10G_SR,        "10GSR" },                        \
430
        { IFM_ETHER | IFM_10G_SR,        "10GBASE-SR" },                        \
431
        { IFM_ETHER | IFM_10G_LRM,        "10Gbase-LRM" },                \
432
        { IFM_ETHER | IFM_10G_TWINAX,        "10Gbase-Twinax" },                \
433
        { IFM_ETHER | IFM_10G_TWINAX_LONG,        "10Gbase-Twinax-Long" },\
434
        { IFM_ETHER | IFM_10G_T,        "10Gbase-T" },                        \
435
        { IFM_ETHER | IFM_10G_CX4,        "10GbaseCX4" },                        \
436
        { IFM_ETHER | IFM_10G_CX4,        "10GCX4" },                        \
437
        { IFM_ETHER | IFM_10G_CX4,        "10GBASE-CX4" },                \
438
        { IFM_ETHER | IFM_2500_SX,        "2500baseSX" },                        \
439
        { IFM_ETHER | IFM_2500_SX,        "2500SX" },                        \
440
                                                                        \
441
        { IFM_TOKEN | IFM_TOK_STP4,        "DB9/4Mbit" },                        \
442
        { IFM_TOKEN | IFM_TOK_STP4,        "4STP" },                        \
443
        { IFM_TOKEN | IFM_TOK_STP16,        "DB9/16Mbit" },                        \
444
        { IFM_TOKEN | IFM_TOK_STP16,        "16STP" },                        \
445
        { IFM_TOKEN | IFM_TOK_UTP4,        "UTP/4Mbit" },                        \
446
        { IFM_TOKEN | IFM_TOK_UTP4,        "4UTP" },                        \
447
        { IFM_TOKEN | IFM_TOK_UTP16,        "UTP/16Mbit" },                        \
448
        { IFM_TOKEN | IFM_TOK_UTP16,        "16UTP" },                        \
449
                                                                        \
450
        { IFM_FDDI | IFM_FDDI_SMF,        "Single-mode" },                \
451
        { IFM_FDDI | IFM_FDDI_SMF,        "SMF" },                        \
452
        { IFM_FDDI | IFM_FDDI_MMF,        "Multi-mode" },                        \
453
        { IFM_FDDI | IFM_FDDI_MMF,        "MMF" },                        \
454
        { IFM_FDDI | IFM_FDDI_UTP,        "UTP" },                        \
455
        { IFM_FDDI | IFM_FDDI_UTP,        "CDDI" },                        \
456
                                                                        \
457
        /*                                                                \
458
         * Short-hand for common media+option combos.                        \
459
         */                                                                \
460
        { IFM_ETHER | IFM_10_T | IFM_FDX,        "10baseT-FDX" },        \
461
        { IFM_ETHER | IFM_10_T | IFM_FDX,        "10BASE-T-FDX" },        \
462
        { IFM_ETHER | IFM_100_TX | IFM_FDX,        "100baseTX-FDX" },        \
463
        { IFM_ETHER | IFM_100_TX | IFM_FDX,        "100BASE-TX-FDX" },        \
464
        { IFM_ETHER | IFM_1000_T | IFM_FDX,        "1000baseT-FDX" },        \
465
                                                                        \
466
        /*                                                                \
467
         * IEEE 802.11                                                        \
468
         */                                                                \
469
        { IFM_IEEE80211 | IFM_IEEE80211_FH1,        "FH1" },                \
470
        { IFM_IEEE80211 | IFM_IEEE80211_FH2,        "FH2" },                \
471
        { IFM_IEEE80211 | IFM_IEEE80211_DS1,        "DS1" },                \
472
        { IFM_IEEE80211 | IFM_IEEE80211_DS2,        "DS2" },                \
473
        { IFM_IEEE80211 | IFM_IEEE80211_DS5,        "DS5" },                \
474
        { IFM_IEEE80211 | IFM_IEEE80211_DS11,        "DS11" },                \
475
        { IFM_IEEE80211 | IFM_IEEE80211_DS22,        "DS22" },                \
476
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM6,        "OFDM6" },                \
477
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM9,        "OFDM9" },                \
478
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM12,        "OFDM12" },                \
479
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM18,        "OFDM18" },                \
480
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM24,        "OFDM24" },                \
481
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM36,        "OFDM36" },                \
482
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM48,        "OFDM48" },                \
483
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM54,        "OFDM54" },                \
484
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM72,        "OFDM72" },                \
485
        { IFM_IEEE80211 | IFM_IEEE80211_DS354k, "DS/354Kbps" },         \
486
        { IFM_IEEE80211 | IFM_IEEE80211_DS512k, "DS/512Kbps" },         \
487
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM3,  "OFDM/3Mbps" },         \
488
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM4,  "OFDM/4.5Mbps" },       \
489
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM27, "OFDM/27Mbps" },        \
490
                                                                        \
491
        { 0, NULL },                                                        \
492
}
493
494
#define IFM_MODE_DESCRIPTIONS {                                                \
495
        { IFM_AUTO,                                "autoselect" },                \
496
        { IFM_AUTO,                                "auto" },                \
497
        { IFM_IEEE80211 | IFM_IEEE80211_11A,        "11a" },                \
498
        { IFM_IEEE80211 | IFM_IEEE80211_11B,        "11b" },                \
499
        { IFM_IEEE80211 | IFM_IEEE80211_11G,        "11g" },                \
500
        { IFM_IEEE80211 | IFM_IEEE80211_FH,        "fh" },                        \
501
        { IFM_IEEE80211 | IFM_IEEE80211_11NA,        "11na" },                \
502
        { IFM_IEEE80211 | IFM_IEEE80211_11NG,        "11ng" },                \
503
        { 0, NULL },                                                        \
504
}
505
506
#define        IFM_OPTION_DESCRIPTIONS {                                        \
507
        { IFM_FDX,                        "full-duplex" },                \
508
        { IFM_FDX,                        "fdx" },                        \
509
        { IFM_HDX,                        "half-duplex" },                \
510
        { IFM_HDX,                        "hdx" },                        \
511
        { IFM_FLOW,                        "flowcontrol" },                \
512
        { IFM_FLOW,                        "flow" },                        \
513
        { IFM_FLAG0,                        "flag0" },                        \
514
        { IFM_FLAG1,                        "flag1" },                        \
515
        { IFM_FLAG2,                        "flag2" },                        \
516
        { IFM_LOOP,                        "loopback" },                        \
517
        { IFM_LOOP,                        "hw-loopback"},                        \
518
        { IFM_LOOP,                        "loop" },                        \
519
                                                                        \
520
        { IFM_ETHER | IFM_ETH_MASTER,        "master" },                        \
521
        { IFM_ETHER | IFM_ETH_RXPAUSE,        "rxpause" },                        \
522
        { IFM_ETHER | IFM_ETH_TXPAUSE,        "txpause" },                        \
523
                                                                        \
524
        { IFM_TOKEN | IFM_TOK_ETR,        "EarlyTokenRelease" },                \
525
        { IFM_TOKEN | IFM_TOK_ETR,        "ETR" },                        \
526
        { IFM_TOKEN | IFM_TOK_SRCRT,        "SourceRouting" },                \
527
        { IFM_TOKEN | IFM_TOK_SRCRT,        "SRCRT" },                        \
528
        { IFM_TOKEN | IFM_TOK_ALLR,        "AllRoutes" },                        \
529
        { IFM_TOKEN | IFM_TOK_ALLR,        "ALLR" },                        \
530
                                                                        \
531
        { IFM_FDDI | IFM_FDDI_DA,        "dual-attach" },                \
532
        { IFM_FDDI | IFM_FDDI_DA,        "das" },                        \
533
                                                                        \
534
        { IFM_IEEE80211 | IFM_IEEE80211_ADHOC,        "adhoc" },                \
535
        { IFM_IEEE80211 | IFM_IEEE80211_HOSTAP,        "hostap" },                \
536
        { IFM_IEEE80211 | IFM_IEEE80211_MONITOR,"monitor" },                \
537
        { IFM_IEEE80211 | IFM_IEEE80211_TURBO,        "turbo" },                \
538
        { IFM_IEEE80211 | IFM_IEEE80211_IBSS,        "ibss" },                \
539
        { IFM_IEEE80211 | IFM_IEEE80211_WDS,         "wds" },                \
540
        { IFM_IEEE80211 | IFM_IEEE80211_MBSS,        "mesh" },                \
541
                                                                        \
542
        { 0, NULL },                                                        \
543
}
544
545
/*
546
 * Baudrate descriptions for the various media types.
547
 */
548
struct ifmedia_baudrate {
549
        int        ifmb_word;                /* media word */
550
        uint64_t        ifmb_baudrate;                /* corresponding baudrate */
551
};
552
553
#define        IFM_BAUDRATE_DESCRIPTIONS {                                        \
554
        { IFM_ETHER | IFM_10_T,                IF_Mbps(10) },                        \
555
        { IFM_ETHER | IFM_10_2,                IF_Mbps(10) },                        \
556
        { IFM_ETHER | IFM_10_5,                IF_Mbps(10) },                        \
557
        { IFM_ETHER | IFM_100_TX,        IF_Mbps(100) },                        \
558
        { IFM_ETHER | IFM_100_FX,        IF_Mbps(100) },                        \
559
        { IFM_ETHER | IFM_100_T4,        IF_Mbps(100) },                        \
560
        { IFM_ETHER | IFM_100_VG,        IF_Mbps(100) },                        \
561
        { IFM_ETHER | IFM_100_T2,        IF_Mbps(100) },                        \
562
        { IFM_ETHER | IFM_1000_SX,        IF_Mbps(1000) },                \
563
        { IFM_ETHER | IFM_10_STP,        IF_Mbps(10) },                        \
564
        { IFM_ETHER | IFM_10_FL,        IF_Mbps(10) },                        \
565
        { IFM_ETHER | IFM_1000_LX,        IF_Mbps(1000) },                \
566
        { IFM_ETHER | IFM_1000_CX,        IF_Mbps(1000) },                \
567
        { IFM_ETHER | IFM_1000_T,        IF_Mbps(1000) },                \
568
        { IFM_ETHER | IFM_HPNA_1,        IF_Mbps(1) },                        \
569
        { IFM_ETHER | IFM_10G_LR,        IF_Gbps(10ULL) },                \
570
        { IFM_ETHER | IFM_10G_SR,        IF_Gbps(10ULL) },                \
571
        { IFM_ETHER | IFM_10G_CX4,        IF_Gbps(10ULL) },                \
572
        { IFM_ETHER | IFM_2500_SX,        IF_Mbps(2500ULL) },                \
573
                                                                        \
574
        { IFM_TOKEN | IFM_TOK_STP4,        IF_Mbps(4) },                        \
575
        { IFM_TOKEN | IFM_TOK_STP16,        IF_Mbps(16) },                        \
576
        { IFM_TOKEN | IFM_TOK_UTP4,        IF_Mbps(4) },                        \
577
        { IFM_TOKEN | IFM_TOK_UTP16,        IF_Mbps(16) },                        \
578
                                                                        \
579
        { IFM_FDDI | IFM_FDDI_SMF,        IF_Mbps(100) },                        \
580
        { IFM_FDDI | IFM_FDDI_MMF,        IF_Mbps(100) },                        \
581
        { IFM_FDDI | IFM_FDDI_UTP,        IF_Mbps(100) },                        \
582
                                                                        \
583
        { IFM_IEEE80211 | IFM_IEEE80211_FH1,        IF_Mbps(1) },                \
584
        { IFM_IEEE80211 | IFM_IEEE80211_FH2,        IF_Mbps(2) },                \
585
        { IFM_IEEE80211 | IFM_IEEE80211_DS2,        IF_Mbps(2) },                \
586
        { IFM_IEEE80211 | IFM_IEEE80211_DS5,        IF_Kbps(5500) },        \
587
        { IFM_IEEE80211 | IFM_IEEE80211_DS11,        IF_Mbps(11) },                \
588
        { IFM_IEEE80211 | IFM_IEEE80211_DS1,        IF_Mbps(1) },                \
589
        { IFM_IEEE80211 | IFM_IEEE80211_DS22,        IF_Mbps(22) },                \
590
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM6,        IF_Mbps(6) },                \
591
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM9,        IF_Mbps(9) },                \
592
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM12,        IF_Mbps(12) },                \
593
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM18,        IF_Mbps(18) },                \
594
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM24,        IF_Mbps(24) },                \
595
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM36,        IF_Mbps(36) },                \
596
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM48,        IF_Mbps(48) },                \
597
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM54,        IF_Mbps(54) },                \
598
        { IFM_IEEE80211 | IFM_IEEE80211_OFDM72,        IF_Mbps(72) },                \
599
                                                                        \
600
        { 0, 0 },                                                        \
601
}
602
603
/*
604
 * Status bit descriptions for the various media types.
605
 */
606
struct ifmedia_status_description {
607
        int        ifms_type;
608
        int        ifms_valid;
609
        int        ifms_bit;
610
        const char *ifms_string[2];
611
};
612
613
#define        IFM_STATUS_DESC(ifms, bit)                                        \
614
        (ifms)->ifms_string[((ifms)->ifms_bit & (bit)) ? 1 : 0]
615
616
#define        IFM_STATUS_DESCRIPTIONS {                                        \
617
        { IFM_ETHER,                IFM_AVALID,        IFM_ACTIVE,                \
618
          { "no carrier", "active" } },                                        \
619
                                                                        \
620
        { IFM_FDDI,                IFM_AVALID,        IFM_ACTIVE,                \
621
          { "no ring", "inserted" } },                                        \
622
                                                                        \
623
        { IFM_TOKEN,                IFM_AVALID,        IFM_ACTIVE,                \
624
          { "no ring", "inserted" } },                                        \
625
                                                                        \
626
        { IFM_IEEE80211,        IFM_AVALID,        IFM_ACTIVE,                \
627
          { "no network", "active" } },                                        \
628
                                                                        \
629
        { IFM_CARP,                IFM_AVALID,        IFM_ACTIVE,                \
630
            { "backup", "master" } },                                        \
631
                                                                        \
632
        { 0,                        0,                0,                        \
633
          { NULL, NULL } },                                                \
634
}
635
636
#ifndef _KERNEL
637
/* Functions for converting media to/from strings, in libutil/if_media.c */
638
const char *get_media_type_string(int);
639
const char *get_media_subtype_string(int);
640
const char *get_media_mode_string(int);
641
const char *get_media_option_string(int *);
642
int get_media_mode(int, const char *);
643
int get_media_subtype(int, const char *);
644
int get_media_options(int, const char *, char **);
645
int lookup_media_word(struct ifmedia_description *, int, const char *);
646
#endif /* _KERNEL */
647
648
#endif /* !_NET_IF_MEDIA_H_ */