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
