if.h revision 10496
150276Speter/* 2176187Srafan * Copyright (c) 1982, 1986, 1989, 1993 350276Speter * The Regents of the University of California. All rights reserved. 450276Speter * 550276Speter * Redistribution and use in source and binary forms, with or without 650276Speter * modification, are permitted provided that the following conditions 750276Speter * are met: 850276Speter * 1. Redistributions of source code must retain the above copyright 950276Speter * notice, this list of conditions and the following disclaimer. 1050276Speter * 2. Redistributions in binary form must reproduce the above copyright 1150276Speter * notice, this list of conditions and the following disclaimer in the 1250276Speter * documentation and/or other materials provided with the distribution. 1350276Speter * 3. All advertising materials mentioning features or use of this software 1450276Speter * must display the following acknowledgement: 1550276Speter * This product includes software developed by the University of 1650276Speter * California, Berkeley and its contributors. 1750276Speter * 4. Neither the name of the University nor the names of its contributors 1850276Speter * may be used to endorse or promote products derived from this software 1950276Speter * without specific prior written permission. 2050276Speter * 2150276Speter * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2250276Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2350276Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2450276Speter * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2550276Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2650276Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2750276Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2850276Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2950276Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3050276Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3150276Speter * SUCH DAMAGE. 32166124Srafan * 3350276Speter * @(#)if.h 8.1 (Berkeley) 6/10/93 3450276Speter * $Id: if.h,v 1.21 1995/08/30 00:33:17 bde Exp $ 3550276Speter */ 3650276Speter 3750276Speter#ifndef _NET_IF_H_ 3850276Speter#define _NET_IF_H_ 3950276Speter 4050276Speter/* 4150276Speter * Structures defining a network interface, providing a packet 4250276Speter * transport mechanism (ala level 0 of the PUP protocols). 4350276Speter * 44184989Srafan * Each interface accepts output datagrams of a specified maximum 4550276Speter * length, and provides higher level routines with input datagrams 4650276Speter * received from its medium. 4750276Speter * 4850276Speter * Output occurs when the routine if_output is called, with three parameters: 4950276Speter * (*ifp->if_output)(ifp, m, dst, rt) 50174993Srafan * Here m is the mbuf chain to be sent and dst is the destination address. 51174993Srafan * The output routine encapsulates the supplied datagram if necessary, 52174993Srafan * and then transmits it on its medium. 53174993Srafan * 54174993Srafan * On input, each interface unwraps the data received by it, and either 55174993Srafan * places it on the input queue of a internetwork datagram routine 56174993Srafan * and posts the associated software interrupt, or passes the datagram to a raw 57174993Srafan * packet input routine. 58174993Srafan * 59174993Srafan * Routines exist for locating interfaces by their addresses 60174993Srafan * or for locating a interface on a certain network, as well as more general 61174993Srafan * routing and gateway routines maintaining information used to locate 62174993Srafan * interfaces. These routines live in the files if.c and route.c 63174993Srafan */ 64174993Srafan 65174993Srafan#include <sys/socket.h> /* for struct sockaddr */ 66174993Srafan 67166124Srafan#ifndef _TIME_ /* XXX fast fix for SNMP, going away soon */ 68166124Srafan#include <sys/time.h> 69166124Srafan#endif 70174993Srafan 7150276Speter#ifdef __STDC__ 7276726Speter/* 7350276Speter * Forward structure declarations for function prototypes [sic]. 7450276Speter */ 7550276Speterstruct mbuf; 7650276Speterstruct proc; 7750276Speterstruct rtentry; 7850276Speterstruct socket; 7950276Speterstruct ether_header; 8050276Speter#endif 8150276Speter 8250276Speterstruct if_data { 8350276Speter /* generic interface information */ 8450276Speter u_char ifi_type; /* ethernet, tokenring, etc */ 85166124Srafan u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ 8650276Speter u_char ifi_addrlen; /* media address length */ 8776726Speter u_char ifi_hdrlen; /* media header length */ 8876726Speter u_long ifi_mtu; /* maximum transmission unit */ 8950276Speter u_long ifi_metric; /* routing metric (external only) */ 9076726Speter u_long ifi_baudrate; /* linespeed */ 9150276Speter /* volatile statistics */ 9250276Speter u_long ifi_ipackets; /* packets received on interface */ 9376726Speter u_long ifi_ierrors; /* input errors on interface */ 9476726Speter u_long ifi_opackets; /* packets sent on interface */ 9550276Speter u_long ifi_oerrors; /* output errors on interface */ 9676726Speter u_long ifi_collisions; /* collisions on csma interfaces */ 9750276Speter u_long ifi_ibytes; /* total number of octets received */ 9850276Speter u_long ifi_obytes; /* total number of octets sent */ 9976726Speter u_long ifi_imcasts; /* packets received via multicast */ 100166124Srafan u_long ifi_omcasts; /* packets sent via multicast */ 10150276Speter u_long ifi_iqdrops; /* dropped on input, this interface */ 10276726Speter u_long ifi_noproto; /* destined for unsupported protocol */ 10350276Speter struct timeval ifi_lastchange; /* last updated */ 10476726Speter}; 10550276Speter 106166124Srafan/* 10750276Speter * Structure defining a queue for a network interface. 108174993Srafan * 109174993Srafan * (Would like to call this struct ``if'', but C isn't PL/1.) 110174993Srafan */ 111174993Srafan 112178866Srafanstruct ifqueue { 113174993Srafan struct mbuf *ifq_head; 114174993Srafan struct mbuf *ifq_tail; 115174993Srafan int ifq_len; 116174993Srafan int ifq_maxlen; 117174993Srafan int ifq_drops; 118174993Srafan}; 119174993Srafan 120174993Srafan#define IF_NPRIVATE 4 121174993Srafan 122174993Srafan/* 123174993Srafan * Structure describing information about an interface 124174993Srafan * which may be of interest to management entities. 125174993Srafan */ 126174993Srafanstruct ifnet { 127174993Srafan char *if_name; /* name, e.g. ``en'' or ``lo'' */ 128174993Srafan struct ifnet *if_next; /* all struct ifnets are chained */ 129174993Srafan struct ifaddr *if_addrlist; /* linked list of addresses per if */ 130174993Srafan int if_pcount; /* number of promiscuous listeners */ 131174993Srafan caddr_t if_bpf; /* packet filter structure */ 132174993Srafan u_short if_index; /* numeric abbreviation for this if */ 133174993Srafan short if_unit; /* sub-unit for lower level driver */ 134176187Srafan short if_timer; /* time 'til if_watchdog called */ 135176187Srafan short if_flags; /* up/down, broadcast, etc. */ 136174993Srafan struct if_data if_data; 137174993Srafan/* procedure handles */ 138174993Srafan void (*if_init) /* init routine */ 139174993Srafan __P((int)); 140174993Srafan int (*if_output) /* output routine (enqueue) */ 141174993Srafan __P((struct ifnet *, struct mbuf *, struct sockaddr *, 142174993Srafan struct rtentry *)); 143178866Srafan void (*if_start) /* initiate output routine */ 144178866Srafan __P((struct ifnet *)); 145174993Srafan int (*if_done) /* output complete routine */ 146174993Srafan __P((struct ifnet *)); /* (XXX not used; fake prototype) */ 147174993Srafan int (*if_ioctl) /* ioctl routine */ 148174993Srafan __P((struct ifnet *, int, caddr_t)); 149174993Srafan void (*if_reset) 150174993Srafan __P((int)); /* new autoconfig will permit removal */ 151174993Srafan void (*if_watchdog) /* timer routine */ 152174993Srafan __P((int)); 153174993Srafan struct ifqueue if_snd; /* output queue */ 154174993Srafan void *if_private[IF_NPRIVATE]; /* opaque data for various clients */ 155174993Srafan}; 156174993Srafan#define if_mtu if_data.ifi_mtu 157174993Srafan#define if_type if_data.ifi_type 158174993Srafan#define if_physical if_data.ifi_physical 159174993Srafan#define if_addrlen if_data.ifi_addrlen 160174993Srafan#define if_hdrlen if_data.ifi_hdrlen 161174993Srafan#define if_metric if_data.ifi_metric 162174993Srafan#define if_baudrate if_data.ifi_baudrate 163174993Srafan#define if_ipackets if_data.ifi_ipackets 164174993Srafan#define if_ierrors if_data.ifi_ierrors 165174993Srafan#define if_opackets if_data.ifi_opackets 166174993Srafan#define if_oerrors if_data.ifi_oerrors 167174993Srafan#define if_collisions if_data.ifi_collisions 168174993Srafan#define if_ibytes if_data.ifi_ibytes 169174993Srafan#define if_obytes if_data.ifi_obytes 170174993Srafan#define if_imcasts if_data.ifi_imcasts 171174993Srafan#define if_omcasts if_data.ifi_omcasts 172174993Srafan#define if_iqdrops if_data.ifi_iqdrops 173174993Srafan#define if_noproto if_data.ifi_noproto 174174993Srafan#define if_lastchange if_data.ifi_lastchange 175174993Srafan#define if_rawoutput(if, m, sa) if_output(if, m, sa, (struct rtentry *)0) 176174993Srafan 177174993Srafan#define IFF_UP 0x1 /* interface is up */ 178174993Srafan#define IFF_BROADCAST 0x2 /* broadcast address valid */ 179174993Srafan#define IFF_DEBUG 0x4 /* turn on debugging */ 180184989Srafan#define IFF_LOOPBACK 0x8 /* is a loopback net */ 181174993Srafan#define IFF_POINTOPOINT 0x10 /* interface is point-to-point link */ 182174993Srafan#define IFF_NOTRAILERS 0x20 /* avoid use of trailers */ 183174993Srafan#define IFF_RUNNING 0x40 /* resources allocated */ 184184989Srafan#define IFF_NOARP 0x80 /* no address resolution protocol */ 185174993Srafan#define IFF_PROMISC 0x100 /* receive all packets */ 186174993Srafan#define IFF_ALLMULTI 0x200 /* receive all multicast packets */ 187174993Srafan#define IFF_OACTIVE 0x400 /* transmission in progress */ 188174993Srafan#define IFF_SIMPLEX 0x800 /* can't hear own transmissions */ 189174993Srafan#define IFF_LINK0 0x1000 /* per link layer defined bit */ 190174993Srafan#define IFF_LINK1 0x2000 /* per link layer defined bit */ 191174993Srafan#define IFF_LINK2 0x4000 /* per link layer defined bit */ 192176187Srafan#define IFF_ALTPHYS IFF_LINK2 /* use alternate physical connection */ 193174993Srafan#define IFF_MULTICAST 0x8000 /* supports multicast */ 194174993Srafan 195174993Srafan/* flags set internally only: */ 196174993Srafan#define IFF_CANTCHANGE \ 197174993Srafan (IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|\ 198174993Srafan IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI) 199174993Srafan 200174993Srafan 201174993Srafan/* 202174993Srafan * These really don't belong here, but there's no other obviously appropriate 203174993Srafan * location. 204174993Srafan */ 205174993Srafan#define IFP_AUI 0 206174993Srafan#define IFP_10BASE2 1 207174993Srafan#define IFP_10BASET 2 208174993Srafan/* etc. */ 209174993Srafan 210174993Srafan/* 211174993Srafan * Output queues (ifp->if_snd) and internetwork datagram level (pup level 1) 212174993Srafan * input routines have queues of messages stored on ifqueue structures 213174993Srafan * (defined above). Entries are added to and deleted from these structures 214174993Srafan * by these macros, which should be called with ipl raised to splimp(). 215174993Srafan */ 216174993Srafan#define IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen) 217174993Srafan#define IF_DROP(ifq) ((ifq)->ifq_drops++) 218174993Srafan#define IF_ENQUEUE(ifq, m) { \ 219174993Srafan (m)->m_nextpkt = 0; \ 220174993Srafan if ((ifq)->ifq_tail == 0) \ 221184989Srafan (ifq)->ifq_head = m; \ 222184989Srafan else \ 223184989Srafan (ifq)->ifq_tail->m_nextpkt = m; \ 224174993Srafan (ifq)->ifq_tail = m; \ 225174993Srafan (ifq)->ifq_len++; \ 226174993Srafan} 227174993Srafan#define IF_PREPEND(ifq, m) { \ 228184989Srafan (m)->m_nextpkt = (ifq)->ifq_head; \ 229174993Srafan if ((ifq)->ifq_tail == 0) \ 230174993Srafan (ifq)->ifq_tail = (m); \ 231174993Srafan (ifq)->ifq_head = (m); \ 232174993Srafan (ifq)->ifq_len++; \ 233174993Srafan} 234174993Srafan#define IF_DEQUEUE(ifq, m) { \ 235174993Srafan (m) = (ifq)->ifq_head; \ 236176187Srafan if (m) { \ 237176187Srafan if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \ 238176187Srafan (ifq)->ifq_tail = 0; \ 239178866Srafan (m)->m_nextpkt = 0; \ 240178866Srafan (ifq)->ifq_len--; \ 241178866Srafan } \ 242178866Srafan} 243178866Srafan 244178866Srafan#define IFQ_MAXLEN 50 245178866Srafan#define IFNET_SLOWHZ 1 /* granularity is 1 second */ 246184989Srafan 247178866Srafan/* 248178866Srafan * The ifaddr structure contains information about one address 249178866Srafan * of an interface. They are maintained by the different address families, 250178866Srafan * are allocated and attached when an address is set, and are linked 251178866Srafan * together so all addresses for an interface can be located. 252184989Srafan */ 253184989Srafanstruct ifaddr { 254184989Srafan struct sockaddr *ifa_addr; /* address of interface */ 255184989Srafan struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */ 256184989Srafan#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ 257184989Srafan struct sockaddr *ifa_netmask; /* used to determine subnet */ 258184989Srafan struct ifnet *ifa_ifp; /* back-pointer to interface */ 259184989Srafan struct ifaddr *ifa_next; /* next address for interface */ 260184989Srafan void (*ifa_rtrequest) /* check or clean routes (+ or -)'d */ 261184989Srafan __P((int, struct rtentry *, struct sockaddr *)); 262184989Srafan u_short ifa_flags; /* mostly rt_flags for cloning */ 263184989Srafan short ifa_refcnt; /* extra to malloc for link info */ 264184989Srafan int ifa_metric; /* cost of going out this interface */ 265184989Srafan#ifdef notdef 266184989Srafan struct rtentry *ifa_rt; /* XXXX for ROUTETOIF ????? */ 267184989Srafan#endif 268184989Srafan}; 269184989Srafan#define IFA_ROUTE RTF_UP /* route installed */ 270184989Srafan 271184989Srafan/* 272184989Srafan * Message format for use in obtaining information about interfaces 273178866Srafan * from getkerninfo and the routing socket 274178866Srafan */ 275178866Srafanstruct if_msghdr { 276178866Srafan u_short ifm_msglen; /* to skip over non-understood messages */ 277178866Srafan u_char ifm_version; /* future binary compatability */ 278178866Srafan u_char ifm_type; /* message type */ 279178866Srafan int ifm_addrs; /* like rtm_addrs */ 280178866Srafan int ifm_flags; /* value of if_flags */ 281178866Srafan u_short ifm_index; /* index for associated ifp */ 282178866Srafan struct if_data ifm_data;/* statistics and other data about if */ 283178866Srafan}; 284178866Srafan 285178866Srafan/* 286178866Srafan * Message format for use in obtaining information about interface addresses 287184989Srafan * from getkerninfo and the routing socket 288184989Srafan */ 289184989Srafanstruct ifa_msghdr { 290184989Srafan u_short ifam_msglen; /* to skip over non-understood messages */ 291184989Srafan u_char ifam_version; /* future binary compatability */ 292178866Srafan u_char ifam_type; /* message type */ 293178866Srafan int ifam_addrs; /* like rtm_addrs */ 294176187Srafan int ifam_flags; /* value of ifa_flags */ 295178866Srafan u_short ifam_index; /* index for associated ifp */ 296176187Srafan int ifam_metric; /* value of ifa_metric */ 297184989Srafan}; 298184989Srafan 299176187Srafan/* 300176187Srafan * Interface request structure used for socket 301176187Srafan * ioctl's. All interface ioctl's must have parameter 302176187Srafan * definitions which begin with ifr_name. The 303178866Srafan * remainder may be interface specific. 304176187Srafan */ 305184989Srafanstruct ifreq { 306184989Srafan#define IFNAMSIZ 16 307176187Srafan char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 308176187Srafan union { 309176187Srafan struct sockaddr ifru_addr; 310176187Srafan struct sockaddr ifru_dstaddr; 311178866Srafan struct sockaddr ifru_broadaddr; 312176187Srafan short ifru_flags; 313184989Srafan int ifru_metric; 314184989Srafan int ifru_mtu; 315176187Srafan int ifru_phys; 316176187Srafan caddr_t ifru_data; 317184989Srafan } ifr_ifru; 318184989Srafan#define ifr_addr ifr_ifru.ifru_addr /* address */ 319184989Srafan#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ 320184989Srafan#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ 321184989Srafan#define ifr_flags ifr_ifru.ifru_flags /* flags */ 322184989Srafan#define ifr_metric ifr_ifru.ifru_metric /* metric */ 323184989Srafan#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ 324184989Srafan#define ifr_phys ifr_ifru.ifru_phys /* physical wire */ 325184989Srafan#define ifr_data ifr_ifru.ifru_data /* for use by interface */ 326184989Srafan}; 327184989Srafan 328184989Srafanstruct ifaliasreq { 329184989Srafan char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 330184989Srafan struct sockaddr ifra_addr; 331184989Srafan struct sockaddr ifra_broadaddr; 332176187Srafan struct sockaddr ifra_mask; 333}; 334 335/* 336 * Structure used in SIOCGIFCONF request. 337 * Used to retrieve interface configuration 338 * for machine (useful for programs which 339 * must know all networks accessible). 340 */ 341struct ifconf { 342 int ifc_len; /* size of associated buffer */ 343 union { 344 caddr_t ifcu_buf; 345 struct ifreq *ifcu_req; 346 } ifc_ifcu; 347#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ 348#define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */ 349}; 350 351#include <net/if_arp.h> 352 353#ifdef KERNEL 354#define IFAFREE(ifa) \ 355 if ((ifa)->ifa_refcnt <= 0) \ 356 ifafree(ifa); \ 357 else \ 358 (ifa)->ifa_refcnt--; 359 360extern struct ifnet *ifnet; 361extern int ifqmaxlen; 362extern struct ifnet loif[]; 363 364void ether_ifattach __P((struct ifnet *)); 365void ether_input __P((struct ifnet *, struct ether_header *, struct mbuf *)); 366int ether_output __P((struct ifnet *, 367 struct mbuf *, struct sockaddr *, struct rtentry *)); 368char *ether_sprintf __P((u_char *)); 369 370void if_attach __P((struct ifnet *)); 371void if_down __P((struct ifnet *)); 372void if_qflush __P((struct ifqueue *)); 373void if_slowtimo __P((void *)); 374void if_up __P((struct ifnet *)); 375#ifdef vax 376void ifubareset __P((int)); 377#endif 378int ifconf __P((int, caddr_t)); 379/*void ifinit __P((void));*/ /* declared in systm.h for main() */ 380int ifioctl __P((struct socket *, int, caddr_t, struct proc *)); 381int ifpromisc __P((struct ifnet *, int)); 382struct ifnet *ifunit __P((char *)); 383 384struct ifaddr *ifa_ifwithaddr __P((struct sockaddr *)); 385struct ifaddr *ifa_ifwithaf __P((int)); 386struct ifaddr *ifa_ifwithdstaddr __P((struct sockaddr *)); 387struct ifaddr *ifa_ifwithnet __P((struct sockaddr *)); 388struct ifaddr *ifa_ifwithroute __P((int, struct sockaddr *, 389 struct sockaddr *)); 390struct ifaddr *ifaof_ifpforaddr __P((struct sockaddr *, struct ifnet *)); 391void ifafree __P((struct ifaddr *)); 392void link_rtrequest __P((int, struct rtentry *, struct sockaddr *)); 393 394int loioctl __P((struct ifnet *, int, caddr_t)); 395int looutput __P((struct ifnet *, 396 struct mbuf *, struct sockaddr *, struct rtentry *)); 397void lortrequest __P((int, struct rtentry *, struct sockaddr *)); 398#endif /* KERNEL */ 399 400#endif /* !_NET_IF_H_ */ 401