|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* $NetBSD: if_media.h,v 1.3 1997/03/26 01:19:27 thorpej Exp $ */ ! 23: ! 24: /* ! 25: * Copyright (c) 1997 ! 26: * Jonathan Stone and Jason R. Thorpe. All rights reserved. ! 27: * ! 28: * This software is derived from information provided by Matt Thomas. ! 29: * ! 30: * Redistribution and use in source and binary forms, with or without ! 31: * modification, are permitted provided that the following conditions ! 32: * are met: ! 33: * 1. Redistributions of source code must retain the above copyright ! 34: * notice, this list of conditions and the following disclaimer. ! 35: * 2. Redistributions in binary form must reproduce the above copyright ! 36: * notice, this list of conditions and the following disclaimer in the ! 37: * documentation and/or other materials provided with the distribution. ! 38: * 3. All advertising materials mentioning features or use of this software ! 39: * must display the following acknowledgement: ! 40: * This product includes software developed by Jonathan Stone ! 41: * and Jason R. Thorpe for the NetBSD Project. ! 42: * 4. The names of the authors may not be used to endorse or promote products ! 43: * derived from this software without specific prior written permission. ! 44: * ! 45: * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR ! 46: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES ! 47: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ! 48: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ! 49: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, ! 50: * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ! 51: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED ! 52: * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ! 53: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 54: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 55: * SUCH DAMAGE. ! 56: */ ! 57: ! 58: #ifndef _NET_IF_MEDIA_H_ ! 59: #define _NET_IF_MEDIA_H_ ! 60: ! 61: /* ! 62: * Prototypes and definitions for BSD/OS-compatible network interface ! 63: * media selection. ! 64: * ! 65: * Where it is safe to do so, this code strays slightly from the BSD/OS ! 66: * design. Software which uses the API (device drivers, basically) ! 67: * shouldn't notice any difference. ! 68: * ! 69: * Many thanks to Matt Thomas for providing the information necessary ! 70: * to implement this interface. ! 71: */ ! 72: ! 73: #ifdef KERNEL ! 74: ! 75: #include <sys/queue.h> ! 76: ! 77: /* ! 78: * Driver callbacks for media status and change requests. ! 79: */ ! 80: typedef int (*ifm_change_cb_t) __P((struct ifnet *ifp)); ! 81: typedef void (*ifm_stat_cb_t) __P((struct ifnet *ifp, struct ifmediareq *req)); ! 82: ! 83: /* ! 84: * In-kernel representation of a single supported media type. ! 85: */ ! 86: struct ifmedia_entry { ! 87: LIST_ENTRY(ifmedia_entry) ifm_list; ! 88: int ifm_media; /* description of this media attachment */ ! 89: int ifm_data; /* for driver-specific use */ ! 90: void *ifm_aux; /* for driver-specific use */ ! 91: }; ! 92: ! 93: /* ! 94: * One of these goes into a network interface's softc structure. ! 95: * It is used to keep general media state. ! 96: */ ! 97: struct ifmedia { ! 98: int ifm_mask; /* mask of changes we don't care about */ ! 99: int ifm_media; /* current user-set media word */ ! 100: struct ifmedia_entry *ifm_cur; /* currently selected media */ ! 101: LIST_HEAD(, ifmedia_entry) ifm_list; /* list of all supported media */ ! 102: ifm_change_cb_t ifm_change; /* media change driver callback */ ! 103: ifm_stat_cb_t ifm_status; /* media status driver callback */ ! 104: }; ! 105: ! 106: /* Initialize an interface's struct if_media field. */ ! 107: void ifmedia_init __P((struct ifmedia *ifm, int dontcare_mask, ! 108: ifm_change_cb_t change_callback, ifm_stat_cb_t status_callback)); ! 109: ! 110: /* Add one supported medium to a struct ifmedia. */ ! 111: void ifmedia_add __P((struct ifmedia *ifm, int mword, int data, void *aux)); ! 112: ! 113: /* Add an array (of ifmedia_entry) media to a struct ifmedia. */ ! 114: void ifmedia_list_add(struct ifmedia *mp, struct ifmedia_entry *lp, ! 115: int count); ! 116: ! 117: /* Set default media type on initialization. */ ! 118: void ifmedia_set __P((struct ifmedia *ifm, int mword)); ! 119: ! 120: /* Common ioctl function for getting/setting media, called by driver. */ ! 121: int ifmedia_ioctl __P((struct ifnet *ifp, struct ifreq *ifr, ! 122: struct ifmedia *ifm, u_long cmd)); ! 123: ! 124: #endif /*KERNEL */ ! 125: ! 126: /* ! 127: * if_media Options word: ! 128: * Bits Use ! 129: * ---- ------- ! 130: * 0-3 Media variant ! 131: * 4 RFU ! 132: * 5-7 Media type ! 133: * 8-15 Type specific options ! 134: * 16-19 RFU ! 135: * 20-27 Shared (global) options ! 136: * 28-31 Instance ! 137: */ ! 138: ! 139: /* ! 140: * Ethernet ! 141: */ ! 142: #define IFM_ETHER 0x00000020 ! 143: #define IFM_10_T 3 /* 10BaseT - RJ45 */ ! 144: #define IFM_10_2 4 /* 10Base2 - Thinnet */ ! 145: #define IFM_10_5 5 /* 10Base5 - AUI */ ! 146: #define IFM_100_TX 6 /* 100BaseTX - RJ45 */ ! 147: #define IFM_100_FX 7 /* 100BaseFX - Fiber */ ! 148: #define IFM_100_T4 8 /* 100BaseT4 - 4 pair cat 3 */ ! 149: #define IFM_100_VG 9 /* 100VG-AnyLAN */ ! 150: #define IFM_100_T2 10 /* 100BaseT2 */ ! 151: ! 152: /* ! 153: * Token ring ! 154: */ ! 155: #define IFM_TOKEN 0x00000040 ! 156: #define IFM_TOK_STP4 3 /* Shielded twisted pair 4m - DB9 */ ! 157: #define IFM_TOK_STP16 4 /* Shielded twisted pair 16m - DB9 */ ! 158: #define IFM_TOK_UTP4 5 /* Unshielded twisted pair 4m - RJ45 */ ! 159: #define IFM_TOK_UTP16 6 /* Unshielded twisted pair 16m - RJ45 */ ! 160: #define IFM_TOK_ETR 0x00000200 /* Early token release */ ! 161: #define IFM_TOK_SRCRT 0x00000400 /* Enable source routing features */ ! 162: #define IFM_TOK_ALLR 0x00000800 /* All routes / Single route bcast */ ! 163: ! 164: /* ! 165: * FDDI ! 166: */ ! 167: #define IFM_FDDI 0x00000060 ! 168: #define IFM_FDDI_SMF 3 /* Single-mode fiber */ ! 169: #define IFM_FDDI_MMF 4 /* Multi-mode fiber */ ! 170: #define IFM_FDDI_UTP 5 /* CDDI / UTP */ ! 171: #define IFM_FDDI_DA 0x00000100 /* Dual attach / single attach */ ! 172: ! 173: /* ! 174: * Shared media sub-types ! 175: */ ! 176: #define IFM_AUTO 0 /* Autoselect best media */ ! 177: #define IFM_MANUAL 1 /* Jumper/dipswitch selects media */ ! 178: #define IFM_NONE 2 /* Deselect all media */ ! 179: ! 180: /* ! 181: * Shared options ! 182: */ ! 183: #define IFM_FDX 0x00100000 /* Force full duplex */ ! 184: #define IFM_HDX 0x00200000 /* Force half duplex */ ! 185: #define IFM_FLAG0 0x01000000 /* Driver defined flag */ ! 186: #define IFM_FLAG1 0x02000000 /* Driver defined flag */ ! 187: #define IFM_FLAG2 0x04000000 /* Driver defined flag */ ! 188: #define IFM_LOOP 0x08000000 /* Put hardware in loopback */ ! 189: ! 190: /* ! 191: * Masks ! 192: */ ! 193: #define IFM_NMASK 0x000000e0 /* Network type */ ! 194: #define IFM_TMASK 0x0000000f /* Media sub-type */ ! 195: #define IFM_IMASK 0xf0000000 /* Instance */ ! 196: #define IFM_ISHIFT 28 /* Instance shift */ ! 197: #define IFM_OMASK 0x0000ff00 /* Type specific options */ ! 198: #define IFM_GMASK 0x0ff00000 /* Global options */ ! 199: ! 200: /* ! 201: * Status bits ! 202: */ ! 203: #define IFM_AVALID 0x00000001 /* Active bit valid */ ! 204: #define IFM_ACTIVE 0x00000002 /* Interface attached to working net */ ! 205: ! 206: /* ! 207: * Macros to extract various bits of information from the media word. ! 208: */ ! 209: #define IFM_TYPE(x) ((x) & IFM_NMASK) ! 210: #define IFM_SUBTYPE(x) ((x) & IFM_TMASK) ! 211: #define IFM_INST(x) (((x) & IFM_IMASK) >> IFM_ISHIFT) ! 212: ! 213: /* ! 214: * NetBSD extension not defined in the BSDI API. This is used in various ! 215: * places to get the canonical description for a given type/subtype. ! 216: * ! 217: * NOTE: all but the top-level type descriptions must contain NO whitespace! ! 218: * Otherwise, parsing these in ifconfig(8) would be a nightmare. ! 219: */ ! 220: struct ifmedia_description { ! 221: int ifmt_word; /* word value; may be masked */ ! 222: const char *ifmt_string; /* description */ ! 223: }; ! 224: ! 225: #define IFM_TYPE_DESCRIPTIONS { \ ! 226: { IFM_ETHER, "Ethernet" }, \ ! 227: { IFM_TOKEN, "Token ring" }, \ ! 228: { IFM_FDDI, "FDDI" }, \ ! 229: { 0, NULL }, \ ! 230: } ! 231: ! 232: #define IFM_SUBTYPE_ETHERNET_DESCRIPTIONS { \ ! 233: { IFM_10_T, "10baseT/UTP" }, \ ! 234: { IFM_10_2, "10base2/BNC" }, \ ! 235: { IFM_10_5, "10base5/AUI" }, \ ! 236: { IFM_100_TX, "100baseTX" }, \ ! 237: { IFM_100_FX, "100baseFX" }, \ ! 238: { IFM_100_T4, "100baseT4" }, \ ! 239: { IFM_100_VG, "100baseVG" }, \ ! 240: { IFM_100_T2, "100baseT2" }, \ ! 241: { 0, NULL }, \ ! 242: } ! 243: ! 244: #define IFM_SUBTYPE_ETHERNET_ALIASES { \ ! 245: { IFM_10_T, "UTP" }, \ ! 246: { IFM_10_T, "10UTP" }, \ ! 247: { IFM_10_2, "BNC" }, \ ! 248: { IFM_10_2, "10BNC" }, \ ! 249: { IFM_10_5, "AUI" }, \ ! 250: { IFM_10_5, "10AUI" }, \ ! 251: { IFM_100_TX, "100TX" }, \ ! 252: { IFM_100_FX, "100FX" }, \ ! 253: { IFM_100_T4, "100T4" }, \ ! 254: { IFM_100_VG, "100VG" }, \ ! 255: { IFM_100_T2, "100T2" }, \ ! 256: { 0, NULL }, \ ! 257: } ! 258: ! 259: #define IFM_SUBTYPE_ETHERNET_OPTION_DESCRIPTIONS { \ ! 260: { 0, NULL }, \ ! 261: } ! 262: ! 263: #define IFM_SUBTYPE_TOKENRING_DESCRIPTIONS { \ ! 264: { IFM_TOK_STP4, "DB9/4Mbit" }, \ ! 265: { IFM_TOK_STP16, "DB9/16Mbit" }, \ ! 266: { IFM_TOK_UTP4, "UTP/4Mbit" }, \ ! 267: { IFM_TOK_UTP16, "UTP/16Mbit" }, \ ! 268: { 0, NULL }, \ ! 269: } ! 270: ! 271: #define IFM_SUBTYPE_TOKENRING_ALIASES { \ ! 272: { IFM_TOK_STP4, "4STP" }, \ ! 273: { IFM_TOK_STP16, "16STP" }, \ ! 274: { IFM_TOK_UTP4, "4UTP" }, \ ! 275: { IFM_TOK_UTP16, "16UTP" }, \ ! 276: { 0, NULL }, \ ! 277: } ! 278: ! 279: #define IFM_SUBTYPE_TOKENRING_OPTION_DESCRIPTIONS { \ ! 280: { IFM_TOK_ETR, "EarlyTokenRelease" }, \ ! 281: { IFM_TOK_SRCRT, "SourceRouting" }, \ ! 282: { IFM_TOK_ALLR, "AllRoutes" }, \ ! 283: { 0, NULL }, \ ! 284: } ! 285: ! 286: #define IFM_SUBTYPE_FDDI_DESCRIPTIONS { \ ! 287: { IFM_FDDI_SMF, "Single-mode" }, \ ! 288: { IFM_FDDI_MMF, "Multi-mode" }, \ ! 289: { IFM_FDDI_UTP, "UTP" }, \ ! 290: { 0, NULL }, \ ! 291: } ! 292: ! 293: #define IFM_SUBTYPE_FDDI_ALIASES { \ ! 294: { IFM_FDDI_SMF, "SMF" }, \ ! 295: { IFM_FDDI_MMF, "MMF" }, \ ! 296: { IFM_FDDI_UTP, "CDDI" }, \ ! 297: { 0, NULL }, \ ! 298: } ! 299: ! 300: #define IFM_SUBTYPE_FDDI_OPTION_DESCRIPTIONS { \ ! 301: { IFM_FDDI_DA, "Dual-attach" }, \ ! 302: { 0, NULL }, \ ! 303: } ! 304: ! 305: #define IFM_SUBTYPE_SHARED_DESCRIPTIONS { \ ! 306: { IFM_AUTO, "autoselect" }, \ ! 307: { IFM_MANUAL, "manual" }, \ ! 308: { IFM_NONE, "none" }, \ ! 309: { 0, NULL }, \ ! 310: } ! 311: ! 312: #define IFM_SUBTYPE_SHARED_ALIASES { \ ! 313: { IFM_AUTO, "auto" }, \ ! 314: { 0, NULL }, \ ! 315: } ! 316: ! 317: #define IFM_SHARED_OPTION_DESCRIPTIONS { \ ! 318: { IFM_FDX, "full-duplex" }, \ ! 319: { IFM_HDX, "half-duplex" }, \ ! 320: { IFM_FLAG0, "flag0" }, \ ! 321: { IFM_FLAG1, "flag1" }, \ ! 322: { IFM_FLAG2, "flag2" }, \ ! 323: { IFM_LOOP, "hw-loopback" }, \ ! 324: { 0, NULL }, \ ! 325: } ! 326: ! 327: #endif /* _NET_IF_MEDIA_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.