1 /* 2 * Copyright (c) 2000-2021 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 #include <sys/queue.h> /* get TAILQ macros */ 76 #ifdef BSD_KERN_PRIVATE 77 #include <net/pktsched/pktsched.h> 78 #include <sys/eventhandler.h> 79 #endif 80 81 #if BSD_KERNEL_PRIVATE 82 #if DEVELOPMENT || DEBUG 83 #define NET_KT_DEFAULT KT_PRIV_ACCT 84 #else 85 #define NET_KT_DEFAULT KT_DEFAULT 86 #endif 87 #endif /* BSD_KERN_PRIVATE */ 88 89 #ifdef KERNEL 90 #include <net/kpi_interface.h> 91 #endif /* KERNEL */ 92 93 #ifdef __APPLE__ 94 #define APPLE_IF_FAM_LOOPBACK 1 95 #define APPLE_IF_FAM_ETHERNET 2 96 #define APPLE_IF_FAM_SLIP 3 97 #define APPLE_IF_FAM_TUN 4 98 #define APPLE_IF_FAM_VLAN 5 99 #define APPLE_IF_FAM_PPP 6 100 #define APPLE_IF_FAM_PVC 7 101 #define APPLE_IF_FAM_DISC 8 102 #define APPLE_IF_FAM_MDECAP 9 103 #define APPLE_IF_FAM_GIF 10 104 #define APPLE_IF_FAM_FAITH 11 /* deprecated */ 105 #define APPLE_IF_FAM_STF 12 106 #define APPLE_IF_FAM_FIREWIRE 13 107 #define APPLE_IF_FAM_BOND 14 108 #define APPLE_IF_FAM_CELLULAR 15 109 #define APPLE_IF_FAM_UNUSED_16 16 /* Un-used */ 110 #define APPLE_IF_FAM_UTUN 17 111 #define APPLE_IF_FAM_IPSEC 18 112 #endif /* __APPLE__ */ 113 114 /* 115 * 72 was chosen below because it is the size of a TCP/IP 116 * header (40) + the minimum mss (32). 117 */ 118 #define IF_MINMTU 72 119 #define IF_MAXMTU 65535 120 121 /* 122 * Structures defining a network interface, providing a packet 123 * transport mechanism (ala level 0 of the PUP protocols). 124 * 125 * Each interface accepts output datagrams of a specified maximum 126 * length, and provides higher level routines with input datagrams 127 * received from its medium. 128 * 129 * Output occurs when the routine if_output is called, with three parameters: 130 * (*ifp->if_output)(ifp, m, dst, rt) 131 * Here m is the mbuf chain to be sent and dst is the destination address. 132 * The output routine encapsulates the supplied datagram if necessary, 133 * and then transmits it on its medium. 134 * 135 * On input, each interface unwraps the data received by it, and either 136 * places it on the input queue of a internetwork datagram routine 137 * and posts the associated software interrupt, or passes the datagram to a raw 138 * packet input routine. 139 * 140 * Routines exist for locating interfaces by their addresses 141 * or for locating a interface on a certain network, as well as more general 142 * routing and gateway routines maintaining information used to locate 143 * interfaces. These routines live in the files if.c and route.c 144 */ 145 146 #define IFNAMSIZ 16 147 148 /* This belongs up in socket.h or socketvar.h, depending on how far the 149 * event bubbles up. 150 */ 151 152 struct net_event_data { 153 u_int32_t if_family; 154 u_int32_t if_unit; 155 char if_name[IFNAMSIZ]; 156 }; 157 158 #if defined(__LP64__) 159 #include <sys/_types/_timeval32.h> 160 #define IF_DATA_TIMEVAL timeval32 161 #else 162 #define IF_DATA_TIMEVAL timeval 163 #endif 164 165 #pragma pack(4) 166 167 /* 168 * Structure describing information about an interface 169 * which may be of interest to management entities. 170 */ 171 struct if_data { 172 /* generic interface information */ 173 u_char ifi_type; /* ethernet, tokenring, etc */ 174 u_char ifi_typelen; /* Length of frame type id */ 175 u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ 176 u_char ifi_addrlen; /* media address length */ 177 u_char ifi_hdrlen; /* media header length */ 178 u_char ifi_recvquota; /* polling quota for receive intrs */ 179 u_char ifi_xmitquota; /* polling quota for xmit intrs */ 180 u_char ifi_unused1; /* for future use */ 181 u_int32_t ifi_mtu; /* maximum transmission unit */ 182 u_int32_t ifi_metric; /* routing metric (external only) */ 183 u_int32_t ifi_baudrate; /* linespeed */ 184 /* volatile statistics */ 185 u_int32_t ifi_ipackets; /* packets received on interface */ 186 u_int32_t ifi_ierrors; /* input errors on interface */ 187 u_int32_t ifi_opackets; /* packets sent on interface */ 188 u_int32_t ifi_oerrors; /* output errors on interface */ 189 u_int32_t ifi_collisions; /* collisions on csma interfaces */ 190 u_int32_t ifi_ibytes; /* total number of octets received */ 191 u_int32_t ifi_obytes; /* total number of octets sent */ 192 u_int32_t ifi_imcasts; /* packets received via multicast */ 193 u_int32_t ifi_omcasts; /* packets sent via multicast */ 194 u_int32_t ifi_iqdrops; /* dropped on input, this interface */ 195 u_int32_t ifi_noproto; /* destined for unsupported protocol */ 196 u_int32_t ifi_recvtiming; /* usec spent receiving when timing */ 197 u_int32_t ifi_xmittiming; /* usec spent xmitting when timing */ 198 struct IF_DATA_TIMEVAL ifi_lastchange; /* time of last administrative change */ 199 u_int32_t ifi_unused2; /* used to be the default_proto */ 200 u_int32_t ifi_hwassist; /* HW offload capabilities */ 201 u_int32_t ifi_reserved1; /* for future use */ 202 u_int32_t ifi_reserved2; /* for future use */ 203 }; 204 205 /* 206 * Structure describing information about an interface 207 * which may be of interest to management entities. 208 */ 209 struct if_data64 { 210 /* generic interface information */ 211 u_char ifi_type; /* ethernet, tokenring, etc */ 212 u_char ifi_typelen; /* Length of frame type id */ 213 u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ 214 u_char ifi_addrlen; /* media address length */ 215 u_char ifi_hdrlen; /* media header length */ 216 u_char ifi_recvquota; /* polling quota for receive intrs */ 217 u_char ifi_xmitquota; /* polling quota for xmit intrs */ 218 u_char ifi_unused1; /* for future use */ 219 u_int32_t ifi_mtu; /* maximum transmission unit */ 220 u_int32_t ifi_metric; /* routing metric (external only) */ 221 u_int64_t ifi_baudrate; /* linespeed */ 222 /* volatile statistics */ 223 u_int64_t ifi_ipackets; /* packets received on interface */ 224 u_int64_t ifi_ierrors; /* input errors on interface */ 225 u_int64_t ifi_opackets; /* packets sent on interface */ 226 u_int64_t ifi_oerrors; /* output errors on interface */ 227 u_int64_t ifi_collisions; /* collisions on csma interfaces */ 228 u_int64_t ifi_ibytes; /* total number of octets received */ 229 u_int64_t ifi_obytes; /* total number of octets sent */ 230 u_int64_t ifi_imcasts; /* packets received via multicast */ 231 u_int64_t ifi_omcasts; /* packets sent via multicast */ 232 u_int64_t ifi_iqdrops; /* dropped on input, this interface */ 233 u_int64_t ifi_noproto; /* destined for unsupported protocol */ 234 u_int32_t ifi_recvtiming; /* usec spent receiving when timing */ 235 u_int32_t ifi_xmittiming; /* usec spent xmitting when timing */ 236 struct IF_DATA_TIMEVAL ifi_lastchange; /* time of last administrative change */ 237 }; 238 239 #ifdef PRIVATE 240 /* See if_var_private.h for macros to access some of these fields */ 241 #endif /* PRIVATE */ 242 243 #pragma pack() 244 #endif /* DRIVERKIT */ 245 246 #if defined(DRIVERKIT) || defined(PRIVATE) || defined(DRIVERKIT_PRIVATE) 247 #include <net/if_var_status.h> 248 #else 249 struct ifnet_interface_advisory; 250 #endif /* defined(DRIVERKIT) || defined(PRIVATE) || defined(DRIVERKIT_PRIVATE) */ 251 252 #ifndef DRIVERKIT 253 254 /* 255 * Structure defining a queue for a network interface. 256 */ 257 struct ifqueue { 258 void *ifq_head; 259 void *ifq_tail; 260 int ifq_len; 261 int ifq_maxlen; 262 int ifq_drops; 263 }; 264 265 #ifdef XNU_KERNEL_PRIVATE 266 /* for uuid.c */ 267 __private_extern__ int uuid_get_ethernet(u_int8_t *); 268 #endif /* XNU_KERNEL_PRIVATE */ 269 #endif /* DRIVERKIT */ 270 271 #ifdef PRIVATE 272 #include <net/if_var_private.h> 273 #endif /* PRIVATE */ 274 275 #endif /* !_NET_IF_VAR_H_ */ 276