-#ifdef KERNEL
-#define IFAREF(ifa) ifaref(ifa)
-#define IFAFREE(ifa) ifafree(ifa)
-
-#ifdef __APPLE_API_PRIVATE
-extern struct ifnethead ifnet;
-extern struct ifnet **ifindex2ifnet;
-extern int ifqmaxlen;
-extern struct ifnet loif[];
-extern int if_index;
-extern struct ifaddr **ifnet_addrs;
-#endif /* __APPLE_API_PRIVATE */
-
-#ifndef __APPLE__
-void ether_ifattach __P((struct ifnet *, int));
-void ether_ifdetach __P((struct ifnet *, int));
-void ether_input __P((struct ifnet *, struct ether_header *, struct mbuf *));
-void ether_demux __P((struct ifnet *, struct ether_header *, struct mbuf *));
-int ether_output __P((struct ifnet *,
- struct mbuf *, struct sockaddr *, struct rtentry *));
-int ether_output_frame __P((struct ifnet *, struct mbuf *));
-int ether_ioctl __P((struct ifnet *, int, caddr_t));
-#endif
-
-int if_addmulti __P((struct ifnet *, struct sockaddr *,
- struct ifmultiaddr **));
-int if_allmulti __P((struct ifnet *, int));
-void if_attach __P((struct ifnet *));
-int if_delmultiaddr __P((struct ifmultiaddr *ifma));
-int if_delmulti __P((struct ifnet *, struct sockaddr *));
-void if_down __P((struct ifnet *));
-void if_route __P((struct ifnet *, int flag, int fam));
-void if_unroute __P((struct ifnet *, int flag, int fam));
-void if_up __P((struct ifnet *));
-/*void ifinit __P((void));*/ /* declared in systm.h for main() */
-int ifioctl __P((struct socket *, u_long, caddr_t, struct proc *));
-int ifpromisc __P((struct ifnet *, int));
-struct ifnet *ifunit __P((const char *));
-struct ifnet *if_withname __P((struct sockaddr *));
-
-int if_poll_recv_slow __P((struct ifnet *ifp, int *quotap));
-void if_poll_xmit_slow __P((struct ifnet *ifp, int *quotap));
-void if_poll_throttle __P((void));
-void if_poll_unthrottle __P((void *));
-void if_poll_init __P((void));
-void if_poll __P((void));
-#ifdef KERNEL_PRIVATE
-void if_clone_attach(struct if_clone *);
-void if_clone_detach(struct if_clone *);
-#endif KERNEL_PRIVATE
-
-struct ifaddr *ifa_ifwithaddr __P((struct sockaddr *));
-struct ifaddr *ifa_ifwithdstaddr __P((struct sockaddr *));
-struct ifaddr *ifa_ifwithnet __P((struct sockaddr *));
-struct ifaddr *ifa_ifwithroute __P((int, struct sockaddr *,
- struct sockaddr *));
-struct ifaddr *ifaof_ifpforaddr __P((struct sockaddr *, struct ifnet *));
-void ifafree __P((struct ifaddr *));
-void ifaref __P((struct ifaddr *));
-
-struct ifmultiaddr *ifmaof_ifpforaddr __P((struct sockaddr *,
- struct ifnet *));
-#ifndef __APPLE__
-int if_simloop __P((struct ifnet *ifp, struct mbuf *m,
- struct sockaddr *dst, int hlen));
-#endif
-
-#endif /* KERNEL */
-
-
-#endif /* __APPLE_API_UNSTABLE */
+/*
+ * Values for ifma_flags
+ */
+#define IFMAF_ANONYMOUS 0x1 /* has anonymous request ref(s) held */
+
+#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, /* RW: held as writer */
+ IFNET_LCK_ASSERT_SHARED, /* RW: held as reader */
+ IFNET_LCK_ASSERT_OWNED, /* RW: writer/reader, MTX: held */
+ IFNET_LCK_ASSERT_NOTOWNED /* not held */
+} 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 /* INET6 */
+
+__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 /* INET6 */
+
+#endif /* XNU_KERNEL_PRIVATE */