source: rtems/c/src/exec/libnetworking/net/if.h @ a6abd67

4.104.114.84.95
Last change on this file since a6abd67 was d3c1060, checked in by Joel Sherrill <joel.sherrill@…>, on 02/04/99 at 14:58:01

Added debug printf()'s that are commented out. Uncommenting these
allows one to trace the enqueueing and dequeueing of messages. This
can be used to insure that packets are getting to the boundary between
the network stack and the device driver.

  • Property mode set to 100644
File size: 16.6 KB
Line 
1/*
2 * Copyright (c) 1982, 1986, 1989, 1993
3 *      The Regents of the University of California.  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        8.1 (Berkeley) 6/10/93
34 * $Id$
35 */
36
37#ifndef _NET_IF_H_
38#define _NET_IF_H_
39
40/*
41 * Structures defining a network interface, providing a packet
42 * transport mechanism (ala level 0 of the PUP protocols).
43 *
44 * Each interface accepts output datagrams of a specified maximum
45 * length, and provides higher level routines with input datagrams
46 * received from its medium.
47 *
48 * Output occurs when the routine if_output is called, with three parameters:
49 *      (*ifp->if_output)(ifp, m, dst, rt)
50 * Here m is the mbuf chain to be sent and dst is the destination address.
51 * The output routine encapsulates the supplied datagram if necessary,
52 * and then transmits it on its medium.
53 *
54 * On input, each interface unwraps the data received by it, and either
55 * places it on the input queue of a internetwork datagram routine
56 * and posts the associated software interrupt, or passes the datagram to a raw
57 * packet input routine.
58 *
59 * Routines exist for locating interfaces by their addresses
60 * or for locating a interface on a certain network, as well as more general
61 * routing and gateway routines maintaining information used to locate
62 * interfaces.  These routines live in the files if.c and route.c
63 */
64
65#ifndef _TIME_ /*  XXX fast fix for SNMP, going away soon */
66#include <sys/time.h>
67#endif
68
69#ifdef __STDC__
70/*
71 * Forward structure declarations for function prototypes [sic].
72 */
73struct  mbuf;
74struct  proc;
75struct  rtentry;
76struct  socket;
77struct  ether_header;
78#endif
79
80/*
81 * Structure describing information about an interface
82 * which may be of interest to management entities.
83 */
84struct if_data {
85        /* generic interface information */
86        u_char  ifi_type;               /* ethernet, tokenring, etc */
87        u_char  ifi_physical;           /* e.g., AUI, Thinnet, 10base-T, etc */
88        u_char  ifi_addrlen;            /* media address length */
89        u_char  ifi_hdrlen;             /* media header length */
90        u_char  ifi_recvquota;          /* polling quota for receive intrs */
91        u_char  ifi_xmitquota;          /* polling quota for xmit intrs */
92        u_long  ifi_mtu;                /* maximum transmission unit */
93        u_long  ifi_metric;             /* routing metric (external only) */
94        u_long  ifi_baudrate;           /* linespeed */
95        /* volatile statistics */
96        u_long  ifi_ipackets;           /* packets received on interface */
97        u_long  ifi_ierrors;            /* input errors on interface */
98        u_long  ifi_opackets;           /* packets sent on interface */
99        u_long  ifi_oerrors;            /* output errors on interface */
100        u_long  ifi_collisions;         /* collisions on csma interfaces */
101        u_long  ifi_ibytes;             /* total number of octets received */
102        u_long  ifi_obytes;             /* total number of octets sent */
103        u_long  ifi_imcasts;            /* packets received via multicast */
104        u_long  ifi_omcasts;            /* packets sent via multicast */
105        u_long  ifi_iqdrops;            /* dropped on input, this interface */
106        u_long  ifi_noproto;            /* destined for unsupported protocol */
107        u_long  ifi_recvtiming;         /* usec spent receiving when timing */
108        u_long  ifi_xmittiming;         /* usec spent xmitting when timing */
109        struct  timeval ifi_lastchange; /* time of last administrative change */
110};
111
112/*
113 * Structure defining a queue for a network interface.
114 */
115struct  ifqueue {
116        struct  mbuf *ifq_head;
117        struct  mbuf *ifq_tail;
118        int     ifq_len;
119        int     ifq_maxlen;
120        int     ifq_drops;
121};
122
123/*
124 * Structure defining a network interface.
125 *
126 * (Would like to call this struct ``if'', but C isn't PL/1.)
127 */
128struct ifnet {
129        void    *if_softc;              /* pointer to driver state */
130        char    *if_name;               /* name, e.g. ``en'' or ``lo'' */
131        struct  ifnet *if_next;         /* all struct ifnets are chained */
132        struct  ifaddr *if_addrlist;    /* linked list of addresses per if */
133        int     if_pcount;              /* number of promiscuous listeners */
134        struct  bpf_if *if_bpf;         /* packet filter structure */
135        u_short if_index;               /* numeric abbreviation for this if  */
136        short   if_unit;                /* sub-unit for lower level driver */
137        short   if_timer;               /* time 'til if_watchdog called */
138        short   if_flags;               /* up/down, broadcast, etc. */
139        int     if_ipending;            /* interrupts pending */
140        void    *if_linkmib;            /* link-type-specific MIB data */
141        size_t  if_linkmiblen;          /* length of above data */
142        struct  if_data if_data;
143/* procedure handles */
144        int     (*if_output)            /* output routine (enqueue) */
145                __P((struct ifnet *, struct mbuf *, struct sockaddr *,
146                     struct rtentry *));
147        void    (*if_start)             /* initiate output routine */
148                __P((struct ifnet *));
149        int     (*if_done)              /* output complete routine */
150                __P((struct ifnet *));  /* (XXX not used; fake prototype) */
151        int     (*if_ioctl)             /* ioctl routine */
152                __P((struct ifnet *, int, caddr_t));
153        void    (*if_watchdog)          /* timer routine */
154                __P((struct ifnet *));
155        int     (*if_poll_recv)         /* polled receive routine */
156                __P((struct ifnet *, int *));
157        int     (*if_poll_xmit)         /* polled transmit routine */
158                __P((struct ifnet *, int *));
159        void    (*if_poll_intren)       /* polled interrupt reenable routine */
160                __P((struct ifnet *));
161        void    (*if_poll_slowinput)    /* input routine for slow devices */
162                __P((struct ifnet *, struct mbuf *));
163        void    (*if_init)              /* Init routine */
164                __P((void *));
165        int     (*if_tap)               /* Packet filter routine */
166                (struct ifnet *, struct ether_header *, struct mbuf *);
167        struct  ifqueue if_snd;         /* output queue */
168        struct  ifqueue *if_poll_slowq; /* input queue for slow devices */
169};
170typedef void if_init_f_t __P((void *));       
171
172#define if_mtu          if_data.ifi_mtu
173#define if_type         if_data.ifi_type
174#define if_physical     if_data.ifi_physical
175#define if_addrlen      if_data.ifi_addrlen
176#define if_hdrlen       if_data.ifi_hdrlen
177#define if_metric       if_data.ifi_metric
178#define if_baudrate     if_data.ifi_baudrate
179#define if_ipackets     if_data.ifi_ipackets
180#define if_ierrors      if_data.ifi_ierrors
181#define if_opackets     if_data.ifi_opackets
182#define if_oerrors      if_data.ifi_oerrors
183#define if_collisions   if_data.ifi_collisions
184#define if_ibytes       if_data.ifi_ibytes
185#define if_obytes       if_data.ifi_obytes
186#define if_imcasts      if_data.ifi_imcasts
187#define if_omcasts      if_data.ifi_omcasts
188#define if_iqdrops      if_data.ifi_iqdrops
189#define if_noproto      if_data.ifi_noproto
190#define if_lastchange   if_data.ifi_lastchange
191#define if_recvquota    if_data.ifi_recvquota
192#define if_xmitquota    if_data.ifi_xmitquota
193#define if_rawoutput(if, m, sa) if_output(if, m, sa, (struct rtentry *)0)
194
195#define IFF_UP          0x1             /* interface is up */
196#define IFF_BROADCAST   0x2             /* broadcast address valid */
197#define IFF_DEBUG       0x4             /* turn on debugging */
198#define IFF_LOOPBACK    0x8             /* is a loopback net */
199#define IFF_POINTOPOINT 0x10            /* interface is point-to-point link */
200/*#define IFF_NOTRAILERS 0x20            * obsolete: avoid use of trailers */
201#define IFF_RUNNING     0x40            /* resources allocated */
202#define IFF_NOARP       0x80            /* no address resolution protocol */
203#define IFF_PROMISC     0x100           /* receive all packets */
204#define IFF_ALLMULTI    0x200           /* receive all multicast packets */
205#define IFF_OACTIVE     0x400           /* transmission in progress */
206#define IFF_SIMPLEX     0x800           /* can't hear own transmissions */
207#define IFF_LINK0       0x1000          /* per link layer defined bit */
208#define IFF_LINK1       0x2000          /* per link layer defined bit */
209#define IFF_LINK2       0x4000          /* per link layer defined bit */
210#define IFF_ALTPHYS     IFF_LINK2       /* use alternate physical connection */
211#define IFF_MULTICAST   0x8000          /* supports multicast */
212
213/* flags set internally only: */
214#define IFF_CANTCHANGE \
215        (IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|\
216            IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI)
217
218
219/*
220 * These really don't belong here, but there's no other obviously appropriate
221 * location.
222 */
223#define IFP_AUI         0
224#define IFP_10BASE2     1
225#define IFP_10BASET     2
226/* etc. */
227
228/*
229 * Bit values in if_ipending
230 */
231#define IFI_RECV        1       /* I want to receive */
232#define IFI_XMIT        2       /* I want to transmit */
233
234/*
235 * Output queues (ifp->if_snd) and slow device input queues (*ifp->if_slowq)
236 * are queues of messages stored on ifqueue structures
237 * (defined above).  Entries are added to and deleted from these structures
238 * by these macros, which should be called with ipl raised to splimp().
239 */
240#define IF_QFULL(ifq)           ((ifq)->ifq_len >= (ifq)->ifq_maxlen)
241#define IF_DROP(ifq)            ((ifq)->ifq_drops++)
242#define IF_ENQUEUE(ifq, m) { \
243/* printf(" IF_ENQUEUE: %p %p\n", ifq, m ); */ \
244        (m)->m_nextpkt = 0; \
245        if ((ifq)->ifq_tail == 0) \
246                (ifq)->ifq_head = m; \
247        else \
248                (ifq)->ifq_tail->m_nextpkt = m; \
249        (ifq)->ifq_tail = m; \
250        (ifq)->ifq_len++; \
251}
252#define IF_PREPEND(ifq, m) { \
253/* printf(" IF_PREPEND: %p %p\n", ifq, m ); */ \
254        (m)->m_nextpkt = (ifq)->ifq_head; \
255        if ((ifq)->ifq_tail == 0) \
256                (ifq)->ifq_tail = (m); \
257        (ifq)->ifq_head = (m); \
258        (ifq)->ifq_len++; \
259}
260#define IF_DEQUEUE(ifq, m) { \
261        (m) = (ifq)->ifq_head; \
262        if (m) { \
263/* printf(" IF_DEQUEUE: %p %p\n", ifq, 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#ifdef KERNEL
272#define IF_ENQ_DROP(ifq, m)     if_enq_drop(ifq, m)
273
274#if defined(__GNUC__) && defined(MT_HEADER)
275static inline int
276if_queue_drop(struct ifqueue *ifq, struct mbuf *m)
277{
278        IF_DROP(ifq);
279        return 0;
280}
281
282static inline int
283if_enq_drop(struct ifqueue *ifq, struct mbuf *m)
284{
285        if (IF_QFULL(ifq) &&
286            !if_queue_drop(ifq, m))
287                return 0;
288        IF_ENQUEUE(ifq, m);
289        return 1;
290}
291#else
292
293#ifdef MT_HEADER
294int     if_enq_drop __P((struct ifqueue *, struct mbuf *));
295#endif
296
297#endif
298#endif /* KERNEL */
299
300#define IFQ_MAXLEN      50
301#define IFNET_SLOWHZ    1               /* granularity is 1 second */
302
303/*
304 * The ifaddr structure contains information about one address
305 * of an interface.  They are maintained by the different address families,
306 * are allocated and attached when an address is set, and are linked
307 * together so all addresses for an interface can be located.
308 */
309struct ifaddr {
310        struct  sockaddr *ifa_addr;     /* address of interface */
311        struct  sockaddr *ifa_dstaddr;  /* other end of p-to-p link */
312#define ifa_broadaddr   ifa_dstaddr     /* broadcast address interface */
313        struct  sockaddr *ifa_netmask;  /* used to determine subnet */
314        struct  ifnet *ifa_ifp;         /* back-pointer to interface */
315        struct  ifaddr *ifa_next;       /* next address for interface */
316        void    (*ifa_rtrequest)        /* check or clean routes (+ or -)'d */
317                __P((int, struct rtentry *, struct sockaddr *));
318        u_short ifa_flags;              /* mostly rt_flags for cloning */
319        short   ifa_refcnt;             /* references to this structure */
320        int     ifa_metric;             /* cost of going out this interface */
321#ifdef notdef
322        struct  rtentry *ifa_rt;        /* XXXX for ROUTETOIF ????? */
323#endif
324        int (*ifa_claim_addr)           /* check if an addr goes to this if */
325                __P((struct ifaddr *, struct sockaddr *));
326
327};
328#define IFA_ROUTE       RTF_UP          /* route installed */
329
330/*
331 * Message format for use in obtaining information about interfaces
332 * from getkerninfo and the routing socket
333 */
334struct if_msghdr {
335        u_short ifm_msglen;     /* to skip over non-understood messages */
336        u_char  ifm_version;    /* future binary compatability */
337        u_char  ifm_type;       /* message type */
338        int     ifm_addrs;      /* like rtm_addrs */
339        int     ifm_flags;      /* value of if_flags */
340        u_short ifm_index;      /* index for associated ifp */
341        struct  if_data ifm_data;/* statistics and other data about if */
342};
343
344/*
345 * Message format for use in obtaining information about interface addresses
346 * from getkerninfo and the routing socket
347 */
348struct ifa_msghdr {
349        u_short ifam_msglen;    /* to skip over non-understood messages */
350        u_char  ifam_version;   /* future binary compatability */
351        u_char  ifam_type;      /* message type */
352        int     ifam_addrs;     /* like rtm_addrs */
353        int     ifam_flags;     /* value of ifa_flags */
354        u_short ifam_index;     /* index for associated ifp */
355        int     ifam_metric;    /* value of ifa_metric */
356};
357
358/*
359 * Interface request structure used for socket
360 * ioctl's.  All interface ioctl's must have parameter
361 * definitions which begin with ifr_name.  The
362 * remainder may be interface specific.
363 */
364struct  ifreq {
365#define IFNAMSIZ        16
366        char    ifr_name[IFNAMSIZ];             /* if name, e.g. "en0" */
367        union {
368                struct  sockaddr ifru_addr;
369                struct  sockaddr ifru_dstaddr;
370                struct  sockaddr ifru_broadaddr;
371                short   ifru_flags;
372                int     ifru_metric;
373                int     ifru_mtu;
374                int     ifru_phys;
375                int     ifru_media;
376                caddr_t ifru_data;
377                int     (*ifru_tap)(struct ifnet *, struct ether_header *, struct mbuf *);
378        } ifr_ifru;
379#define ifr_addr        ifr_ifru.ifru_addr      /* address */
380#define ifr_dstaddr     ifr_ifru.ifru_dstaddr   /* other end of p-to-p link */
381#define ifr_broadaddr   ifr_ifru.ifru_broadaddr /* broadcast address */
382#define ifr_flags       ifr_ifru.ifru_flags     /* flags */
383#define ifr_metric      ifr_ifru.ifru_metric    /* metric */
384#define ifr_mtu         ifr_ifru.ifru_mtu       /* mtu */
385#define ifr_phys        ifr_ifru.ifru_phys      /* physical wire */
386#define ifr_media       ifr_ifru.ifru_media     /* physical media */
387#define ifr_data        ifr_ifru.ifru_data      /* for use by interface */
388#define ifr_tap         ifr_ifru.ifru_tap       /* tap function */
389};
390
391struct ifaliasreq {
392        char    ifra_name[IFNAMSIZ];            /* if name, e.g. "en0" */
393        struct  sockaddr ifra_addr;
394        struct  sockaddr ifra_broadaddr;
395        struct  sockaddr ifra_mask;
396};
397
398struct ifmediareq {
399        char    ifm_name[IFNAMSIZ];     /* if name, e.g. "en0" */
400        int     ifm_current;            /* current media options */
401        int     ifm_mask;               /* don't care mask */
402        int     ifm_status;             /* media status */
403        int     ifm_active;             /* active options */
404        int     ifm_count;              /* # entries in ifm_ulist array */
405        int     *ifm_ulist;             /* media words */
406};
407/*
408 * Structure used in SIOCGIFCONF request.
409 * Used to retrieve interface configuration
410 * for machine (useful for programs which
411 * must know all networks accessible).
412 */
413struct  ifconf {
414        int     ifc_len;                /* size of associated buffer */
415        union {
416                caddr_t ifcu_buf;
417                struct  ifreq *ifcu_req;
418        } ifc_ifcu;
419#define ifc_buf ifc_ifcu.ifcu_buf       /* buffer address */
420#define ifc_req ifc_ifcu.ifcu_req       /* array of structures returned */
421};
422
423#include <net/if_arp.h>
424
425#ifdef KERNEL
426#define IFAFREE(ifa) \
427        if ((ifa)->ifa_refcnt <= 0) \
428                ifafree(ifa); \
429        else \
430                (ifa)->ifa_refcnt--;
431
432extern struct   ifnet   *ifnet;
433extern int      ifqmaxlen;
434extern struct   ifnet   loif[];
435extern int      if_index;
436extern struct   ifaddr  **ifnet_addrs;
437
438void    ether_ifattach __P((struct ifnet *));
439void    ether_input __P((struct ifnet *, struct ether_header *, struct mbuf *));
440int     ether_output __P((struct ifnet *,
441           struct mbuf *, struct sockaddr *, struct rtentry *));
442int     ether_ioctl __P((struct ifnet *, int , caddr_t ));
443
444void    if_attach __P((struct ifnet *));
445void    if_down __P((struct ifnet *));
446void    if_up __P((struct ifnet *));
447#ifdef vax
448void    ifubareset __P((int));
449#endif
450/*void  ifinit __P((void));*/ /* declared in systm.h for main() */
451int     ifioctl __P((struct socket *, int, caddr_t, struct proc *));
452int     ifpromisc __P((struct ifnet *, int));
453struct  ifnet *ifunit __P((char *));
454
455int     if_poll_recv_slow __P((struct ifnet *ifp, int *quotap));
456void    if_poll_xmit_slow __P((struct ifnet *ifp, int *quotap));
457void    if_poll_throttle __P((void));
458void    if_poll_unthrottle __P((void *));
459void    if_poll_init __P((void));
460void    if_poll __P((void));
461
462struct  ifaddr *ifa_ifwithaddr __P((struct sockaddr *));
463struct  ifaddr *ifa_ifwithdstaddr __P((struct sockaddr *));
464struct  ifaddr *ifa_ifwithnet __P((struct sockaddr *));
465struct  ifaddr *ifa_ifwithroute __P((int, struct sockaddr *,
466                                        struct sockaddr *));
467struct  ifaddr *ifaof_ifpforaddr __P((struct sockaddr *, struct ifnet *));
468void    ifafree __P((struct ifaddr *));
469
470int     looutput __P((struct ifnet *,
471           struct mbuf *, struct sockaddr *, struct rtentry *));
472#endif /* KERNEL */
473
474#endif /* !_NET_IF_H_ */
Note: See TracBrowser for help on using the repository browser.