]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/net/if_var.h
xnu-792.13.8.tar.gz
[apple/xnu.git] / bsd / net / if_var.h
index 1f813e917aec8299c2bafb61a05bb4dc3d46ba34..16e7cfa31b855b0a79caab32f5ceacf8ed1bfe3d 100644 (file)
@@ -1,23 +1,31 @@
 /*
  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_LICENSE_OSREFERENCE_HEADER_START@
  * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
- * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
- * 
- * @APPLE_LICENSE_HEADER_END@
+ * 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.  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 
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
+ * Please see the License for the specific language governing rights and 
+ * limitations under the License.
+ *
+ * @APPLE_LICENSE_OSREFERENCE_HEADER_END@
  */
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
 
 #ifndef        _NET_IF_VAR_H_
 #define        _NET_IF_VAR_H_
+
 #include <sys/appleapiopts.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 KERNEL
+#include <net/kpi_interface.h>
+#endif KERNEL
 
 #ifdef __APPLE__
 #define APPLE_IF_FAM_LOOPBACK  1
 #define APPLE_IF_FAM_FAITH     11
 #define APPLE_IF_FAM_STF       12
 #define APPLE_IF_FAM_FIREWIRE  13
-#endif
+#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;
+     unsigned long     if_family;
+     unsigned long     if_unit;
      char              if_name[IFNAMSIZ];
 };
-#endif
-
-
-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);
 
+/*
+ * Structure describing information about an interface
+ * which may be of interest to management entities.
+ */
+struct if_data {
+       /* generic interface information */
+       unsigned char   ifi_type;       /* ethernet, tokenring, etc */
 #ifdef __APPLE__
-#ifdef KERNEL_PRIVATE
-/* bottom 16 bits reserved for hardware checksum */
-#define IF_HWASSIST_CSUM_IP            0x0001  /* will csum IP */
-#define IF_HWASSIST_CSUM_TCP           0x0002  /* will csum TCP */
-#define IF_HWASSIST_CSUM_UDP           0x0004  /* will csum UDP */
-#define IF_HWASSIST_CSUM_IP_FRAGS      0x0008  /* will csum IP fragments */
-#define IF_HWASSIST_CSUM_FRAGMENT      0x0010  /* will do IP fragmentation */
-#define IF_HWASSIST_CSUM_TCP_SUM16     0x1000  /* simple TCP Sum16 computation */
-#define IF_HWASSIST_CSUM_MASK          0xffff
-#define IF_HWASSIST_CSUM_FLAGS(hwassist)       ((hwassist) & IF_HWASSIST_CSUM_MASK)
+       unsigned char   ifi_typelen;    /* Length of frame type id */
+#endif
+       unsigned char   ifi_physical;   /* e.g., AUI, Thinnet, 10base-T, etc */
+       unsigned char   ifi_addrlen;    /* media address length */
+       unsigned char   ifi_hdrlen;     /* media header length */
+       unsigned char   ifi_recvquota;  /* polling quota for receive intrs */
+       unsigned char   ifi_xmitquota;  /* polling quota for xmit intrs */
+       unsigned char   ifi_unused1;    /* for future use */
+       unsigned long   ifi_mtu;        /* maximum transmission unit */
+       unsigned long   ifi_metric;     /* routing metric (external only) */
+       unsigned long   ifi_baudrate;   /* linespeed */
+       /* volatile statistics */
+       unsigned long   ifi_ipackets;   /* packets received on interface */
+       unsigned long   ifi_ierrors;    /* input errors on interface */
+       unsigned long   ifi_opackets;   /* packets sent on interface */
+       unsigned long   ifi_oerrors;    /* output errors on interface */
+       unsigned long   ifi_collisions; /* collisions on csma interfaces */
+       unsigned long   ifi_ibytes;     /* total number of octets received */
+       unsigned long   ifi_obytes;     /* total number of octets sent */
+       unsigned long   ifi_imcasts;    /* packets received via multicast */
+       unsigned long   ifi_omcasts;    /* packets sent via multicast */
+       unsigned long   ifi_iqdrops;    /* dropped on input, this interface */
+       unsigned long   ifi_noproto;    /* destined for unsupported protocol */
+       unsigned long   ifi_recvtiming; /* usec spent receiving when timing */
+       unsigned long   ifi_xmittiming; /* usec spent xmitting when timing */
+       struct  timeval ifi_lastchange; /* time of last administrative change */
+       unsigned long   ifi_unused2;    /* used to be the default_proto */
+       unsigned long   ifi_hwassist;   /* HW offload capabilities */
+       unsigned long   ifi_reserved1;  /* for future use */
+       unsigned long   ifi_reserved2;  /* for future use */
+};
 
-/* VLAN support */
-#define IF_HWASSIST_VLAN_TAGGING       0x10000 /* supports VLAN tagging */
-#define IF_HWASSIST_VLAN_MTU           0x20000 /* supports VLAN MTU-sized packet (for software VLAN) */
-#endif KERNEL_PRIVATE
 /*
  * Structure describing information about an interface
  * which may be of interest to management entities.
  */
-struct if_data {
+struct if_data64 {
        /* 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_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_long          ifi_mtu;                /* maximum transmission unit */
+       u_long          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_long          ifi_recvtiming;         /* usec spent receiving when timing */
+       u_long          ifi_xmittiming;         /* usec spent xmitting when timing */
+       struct  timeval ifi_lastchange; /* time of last administrative change */
+};
+
+#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_recvquota;  /* polling quota for receive intrs */
+       u_char  ifi_xmitquota;  /* polling quota for xmit intrs */
+    u_char     ifi_unused1;    /* for future use */
        u_long  ifi_mtu;                /* maximum transmission unit */
        u_long  ifi_metric;             /* routing metric (external only) */
-       u_long  ifi_baudrate;           /* linespeed */
+       u_long  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_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_long  ifi_recvtiming;         /* usec spent receiving when timing */
        u_long  ifi_xmittiming;         /* usec spent xmitting when timing */
-#endif
+#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 */
-#ifdef KERNEL_PRIVATE
-       u_short ifi_nvlans;             /* number of attached vlans */
-       u_short ifi_reserved_1;         /* for future use */
-#else KERNEL_PRIVATE
-       u_long  ifi_reserved1;          /* for future use */
-#endif KERNEL_PRIVATE
-       u_long  ifi_reserved2;          /* for future use */
 };
-#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
+
+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);
+
+/* bottom 16 bits reserved for hardware checksum */
+#define IF_HWASSIST_CSUM_IP            0x0001  /* will csum IP */
+#define IF_HWASSIST_CSUM_TCP           0x0002  /* will csum TCP */
+#define IF_HWASSIST_CSUM_UDP           0x0004  /* will csum UDP */
+#define IF_HWASSIST_CSUM_IP_FRAGS      0x0008  /* will csum IP fragments */
+#define IF_HWASSIST_CSUM_FRAGMENT      0x0010  /* will do IP fragmentation */
+#define IF_HWASSIST_CSUM_TCP_SUM16     0x1000  /* simple TCP Sum16 computation */
+#define IF_HWASSIST_CSUM_MASK          0xffff
+#define IF_HWASSIST_CSUM_FLAGS(hwassist)       ((hwassist) & IF_HWASSIST_CSUM_MASK)
+
+/* VLAN support */
+#define IF_HWASSIST_VLAN_TAGGING       0x10000 /* supports VLAN tagging */
+#define IF_HWASSIST_VLAN_MTU           0x20000 /* supports VLAN MTU-sized packet (for software VLAN) */
+
+#define IFNET_RW_LOCK 1
 
 /*
  * 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;
 };
 
+struct ddesc_head_str;
+struct proto_hash_entry;
+struct kev_msg;
+
 /*
  * Structure defining a network interface.
  *
@@ -223,13 +338,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_long  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 */
@@ -238,118 +356,109 @@ 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;
+#endif
        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);
+#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;              /* ulong 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_long                          if_family;              /* ulong assigned by Apple */
+#endif
 
-       u_long  if_family;              /* ulong assigned by Apple */
-       struct tailq_head   if_flt_head;
+       struct ifnet_filter_head if_flt_head;
 
 /* End DLIL specific */
 
-       void    *reserved0;     /* for future use */
+       u_long  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 *));
-#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 */
+#ifdef __KPI_INTERFACE__
+       union {
+               int     (*original)(struct ifnet *ifp, u_long protocol_family,
+                       struct ddesc_head_str *demux_desc_head);
+               ifnet_add_proto_func    kpi;
+       } if_add_proto_u;
+       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;
+       
+       void    *unused_was_init;
+       void    *unused_was_resolvemulti;
+       
+       struct ifqueue  if_snd;
+       u_long  unused_2[1];
 #ifdef __APPLE__
-       u_long  family_cookie;  
+       u_long  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__ */
+       struct {
+               u_long  length;
+               union {
+                       u_char  buffer[8];
+                       u_char  *ptr;
+               } u;
+       } if_broadcast;
 };
-typedef void if_init_f_t __P((void *));
 
-#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
-#ifdef KERNEL_PRIVATE
-#define if_nvlans      if_data.ifi_nvlans
-#endif KERNEL_PRIVATE
-#define if_rawoutput(if, m, sa) if_output(if, m, sa, (struct rtentry *)0)
+#define if_add_proto   if_add_proto_u.original
 
 #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' */
+       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 */
@@ -361,8 +470,7 @@ struct if_clone {
 };
 
 #define IF_CLONE_INITIALIZER(name, create, destroy, minifs, maxunit)   \
-    { { 0 }, name, sizeof(name) - 1, minifs, maxunit, NULL, 0, create, destroy }
-#endif
+    { { 0, 0 }, name, sizeof(name) - 1, minifs, maxunit, NULL, 0, create, destroy }
 
 /*
  * Bit values in if_ipending
@@ -383,7 +491,7 @@ struct if_clone {
        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++; \
 }
@@ -404,12 +512,11 @@ struct if_clone {
        } \
 }
 
-#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;
@@ -427,22 +534,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,
@@ -454,26 +554,27 @@ 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 *));
+               (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_refcnt;/* 32bit 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 *));
+               (struct ifaddr *, const struct sockaddr *);
+       u_long  ifa_debug;              /* debug flags */
 };
-#define        IFA_ROUTE       RTF_UP          /* route installed */
+#define        IFA_ROUTE       RTF_UP          /* route installed (0x1) */
+#define        IFA_CLONING     RTF_CLONING     /* (0x100) */
+#define IFA_ATTACHED   0x1             /* ifa_debug: IFA is attached to an interface */
+
+#endif /* PRIVATE */
 
+#ifdef KERNEL_PRIVATE
 /*
  * The prefix structure contains information about one prefix
  * of an interface.  They are maintained by the different address families,
@@ -487,6 +588,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
@@ -497,81 +602,81 @@ 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 int if_index;
 extern struct ifaddr **ifnet_addrs;
-#endif /* __APPLE_API_PRIVATE */
+extern struct ifnet *lo_ifp;
+
+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 *);
+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 *);
 
-#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_delmultiaddr __P((struct ifmultiaddr *ifma));
-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));
-#ifdef KERNEL_PRIVATE
 void   if_clone_attach(struct if_clone *);
 void   if_clone_detach(struct if_clone *);
-#endif KERNEL_PRIVATE
-
-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 */
-
 
-#endif /* __APPLE_API_UNSTABLE */
+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_ifwithdstaddr(const struct sockaddr *);
+struct ifaddr *ifa_ifwithnet(const struct sockaddr *);
+struct ifaddr *ifa_ifwithroute(int, const struct sockaddr *, const struct sockaddr *);
+struct ifaddr *ifaof_ifpforaddr(const struct sockaddr *, struct ifnet *);
+void   ifafree(struct ifaddr *);
+void   ifaref(struct ifaddr *);
+
+struct ifmultiaddr *ifmaof_ifpforaddr(const struct sockaddr *, struct ifnet *);
+
+#ifdef BSD_KERNEL_PRIVATE
+void   if_data_internal_to_if_data(const struct if_data_internal *if_data_int,
+                                                          struct if_data *if_data);
+void   if_data_internal_to_if_data64(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_ */