|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /* Copyright (c) 1997, 1998 Apple Computer, Inc. All Rights Reserved */
26: /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
27: /*
28: * Copyright (c) 1982, 1986, 1989, 1993
29: * The Regents of the University of California. All rights reserved.
30: *
31: * Redistribution and use in source and binary forms, with or without
32: * modification, are permitted provided that the following conditions
33: * are met:
34: * 1. Redistributions of source code must retain the above copyright
35: * notice, this list of conditions and the following disclaimer.
36: * 2. Redistributions in binary form must reproduce the above copyright
37: * notice, this list of conditions and the following disclaimer in the
38: * documentation and/or other materials provided with the distribution.
39: * 3. All advertising materials mentioning features or use of this software
40: * must display the following acknowledgement:
41: * This product includes software developed by the University of
42: * California, Berkeley and its contributors.
43: * 4. Neither the name of the University nor the names of its contributors
44: * may be used to endorse or promote products derived from this software
45: * without specific prior written permission.
46: *
47: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
48: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
50: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
51: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
52: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
53: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
54: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
55: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
56: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
57: * SUCH DAMAGE.
58: *
59: * @(#)if.h 8.3 (Berkeley) 2/9/95
60: */
61:
62: /*
63: * Structures defining a network interface, providing a packet
64: * transport mechanism (ala level 0 of the PUP protocols).
65: *
66: * Each interface accepts output datagrams of a specified maximum
67: * length, and provides higher level routines with input datagrams
68: * received from its medium.
69: *
70: * Output occurs when the routine if_output is called, with four parameters:
71: * (*ifp->if_output)(ifp, m, dst, rt)
72: * Here m is the mbuf chain to be sent and dst is the destination address.
73: * The output routine encapsulates the supplied datagram if necessary,
74: * and then transmits it on its medium.
75: *
76: * On input, each interface unwraps the data received by it, and either
77: * places it on the input queue of a internetwork datagram routine
78: * and posts the associated software interrupt, or passes the datagram to a raw
79: * packet input routine.
80: *
81: * Routines exist for locating interfaces by their addresses
82: * or for locating a interface on a certain network, as well as more general
83: * routing and gateway routines maintaining information used to locate
84: * interfaces. These routines live in the files if.c and route.c
85: */
86: /* XXX fast fix for SNMP, going away soon */
87: #ifndef _NET_IF_H
88: #define _NET_IF_H
89: #include <sys/time.h>
90:
91: #ifdef __STDC__
92: /*
93: * Forward structure declarations for function prototypes [sic].
94: */
95: struct mbuf;
96: struct proc;
97: struct rtentry;
98: struct socket;
99: struct ether_header;
100: #endif
101:
102: /*
103: * Structure defining statistics and other data kept regarding a network
104: * a network interface.
105: */
106:
107: struct if_data {
108: /* generic interface information */
109: u_char ifi_type; /* ethernet, tokenring, etc */
110: u_char ifi_addrlen; /* media address length */
111: u_char ifi_hdrlen; /* media header length */
112: u_long ifi_mtu; /* maximum transmission unit */
113: u_long ifi_metric; /* routing metric (external only) */
114: u_long ifi_baudrate; /* linespeed */
115: /* volatile statistics */
116: u_long ifi_ipackets; /* packets received on interface */
117: u_long ifi_ierrors; /* input errors on interface */
118: u_long ifi_opackets; /* packets sent on interface */
119: u_long ifi_oerrors; /* output errors on interface */
120: u_long ifi_collisions; /* collisions on csma interfaces */
121: u_long ifi_ibytes; /* total number of octets received */
122: u_long ifi_obytes; /* total number of octets sent */
123: u_long ifi_imcasts; /* packets received via multicast */
124: u_long ifi_omcasts; /* packets sent via multicast */
125: u_long ifi_iqdrops; /* dropped on input, this interface */
126: u_long ifi_noproto; /* destined for unsupported protocol */
127: struct timeval ifi_lastchange;/* last updated */
128: };
129:
130: /*
131: * Structure describing information about an interface
132: * which may be of interest to management entities.
133: */
134: /*
135: * Structure defining a queue for a network interface.
136: *
137: * (Would like to call this struct ``if'', but C isn't PL/1.)
138: */
139:
140: struct ifnet {
141: char *if_name; /* name, e.g. ``en'' or ``lo'' */
142: struct ifnet *if_next; /* all struct ifnets are chained */
143: struct ifaddr *if_addrlist; /* linked list of addresses per if */
144: int if_pcount; /* number of promiscuous listeners */
145: caddr_t if_bpf; /* packet filter structure */
146: u_short if_index; /* numeric abbreviation for this if */
147: short if_unit; /* sub-unit for lower level driver */
148: short if_timer; /* time 'til if_watchdog called */
149: short if_flags; /* up/down, broadcast, etc. */
150: struct if_data if_data;
151: #if defined(ppc)
152: void *if_Y; /* For Y-adapter connection */
153: #endif /* ppc */
154: void *if_private; /* private to interface */
155: /* procedure handles */
156: int (*if_init) /* init routine */
157: __P((int));
158: int (*if_output) /* output routine (enqueue) */
159: __P((struct ifnet *, struct mbuf *, struct sockaddr *,
160: struct rtentry *));
161: int (*if_start) /* initiate output routine */
162: __P((struct ifnet *));
163: #if __APPLE__
164: long if_eflags; /* autoaddr, autoaddr done, etc. */
165: #else
166: int (*if_done) /* output complete routine */
167: __P((struct ifnet *)); /* (XXX not used; fake prototype) */
168: #endif
169: int (*if_ioctl) /* ioctl routine */
170: __P((struct ifnet *, u_long, caddr_t));
171: int (*if_reset)
172: __P((int)); /* new autoconfig will permit removal */
173: int (*if_watchdog) /* timer routine */
174: __P((int));
175: struct ifqueue {
176: struct mbuf *ifq_head;
177: struct mbuf *ifq_tail;
178: int ifq_len;
179: int ifq_maxlen;
180: int ifq_drops;
181: } if_snd; /* output queue */
182: };
183: #define if_mtu if_data.ifi_mtu
184: #define if_type if_data.ifi_type
185: #define if_addrlen if_data.ifi_addrlen
186: #define if_hdrlen if_data.ifi_hdrlen
187: #define if_metric if_data.ifi_metric
188: #define if_baudrate if_data.ifi_baudrate
189: #define if_ipackets if_data.ifi_ipackets
190: #define if_ierrors if_data.ifi_ierrors
191: #define if_opackets if_data.ifi_opackets
192: #define if_oerrors if_data.ifi_oerrors
193: #define if_collisions if_data.ifi_collisions
194: #define if_ibytes if_data.ifi_ibytes
195: #define if_obytes if_data.ifi_obytes
196: #define if_imcasts if_data.ifi_imcasts
197: #define if_omcasts if_data.ifi_omcasts
198: #define if_iqdrops if_data.ifi_iqdrops
199: #define if_noproto if_data.ifi_noproto
200: #define if_lastchange if_data.ifi_lastchange
201:
202: #define IFF_UP 0x1 /* interface is up */
203: #define IFF_BROADCAST 0x2 /* broadcast address valid */
204: #define IFF_DEBUG 0x4 /* turn on debugging */
205: #define IFF_LOOPBACK 0x8 /* is a loopback net */
206: #define IFF_POINTOPOINT 0x10 /* interface is point-to-point link */
207: #define IFF_NOTRAILERS 0x20 /* avoid use of trailers */
208: #define IFF_RUNNING 0x40 /* resources allocated */
209: #define IFF_NOARP 0x80 /* no address resolution protocol */
210: #define IFF_PROMISC 0x100 /* receive all packets */
211: #define IFF_ALLMULTI 0x200 /* receive all multicast packets */
212: #define IFF_OACTIVE 0x400 /* transmission in progress */
213: #define IFF_SIMPLEX 0x800 /* can't hear own transmissions */
214: #define IFF_LINK0 0x1000 /* per link layer defined bit */
215: #define IFF_LINK1 0x2000 /* per link layer defined bit */
216: #define IFF_LINK2 0x4000 /* per link layer defined bit */
217: #if defined(ppc)
218: #define IFF_SPLITTER IFF_LINK2 /* Y splitter in force */
219: #endif /* ppc */
220:
221: #define IFF_MULTICAST 0x8000 /* supports multicast */
222:
223:
224: #define IFEF_AUTOCONF 0x1 /* auto-configuring the interface */
225: #define IFEF_AUTOCONF_DONE 0x2 /* interface has been auto-configured */
226: #define IFEF_NETMASK_AUTH 0x4 /* authoritative ICMP netmask server */
227: #define IFEF_AWAITING_NETMASK 0x8 /* ready to accept netmask reply */
228: #define IFEF_NEEDMASK 0x10 /* Still need a subnet mask - not used yet */
229: #define IFEF_DVR_REENTRY_OK 0x20 /* When set, driver may be reentered from its own thread */
230:
231:
232: /* flags set internally only: */
233: #define IFF_CANTCHANGE \
234: (IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|\
235: IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI)
236:
237: /*
238: * Output queues (ifp->if_snd) and internetwork datagram level (pup level 1)
239: * input routines have queues of messages stored on ifqueue structures
240: * (defined above). Entries are added to and deleted from these structures
241: * by these macros, which should be called with ipl raised to splimp().
242: */
243: #define IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen)
244: #define IF_DROP(ifq) ((ifq)->ifq_drops++)
245: #define IF_ENQUEUE(ifq, m) { \
246: (m)->m_nextpkt = 0; \
247: if ((ifq)->ifq_tail == 0) \
248: (ifq)->ifq_head = m; \
249: else \
250: (ifq)->ifq_tail->m_nextpkt = m; \
251: (ifq)->ifq_tail = m; \
252: (ifq)->ifq_len++; \
253: }
254: #define IF_PREPEND(ifq, m) { \
255: (m)->m_nextpkt = (ifq)->ifq_head; \
256: if ((ifq)->ifq_tail == 0) \
257: (ifq)->ifq_tail = (m); \
258: (ifq)->ifq_head = (m); \
259: (ifq)->ifq_len++; \
260: }
261: #define IF_DEQUEUE(ifq, m) { \
262: (m) = (ifq)->ifq_head; \
263: if (m) { \
264: if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \
265: (ifq)->ifq_tail = 0; \
266: (m)->m_nextpkt = 0; \
267: (ifq)->ifq_len--; \
268: } \
269: }
270:
271: #define IFQ_MAXLEN 50
272: #define IFNET_SLOWHZ 1 /* granularity is 1 second */
273:
274: /*
275: * The ifaddr structure contains information about one address
276: * of an interface. They are maintained by the different address families,
277: * are allocated and attached when an address is set, and are linked
278: * together so all addresses for an interface can be located.
279: */
280: struct ifaddr {
281: struct sockaddr *ifa_addr; /* address of interface */
282: struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */
283: #define ifa_broadaddr ifa_dstaddr /* broadcast address interface */
284: struct sockaddr *ifa_netmask; /* used to determine subnet */
285: struct ifnet *ifa_ifp; /* back-pointer to interface */
286: struct ifaddr *ifa_next; /* next address for interface */
287: void (*ifa_rtrequest)(); /* check or clean routes (+ or -)'d */
288: u_short ifa_flags; /* mostly rt_flags for cloning */
289: short ifa_refcnt; /* extra to malloc for link info */
290: int ifa_metric; /* cost of going out this interface */
291: #ifdef notdef
292: struct rtentry *ifa_rt; /* XXXX for ROUTETOIF ????? */
293: #endif
294: };
295: #define IFA_ROUTE RTF_UP /* route installed */
296:
297: /*
298: * Message format for use in obtaining information about interfaces
299: * from getkerninfo and the routing socket
300: */
301: struct if_msghdr {
302: u_short ifm_msglen; /* to skip over non-understood messages */
303: u_char ifm_version; /* future binary compatability */
304: u_char ifm_type; /* message type */
305: int ifm_addrs; /* like rtm_addrs */
306: int ifm_flags; /* value of if_flags */
307: u_short ifm_index; /* index for associated ifp */
308: struct if_data ifm_data;/* statistics and other data about if */
309: };
310:
311: /*
312: * Message format for use in obtaining information about interface addresses
313: * from getkerninfo and the routing socket
314: */
315: struct ifa_msghdr {
316: u_short ifam_msglen; /* to skip over non-understood messages */
317: u_char ifam_version; /* future binary compatability */
318: u_char ifam_type; /* message type */
319: int ifam_addrs; /* like rtm_addrs */
320: int ifam_flags; /* value of ifa_flags */
321: u_short ifam_index; /* index for associated ifp */
322: int ifam_metric; /* value of ifa_metric */
323: };
324:
325: /*
326: * Interface request structure used for socket
327: * ioctl's. All interface ioctl's must have parameter
328: * definitions which begin with ifr_name. The
329: * remainder may be interface specific.
330: */
331: struct ifreq {
332: #define IFNAMSIZ 16
333: char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */
334: union {
335: struct sockaddr ifru_addr;
336: struct sockaddr ifru_dstaddr;
337: struct sockaddr ifru_broadaddr;
338: short ifru_flags;
339: int ifru_metric;
340: int ifru_mtu;
341: int ifru_phys;
342: int ifru_media;
343: caddr_t ifru_data;
344: } ifr_ifru;
345: #define ifr_addr ifr_ifru.ifru_addr /* address */
346: #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
347: #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
348: #define ifr_flags ifr_ifru.ifru_flags /* flags */
349: #define ifr_metric ifr_ifru.ifru_metric /* metric */
350: #define ifr_mtu ifr_ifru.ifru_mtu /* mtu */
351: #define ifr_phys ifr_ifru.ifru_phys /* physical wire */
352: #define ifr_media ifr_ifru.ifru_media /* physical media */
353: #define ifr_data ifr_ifru.ifru_data /* for use by interface */
354: };
355:
356: struct ifaliasreq {
357: char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */
358: struct sockaddr ifra_addr;
359: struct sockaddr ifra_broadaddr;
360: struct sockaddr ifra_mask;
361: };
362:
363: struct ifmediareq {
364: char ifm_name[IFNAMSIZ]; /* if name, e.g. "en0" */
365: int ifm_current; /* current media options */
366: int ifm_mask; /* don't care mask */
367: int ifm_status; /* media status */
368: int ifm_active; /* active options */
369: int ifm_count; /* # entries in ifm_ulist array */
370: int *ifm_ulist; /* media words */
371: };
372:
373: /*
374: * Structure used in SIOCGIFCONF request.
375: * Used to retrieve interface configuration
376: * for machine (useful for programs which
377: * must know all networks accessible).
378: */
379: struct ifconf {
380: int ifc_len; /* size of associated buffer */
381: union {
382: caddr_t ifcu_buf;
383: struct ifreq *ifcu_req;
384: } ifc_ifcu;
385: #define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
386: #define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */
387: };
388:
389: #include <net/if_arp.h>
390:
391: #ifdef _KERNEL
392: #define IFAFREE(ifa) \
393: if ((ifa)->ifa_refcnt <= 0) \
394: ifafree(ifa); \
395: else \
396: (ifa)->ifa_refcnt--;
397:
398: extern struct ifnet *ifnet;
399:
400: void ether_ifattach __P((struct ifnet *));
401: void ether_input __P((struct ifnet *, struct ether_header *, struct mbuf *));
402: int ether_output __P((struct ifnet *,
403: struct mbuf *, struct sockaddr *, struct rtentry *));
404: char *ether_sprintf __P((u_char *));
405:
406: void if_attach __P((struct ifnet *));
407: void if_down __P((struct ifnet *));
408: void if_qflush __P((struct ifqueue *));
409: void if_slowtimo __P((void *));
410: void if_up __P((struct ifnet *));
411: int ifconf __P((u_long, caddr_t));
412: void ifinit __P((void));
413: int ifioctl __P((struct socket *, u_long, caddr_t, struct proc *));
414: int ifpromisc __P((struct ifnet *, int));
415: struct ifnet *ifunit __P((char *));
416:
417: struct ifaddr *ifa_ifwithaddr __P((struct sockaddr *));
418: struct ifaddr *ifa_ifwithaf __P((int));
419: struct ifaddr *ifa_ifwithdstaddr __P((struct sockaddr *));
420: struct ifaddr *ifa_ifwithnet __P((struct sockaddr *));
421: struct ifaddr *ifa_ifwithroute __P((int, struct sockaddr *,
422: struct sockaddr *));
423: struct ifaddr *ifaof_ifpforaddr __P((struct sockaddr *, struct ifnet *));
424: void ifafree __P((struct ifaddr *));
425: void link_rtrequest __P((int, struct rtentry *, struct sockaddr *));
426:
427: int loioctl __P((struct ifnet *, u_long, caddr_t));
428: void loopattach __P((int));
429: int looutput __P((struct ifnet *,
430: struct mbuf *, struct sockaddr *, struct rtentry *));
431: void lortrequest __P((int, struct rtentry *, struct sockaddr *));
432: #endif /* _KERNEL */
433: #endif /* _NET_IF_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.