X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/d7e50217d7adf6e52786a38bcaa4cd698cb9a79e..7e4a7d3939db04e70062ae6c7bf24b8c8b2f5a7c:/bsd/net/if_var.h diff --git a/bsd/net/if_var.h b/bsd/net/if_var.h index 2c69ea514..67d52d0a2 100644 --- a/bsd/net/if_var.h +++ b/bsd/net/if_var.h @@ -1,16 +1,19 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2008 Apple Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ - * - * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER @@ -20,7 +23,7 @@ * Please see the License for the specific language governing rights and * limitations under the License. * - * @APPLE_LICENSE_HEADER_END@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* * Copyright (c) 1982, 1986, 1989, 1993 @@ -60,7 +63,22 @@ #ifndef _NET_IF_VAR_H_ #define _NET_IF_VAR_H_ + #include +#include +#include +#include +#include /* get TAILQ macros */ +#ifdef KERNEL_PRIVATE +#include +#endif /* KERNEL_PRIVATE */ +#ifdef PRIVATE +#include +#endif + +#ifdef KERNEL +#include +#endif /* KERNEL */ #ifdef __APPLE__ #define APPLE_IF_FAM_LOOPBACK 1 @@ -74,8 +92,17 @@ #define APPLE_IF_FAM_MDECAP 9 #define APPLE_IF_FAM_GIF 10 #define APPLE_IF_FAM_FAITH 11 -#define APPLE_IF_FAM_STF 12 -#endif +#define APPLE_IF_FAM_STF 12 +#define APPLE_IF_FAM_FIREWIRE 13 +#define APPLE_IF_FAM_BOND 14 +#endif /* __APPLE__ */ + +/* + * 72 was chosen below because it is the size of a TCP/IP + * header (40) + the minimum mss (32). + */ +#define IF_MINMTU 72 +#define IF_MAXMTU 65535 /* * Structures defining a network interface, providing a packet @@ -102,102 +129,243 @@ * interfaces. These routines live in the files if.c and route.c */ -#ifdef __STDC__ -/* - * Forward structure declarations for function prototypes [sic]. - */ -struct mbuf; -struct proc; -struct rtentry; -struct socket; -struct ether_header; -struct sockaddr_dl; -#endif - #define IFNAMSIZ 16 -#include /* get TAILQ macros */ - -#ifdef __APPLE_API_UNSTABLE -#ifdef __APPLE__ -struct tqdummy; - -TAILQ_HEAD(tailq_head, tqdummy); - /* This belongs up in socket.h or socketvar.h, depending on how far the * event bubbles up. */ struct net_event_data { - u_long if_family; - u_long if_unit; - char if_name[IFNAMSIZ]; + u_int32_t if_family; + u_int32_t if_unit; + char if_name[IFNAMSIZ]; }; + +#if defined(__LP64__) +#define __need_struct_timeval32 +#include +#define IF_DATA_TIMEVAL timeval32 +#else +#define IF_DATA_TIMEVAL timeval #endif +#pragma pack(4) -TAILQ_HEAD(ifnethead, ifnet); /* we use TAILQs so that the order of */ -TAILQ_HEAD(ifaddrhead, ifaddr); /* instantiation is preserved in the list */ -TAILQ_HEAD(ifprefixhead, ifprefix); -LIST_HEAD(ifmultihead, ifmultiaddr); - -#ifdef __APPLE__ /* * Structure describing information about an interface * which may be of interest to management entities. */ struct if_data { /* generic interface information */ - u_char ifi_type; /* ethernet, tokenring, etc */ -#ifdef __APPLE__ - u_char ifi_typelen; /* Length of frame type id */ -#endif - u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ - u_char ifi_addrlen; /* media address length */ - u_char ifi_hdrlen; /* media header length */ - u_char ifi_recvquota; /* polling quota for receive intrs */ - u_char ifi_xmitquota; /* polling quota for xmit intrs */ - u_long ifi_mtu; /* maximum transmission unit */ - u_long ifi_metric; /* routing metric (external only) */ - u_long ifi_baudrate; /* linespeed */ + u_char ifi_type; /* ethernet, tokenring, etc */ + u_char ifi_typelen; /* Length of frame type id */ + u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ + u_char ifi_addrlen; /* media address length */ + u_char ifi_hdrlen; /* media header length */ + u_char ifi_recvquota; /* polling quota for receive intrs */ + u_char ifi_xmitquota; /* polling quota for xmit intrs */ + u_char ifi_unused1; /* for future use */ + u_int32_t ifi_mtu; /* maximum transmission unit */ + u_int32_t ifi_metric; /* routing metric (external only) */ + u_int32_t ifi_baudrate; /* linespeed */ /* volatile statistics */ - u_long ifi_ipackets; /* packets received on interface */ - u_long ifi_ierrors; /* input errors on interface */ - u_long ifi_opackets; /* packets sent on interface */ - u_long ifi_oerrors; /* output errors on interface */ - u_long ifi_collisions; /* collisions on csma interfaces */ - u_long ifi_ibytes; /* total number of octets received */ - u_long ifi_obytes; /* total number of octets sent */ - u_long ifi_imcasts; /* packets received via multicast */ - u_long ifi_omcasts; /* packets sent via multicast */ - u_long ifi_iqdrops; /* dropped on input, this interface */ - u_long ifi_noproto; /* destined for unsupported protocol */ -#ifdef __APPLE__ - u_long ifi_recvtiming; /* usec spent receiving when timing */ - u_long ifi_xmittiming; /* usec spent xmitting when timing */ -#endif + u_int32_t ifi_ipackets; /* packets received on interface */ + u_int32_t ifi_ierrors; /* input errors on interface */ + u_int32_t ifi_opackets; /* packets sent on interface */ + u_int32_t ifi_oerrors; /* output errors on interface */ + u_int32_t ifi_collisions; /* collisions on csma interfaces */ + u_int32_t ifi_ibytes; /* total number of octets received */ + u_int32_t ifi_obytes; /* total number of octets sent */ + u_int32_t ifi_imcasts; /* packets received via multicast */ + u_int32_t ifi_omcasts; /* packets sent via multicast */ + u_int32_t ifi_iqdrops; /* dropped on input, this interface */ + u_int32_t ifi_noproto; /* destined for unsupported protocol */ + u_int32_t ifi_recvtiming; /* usec spent receiving when timing */ + u_int32_t ifi_xmittiming; /* usec spent xmitting when timing */ + struct IF_DATA_TIMEVAL ifi_lastchange; /* time of last administrative change */ + u_int32_t ifi_unused2; /* used to be the default_proto */ + u_int32_t ifi_hwassist; /* HW offload capabilities */ + u_int32_t ifi_reserved1; /* for future use */ + u_int32_t ifi_reserved2; /* for future use */ +}; + +/* + * Structure describing information about an interface + * which may be of interest to management entities. + */ +struct if_data64 { + /* generic interface information */ + u_char ifi_type; /* ethernet, tokenring, etc */ + u_char ifi_typelen; /* Length of frame type id */ + u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ + u_char ifi_addrlen; /* media address length */ + u_char ifi_hdrlen; /* media header length */ + u_char ifi_recvquota; /* polling quota for receive intrs */ + u_char ifi_xmitquota; /* polling quota for xmit intrs */ + u_char ifi_unused1; /* for future use */ + u_int32_t ifi_mtu; /* maximum transmission unit */ + u_int32_t ifi_metric; /* routing metric (external only) */ + u_int64_t ifi_baudrate; /* linespeed */ + /* volatile statistics */ + u_int64_t ifi_ipackets; /* packets received on interface */ + u_int64_t ifi_ierrors; /* input errors on interface */ + u_int64_t ifi_opackets; /* packets sent on interface */ + u_int64_t ifi_oerrors; /* output errors on interface */ + u_int64_t ifi_collisions; /* collisions on csma interfaces */ + u_int64_t ifi_ibytes; /* total number of octets received */ + u_int64_t ifi_obytes; /* total number of octets sent */ + u_int64_t ifi_imcasts; /* packets received via multicast */ + u_int64_t ifi_omcasts; /* packets sent via multicast */ + u_int64_t ifi_iqdrops; /* dropped on input, this interface */ + u_int64_t ifi_noproto; /* destined for unsupported protocol */ + u_int32_t ifi_recvtiming; /* usec spent receiving when timing */ + u_int32_t ifi_xmittiming; /* usec spent xmitting when timing */ + struct IF_DATA_TIMEVAL ifi_lastchange; /* time of last administrative change */ +}; + +#pragma pack() + +#ifdef PRIVATE +/* + * Internal storage of if_data. This is bound to change. Various places in the + * stack will translate this data structure in to the externally visible + * if_data structure above. + */ +struct if_data_internal { + /* generic interface information */ + u_char ifi_type; /* ethernet, tokenring, etc */ + u_char ifi_typelen; /* Length of frame type id */ + u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ + u_char ifi_addrlen; /* media address length */ + u_char ifi_hdrlen; /* media header length */ + u_char ifi_recvquota; /* polling quota for receive intrs */ + u_char ifi_xmitquota; /* polling quota for xmit intrs */ + u_char ifi_unused1; /* for future use */ + u_int32_t ifi_mtu; /* maximum transmission unit */ + u_int32_t ifi_metric; /* routing metric (external only) */ + u_int32_t ifi_baudrate; /* linespeed */ + /* volatile statistics */ + u_int64_t ifi_ipackets; /* packets received on interface */ + u_int64_t ifi_ierrors; /* input errors on interface */ + u_int64_t ifi_opackets; /* packets sent on interface */ + u_int64_t ifi_oerrors; /* output errors on interface */ + u_int64_t ifi_collisions; /* collisions on csma interfaces */ + u_int64_t ifi_ibytes; /* total number of octets received */ + u_int64_t ifi_obytes; /* total number of octets sent */ + u_int64_t ifi_imcasts; /* packets received via multicast */ + u_int64_t ifi_omcasts; /* packets sent via multicast */ + u_int64_t ifi_iqdrops; /* dropped on input, this interface */ + u_int64_t ifi_noproto; /* destined for unsupported protocol */ + u_int32_t ifi_recvtiming; /* usec spent receiving when timing */ + u_int32_t ifi_xmittiming; /* usec spent xmitting when timing */ +#define IF_LASTCHANGEUPTIME 1 /* lastchange: 1-uptime 0-calendar time */ struct timeval ifi_lastchange; /* time of last administrative change */ -#ifdef __APPLE__ - u_long default_proto; /* Default dl_tag when none is specified - * on dlil_output */ -#endif - u_long ifi_hwassist; /* HW offload capabilities */ - u_long ifi_reserved1; /* for future use */ - u_long ifi_reserved2; /* for future use */ + u_int32_t ifi_hwassist; /* HW offload capabilities */ + u_int32_t ifi_tso_v4_mtu; /* TCP Segment Offload IPv4 maximum segment size */ + u_int32_t ifi_tso_v6_mtu; /* TCP Segment Offload IPv6 maximum segment size */ }; -#endif +#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 +#define if_tso_v4_mtu if_data.ifi_tso_v4_mtu +#define if_tso_v6_mtu if_data.ifi_tso_v6_mtu + +struct mbuf; +struct ifaddr; +TAILQ_HEAD(ifnethead, ifnet); /* we use TAILQs so that the order of */ +TAILQ_HEAD(ifaddrhead, ifaddr); /* instantiation is preserved in the list */ +TAILQ_HEAD(ifprefixhead, ifprefix); +LIST_HEAD(ifmultihead, ifmultiaddr); +struct tqdummy; +TAILQ_HEAD(tailq_head, tqdummy); + +/* + * Forward structure declarations for function prototypes [sic]. + */ +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); + +/* All of the following IF_HWASSIST_* flags are defined + * in kpi_inteface.h as IFNET_* flags. These are redefined + * here as constants to avoid failures to build user level + * programs that can not include kpi_interface.h. It is + * important to keep this in sync with the definitions in + * kpi_interface.h. The corresponding constant for each + * definition is mentioned in the comment. + * + * Bottom 16 bits reserved for hardware checksum + */ +#define IF_HWASSIST_CSUM_IP 0x0001 /* will csum IP, IFNET_CSUM_IP */ +#define IF_HWASSIST_CSUM_TCP 0x0002 /* will csum TCP, IFNET_CSUM_TCP */ +#define IF_HWASSIST_CSUM_UDP 0x0004 /* will csum UDP, IFNET_CSUM_UDP */ +#define IF_HWASSIST_CSUM_IP_FRAGS 0x0008 /* will csum IP fragments, IFNET_CSUM_FRAGMENT */ +#define IF_HWASSIST_CSUM_FRAGMENT 0x0010 /* will do IP fragmentation, IFNET_IP_FRAGMENT */ +#define IF_HWASSIST_CSUM_TCP_SUM16 0x1000 /* simple TCP Sum16 computation, IFNET_CSUM_SUM16 */ +#define IF_HWASSIST_CSUM_MASK 0xffff +#define IF_HWASSIST_CSUM_FLAGS(hwassist) ((hwassist) & IF_HWASSIST_CSUM_MASK) + +/* VLAN support */ +#define IF_HWASSIST_VLAN_TAGGING 0x00010000 /* supports VLAN tagging, IFNET_VLAN_TAGGING */ +#define IF_HWASSIST_VLAN_MTU 0x00020000 /* supports VLAN MTU-sized packet (for software VLAN), IFNET_VLAN_MTU */ + +/* TCP Segment Offloading support */ + +#define IF_HWASSIST_TSO_V4 0x00200000 /* will do TCP Segment offload for IPv4, IFNET_TSO_IPV4 */ +#define IF_HWASSIST_TSO_V6 0x00400000 /* will do TCP Segment offload for IPv6, IFNET_TSO_IPV6 */ + +#define IFNET_RW_LOCK 1 + +#endif /* PRIVATE */ /* * Structure defining a queue for a network interface. */ struct ifqueue { - struct mbuf *ifq_head; - struct mbuf *ifq_tail; + 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; +#if PF +struct pfi_kif; +#endif /* PF */ + /* * Structure defining a network interface. * @@ -205,13 +373,16 @@ struct ifqueue { */ struct ifnet { void *if_softc; /* pointer to driver state */ - char *if_name; /* name, e.g. ``en'' or ``lo'' */ + const char *if_name; /* name, e.g. ``en'' or ``lo'' */ TAILQ_ENTRY(ifnet) if_link; /* all struct ifnets are chained */ struct ifaddrhead if_addrhead; /* linked list of addresses per if */ -#ifdef __APPLE__ - struct tailq_head proto_head; /* Head for if_proto structures */ -#endif - int if_pcount; /* number of promiscuous listeners */ + u_int32_t if_refcnt; +#ifdef __KPI_INTERFACE__ + ifnet_check_multi if_check_multi; +#else + void* if_check_multi; +#endif /* __KPI_INTERFACE__ */ + int if_pcount; /* number of promiscuous listeners */ struct bpf_if *if_bpf; /* packet filter structure */ u_short if_index; /* numeric abbreviation for this if */ short if_unit; /* sub-unit for lower level driver */ @@ -220,108 +391,132 @@ struct ifnet { int if_ipending; /* interrupts pending */ void *if_linkmib; /* link-type-specific MIB data */ size_t if_linkmiblen; /* length of above data */ - struct if_data if_data; + struct if_data_internal if_data; -#ifdef __APPLE__ /* New with DLIL */ +#ifdef BSD_KERNEL_PRIVATE + int if_usecnt; +#else int refcnt; - int offercnt; - int (*if_output)(struct ifnet *ifnet_ptr, struct mbuf *m); - int (*if_ioctl)(struct ifnet *ifnet_ptr, u_long ioctl_code, void *ioctl_arg); - int (*if_set_bpf_tap)(struct ifnet *ifp, int mode, - int (*bpf_callback)(struct ifnet *, struct mbuf *)); - int (*if_free)(struct ifnet *ifnet_ptr); - int (*if_demux)(struct ifnet *ifnet_ptr, struct mbuf *mbuf_ptr, - char *frame_ptr, void *if_proto_ptr); - - int (*if_event)(struct ifnet *ifnet_ptr, caddr_t event_ptr); - - int (*if_framer)(struct ifnet *ifp, - struct mbuf **m, - struct sockaddr *dest, - char *dest_linkaddr, - char *frame_type); - - u_long if_family; /* ulong assigned by Apple */ - struct tailq_head if_flt_head; +#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; /* value assigned by Apple */ +#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_int32_t if_family; /* value assigned by Apple */ +#endif + + struct ifnet_filter_head if_flt_head; /* End DLIL specific */ - void *reserved0; /* for future use */ + u_int32_t if_delayed_detach; /* need to perform delayed detach */ void *if_private; /* private to interface */ long if_eflags; /* autoaddr, autoaddr done, etc. */ -#endif /* __APPLE__ */ struct ifmultihead if_multiaddrs; /* multicast addresses configured */ int if_amcount; /* number of all-multicast requests */ /* procedure handles */ -#ifndef __APPLE__ - int (*if_output) /* output routine (enqueue) */ - __P((struct ifnet *, struct mbuf *, struct sockaddr *, - struct rtentry *)); - void (*if_start) /* initiate output routine */ - __P((struct ifnet *)); - int (*if_done) /* output complete routine */ - __P((struct ifnet *)); /* (XXX not used; fake prototype) */ - int (*if_ioctl) /* ioctl routine */ - __P((struct ifnet *, u_long, caddr_t)); - void (*if_watchdog) /* timer routine */ - __P((struct ifnet *)); +#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 - int (*if_poll_recv) /* polled receive routine */ - __P((struct ifnet *, int *)); - int (*if_poll_xmit) /* polled transmit routine */ - __P((struct ifnet *, int *)); - void (*if_poll_intren) /* polled interrupt reenable routine */ - __P((struct ifnet *)); - void (*if_poll_slowinput) /* input routine for slow devices */ - __P((struct ifnet *, struct mbuf *)); - void (*if_init) /* Init routine */ - __P((void *)); - int (*if_resolvemulti) /* validate/resolve multicast */ - __P((struct ifnet *, struct sockaddr **, struct sockaddr *)); - struct ifqueue if_snd; /* output queue */ - struct ifqueue *if_poll_slowq; /* input queue for slow devices */ + void *unused_was_resolvemulti; + + struct ifqueue if_snd; + u_int32_t unused_2[1]; #ifdef __APPLE__ - u_long family_cookie; + uintptr_t family_cookie; struct ifprefixhead if_prefixhead; /* list of prefixes per if */ - void *reserved1; /* for future use */ + +#ifdef _KERN_LOCKS_H_ +#if IFNET_RW_LOCK + lck_rw_t *if_lock; /* Lock to protect this interface */ +#else + lck_mtx_t *if_lock; /* Lock to protect this interface */ +#endif +#else + void *if_lock; +#endif + #else struct ifprefixhead if_prefixhead; /* list of prefixes per if */ #endif /* __APPLE__ */ -}; -typedef void if_init_f_t __P((void *)); + struct { + u_int32_t length; + union { + u_char buffer[8]; + u_char *ptr; + } u; + } if_broadcast; +#if CONFIG_MACF_NET + struct label *if_label; /* interface MAC label */ +#endif -#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_rawoutput(if, m, sa) if_output(if, m, sa, (struct rtentry *)0) + u_int32_t if_wake_properties; +#if PF + struct thread *if_pf_curthread; + struct pfi_kif *if_pf_kif; +#endif /* PF */ +#ifdef _KERN_LOCKS_H_ + lck_mtx_t *if_fwd_route_lock; +#else + void *if_fwd_route_lock; +#endif + struct route if_fwd_route; /* cached IPv4 forwarding route */ +}; #ifndef __APPLE__ /* for compatibility with other BSDs */ #define if_addrlist if_addrhead #define if_list if_link -#endif +#endif /* !__APPLE__ */ + + +#endif /* PRIVATE */ + +#ifdef KERNEL_PRIVATE +/* + * 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. `vlan' */ + size_t ifc_namelen; /* length of name */ + int ifc_minifs; /* minimum number of interfaces */ + int ifc_maxunit; /* maximum unit number */ + unsigned char *ifc_units; /* bitmap to handle units */ + int ifc_bmlen; /* bitmap length */ + + 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 } /* * Bit values in if_ipending @@ -342,7 +537,7 @@ typedef void if_init_f_t __P((void *)); if ((ifq)->ifq_tail == 0) \ (ifq)->ifq_head = m; \ else \ - (ifq)->ifq_tail->m_nextpkt = m; \ + ((struct mbuf*)(ifq)->ifq_tail)->m_nextpkt = m; \ (ifq)->ifq_tail = m; \ (ifq)->ifq_len++; \ } @@ -363,12 +558,11 @@ typedef void if_init_f_t __P((void *)); } \ } -#ifdef KERNEL #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, struct mbuf *m) +if_queue_drop(struct ifqueue *ifq, __unused struct mbuf *m) { IF_DROP(ifq); return 0; @@ -386,22 +580,15 @@ if_enq_drop(struct ifqueue *ifq, struct mbuf *m) #else #ifdef MT_HEADER -int if_enq_drop __P((struct ifqueue *, struct mbuf *)); -#endif +int if_enq_drop(struct ifqueue *, struct mbuf *); +#endif /* MT_HEADER */ -#endif -#endif /* __APPLE_API_UNSTABLE */ +#endif /* defined(__GNUC__) && defined(MT_HEADER) */ -/* - * 72 was chosen below because it is the size of a TCP/IP - * header (40) + the minimum mss (32). - */ -#define IF_MINMTU 72 -#define IF_MAXMTU 65535 +#endif /* KERNEL_PRIVATE */ -#endif /* KERNEL */ -#ifdef __APPLE_API_UNSTABLE +#ifdef PRIVATE /* * The ifaddr structure contains information about one address * of an interface. They are maintained by the different address families, @@ -413,26 +600,35 @@ struct ifaddr { 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 */ -#ifndef __APPLE__ - /* Use of if_data doesn't justify change of API */ - struct if_data if_data; /* not all members are meaningful */ -#endif struct ifnet *ifa_ifp; /* back-pointer to interface */ TAILQ_ENTRY(ifaddr) ifa_link; /* queue macro glue */ - void (*ifa_rtrequest) /* check or clean routes (+ or -)'d */ - __P((int, struct rtentry *, struct sockaddr *)); - u_short ifa_flags; /* mostly rt_flags for cloning */ - short ifa_refcnt;/* 16bit ref count, use ifaref, ifafree */ - int ifa_metric; /* cost of going out this interface */ -#ifdef notdef - struct rtentry *ifa_rt; /* XXXX for ROUTETOIF ????? */ -#endif - u_long ifa_dlt; - int (*ifa_claim_addr) /* check if an addr goes to this if */ - __P((struct ifaddr *, struct sockaddr *)); + void (*ifa_rtrequest) /* check or clean routes (+ or -)'d */ + (int, struct rtentry *, struct sockaddr *); + uint32_t ifa_flags; /* mostly rt_flags for cloning */ + int32_t ifa_refcnt; /* ref count, use ifaref, ifafree */ + int32_t ifa_metric; /* cost of going out this interface */ + void (*ifa_free)(struct ifaddr *); /* callback fn for freeing */ + void (*ifa_trace) /* callback fn for tracing refs */ + (struct ifaddr *, int); + uint32_t ifa_debug; /* debug flags */ }; -#define IFA_ROUTE RTF_UP /* route installed */ +/* + * Valid values for ifa_flags + */ +#define IFA_ROUTE RTF_UP /* route installed (0x1) */ +#define IFA_CLONING RTF_CLONING /* (0x100) */ + +/* + * Valid values for ifa_debug + */ +#define IFD_ATTACHED 0x1 /* attached to an interface */ +#define IFD_ALLOC 0x2 /* dynamically allocated */ +#define IFD_DEBUG 0x4 /* has debugging info */ + +#endif /* PRIVATE */ + +#ifdef KERNEL_PRIVATE /* * The prefix structure contains information about one prefix * of an interface. They are maintained by the different address families, @@ -446,6 +642,10 @@ struct ifprefix { u_char ifpr_plen; /* prefix length in bits */ u_char ifpr_type; /* protocol dependent prefix type */ }; +#endif /* KERNEL_PRIVATE */ + +#ifdef PRIVATE +typedef void (*ifma_protospec_free_func)(void* ifma_protospec); /* * Multicast address structure. This is analogous to the ifaddr @@ -456,76 +656,99 @@ struct ifprefix { struct ifmultiaddr { LIST_ENTRY(ifmultiaddr) ifma_link; /* queue macro glue */ struct sockaddr *ifma_addr; /* address this membership is for */ - struct sockaddr *ifma_lladdr; /* link-layer translation, if any */ - struct ifnet *ifma_ifp; /* back-pointer to interface */ - u_int ifma_refcount; /* reference count */ - void *ifma_protospec; /* protocol-specific state, if any */ + struct ifmultiaddr *ifma_ll; /* link-layer translation, if any */ + struct ifnet *ifma_ifp; /* back-pointer to interface */ + u_int ifma_usecount; /* use count, protected by ifp's lock */ + void *ifma_protospec; /* protocol-specific state, if any */ + int32_t ifma_refcount; /* reference count, atomically protected */ + ifma_protospec_free_func ifma_free; /* function called to free ifma_protospec */ }; +#endif /* PRIVATE */ -#ifdef KERNEL +#ifdef KERNEL_PRIVATE #define IFAREF(ifa) ifaref(ifa) #define IFAFREE(ifa) ifafree(ifa) -#ifdef __APPLE_API_PRIVATE -extern struct ifnethead ifnet; +/* + * To preserve kmem compatibility, we define + * ifnet_head to ifnet. This should be temp. + */ +#define ifnet_head ifnet +extern struct ifnethead ifnet_head; extern struct ifnet **ifindex2ifnet; extern int ifqmaxlen; -extern struct ifnet loif[]; +extern ifnet_t lo_ifp; 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_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)); - -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 */ +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); +/*void ifinit(void));*/ /* declared in systm.h for main( */ +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 *); + +int 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_ifwithaddr_scoped(const struct sockaddr *, unsigned int); +struct ifaddr *ifa_ifwithdstaddr(const struct sockaddr *); +struct ifaddr *ifa_ifwithnet(const struct sockaddr *); +struct ifaddr *ifa_ifwithnet_scoped(const struct sockaddr *, unsigned int); +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 *ifa_ifwithroute_scoped_locked(int, const struct sockaddr *, + const struct sockaddr *, unsigned int); +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 *); + +extern struct in_ifaddr *ifa_foraddr(unsigned int); +extern struct in_ifaddr *ifa_foraddr_scoped(unsigned int, unsigned int); + +#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); -#endif /* __APPLE_API_UNSTABLE */ +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 /* BSD_KERNEL_PRIVATE */ +#endif /* KERNEL_PRIVATE */ #endif /* !_NET_IF_VAR_H_ */