Annotation of XNU/bsd/net/if_var.h, revision 1.1.1.1

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_ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.