|
|
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: /*
23: * Copyright (c) 1982, 1986, 1989, 1993
24: * The Regents of the University of California. All rights reserved.
25: *
26: * Redistribution and use in source and binary forms, with or without
27: * modification, are permitted provided that the following conditions
28: * are met:
29: * 1. Redistributions of source code must retain the above copyright
30: * notice, this list of conditions and the following disclaimer.
31: * 2. Redistributions in binary form must reproduce the above copyright
32: * notice, this list of conditions and the following disclaimer in the
33: * documentation and/or other materials provided with the distribution.
34: * 3. All advertising materials mentioning features or use of this software
35: * must display the following acknowledgement:
36: * This product includes software developed by the University of
37: * California, Berkeley and its contributors.
38: * 4. Neither the name of the University nor the names of its contributors
39: * may be used to endorse or promote products derived from this software
40: * without specific prior written permission.
41: *
42: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
43: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
46: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52: * SUCH DAMAGE.
53: *
54: * From: @(#)if.h 8.1 (Berkeley) 6/10/93
55: */
56:
57: #ifndef _NET_IF_VAR_H_
58: #define _NET_IF_VAR_H_
59:
60:
61:
62: #define APPLE_IF_FAM_LOOPBACK 1
63: #define APPLE_IF_FAM_ETHERNET 2
64: #define APPLE_IF_FAM_SLIP 3
65: #define APPLE_IF_FAM_TUN 4
66: #define APPLE_IF_FAM_VLAN 5
67: #define APPLE_IF_FAM_PPP 6
68: #define APPLE_IF_FAM_PVC 7
69: #define APPLE_IF_FAM_DISC 8
70: #define APPLE_IF_FAM_MDECAP 9
71:
72:
73: /*
74: * Structures defining a network interface, providing a packet
75: * transport mechanism (ala level 0 of the PUP protocols).
76: *
77: * Each interface accepts output datagrams of a specified maximum
78: * length, and provides higher level routines with input datagrams
79: * received from its medium.
80: *
81: * Output occurs when the routine if_output is called, with three parameters:
82: * (*ifp->if_output)(ifp, m, dst, rt)
83: * Here m is the mbuf chain to be sent and dst is the destination address.
84: * The output routine encapsulates the supplied datagram if necessary,
85: * and then transmits it on its medium.
86: *
87: * On input, each interface unwraps the data received by it, and either
88: * places it on the input queue of a internetwork datagram routine
89: * and posts the associated software interrupt, or passes the datagram to a raw
90: * packet input routine.
91: *
92: * Routines exist for locating interfaces by their addresses
93: * or for locating a interface on a certain network, as well as more general
94: * routing and gateway routines maintaining information used to locate
95: * interfaces. These routines live in the files if.c and route.c
96: */
97:
98: #ifdef __STDC__
99: /*
100: * Forward structure declarations for function prototypes [sic].
101: */
102: struct mbuf;
103: struct proc;
104: struct rtentry;
105: struct socket;
106: struct sockaddr_dl;
107: #endif
108:
109: #define IFNAMSIZ 16
110:
111: #include <sys/queue.h> /* get TAILQ macros */
112:
113: struct tqdummy {
114: };
115:
116: TAILQ_HEAD(tailq_head, tqdummy);
117:
118:
119: /* This belongs up in socket.h or socketvar.h, depending on how far the
120: * event bubbles up.
121: */
122:
123: struct event_msg {
124: int msg_len;
125: int event_code;
126: char msg[1]; /* actually, variable length */
127: };
128:
129:
130:
131: TAILQ_HEAD(ifnethead, ifnet); /* we use TAILQs so that the order of */
132: TAILQ_HEAD(ifaddrhead, ifaddr); /* instantiation is preserved in the list */
133: LIST_HEAD(ifmultihead, ifmultiaddr);
134:
135:
136: /*
137: * Structure describing information about an interface
138: * which may be of interest to management entities.
139: */
140: struct if_data {
141: /* generic interface information */
142: u_char ifi_type; /* ethernet, tokenring, etc */
143: u_char ifi_typelen; /* Length of frame type id */
144: u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */
145: u_char ifi_addrlen; /* media address length */
146: u_char ifi_hdrlen; /* media header length */
147: u_char ifi_recvquota; /* polling quota for receive intrs */
148: u_char ifi_xmitquota; /* polling quota for xmit intrs */
149: u_long ifi_mtu; /* maximum transmission unit */
150: u_long ifi_metric; /* routing metric (external only) */
151: u_long ifi_baudrate; /* linespeed */
152: /* volatile statistics */
153: u_long ifi_ipackets; /* packets received on interface */
154: u_long ifi_ierrors; /* input errors on interface */
155: u_long ifi_opackets; /* packets sent on interface */
156: u_long ifi_oerrors; /* output errors on interface */
157: u_long ifi_collisions; /* collisions on csma interfaces */
158: u_long ifi_ibytes; /* total number of octets received */
159: u_long ifi_obytes; /* total number of octets sent */
160: u_long ifi_imcasts; /* packets received via multicast */
161: u_long ifi_omcasts; /* packets sent via multicast */
162: u_long ifi_iqdrops; /* dropped on input, this interface */
163: u_long ifi_noproto; /* destined for unsupported protocol */
164: u_long ifi_recvtiming; /* usec spent receiving when timing */
165: u_long ifi_xmittiming; /* usec spent xmitting when timing */
166: struct timeval ifi_lastchange; /* time of last administrative change */
167: u_long default_proto; /* Default dl_tag when none is specified
168: * on dlil_output
169: */
170: };
171:
172:
173: /*
174: * Structure defining a queue for a network interface.
175: */
176: struct ifqueue {
177: struct mbuf *ifq_head;
178: struct mbuf *ifq_tail;
179: int ifq_len;
180: int ifq_maxlen;
181: int ifq_drops;
182: };
183:
184: /*
185: * Structure defining a network interface.
186: *
187: * (Would like to call this struct ``if'', but C isn't PL/1.)
188: */
189: struct ifnet {
190: void *if_softc; /* pointer to driver state */
191: char *if_name; /* name, e.g. ``en'' or ``lo'' */
192: TAILQ_ENTRY(ifnet) if_link; /* all struct ifnets are chained */
193: struct ifaddrhead if_addrhead; /* linked list of addresses per if */
194: struct tailq_head proto_head; /* Head for if_proto structures */
195: int if_pcount; /* number of promiscuous listeners */
196: struct bpf_if *if_bpf; /* packet filter structure */
197: u_short if_index; /* numeric abbreviation for this if */
198: short if_unit; /* sub-unit for lower level driver */
199: short if_timer; /* time 'til if_watchdog called */
200: short if_flags; /* up/down, broadcast, etc. */
201: int if_ipending; /* interrupts pending */
202: void *if_linkmib; /* link-type-specific MIB data */
203: size_t if_linkmiblen; /* length of above data */
204: struct if_data if_data;
205:
206: /* New with DLIL */
207: int refcnt;
208: int offercnt;
209: int (*if_output)(struct ifnet *ifnet_ptr, struct mbuf *m);
210: int (*if_ioctl)(struct ifnet *ifnet_ptr, u_long ioctl_code, void *ioctl_arg);
211: int (*if_set_bpf_tap)(struct ifnet *ifp, int mode,
212: int (*bpf_callback)(struct ifnet *, struct mbuf *));
213: int (*if_free)(struct ifnet *ifnet_ptr);
214: int (*if_demux)(struct ifnet *ifnet_ptr, struct mbuf *mbuf_ptr,
215: char *frame_ptr, void *if_proto_ptr);
216:
217: int (*if_event)(struct ifnet *ifnet_ptr, struct event_msg *event_msg_str);
218:
219: int (*if_framer)(struct ifnet *ifp,
220: struct mbuf **m,
221: struct sockaddr *dest,
222: char *dest_linkaddr,
223: char *frame_type);
224:
225: u_long if_family; /* ulong assigned by Apple */
226: struct tailq_head if_flt_head;
227:
228: /* End DLIL specific */
229:
230: /* #if defined(ppc) */
231: void *if_Y; /* For Y-adapter connection */
232: /* #endif */
233: void *if_private; /* private to interface */
234: /* procedure handles */
235: #if __APPLE__
236: long if_eflags; /* autoaddr, autoaddr done, etc. */
237: #else
238: int (*if_done) /* output complete routine */
239: __P((struct ifnet *)); /* (XXX not used; fake prototype) */
240: #endif
241:
242:
243: struct ifmultihead if_multiaddrs; /* multicast addresses configured */
244: int if_amcount; /* number of all-multicast requests */
245: /* procedure handles */
246: int (*if_poll_recv) /* polled receive routine */
247: __P((struct ifnet *, int *));
248: int (*if_poll_xmit) /* polled transmit routine */
249: __P((struct ifnet *, int *));
250: void (*if_poll_intren) /* polled interrupt reenable routine */
251: __P((struct ifnet *));
252: void (*if_poll_slowinput) /* input routine for slow devices */
253: __P((struct ifnet *, struct mbuf *));
254: void (*if_init) /* Init routine */
255: __P((void *));
256: int (*if_resolvemulti) /* validate/resolve multicast */
257: __P((struct ifnet *, struct sockaddr **, struct sockaddr *));
258: struct ifqueue if_snd; /* output queue */
259: struct ifqueue *if_poll_slowq; /* input queue for slow devices */
260: u_long family_cookie;
261: };
262: typedef void if_init_f_t __P((void *));
263:
264: #define if_mtu if_data.ifi_mtu
265: #define if_type if_data.ifi_type
266: #define if_typelen if_data.ifi_typelen
267: #define if_physical if_data.ifi_physical
268: #define if_addrlen if_data.ifi_addrlen
269: #define if_hdrlen if_data.ifi_hdrlen
270: #define if_metric if_data.ifi_metric
271: #define if_baudrate if_data.ifi_baudrate
272: #define if_ipackets if_data.ifi_ipackets
273: #define if_ierrors if_data.ifi_ierrors
274: #define if_opackets if_data.ifi_opackets
275: #define if_oerrors if_data.ifi_oerrors
276: #define if_collisions if_data.ifi_collisions
277: #define if_ibytes if_data.ifi_ibytes
278: #define if_obytes if_data.ifi_obytes
279: #define if_imcasts if_data.ifi_imcasts
280: #define if_omcasts if_data.ifi_omcasts
281: #define if_iqdrops if_data.ifi_iqdrops
282: #define if_noproto if_data.ifi_noproto
283: #define if_lastchange if_data.ifi_lastchange
284: #define if_recvquota if_data.ifi_recvquota
285: #define if_xmitquota if_data.ifi_xmitquota
286: #define if_rawoutput(if, m, sa) if_output(if, m, sa, (struct rtentry *)0)
287:
288: /*
289: * Bit values in if_ipending
290: */
291: #define IFI_RECV 1 /* I want to receive */
292: #define IFI_XMIT 2 /* I want to transmit */
293:
294: /*
295: * Output queues (ifp->if_snd) and slow device input queues (*ifp->if_slowq)
296: * are queues of messages stored on ifqueue structures
297: * (defined above). Entries are added to and deleted from these structures
298: * by these macros, which should be called with ipl raised to splimp().
299: */
300: #define IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen)
301: #define IF_DROP(ifq) ((ifq)->ifq_drops++)
302: #define IF_ENQUEUE(ifq, m) { \
303: (m)->m_nextpkt = 0; \
304: if ((ifq)->ifq_tail == 0) \
305: (ifq)->ifq_head = m; \
306: else \
307: (ifq)->ifq_tail->m_nextpkt = m; \
308: (ifq)->ifq_tail = m; \
309: (ifq)->ifq_len++; \
310: }
311: #define IF_PREPEND(ifq, m) { \
312: (m)->m_nextpkt = (ifq)->ifq_head; \
313: if ((ifq)->ifq_tail == 0) \
314: (ifq)->ifq_tail = (m); \
315: (ifq)->ifq_head = (m); \
316: (ifq)->ifq_len++; \
317: }
318: #define IF_DEQUEUE(ifq, m) { \
319: (m) = (ifq)->ifq_head; \
320: if (m) { \
321: if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \
322: (ifq)->ifq_tail = 0; \
323: (m)->m_nextpkt = 0; \
324: (ifq)->ifq_len--; \
325: } \
326: }
327:
328: #ifdef KERNEL
329: #define IF_ENQ_DROP(ifq, m) if_enq_drop(ifq, m)
330:
331: #if defined(__GNUC__) && defined(MT_HEADER)
332: static __inline int
333: if_queue_drop(struct ifqueue *ifq, struct mbuf *m)
334: {
335: IF_DROP(ifq);
336: return 0;
337: }
338:
339: static __inline int
340: if_enq_drop(struct ifqueue *ifq, struct mbuf *m)
341: {
342: if (IF_QFULL(ifq) &&
343: !if_queue_drop(ifq, m))
344: return 0;
345: IF_ENQUEUE(ifq, m);
346: return 1;
347: }
348: #else
349:
350: #ifdef MT_HEADER
351: int if_enq_drop __P((struct ifqueue *, struct mbuf *));
352: #endif
353:
354: #endif
355: #endif /* KERNEL */
356:
357: /*
358: * The ifaddr structure contains information about one address
359: * of an interface. They are maintained by the different address families,
360: * are allocated and attached when an address is set, and are linked
361: * together so all addresses for an interface can be located.
362: */
363: struct ifaddr {
364: struct sockaddr *ifa_addr; /* address of interface */
365: struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */
366: #define ifa_broadaddr ifa_dstaddr /* broadcast address interface */
367: struct sockaddr *ifa_netmask; /* used to determine subnet */
368: struct ifnet *ifa_ifp; /* back-pointer to interface */
369: TAILQ_ENTRY(ifaddr) ifa_link; /* queue macro glue */
370: void (*ifa_rtrequest) /* check or clean routes (+ or -)'d */
371: __P((int, struct rtentry *, struct sockaddr *));
372: u_short ifa_flags; /* mostly rt_flags for cloning */
373: short ifa_refcnt; /* references to this structure */
374: int ifa_metric; /* cost of going out this interface */
375: #ifdef notdef
376: struct rtentry *ifa_rt; /* XXXX for ROUTETOIF ????? */
377: #endif
378: u_long ifa_dlt;
379: int (*ifa_claim_addr) /* check if an addr goes to this if */
380: __P((struct ifaddr *, struct sockaddr *));
381:
382: };
383: #define IFA_ROUTE RTF_UP /* route installed */
384:
385: /*
386: * Multicast address structure. This is analogous to the ifaddr
387: * structure except that it keeps track of multicast addresses.
388: * Also, the reference count here is a count of requests for this
389: * address, not a count of pointers to this structure.
390: */
391: struct ifmultiaddr {
392: LIST_ENTRY(ifmultiaddr) ifma_link; /* queue macro glue */
393: struct sockaddr *ifma_addr; /* address this membership is for */
394: struct sockaddr *ifma_lladdr; /* link-layer translation, if any */
395: struct ifnet *ifma_ifp; /* back-pointer to interface */
396: u_int ifma_refcount; /* reference count */
397: void *ifma_protospec; /* protocol-specific state, if any */
398: };
399:
400: #if KERNEL
401: #define IFAFREE(ifa) \
402: if ((ifa)->ifa_refcnt <= 0) \
403: ifafree(ifa); \
404: else \
405: (ifa)->ifa_refcnt--;
406:
407: extern struct ifnethead ifnet;
408: extern int ifqmaxlen;
409: extern struct ifnet loif[];
410: extern int if_index;
411: extern struct ifaddr **ifnet_addrs;
412:
413: int if_addmulti __P((struct ifnet *, struct sockaddr *,
414: struct ifmultiaddr **));
415: int if_allmulti __P((struct ifnet *, int));
416: void if_attach __P((struct ifnet *));
417: int if_delmulti __P((struct ifnet *, struct sockaddr *));
418: void if_down __P((struct ifnet *));
419: void if_route __P((struct ifnet *, int flag, int fam));
420: void if_unroute __P((struct ifnet *, int flag, int fam));
421: void if_up __P((struct ifnet *));
422: /*void ifinit __P((void));*/ /* declared in systm.h for main() */
423: int ifioctl __P((struct socket *, u_long, caddr_t, struct proc *));
424: int ifpromisc __P((struct ifnet *, int));
425: struct ifnet *ifunit __P((char *));
426:
427: int if_poll_recv_slow __P((struct ifnet *ifp, int *quotap));
428: void if_poll_xmit_slow __P((struct ifnet *ifp, int *quotap));
429: void if_poll_throttle __P((void));
430: void if_poll_unthrottle __P((void *));
431: void if_poll_init __P((void));
432: void if_poll __P((void));
433:
434: struct ifaddr *ifa_ifwithaddr __P((struct sockaddr *));
435: struct ifaddr *ifa_ifwithdstaddr __P((struct sockaddr *));
436: struct ifaddr *ifa_ifwithnet __P((struct sockaddr *));
437: struct ifaddr *ifa_ifwithroute __P((int, struct sockaddr *,
438: struct sockaddr *));
439: struct ifaddr *ifaof_ifpforaddr __P((struct sockaddr *, struct ifnet *));
440: void ifafree __P((struct ifaddr *));
441:
442: struct ifmultiaddr *ifmaof_ifpforaddr __P((struct sockaddr *,
443: struct ifnet *));
444: int if_simloop __P((struct ifnet *ifp, struct mbuf *m,
445: struct sockaddr *dst, int hlen));
446:
447: #endif /* KERNEL */
448:
449:
450: #endif /* !_NET_IF_VAR_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.