]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/net/if_var.h
xnu-1486.2.11.tar.gz
[apple/xnu.git] / bsd / net / if_var.h
index 2c69ea514f872993be9b68e21b6756373c68d03d..67d52d0a22ca1456231e3e911c51d5994001d5f6 100644 (file)
@@ -1,16 +1,19 @@
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2008 Apple Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
  * This file contains Original Code and/or Modifications of Original Code
  * as defined in and that are subject to the Apple Public Source License
  * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
+ * 
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
  * 
  * The Original Code and all software distributed under the License are
  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
@@ -20,7 +23,7 @@
  * Please see the License for the specific language governing rights and
  * limitations under the License.
  * 
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
 
 #ifndef        _NET_IF_VAR_H_
 #define        _NET_IF_VAR_H_
+
 #include <sys/appleapiopts.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/queue.h>         /* get TAILQ macros */
+#ifdef KERNEL_PRIVATE
+#include <kern/locks.h>
+#endif /* KERNEL_PRIVATE */
+#ifdef PRIVATE
+#include <net/route.h>
+#endif
+
+#ifdef KERNEL
+#include <net/kpi_interface.h>
+#endif /* KERNEL */
 
 #ifdef __APPLE__
 #define APPLE_IF_FAM_LOOPBACK  1
 #define APPLE_IF_FAM_MDECAP    9
 #define APPLE_IF_FAM_GIF       10
 #define APPLE_IF_FAM_FAITH     11
-#define APPLE_IF_FAM_STF          12
-#endif
+#define APPLE_IF_FAM_STF       12
+#define APPLE_IF_FAM_FIREWIRE  13
+#define APPLE_IF_FAM_BOND      14
+#endif /* __APPLE__ */
+
+/*
+ * 72 was chosen below because it is the size of a TCP/IP
+ * header (40) + the minimum mss (32).
+ */
+#define        IF_MINMTU       72
+#define        IF_MAXMTU       65535
 
 /*
  * Structures defining a network interface, providing a packet
  * interfaces.  These routines live in the files if.c and route.c
  */
 
-#ifdef __STDC__
-/*
- * Forward structure declarations for function prototypes [sic].
- */
-struct mbuf;
-struct proc;
-struct rtentry;
-struct socket;
-struct ether_header;
-struct  sockaddr_dl;
-#endif
-
 #define        IFNAMSIZ        16
 
-#include <sys/queue.h>         /* get TAILQ macros */
-
-#ifdef __APPLE_API_UNSTABLE
-#ifdef __APPLE__
-struct tqdummy;
-
-TAILQ_HEAD(tailq_head, tqdummy);
-
 /* This belongs up in socket.h or socketvar.h, depending on how far the
  *   event bubbles up.
  */
 
 struct net_event_data {
-     u_long            if_family;
-     u_long            if_unit;
-     char              if_name[IFNAMSIZ];
+       u_int32_t       if_family;
+       u_int32_t       if_unit;
+       char            if_name[IFNAMSIZ];
 };
+
+#if defined(__LP64__)
+#define __need_struct_timeval32
+#include <sys/_structs.h>
+#define IF_DATA_TIMEVAL timeval32
+#else
+#define IF_DATA_TIMEVAL timeval
 #endif
 
+#pragma pack(4)
 
-TAILQ_HEAD(ifnethead, ifnet);  /* we use TAILQs so that the order of */
-TAILQ_HEAD(ifaddrhead, ifaddr);        /* instantiation is preserved in the list */
-TAILQ_HEAD(ifprefixhead, ifprefix);
-LIST_HEAD(ifmultihead, ifmultiaddr);
-
-#ifdef __APPLE__
 /*
  * Structure describing information about an interface
  * which may be of interest to management entities.
  */
 struct if_data {
        /* generic interface information */
-       u_char  ifi_type;               /* ethernet, tokenring, etc */
-#ifdef __APPLE__
-       u_char  ifi_typelen;            /* Length of frame type id */
-#endif
-       u_char  ifi_physical;           /* e.g., AUI, Thinnet, 10base-T, etc */
-       u_char  ifi_addrlen;            /* media address length */
-       u_char  ifi_hdrlen;             /* media header length */
-       u_char  ifi_recvquota;          /* polling quota for receive intrs */
-       u_char  ifi_xmitquota;          /* polling quota for xmit intrs */
-       u_long  ifi_mtu;                /* maximum transmission unit */
-       u_long  ifi_metric;             /* routing metric (external only) */
-       u_long  ifi_baudrate;           /* linespeed */
+       u_char          ifi_type;       /* ethernet, tokenring, etc */
+       u_char          ifi_typelen;    /* Length of frame type id */
+       u_char          ifi_physical;   /* e.g., AUI, Thinnet, 10base-T, etc */
+       u_char          ifi_addrlen;    /* media address length */
+       u_char          ifi_hdrlen;     /* media header length */
+       u_char          ifi_recvquota;  /* polling quota for receive intrs */
+       u_char          ifi_xmitquota;  /* polling quota for xmit intrs */
+       u_char          ifi_unused1;    /* for future use */
+       u_int32_t       ifi_mtu;        /* maximum transmission unit */
+       u_int32_t       ifi_metric;     /* routing metric (external only) */
+       u_int32_t       ifi_baudrate;   /* linespeed */
        /* volatile statistics */
-       u_long  ifi_ipackets;           /* packets received on interface */
-       u_long  ifi_ierrors;            /* input errors on interface */
-       u_long  ifi_opackets;           /* packets sent on interface */
-       u_long  ifi_oerrors;            /* output errors on interface */
-       u_long  ifi_collisions;         /* collisions on csma interfaces */
-       u_long  ifi_ibytes;             /* total number of octets received */
-       u_long  ifi_obytes;             /* total number of octets sent */
-       u_long  ifi_imcasts;            /* packets received via multicast */
-       u_long  ifi_omcasts;            /* packets sent via multicast */
-       u_long  ifi_iqdrops;            /* dropped on input, this interface */
-       u_long  ifi_noproto;            /* destined for unsupported protocol */
-#ifdef __APPLE__
-       u_long  ifi_recvtiming;         /* usec spent receiving when timing */
-       u_long  ifi_xmittiming;         /* usec spent xmitting when timing */
-#endif
+       u_int32_t       ifi_ipackets;   /* packets received on interface */
+       u_int32_t       ifi_ierrors;    /* input errors on interface */
+       u_int32_t       ifi_opackets;   /* packets sent on interface */
+       u_int32_t       ifi_oerrors;    /* output errors on interface */
+       u_int32_t       ifi_collisions; /* collisions on csma interfaces */
+       u_int32_t       ifi_ibytes;     /* total number of octets received */
+       u_int32_t       ifi_obytes;     /* total number of octets sent */
+       u_int32_t       ifi_imcasts;    /* packets received via multicast */
+       u_int32_t       ifi_omcasts;    /* packets sent via multicast */
+       u_int32_t       ifi_iqdrops;    /* dropped on input, this interface */
+       u_int32_t       ifi_noproto;    /* destined for unsupported protocol */
+       u_int32_t       ifi_recvtiming; /* usec spent receiving when timing */
+       u_int32_t       ifi_xmittiming; /* usec spent xmitting when timing */
+       struct IF_DATA_TIMEVAL ifi_lastchange;  /* time of last administrative change */
+       u_int32_t       ifi_unused2;    /* used to be the default_proto */
+       u_int32_t       ifi_hwassist;   /* HW offload capabilities */
+       u_int32_t       ifi_reserved1;  /* for future use */
+       u_int32_t       ifi_reserved2;  /* for future use */
+};
+
+/*
+ * Structure describing information about an interface
+ * which may be of interest to management entities.
+ */
+struct if_data64 {
+       /* generic interface information */
+       u_char          ifi_type;               /* ethernet, tokenring, etc */
+       u_char          ifi_typelen;            /* Length of frame type id */
+       u_char          ifi_physical;           /* e.g., AUI, Thinnet, 10base-T, etc */
+       u_char          ifi_addrlen;            /* media address length */
+       u_char          ifi_hdrlen;             /* media header length */
+       u_char          ifi_recvquota;          /* polling quota for receive intrs */
+       u_char          ifi_xmitquota;          /* polling quota for xmit intrs */
+       u_char          ifi_unused1;            /* for future use */
+       u_int32_t       ifi_mtu;                /* maximum transmission unit */
+       u_int32_t       ifi_metric;             /* routing metric (external only) */
+       u_int64_t       ifi_baudrate;           /* linespeed */
+       /* volatile statistics */
+       u_int64_t       ifi_ipackets;           /* packets received on interface */
+       u_int64_t       ifi_ierrors;            /* input errors on interface */
+       u_int64_t       ifi_opackets;           /* packets sent on interface */
+       u_int64_t       ifi_oerrors;            /* output errors on interface */
+       u_int64_t       ifi_collisions;         /* collisions on csma interfaces */
+       u_int64_t       ifi_ibytes;             /* total number of octets received */
+       u_int64_t       ifi_obytes;             /* total number of octets sent */
+       u_int64_t       ifi_imcasts;            /* packets received via multicast */
+       u_int64_t       ifi_omcasts;            /* packets sent via multicast */
+       u_int64_t       ifi_iqdrops;            /* dropped on input, this interface */
+       u_int64_t       ifi_noproto;            /* destined for unsupported protocol */
+       u_int32_t       ifi_recvtiming;         /* usec spent receiving when timing */
+       u_int32_t       ifi_xmittiming;         /* usec spent xmitting when timing */
+       struct IF_DATA_TIMEVAL ifi_lastchange;  /* time of last administrative change */
+};
+
+#pragma pack()
+
+#ifdef PRIVATE
+/*
+ * Internal storage of if_data. This is bound to change. Various places in the
+ * stack will translate this data structure in to the externally visible
+ * if_data structure above.
+ */
+struct if_data_internal {
+       /* generic interface information */
+       u_char          ifi_type;       /* ethernet, tokenring, etc */
+       u_char          ifi_typelen;    /* Length of frame type id */
+       u_char          ifi_physical;   /* e.g., AUI, Thinnet, 10base-T, etc */
+       u_char          ifi_addrlen;    /* media address length */
+       u_char          ifi_hdrlen;     /* media header length */
+       u_char          ifi_recvquota;  /* polling quota for receive intrs */
+       u_char          ifi_xmitquota;  /* polling quota for xmit intrs */
+       u_char          ifi_unused1;    /* for future use */
+       u_int32_t       ifi_mtu;        /* maximum transmission unit */
+       u_int32_t       ifi_metric;     /* routing metric (external only) */
+       u_int32_t       ifi_baudrate;   /* linespeed */
+       /* volatile statistics */
+       u_int64_t       ifi_ipackets;   /* packets received on interface */
+       u_int64_t       ifi_ierrors;    /* input errors on interface */
+       u_int64_t       ifi_opackets;   /* packets sent on interface */
+       u_int64_t       ifi_oerrors;    /* output errors on interface */
+       u_int64_t       ifi_collisions; /* collisions on csma interfaces */
+       u_int64_t       ifi_ibytes;     /* total number of octets received */
+       u_int64_t       ifi_obytes;     /* total number of octets sent */
+       u_int64_t       ifi_imcasts;    /* packets received via multicast */
+       u_int64_t       ifi_omcasts;    /* packets sent via multicast */
+       u_int64_t       ifi_iqdrops;    /* dropped on input, this interface */
+       u_int64_t       ifi_noproto;    /* destined for unsupported protocol */
+       u_int32_t       ifi_recvtiming; /* usec spent receiving when timing */
+       u_int32_t       ifi_xmittiming; /* usec spent xmitting when timing */
+#define IF_LASTCHANGEUPTIME    1       /* lastchange: 1-uptime 0-calendar time */
        struct  timeval ifi_lastchange; /* time of last administrative change */
-#ifdef __APPLE__
-       u_long  default_proto;          /* Default dl_tag when none is specified 
-                                                                * on dlil_output */
-#endif
-       u_long  ifi_hwassist;           /* HW offload capabilities */
-       u_long  ifi_reserved1;          /* for future use */
-       u_long  ifi_reserved2;          /* for future use */
+       u_int32_t       ifi_hwassist;   /* HW offload capabilities */
+       u_int32_t       ifi_tso_v4_mtu; /* TCP Segment Offload IPv4 maximum segment size */
+       u_int32_t       ifi_tso_v6_mtu; /* TCP Segment Offload IPv6 maximum segment size */
 };
-#endif
 
+#define        if_mtu          if_data.ifi_mtu
+#define        if_type         if_data.ifi_type
+#define if_typelen     if_data.ifi_typelen
+#define if_physical    if_data.ifi_physical
+#define        if_addrlen      if_data.ifi_addrlen
+#define        if_hdrlen       if_data.ifi_hdrlen
+#define        if_metric       if_data.ifi_metric
+#define        if_baudrate     if_data.ifi_baudrate
+#define        if_hwassist     if_data.ifi_hwassist
+#define        if_ipackets     if_data.ifi_ipackets
+#define        if_ierrors      if_data.ifi_ierrors
+#define        if_opackets     if_data.ifi_opackets
+#define        if_oerrors      if_data.ifi_oerrors
+#define        if_collisions   if_data.ifi_collisions
+#define        if_ibytes       if_data.ifi_ibytes
+#define        if_obytes       if_data.ifi_obytes
+#define        if_imcasts      if_data.ifi_imcasts
+#define        if_omcasts      if_data.ifi_omcasts
+#define        if_iqdrops      if_data.ifi_iqdrops
+#define        if_noproto      if_data.ifi_noproto
+#define        if_lastchange   if_data.ifi_lastchange
+#define if_recvquota   if_data.ifi_recvquota
+#define        if_xmitquota    if_data.ifi_xmitquota
+#define if_iflags      if_data.ifi_iflags
+#define        if_tso_v4_mtu   if_data.ifi_tso_v4_mtu
+#define        if_tso_v6_mtu   if_data.ifi_tso_v6_mtu
+
+struct mbuf;
+struct ifaddr;
+TAILQ_HEAD(ifnethead, ifnet);  /* we use TAILQs so that the order of */
+TAILQ_HEAD(ifaddrhead, ifaddr);        /* instantiation is preserved in the list */
+TAILQ_HEAD(ifprefixhead, ifprefix);
+LIST_HEAD(ifmultihead, ifmultiaddr);
+struct tqdummy;
+TAILQ_HEAD(tailq_head, tqdummy);
+
+/*
+ * Forward structure declarations for function prototypes [sic].
+ */
+struct proc;
+struct rtentry;
+struct socket;
+struct ether_header;
+struct  sockaddr_dl;
+struct ifnet_filter;
+
+TAILQ_HEAD(ifnet_filter_head, ifnet_filter);
+TAILQ_HEAD(ddesc_head_name, dlil_demux_desc);
+
+/* All of the following IF_HWASSIST_* flags are defined
+ * in kpi_inteface.h as IFNET_* flags. These are redefined
+ * here as constants to avoid failures to build user level
+ * programs that can not include kpi_interface.h. It is 
+ * important to keep this in sync with the definitions in
+ * kpi_interface.h. The corresponding constant for each 
+ * definition is mentioned in the comment.
+ *
+ * Bottom 16 bits reserved for hardware checksum 
+ */
+#define IF_HWASSIST_CSUM_IP            0x0001  /* will csum IP, IFNET_CSUM_IP */
+#define IF_HWASSIST_CSUM_TCP           0x0002  /* will csum TCP, IFNET_CSUM_TCP */
+#define IF_HWASSIST_CSUM_UDP           0x0004  /* will csum UDP, IFNET_CSUM_UDP */
+#define IF_HWASSIST_CSUM_IP_FRAGS      0x0008  /* will csum IP fragments, IFNET_CSUM_FRAGMENT */
+#define IF_HWASSIST_CSUM_FRAGMENT      0x0010  /* will do IP fragmentation, IFNET_IP_FRAGMENT */
+#define IF_HWASSIST_CSUM_TCP_SUM16     0x1000  /* simple TCP Sum16 computation, IFNET_CSUM_SUM16 */
+#define IF_HWASSIST_CSUM_MASK          0xffff
+#define IF_HWASSIST_CSUM_FLAGS(hwassist)       ((hwassist) & IF_HWASSIST_CSUM_MASK)
+
+/* VLAN support */
+#define IF_HWASSIST_VLAN_TAGGING       0x00010000      /* supports VLAN tagging, IFNET_VLAN_TAGGING */
+#define IF_HWASSIST_VLAN_MTU           0x00020000      /* supports VLAN MTU-sized packet (for software VLAN), IFNET_VLAN_MTU */
+
+/* TCP Segment Offloading support */
+
+#define IF_HWASSIST_TSO_V4             0x00200000      /* will do TCP Segment offload for IPv4, IFNET_TSO_IPV4 */
+#define IF_HWASSIST_TSO_V6             0x00400000      /* will do TCP Segment offload for IPv6, IFNET_TSO_IPV6 */
+
+#define IFNET_RW_LOCK 1
+
+#endif /* PRIVATE */
 /*
  * Structure defining a queue for a network interface.
  */
 struct ifqueue {
-       struct  mbuf *ifq_head;
-       struct  mbuf *ifq_tail;
+       void *ifq_head;
+       void *ifq_tail;
        int     ifq_len;
        int     ifq_maxlen;
        int     ifq_drops;
 };
 
+#ifdef PRIVATE
+
+struct ddesc_head_str;
+struct proto_hash_entry;
+struct kev_msg;
+struct dlil_threading_info;
+#if PF
+struct pfi_kif;
+#endif /* PF */
+
 /*
  * Structure defining a network interface.
  *
@@ -205,13 +373,16 @@ struct    ifqueue {
  */
 struct ifnet {
        void    *if_softc;              /* pointer to driver state */
-       char    *if_name;               /* name, e.g. ``en'' or ``lo'' */
+       const char      *if_name;               /* name, e.g. ``en'' or ``lo'' */
        TAILQ_ENTRY(ifnet) if_link;     /* all struct ifnets are chained */
        struct  ifaddrhead if_addrhead; /* linked list of addresses per if */
-#ifdef __APPLE__
-       struct  tailq_head proto_head;  /* Head for if_proto structures */  
-#endif
-        int    if_pcount;              /* number of promiscuous listeners */
+       u_int32_t       if_refcnt;
+#ifdef __KPI_INTERFACE__
+       ifnet_check_multi       if_check_multi;
+#else
+       void*                           if_check_multi;
+#endif /* __KPI_INTERFACE__ */
+       int     if_pcount;              /* number of promiscuous listeners */
        struct  bpf_if *if_bpf;         /* packet filter structure */
        u_short if_index;               /* numeric abbreviation for this if  */
        short   if_unit;                /* sub-unit for lower level driver */
@@ -220,108 +391,132 @@ struct ifnet {
        int     if_ipending;            /* interrupts pending */
        void    *if_linkmib;            /* link-type-specific MIB data */
        size_t  if_linkmiblen;          /* length of above data */
-       struct  if_data if_data;
+       struct  if_data_internal if_data;
 
-#ifdef __APPLE__
 /* New with DLIL */
+#ifdef BSD_KERNEL_PRIVATE
+       int     if_usecnt;
+#else
        int     refcnt;
-       int     offercnt;
-       int     (*if_output)(struct ifnet *ifnet_ptr, struct mbuf *m);
-       int     (*if_ioctl)(struct ifnet *ifnet_ptr, u_long  ioctl_code, void  *ioctl_arg);
-       int     (*if_set_bpf_tap)(struct ifnet *ifp, int mode, 
-                                 int (*bpf_callback)(struct ifnet *, struct mbuf *));
-       int     (*if_free)(struct ifnet *ifnet_ptr);
-       int     (*if_demux)(struct ifnet  *ifnet_ptr, struct mbuf  *mbuf_ptr, 
-                           char *frame_ptr, void  *if_proto_ptr);
-
-       int     (*if_event)(struct ifnet  *ifnet_ptr, caddr_t  event_ptr);
-
-       int     (*if_framer)(struct ifnet    *ifp,
-                            struct mbuf     **m,
-                            struct sockaddr *dest,
-                            char            *dest_linkaddr,
-                            char            *frame_type);
-
-       u_long  if_family;              /* ulong assigned by Apple */
-       struct tailq_head   if_flt_head;
+#endif
+#ifdef __KPI_INTERFACE__
+       ifnet_output_func       if_output;
+       ifnet_ioctl_func        if_ioctl;
+       ifnet_set_bpf_tap       if_set_bpf_tap;
+       ifnet_detached_func     if_free;
+       ifnet_demux_func        if_demux;
+       ifnet_event_func        if_event;
+       ifnet_framer_func       if_framer;
+       ifnet_family_t          if_family;              /* value assigned by Apple */
+#else
+       void*                           if_output;
+       void*                           if_ioctl;
+       void*                           if_set_bpf_tap;
+       void*                           if_free;
+       void*                           if_demux;
+       void*                           if_event;
+       void*                           if_framer;
+       u_int32_t                       if_family;              /* value assigned by Apple */
+#endif
+
+       struct ifnet_filter_head if_flt_head;
 
 /* End DLIL specific */
 
-       void    *reserved0;     /* for future use */
+       u_int32_t       if_delayed_detach; /* need to perform delayed detach */
        void    *if_private;    /* private to interface */
        long    if_eflags;              /* autoaddr, autoaddr done, etc. */
-#endif /* __APPLE__ */
 
        struct  ifmultihead if_multiaddrs; /* multicast addresses configured */
        int     if_amcount;             /* number of all-multicast requests */
 /* procedure handles */
-#ifndef __APPLE__
-       int     (*if_output)            /* output routine (enqueue) */
-               __P((struct ifnet *, struct mbuf *, struct sockaddr *,
-                    struct rtentry *));
-       void    (*if_start)             /* initiate output routine */
-               __P((struct ifnet *));
-       int     (*if_done)              /* output complete routine */
-               __P((struct ifnet *));  /* (XXX not used; fake prototype) */
-       int     (*if_ioctl)             /* ioctl routine */
-               __P((struct ifnet *, u_long, caddr_t));
-       void    (*if_watchdog)          /* timer routine */
-               __P((struct ifnet *));
+#ifdef __KPI_INTERFACE__
+       ifnet_add_proto_func    if_add_proto;
+       ifnet_del_proto_func    if_del_proto;
+#else /* !__KPI_INTERFACE__ */
+       void*   if_add_proto;
+       void*   if_del_proto;
+#endif /* !__KPI_INTERFACE__ */
+       struct proto_hash_entry *if_proto_hash;
+       void                                    *if_kpi_storage;
+#if 0  
+       void    *unused_was_init;
+#else
+       struct dlil_threading_info *if_input_thread;
 #endif
-       int     (*if_poll_recv)         /* polled receive routine */
-               __P((struct ifnet *, int *));
-       int     (*if_poll_xmit)         /* polled transmit routine */
-               __P((struct ifnet *, int *));
-       void    (*if_poll_intren)       /* polled interrupt reenable routine */
-               __P((struct ifnet *));
-       void    (*if_poll_slowinput)    /* input routine for slow devices */
-               __P((struct ifnet *, struct mbuf *));
-       void    (*if_init)              /* Init routine */
-               __P((void *));
-       int     (*if_resolvemulti)      /* validate/resolve multicast */
-               __P((struct ifnet *, struct sockaddr **, struct sockaddr *));
-       struct  ifqueue if_snd;         /* output queue */
-       struct  ifqueue *if_poll_slowq; /* input queue for slow devices */
+       void    *unused_was_resolvemulti;
+       
+       struct ifqueue  if_snd;
+       u_int32_t       unused_2[1];
 #ifdef __APPLE__
-       u_long  family_cookie;  
+       uintptr_t       family_cookie;
        struct  ifprefixhead if_prefixhead; /* list of prefixes per if */
-       void *reserved1;        /* for future use */
+
+#ifdef _KERN_LOCKS_H_
+#if IFNET_RW_LOCK
+       lck_rw_t *if_lock;              /* Lock to protect this interface */
+#else
+       lck_mtx_t *if_lock;             /* Lock to protect this interface */
+#endif
+#else
+       void    *if_lock;
+#endif
+
 #else
        struct  ifprefixhead if_prefixhead; /* list of prefixes per if */
 #endif /* __APPLE__ */
-};
-typedef void if_init_f_t __P((void *));
+       struct {
+               u_int32_t       length;
+               union {
+                       u_char  buffer[8];
+                       u_char  *ptr;
+               } u;
+       } if_broadcast;
+#if CONFIG_MACF_NET
+       struct  label *if_label;        /* interface MAC label */
+#endif
 
-#define        if_mtu          if_data.ifi_mtu
-#define        if_type         if_data.ifi_type
-#define if_typelen     if_data.ifi_typelen
-#define if_physical    if_data.ifi_physical
-#define        if_addrlen      if_data.ifi_addrlen
-#define        if_hdrlen       if_data.ifi_hdrlen
-#define        if_metric       if_data.ifi_metric
-#define        if_baudrate     if_data.ifi_baudrate
-#define        if_hwassist     if_data.ifi_hwassist
-#define        if_ipackets     if_data.ifi_ipackets
-#define        if_ierrors      if_data.ifi_ierrors
-#define        if_opackets     if_data.ifi_opackets
-#define        if_oerrors      if_data.ifi_oerrors
-#define        if_collisions   if_data.ifi_collisions
-#define        if_ibytes       if_data.ifi_ibytes
-#define        if_obytes       if_data.ifi_obytes
-#define        if_imcasts      if_data.ifi_imcasts
-#define        if_omcasts      if_data.ifi_omcasts
-#define        if_iqdrops      if_data.ifi_iqdrops
-#define        if_noproto      if_data.ifi_noproto
-#define        if_lastchange   if_data.ifi_lastchange
-#define if_recvquota   if_data.ifi_recvquota
-#define        if_xmitquota    if_data.ifi_xmitquota
-#define if_rawoutput(if, m, sa) if_output(if, m, sa, (struct rtentry *)0)
+       u_int32_t       if_wake_properties;
+#if PF
+       struct thread   *if_pf_curthread;
+       struct pfi_kif  *if_pf_kif;
+#endif /* PF */
+#ifdef _KERN_LOCKS_H_
+       lck_mtx_t       *if_fwd_route_lock;
+#else
+       void            *if_fwd_route_lock;
+#endif
+       struct route    if_fwd_route;   /* cached IPv4 forwarding route */
+};
 
 #ifndef __APPLE__
 /* for compatibility with other BSDs */
 #define        if_addrlist     if_addrhead
 #define        if_list         if_link
-#endif
+#endif /* !__APPLE__ */
+
+
+#endif /* PRIVATE */
+
+#ifdef KERNEL_PRIVATE
+/*
+ * Structure describing a `cloning' interface.
+ */
+struct if_clone {
+       LIST_ENTRY(if_clone) ifc_list;  /* on list of cloners */
+       const char *ifc_name;                   /* name of device, e.g. `vlan' */
+       size_t ifc_namelen;             /* length of name */
+       int ifc_minifs;                 /* minimum number of interfaces */
+       int ifc_maxunit;                /* maximum unit number */
+       unsigned char *ifc_units;       /* bitmap to handle units */
+       int ifc_bmlen;                  /* bitmap length */
+
+       int     (*ifc_create)(struct if_clone *, int);
+       void    (*ifc_destroy)(struct ifnet *);
+};
+
+#define IF_CLONE_INITIALIZER(name, create, destroy, minifs, maxunit)   \
+    { { NULL, NULL }, name, sizeof(name) - 1, minifs, maxunit, NULL, 0, create, destroy }
 
 /*
  * Bit values in if_ipending
@@ -342,7 +537,7 @@ typedef void if_init_f_t __P((void *));
        if ((ifq)->ifq_tail == 0) \
                (ifq)->ifq_head = m; \
        else \
-               (ifq)->ifq_tail->m_nextpkt = m; \
+               ((struct mbuf*)(ifq)->ifq_tail)->m_nextpkt = m; \
        (ifq)->ifq_tail = m; \
        (ifq)->ifq_len++; \
 }
@@ -363,12 +558,11 @@ typedef void if_init_f_t __P((void *));
        } \
 }
 
-#ifdef KERNEL
 #define        IF_ENQ_DROP(ifq, m)     if_enq_drop(ifq, m)
 
 #if defined(__GNUC__) && defined(MT_HEADER)
 static __inline int
-if_queue_drop(struct ifqueue *ifq, struct mbuf *m)
+if_queue_drop(struct ifqueue *ifq, __unused struct mbuf *m)
 {
        IF_DROP(ifq);
        return 0;
@@ -386,22 +580,15 @@ if_enq_drop(struct ifqueue *ifq, struct mbuf *m)
 #else
 
 #ifdef MT_HEADER
-int    if_enq_drop __P((struct ifqueue *, struct mbuf *));
-#endif
+int    if_enq_drop(struct ifqueue *, struct mbuf *);
+#endif /* MT_HEADER */
 
-#endif
-#endif /* __APPLE_API_UNSTABLE */
+#endif /* defined(__GNUC__) && defined(MT_HEADER) */
 
-/*
- * 72 was chosen below because it is the size of a TCP/IP
- * header (40) + the minimum mss (32).
- */
-#define        IF_MINMTU       72
-#define        IF_MAXMTU       65535
+#endif /* KERNEL_PRIVATE */
 
-#endif /* KERNEL */
 
-#ifdef __APPLE_API_UNSTABLE
+#ifdef PRIVATE
 /*
  * The ifaddr structure contains information about one address
  * of an interface.  They are maintained by the different address families,
@@ -413,26 +600,35 @@ struct ifaddr {
        struct  sockaddr *ifa_dstaddr;  /* other end of p-to-p link */
 #define        ifa_broadaddr   ifa_dstaddr     /* broadcast address interface */
        struct  sockaddr *ifa_netmask;  /* used to determine subnet */
-#ifndef __APPLE__
-       /* Use of if_data doesn't justify change of API */
-       struct  if_data if_data;        /* not all members are meaningful */
-#endif
        struct  ifnet *ifa_ifp;         /* back-pointer to interface */
        TAILQ_ENTRY(ifaddr) ifa_link;   /* queue macro glue */
-       void    (*ifa_rtrequest)        /* check or clean routes (+ or -)'d */
-               __P((int, struct rtentry *, struct sockaddr *));
-       u_short ifa_flags;              /* mostly rt_flags for cloning */
-       short   ifa_refcnt;/* 16bit ref count, use ifaref, ifafree */
-       int     ifa_metric;             /* cost of going out this interface */
-#ifdef notdef
-       struct  rtentry *ifa_rt;        /* XXXX for ROUTETOIF ????? */
-#endif
-       u_long  ifa_dlt;
-       int (*ifa_claim_addr)           /* check if an addr goes to this if */
-               __P((struct ifaddr *, struct sockaddr *));
+       void (*ifa_rtrequest)           /* check or clean routes (+ or -)'d */
+           (int, struct rtentry *, struct sockaddr *);
+       uint32_t ifa_flags;             /* mostly rt_flags for cloning */
+       int32_t ifa_refcnt;             /* ref count, use ifaref, ifafree */
+       int32_t ifa_metric;             /* cost of going out this interface */
+       void (*ifa_free)(struct ifaddr *); /* callback fn for freeing */
+       void (*ifa_trace)               /* callback fn for tracing refs */
+           (struct ifaddr *, int);
+       uint32_t ifa_debug;             /* debug flags */
 };
-#define        IFA_ROUTE       RTF_UP          /* route installed */
 
+/*
+ * Valid values for ifa_flags
+ */
+#define        IFA_ROUTE       RTF_UP          /* route installed (0x1) */
+#define        IFA_CLONING     RTF_CLONING     /* (0x100) */
+
+/*
+ * Valid values for ifa_debug
+ */
+#define        IFD_ATTACHED    0x1             /* attached to an interface */
+#define        IFD_ALLOC       0x2             /* dynamically allocated */
+#define        IFD_DEBUG       0x4             /* has debugging info */
+
+#endif /* PRIVATE */
+
+#ifdef KERNEL_PRIVATE
 /*
  * The prefix structure contains information about one prefix
  * of an interface.  They are maintained by the different address families,
@@ -446,6 +642,10 @@ struct ifprefix {
        u_char  ifpr_plen;              /* prefix length in bits */
        u_char  ifpr_type;              /* protocol dependent prefix type */
 };
+#endif /* KERNEL_PRIVATE */
+
+#ifdef PRIVATE
+typedef void (*ifma_protospec_free_func)(void* ifma_protospec);
 
 /*
  * Multicast address structure.  This is analogous to the ifaddr
@@ -456,76 +656,99 @@ struct ifprefix {
 struct ifmultiaddr {
        LIST_ENTRY(ifmultiaddr) ifma_link; /* queue macro glue */
        struct  sockaddr *ifma_addr;    /* address this membership is for */
-       struct  sockaddr *ifma_lladdr;  /* link-layer translation, if any */
-       struct  ifnet *ifma_ifp;        /* back-pointer to interface */
-       u_int   ifma_refcount;          /* reference count */
-       void    *ifma_protospec;        /* protocol-specific state, if any */
+       struct ifmultiaddr *ifma_ll;    /* link-layer translation, if any */
+       struct  ifnet *ifma_ifp;                /* back-pointer to interface */
+       u_int   ifma_usecount;                  /* use count, protected by ifp's lock */
+       void    *ifma_protospec;                /* protocol-specific state, if any */
+       int32_t ifma_refcount;                  /* reference count, atomically protected */
+       ifma_protospec_free_func ifma_free;     /* function called to free ifma_protospec */
 };
+#endif /* PRIVATE */
 
-#ifdef KERNEL
+#ifdef KERNEL_PRIVATE
 #define IFAREF(ifa) ifaref(ifa)
 #define IFAFREE(ifa) ifafree(ifa)
 
-#ifdef __APPLE_API_PRIVATE
-extern struct ifnethead ifnet;
+/*
+ * To preserve kmem compatibility, we define
+ * ifnet_head to ifnet. This should be temp.
+ */
+#define ifnet_head ifnet
+extern struct ifnethead ifnet_head;
 extern struct  ifnet   **ifindex2ifnet;
 extern int ifqmaxlen;
-extern struct ifnet loif[];
+extern ifnet_t  lo_ifp;
 extern int if_index;
 extern struct ifaddr **ifnet_addrs;
-#endif /* __APPLE_API_PRIVATE */
-
-#ifndef __APPLE__
-void   ether_ifattach __P((struct ifnet *, int));
-void   ether_ifdetach __P((struct ifnet *, int));
-void   ether_input __P((struct ifnet *, struct ether_header *, struct mbuf *));
-void   ether_demux __P((struct ifnet *, struct ether_header *, struct mbuf *));
-int    ether_output __P((struct ifnet *,
-          struct mbuf *, struct sockaddr *, struct rtentry *));
-int    ether_output_frame __P((struct ifnet *, struct mbuf *));
-int    ether_ioctl __P((struct ifnet *, int, caddr_t));
-#endif
-
-int    if_addmulti __P((struct ifnet *, struct sockaddr *,
-                        struct ifmultiaddr **));
-int    if_allmulti __P((struct ifnet *, int));
-void   if_attach __P((struct ifnet *));
-int    if_delmulti __P((struct ifnet *, struct sockaddr *));
-void   if_down __P((struct ifnet *));
-void   if_route __P((struct ifnet *, int flag, int fam));
-void   if_unroute __P((struct ifnet *, int flag, int fam));
-void   if_up __P((struct ifnet *));
-/*void ifinit __P((void));*/ /* declared in systm.h for main() */
-int    ifioctl __P((struct socket *, u_long, caddr_t, struct proc *));
-int    ifpromisc __P((struct ifnet *, int));
-struct ifnet *ifunit __P((const char *));
-struct  ifnet *if_withname __P((struct sockaddr *));
-
-int    if_poll_recv_slow __P((struct ifnet *ifp, int *quotap));
-void   if_poll_xmit_slow __P((struct ifnet *ifp, int *quotap));
-void   if_poll_throttle __P((void));
-void   if_poll_unthrottle __P((void *));
-void   if_poll_init __P((void));
-void   if_poll __P((void));
-
-struct ifaddr *ifa_ifwithaddr __P((struct sockaddr *));
-struct ifaddr *ifa_ifwithdstaddr __P((struct sockaddr *));
-struct ifaddr *ifa_ifwithnet __P((struct sockaddr *));
-struct ifaddr *ifa_ifwithroute __P((int, struct sockaddr *,
-                                       struct sockaddr *));
-struct ifaddr *ifaof_ifpforaddr __P((struct sockaddr *, struct ifnet *));
-void   ifafree __P((struct ifaddr *));
-void   ifaref __P((struct ifaddr *));
-
-struct ifmultiaddr *ifmaof_ifpforaddr __P((struct sockaddr *, 
-                                           struct ifnet *));
-#ifndef __APPLE__
-int    if_simloop __P((struct ifnet *ifp, struct mbuf *m,
-               struct sockaddr *dst, int hlen));
-#endif
 
-#endif /* KERNEL */
+int    if_addmulti(struct ifnet *, const struct sockaddr *, struct ifmultiaddr **);
+int    if_allmulti(struct ifnet *, int);
+void   if_attach(struct ifnet *);
+int    if_delmultiaddr(struct ifmultiaddr *ifma, int locked);
+int    if_delmulti(struct ifnet *, const struct sockaddr *);
+void   if_down(struct ifnet *);
+int    if_down_all(void);
+void   if_route(struct ifnet *, int flag, int fam);
+void   if_unroute(struct ifnet *, int flag, int fam);
+void   if_up(struct ifnet *);
+void   if_updown(struct ifnet *ifp, int up);
+/*void ifinit(void));*/ /* declared in systm.h for main( */
+int    ifioctl(struct socket *, u_long, caddr_t, struct proc *);
+int    ifioctllocked(struct socket *, u_long, caddr_t, struct proc *);
+struct ifnet *ifunit(const char *);
+struct  ifnet *if_withname(struct sockaddr *);
+
+int    if_clone_attach(struct if_clone *);
+void   if_clone_detach(struct if_clone *);
+
+void   ifnet_lock_assert(struct ifnet *ifp, int what);
+void   ifnet_lock_shared(struct ifnet *ifp);
+void   ifnet_lock_exclusive(struct ifnet *ifp);
+void   ifnet_lock_done(struct ifnet *ifp);
+
+void   ifnet_head_lock_shared(void);
+void   ifnet_head_lock_exclusive(void);
+void   ifnet_head_done(void);
+
+void   if_attach_ifa(struct ifnet * ifp, struct ifaddr *ifa);
+void   if_detach_ifa(struct ifnet * ifp, struct ifaddr *ifa);
+
+void   ifma_reference(struct ifmultiaddr *ifma);
+void   ifma_release(struct ifmultiaddr *ifma);
+
+struct ifaddr *ifa_ifwithaddr(const struct sockaddr *);
+struct ifaddr *ifa_ifwithaddr_scoped(const struct sockaddr *, unsigned int);
+struct ifaddr *ifa_ifwithdstaddr(const struct sockaddr *);
+struct ifaddr *ifa_ifwithnet(const struct sockaddr *);
+struct ifaddr *ifa_ifwithnet_scoped(const struct sockaddr *, unsigned int);
+struct ifaddr *ifa_ifwithroute(int, const struct sockaddr *, const struct sockaddr *);
+struct ifaddr *ifa_ifwithroute_locked(int, const struct sockaddr *, const struct sockaddr *);
+struct ifaddr *ifa_ifwithroute_scoped_locked(int, const struct sockaddr *,
+    const struct sockaddr *, unsigned int);
+struct ifaddr *ifaof_ifpforaddr(const struct sockaddr *, struct ifnet *);
+struct ifaddr *ifa_ifpgetprimary(struct ifnet *, int);
+void   ifafree(struct ifaddr *);
+void   ifaref(struct ifaddr *);
+
+struct ifmultiaddr *ifmaof_ifpforaddr(const struct sockaddr *, struct ifnet *);
+
+extern struct in_ifaddr *ifa_foraddr(unsigned int);
+extern struct in_ifaddr *ifa_foraddr_scoped(unsigned int, unsigned int);
+
+#ifdef BSD_KERNEL_PRIVATE
+enum {
+       kIfNetUseCount_MayBeZero = 0,
+       kIfNetUseCount_MustNotBeZero = 1
+};
 
+int ifp_use(struct ifnet *ifp, int handle_zero);
+int ifp_unuse(struct ifnet *ifp);
+void ifp_use_reached_zero(struct ifnet *ifp);
 
-#endif /* __APPLE_API_UNSTABLE */
+void   if_data_internal_to_if_data(struct ifnet *ifp, const struct if_data_internal *if_data_int,
+                          struct if_data *if_data);
+void   if_data_internal_to_if_data64(struct ifnet *ifp, const struct if_data_internal *if_data_int,
+                                                          struct if_data64 *if_data64);
+#endif /* BSD_KERNEL_PRIVATE */
+#endif /* KERNEL_PRIVATE */
 #endif /* !_NET_IF_VAR_H_ */