1/* 2 * Copyright (c) 2000-2004 Apple Computer, 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 * @(#)if.h 8.1 (Berkeley) 6/10/93 61 * $FreeBSD: src/sys/net/if.h,v 1.58.2.2 2001/07/24 19:10:18 brooks Exp $ 62 */ 63 64#ifndef _NET_IF_H_ 65#define _NET_IF_H_ 66 67#include <sys/cdefs.h> 68 69#define IF_NAMESIZE 16 70 71#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 72#include <sys/appleapiopts.h> 73#ifdef __APPLE__ 74/* 75 * Define Data-Link event subclass, and associated 76 * events. 77 */ 78 79#define KEV_DL_SUBCLASS 2 80 81#define KEV_DL_SIFFLAGS 1 82#define KEV_DL_SIFMETRICS 2 83#define KEV_DL_SIFMTU 3 84#define KEV_DL_SIFPHYS 4 85#define KEV_DL_SIFMEDIA 5 86#define KEV_DL_SIFGENERIC 6 87#define KEV_DL_ADDMULTI 7 88#define KEV_DL_DELMULTI 8 89#define KEV_DL_IF_ATTACHED 9 90#define KEV_DL_IF_DETACHING 10 91#define KEV_DL_IF_DETACHED 11 92#define KEV_DL_LINK_OFF 12 93#define KEV_DL_LINK_ON 13 94#define KEV_DL_PROTO_ATTACHED 14 95#define KEV_DL_PROTO_DETACHED 15 96#define KEV_DL_LINK_ADDRESS_CHANGED 16 97 98#include <net/if_var.h> 99#include <sys/types.h> 100#endif 101 102#ifdef KERNEL_PRIVATE 103struct if_clonereq { 104 int ifcr_total; /* total cloners (out) */ 105 int ifcr_count; /* room for this many in user buffer */ 106 char *ifcr_buffer; /* buffer for cloner names */ 107}; 108 109/* in-kernel, LP64-aware version of if_clonereq. all pointers 110 * grow when we're dealing with a 64-bit process. 111 * WARNING - keep in sync with if_clonereq 112 */ 113struct if_clonereq64 { 114 int ifcr_total; /* total cloners (out) */ 115 int ifcr_count; /* room for this many in user buffer */ 116 union { 117 u_int64_t ifcru_buffer64; 118 char * ifcru_buffer32; 119 } ifcr_ifcru; 120}; 121#endif KERNEL_PRIVATE 122 123#define IFF_UP 0x1 /* interface is up */ 124#define IFF_BROADCAST 0x2 /* broadcast address valid */ 125#define IFF_DEBUG 0x4 /* turn on debugging */ 126#define IFF_LOOPBACK 0x8 /* is a loopback net */ 127#define IFF_POINTOPOINT 0x10 /* interface is point-to-point link */ 128#define IFF_NOTRAILERS 0x20 /* obsolete: avoid use of trailers */ 129#define IFF_RUNNING 0x40 /* resources allocated */ 130#define IFF_NOARP 0x80 /* no address resolution protocol */ 131#define IFF_PROMISC 0x100 /* receive all packets */ 132#define IFF_ALLMULTI 0x200 /* receive all multicast packets */ 133#define IFF_OACTIVE 0x400 /* transmission in progress */ 134#define IFF_SIMPLEX 0x800 /* can't hear own transmissions */ 135#define IFF_LINK0 0x1000 /* per link layer defined bit */ 136#define IFF_LINK1 0x2000 /* per link layer defined bit */ 137#define IFF_LINK2 0x4000 /* per link layer defined bit */ 138#define IFF_ALTPHYS IFF_LINK2 /* use alternate physical connection */ 139#define IFF_MULTICAST 0x8000 /* supports multicast */ 140 141#ifdef KERNEL_PRIVATE 142/* extended flags definitions: (all bits are reserved for internal/future use) */ 143#define IFEF_AUTOCONFIGURING 0x1 144#define IFEF_DVR_REENTRY_OK 0x20 /* When set, driver may be reentered from its own thread */ 145#define IFEF_ACCEPT_RTADVD 0x40 /* set to accept IPv6 router advertisement on the interface */ 146#define IFEF_DETACHING 0x80 /* Set when interface is detaching */ 147#define IFEF_USEKPI 0x100 /* Set when interface is created through the KPIs */ 148#define IFEF_VLAN 0x200 /* interface has one or more vlans */ 149#define IFEF_BOND 0x400 /* interface is part of bond */ 150#define IFEF_ARPLL 0x800 /* ARP for IPv4LL addresses on this port */ 151#define IFEF_NOWINDOWSCALE 0x1000 /* TCP window scale disabled on this interface, see 5933937 & 5959897*/ 152#define IFEF_NOTIMESTAMPS IFEF_NOWINDOWSCALE /* We don't actualy disable timestamps, just window scale see 5959897 */ 153#define IFEF_SENDLIST 0x10000000 /* Interface supports sending a list of packets */ 154#define IFEF_REUSE 0x20000000 /* DLIL ifnet recycler, ifnet is not new */ 155#define IFEF_INUSE 0x40000000 /* DLIL ifnet recycler, ifnet in use */ 156#define IFEF_UPDOWNCHANGE 0x80000000 /* Interface's up/down state is changing */ 157 158/* flags set internally only: */ 159#define IFF_CANTCHANGE \ 160 (IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|\ 161 IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI) 162 163#endif /* KERNEL_PRIVATE */ 164 165#define IFQ_MAXLEN 50 166#define IFNET_SLOWHZ 1 /* granularity is 1 second */ 167 168/* 169 * Message format for use in obtaining information about interfaces 170 * from sysctl and the routing socket 171 */ 172struct if_msghdr { 173 unsigned short ifm_msglen; /* to skip over non-understood messages */ 174 unsigned char ifm_version; /* future binary compatability */ 175 unsigned char ifm_type; /* message type */ 176 int ifm_addrs; /* like rtm_addrs */ 177 int ifm_flags; /* value of if_flags */ 178 unsigned short ifm_index; /* index for associated ifp */ 179 struct if_data ifm_data; /* statistics and other data about if */ 180}; 181 182/* 183 * Message format for use in obtaining information about interface addresses 184 * from sysctl and the routing socket 185 */ 186struct ifa_msghdr { 187 unsigned short ifam_msglen; /* to skip over non-understood messages */ 188 unsigned char ifam_version; /* future binary compatability */ 189 unsigned char ifam_type; /* message type */ 190 int ifam_addrs; /* like rtm_addrs */ 191 int ifam_flags; /* value of ifa_flags */ 192 unsigned short ifam_index; /* index for associated ifp */ 193 int ifam_metric; /* value of ifa_metric */ 194}; 195 196/* 197 * Message format for use in obtaining information about multicast addresses 198 * from the routing socket 199 */ 200struct ifma_msghdr { 201 unsigned short ifmam_msglen; /* to skip over non-understood messages */ 202 unsigned char ifmam_version; /* future binary compatability */ 203 unsigned char ifmam_type; /* message type */ 204 int ifmam_addrs; /* like rtm_addrs */ 205 int ifmam_flags; /* value of ifa_flags */ 206 unsigned short ifmam_index; /* index for associated ifp */ 207}; 208 209/* 210 * Message format for use in obtaining information about interfaces 211 * from sysctl 212 */ 213struct if_msghdr2 { 214 u_short ifm_msglen; /* to skip over non-understood messages */ 215 u_char ifm_version; /* future binary compatability */ 216 u_char ifm_type; /* message type */ 217 int ifm_addrs; /* like rtm_addrs */ 218 int ifm_flags; /* value of if_flags */ 219 u_short ifm_index; /* index for associated ifp */ 220 int ifm_snd_len; /* instantaneous length of send queue */ 221 int ifm_snd_maxlen; /* maximum length of send queue */ 222 int ifm_snd_drops; /* number of drops in send queue */ 223 int ifm_timer; /* time until if_watchdog called */ 224 struct if_data64 ifm_data; /* statistics and other data about if */ 225}; 226 227/* 228 * Message format for use in obtaining information about multicast addresses 229 * from sysctl 230 */ 231struct ifma_msghdr2 { 232 u_short ifmam_msglen; /* to skip over non-understood messages */ 233 u_char ifmam_version; /* future binary compatability */ 234 u_char ifmam_type; /* message type */ 235 int ifmam_addrs; /* like rtm_addrs */ 236 int ifmam_flags; /* value of ifa_flags */ 237 u_short ifmam_index; /* index for associated ifp */ 238 int32_t ifmam_refcount; 239}; 240 241/* 242 * ifdevmtu: interface device mtu 243 * Used with SIOCGIFDEVMTU to get the current mtu in use by the device, 244 * as well as the minimum and maximum mtu allowed by the device. 245 */ 246struct ifdevmtu { 247 int ifdm_current; 248 int ifdm_min; 249 int ifdm_max; 250}; 251 252#pragma pack(4) 253 254/* 255 ifkpi: interface kpi ioctl 256 Used with SIOCSIFKPI and SIOCGIFKPI. 257 258 ifk_module_id - From in the kernel, a value from kev_vendor_code_find. From 259 user space, a value from SIOCGKEVVENDOR ioctl on a kernel event socket. 260 ifk_type - The type. Types are specific to each module id. 261 ifk_data - The data. ifk_ptr may be a 64bit pointer for 64 bit processes. 262 263 Copying data between user space and kernel space is done using copyin 264 and copyout. A process may be running in 64bit mode. In such a case, 265 the pointer will be a 64bit pointer, not a 32bit pointer. The following 266 sample is a safe way to copy the data in to the kernel from either a 267 32bit or 64bit process: 268 269 user_addr_t tmp_ptr; 270 if (IS_64BIT_PROCESS(current_proc())) { 271 tmp_ptr = CAST_USER_ADDR_T(ifkpi.ifk_data.ifk_ptr64); 272 } 273 else { 274 tmp_ptr = CAST_USER_ADDR_T(ifkpi.ifk_data.ifk_ptr); 275 } 276 error = copyin(tmp_ptr, allocated_dst_buffer, size of allocated_dst_buffer); 277 */ 278 279struct ifkpi { 280 unsigned int ifk_module_id; 281 unsigned int ifk_type; 282 union { 283 void *ifk_ptr; 284 int ifk_value; 285#ifdef KERNEL 286 u_int64_t ifk_ptr64; 287#endif /* KERNEL */ 288 } ifk_data; 289}; 290 291#pragma pack() 292 293/* 294 * Interface request structure used for socket 295 * ioctl's. All interface ioctl's must have parameter 296 * definitions which begin with ifr_name. The 297 * remainder may be interface specific. 298 */ 299struct ifreq { 300#ifndef IFNAMSIZ 301#define IFNAMSIZ IF_NAMESIZE 302#endif 303 char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 304 union { 305 struct sockaddr ifru_addr; 306 struct sockaddr ifru_dstaddr; 307 struct sockaddr ifru_broadaddr; 308 short ifru_flags; 309 int ifru_metric; 310 int ifru_mtu; 311 int ifru_phys; 312 int ifru_media; 313 int ifru_intval; 314 caddr_t ifru_data; 315#ifdef KERNEL_PRIVATE 316 u_int64_t ifru_data64; /* 64-bit ifru_data */ 317#endif KERNEL_PRIVATE 318 struct ifdevmtu ifru_devmtu; 319 struct ifkpi ifru_kpi; 320 } ifr_ifru; 321#define ifr_addr ifr_ifru.ifru_addr /* address */ 322#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ 323#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ 324#ifdef __APPLE__ 325#define ifr_flags ifr_ifru.ifru_flags /* flags */ 326#else 327#define ifr_flags ifr_ifru.ifru_flags[0] /* flags */ 328#define ifr_prevflags ifr_ifru.ifru_flags[1] /* flags */ 329#endif /* __APPLE__ */ 330#define ifr_metric ifr_ifru.ifru_metric /* metric */ 331#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ 332#define ifr_phys ifr_ifru.ifru_phys /* physical wire */ 333#define ifr_media ifr_ifru.ifru_media /* physical media */ 334#define ifr_data ifr_ifru.ifru_data /* for use by interface */ 335#define ifr_devmtu ifr_ifru.ifru_devmtu 336#define ifr_intval ifr_ifru.ifru_intval /* integer value */ 337#ifdef KERNEL_PRIVATE 338#define ifr_data64 ifr_ifru.ifru_data64 /* 64-bit pointer */ 339#endif KERNEL_PRIVATE 340#define ifr_kpi ifr_ifru.ifru_kpi 341}; 342 343#define _SIZEOF_ADDR_IFREQ(ifr) \ 344 ((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \ 345 (sizeof(struct ifreq) - sizeof(struct sockaddr) + \ 346 (ifr).ifr_addr.sa_len) : sizeof(struct ifreq)) 347 348struct ifaliasreq { 349 char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 350 struct sockaddr ifra_addr; 351 struct sockaddr ifra_broadaddr; 352 struct sockaddr ifra_mask; 353}; 354 355struct rslvmulti_req { 356 struct sockaddr *sa; 357 struct sockaddr **llsa; 358}; 359 360#pragma pack(4) 361 362struct ifmediareq { 363 char ifm_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 364 int ifm_current; /* current media options */ 365 int ifm_mask; /* don't care mask */ 366 int ifm_status; /* media status */ 367 int ifm_active; /* active options */ 368 int ifm_count; /* # entries in ifm_ulist array */ 369 int *ifm_ulist; /* media words */ 370}; 371 372#pragma pack() 373 374#ifdef KERNEL_PRIVATE 375/* LP64 version of ifmediareq. all pointers 376 * grow when we're dealing with a 64-bit process. 377 * WARNING - keep in sync with ifmediareq 378 */ 379struct ifmediareq64 { 380 char ifm_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 381 int ifm_current; /* current media options */ 382 int ifm_mask; /* don't care mask */ 383 int ifm_status; /* media status */ 384 int ifm_active; /* active options */ 385 int ifm_count; /* # entries in ifm_ulist array */ 386 union { /* media words */ 387 int * ifmu_ulist32; /* 32-bit pointer */ 388 u_int64_t ifmu_ulist64; /* 64-bit pointer */ 389 } ifm_ifmu; 390}; 391#endif // KERNEL_PRIVATE 392 393/* 394 * Structure used to retrieve aux status data from interfaces. 395 * Kernel suppliers to this interface should respect the formatting 396 * needed by ifconfig(8): each line starts with a TAB and ends with 397 * a newline. The canonical example to copy and paste is in if_tun.c. 398 */ 399 400#define IFSTATMAX 800 /* 10 lines of text */ 401struct ifstat { 402 char ifs_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 403 char ascii[IFSTATMAX + 1]; 404}; 405 406#pragma pack(4) 407 408/* 409 * Structure used in SIOCGIFCONF request. 410 * Used to retrieve interface configuration 411 * for machine (useful for programs which 412 * must know all networks accessible). 413 */ 414struct ifconf { 415 int ifc_len; /* size of associated buffer */ 416 union { 417 caddr_t ifcu_buf; 418 struct ifreq *ifcu_req; 419 } ifc_ifcu; 420}; 421#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ 422#define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */ 423 424#pragma pack() 425 426#ifdef KERNEL_PRIVATE 427/* LP64 version of ifconf. all pointers 428 * grow when we're dealing with a 64-bit process. 429 * WARNING - keep in sync with ifconf 430 */ 431struct ifconf64 { 432 int ifc_len; /* size of associated buffer */ 433 union { 434 struct ifreq * ifcu_req; 435 u_int64_t ifcu_req64; 436 } ifc_ifcu; 437}; 438#define ifc_req64 ifc_ifcu.ifcu_req64 439#endif // KERNEL_PRIVATE 440 441/* 442 * DLIL KEV_DL_PROTO_ATTACHED/DETACHED structure 443 */ 444struct kev_dl_proto_data { 445 struct net_event_data link_data; 446 u_int32_t proto_family; 447 u_int32_t proto_remaining_count; 448}; 449 450/* 451 * Structure for SIOC[AGD]LIFADDR 452 */ 453struct if_laddrreq { 454 char iflr_name[IFNAMSIZ]; 455 unsigned int flags; 456#define IFLR_PREFIX 0x8000 /* in: prefix given out: kernel fills id */ 457 unsigned int prefixlen; /* in/out */ 458 struct sockaddr_storage addr; /* in/out */ 459 struct sockaddr_storage dstaddr; /* out */ 460}; 461 462#ifdef KERNEL 463#ifdef MALLOC_DECLARE 464MALLOC_DECLARE(M_IFADDR); 465MALLOC_DECLARE(M_IFMADDR); 466#endif 467#endif 468#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */ 469 470#ifndef KERNEL 471struct if_nameindex { 472 unsigned int if_index; /* 1, 2, ... */ 473 char *if_name; /* null terminated name: "le0", ... */ 474}; 475 476__BEGIN_DECLS 477unsigned int if_nametoindex(const char *); 478char *if_indextoname(unsigned int, char *); 479struct if_nameindex *if_nameindex(void); 480void if_freenameindex(struct if_nameindex *); 481__END_DECLS 482#endif 483 484#ifdef KERNEL 485#include <net/kpi_interface.h> 486#endif 487 488#endif /* !_NET_IF_H_ */ 489