1 /* 2 * Copyright (c) 2000-2025 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 /* 29 * Copyright (c) 1982, 1986, 1989, 1993 30 * The Regents of the University of California. All rights reserved. 31 * 32 * Redistribution and use in source and binary forms, with or without 33 * modification, are permitted provided that the following conditions 34 * are met: 35 * 1. Redistributions of source code must retain the above copyright 36 * notice, this list of conditions and the following disclaimer. 37 * 2. Redistributions in binary form must reproduce the above copyright 38 * notice, this list of conditions and the following disclaimer in the 39 * documentation and/or other materials provided with the distribution. 40 * 3. All advertising materials mentioning features or use of this software 41 * must display the following acknowledgement: 42 * This product includes software developed by the University of 43 * California, Berkeley and its contributors. 44 * 4. Neither the name of the University nor the names of its contributors 45 * may be used to endorse or promote products derived from this software 46 * without specific prior written permission. 47 * 48 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 51 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58 * SUCH DAMAGE. 59 * 60 * From: @(#)if.h 8.1 (Berkeley) 6/10/93 61 * $FreeBSD: src/sys/net/if_var.h,v 1.18.2.7 2001/07/24 19:10:18 brooks Exp $ 62 */ 63 64 #ifndef _NET_IF_VAR_H_ 65 #define _NET_IF_VAR_H_ 66 67 #ifdef DRIVERKIT 68 #include <stddef.h> 69 #include <stdint.h> 70 #else 71 #include <sys/appleapiopts.h> 72 #include <stdint.h> 73 #include <sys/types.h> 74 #include <sys/time.h> 75 #ifdef XNU_KERNEL_PRIVATE 76 #include <net/ethernet.h> 77 #endif 78 #ifdef BSD_KERNEL_PRIVATE 79 #include <sys/eventhandler.h> 80 #if DEVELOPMENT || DEBUG 81 #define NET_KT_DEFAULT KT_PRIV_ACCT 82 #else 83 #define NET_KT_DEFAULT KT_DEFAULT 84 #endif 85 #endif /* BSD_KERNEL_PRIVATE */ 86 87 #ifdef KERNEL 88 #include <net/kpi_interface.h> 89 #endif /* KERNEL */ 90 91 #ifdef __APPLE__ 92 #define APPLE_IF_FAM_LOOPBACK 1 93 #define APPLE_IF_FAM_ETHERNET 2 94 #define APPLE_IF_FAM_SLIP 3 95 #define APPLE_IF_FAM_TUN 4 96 #define APPLE_IF_FAM_VLAN 5 97 #define APPLE_IF_FAM_PPP 6 98 #define APPLE_IF_FAM_PVC 7 99 #define APPLE_IF_FAM_DISC 8 100 #define APPLE_IF_FAM_MDECAP 9 101 #define APPLE_IF_FAM_GIF 10 102 #define APPLE_IF_FAM_FAITH 11 /* deprecated */ 103 #define APPLE_IF_FAM_STF 12 104 #define APPLE_IF_FAM_FIREWIRE 13 105 #define APPLE_IF_FAM_BOND 14 106 #define APPLE_IF_FAM_CELLULAR 15 107 #define APPLE_IF_FAM_UNUSED_16 16 /* Un-used */ 108 #define APPLE_IF_FAM_UTUN 17 109 #define APPLE_IF_FAM_IPSEC 18 110 #endif /* __APPLE__ */ 111 112 /* 113 * 72 was chosen below because it is the size of a TCP/IP 114 * header (40) + the minimum mss (32). 115 */ 116 #define IF_MINMTU 72 117 #define IF_MAXMTU 65535 118 119 /* 120 * Structures defining a network interface, providing a packet 121 * transport mechanism (ala level 0 of the PUP protocols). 122 * 123 * Each interface accepts output datagrams of a specified maximum 124 * length, and provides higher level routines with input datagrams 125 * received from its medium. 126 * 127 * Output occurs when the routine if_output is called, with three parameters: 128 * (*ifp->if_output)(ifp, m, dst, rt) 129 * Here m is the mbuf chain to be sent and dst is the destination address. 130 * The output routine encapsulates the supplied datagram if necessary, 131 * and then transmits it on its medium. 132 * 133 * On input, each interface unwraps the data received by it, and either 134 * places it on the input queue of a internetwork datagram routine 135 * and posts the associated software interrupt, or passes the datagram to a raw 136 * packet input routine. 137 * 138 * Routines exist for locating interfaces by their addresses 139 * or for locating a interface on a certain network, as well as more general 140 * routing and gateway routines maintaining information used to locate 141 * interfaces. These routines live in the files if.c and route.c 142 */ 143 144 #define IFNAMSIZ 16 145 146 /* This belongs up in socket.h or socketvar.h, depending on how far the 147 * event bubbles up. 148 */ 149 150 struct net_event_data { 151 u_int32_t if_family; 152 u_int32_t if_unit; 153 char if_name[IFNAMSIZ]; 154 }; 155 156 #if defined(__LP64__) 157 #include <sys/_types/_timeval32.h> 158 #define IF_DATA_TIMEVAL timeval32 159 #else 160 #define IF_DATA_TIMEVAL timeval 161 #endif 162 163 #pragma pack(4) 164 165 /* 166 * Structure describing information about an interface 167 * which may be of interest to management entities. 168 */ 169 struct if_data { 170 /* generic interface information */ 171 u_char ifi_type; /* ethernet, tokenring, etc */ 172 u_char ifi_typelen; /* Length of frame type id */ 173 u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ 174 u_char ifi_addrlen; /* media address length */ 175 u_char ifi_hdrlen; /* media header length */ 176 u_char ifi_recvquota; /* polling quota for receive intrs */ 177 u_char ifi_xmitquota; /* polling quota for xmit intrs */ 178 u_char ifi_unused1; /* for future use */ 179 u_int32_t ifi_mtu; /* maximum transmission unit */ 180 u_int32_t ifi_metric; /* routing metric (external only) */ 181 u_int32_t ifi_baudrate; /* linespeed */ 182 /* volatile statistics */ 183 u_int32_t ifi_ipackets; /* packets received on interface */ 184 u_int32_t ifi_ierrors; /* input errors on interface */ 185 u_int32_t ifi_opackets; /* packets sent on interface */ 186 u_int32_t ifi_oerrors; /* output errors on interface */ 187 u_int32_t ifi_collisions; /* collisions on csma interfaces */ 188 u_int32_t ifi_ibytes; /* total number of octets received */ 189 u_int32_t ifi_obytes; /* total number of octets sent */ 190 u_int32_t ifi_imcasts; /* packets received via multicast */ 191 u_int32_t ifi_omcasts; /* packets sent via multicast */ 192 u_int32_t ifi_iqdrops; /* dropped on input, this interface */ 193 u_int32_t ifi_noproto; /* destined for unsupported protocol */ 194 u_int32_t ifi_recvtiming; /* usec spent receiving when timing */ 195 u_int32_t ifi_xmittiming; /* usec spent xmitting when timing */ 196 struct IF_DATA_TIMEVAL ifi_lastchange; /* time of last administrative change */ 197 u_int32_t ifi_unused2; /* used to be the default_proto */ 198 u_int32_t ifi_hwassist; /* HW offload capabilities */ 199 u_int32_t ifi_reserved1; /* for future use */ 200 u_int32_t ifi_reserved2; /* for future use */ 201 }; 202 203 /* 204 * Structure describing information about an interface 205 * which may be of interest to management entities. 206 */ 207 struct if_data64 { 208 /* generic interface information */ 209 u_char ifi_type; /* ethernet, tokenring, etc */ 210 u_char ifi_typelen; /* Length of frame type id */ 211 u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ 212 u_char ifi_addrlen; /* media address length */ 213 u_char ifi_hdrlen; /* media header length */ 214 u_char ifi_recvquota; /* polling quota for receive intrs */ 215 u_char ifi_xmitquota; /* polling quota for xmit intrs */ 216 u_char ifi_unused1; /* for future use */ 217 u_int32_t ifi_mtu; /* maximum transmission unit */ 218 u_int32_t ifi_metric; /* routing metric (external only) */ 219 u_int64_t ifi_baudrate; /* linespeed */ 220 /* volatile statistics */ 221 u_int64_t ifi_ipackets; /* packets received on interface */ 222 u_int64_t ifi_ierrors; /* input errors on interface */ 223 u_int64_t ifi_opackets; /* packets sent on interface */ 224 u_int64_t ifi_oerrors; /* output errors on interface */ 225 u_int64_t ifi_collisions; /* collisions on csma interfaces */ 226 u_int64_t ifi_ibytes; /* total number of octets received */ 227 u_int64_t ifi_obytes; /* total number of octets sent */ 228 u_int64_t ifi_imcasts; /* packets received via multicast */ 229 u_int64_t ifi_omcasts; /* packets sent via multicast */ 230 u_int64_t ifi_iqdrops; /* dropped on input, this interface */ 231 u_int64_t ifi_noproto; /* destined for unsupported protocol */ 232 u_int32_t ifi_recvtiming; /* usec spent receiving when timing */ 233 u_int32_t ifi_xmittiming; /* usec spent xmitting when timing */ 234 struct IF_DATA_TIMEVAL ifi_lastchange; /* time of last administrative change */ 235 }; 236 237 #ifdef PRIVATE 238 /* See if_var_private.h for macros to access some of these fields */ 239 #endif /* PRIVATE */ 240 241 #pragma pack() 242 #endif /* DRIVERKIT */ 243 244 #if defined(DRIVERKIT) || defined(PRIVATE) || defined(DRIVERKIT_PRIVATE) 245 #include <net/if_var_status.h> 246 #else 247 struct ifnet_interface_advisory; 248 #endif /* defined(DRIVERKIT) || defined(PRIVATE) || defined(DRIVERKIT_PRIVATE) */ 249 250 #ifndef DRIVERKIT 251 252 /* 253 * Structure defining a queue for a network interface. 254 */ 255 struct ifqueue { 256 void *ifq_head; 257 void *ifq_tail; 258 int ifq_len; 259 int ifq_maxlen; 260 int ifq_drops; 261 }; 262 263 #ifdef XNU_KERNEL_PRIVATE 264 /* for uuid.c */ 265 __private_extern__ int uuid_get_ethernet(u_int8_t * __counted_by(ETHER_ADDR_LEN)); 266 #endif /* XNU_KERNEL_PRIVATE */ 267 #endif /* DRIVERKIT */ 268 269 #ifdef PRIVATE 270 #include <net/if_var_private.h> 271 #endif /* PRIVATE */ 272 273 #endif /* !_NET_IF_VAR_H_ */ 274