|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982, 1986, 1989 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms, with or without ! 6: * modification, are permitted provided that the following conditions ! 7: * are met: ! 8: * 1. Redistributions of source code must retain the above copyright ! 9: * notice, this list of conditions and the following disclaimer. ! 10: * 2. Redistributions in binary form must reproduce the above copyright ! 11: * notice, this list of conditions and the following disclaimer in the ! 12: * documentation and/or other materials provided with the distribution. ! 13: * 3. All advertising materials mentioning features or use of this software ! 14: * must display the following acknowledgement: ! 15: * This product includes software developed by the University of ! 16: * California, Berkeley and its contributors. ! 17: * 4. Neither the name of the University nor the names of its contributors ! 18: * may be used to endorse or promote products derived from this software ! 19: * without specific prior written permission. ! 20: * ! 21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 31: * SUCH DAMAGE. ! 32: * ! 33: * @(#)if.h 7.11 (Berkeley) 3/19/91 ! 34: */ ! 35: ! 36: /* ! 37: * Structures defining a network interface, providing a packet ! 38: * transport mechanism (ala level 0 of the PUP protocols). ! 39: * ! 40: * Each interface accepts output datagrams of a specified maximum ! 41: * length, and provides higher level routines with input datagrams ! 42: * received from its medium. ! 43: * ! 44: * Output occurs when the routine if_output is called, with three parameters: ! 45: * (*ifp->if_output)(ifp, m, dst) ! 46: * Here m is the mbuf chain to be sent and dst is the destination address. ! 47: * The output routine encapsulates the supplied datagram if necessary, ! 48: * and then transmits it on its medium. ! 49: * ! 50: * On input, each interface unwraps the data received by it, and either ! 51: * places it on the input queue of a internetwork datagram routine ! 52: * and posts the associated software interrupt, or passes the datagram to a raw ! 53: * packet input routine. ! 54: * ! 55: * Routines exist for locating interfaces by their addresses ! 56: * or for locating a interface on a certain network, as well as more general ! 57: * routing and gateway routines maintaining information used to locate ! 58: * interfaces. These routines live in the files if.c and route.c ! 59: */ ! 60: #ifndef _TIME_ /* XXX fast fix for SNMP, going away soon */ ! 61: #ifdef KERNEL ! 62: #include "../sys/time.h" ! 63: #else ! 64: #include <sys/time.h> ! 65: #endif ! 66: #endif ! 67: ! 68: /* ! 69: * Structure defining a queue for a network interface. ! 70: * ! 71: * (Would like to call this struct ``if'', but C isn't PL/1.) ! 72: */ ! 73: ! 74: struct ifnet { ! 75: char *if_name; /* name, e.g. ``en'' or ``lo'' */ ! 76: short if_unit; /* sub-unit for lower level driver */ ! 77: short if_mtu; /* maximum transmission unit */ ! 78: short if_flags; /* up/down, broadcast, etc. */ ! 79: short if_timer; /* time 'til if_watchdog called */ ! 80: int if_metric; /* routing metric (external only) */ ! 81: struct ifaddr *if_addrlist; /* linked list of addresses per if */ ! 82: struct ifqueue { ! 83: struct mbuf *ifq_head; ! 84: struct mbuf *ifq_tail; ! 85: int ifq_len; ! 86: int ifq_maxlen; ! 87: int ifq_drops; ! 88: } if_snd; /* output queue */ ! 89: /* procedure handles */ ! 90: int (*if_init)(); /* init routine */ ! 91: int (*if_output)(); /* output routine (enqueue) */ ! 92: int (*if_start)(); /* initiate output routine */ ! 93: int (*if_done)(); /* output complete routine */ ! 94: int (*if_ioctl)(); /* ioctl routine */ ! 95: int (*if_reset)(); /* bus reset routine */ ! 96: int (*if_watchdog)(); /* timer routine */ ! 97: /* generic interface statistics */ ! 98: int if_ipackets; /* packets received on interface */ ! 99: int if_ierrors; /* input errors on interface */ ! 100: int if_opackets; /* packets sent on interface */ ! 101: int if_oerrors; /* output errors on interface */ ! 102: int if_collisions; /* collisions on csma interfaces */ ! 103: /* end statistics */ ! 104: struct ifnet *if_next; ! 105: u_char if_type; /* ethernet, tokenring, etc */ ! 106: u_char if_addrlen; /* media address length */ ! 107: u_char if_hdrlen; /* media header length */ ! 108: u_char if_index; /* numeric abbreviation for this if */ ! 109: /* more statistics here to avoid recompiling netstat */ ! 110: struct timeval if_lastchange; /* last updated */ ! 111: int if_ibytes; /* total number of octets received */ ! 112: int if_obytes; /* total number of octets sent */ ! 113: int if_imcasts; /* packets received via multicast */ ! 114: int if_omcasts; /* packets sent via multicast */ ! 115: int if_iqdrops; /* dropped on input, this interface */ ! 116: int if_noproto; /* destined for unsupported protocol */ ! 117: int if_baudrate; /* linespeed */ ! 118: int if_pcount; /* number of promiscuous listeners */ ! 119: }; ! 120: ! 121: #define IFF_UP 0x1 /* interface is up */ ! 122: #define IFF_BROADCAST 0x2 /* broadcast address valid */ ! 123: #define IFF_DEBUG 0x4 /* turn on debugging */ ! 124: #define IFF_LOOPBACK 0x8 /* is a loopback net */ ! 125: #define IFF_POINTOPOINT 0x10 /* interface is point-to-point link */ ! 126: #define IFF_NOTRAILERS 0x20 /* avoid use of trailers */ ! 127: #define IFF_RUNNING 0x40 /* resources allocated */ ! 128: #define IFF_NOARP 0x80 /* no address resolution protocol */ ! 129: /* next two not supported now, but reserved: */ ! 130: #define IFF_PROMISC 0x100 /* receive all packets */ ! 131: #define IFF_ALLMULTI 0x200 /* receive all multicast packets */ ! 132: #define IFF_OACTIVE 0x400 /* transmission in progress */ ! 133: #define IFF_SIMPLEX 0x800 /* can't hear own transmissions */ ! 134: ! 135: /* flags set internally only: */ ! 136: #define IFF_CANTCHANGE \ ! 137: (IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|IFF_SIMPLEX) ! 138: ! 139: /* ! 140: * Output queues (ifp->if_snd) and internetwork datagram level (pup level 1) ! 141: * input routines have queues of messages stored on ifqueue structures ! 142: * (defined above). Entries are added to and deleted from these structures ! 143: * by these macros, which should be called with ipl raised to splimp(). ! 144: */ ! 145: #define IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen) ! 146: #define IF_DROP(ifq) ((ifq)->ifq_drops++) ! 147: #define IF_ENQUEUE(ifq, m) { \ ! 148: (m)->m_nextpkt = 0; \ ! 149: if ((ifq)->ifq_tail == 0) \ ! 150: (ifq)->ifq_head = m; \ ! 151: else \ ! 152: (ifq)->ifq_tail->m_nextpkt = m; \ ! 153: (ifq)->ifq_tail = m; \ ! 154: (ifq)->ifq_len++; \ ! 155: } ! 156: #define IF_PREPEND(ifq, m) { \ ! 157: (m)->m_nextpkt = (ifq)->ifq_head; \ ! 158: if ((ifq)->ifq_tail == 0) \ ! 159: (ifq)->ifq_tail = (m); \ ! 160: (ifq)->ifq_head = (m); \ ! 161: (ifq)->ifq_len++; \ ! 162: } ! 163: #define IF_DEQUEUE(ifq, m) { \ ! 164: (m) = (ifq)->ifq_head; \ ! 165: if (m) { \ ! 166: if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \ ! 167: (ifq)->ifq_tail = 0; \ ! 168: (m)->m_nextpkt = 0; \ ! 169: (ifq)->ifq_len--; \ ! 170: } \ ! 171: } ! 172: ! 173: #define IFQ_MAXLEN 50 ! 174: #define IFNET_SLOWHZ 1 /* granularity is 1 second */ ! 175: ! 176: /* ! 177: * The ifaddr structure contains information about one address ! 178: * of an interface. They are maintained by the different address families, ! 179: * are allocated and attached when an address is set, and are linked ! 180: * together so all addresses for an interface can be located. ! 181: */ ! 182: struct ifaddr { ! 183: struct sockaddr *ifa_addr; /* address of interface */ ! 184: struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */ ! 185: #define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ ! 186: struct sockaddr *ifa_netmask; /* used to determine subnet */ ! 187: struct ifnet *ifa_ifp; /* back-pointer to interface */ ! 188: struct ifaddr *ifa_next; /* next address for interface */ ! 189: int (*ifa_rtrequest)(); /* check or clean routes (+ or -)'d */ ! 190: struct rtentry *ifa_rt; /* ??? for ROUTETOIF */ ! 191: u_short ifa_flags; /* mostly rt_flags for cloning */ ! 192: u_short ifa_llinfolen; /* extra to malloc for link info */ ! 193: }; ! 194: #define IFA_ROUTE RTF_UP /* route installed */ ! 195: /* ! 196: * Interface request structure used for socket ! 197: * ioctl's. All interface ioctl's must have parameter ! 198: * definitions which begin with ifr_name. The ! 199: * remainder may be interface specific. ! 200: */ ! 201: struct ifreq { ! 202: #define IFNAMSIZ 16 ! 203: char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ ! 204: union { ! 205: struct sockaddr ifru_addr; ! 206: struct sockaddr ifru_dstaddr; ! 207: struct sockaddr ifru_broadaddr; ! 208: short ifru_flags; ! 209: int ifru_metric; ! 210: caddr_t ifru_data; ! 211: } ifr_ifru; ! 212: #define ifr_addr ifr_ifru.ifru_addr /* address */ ! 213: #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ ! 214: #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ ! 215: #define ifr_flags ifr_ifru.ifru_flags /* flags */ ! 216: #define ifr_metric ifr_ifru.ifru_metric /* metric */ ! 217: #define ifr_data ifr_ifru.ifru_data /* for use by interface */ ! 218: }; ! 219: ! 220: struct ifaliasreq { ! 221: char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ ! 222: struct sockaddr ifra_addr; ! 223: struct sockaddr ifra_broadaddr; ! 224: struct sockaddr ifra_mask; ! 225: }; ! 226: ! 227: /* ! 228: * Structure used in SIOCGIFCONF request. ! 229: * Used to retrieve interface configuration ! 230: * for machine (useful for programs which ! 231: * must know all networks accessible). ! 232: */ ! 233: struct ifconf { ! 234: int ifc_len; /* size of associated buffer */ ! 235: union { ! 236: caddr_t ifcu_buf; ! 237: struct ifreq *ifcu_req; ! 238: } ifc_ifcu; ! 239: #define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ ! 240: #define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */ ! 241: }; ! 242: ! 243: #ifdef KERNEL ! 244: #include "../net/if_arp.h" ! 245: struct ifqueue rawintrq; /* raw packet input queue */ ! 246: struct ifnet *ifnet; ! 247: struct ifaddr *ifa_ifwithaddr(), *ifa_ifwithnet(); ! 248: struct ifaddr *ifa_ifwithdstaddr(); ! 249: #else KERNEL ! 250: #include <net/if_arp.h> ! 251: #endif KERNEL
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.