On Mon, Nov 18, 2013 at 19:07 +0100, Mike Belopuhov wrote:
> This diff splits kernel visible parts away from if.h into a separate
> header if_var.h.  As a compatibility goo for the kernel if.h will
> also include if_var.h under _KERNEL.  The benefit of going this way
> is that we don't need to define _KERNEL in the netstat & friends
> (a tradeoff is that they will have to include if_var.h directly)
> and that if.h doesn't become a mess.  I will post a different diff
> later (v2) that will keep all the parts in one header under ifdefs.
> However the extent of changes will be essentially the same.  Then
> we'll pick whichever we like best.
> 

and since it turns out that this diff is winning the race, we can
improve it a little bit by hiding IF_* macros under _KERNEL.

any objections for this to go in?  any ok's?

i've looked through some of the ports and it's not that bad since
freebsd already has an if_var.h so lots of ports have logic to
pick it up (e.g. net-snmp)

diff --git sys/net/if.h sys/net/if.h
index b7d1b3c..d11ace2 100644
--- sys/net/if.h
+++ sys/net/if.h
@@ -1,10 +1,9 @@
 /*     $OpenBSD: if.h,v 1.152 2013/11/09 06:38:42 dlg Exp $    */
 /*     $NetBSD: if.h,v 1.23 1996/05/07 02:40:27 thorpej Exp $  */
 
 /*
- * Copyright (c) 2012-2013 Henning Brauer <[email protected]>
  * Copyright (c) 1982, 1986, 1989, 1993
  *     The Regents of the University of California.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -58,69 +57,10 @@ void        if_freenameindex(struct if_nameindex *);
 __END_DECLS
 #endif
 
 #if __BSD_VISIBLE
 
-#include <sys/queue.h>
-#include <sys/tree.h>
-#include <altq/if_altq.h>
-#ifdef _KERNEL
-#include <net/hfsc.h>
-#endif
-
-/*
- * Structures defining a network interface, providing a packet
- * transport mechanism (ala level 0 of the PUP protocols).
- *
- * Each interface accepts output datagrams of a specified maximum
- * length, and provides higher level routines with input datagrams
- * received from its medium.
- *
- * Output occurs when the routine if_output is called, with four parameters:
- *     (*ifp->if_output)(ifp, m, dst, rt)
- * Here m is the mbuf chain to be sent and dst is the destination address.
- * The output routine encapsulates the supplied datagram if necessary,
- * and then transmits it on its medium.
- *
- * On input, each interface unwraps the data received by it, and either
- * places it on the input queue of an internetwork datagram routine
- * and posts the associated software interrupt, or passes the datagram to a raw
- * packet input routine.
- *
- * Routines exist for locating interfaces by their addresses
- * or for locating an interface on a certain network, as well as more general
- * routing and gateway routines maintaining information used to locate
- * interfaces.  These routines live in the files if.c and route.c
- */
-
-#include <sys/time.h>
-
-struct mbuf;
-struct proc;
-struct rtentry;
-struct socket;
-struct ether_header;
-struct arpcom;
-struct rt_addrinfo;
-struct ifnet;
-struct hfsc_if;
-
-/*
- * 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. `gif' */
-       size_t ifc_namelen;             /* length of name */
-
-       int     (*ifc_create)(struct if_clone *, int);
-       int     (*ifc_destroy)(struct ifnet *);
-};
-
-#define        IF_CLONE_INITIALIZER(name, create, destroy)                     
\
-       { { 0 }, name, sizeof(name) - 1, create, destroy }
-
 /*
  * Structure used to query names of interface cloners.
  */
 struct if_clonereq {
        int     ifcr_total;             /* total cloners (out) */
@@ -173,26 +113,10 @@ struct    if_data {
 #define IFQ_NQUEUES    8
 #define IFQ_MAXPRIO    IFQ_NQUEUES - 1
 #define IFQ_DEFPRIO    3
 
 /*
- * Structure defining a queue for a network interface.
- * XXX keep in sync with struct ifaltq.
- */
-struct ifqueue {
-       struct {
-               struct  mbuf *head;
-               struct  mbuf *tail;
-       }                        ifq_q[IFQ_NQUEUES];
-       int                      ifq_len;
-       int                      ifq_maxlen;
-       int                      ifq_drops;
-       struct hfsc_if          *ifq_hfsc;
-       struct timeout          *ifq_congestion;
-};
-
-/*
  * Values for if_link_state.
  */
 #define LINK_STATE_UNKNOWN     0       /* link unknown */
 #define LINK_STATE_INVALID     1       /* link invalid */
 #define LINK_STATE_DOWN                2       /* link is down */
@@ -214,12 +138,11 @@ struct if_status_description {
 };
 
 #define LINK_STATE_DESC_MATCH(_ifs, _t, _s)                            \
        (((_ifs)->ifs_type == (_t) || (_ifs)->ifs_type == 0) &&         \
            (_ifs)->ifs_state == (_s))
-               
-       
+
 
 #define LINK_STATE_DESCRIPTIONS {                                      \
        { IFT_ETHER, LINK_STATE_DOWN, "no carrier" },                   \
                                                                        \
        { IFT_IEEE80211, LINK_STATE_DOWN, "no network" },               \
@@ -240,101 +163,18 @@ struct if_status_description {
        { 0, LINK_STATE_DOWN, "down" },                                 \
        { 0, LINK_STATE_KALIVE_DOWN, "keepalive down" },                \
        { 0, 0, NULL }                                                  \
 }
 
-/*
- * Structure defining a queue for a network interface.
- *
- * (Would like to call this struct ``if'', but C isn't PL/1.)
- */
-TAILQ_HEAD(ifnet_head, ifnet);         /* the actual queue head */
-
 /* Traditional BSD name for length of interface external name. */
 #define        IFNAMSIZ        IF_NAMESIZE
 
 /*
  * Length of interface description, including terminating '\0'.
  */
 #define        IFDESCRSIZE     64
 
-struct ifnet {                         /* and the entries */
-       void    *if_softc;              /* lower-level data for this if */
-       TAILQ_ENTRY(ifnet) if_list;     /* all struct ifnets are chained */
-       TAILQ_ENTRY(ifnet) if_txlist;   /* list of ifnets ready to tx */
-       TAILQ_HEAD(, ifaddr) if_addrlist; /* linked list of addresses per if */
-       TAILQ_HEAD(, ifg_list) if_groups; /* linked list of groups per if */
-       struct hook_desc_head *if_addrhooks; /* address change callbacks */
-       struct hook_desc_head *if_linkstatehooks; /* link change callbacks */
-       struct hook_desc_head *if_detachhooks; /* detach callbacks */
-       char    if_xname[IFNAMSIZ];     /* external name (name + unit) */
-       int     if_pcount;              /* number of promiscuous listeners */
-       caddr_t if_bpf;                 /* packet filter structure */
-       caddr_t if_bridgeport;          /* used by bridge ports */
-       caddr_t if_tp;                  /* used by trunk ports */
-       caddr_t if_pf_kif;              /* pf interface abstraction */
-       union {
-               caddr_t carp_s;         /* carp structure (used by !carp ifs) */
-               struct ifnet *carp_d;   /* ptr to carpdev (used by carp ifs) */
-       } if_carp_ptr;
-#define if_carp                if_carp_ptr.carp_s
-#define if_carpdev     if_carp_ptr.carp_d
-       u_short if_index;               /* numeric abbreviation for this if */
-       short   if_timer;               /* time 'til if_watchdog called */
-       short   if_flags;               /* up/down, broadcast, etc. */
-       int     if_xflags;              /* extra softnet flags */
-       struct  if_data if_data;        /* stats and other data about if */
-       u_int32_t if_hardmtu;           /* maximum MTU device supports */
-       u_int   if_rdomain;             /* routing instance */
-       char    if_description[IFDESCRSIZE]; /* interface description */
-       u_short if_rtlabelid;           /* next route label */
-       u_int8_t if_priority;
-
-       /* procedure handles */
-                                       /* output routine (enqueue) */
-       int     (*if_output)(struct ifnet *, struct mbuf *, struct sockaddr *,
-                    struct rtentry *);
-
-                                       /* link level output function */
-       int     (*if_ll_output)(struct ifnet *, struct mbuf *,
-                   struct sockaddr *, struct rtentry *);
-                                       /* initiate output routine */
-       void    (*if_start)(struct ifnet *);
-                                       /* ioctl routine */
-       int     (*if_ioctl)(struct ifnet *, u_long, caddr_t);
-                                       /* stop routine */
-       int     (*if_stop)(struct ifnet *, int);
-                                       /* timer routine */
-       void    (*if_watchdog)(struct ifnet *);
-       int     (*if_wol)(struct ifnet *, int);
-       struct  ifaddr *if_lladdr;      /* pointer to link-level address */
-       struct  ifaltq if_snd;          /* output queue (includes altq) */
-       struct sockaddr_dl *if_sadl;    /* pointer to our sockaddr_dl */
-
-       void    *if_afdata[AF_MAX];
-};
-#define        if_mtu          if_data.ifi_mtu
-#define        if_type         if_data.ifi_type
-#define        if_addrlen      if_data.ifi_addrlen
-#define        if_hdrlen       if_data.ifi_hdrlen
-#define        if_metric       if_data.ifi_metric
-#define        if_link_state   if_data.ifi_link_state
-#define        if_baudrate     if_data.ifi_baudrate
-#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_capabilities if_data.ifi_capabilities
-
 #define        IFF_UP          0x1             /* interface is up */
 #define        IFF_BROADCAST   0x2             /* broadcast address valid */
 #define        IFF_DEBUG       0x4             /* turn on debugging */
 #define        IFF_LOOPBACK    0x8             /* is a loopback net */
 #define        IFF_POINTOPOINT 0x10            /* interface is point-to-point 
link */
@@ -382,89 +222,10 @@ struct ifnet {                            /* and the 
entries */
 #define        IFCAP_WOL               0x00008000      /* can do wake on lan */
 
 #define IFCAP_CSUM_MASK                (IFCAP_CSUM_IPv4 | IFCAP_CSUM_TCPv4 | \
     IFCAP_CSUM_UDPv4 | IFCAP_CSUM_TCPv6 | IFCAP_CSUM_UDPv6)
 
-/*
- * Output queues (ifp->if_snd) and internetwork datagram level (pup level 1)
- * input routines have queues of messages stored on ifqueue structures
- * (defined above).  Entries are added to and deleted from these structures
- * by these macros, which should be called with ipl raised to splnet().
- */
-#define        IF_QFULL(ifq)           ((ifq)->ifq_len >= (ifq)->ifq_maxlen)
-#define        IF_DROP(ifq)            ((ifq)->ifq_drops++)
-#define        IF_ENQUEUE(ifq, m)                                              
\
-do {                                                                   \
-       (m)->m_nextpkt = NULL;                                          \
-       if ((ifq)->ifq_q[(m)->m_pkthdr.pf.prio].tail == NULL)           \
-               (ifq)->ifq_q[(m)->m_pkthdr.pf.prio].head = m;           \
-       else                                                            \
-               (ifq)->ifq_q[(m)->m_pkthdr.pf.prio].tail->m_nextpkt = m; \
-       (ifq)->ifq_q[(m)->m_pkthdr.pf.prio].tail = m;                   \
-       (ifq)->ifq_len++;                                               \
-} while (/* CONSTCOND */0)
-#define        IF_PREPEND(ifq, m)                                              
\
-do {                                                                   \
-       (m)->m_nextpkt = (ifq)->ifq_q[(m)->m_pkthdr.pf.prio].head;      \
-       if ((ifq)->ifq_q[(m)->m_pkthdr.pf.prio].tail == NULL)           \
-               (ifq)->ifq_q[(m)->m_pkthdr.pf.prio].tail = (m);         \
-       (ifq)->ifq_q[(m)->m_pkthdr.pf.prio].head = (m);                 \
-       (ifq)->ifq_len++;                                               \
-} while (/* CONSTCOND */0)
-
-#define        IF_POLL(ifq, m)                                                 
\
-do {                                                                   \
-       int     if_dequeue_prio = IFQ_MAXPRIO;                          \
-       do {                                                            \
-               (m) = (ifq)->ifq_q[if_dequeue_prio].head;               \
-       } while (!(m) && --if_dequeue_prio >= 0);                       \
-} while (/* CONSTCOND */0)
-
-#define        IF_DEQUEUE(ifq, m)                                              
\
-do {                                                                   \
-       int     if_dequeue_prio = IFQ_MAXPRIO;                          \
-       do {                                                            \
-               (m) = (ifq)->ifq_q[if_dequeue_prio].head;               \
-               if (m) {                                                \
-                       if (((ifq)->ifq_q[if_dequeue_prio].head =       \
-                           (m)->m_nextpkt) == NULL)                    \
-                               (ifq)->ifq_q[if_dequeue_prio].tail = NULL; \
-                       (m)->m_nextpkt = NULL;                          \
-                       (ifq)->ifq_len--;                               \
-               }                                                       \
-       } while (!(m) && --if_dequeue_prio >= 0);                       \
-} while (/* CONSTCOND */0)
-
-#define        IF_INPUT_ENQUEUE(ifq, m)                                        
\
-do {                                                                   \
-       if (IF_QFULL(ifq)) {                                            \
-               IF_DROP(ifq);                                           \
-               m_freem(m);                                             \
-               if (!(ifq)->ifq_congestion)                             \
-                       if_congestion(ifq);                             \
-       } else                                                          \
-               IF_ENQUEUE(ifq, m);                                     \
-} while (/* CONSTCOND */0)
-
-#define        IF_PURGE(ifq)                                                   
\
-do {                                                                   \
-       struct mbuf *__m0;                                              \
-                                                                       \
-       for (;;) {                                                      \
-               IF_DEQUEUE((ifq), __m0);                                \
-               if (__m0 == NULL)                                       \
-                       break;                                          \
-               else                                                    \
-                       m_freem(__m0);                                  \
-       }                                                               \
-} while (/* CONSTCOND */0)
-#define        IF_LEN(ifq)             ((ifq)->ifq_len)
-#define        IF_IS_EMPTY(ifq)        ((ifq)->ifq_len == 0)
-
-#define        IFQ_MAXLEN      256
-#define        IFNET_SLOWHZ    1               /* granularity is 1 second */
-
 /* symbolic names for terminal (per-protocol) CTL_IFQ_ nodes */
 #define IFQCTL_LEN 1
 #define IFQCTL_MAXLEN 2
 #define IFQCTL_DROPS 3
 #define IFQCTL_CONGESTION 4
@@ -478,39 +239,10 @@ do {                                                      
                \
        { "drops", CTLTYPE_INT }, \
        { "congestion", CTLTYPE_INT }, \
 }
 
 /*
- * The ifaddr structure contains information about one address
- * of an interface.  They are maintained by the different address families,
- * are allocated and attached when an address is set, and are linked
- * together so all addresses for an interface can be located.
- */
-struct ifaddr {
-       struct  sockaddr *ifa_addr;     /* address of interface */
-       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 */
-       struct  ifnet *ifa_ifp;         /* back-pointer to interface */
-       TAILQ_ENTRY(ifaddr) ifa_list;   /* list of addresses for interface */
-                                       /* check or clean routes (+ or -)'d */
-       void    (*ifa_rtrequest)(int, struct rtentry *);
-       u_int   ifa_flags;              /* mostly rt_flags for cloning */
-       u_int   ifa_refcnt;             /* count of references */
-       int     ifa_metric;             /* cost of going out this interface */
-};
-#define        IFA_ROUTE       RTF_UP          /* route installed */
-
-struct ifaddr_item {
-       RB_ENTRY(ifaddr_item)    ifai_entry;
-       struct sockaddr         *ifai_addr;
-       struct ifaddr           *ifai_ifa;
-       struct ifaddr_item      *ifai_next;
-       u_int                    ifai_rdomain;
-};
-
-/*
  * Message format for use in obtaining information about interfaces
  * from sysctl and the routing socket.
  */
 struct if_msghdr {
        u_short ifm_msglen;     /* to skip over non-understood messages */
@@ -543,11 +275,10 @@ struct ifa_msghdr {
        int     ifam_addrs;     /* like rtm_addrs */
        int     ifam_flags;     /* value of ifa_flags */
        int     ifam_metric;    /* value of ifa_metric */
 };
 
-
 /*
  * Message format announcing the arrival or departure of a network interface.
  */
 struct if_announcemsghdr {
        u_short ifan_msglen;    /* to skip over non-understood messages */
@@ -567,29 +298,10 @@ struct if_announcemsghdr {
  */
 
 #define        IFG_ALL         "all"           /* group contains all 
interfaces */
 #define        IFG_EGRESS      "egress"        /* if(s) default route(s) point 
to */
 
-struct ifg_group {
-       char                             ifg_group[IFNAMSIZ];
-       u_int                            ifg_refcnt;
-       caddr_t                          ifg_pf_kif;
-       int                              ifg_carp_demoted;
-       TAILQ_HEAD(, ifg_member)         ifg_members;
-       TAILQ_ENTRY(ifg_group)           ifg_next;
-};
-
-struct ifg_member {
-       TAILQ_ENTRY(ifg_member)  ifgm_next;
-       struct ifnet            *ifgm_ifp;
-};
-
-struct ifg_list {
-       struct ifg_group        *ifgl_group;
-       TAILQ_ENTRY(ifg_list)    ifgl_next;
-};
-
 struct ifg_req {
        union {
                char                     ifgrqu_group[IFNAMSIZ];
                char                     ifgrqu_member[IFNAMSIZ];
        } ifgrq_ifgrqu;
@@ -707,208 +419,11 @@ struct if_laddrreq {
 };
 
 #include <net/if_arp.h>
 
 #ifdef _KERNEL
-#define        IFAFREE(ifa) \
-do { \
-       if ((ifa)->ifa_refcnt <= 0) \
-               ifafree(ifa); \
-       else \
-               (ifa)->ifa_refcnt--; \
-} while (/* CONSTCOND */0)
-
-/* XXX the IFQ_ macros are a giant mess right now. cleanup once altq gone. */
-
-#ifdef ALTQ
-
-/* XXX pattr unused */
-/* if_snd becomes ifqueue when altq is gone and the casts go away */
-#define        IFQ_ENQUEUE(ifq, m, pattr, err)                                 
\
-do {                                                                   \
-       if (HFSC_ENABLED((ifq)))                                        \
-               (err) = hfsc_enqueue(((struct ifqueue *)(ifq)), (m));   \
-       else if (ALTQ_IS_ENABLED((ifq))) {                              \
-               m->m_pkthdr.pf.prio = IFQ_MAXPRIO;                      \
-               ALTQ_ENQUEUE((ifq), (m), (pattr), (err));               \
-       } else {                                                        \
-               if (IF_QFULL((ifq))) {                                  \
-                       m_freem((m));                                   \
-                       (err) = ENOBUFS;                                \
-               } else {                                                \
-                       IF_ENQUEUE((ifq), (m));                         \
-                       (err) = 0;                                      \
-               }                                                       \
-       }                                                               \
-       if ((err))                                                      \
-               (ifq)->ifq_drops++;                                     \
-} while (/* CONSTCOND */0)
-
-#define        IFQ_DEQUEUE(ifq, m)                                             
\
-do {                                                                   \
-       if (HFSC_ENABLED((ifq)))                                        \
-               (m) = hfsc_dequeue(((struct ifqueue *)(ifq)), 1);       \
-       else if (OLDTBR_IS_ENABLED((ifq)))                              \
-               (m) = oldtbr_dequeue((ifq), ALTDQ_REMOVE);              \
-       else if (ALTQ_IS_ENABLED((ifq)))                                \
-               ALTQ_DEQUEUE((ifq), (m));                               \
-       else                                                            \
-               IF_DEQUEUE((ifq), (m));                                 \
-} while (/* CONSTCOND */0)
-
-#define        IFQ_POLL(ifq, m)                                                
\
-do {                                                                   \
-       if (HFSC_ENABLED((ifq)))                                        \
-               (m) = hfsc_dequeue(((struct ifqueue *)(ifq)), 0);       \
-       else if (OLDTBR_IS_ENABLED((ifq)))                              \
-               (m) = oldtbr_dequeue((ifq), ALTDQ_POLL);                \
-       else if (ALTQ_IS_ENABLED((ifq)))                                \
-               ALTQ_POLL((ifq), (m));                                  \
-       else                                                            \
-               IF_POLL((ifq), (m));                                    \
-} while (/* CONSTCOND */0)
-
-#define        IFQ_PURGE(ifq)                                                  
\
-do {                                                                   \
-       if (HFSC_ENABLED((ifq)))                                        \
-               hfsc_purge(((struct ifqueue *)(ifq)));                  \
-       else if (ALTQ_IS_ENABLED((ifq)))                                \
-               ALTQ_PURGE(ifq);                                        \
-       else                                                            \
-               IF_PURGE((ifq));                                        \
-} while (/* CONSTCOND */0)
-
-#define        IFQ_SET_READY(ifq)                                              
\
-do {                                                                   \
-       ((ifq)->altq_flags |= ALTQF_READY);                             \
-} while (/* CONSTCOND */0)
-
-#else /* !ALTQ */
-
-/* XXX pattr unused */
-#define        IFQ_ENQUEUE(ifq, m, pattr, err)                                 
\
-do {                                                                   \
-       if (HFSC_ENABLED(ifq))                                          \
-               (err) = hfsc_enqueue(((struct ifqueue *)(ifq)), m);     \
-       else {                                                          \
-               if (IF_QFULL((ifq))) {                                  \
-                       m_freem((m));                                   \
-                       (err) = ENOBUFS;                                \
-               } else {                                                \
-                       IF_ENQUEUE((ifq), (m));                         \
-                       (err) = 0;                                      \
-               }                                                       \
-       }                                                               \
-       if ((err))                                                      \
-               (ifq)->ifq_drops++;                                     \
-} while (/* CONSTCOND */0)
-
-#define        IFQ_DEQUEUE(ifq, m)                                             
\
-do {                                                                   \
-       if (HFSC_ENABLED((ifq)))                                        \
-               (m) = hfsc_dequeue(((struct ifqueue *)(ifq)), 1);       \
-       else                                                            \
-               IF_DEQUEUE((ifq), (m));                                 \
-} while (/* CONSTCOND */0)
-
-#define        IFQ_POLL(ifq, m)                                                
\
-do {                                                                   \
-       if (HFSC_ENABLED((ifq)))                                        \
-               (m) = hfsc_dequeue(((struct ifqueue *)(ifq)), 0);       \
-       else                                                            \
-               IF_POLL((ifq), (m));                                    \
-} while (/* CONSTCOND */0)
-
-#define        IFQ_PURGE(ifq)                                                  
\
-do {                                                                   \
-       if (HFSC_ENABLED((ifq)))                                        \
-               hfsc_purge(((struct ifqueue *)(ifq)));                  \
-       else                                                            \
-               IF_PURGE((ifq));                                        \
-} while (/* CONSTCOND */0)
-
-#define        IFQ_SET_READY(ifq)      /* nothing */
-
-#endif /* ALTQ */
-
-#define        IFQ_LEN(ifq)                    IF_LEN(ifq)
-#define        IFQ_IS_EMPTY(ifq)               ((ifq)->ifq_len == 0)
-#define        IFQ_INC_LEN(ifq)                ((ifq)->ifq_len++)
-#define        IFQ_DEC_LEN(ifq)                (--(ifq)->ifq_len)
-#define        IFQ_INC_DROPS(ifq)              ((ifq)->ifq_drops++)
-#define        IFQ_SET_MAXLEN(ifq, len)        ((ifq)->ifq_maxlen = (len))
-
-/* default interface priorities */
-#define IF_WIRED_DEFAULT_PRIORITY 0
-#define IF_WIRELESS_DEFAULT_PRIORITY 4
-
-extern struct ifnet_head ifnet;
-extern struct ifnet *lo0ifp;
-
-#define        ether_input_mbuf(ifp, m)        ether_input((ifp), NULL, (m))
-
-void   ether_ifattach(struct ifnet *);
-void   ether_ifdetach(struct ifnet *);
-int    ether_ioctl(struct ifnet *, struct arpcom *, u_long, caddr_t);
-void   ether_input(struct ifnet *, struct ether_header *, struct mbuf *);
-int    ether_output(struct ifnet *,
-           struct mbuf *, struct sockaddr *, struct rtentry *);
-char   *ether_sprintf(u_char *);
-
-void   if_alloc_sadl(struct ifnet *);
-void   if_free_sadl(struct ifnet *);
-void   if_attach(struct ifnet *);
-void   if_attachdomain(void);
-void   if_attachtail(struct ifnet *);
-void   if_attachhead(struct ifnet *);
-void   if_detach(struct ifnet *);
-void   if_down(struct ifnet *);
-void   if_downall(void);
-void   if_link_state_change(struct ifnet *);
-void   if_slowtimo(void *);
-void   if_up(struct ifnet *);
-int    ifconf(u_long, caddr_t);
-void   ifinit(void);
-int    ifioctl(struct socket *, u_long, caddr_t, struct proc *);
-int    ifpromisc(struct ifnet *, int);
-struct ifg_group *if_creategroup(const char *);
-int    if_addgroup(struct ifnet *, const char *);
-int    if_delgroup(struct ifnet *, const char *);
-void   if_group_routechange(struct sockaddr *, struct sockaddr *);
-struct ifnet *ifunit(const char *);
-struct ifnet *if_get(unsigned int);
-void   if_start(struct ifnet *);
-void   ifnewlladdr(struct ifnet *);
-
-struct ifaddr *ifa_ifwithaddr(struct sockaddr *, u_int);
-struct ifaddr *ifa_ifwithdstaddr(struct sockaddr *, u_int);
-struct ifaddr *ifa_ifwithnet(struct sockaddr *, u_int);
-struct ifaddr *ifa_ifwithroute(int, struct sockaddr *,
-                                       struct sockaddr *, u_int);
-struct ifaddr *ifaof_ifpforaddr(struct sockaddr *, struct ifnet *);
-void   ifafree(struct ifaddr *);
-void   link_rtrequest(int, struct rtentry *);
-
-void   if_clone_attach(struct if_clone *);
-void   if_clone_detach(struct if_clone *);
-
-int    if_clone_create(const char *);
-int    if_clone_destroy(const char *);
-
-void   if_congestion(struct ifqueue *);
-int     sysctl_ifq(int *, u_int, void *, size_t *, void *, size_t,
-           struct ifqueue *);
-
-int    loioctl(struct ifnet *, u_long, caddr_t);
-void   loopattach(int);
-int    looutput(struct ifnet *,
-           struct mbuf *, struct sockaddr *, struct rtentry *);
-void   lortrequest(int, struct rtentry *);
-void   ifa_add(struct ifnet *, struct ifaddr *);
-void   ifa_del(struct ifnet *, struct ifaddr *);
-void   ifa_update_broadaddr(struct ifnet *, struct ifaddr *,
-           struct sockaddr *);
-#endif /* _KERNEL */
+#include <net/if_var.h>
+#endif
 
 #endif /* __BSD_VISIBLE */
 
 #endif /* _NET_IF_H_ */
diff --git sys/net/if_var.h sys/net/if_var.h
new file mode 100644
index 0000000..10c42f7
--- /dev/null
+++ sys/net/if_var.h
@@ -0,0 +1,531 @@
+/*     $OpenBSD: if.h,v 1.152 2013/11/09 06:38:42 dlg Exp $    */
+/*     $NetBSD: if.h,v 1.23 1996/05/07 02:40:27 thorpej Exp $  */
+
+/*
+ * Copyright (c) 2012-2013 Henning Brauer <[email protected]>
+ * Copyright (c) 1982, 1986, 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)if.h        8.1 (Berkeley) 6/10/93
+ */
+
+#ifndef _NET_IF_VAR_H_
+#define _NET_IF_VAR_H_
+
+#include <sys/queue.h>
+#include <sys/tree.h>
+#include <altq/if_altq.h>
+#ifdef _KERNEL
+#include <net/hfsc.h>
+#endif
+
+/*
+ * Structures defining a network interface, providing a packet
+ * transport mechanism (ala level 0 of the PUP protocols).
+ *
+ * Each interface accepts output datagrams of a specified maximum
+ * length, and provides higher level routines with input datagrams
+ * received from its medium.
+ *
+ * Output occurs when the routine if_output is called, with four parameters:
+ *     (*ifp->if_output)(ifp, m, dst, rt)
+ * Here m is the mbuf chain to be sent and dst is the destination address.
+ * The output routine encapsulates the supplied datagram if necessary,
+ * and then transmits it on its medium.
+ *
+ * On input, each interface unwraps the data received by it, and either
+ * places it on the input queue of an internetwork datagram routine
+ * and posts the associated software interrupt, or passes the datagram to a raw
+ * packet input routine.
+ *
+ * Routines exist for locating interfaces by their addresses
+ * or for locating an interface on a certain network, as well as more general
+ * routing and gateway routines maintaining information used to locate
+ * interfaces.  These routines live in the files if.c and route.c
+ */
+
+#include <sys/time.h>
+
+struct mbuf;
+struct proc;
+struct rtentry;
+struct socket;
+struct ether_header;
+struct arpcom;
+struct rt_addrinfo;
+struct ifnet;
+struct hfsc_if;
+
+/*
+ * 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. `gif' */
+       size_t                   ifc_namelen;   /* length of name */
+
+       int                     (*ifc_create)(struct if_clone *, int);
+       int                     (*ifc_destroy)(struct ifnet *);
+};
+
+#define        IF_CLONE_INITIALIZER(name, create, destroy)                     
\
+       { { 0 }, name, sizeof(name) - 1, create, destroy }
+
+/*
+ * Structure defining a queue for a network interface.
+ * XXX keep in sync with struct ifaltq.
+ */
+struct ifqueue {
+       struct {
+               struct  mbuf *head;
+               struct  mbuf *tail;
+       }                        ifq_q[IFQ_NQUEUES];
+       int                      ifq_len;
+       int                      ifq_maxlen;
+       int                      ifq_drops;
+       struct hfsc_if          *ifq_hfsc;
+       struct timeout          *ifq_congestion;
+};
+
+/*
+ * Structure defining a queue for a network interface.
+ *
+ * (Would like to call this struct ``if'', but C isn't PL/1.)
+ */
+TAILQ_HEAD(ifnet_head, ifnet);         /* the actual queue head */
+
+struct ifnet {                         /* and the entries */
+       void    *if_softc;              /* lower-level data for this if */
+       TAILQ_ENTRY(ifnet) if_list;     /* all struct ifnets are chained */
+       TAILQ_ENTRY(ifnet) if_txlist;   /* list of ifnets ready to tx */
+       TAILQ_HEAD(, ifaddr) if_addrlist; /* linked list of addresses per if */
+       TAILQ_HEAD(, ifg_list) if_groups; /* linked list of groups per if */
+       struct hook_desc_head *if_addrhooks; /* address change callbacks */
+       struct hook_desc_head *if_linkstatehooks; /* link change callbacks */
+       struct hook_desc_head *if_detachhooks; /* detach callbacks */
+       char    if_xname[IFNAMSIZ];     /* external name (name + unit) */
+       int     if_pcount;              /* number of promiscuous listeners */
+       caddr_t if_bpf;                 /* packet filter structure */
+       caddr_t if_bridgeport;          /* used by bridge ports */
+       caddr_t if_tp;                  /* used by trunk ports */
+       caddr_t if_pf_kif;              /* pf interface abstraction */
+       union {
+               caddr_t carp_s;         /* carp structure (used by !carp ifs) */
+               struct ifnet *carp_d;   /* ptr to carpdev (used by carp ifs) */
+       } if_carp_ptr;
+#define if_carp                if_carp_ptr.carp_s
+#define if_carpdev     if_carp_ptr.carp_d
+       u_short if_index;               /* numeric abbreviation for this if */
+       short   if_timer;               /* time 'til if_watchdog called */
+       short   if_flags;               /* up/down, broadcast, etc. */
+       int     if_xflags;              /* extra softnet flags */
+       struct  if_data if_data;        /* stats and other data about if */
+       u_int32_t if_hardmtu;           /* maximum MTU device supports */
+       u_int   if_rdomain;             /* routing instance */
+       char    if_description[IFDESCRSIZE]; /* interface description */
+       u_short if_rtlabelid;           /* next route label */
+       u_int8_t if_priority;
+
+       /* procedure handles */
+                                       /* output routine (enqueue) */
+       int     (*if_output)(struct ifnet *, struct mbuf *, struct sockaddr *,
+                    struct rtentry *);
+
+                                       /* link level output function */
+       int     (*if_ll_output)(struct ifnet *, struct mbuf *,
+                   struct sockaddr *, struct rtentry *);
+                                       /* initiate output routine */
+       void    (*if_start)(struct ifnet *);
+                                       /* ioctl routine */
+       int     (*if_ioctl)(struct ifnet *, u_long, caddr_t);
+                                       /* stop routine */
+       int     (*if_stop)(struct ifnet *, int);
+                                       /* timer routine */
+       void    (*if_watchdog)(struct ifnet *);
+       int     (*if_wol)(struct ifnet *, int);
+       struct  ifaddr *if_lladdr;      /* pointer to link-level address */
+       struct  ifaltq if_snd;          /* output queue (includes altq) */
+       struct sockaddr_dl *if_sadl;    /* pointer to our sockaddr_dl */
+
+       void    *if_afdata[AF_MAX];
+};
+#define        if_mtu          if_data.ifi_mtu
+#define        if_type         if_data.ifi_type
+#define        if_addrlen      if_data.ifi_addrlen
+#define        if_hdrlen       if_data.ifi_hdrlen
+#define        if_metric       if_data.ifi_metric
+#define        if_link_state   if_data.ifi_link_state
+#define        if_baudrate     if_data.ifi_baudrate
+#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_capabilities if_data.ifi_capabilities
+
+#ifdef _KERNEL
+/*
+ * Output queues (ifp->if_snd) and internetwork datagram level (pup level 1)
+ * input routines have queues of messages stored on ifqueue structures
+ * (defined above).  Entries are added to and deleted from these structures
+ * by these macros, which should be called with ipl raised to splnet().
+ */
+#define        IF_QFULL(ifq)           ((ifq)->ifq_len >= (ifq)->ifq_maxlen)
+#define        IF_DROP(ifq)            ((ifq)->ifq_drops++)
+#define        IF_ENQUEUE(ifq, m)                                              
\
+do {                                                                   \
+       (m)->m_nextpkt = NULL;                                          \
+       if ((ifq)->ifq_q[(m)->m_pkthdr.pf.prio].tail == NULL)           \
+               (ifq)->ifq_q[(m)->m_pkthdr.pf.prio].head = m;           \
+       else                                                            \
+               (ifq)->ifq_q[(m)->m_pkthdr.pf.prio].tail->m_nextpkt = m; \
+       (ifq)->ifq_q[(m)->m_pkthdr.pf.prio].tail = m;                   \
+       (ifq)->ifq_len++;                                               \
+} while (/* CONSTCOND */0)
+#define        IF_PREPEND(ifq, m)                                              
\
+do {                                                                   \
+       (m)->m_nextpkt = (ifq)->ifq_q[(m)->m_pkthdr.pf.prio].head;      \
+       if ((ifq)->ifq_q[(m)->m_pkthdr.pf.prio].tail == NULL)           \
+               (ifq)->ifq_q[(m)->m_pkthdr.pf.prio].tail = (m);         \
+       (ifq)->ifq_q[(m)->m_pkthdr.pf.prio].head = (m);                 \
+       (ifq)->ifq_len++;                                               \
+} while (/* CONSTCOND */0)
+
+#define        IF_POLL(ifq, m)                                                 
\
+do {                                                                   \
+       int     if_dequeue_prio = IFQ_MAXPRIO;                          \
+       do {                                                            \
+               (m) = (ifq)->ifq_q[if_dequeue_prio].head;               \
+       } while (!(m) && --if_dequeue_prio >= 0);                       \
+} while (/* CONSTCOND */0)
+
+#define        IF_DEQUEUE(ifq, m)                                              
\
+do {                                                                   \
+       int     if_dequeue_prio = IFQ_MAXPRIO;                          \
+       do {                                                            \
+               (m) = (ifq)->ifq_q[if_dequeue_prio].head;               \
+               if (m) {                                                \
+                       if (((ifq)->ifq_q[if_dequeue_prio].head =       \
+                           (m)->m_nextpkt) == NULL)                    \
+                               (ifq)->ifq_q[if_dequeue_prio].tail = NULL; \
+                       (m)->m_nextpkt = NULL;                          \
+                       (ifq)->ifq_len--;                               \
+               }                                                       \
+       } while (!(m) && --if_dequeue_prio >= 0);                       \
+} while (/* CONSTCOND */0)
+
+#define        IF_INPUT_ENQUEUE(ifq, m)                                        
\
+do {                                                                   \
+       if (IF_QFULL(ifq)) {                                            \
+               IF_DROP(ifq);                                           \
+               m_freem(m);                                             \
+               if (!(ifq)->ifq_congestion)                             \
+                       if_congestion(ifq);                             \
+       } else                                                          \
+               IF_ENQUEUE(ifq, m);                                     \
+} while (/* CONSTCOND */0)
+
+#define        IF_PURGE(ifq)                                                   
\
+do {                                                                   \
+       struct mbuf *__m0;                                              \
+                                                                       \
+       for (;;) {                                                      \
+               IF_DEQUEUE((ifq), __m0);                                \
+               if (__m0 == NULL)                                       \
+                       break;                                          \
+               else                                                    \
+                       m_freem(__m0);                                  \
+       }                                                               \
+} while (/* CONSTCOND */0)
+#define        IF_LEN(ifq)             ((ifq)->ifq_len)
+#define        IF_IS_EMPTY(ifq)        ((ifq)->ifq_len == 0)
+
+#define        IFQ_MAXLEN      256
+#define        IFNET_SLOWHZ    1               /* granularity is 1 second */
+#endif
+
+/*
+ * The ifaddr structure contains information about one address
+ * of an interface.  They are maintained by the different address families,
+ * are allocated and attached when an address is set, and are linked
+ * together so all addresses for an interface can be located.
+ */
+struct ifaddr {
+       struct  sockaddr *ifa_addr;     /* address of interface */
+       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 */
+       struct  ifnet *ifa_ifp;         /* back-pointer to interface */
+       TAILQ_ENTRY(ifaddr) ifa_list;   /* list of addresses for interface */
+                                       /* check or clean routes (+ or -)'d */
+       void    (*ifa_rtrequest)(int, struct rtentry *);
+       u_int   ifa_flags;              /* mostly rt_flags for cloning */
+       u_int   ifa_refcnt;             /* count of references */
+       int     ifa_metric;             /* cost of going out this interface */
+};
+#define        IFA_ROUTE       RTF_UP          /* route installed */
+
+struct ifaddr_item {
+       RB_ENTRY(ifaddr_item)    ifai_entry;
+       struct sockaddr         *ifai_addr;
+       struct ifaddr           *ifai_ifa;
+       struct ifaddr_item      *ifai_next;
+       u_int                    ifai_rdomain;
+};
+
+/*
+ * interface groups
+ */
+
+struct ifg_group {
+       char                     ifg_group[IFNAMSIZ];
+       u_int                    ifg_refcnt;
+       caddr_t                  ifg_pf_kif;
+       int                      ifg_carp_demoted;
+       TAILQ_HEAD(, ifg_member) ifg_members;
+       TAILQ_ENTRY(ifg_group)   ifg_next;
+};
+
+struct ifg_member {
+       TAILQ_ENTRY(ifg_member)  ifgm_next;
+       struct ifnet            *ifgm_ifp;
+};
+
+struct ifg_list {
+       struct ifg_group        *ifgl_group;
+       TAILQ_ENTRY(ifg_list)    ifgl_next;
+};
+
+#ifdef _KERNEL
+#define        IFAFREE(ifa) \
+do { \
+       if ((ifa)->ifa_refcnt <= 0) \
+               ifafree(ifa); \
+       else \
+               (ifa)->ifa_refcnt--; \
+} while (/* CONSTCOND */0)
+
+/* XXX the IFQ_ macros are a giant mess right now. cleanup once altq gone. */
+
+#ifdef ALTQ
+
+/* XXX pattr unused */
+/* if_snd becomes ifqueue when altq is gone and the casts go away */
+#define        IFQ_ENQUEUE(ifq, m, pattr, err)                                 
\
+do {                                                                   \
+       if (HFSC_ENABLED((ifq)))                                        \
+               (err) = hfsc_enqueue(((struct ifqueue *)(ifq)), (m));   \
+       else if (ALTQ_IS_ENABLED((ifq))) {                              \
+               m->m_pkthdr.pf.prio = IFQ_MAXPRIO;                      \
+               ALTQ_ENQUEUE((ifq), (m), (pattr), (err));               \
+       } else {                                                        \
+               if (IF_QFULL((ifq))) {                                  \
+                       m_freem((m));                                   \
+                       (err) = ENOBUFS;                                \
+               } else {                                                \
+                       IF_ENQUEUE((ifq), (m));                         \
+                       (err) = 0;                                      \
+               }                                                       \
+       }                                                               \
+       if ((err))                                                      \
+               (ifq)->ifq_drops++;                                     \
+} while (/* CONSTCOND */0)
+
+#define        IFQ_DEQUEUE(ifq, m)                                             
\
+do {                                                                   \
+       if (HFSC_ENABLED((ifq)))                                        \
+               (m) = hfsc_dequeue(((struct ifqueue *)(ifq)), 1);       \
+       else if (OLDTBR_IS_ENABLED((ifq)))                              \
+               (m) = oldtbr_dequeue((ifq), ALTDQ_REMOVE);              \
+       else if (ALTQ_IS_ENABLED((ifq)))                                \
+               ALTQ_DEQUEUE((ifq), (m));                               \
+       else                                                            \
+               IF_DEQUEUE((ifq), (m));                                 \
+} while (/* CONSTCOND */0)
+
+#define        IFQ_POLL(ifq, m)                                                
\
+do {                                                                   \
+       if (HFSC_ENABLED((ifq)))                                        \
+               (m) = hfsc_dequeue(((struct ifqueue *)(ifq)), 0);       \
+       else if (OLDTBR_IS_ENABLED((ifq)))                              \
+               (m) = oldtbr_dequeue((ifq), ALTDQ_POLL);                \
+       else if (ALTQ_IS_ENABLED((ifq)))                                \
+               ALTQ_POLL((ifq), (m));                                  \
+       else                                                            \
+               IF_POLL((ifq), (m));                                    \
+} while (/* CONSTCOND */0)
+
+#define        IFQ_PURGE(ifq)                                                  
\
+do {                                                                   \
+       if (HFSC_ENABLED((ifq)))                                        \
+               hfsc_purge(((struct ifqueue *)(ifq)));                  \
+       else if (ALTQ_IS_ENABLED((ifq)))                                \
+               ALTQ_PURGE(ifq);                                        \
+       else                                                            \
+               IF_PURGE((ifq));                                        \
+} while (/* CONSTCOND */0)
+
+#define        IFQ_SET_READY(ifq)                                              
\
+do {                                                                   \
+       ((ifq)->altq_flags |= ALTQF_READY);                             \
+} while (/* CONSTCOND */0)
+
+#else /* !ALTQ */
+
+/* XXX pattr unused */
+#define        IFQ_ENQUEUE(ifq, m, pattr, err)                                 
\
+do {                                                                   \
+       if (HFSC_ENABLED(ifq))                                          \
+               (err) = hfsc_enqueue(((struct ifqueue *)(ifq)), m);     \
+       else {                                                          \
+               if (IF_QFULL((ifq))) {                                  \
+                       m_freem((m));                                   \
+                       (err) = ENOBUFS;                                \
+               } else {                                                \
+                       IF_ENQUEUE((ifq), (m));                         \
+                       (err) = 0;                                      \
+               }                                                       \
+       }                                                               \
+       if ((err))                                                      \
+               (ifq)->ifq_drops++;                                     \
+} while (/* CONSTCOND */0)
+
+#define        IFQ_DEQUEUE(ifq, m)                                             
\
+do {                                                                   \
+       if (HFSC_ENABLED((ifq)))                                        \
+               (m) = hfsc_dequeue(((struct ifqueue *)(ifq)), 1);       \
+       else                                                            \
+               IF_DEQUEUE((ifq), (m));                                 \
+} while (/* CONSTCOND */0)
+
+#define        IFQ_POLL(ifq, m)                                                
\
+do {                                                                   \
+       if (HFSC_ENABLED((ifq)))                                        \
+               (m) = hfsc_dequeue(((struct ifqueue *)(ifq)), 0);       \
+       else                                                            \
+               IF_POLL((ifq), (m));                                    \
+} while (/* CONSTCOND */0)
+
+#define        IFQ_PURGE(ifq)                                                  
\
+do {                                                                   \
+       if (HFSC_ENABLED((ifq)))                                        \
+               hfsc_purge(((struct ifqueue *)(ifq)));                  \
+       else                                                            \
+               IF_PURGE((ifq));                                        \
+} while (/* CONSTCOND */0)
+
+#define        IFQ_SET_READY(ifq)      /* nothing */
+
+#endif /* ALTQ */
+
+#define        IFQ_LEN(ifq)                    IF_LEN(ifq)
+#define        IFQ_IS_EMPTY(ifq)               ((ifq)->ifq_len == 0)
+#define        IFQ_INC_LEN(ifq)                ((ifq)->ifq_len++)
+#define        IFQ_DEC_LEN(ifq)                (--(ifq)->ifq_len)
+#define        IFQ_INC_DROPS(ifq)              ((ifq)->ifq_drops++)
+#define        IFQ_SET_MAXLEN(ifq, len)        ((ifq)->ifq_maxlen = (len))
+
+/* default interface priorities */
+#define IF_WIRED_DEFAULT_PRIORITY      0
+#define IF_WIRELESS_DEFAULT_PRIORITY   4
+
+extern struct ifnet_head ifnet;
+extern struct ifnet *lo0ifp;
+
+#define        ether_input_mbuf(ifp, m)        ether_input((ifp), NULL, (m))
+
+void   ether_ifattach(struct ifnet *);
+void   ether_ifdetach(struct ifnet *);
+int    ether_ioctl(struct ifnet *, struct arpcom *, u_long, caddr_t);
+void   ether_input(struct ifnet *, struct ether_header *, struct mbuf *);
+int    ether_output(struct ifnet *,
+           struct mbuf *, struct sockaddr *, struct rtentry *);
+char   *ether_sprintf(u_char *);
+
+void   if_alloc_sadl(struct ifnet *);
+void   if_free_sadl(struct ifnet *);
+void   if_attach(struct ifnet *);
+void   if_attachdomain(void);
+void   if_attachtail(struct ifnet *);
+void   if_attachhead(struct ifnet *);
+void   if_detach(struct ifnet *);
+void   if_down(struct ifnet *);
+void   if_downall(void);
+void   if_link_state_change(struct ifnet *);
+void   if_slowtimo(void *);
+void   if_up(struct ifnet *);
+int    ifconf(u_long, caddr_t);
+void   ifinit(void);
+int    ifioctl(struct socket *, u_long, caddr_t, struct proc *);
+int    ifpromisc(struct ifnet *, int);
+struct ifg_group *if_creategroup(const char *);
+int    if_addgroup(struct ifnet *, const char *);
+int    if_delgroup(struct ifnet *, const char *);
+void   if_group_routechange(struct sockaddr *, struct sockaddr *);
+struct ifnet *ifunit(const char *);
+struct ifnet *if_get(unsigned int);
+void   if_start(struct ifnet *);
+void   ifnewlladdr(struct ifnet *);
+
+struct ifaddr *ifa_ifwithaddr(struct sockaddr *, u_int);
+struct ifaddr *ifa_ifwithdstaddr(struct sockaddr *, u_int);
+struct ifaddr *ifa_ifwithnet(struct sockaddr *, u_int);
+struct ifaddr *ifa_ifwithroute(int, struct sockaddr *,
+                                       struct sockaddr *, u_int);
+struct ifaddr *ifaof_ifpforaddr(struct sockaddr *, struct ifnet *);
+void   ifafree(struct ifaddr *);
+void   link_rtrequest(int, struct rtentry *);
+
+void   if_clone_attach(struct if_clone *);
+void   if_clone_detach(struct if_clone *);
+
+int    if_clone_create(const char *);
+int    if_clone_destroy(const char *);
+
+void   if_congestion(struct ifqueue *);
+int     sysctl_ifq(int *, u_int, void *, size_t *, void *, size_t,
+           struct ifqueue *);
+
+int    loioctl(struct ifnet *, u_long, caddr_t);
+void   loopattach(int);
+int    looutput(struct ifnet *,
+           struct mbuf *, struct sockaddr *, struct rtentry *);
+void   lortrequest(int, struct rtentry *);
+void   ifa_add(struct ifnet *, struct ifaddr *);
+void   ifa_del(struct ifnet *, struct ifaddr *);
+void   ifa_update_broadaddr(struct ifnet *, struct ifaddr *,
+           struct sockaddr *);
+#endif /* _KERNEL */
+
+#endif /* _NET_IF_VAR_H_ */
diff --git usr.bin/netstat/if.c usr.bin/netstat/if.c
index 1cc7e07..216cff6 100644
--- usr.bin/netstat/if.c
+++ usr.bin/netstat/if.c
@@ -36,10 +36,11 @@
 #include <sys/protosw.h>
 #include <sys/socket.h>
 #include <sys/sysctl.h>
 
 #include <net/if.h>
+#include <net/if_var.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
 #include <net/route.h>
 #include <netinet/in.h>
 #include <netinet/in_var.h>
diff --git usr.bin/netstat/mroute6.c usr.bin/netstat/mroute6.c
index d92c15f..acf596a 100644
--- usr.bin/netstat/mroute6.c
+++ usr.bin/netstat/mroute6.c
@@ -70,10 +70,11 @@
 #include <sys/socketvar.h>
 #include <sys/protosw.h>
 #include <sys/sysctl.h>
 
 #include <net/if.h>
+#include <net/if_var.h>
 
 #include <netinet/in.h>
 
 #define _KERNEL 1
 #include <netinet6/ip6_mroute.h>
diff --git usr.bin/netstat/net80211.c usr.bin/netstat/net80211.c
index 8f34d06..5e87f8f 100644
--- usr.bin/netstat/net80211.c
+++ usr.bin/netstat/net80211.c
@@ -21,10 +21,11 @@
 #include <sys/socket.h>
 #include <sys/file.h>
 #include <sys/ioctl.h>
 
 #include <net/if.h>
+#include <net/if_var.h>
 
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
 #include <netinet/if_ether.h>
 
diff --git usr.bin/netstat/route.c usr.bin/netstat/route.c
index fc5281d..c42cfa5 100644
--- usr.bin/netstat/route.c
+++ usr.bin/netstat/route.c
@@ -33,10 +33,11 @@
 #include <sys/param.h>
 #include <sys/protosw.h>
 #include <sys/socket.h>
 
 #include <net/if.h>
+#include <net/if_var.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
 #define _KERNEL
 #include <net/route.h>
 #undef _KERNEL
diff --git usr.bin/netstat/show.c usr.bin/netstat/show.c
index 67295e3..b9e1404 100644
--- usr.bin/netstat/show.c
+++ usr.bin/netstat/show.c
@@ -34,10 +34,11 @@
 #include <sys/protosw.h>
 #include <sys/socket.h>
 #include <sys/sysctl.h>
 
 #include <net/if.h>
+#include <net/if_var.h>
 #include <net/if_dl.h>
 #include <net/if_types.h>
 #include <net/pfkeyv2.h>
 #include <net/route.h>
 #include <netinet/in.h>
diff --git usr.sbin/snmpd/snmpd.h usr.sbin/snmpd/snmpd.h
index 6a84df3..1dec598 100644
--- usr.sbin/snmpd/snmpd.h
+++ usr.sbin/snmpd/snmpd.h
@@ -215,10 +215,30 @@ struct kif {
        struct if_data           if_data;
        u_long                   if_ticks;
        int                      if_flags;
        u_short                  if_index;
 };
+#define        if_mtu          if_data.ifi_mtu
+#define        if_type         if_data.ifi_type
+#define        if_addrlen      if_data.ifi_addrlen
+#define        if_hdrlen       if_data.ifi_hdrlen
+#define        if_metric       if_data.ifi_metric
+#define        if_link_state   if_data.ifi_link_state
+#define        if_baudrate     if_data.ifi_baudrate
+#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_capabilities if_data.ifi_capabilities
 
 #define F_CONNECTED            0x0001
 #define F_STATIC               0x0002
 #define F_BLACKHOLE            0x0004
 #define F_REJECT               0x0008

Reply via email to