#ifndef _NET_IF_VAR_H_
#define _NET_IF_VAR_H_
#include <sys/appleapiopts.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/queue.h>
#ifdef KERNEL_PRIVATE
#include <kern/locks.h>
#endif
#ifdef PRIVATE
#include <net/route.h>
#endif
#ifdef KERNEL
#include <net/kpi_interface.h>
#endif
#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;
};
#ifdef PRIVATE
struct if_traffic_class {
u_int64_t ifi_ibkpackets;
u_int64_t ifi_ibkbytes;
u_int64_t ifi_obkpackets;
u_int64_t ifi_obkbytes;
u_int64_t ifi_ivipackets;
u_int64_t ifi_ivibytes;
u_int64_t ifi_ovipackets;
u_int64_t ifi_ovibytes;
u_int64_t ifi_ivopackets;
u_int64_t ifi_ivobytes;
u_int64_t ifi_ovopackets;
u_int64_t ifi_ovobytes;
};
#endif
#pragma pack()
struct ifqueue {
void *ifq_head;
void *ifq_tail;
int ifq_len;
int ifq_maxlen;
int ifq_drops;
};
#ifdef XNU_KERNEL_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_int32_t _pad;
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;
u_int32_t ifi_tso_v4_mtu;
u_int32_t ifi_tso_v6_mtu;
};
#endif
#ifdef PRIVATE
#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
#endif
#ifdef XNU_KERNEL_PRIVATE
#define if_tso_v4_mtu if_data.ifi_tso_v4_mtu
#define if_tso_v6_mtu if_data.ifi_tso_v6_mtu
#endif
#ifdef XNU_KERNEL_PRIVATE
struct proc;
struct rtentry;
struct socket;
struct ifnet_filter;
struct mbuf;
struct ifaddr;
struct tqdummy;
struct proto_hash_entry;
struct dlil_threading_info;
#if PF
struct pfi_kif;
#endif
TAILQ_HEAD(ifnethead, ifnet);
TAILQ_HEAD(ifaddrhead, ifaddr);
TAILQ_HEAD(ifprefixhead, ifprefix);
LIST_HEAD(ifmultihead, ifmultiaddr);
TAILQ_HEAD(tailq_head, tqdummy);
TAILQ_HEAD(ifnet_filter_head, ifnet_filter);
TAILQ_HEAD(ddesc_head_name, dlil_demux_desc);
#endif
#ifdef PRIVATE
#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_TCPIPV6 0x0020
#define IF_HWASSIST_CSUM_UDPIPV6 0x0040
#define IF_HWASSIST_CSUM_FRAGMENT_IPV6 0x0080
#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 0x00010000
#define IF_HWASSIST_VLAN_MTU 0x00020000
#define IF_HWASSIST_TSO_V4 0x00200000
#define IF_HWASSIST_TSO_V6 0x00400000
#endif
#ifdef XNU_KERNEL_PRIVATE
#include <sys/tree.h>
#include <netinet/in.h>
RB_HEAD(ll_reach_tree, if_llreach);
struct ifnet {
decl_lck_rw_data(, if_lock);
void *if_softc;
const char *if_name;
TAILQ_ENTRY(ifnet) if_link;
TAILQ_ENTRY(ifnet) if_detaching_link;
decl_lck_mtx_data(, if_ref_lock)
u_int32_t if_refflags;
u_int32_t if_refio;
#define if_list if_link
struct ifaddrhead if_addrhead;
#define if_addrlist if_addrhead
struct ifaddr *if_lladdr;
int if_pcount;
struct bpf_if *if_bpf;
u_short if_index;
short if_unit;
short if_timer;
short if_flags;
u_int32_t if_eflags;
int if_capabilities;
int if_capenable;
void *if_linkmib;
size_t if_linkmiblen;
struct if_data_internal if_data __attribute__((aligned(8)));
ifnet_family_t if_family;
uintptr_t if_family_cookie;
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_add_proto_func if_add_proto;
ifnet_del_proto_func if_del_proto;
ifnet_check_multi if_check_multi;
struct proto_hash_entry *if_proto_hash;
void *if_kpi_storage;
decl_lck_mtx_data(, if_flt_lock)
u_int32_t if_flt_busy;
u_int32_t if_flt_waiters;
struct ifnet_filter_head if_flt_head;
struct ifmultihead if_multiaddrs;
u_int32_t if_updatemcasts;
int if_amcount;
decl_lck_mtx_data(, if_addrconfig_lock);
struct in_multi *if_allhostsinm;
struct dlil_threading_info *if_input_thread;
struct ifqueue if_snd;
struct ifprefixhead if_prefixhead;
struct {
u_int32_t length;
union {
u_char buffer[8];
u_char *ptr;
} u;
} if_broadcast;
#if CONFIG_MACF_NET
struct label *if_label;
#endif
u_int32_t if_wake_properties;
#if PF
struct thread *if_pf_curthread;
struct pfi_kif *if_pf_kif;
#endif
decl_lck_mtx_data(, if_cached_route_lock);
u_int32_t if_fwd_cacheok;
struct route if_fwd_route;
struct route if_src_route;
struct route_in6 if_src_route6;
decl_lck_rw_data(, if_llreach_lock);
struct ll_reach_tree if_ll_srcs;
void *if_bridge;
u_int32_t if_want_aggressive_drain;
u_int32_t if_idle_flags;
u_int32_t if_idle_new_flags;
u_int32_t if_idle_new_flags_mask;
u_int32_t if_route_refcnt;
struct if_traffic_class if_tc __attribute__((aligned(8)));
#if INET
struct igmp_ifinfo *if_igi;
#endif
#if INET6
struct mld_ifinfo *if_mli;
#endif
};
#define IFRF_ATTACHED 0x1
#define IFRF_DETACHING 0x2
struct if_clone {
LIST_ENTRY(if_clone) ifc_list;
const char *ifc_name;
size_t ifc_namelen;
u_int32_t ifc_minifs;
u_int32_t ifc_maxunit;
unsigned char *ifc_units;
u_int32_t ifc_bmlen;
int (*ifc_create)(struct if_clone *, u_int32_t, void *);
int (*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 M_CLONE M_IFADDR
#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 = NULL; \
if ((ifq)->ifq_tail == NULL) \
(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 == NULL) \
(ifq)->ifq_tail = (m); \
(ifq)->ifq_head = (m); \
(ifq)->ifq_len++; \
}
#define IF_DEQUEUE(ifq, m) { \
(m) = (ifq)->ifq_head; \
if (m != NULL) { \
if (((ifq)->ifq_head = (m)->m_nextpkt) == NULL) \
(ifq)->ifq_tail = NULL; \
(m)->m_nextpkt = NULL; \
(ifq)->ifq_len--; \
} \
}
#define IF_REMQUEUE(ifq, m) { \
struct mbuf *_p = (ifq)->ifq_head; \
struct mbuf *_n = (m)->m_nextpkt; \
if ((m) == _p) \
_p = NULL; \
while (_p != NULL) { \
if (_p->m_nextpkt == (m)) \
break; \
_p = _p->m_nextpkt; \
} \
VERIFY(_p != NULL || ((m) == (ifq)->ifq_head)); \
if ((m) == (ifq)->ifq_head) \
(ifq)->ifq_head = _n; \
if ((m) == (ifq)->ifq_tail) \
(ifq)->ifq_tail = _p; \
VERIFY((ifq)->ifq_tail != NULL || (ifq)->ifq_head == NULL); \
VERIFY((ifq)->ifq_len != 0); \
--(ifq)->ifq_len; \
if (_p != NULL) \
_p->m_nextpkt = _n; \
(m)->m_nextpkt = NULL; \
}
#define IF_DRAIN(ifq) do { \
struct mbuf *m; \
for (;;) { \
IF_DEQUEUE(ifq, m); \
if (m == NULL) \
break; \
m_freem(m); \
} \
} while (0)
struct ifaddr {
decl_lck_mtx_data(, ifa_lock);
uint32_t ifa_refcnt;
uint32_t ifa_debug;
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 *);
uint32_t ifa_flags;
int32_t ifa_metric;
void (*ifa_free)(struct ifaddr *);
void (*ifa_trace)
(struct ifaddr *, int);
void (*ifa_attached)(struct ifaddr *);
void (*ifa_detached)(struct ifaddr *);
};
#define IFA_ROUTE RTF_UP
#define IFA_CLONING RTF_CLONING
#define IFD_ATTACHED 0x1
#define IFD_ALLOC 0x2
#define IFD_DEBUG 0x4
#define IFD_LINK 0x8
#define IFD_TRASHED 0x10
#define IFD_SKIP 0x20
#define IFD_NOTREADY 0x40
#define IFA_LOCK_ASSERT_HELD(_ifa) \
lck_mtx_assert(&(_ifa)->ifa_lock, LCK_MTX_ASSERT_OWNED)
#define IFA_LOCK_ASSERT_NOTHELD(_ifa) \
lck_mtx_assert(&(_ifa)->ifa_lock, LCK_MTX_ASSERT_NOTOWNED)
#define IFA_LOCK(_ifa) \
lck_mtx_lock(&(_ifa)->ifa_lock)
#define IFA_LOCK_SPIN(_ifa) \
lck_mtx_lock_spin(&(_ifa)->ifa_lock)
#define IFA_CONVERT_LOCK(_ifa) do { \
IFA_LOCK_ASSERT_HELD(_ifa); \
lck_mtx_convert_spin(&(_ifa)->ifa_lock); \
} while (0)
#define IFA_UNLOCK(_ifa) \
lck_mtx_unlock(&(_ifa)->ifa_lock)
#define IFA_ADDREF(_ifa) \
ifa_addref(_ifa, 0)
#define IFA_ADDREF_LOCKED(_ifa) \
ifa_addref(_ifa, 1)
#define IFA_REMREF(_ifa) do { \
(void) ifa_remref(_ifa, 0); \
} while (0)
#define IFA_REMREF_LOCKED(_ifa) \
ifa_remref(_ifa, 1)
struct ifprefix {
struct sockaddr *ifpr_prefix;
struct ifnet *ifpr_ifp;
TAILQ_ENTRY(ifprefix) ifpr_list;
u_char ifpr_plen;
u_char ifpr_type;
};
struct ifmultiaddr {
decl_lck_mtx_data(, ifma_lock);
u_int32_t ifma_refcount;
u_int32_t ifma_anoncnt;
u_int32_t ifma_reqcnt;
u_int32_t ifma_debug;
u_int32_t ifma_flags;
LIST_ENTRY(ifmultiaddr) ifma_link;
struct sockaddr *ifma_addr;
struct ifmultiaddr *ifma_ll;
struct ifnet *ifma_ifp;
void *ifma_protospec;
void (*ifma_trace)
(struct ifmultiaddr *, int);
};
#define IFMAF_ANONYMOUS 0x1
#define IFMA_LOCK_ASSERT_HELD(_ifma) \
lck_mtx_assert(&(_ifma)->ifma_lock, LCK_MTX_ASSERT_OWNED)
#define IFMA_LOCK_ASSERT_NOTHELD(_ifma) \
lck_mtx_assert(&(_ifma)->ifma_lock, LCK_MTX_ASSERT_NOTOWNED)
#define IFMA_LOCK(_ifma) \
lck_mtx_lock(&(_ifma)->ifma_lock)
#define IFMA_LOCK_SPIN(_ifma) \
lck_mtx_lock_spin(&(_ifma)->ifma_lock)
#define IFMA_CONVERT_LOCK(_ifma) do { \
IFMA_LOCK_ASSERT_HELD(_ifma); \
lck_mtx_convert_spin(&(_ifma)->ifma_lock); \
} while (0)
#define IFMA_UNLOCK(_ifma) \
lck_mtx_unlock(&(_ifma)->ifma_lock)
#define IFMA_ADDREF(_ifma) \
ifma_addref(_ifma, 0)
#define IFMA_ADDREF_LOCKED(_ifma) \
ifma_addref(_ifma, 1)
#define IFMA_REMREF(_ifma) \
ifma_remref(_ifma)
__private_extern__ struct ifnethead ifnet_head;
__private_extern__ struct ifnet **ifindex2ifnet;
__private_extern__ int ifqmaxlen;
__private_extern__ int if_index;
__private_extern__ struct ifaddr **ifnet_addrs;
__private_extern__ lck_attr_t *ifa_mtx_attr;
__private_extern__ lck_grp_t *ifa_mtx_grp;
__private_extern__ lck_grp_t *ifnet_lock_group;
__private_extern__ lck_attr_t *ifnet_lock_attr;
extern ifnet_t lo_ifp;
extern int if_addmulti(struct ifnet *, const struct sockaddr *,
struct ifmultiaddr **);
extern int if_addmulti_anon(struct ifnet *, const struct sockaddr *,
struct ifmultiaddr **);
extern int if_allmulti(struct ifnet *, int);
extern int if_delmulti(struct ifnet *, const struct sockaddr *);
extern int if_delmulti_ifma(struct ifmultiaddr *);
extern int if_delmulti_anon(struct ifnet *, const struct sockaddr *);
extern void if_down(struct ifnet *);
extern int if_down_all(void);
extern void if_up(struct ifnet *);
__private_extern__ void if_updown(struct ifnet *ifp, int up);
extern int ifioctl(struct socket *, u_long, caddr_t, struct proc *);
extern int ifioctllocked(struct socket *, u_long, caddr_t, struct proc *);
extern struct ifnet *ifunit(const char *);
extern struct ifnet *if_withname(struct sockaddr *);
extern struct if_clone *if_clone_lookup(const char *, u_int32_t *);
extern int if_clone_attach(struct if_clone *);
extern void if_clone_detach(struct if_clone *);
extern errno_t if_mcasts_update(struct ifnet *);
typedef enum {
IFNET_LCK_ASSERT_EXCLUSIVE,
IFNET_LCK_ASSERT_SHARED,
IFNET_LCK_ASSERT_OWNED,
IFNET_LCK_ASSERT_NOTOWNED
} ifnet_lock_assert_t;
__private_extern__ void ifnet_lock_assert(struct ifnet *, ifnet_lock_assert_t);
__private_extern__ void ifnet_lock_shared(struct ifnet *ifp);
__private_extern__ void ifnet_lock_exclusive(struct ifnet *ifp);
__private_extern__ void ifnet_lock_done(struct ifnet *ifp);
__private_extern__ void ifnet_head_lock_shared(void);
__private_extern__ void ifnet_head_lock_exclusive(void);
__private_extern__ void ifnet_head_done(void);
__private_extern__ errno_t ifnet_set_idle_flags_locked(ifnet_t, u_int32_t,
u_int32_t);
__private_extern__ int ifnet_is_attached(struct ifnet *, int refio);
__private_extern__ void ifnet_decr_iorefcnt(struct ifnet *);
__private_extern__ void if_attach_ifa(struct ifnet *, struct ifaddr *);
__private_extern__ void if_attach_link_ifa(struct ifnet *, struct ifaddr *);
__private_extern__ void if_detach_ifa(struct ifnet *, struct ifaddr *);
__private_extern__ void if_detach_link_ifa(struct ifnet *, struct ifaddr *);
extern struct ifaddr *ifa_ifwithaddr(const struct sockaddr *);
extern struct ifaddr *ifa_ifwithaddr_scoped(const struct sockaddr *, unsigned int);
extern struct ifaddr *ifa_ifwithdstaddr(const struct sockaddr *);
extern struct ifaddr *ifa_ifwithnet(const struct sockaddr *);
extern struct ifaddr *ifa_ifwithnet_scoped(const struct sockaddr *, unsigned int);
extern struct ifaddr *ifa_ifwithroute(int, const struct sockaddr *,
const struct sockaddr *);
extern struct ifaddr *ifa_ifwithroute_locked(int, const struct sockaddr *, const struct sockaddr *);
extern struct ifaddr *ifa_ifwithroute_scoped_locked(int, const struct sockaddr *,
const struct sockaddr *, unsigned int);
extern struct ifaddr *ifaof_ifpforaddr(const struct sockaddr *, struct ifnet *);
__private_extern__ struct ifaddr *ifa_ifpgetprimary(struct ifnet *, int);
extern void ifa_addref(struct ifaddr *, int);
extern struct ifaddr *ifa_remref(struct ifaddr *, int);
extern void ifa_lock_init(struct ifaddr *);
extern void ifa_lock_destroy(struct ifaddr *);
extern void ifma_addref(struct ifmultiaddr *, int);
extern void ifma_remref(struct ifmultiaddr *);
extern void ifa_init(void);
__private_extern__ struct in_ifaddr *ifa_foraddr(unsigned int);
__private_extern__ struct in_ifaddr *ifa_foraddr_scoped(unsigned int,
unsigned int);
#if INET6
struct in6_addr;
__private_extern__ struct in6_ifaddr *ifa_foraddr6(struct in6_addr *);
__private_extern__ struct in6_ifaddr *ifa_foraddr6_scoped(struct in6_addr *,
unsigned int);
#endif
__private_extern__ void if_data_internal_to_if_data(struct ifnet *ifp,
const struct if_data_internal *if_data_int, struct if_data *if_data);
__private_extern__ void if_data_internal_to_if_data64(struct ifnet *ifp,
const struct if_data_internal *if_data_int, struct if_data64 *if_data64);
__private_extern__ void if_copy_traffic_class(struct ifnet *ifp,
struct if_traffic_class *if_tc);
__private_extern__ struct rtentry *ifnet_cached_rtlookup_inet(struct ifnet *,
struct in_addr);
#if INET6
__private_extern__ struct rtentry *ifnet_cached_rtlookup_inet6(struct ifnet *,
struct in6_addr *);
#endif
#endif
#endif