home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 4 / hacker04 / 04_HACK04.ISO / darwin / darwinx86.iso / usr / include / net / if_media.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-09-30  |  14.3 KB  |  380 lines

  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-4        Media subtype
  131.  *    5-7     Media type
  132.  *    8-15    Type specific options
  133.  *    16-19    RFU
  134.  *    20-27    Shared (global) options
  135.  *    28-31    Instance
  136.  */
  137.  
  138. /*
  139.  * Ethernet
  140.  */
  141. #define IFM_ETHER    0x00000020
  142. #define    IFM_10_T    3        /* 10BaseT - RJ45 */
  143. #define    IFM_10_2    4        /* 10Base2 - Thinnet */
  144. #define    IFM_10_5    5        /* 10Base5 - AUI */
  145. #define    IFM_100_TX    6        /* 100BaseTX - RJ45 */
  146. #define    IFM_100_FX    7        /* 100BaseFX - Fiber */
  147. #define    IFM_100_T4    8        /* 100BaseT4 - 4 pair cat 3 */
  148. #define    IFM_100_VG    9        /* 100VG-AnyLAN */
  149. #define    IFM_100_T2    10        /* 100BaseT2 */
  150. #define    IFM_1000_SX    11        /* 1000BaseSX - multi-mode fiber */
  151. #define    IFM_10_STP    12        /* 10BaseT over shielded TP */
  152. #define    IFM_10_FL    13        /* 10BaseFL - Fiber */
  153. #define    IFM_1000_LX    14        /* 1000baseLX - single-mode fiber */
  154. #define    IFM_1000_CX    15        /* 1000baseCX - 150ohm STP */
  155. #define    IFM_1000_TX    16        /* 1000baseTX - 4 pair cat 5 */
  156. #define    IFM_HPNA_1    17        /* HomePNA 1.0 (1Mb/s) */
  157.  
  158. /*
  159.  * Token ring
  160.  */
  161. #define    IFM_TOKEN    0x00000040
  162. #define    IFM_TOK_STP4    3        /* Shielded twisted pair 4m - DB9 */
  163. #define    IFM_TOK_STP16    4        /* Shielded twisted pair 16m - DB9 */
  164. #define    IFM_TOK_UTP4    5        /* Unshielded twisted pair 4m - RJ45 */
  165. #define    IFM_TOK_UTP16    6        /* Unshielded twisted pair 16m - RJ45 */
  166. #define    IFM_TOK_ETR    0x00000200    /* Early token release */
  167. #define    IFM_TOK_SRCRT    0x00000400    /* Enable source routing features */
  168. #define    IFM_TOK_ALLR    0x00000800    /* All routes / Single route bcast */
  169.  
  170. /*
  171.  * FDDI
  172.  */
  173. #define    IFM_FDDI    0x00000060
  174. #define    IFM_FDDI_SMF    3        /* Single-mode fiber */
  175. #define    IFM_FDDI_MMF    4        /* Multi-mode fiber */
  176. #define IFM_FDDI_UTP    5        /* CDDI / UTP */
  177. #define IFM_FDDI_DA    0x00000100    /* Dual attach / single attach */
  178.  
  179. /*
  180.  * IEEE 802.11 Wireless
  181.  */
  182. #define    IFM_IEEE80211    0x00000080
  183. #define    IFM_IEEE80211_FH1    3    /* Frequency Hopping 1Mbps */
  184. #define    IFM_IEEE80211_FH2    4    /* Frequency Hopping 2Mbps */
  185. #define    IFM_IEEE80211_DS2    5    /* Direct Sequence 2Mbps */
  186. #define    IFM_IEEE80211_DS5    6    /* Direct Sequence 5Mbps*/
  187. #define    IFM_IEEE80211_DS11    7    /* Direct Sequence 11Mbps*/
  188. #define    IFM_IEEE80211_DS1    8    /* Direct Sequence 1Mbps */
  189. #define    IFM_IEEE80211_ADHOC    0x00000100    /* Operate in Adhoc mode */
  190.  
  191. /*
  192.  * Shared media sub-types
  193.  */
  194. #define    IFM_AUTO    0        /* Autoselect best media */
  195. #define    IFM_MANUAL    1        /* Jumper/dipswitch selects media */
  196. #define    IFM_NONE    2        /* Deselect all media */
  197.  
  198. /*
  199.  * Shared options
  200.  */
  201. #define IFM_FDX        0x00100000    /* Force full duplex */
  202. #define    IFM_HDX        0x00200000    /* Force half duplex */
  203. #define    IFM_FLOW    0x00400000    /* enable hardware flow control */
  204. #define IFM_FLAG0    0x01000000    /* Driver defined flag */
  205. #define IFM_FLAG1    0x02000000    /* Driver defined flag */
  206. #define IFM_FLAG2    0x04000000    /* Driver defined flag */
  207. #define    IFM_LOOP    0x08000000    /* Put hardware in loopback */
  208.  
  209. /*
  210.  * Masks
  211.  */
  212. #define    IFM_NMASK    0x000000e0    /* Network type */
  213. #define    IFM_TMASK    0x0000001f    /* Media sub-type */
  214. #define    IFM_IMASK    0xf0000000    /* Instance */
  215. #define    IFM_ISHIFT    28        /* Instance shift */
  216. #define    IFM_OMASK    0x0000ff00    /* Type specific options */
  217. #define    IFM_GMASK    0x0ff00000    /* Global options */
  218.  
  219. /*
  220.  * Status bits
  221.  */
  222. #define    IFM_AVALID    0x00000001    /* Active bit valid */
  223. #define    IFM_ACTIVE    0x00000002    /* Interface attached to working net */
  224.  
  225. /*
  226.  * Macros to extract various bits of information from the media word.
  227.  */
  228. #define    IFM_TYPE(x)    ((x) & IFM_NMASK)
  229. #define    IFM_SUBTYPE(x)    ((x) & IFM_TMASK)
  230. #define    IFM_INST(x)    (((x) & IFM_IMASK) >> IFM_ISHIFT)
  231.  
  232. /*
  233.  * NetBSD extension not defined in the BSDI API.  This is used in various
  234.  * places to get the canonical description for a given type/subtype.
  235.  *
  236.  * NOTE: all but the top-level type descriptions must contain NO whitespace!
  237.  * Otherwise, parsing these in ifconfig(8) would be a nightmare.
  238.  */
  239. struct ifmedia_description {
  240.     int    ifmt_word;        /* word value; may be masked */
  241.     const char *ifmt_string;    /* description */
  242. };
  243.  
  244. #define IFM_TYPE_DESCRIPTIONS {                     \
  245.     { IFM_ETHER,     "Ethernet"   },                \
  246.     { IFM_TOKEN,     "Token ring" },                \
  247.     { IFM_FDDI,      "FDDI"       },                \
  248.     { IFM_IEEE80211, "IEEE802.11" },                \
  249.     { 0, NULL },                                    \
  250. }
  251.  
  252. #define IFM_SUBTYPE_ETHERNET_DESCRIPTIONS {         \
  253.     { IFM_10_T,     "10baseT/UTP" },                \
  254.     { IFM_10_2,     "10base2/BNC" },                \
  255.     { IFM_10_5,     "10base5/AUI" },                \
  256.     { IFM_100_TX,   "100baseTX"   },                \
  257.     { IFM_100_FX,   "100baseFX"   },                \
  258.     { IFM_100_T4,   "100baseT4"   },                \
  259.     { IFM_100_VG,   "100baseVG"   },                \
  260.     { IFM_100_T2,   "100baseT2"   },                \
  261.     { IFM_1000_SX,  "1000baseSX"  },                \
  262.     { IFM_10_STP,   "10baseSTP"   },                \
  263.     { IFM_10_FL,    "10baseFL"    },                \
  264.     { IFM_1000_LX,  "1000baseLX"  },                \
  265.     { IFM_1000_CX,  "1000baseCX"  },                \
  266.     { IFM_1000_TX,  "1000baseTX"  },                \
  267.     { IFM_HPNA_1,   "HomePNA1"    },                \
  268.     { 0, NULL },                                    \
  269. }
  270.  
  271. #define IFM_SUBTYPE_ETHERNET_ALIASES {              \
  272.     { IFM_10_T,     "UTP"    },                     \
  273.     { IFM_10_T,     "10UTP"  },                     \
  274.     { IFM_10_2,     "BNC"    },                     \
  275.     { IFM_10_2,     "10BNC"  },                     \
  276.     { IFM_10_5,     "AUI"    },                     \
  277.     { IFM_10_5,     "10AUI"  },                     \
  278.     { IFM_100_TX,   "100TX"  },                     \
  279.     { IFM_100_FX,   "100FX"  },                     \
  280.     { IFM_100_T4,   "100T4"  },                     \
  281.     { IFM_100_VG,   "100VG"  },                     \
  282.     { IFM_100_T2,   "100T2"  },                     \
  283.     { IFM_1000_SX,  "1000SX" },                     \
  284.     { IFM_10_STP,   "STP"    },                     \
  285.     { IFM_10_STP,   "10STP"  },                     \
  286.     { IFM_10_FL,    "FL"     },                     \
  287.     { IFM_10_FL,    "10FL"   },                     \
  288.     { IFM_1000_LX,  "1000LX" },                     \
  289.     { IFM_1000_CX,  "1000CX" },                     \
  290.     { IFM_1000_TX,  "1000TX" },                     \
  291.     { IFM_HPNA_1,   "HPNA1"  },                     \
  292.     { 0, NULL },                                    \
  293. }
  294.  
  295. #define IFM_SUBTYPE_ETHERNET_OPTION_DESCRIPTIONS {  \
  296.     { 0, NULL },                                    \
  297. }
  298.  
  299. #define IFM_SUBTYPE_TOKENRING_DESCRIPTIONS {        \
  300.     { IFM_TOK_STP4,  "DB9/4Mbit" },                 \
  301.     { IFM_TOK_STP16, "DB9/16Mbit" },                \
  302.     { IFM_TOK_UTP4,  "UTP/4Mbit" },                 \
  303.     { IFM_TOK_UTP16, "UTP/16Mbit" },                \
  304.     { 0, NULL },                                    \
  305. }
  306.  
  307. #define IFM_SUBTYPE_TOKENRING_ALIASES {             \
  308.     { IFM_TOK_STP4,  "4STP" },                      \
  309.     { IFM_TOK_STP16, "16STP" },                     \
  310.     { IFM_TOK_UTP4,  "4UTP" },                      \
  311.     { IFM_TOK_UTP16, "16UTP" },                     \
  312.     { 0, NULL },                                    \
  313. }
  314.  
  315. #define IFM_SUBTYPE_TOKENRING_OPTION_DESCRIPTIONS { \
  316.     { IFM_TOK_ETR,   "EarlyTokenRelease" },         \
  317.     { IFM_TOK_SRCRT, "SourceRouting" },             \
  318.     { IFM_TOK_ALLR,  "AllRoutes" },                 \
  319.     { 0, NULL },                                    \
  320. }
  321.  
  322. #define IFM_SUBTYPE_FDDI_DESCRIPTIONS {             \
  323.     { IFM_FDDI_SMF, "Single-mode" },                \
  324.     { IFM_FDDI_MMF, "Multi-mode" },                 \
  325.     { IFM_FDDI_UTP, "UTP" },                        \
  326.     { 0, NULL },                                    \
  327. }
  328.  
  329. #define IFM_SUBTYPE_FDDI_ALIASES {                  \
  330.     { IFM_FDDI_SMF, "SMF" },                        \
  331.     { IFM_FDDI_MMF, "MMF" },                        \
  332.     { IFM_FDDI_UTP, "CDDI" },                       \
  333.     { 0, NULL },                                    \
  334. }
  335.  
  336. #define IFM_SUBTYPE_FDDI_OPTION_DESCRIPTIONS {      \
  337.     { IFM_FDDI_DA,  "Dual-attach" },                \
  338.     { 0, NULL },                                    \
  339. }
  340.  
  341. #define IFM_SUBTYPE_IEEE80211_DESCRIPTIONS {        \
  342.     { IFM_IEEE80211_FH1,  "FH1"  },                 \
  343.     { IFM_IEEE80211_FH2,  "FH2"  },                 \
  344.     { IFM_IEEE80211_DS1,  "DS1"  },                 \
  345.     { IFM_IEEE80211_DS2,  "DS2"  },                 \
  346.     { IFM_IEEE80211_DS5,  "DS5"  },                 \
  347.     { IFM_IEEE80211_DS11, "DS11" },                 \
  348.     { 0, NULL },                                    \
  349. }
  350.  
  351. #define IFM_SUBTYPE_IEEE80211_OPTION_DESCRIPTIONS { \
  352.     { IFM_IEEE80211_ADHOC,  "adhoc" },              \
  353.     { 0, NULL },                                    \
  354. }
  355.  
  356. #define IFM_SUBTYPE_SHARED_DESCRIPTIONS {           \
  357.     { IFM_AUTO,     "autoselect" },                 \
  358.     { IFM_MANUAL,   "manual" },                     \
  359.     { IFM_NONE,     "none" },                       \
  360.     { 0, NULL },                                    \
  361. }
  362.  
  363. #define IFM_SUBTYPE_SHARED_ALIASES {                \
  364.     { IFM_AUTO,     "auto" },                       \
  365.     { 0, NULL },                                    \
  366. }
  367.  
  368. #define IFM_SHARED_OPTION_DESCRIPTIONS {            \
  369.     { IFM_FDX,      "full-duplex" },                \
  370.     { IFM_HDX,      "half-duplex" },                \
  371.     { IFM_FLOW,     "flow-control" },               \
  372.     { IFM_FLAG0,    "flag0" },                      \
  373.     { IFM_FLAG1,    "flag1" },                      \
  374.     { IFM_FLAG2,    "flag2" },                      \
  375.     { IFM_LOOP,     "hw-loopback" },                \
  376.     { 0, NULL },                                    \
  377. }
  378.  
  379. #endif    /* _NET_IF_MEDIA_H_ */
  380.