#ifndef _NET_IF_VAR_H_
#define _NET_IF_VAR_H_
#include <sys/appleapiopts.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/queue.h>
#ifdef KERNEL_PRIVATE
#include <kern/locks.h>
#endif
#ifdef KERNEL
#include <net/kpi_interface.h>
#endif KERNEL
#ifdef __APPLE__
#define APPLE_IF_FAM_LOOPBACK 1
#define APPLE_IF_FAM_ETHERNET 2
#define APPLE_IF_FAM_SLIP 3
#define APPLE_IF_FAM_TUN 4
#define APPLE_IF_FAM_VLAN 5
#define APPLE_IF_FAM_PPP 6
#define APPLE_IF_FAM_PVC 7
#define APPLE_IF_FAM_DISC 8
#define APPLE_IF_FAM_MDECAP 9
#define APPLE_IF_FAM_GIF 10
#define APPLE_IF_FAM_FAITH 11
#define APPLE_IF_FAM_STF 12
#define APPLE_IF_FAM_FIREWIRE 13
#define APPLE_IF_FAM_BOND 14
#endif
#define IF_MINMTU 72
#define IF_MAXMTU 65535
#define IFNAMSIZ 16
struct net_event_data {
u_int32_t if_family;
u_int32_t if_unit;
char if_name[IFNAMSIZ];
};
#if defined(__LP64__)
#define __need_struct_timeval32
#include <sys/_structs.h>
#define IF_DATA_TIMEVAL timeval32
#else
#define IF_DATA_TIMEVAL timeval
#endif
#pragma pack(4)
struct if_data {
u_char ifi_type;
u_char ifi_typelen;
u_char ifi_physical;
u_char ifi_addrlen;
u_char ifi_hdrlen;
u_char ifi_recvquota;
u_char ifi_xmitquota;
u_char ifi_unused1;
u_int32_t ifi_mtu;
u_int32_t ifi_metric;
u_int32_t ifi_baudrate;
u_int32_t ifi_ipackets;
u_int32_t ifi_ierrors;
u_int32_t ifi_opackets;
u_int32_t ifi_oerrors;
u_int32_t ifi_collisions;
u_int32_t ifi_ibytes;
u_int32_t ifi_obytes;
u_int32_t ifi_imcasts;
u_int32_t ifi_omcasts;
u_int32_t ifi_iqdrops;
u_int32_t ifi_noproto;
u_int32_t ifi_recvtiming;
u_int32_t ifi_xmittiming;
struct IF_DATA_TIMEVAL ifi_lastchange;
u_int32_t ifi_unused2;
u_int32_t ifi_hwassist;
u_int32_t ifi_reserved1;
u_int32_t ifi_reserved2;
};
struct if_data64 {
u_char ifi_type;
u_char ifi_typelen;
u_char ifi_physical;
u_char ifi_addrlen;
u_char ifi_hdrlen;
u_char ifi_recvquota;
u_char ifi_xmitquota;
u_char ifi_unused1;
u_int32_t ifi_mtu;
u_int32_t ifi_metric;
u_int64_t ifi_baudrate;
u_int64_t ifi_ipackets;
u_int64_t ifi_ierrors;
u_int64_t ifi_opackets;
u_int64_t ifi_oerrors;
u_int64_t ifi_collisions;
u_int64_t ifi_ibytes;
u_int64_t ifi_obytes;
u_int64_t ifi_imcasts;
u_int64_t ifi_omcasts;
u_int64_t ifi_iqdrops;
u_int64_t ifi_noproto;
u_int32_t ifi_recvtiming;
u_int32_t ifi_xmittiming;
struct IF_DATA_TIMEVAL ifi_lastchange;
};
#pragma pack()
#ifdef PRIVATE
struct if_data_internal {
u_char ifi_type;
u_char ifi_typelen;
u_char ifi_physical;
u_char ifi_addrlen;
u_char ifi_hdrlen;
u_char ifi_recvquota;
u_char ifi_xmitquota;
u_char ifi_unused1;
u_int32_t ifi_mtu;
u_int32_t ifi_metric;
u_int32_t ifi_baudrate;
u_int64_t ifi_ipackets;
u_int64_t ifi_ierrors;
u_int64_t ifi_opackets;
u_int64_t ifi_oerrors;
u_int64_t ifi_collisions;
u_int64_t ifi_ibytes;
u_int64_t ifi_obytes;
u_int64_t ifi_imcasts;
u_int64_t ifi_omcasts;
u_int64_t ifi_iqdrops;
u_int64_t ifi_noproto;
u_int32_t ifi_recvtiming;
u_int32_t ifi_xmittiming;
#define IF_LASTCHANGEUPTIME 1
struct timeval ifi_lastchange;
u_int32_t ifi_hwassist;
};
#define if_mtu if_data.ifi_mtu
#define if_type if_data.ifi_type
#define if_typelen if_data.ifi_typelen
#define if_physical if_data.ifi_physical
#define if_addrlen if_data.ifi_addrlen
#define if_hdrlen if_data.ifi_hdrlen
#define if_metric if_data.ifi_metric
#define if_baudrate if_data.ifi_baudrate
#define if_hwassist if_data.ifi_hwassist
#define if_ipackets if_data.ifi_ipackets
#define if_ierrors if_data.ifi_ierrors
#define if_opackets if_data.ifi_opackets
#define if_oerrors if_data.ifi_oerrors
#define if_collisions if_data.ifi_collisions
#define if_ibytes if_data.ifi_ibytes
#define if_obytes if_data.ifi_obytes
#define if_imcasts if_data.ifi_imcasts
#define if_omcasts if_data.ifi_omcasts
#define if_iqdrops if_data.ifi_iqdrops
#define if_noproto if_data.ifi_noproto
#define if_lastchange if_data.ifi_lastchange
#define if_recvquota if_data.ifi_recvquota
#define if_xmitquota if_data.ifi_xmitquota
#define if_iflags if_data.ifi_iflags
struct mbuf;
struct ifaddr;
TAILQ_HEAD(ifnethead, ifnet);
TAILQ_HEAD(ifaddrhead, ifaddr);
TAILQ_HEAD(ifprefixhead, ifprefix);
LIST_HEAD(ifmultihead, ifmultiaddr);
struct tqdummy;
TAILQ_HEAD(tailq_head, tqdummy);
struct proc;
struct rtentry;
struct socket;
struct ether_header;
struct sockaddr_dl;
struct ifnet_filter;
TAILQ_HEAD(ifnet_filter_head, ifnet_filter);
TAILQ_HEAD(ddesc_head_name, dlil_demux_desc);
#define IF_HWASSIST_CSUM_IP 0x0001
#define IF_HWASSIST_CSUM_TCP 0x0002
#define IF_HWASSIST_CSUM_UDP 0x0004
#define IF_HWASSIST_CSUM_IP_FRAGS 0x0008
#define IF_HWASSIST_CSUM_FRAGMENT 0x0010
#define IF_HWASSIST_CSUM_TCP_SUM16 0x1000
#define IF_HWASSIST_CSUM_MASK 0xffff
#define IF_HWASSIST_CSUM_FLAGS(hwassist) ((hwassist) & IF_HWASSIST_CSUM_MASK)
#define IF_HWASSIST_VLAN_TAGGING 0x10000
#define IF_HWASSIST_VLAN_MTU 0x20000
#define IFNET_RW_LOCK 1
#endif
struct ifqueue {
void *ifq_head;
void *ifq_tail;
int ifq_len;
int ifq_maxlen;
int ifq_drops;
};
#ifdef PRIVATE
struct ddesc_head_str;
struct proto_hash_entry;
struct kev_msg;
struct dlil_threading_info;
struct ifnet {
void *if_softc;
const char *if_name;
TAILQ_ENTRY(ifnet) if_link;
struct ifaddrhead if_addrhead;
u_long if_refcnt;
#ifdef __KPI_INTERFACE__
ifnet_check_multi if_check_multi;
#else
void* if_check_multi;
#endif __KPI_INTERFACE__
int if_pcount;
struct bpf_if *if_bpf;
u_short if_index;
short if_unit;
short if_timer;
short if_flags;
int if_ipending;
void *if_linkmib;
size_t if_linkmiblen;
struct if_data_internal if_data;
#ifdef BSD_KERNEL_PRIVATE
int if_usecnt;
#else
int refcnt;
#endif
#ifdef __KPI_INTERFACE__
ifnet_output_func if_output;
ifnet_ioctl_func if_ioctl;
ifnet_set_bpf_tap if_set_bpf_tap;
ifnet_detached_func if_free;
ifnet_demux_func if_demux;
ifnet_event_func if_event;
ifnet_framer_func if_framer;
ifnet_family_t if_family;
#else
void* if_output;
void* if_ioctl;
void* if_set_bpf_tap;
void* if_free;
void* if_demux;
void* if_event;
void* if_framer;
u_long if_family;
#endif
struct ifnet_filter_head if_flt_head;
u_long if_delayed_detach;
void *if_private;
long if_eflags;
struct ifmultihead if_multiaddrs;
int if_amcount;
#ifdef __KPI_INTERFACE__
ifnet_add_proto_func if_add_proto;
ifnet_del_proto_func if_del_proto;
#else __KPI_INTERFACE__
void* if_add_proto;
void* if_del_proto;
#endif __KPI_INTERFACE__
struct proto_hash_entry *if_proto_hash;
void *if_kpi_storage;
#if 0
void *unused_was_init;
#else
struct dlil_threading_info *if_input_thread;
#endif
void *unused_was_resolvemulti;
struct ifqueue if_snd;
u_long unused_2[1];
#ifdef __APPLE__
u_long family_cookie;
struct ifprefixhead if_prefixhead;
#ifdef _KERN_LOCKS_H_
#if IFNET_RW_LOCK
lck_rw_t *if_lock;
#else
lck_mtx_t *if_lock;
#endif
#else
void *if_lock;
#endif
#else
struct ifprefixhead if_prefixhead;
#endif
struct {
u_long length;
union {
u_char buffer[8];
u_char *ptr;
} u;
} if_broadcast;
#if CONFIG_MACF_NET
struct label *if_label;
#endif
};
#ifndef __APPLE__
#define if_addrlist if_addrhead
#define if_list if_link
#endif !__APPLE__
#endif
#ifdef KERNEL_PRIVATE
struct if_clone {
LIST_ENTRY(if_clone) ifc_list;
const char *ifc_name;
size_t ifc_namelen;
int ifc_minifs;
int ifc_maxunit;
unsigned char *ifc_units;
int ifc_bmlen;
int (*ifc_create)(struct if_clone *, int);
void (*ifc_destroy)(struct ifnet *);
};
#define IF_CLONE_INITIALIZER(name, create, destroy, minifs, maxunit) \
{ { NULL, NULL }, name, sizeof(name) - 1, minifs, maxunit, NULL, 0, create, destroy }
#define IFI_RECV 1
#define IFI_XMIT 2
#define IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen)
#define IF_DROP(ifq) ((ifq)->ifq_drops++)
#define IF_ENQUEUE(ifq, m) { \
(m)->m_nextpkt = 0; \
if ((ifq)->ifq_tail == 0) \
(ifq)->ifq_head = m; \
else \
((struct mbuf*)(ifq)->ifq_tail)->m_nextpkt = m; \
(ifq)->ifq_tail = m; \
(ifq)->ifq_len++; \
}
#define IF_PREPEND(ifq, m) { \
(m)->m_nextpkt = (ifq)->ifq_head; \
if ((ifq)->ifq_tail == 0) \
(ifq)->ifq_tail = (m); \
(ifq)->ifq_head = (m); \
(ifq)->ifq_len++; \
}
#define IF_DEQUEUE(ifq, m) { \
(m) = (ifq)->ifq_head; \
if (m) { \
if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \
(ifq)->ifq_tail = 0; \
(m)->m_nextpkt = 0; \
(ifq)->ifq_len--; \
} \
}
#define IF_ENQ_DROP(ifq, m) if_enq_drop(ifq, m)
#if defined(__GNUC__) && defined(MT_HEADER)
static __inline int
if_queue_drop(struct ifqueue *ifq, __unused struct mbuf *m)
{
IF_DROP(ifq);
return 0;
}
static __inline int
if_enq_drop(struct ifqueue *ifq, struct mbuf *m)
{
if (IF_QFULL(ifq) &&
!if_queue_drop(ifq, m))
return 0;
IF_ENQUEUE(ifq, m);
return 1;
}
#else
#ifdef MT_HEADER
int if_enq_drop(struct ifqueue *, struct mbuf *);
#endif MT_HEADER
#endif defined(__GNUC__) && defined(MT_HEADER)
#endif
#ifdef PRIVATE
struct ifaddr {
struct sockaddr *ifa_addr;
struct sockaddr *ifa_dstaddr;
#define ifa_broadaddr ifa_dstaddr
struct sockaddr *ifa_netmask;
struct ifnet *ifa_ifp;
TAILQ_ENTRY(ifaddr) ifa_link;
void (*ifa_rtrequest)
(int, struct rtentry *, struct sockaddr *);
u_short ifa_flags;
int ifa_refcnt;
int ifa_metric;
#ifdef notdef
struct rtentry *ifa_rt;
#endif
int (*ifa_claim_addr)
(struct ifaddr *, const struct sockaddr *);
u_long ifa_debug;
};
#define IFA_ROUTE RTF_UP
#define IFA_CLONING RTF_CLONING
#define IFA_ATTACHED 0x1
#endif
#ifdef KERNEL_PRIVATE
struct ifprefix {
struct sockaddr *ifpr_prefix;
struct ifnet *ifpr_ifp;
TAILQ_ENTRY(ifprefix) ifpr_list;
u_char ifpr_plen;
u_char ifpr_type;
};
#endif
#ifdef PRIVATE
typedef void (*ifma_protospec_free_func)(void* ifma_protospec);
struct ifmultiaddr {
LIST_ENTRY(ifmultiaddr) ifma_link;
struct sockaddr *ifma_addr;
struct ifmultiaddr *ifma_ll;
struct ifnet *ifma_ifp;
u_int ifma_usecount;
void *ifma_protospec;
int32_t ifma_refcount;
ifma_protospec_free_func ifma_free;
};
#endif
#ifdef KERNEL_PRIVATE
#define IFAREF(ifa) ifaref(ifa)
#define IFAFREE(ifa) ifafree(ifa)
#define ifnet_head ifnet
extern struct ifnethead ifnet_head;
extern struct ifnet **ifindex2ifnet;
extern int ifqmaxlen;
extern ifnet_t lo_ifp;
extern int if_index;
extern struct ifaddr **ifnet_addrs;
int if_addmulti(struct ifnet *, const struct sockaddr *, struct ifmultiaddr **);
int if_allmulti(struct ifnet *, int);
void if_attach(struct ifnet *);
int if_delmultiaddr(struct ifmultiaddr *ifma, int locked);
int if_delmulti(struct ifnet *, const struct sockaddr *);
void if_down(struct ifnet *);
int if_down_all(void);
void if_route(struct ifnet *, int flag, int fam);
void if_unroute(struct ifnet *, int flag, int fam);
void if_up(struct ifnet *);
void if_updown(struct ifnet *ifp, int up);
int ifioctl(struct socket *, u_long, caddr_t, struct proc *);
int ifioctllocked(struct socket *, u_long, caddr_t, struct proc *);
struct ifnet *ifunit(const char *);
struct ifnet *if_withname(struct sockaddr *);
void if_clone_attach(struct if_clone *);
void if_clone_detach(struct if_clone *);
void ifnet_lock_assert(struct ifnet *ifp, int what);
void ifnet_lock_shared(struct ifnet *ifp);
void ifnet_lock_exclusive(struct ifnet *ifp);
void ifnet_lock_done(struct ifnet *ifp);
void ifnet_head_lock_shared(void);
void ifnet_head_lock_exclusive(void);
void ifnet_head_done(void);
void if_attach_ifa(struct ifnet * ifp, struct ifaddr *ifa);
void if_detach_ifa(struct ifnet * ifp, struct ifaddr *ifa);
void ifma_reference(struct ifmultiaddr *ifma);
void ifma_release(struct ifmultiaddr *ifma);
struct ifaddr *ifa_ifwithaddr(const struct sockaddr *);
struct ifaddr *ifa_ifwithdstaddr(const struct sockaddr *);
struct ifaddr *ifa_ifwithnet(const struct sockaddr *);
struct ifaddr *ifa_ifwithroute(int, const struct sockaddr *, const struct sockaddr *);
struct ifaddr *ifa_ifwithroute_locked(int, const struct sockaddr *, const struct sockaddr *);
struct ifaddr *ifaof_ifpforaddr(const struct sockaddr *, struct ifnet *);
struct ifaddr *ifa_ifpgetprimary(struct ifnet *, int);
void ifafree(struct ifaddr *);
void ifaref(struct ifaddr *);
struct ifmultiaddr *ifmaof_ifpforaddr(const struct sockaddr *, struct ifnet *);
int ifa_foraddr(unsigned int addr);
#ifdef BSD_KERNEL_PRIVATE
enum {
kIfNetUseCount_MayBeZero = 0,
kIfNetUseCount_MustNotBeZero = 1
};
int ifp_use(struct ifnet *ifp, int handle_zero);
int ifp_unuse(struct ifnet *ifp);
void ifp_use_reached_zero(struct ifnet *ifp);
void if_data_internal_to_if_data(struct ifnet *ifp, const struct if_data_internal *if_data_int,
struct if_data *if_data);
void if_data_internal_to_if_data64(struct ifnet *ifp, const struct if_data_internal *if_data_int,
struct if_data64 *if_data64);
#endif
#endif
#endif