home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 4 / hacker04 / 04_HACK04.ISO / darwin / darwinx86.iso / usr / include / net / if_var.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-09-30  |  16.6 KB  |  475 lines

  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. #define APPLE_IF_FAM_LOOPBACK  1
  61. #define APPLE_IF_FAM_ETHERNET  2
  62. #define APPLE_IF_FAM_SLIP      3
  63. #define APPLE_IF_FAM_TUN       4
  64. #define APPLE_IF_FAM_VLAN      5
  65. #define APPLE_IF_FAM_PPP       6
  66. #define APPLE_IF_FAM_PVC       7
  67. #define APPLE_IF_FAM_DISC      8
  68. #define APPLE_IF_FAM_MDECAP    9
  69. #define APPLE_IF_FAM_GIF       10
  70. #define APPLE_IF_FAM_FAITH     11
  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 net_event_data {
  124.      u_long        if_family;
  125.      u_long        if_unit;
  126.      char        if_name[IFNAMSIZ];
  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.         u_long  ifi_hwassist;           /* HW offload capabilities */
  170.     u_long  ifi_reserved1;        /* for future use */
  171.     u_long  ifi_reserved2;        /* for future use */
  172. };
  173.  
  174.  
  175. /*
  176.  * Structure defining a queue for a network interface.
  177.  */
  178. struct    ifqueue {
  179.     struct    mbuf *ifq_head;
  180.     struct    mbuf *ifq_tail;
  181.     int    ifq_len;
  182.     int    ifq_maxlen;
  183.     int    ifq_drops;
  184. };
  185.  
  186. /*
  187.  * Structure defining a network interface.
  188.  *
  189.  * (Would like to call this struct ``if'', but C isn't PL/1.)
  190.  */
  191. struct ifnet {
  192.     void    *if_softc;        /* pointer to driver state */
  193.     char    *if_name;        /* name, e.g. ``en'' or ``lo'' */
  194.     TAILQ_ENTRY(ifnet) if_link;     /* all struct ifnets are chained */
  195.     struct    ifaddrhead if_addrhead;    /* linked list of addresses per if */
  196.         struct  tailq_head proto_head;  /* Head for if_proto structures */  
  197.         int    if_pcount;        /* number of promiscuous listeners */
  198.     struct    bpf_if *if_bpf;        /* packet filter structure */
  199.     u_short    if_index;        /* numeric abbreviation for this if  */
  200.     short    if_unit;        /* sub-unit for lower level driver */
  201.     short    if_timer;        /* time 'til if_watchdog called */
  202.     short    if_flags;        /* up/down, broadcast, etc. */
  203.     int    if_ipending;        /* interrupts pending */
  204.     void    *if_linkmib;        /* link-type-specific MIB data */
  205.     size_t    if_linkmiblen;        /* length of above data */
  206.     struct    if_data if_data;
  207.  
  208. /* New with DLIL */
  209.     int    refcnt;
  210.     int    offercnt;
  211.     int    (*if_output)(struct ifnet *ifnet_ptr, struct mbuf *m);
  212.     int    (*if_ioctl)(struct ifnet *ifnet_ptr, u_long  ioctl_code, void  *ioctl_arg);
  213.     int    (*if_set_bpf_tap)(struct ifnet *ifp, int mode, 
  214.                   int (*bpf_callback)(struct ifnet *, struct mbuf *));
  215.     int    (*if_free)(struct ifnet *ifnet_ptr);
  216.     int    (*if_demux)(struct ifnet  *ifnet_ptr, struct mbuf  *mbuf_ptr, 
  217.                 char *frame_ptr, void  *if_proto_ptr);
  218.  
  219.     int    (*if_event)(struct ifnet  *ifnet_ptr, caddr_t  event_ptr);
  220.  
  221.     int    (*if_framer)(struct ifnet    *ifp,
  222.                  struct mbuf     **m,
  223.                  struct sockaddr *dest,
  224.                  char            *dest_linkaddr,
  225.                  char         *frame_type);
  226.  
  227.     u_long  if_family;        /* ulong assigned by Apple */
  228.     struct tailq_head   if_flt_head;
  229.  
  230. /* End DLIL specific */
  231.  
  232. /* #if defined(ppc) */
  233.     void    *if_Y;            /* For Y-adapter connection */
  234. /* #endif */
  235.     void    *if_private;            /* private to interface */
  236. /* procedure handles */
  237. #if     __APPLE__
  238.     long    if_eflags;        /* autoaddr, autoaddr done, etc. */
  239. #else
  240.     int    (*if_done)        /* output complete routine */
  241.         __P((struct ifnet *));    /* (XXX not used; fake prototype) */
  242. #endif
  243.  
  244.  
  245.     struct    ifmultihead if_multiaddrs; /* multicast addresses configured */
  246.     int    if_amcount;        /* number of all-multicast requests */
  247. /* procedure handles */
  248.     int    (*if_poll_recv)        /* polled receive routine */
  249.         __P((struct ifnet *, int *));
  250.     int    (*if_poll_xmit)        /* polled transmit routine */
  251.         __P((struct ifnet *, int *));
  252.     void    (*if_poll_intren)    /* polled interrupt reenable routine */
  253.         __P((struct ifnet *));
  254.     void    (*if_poll_slowinput)    /* input routine for slow devices */
  255.         __P((struct ifnet *, struct mbuf *));
  256.     void    (*if_init)        /* Init routine */
  257.         __P((void *));
  258.     int    (*if_resolvemulti)    /* validate/resolve multicast */
  259.         __P((struct ifnet *, struct sockaddr **, struct sockaddr *));
  260.     struct    ifqueue if_snd;        /* output queue */
  261.     struct    ifqueue *if_poll_slowq;    /* input queue for slow devices */
  262.     u_long  family_cookie;    
  263.     struct    ifprefix *if_prefixlist; /* linked list of prefixes per if */
  264.     void *reserved1;    /* for future use */
  265.     void *reserved2;    /* for future use */
  266. };
  267. typedef void if_init_f_t __P((void *));
  268.  
  269. #define    if_mtu        if_data.ifi_mtu
  270. #define    if_type        if_data.ifi_type
  271. #define if_typelen    if_data.ifi_typelen
  272. #define if_physical    if_data.ifi_physical
  273. #define    if_addrlen    if_data.ifi_addrlen
  274. #define    if_hdrlen    if_data.ifi_hdrlen
  275. #define    if_metric    if_data.ifi_metric
  276. #define    if_baudrate    if_data.ifi_baudrate
  277. #define if_hwassist     if_data.ifi_hwassist
  278. #define    if_ipackets    if_data.ifi_ipackets
  279. #define    if_ierrors    if_data.ifi_ierrors
  280. #define    if_opackets    if_data.ifi_opackets
  281. #define    if_oerrors    if_data.ifi_oerrors
  282. #define    if_collisions    if_data.ifi_collisions
  283. #define    if_ibytes    if_data.ifi_ibytes
  284. #define    if_obytes    if_data.ifi_obytes
  285. #define    if_imcasts    if_data.ifi_imcasts
  286. #define    if_omcasts    if_data.ifi_omcasts
  287. #define    if_iqdrops    if_data.ifi_iqdrops
  288. #define    if_noproto    if_data.ifi_noproto
  289. #define    if_lastchange    if_data.ifi_lastchange
  290. #define if_recvquota    if_data.ifi_recvquota
  291. #define    if_xmitquota    if_data.ifi_xmitquota
  292. #define if_rawoutput(if, m, sa) if_output(if, m, sa, (struct rtentry *)0)
  293.  
  294. /*
  295.  * Bit values in if_ipending
  296.  */
  297. #define    IFI_RECV    1    /* I want to receive */
  298. #define    IFI_XMIT    2    /* I want to transmit */
  299.  
  300. /*
  301.  * Output queues (ifp->if_snd) and slow device input queues (*ifp->if_slowq)
  302.  * are queues of messages stored on ifqueue structures
  303.  * (defined above).  Entries are added to and deleted from these structures
  304.  * by these macros, which should be called with ipl raised to splimp().
  305.  */
  306. #define    IF_QFULL(ifq)        ((ifq)->ifq_len >= (ifq)->ifq_maxlen)
  307. #define    IF_DROP(ifq)        ((ifq)->ifq_drops++)
  308. #define    IF_ENQUEUE(ifq, m) { \
  309.     (m)->m_nextpkt = 0; \
  310.     if ((ifq)->ifq_tail == 0) \
  311.         (ifq)->ifq_head = m; \
  312.     else \
  313.         (ifq)->ifq_tail->m_nextpkt = m; \
  314.     (ifq)->ifq_tail = m; \
  315.     (ifq)->ifq_len++; \
  316. }
  317. #define    IF_PREPEND(ifq, m) { \
  318.     (m)->m_nextpkt = (ifq)->ifq_head; \
  319.     if ((ifq)->ifq_tail == 0) \
  320.         (ifq)->ifq_tail = (m); \
  321.     (ifq)->ifq_head = (m); \
  322.     (ifq)->ifq_len++; \
  323. }
  324. #define    IF_DEQUEUE(ifq, m) { \
  325.     (m) = (ifq)->ifq_head; \
  326.     if (m) { \
  327.         if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \
  328.             (ifq)->ifq_tail = 0; \
  329.         (m)->m_nextpkt = 0; \
  330.         (ifq)->ifq_len--; \
  331.     } \
  332. }
  333.  
  334. #ifdef KERNEL
  335. #define    IF_ENQ_DROP(ifq, m)    if_enq_drop(ifq, m)
  336.  
  337. #if defined(__GNUC__) && defined(MT_HEADER)
  338. static __inline int
  339. if_queue_drop(struct ifqueue *ifq, struct mbuf *m)
  340. {
  341.     IF_DROP(ifq);
  342.     return 0;
  343. }
  344.  
  345. static __inline int
  346. if_enq_drop(struct ifqueue *ifq, struct mbuf *m)
  347. {
  348.     if (IF_QFULL(ifq) &&
  349.         !if_queue_drop(ifq, m))
  350.         return 0;
  351.     IF_ENQUEUE(ifq, m);
  352.     return 1;
  353. }
  354. #else
  355.  
  356. #ifdef MT_HEADER
  357. int    if_enq_drop __P((struct ifqueue *, struct mbuf *));
  358. #endif
  359.  
  360. #endif
  361. #endif /* KERNEL */
  362.  
  363. /*
  364.  * The ifaddr structure contains information about one address
  365.  * of an interface.  They are maintained by the different address families,
  366.  * are allocated and attached when an address is set, and are linked
  367.  * together so all addresses for an interface can be located.
  368.  */
  369. struct ifaddr {
  370.     struct    sockaddr *ifa_addr;    /* address of interface */
  371.     struct    sockaddr *ifa_dstaddr;    /* other end of p-to-p link */
  372. #define    ifa_broadaddr    ifa_dstaddr    /* broadcast address interface */
  373.     struct    sockaddr *ifa_netmask;    /* used to determine subnet */
  374.     struct    ifnet *ifa_ifp;        /* back-pointer to interface */
  375.     TAILQ_ENTRY(ifaddr) ifa_link;    /* queue macro glue */
  376.     void    (*ifa_rtrequest)    /* check or clean routes (+ or -)'d */
  377.         __P((int, struct rtentry *, struct sockaddr *));
  378.     u_short    ifa_flags;        /* mostly rt_flags for cloning */
  379.     short    ifa_refcnt;        /* references to this structure */
  380.     int    ifa_metric;        /* cost of going out this interface */
  381. #ifdef notdef
  382.     struct    rtentry *ifa_rt;    /* XXXX for ROUTETOIF ????? */
  383. #endif
  384.     u_long  ifa_dlt;
  385.     int (*ifa_claim_addr)        /* check if an addr goes to this if */
  386.         __P((struct ifaddr *, struct sockaddr *));
  387.  
  388. };
  389. #define    IFA_ROUTE    RTF_UP        /* route installed */
  390.  
  391. /*
  392.  * The prefix structure contains information about one prefix
  393.  * of an interface.  They are maintained by the different address families,
  394.  * are allocated and attached when an prefix or an address is set,
  395.  * and are linked together so all prefixes for an interface can be located.
  396.  */
  397. struct ifprefix {
  398.     struct    sockaddr *ifpr_prefix;    /* prefix of interface */
  399.     struct    ifnet *ifpr_ifp;    /* back-pointer to interface */
  400.     struct ifprefix *ifpr_next;
  401.     u_char    ifpr_plen;        /* prefix length in bits */
  402.     u_char    ifpr_type;        /* protocol dependent prefix type */
  403. };
  404.  
  405. /*
  406.  * Multicast address structure.  This is analogous to the ifaddr
  407.  * structure except that it keeps track of multicast addresses.
  408.  * Also, the reference count here is a count of requests for this
  409.  * address, not a count of pointers to this structure.
  410.  */
  411. struct ifmultiaddr {
  412.     LIST_ENTRY(ifmultiaddr) ifma_link; /* queue macro glue */
  413.     struct    sockaddr *ifma_addr;     /* address this membership is for */
  414.     struct    sockaddr *ifma_lladdr;    /* link-layer translation, if any */
  415.     struct    ifnet *ifma_ifp;    /* back-pointer to interface */
  416.     u_int    ifma_refcount;        /* reference count */
  417.     void    *ifma_protospec;    /* protocol-specific state, if any */
  418. };
  419.  
  420. #if KERNEL
  421. #define    IFAFREE(ifa) \
  422.     do { \
  423.         if ((ifa)->ifa_refcnt <= 0) \
  424.             ifafree(ifa); \
  425.         else \
  426.             (ifa)->ifa_refcnt--; \
  427.     } while (0)
  428.  
  429. extern    struct ifnethead ifnet;
  430. extern struct    ifnet    **ifindex2ifnet;
  431. extern    int ifqmaxlen;
  432. extern    struct ifnet loif[];
  433. extern    int if_index;
  434. extern    struct ifaddr **ifnet_addrs;
  435.  
  436. int    if_addmulti __P((struct ifnet *, struct sockaddr *, 
  437.              struct ifmultiaddr **));
  438. int    if_allmulti __P((struct ifnet *, int));
  439. void    if_attach __P((struct ifnet *));
  440. int    if_delmulti __P((struct ifnet *, struct sockaddr *));
  441. void    if_down __P((struct ifnet *));
  442. void    if_route __P((struct ifnet *, int flag, int fam));
  443. void    if_unroute __P((struct ifnet *, int flag, int fam));
  444. void    if_up __P((struct ifnet *));
  445. /*void    ifinit __P((void));*/ /* declared in systm.h for main() */
  446. int    ifioctl __P((struct socket *, u_long, caddr_t, struct proc *));
  447. int    ifpromisc __P((struct ifnet *, int));
  448. struct    ifnet *ifunit __P((char *));
  449. struct  ifnet *if_withname __P((struct sockaddr *));
  450.  
  451. int    if_poll_recv_slow __P((struct ifnet *ifp, int *quotap));
  452. void    if_poll_xmit_slow __P((struct ifnet *ifp, int *quotap));
  453. void    if_poll_throttle __P((void));
  454. void    if_poll_unthrottle __P((void *));
  455. void    if_poll_init __P((void));
  456. void    if_poll __P((void));
  457.  
  458. struct    ifaddr *ifa_ifwithaddr __P((struct sockaddr *));
  459. struct    ifaddr *ifa_ifwithdstaddr __P((struct sockaddr *));
  460. struct    ifaddr *ifa_ifwithnet __P((struct sockaddr *));
  461. struct    ifaddr *ifa_ifwithroute __P((int, struct sockaddr *,
  462.                     struct sockaddr *));
  463. struct    ifaddr *ifaof_ifpforaddr __P((struct sockaddr *, struct ifnet *));
  464. void    ifafree __P((struct ifaddr *));
  465.  
  466. struct    ifmultiaddr *ifmaof_ifpforaddr __P((struct sockaddr *, 
  467.                         struct ifnet *));
  468. int    if_simloop __P((struct ifnet *ifp, struct mbuf *m,
  469.         struct sockaddr *dst, int hlen));
  470.  
  471. #endif /* KERNEL */
  472.  
  473.  
  474. #endif /* !_NET_IF_VAR_H_ */
  475.