I prefer something this model of handling the situation, as long as
the ports tree software handles it well. (But then again, the other
way of doing it will cause effects there as well..)
> As promised here's a take on hiding ifnet via _KERNEL. This looks
> a bit simpler. I've tried not to toss things around that much and
> have only moved 'ifqueue'.
>
> diff --git sys/net/if.h sys/net/if.h
> index b7d1b3c..9a14117 100644
> --- sys/net/if.h
> +++ sys/net/if.h
> @@ -58,16 +58,15 @@ void if_freenameindex(struct if_nameindex *);
> __END_DECLS
> #endif
>
> #if __BSD_VISIBLE
>
> +#ifdef _KERNEL
> #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).
> *
> @@ -116,10 +115,11 @@ struct if_clone {
> int (*ifc_destroy)(struct ifnet *);
> };
>
> #define IF_CLONE_INITIALIZER(name, create, destroy)
> \
> { { 0 }, name, sizeof(name) - 1, create, destroy }
> +#endif /* _KERNEL */
>
> /*
> * Structure used to query names of interface cloners.
> */
> struct if_clonereq {
> @@ -168,30 +168,10 @@ struct if_data {
> struct timeval ifi_lastchange; /* last operational state change */
>
> struct mclpool ifi_mclpool[MCLPOOLS];
> };
>
> -#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 */
> @@ -214,12 +194,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,25 +219,46 @@ 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
>
> +#define IFQ_NQUEUES 8
> +#define IFQ_MAXPRIO IFQ_NQUEUES - 1
> +#define IFQ_DEFPRIO 3
> +
> +#ifdef _KERNEL
> +/*
> + * 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 */
> @@ -330,10 +330,11 @@ struct ifnet { /* and the
> entries */
> #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
> +#endif /* _KERNEL */
>
> #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 */
> @@ -382,10 +383,11 @@ 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)
>
> +#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().
> @@ -460,10 +462,11 @@ do {
> \
> #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 /* _KERNEL */
>
> /* symbolic names for terminal (per-protocol) CTL_IFQ_ nodes */
> #define IFQCTL_LEN 1
> #define IFQCTL_MAXLEN 2
> #define IFQCTL_DROPS 3
> @@ -477,10 +480,11 @@ do {
> \
> { "maxlen", CTLTYPE_INT }, \
> { "drops", CTLTYPE_INT }, \
> { "congestion", CTLTYPE_INT }, \
> }
>
> +#ifdef _KERNEL
> /*
> * 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.
> @@ -505,10 +509,11 @@ struct ifaddr_item {
> struct sockaddr *ifai_addr;
> struct ifaddr *ifai_ifa;
> struct ifaddr_item *ifai_next;
> u_int ifai_rdomain;
> };
> +#endif /* _KERNEL */
>
> /*
> * Message format for use in obtaining information about interfaces
> * from sysctl and the routing socket.
> */
> @@ -543,11 +548,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,10 +571,11 @@ struct if_announcemsghdr {
> */
>
> #define IFG_ALL "all" /* group contains all
> interfaces */
> #define IFG_EGRESS "egress" /* if(s) default route(s) point
> to */
>
> +#ifdef _KERNEL
> struct ifg_group {
> char ifg_group[IFNAMSIZ];
> u_int ifg_refcnt;
> caddr_t ifg_pf_kif;
> int ifg_carp_demoted;
> @@ -585,10 +590,11 @@ struct ifg_member {
>
> struct ifg_list {
> struct ifg_group *ifgl_group;
> TAILQ_ENTRY(ifg_list) ifgl_next;
> };
> +#endif /* _KERNEL */
>
> struct ifg_req {
> union {
> char ifgrqu_group[IFNAMSIZ];
> char ifgrqu_member[IFNAMSIZ];
> diff --git usr.bin/netstat/if.c usr.bin/netstat/if.c
> index 1cc7e07..96d56b4 100644
> --- usr.bin/netstat/if.c
> +++ usr.bin/netstat/if.c
> @@ -35,11 +35,13 @@
> #include <sys/ioctl.h>
> #include <sys/protosw.h>
> #include <sys/socket.h>
> #include <sys/sysctl.h>
>
> +#define _KERNEL
> #include <net/if.h>
> +#undef _KERNEL
> #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..7185260 100644
> --- usr.bin/netstat/mroute6.c
> +++ usr.bin/netstat/mroute6.c
> @@ -69,11 +69,13 @@
> #include <sys/socket.h>
> #include <sys/socketvar.h>
> #include <sys/protosw.h>
> #include <sys/sysctl.h>
>
> +#define _KERNEL 1
> #include <net/if.h>
> +#undef _KERNEL
>
> #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..5fdb480 100644
> --- usr.bin/netstat/net80211.c
> +++ usr.bin/netstat/net80211.c
> @@ -20,11 +20,13 @@
> #include <sys/time.h>
> #include <sys/socket.h>
> #include <sys/file.h>
> #include <sys/ioctl.h>
>
> +#define _KERNEL
> #include <net/if.h>
> +#undef _KERNEL
>
> #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..c475bdf 100644
> --- usr.bin/netstat/route.c
> +++ usr.bin/netstat/route.c
> @@ -32,11 +32,13 @@
>
> #include <sys/param.h>
> #include <sys/protosw.h>
> #include <sys/socket.h>
>
> +#define _KERNEL
> #include <net/if.h>
> +#undef _KERNEL
> #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..cbc76bb 100644
> --- usr.bin/netstat/show.c
> +++ usr.bin/netstat/show.c
> @@ -33,11 +33,13 @@
> #include <sys/param.h>
> #include <sys/protosw.h>
> #include <sys/socket.h>
> #include <sys/sysctl.h>
>
> +#define _KERNEL
> #include <net/if.h>
> +#undef _KERNEL
> #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
>