1 /* 2 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 /* 7 * Copyright (c) 1982, 1986 Regents of the University of California. 8 * All rights reserved. The Berkeley software License Agreement 9 * specifies the terms and conditions for redistribution. 10 */ 11 12 #ifndef _NET_IF_H 13 #define _NET_IF_H 14 15 #pragma ident "%Z%%M% %I% %E% SMI" 16 /* if.h 1.26 90/05/29 SMI; from UCB 7.1 6/4/86 */ 17 18 #include <sys/feature_tests.h> 19 20 #if !defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__) 21 #include <sys/socket.h> 22 #include <netinet/in.h> 23 #if defined(_LP64) 24 #include <sys/types32.h> 25 #endif 26 #endif 27 28 #ifdef __cplusplus 29 extern "C" { 30 #endif 31 32 /* 33 * Structures defining a network interface, providing a packet 34 * transport mechanism (ala level 0 of the PUP protocols). 35 * 36 * Each interface accepts output datagrams of a specified maximum 37 * length, and provides higher level routines with input datagrams 38 * received from its medium. 39 * 40 * Output occurs when the routine if_output is called, with three parameters: 41 * (*ifp->if_output)(ifp, m, dst) 42 * Here m is the mbuf chain to be sent and dst is the destination address. 43 * The output routine encapsulates the supplied datagram if necessary, 44 * and then transmits it on its medium. 45 * 46 * On input, each interface unwraps the data received by it, and either 47 * places it on the input queue of a internetwork datagram routine 48 * and posts the associated software interrupt, or passes the datagram to a raw 49 * packet input routine. 50 * 51 * Routines exist for locating interfaces by their addresses 52 * or for locating a interface on a certain network, as well as more general 53 * routing and gateway routines maintaining information used to locate 54 * interfaces. These routines live in the files if.c and route.c 55 */ 56 57 #if !defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__) 58 59 /* 60 * Structure defining a queue for a network interface. 61 * 62 * (Would like to call this struct ``if'', but C isn't PL/1.) 63 */ 64 struct ifnet { 65 char *if_name; /* name, e.g. ``en'' or ``lo'' */ 66 short if_unit; /* sub-unit for lower level driver */ 67 short if_mtu; /* maximum transmission unit */ 68 short if_flags; /* up/down, broadcast, etc. */ 69 short if_timer; /* time 'til if_watchdog called */ 70 ushort_t if_promisc; /* net # of requests for promisc mode */ 71 int if_metric; /* routing metric (external only) */ 72 struct ifaddr *if_addrlist; /* linked list of addresses per if */ 73 struct ifqueue { 74 struct mbuf *ifq_head; 75 struct mbuf *ifq_tail; 76 int ifq_len; 77 int ifq_maxlen; 78 int ifq_drops; 79 } if_snd; /* output queue */ 80 /* procedure handles */ 81 int (*if_init)(); /* init routine */ 82 int (*if_output)(); /* output routine */ 83 int (*if_ioctl)(); /* ioctl routine */ 84 int (*if_reset)(); /* bus reset routine */ 85 int (*if_watchdog)(); /* timer routine */ 86 /* generic interface statistics */ 87 int if_ipackets; /* packets received on interface */ 88 int if_ierrors; /* input errors on interface */ 89 int if_opackets; /* packets sent on interface */ 90 int if_oerrors; /* output errors on interface */ 91 int if_collisions; /* collisions on csma interfaces */ 92 /* end statistics */ 93 struct ifnet *if_next; 94 struct ifnet *if_upper; /* next layer up */ 95 struct ifnet *if_lower; /* next layer down */ 96 int (*if_input)(); /* input routine */ 97 int (*if_ctlin)(); /* control input routine */ 98 int (*if_ctlout)(); /* control output routine */ 99 struct map *if_memmap; /* rmap for interface specific memory */ 100 }; 101 102 /* 103 * NOTE : These flags are not directly used within IP. 104 * ip_if.h has definitions derived from this which is used within IP. 105 * If you define a flag here, you need to define one in ip_if.h before 106 * using the new flag in IP. Don't use these flags directly in IP. 107 */ 108 #define IFF_UP 0x0000000001 /* interface is up */ 109 #define IFF_BROADCAST 0x0000000002 /* broadcast address valid */ 110 #define IFF_DEBUG 0x0000000004 /* turn on debugging */ 111 #define IFF_LOOPBACK 0x0000000008 /* is a loopback net */ 112 113 #define IFF_POINTOPOINT 0x0000000010 /* interface is point-to-point link */ 114 #define IFF_NOTRAILERS 0x0000000020 /* avoid use of trailers */ 115 #define IFF_RUNNING 0x0000000040 /* resources allocated */ 116 #define IFF_NOARP 0x0000000080 /* no address resolution protocol */ 117 118 #define IFF_PROMISC 0x0000000100 /* receive all packets */ 119 #define IFF_ALLMULTI 0x0000000200 /* receive all multicast packets */ 120 #define IFF_INTELLIGENT 0x0000000400 /* protocol code on board */ 121 #define IFF_MULTICAST 0x0000000800 /* supports multicast */ 122 123 #define IFF_MULTI_BCAST 0x0000001000 /* multicast using broadcast address */ 124 #define IFF_UNNUMBERED 0x0000002000 /* non-unique address */ 125 #define IFF_DHCPRUNNING 0x0000004000 /* DHCP controls this interface */ 126 #define IFF_PRIVATE 0x0000008000 /* do not advertise */ 127 128 /* 129 * The following flags can't be grabbed or altered by SIOC[GS]IFFLAGS. 130 * Should use SIOC[GS]LIFFLAGS which has a larger flags field. 131 */ 132 #define IFF_NOXMIT 0x0000010000 /* Do not transmit packets */ 133 #define IFF_NOLOCAL 0x0000020000 /* No address - just on-link subnet */ 134 #define IFF_DEPRECATED 0x0000040000 /* interface address deprecated */ 135 #define IFF_ADDRCONF 0x0000080000 /* address from stateless addrconf */ 136 137 #define IFF_ROUTER 0x0000100000 /* router on this interface */ 138 #define IFF_NONUD 0x0000200000 /* No NUD on this interface */ 139 #define IFF_ANYCAST 0x0000400000 /* Anycast address */ 140 #define IFF_NORTEXCH 0x0000800000 /* Do not exchange routing info */ 141 142 #define IFF_IPV4 0x0001000000 /* IPv4 interface */ 143 #define IFF_IPV6 0x0002000000 /* IPv6 interface */ 144 #define IFF_MIPRUNNING 0x0004000000 /* Mobile IP controls this interface */ 145 #define IFF_NOFAILOVER 0x0008000000 /* Don't failover on NIC failure */ 146 147 #define IFF_FAILED 0x0010000000 /* NIC has failed */ 148 #define IFF_STANDBY 0x0020000000 /* Standby NIC to be used on failures */ 149 #define IFF_INACTIVE 0x0040000000 /* Standby active or not ? */ 150 #define IFF_OFFLINE 0x0080000000 /* NIC has been offlined */ 151 152 /* 153 * The IFF_XRESOLV flag is an evolving interface and is subject 154 * to change without notice. 155 */ 156 #define IFF_XRESOLV 0x0100000000 /* IPv6 external resolver */ 157 #define IFF_COS_ENABLED 0x0200000000 /* If interface supports CoS marking */ 158 #define IFF_PREFERRED 0x0400000000 /* Prefer as source address */ 159 #define IFF_TEMPORARY 0x0800000000 /* RFC3041 */ 160 161 #define IFF_FIXEDMTU 0x1000000000 /* MTU manually set with SIOCSLIFMTU */ 162 163 #define IFF_VIRTUAL 0x2000000000 /* Does not send or receive packets */ 164 165 /* 166 * The IFF_MULTICAST flag indicates that the network can support the 167 * transmission and reception of higher-level (e.g., IP) multicast packets. 168 * It is independent of hardware support for multicasting; for example, 169 * point-to-point links or pure broadcast networks may well support 170 * higher-level multicasts. 171 */ 172 173 /* flags set internally only: */ 174 #define IFF_CANTCHANGE \ 175 (IFF_BROADCAST | IFF_POINTOPOINT | IFF_RUNNING | IFF_PROMISC | \ 176 IFF_MULTICAST | IFF_MULTI_BCAST | IFF_UNNUMBERED | IFF_IPV4 | \ 177 IFF_IPV6 | IFF_INACTIVE | IFF_FIXEDMTU | IFF_VIRTUAL | \ 178 IFF_LOOPBACK | IFF_ALLMULTI) 179 180 /* 181 * Output queues (ifp->if_snd) and internetwork datagram level (pup level 1) 182 * input routines have queues of messages stored on ifqueue structures 183 * (defined above). Entries are added to and deleted from these structures 184 * by these macros, which should be called with ipl raised to splimp(). 185 */ 186 #define IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen) 187 #define IF_DROP(ifq) ((ifq)->ifq_drops++) 188 #define IF_ENQUEUE(ifq, m) { \ 189 (m)->m_act = 0; \ 190 if ((ifq)->ifq_tail == 0) \ 191 (ifq)->ifq_head = m; \ 192 else \ 193 (ifq)->ifq_tail->m_act = m; \ 194 (ifq)->ifq_tail = m; \ 195 (ifq)->ifq_len++; \ 196 } 197 #define IF_PREPEND(ifq, m) { \ 198 (m)->m_act = (ifq)->ifq_head; \ 199 if ((ifq)->ifq_tail == 0) \ 200 (ifq)->ifq_tail = (m); \ 201 (ifq)->ifq_head = (m); \ 202 (ifq)->ifq_len++; \ 203 } 204 205 /* 206 * Packets destined for level-1 protocol input routines 207 * have a pointer to the receiving interface prepended to the data. 208 * IF_DEQUEUEIF extracts and returns this pointer when dequeuing the packet. 209 * IF_ADJ should be used otherwise to adjust for its presence. 210 */ 211 #define IF_ADJ(m) { \ 212 (m)->m_off += sizeof (struct ifnet *); \ 213 (m)->m_len -= sizeof (struct ifnet *); \ 214 if ((m)->m_len == 0) { \ 215 struct mbuf *n; \ 216 MFREE((m), n); \ 217 (m) = n; \ 218 } \ 219 } 220 #define IF_DEQUEUEIF(ifq, m, ifp) { \ 221 (m) = (ifq)->ifq_head; \ 222 if (m) { \ 223 if (((ifq)->ifq_head = (m)->m_act) == 0) \ 224 (ifq)->ifq_tail = 0; \ 225 (m)->m_act = 0; \ 226 (ifq)->ifq_len--; \ 227 (ifp) = *(mtod((m), struct ifnet **)); \ 228 IF_ADJ(m); \ 229 } \ 230 } 231 #define IF_DEQUEUE(ifq, m) { \ 232 (m) = (ifq)->ifq_head; \ 233 if (m) { \ 234 if (((ifq)->ifq_head = (m)->m_act) == 0) \ 235 (ifq)->ifq_tail = 0; \ 236 (m)->m_act = 0; \ 237 (ifq)->ifq_len--; \ 238 } \ 239 } 240 241 #define IFQ_MAXLEN 50 242 #define IFNET_SLOWHZ 1 /* granularity is 1 second */ 243 244 /* 245 * The ifaddr structure contains information about one address 246 * of an interface. They are maintained by the different address families, 247 * are allocated and attached when an address is set, and are linked 248 * together so all addresses for an interface can be located. 249 */ 250 struct ifaddr { 251 struct sockaddr ifa_addr; /* address of interface */ 252 union { 253 struct sockaddr ifu_broadaddr; 254 struct sockaddr ifu_dstaddr; 255 } ifa_ifu; 256 #define ifa_broadaddr ifa_ifu.ifu_broadaddr /* broadcast address */ 257 #define ifa_dstaddr ifa_ifu.ifu_dstaddr /* other end of p-to-p link */ 258 struct ifnet *ifa_ifp; /* back-pointer to interface */ 259 struct ifaddr *ifa_next; /* next address for interface */ 260 }; 261 262 /* 263 * For SIOCLIF*ND ioctls. 264 * 265 * The lnr_state_* fields use the ND_* neighbor reachability states. 266 * The 3 different fields are for use with SIOCLIFSETND to cover the cases 267 * when 268 * A new entry is created 269 * The entry already exists and the link-layer address is the same 270 * The entry already exists and the link-layer address differs 271 * 272 * Use ND_UNCHANGED and ND_ISROUTER_UNCHANGED to not change any state. 273 */ 274 #define ND_MAX_HDW_LEN 64 275 typedef struct lif_nd_req { 276 struct sockaddr_storage lnr_addr; 277 uint8_t lnr_state_create; /* When creating */ 278 uint8_t lnr_state_same_lla; /* Update same addr */ 279 uint8_t lnr_state_diff_lla; /* Update w/ diff. */ 280 int lnr_hdw_len; 281 int lnr_flags; /* See below */ 282 /* padding because ia32 "long long"s are only 4-byte aligned. */ 283 int lnr_pad0; 284 char lnr_hdw_addr[ND_MAX_HDW_LEN]; 285 } lif_nd_req_t; 286 287 /* 288 * Neighbor reachability states 289 * Used with SIOCLIF*ND ioctls. 290 */ 291 #define ND_UNCHANGED 0 /* For ioctls that don't modify state */ 292 #define ND_INCOMPLETE 1 /* addr resolution in progress */ 293 #define ND_REACHABLE 2 /* have recently been reachable */ 294 #define ND_STALE 3 /* may be unreachable, don't do anything */ 295 #define ND_DELAY 4 /* wait for upper layer hint */ 296 #define ND_PROBE 5 /* send probes */ 297 #define ND_UNREACHABLE 6 /* delete this route */ 298 299 #define ND_STATE_VALID_MIN 0 300 #define ND_STATE_VALID_MAX 6 301 302 /* 303 * lnr_flags value of lif_nd_req. 304 * Used with SIOCLIF*ND ioctls. 305 */ 306 #define NDF_ISROUTER_ON 0x1 307 #define NDF_ISROUTER_OFF 0x2 308 #define NDF_ANYCAST_ON 0x4 309 #define NDF_ANYCAST_OFF 0x8 310 #define NDF_PROXY_ON 0x10 311 #define NDF_PROXY_OFF 0x20 312 313 /* For SIOC[GS]LIFLNKINFO */ 314 typedef struct lif_ifinfo_req { 315 uint8_t lir_maxhops; 316 uint32_t lir_reachtime; /* Reachable time in msec */ 317 uint32_t lir_reachretrans; /* Retransmission timer msec */ 318 uint32_t lir_maxmtu; 319 } lif_ifinfo_req_t; 320 321 #endif /* !defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__) */ 322 323 /* 324 * Maximum lengths of interface name and IPMP group name; these are the same 325 * for historical reasons. Note that the actual maximum length of a name is 326 * one byte less than these constants since the kernel always sets the final 327 * byte of lifr_name and lifr_groupname to NUL. 328 */ 329 #define _LIFNAMSIZ 32 330 331 #if !defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__) 332 333 #define LIFNAMSIZ _LIFNAMSIZ 334 #define LIFGRNAMSIZ LIFNAMSIZ 335 336 /* 337 * Interface request structure used for socket 338 * ioctl's. All interface ioctl's must have parameter 339 * definitions which begin with ifr_name. The 340 * remainder may be interface specific. 341 * Note: This data structure uses 64bit type uint64_t which is not 342 * a valid type for strict ANSI/ISO C compilation for ILP32. 343 * Applications with ioctls using this structure that insist on 344 * building with strict ANSI/ISO C (-Xc) will need to be LP64. 345 */ 346 #if defined(_INT64_TYPE) 347 struct lifreq { 348 char lifr_name[LIFNAMSIZ]; /* if name, e.g. "en0" */ 349 union { 350 int lifru_addrlen; /* for subnet/token etc */ 351 uint_t lifru_ppa; /* SIOCSLIFNAME */ 352 } lifr_lifru1; 353 #define lifr_addrlen lifr_lifru1.lifru_addrlen 354 #define lifr_ppa lifr_lifru1.lifru_ppa /* Driver's ppa */ 355 uint_t lifr_movetoindex; /* FAILOVER/FAILBACK ifindex */ 356 union { 357 struct sockaddr_storage lifru_addr; 358 struct sockaddr_storage lifru_dstaddr; 359 struct sockaddr_storage lifru_broadaddr; 360 struct sockaddr_storage lifru_token; /* With lifr_addrlen */ 361 struct sockaddr_storage lifru_subnet; /* With lifr_addrlen */ 362 int lifru_index; /* interface index */ 363 uint64_t lifru_flags; /* Flags for SIOC?LIFFLAGS */ 364 int lifru_metric; 365 uint_t lifru_mtu; 366 char lifru_data[1]; /* interface dependent data */ 367 char lifru_enaddr[6]; 368 int lif_muxid[2]; /* mux id's for arp and ip */ 369 struct lif_nd_req lifru_nd_req; 370 struct lif_ifinfo_req lifru_ifinfo_req; 371 char lifru_groupname[LIFGRNAMSIZ]; /* SIOC[GS]LIFGROUPNAME */ 372 uint_t lifru_delay; /* SIOC[GS]LIFNOTIFYDELAY */ 373 zoneid_t lifru_zoneid; /* SIOC[GS]LIFZONE */ 374 } lifr_lifru; 375 376 #define lifr_addr lifr_lifru.lifru_addr /* address */ 377 #define lifr_dstaddr lifr_lifru.lifru_dstaddr /* other end of p-to-p link */ 378 #define lifr_broadaddr lifr_lifru.lifru_broadaddr /* broadcast address */ 379 #define lifr_token lifr_lifru.lifru_token /* address token */ 380 #define lifr_subnet lifr_lifru.lifru_subnet /* subnet prefix */ 381 #define lifr_index lifr_lifru.lifru_index /* interface index */ 382 #define lifr_flags lifr_lifru.lifru_flags /* flags */ 383 #define lifr_metric lifr_lifru.lifru_metric /* metric */ 384 #define lifr_mtu lifr_lifru.lifru_mtu /* mtu */ 385 #define lifr_data lifr_lifru.lifru_data /* for use by interface */ 386 #define lifr_enaddr lifr_lifru.lifru_enaddr /* ethernet address */ 387 #define lifr_index lifr_lifru.lifru_index /* interface index */ 388 #define lifr_ip_muxid lifr_lifru.lif_muxid[0] 389 #define lifr_arp_muxid lifr_lifru.lif_muxid[1] 390 #define lifr_nd lifr_lifru.lifru_nd_req /* SIOCLIF*ND */ 391 #define lifr_ifinfo lifr_lifru.lifru_ifinfo_req /* SIOC[GS]LIFLNKINFO */ 392 #define lifr_groupname lifr_lifru.lifru_groupname 393 #define lifr_delay lifr_lifru.lifru_delay 394 #define lifr_zoneid lifr_lifru.lifru_zoneid 395 }; 396 #endif /* defined(_INT64_TYPE) */ 397 398 /* 399 * Argument structure for SIOCT* address testing ioctls. 400 */ 401 struct sioc_addrreq { 402 struct sockaddr_storage sa_addr; /* Address to test */ 403 int sa_res; /* Result - 0/1 */ 404 int sa_pad; 405 }; 406 407 /* 408 * Argument structure used by mrouted to get src-grp pkt counts using 409 * SIOCGETLSGCNT. See <netinet/ip_mroute.h>. 410 */ 411 struct sioc_lsg_req { 412 struct sockaddr_storage slr_src; 413 struct sockaddr_storage slr_grp; 414 uint_t slr_pktcnt; 415 uint_t slr_bytecnt; 416 uint_t slr_wrong_if; 417 uint_t slr_pad; 418 }; 419 420 /* 421 * OBSOLETE: Replaced by struct lifreq. Supported for compatibility. 422 * 423 * Interface request structure used for socket 424 * ioctl's. All interface ioctl's must have parameter 425 * definitions which begin with ifr_name. The 426 * remainder may be interface specific. 427 */ 428 struct ifreq { 429 #define IFNAMSIZ 16 430 char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 431 union { 432 struct sockaddr ifru_addr; 433 struct sockaddr ifru_dstaddr; 434 char ifru_oname[IFNAMSIZ]; /* other if name */ 435 struct sockaddr ifru_broadaddr; 436 int ifru_index; /* interface index */ 437 short ifru_flags; 438 int ifru_metric; 439 char ifru_data[1]; /* interface dependent data */ 440 char ifru_enaddr[6]; 441 int if_muxid[2]; /* mux id's for arp and ip */ 442 443 /* Struct for flags/ppa */ 444 struct ifr_ppaflags { 445 short ifrup_flags; /* Space of ifru_flags. */ 446 short ifrup_filler; 447 uint_t ifrup_ppa; 448 } ifru_ppaflags; 449 450 /* Struct for FDDI ioctl's */ 451 struct ifr_dnld_reqs { 452 uint32_t v_addr; 453 uint32_t m_addr; 454 uint32_t ex_addr; 455 uint32_t size; 456 } ifru_dnld_req; 457 458 /* Struct for FDDI stats */ 459 struct ifr_fddi_stats { 460 uint32_t stat_size; 461 uint32_t fddi_stats; 462 } ifru_fddi_stat; 463 464 struct ifr_netmapents { 465 uint32_t map_ent_size, /* size of netmap structure */ 466 entry_number; /* index into netmap list */ 467 uint32_t fddi_map_ent; /* pointer to user structure */ 468 } ifru_netmapent; 469 470 /* Field for generic ioctl for fddi */ 471 472 struct ifr_fddi_gen_struct { 473 uint32_t ifru_fddi_gioctl; /* field for gen ioctl */ 474 uint32_t ifru_fddi_gaddr; /* Generic ptr to a field */ 475 } ifru_fddi_gstruct; 476 477 } ifr_ifru; 478 479 #define ifr_addr ifr_ifru.ifru_addr /* address */ 480 #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ 481 #define ifr_oname ifr_ifru.ifru_oname /* other if name */ 482 #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ 483 #define ifr_flags ifr_ifru.ifru_flags /* flags */ 484 #define ifr_metric ifr_ifru.ifru_metric /* metric */ 485 #define ifr_data ifr_ifru.ifru_data /* for use by interface */ 486 #define ifr_enaddr ifr_ifru.ifru_enaddr /* ethernet address */ 487 #define ifr_index ifr_ifru.ifru_index /* interface index */ 488 /* For setting ppa */ 489 #define ifr_ppa ifr_ifru.ifru_ppaflags.ifrup_ppa 490 491 /* FDDI specific */ 492 #define ifr_dnld_req ifr_ifru.ifru_dnld_req 493 #define ifr_fddi_stat ifr_ifru.ifru_fddi_stat 494 #define ifr_fddi_netmap ifr_ifru.ifru_netmapent /* FDDI network map entries */ 495 #define ifr_fddi_gstruct ifr_ifru.ifru_fddi_gstruct 496 497 #define ifr_ip_muxid ifr_ifru.if_muxid[0] 498 #define ifr_arp_muxid ifr_ifru.if_muxid[1] 499 }; 500 501 /* Used by SIOCGLIFNUM. Uses same flags as in struct lifconf */ 502 struct lifnum { 503 sa_family_t lifn_family; 504 int lifn_flags; /* request specific interfaces */ 505 int lifn_count; /* Result */ 506 }; 507 508 /* 509 * Structure used in SIOCGLIFCONF request. 510 * Used to retrieve interface configuration 511 * for machine (useful for programs which 512 * must know all networks accessible) for a given address family. 513 * Using AF_UNSPEC will retrieve all address families. 514 */ 515 struct lifconf { 516 sa_family_t lifc_family; 517 int lifc_flags; /* request specific interfaces */ 518 int lifc_len; /* size of associated buffer */ 519 union { 520 caddr_t lifcu_buf; 521 struct lifreq *lifcu_req; 522 } lifc_lifcu; 523 #define lifc_buf lifc_lifcu.lifcu_buf /* buffer address */ 524 #define lifc_req lifc_lifcu.lifcu_req /* array of structures returned */ 525 }; 526 527 /* 528 * Structure used in SIOCGLIFSRCOF to get the interface 529 * configuration list for those interfaces that use an address 530 * hosted on the interface (set in lifs_ifindex), as the source 531 * address. 532 */ 533 struct lifsrcof { 534 uint_t lifs_ifindex; /* interface of interest */ 535 size_t lifs_maxlen; /* size of buffer: input */ 536 size_t lifs_len; /* size of buffer: output */ 537 union { 538 caddr_t lifsu_buf; 539 struct lifreq *lifsu_req; 540 } lifs_lifsu; 541 #define lifs_buf lifs_lifsu.lifsu_buf /* buffer address */ 542 #define lifs_req lifs_lifsu.lifsu_req /* array returned */ 543 }; 544 545 /* Flags */ 546 #define LIFC_NOXMIT 0x01 /* Include IFF_NOXMIT interfaces */ 547 #define LIFC_EXTERNAL_SOURCE 0x02 /* Exclude the interfaces which can't */ 548 /* be used to communicate outside the */ 549 /* node (exclude interfaces which are */ 550 /* IFF_NOXMIT, IFF_NOLOCAL, */ 551 /* IFF_LOOPBACK, IFF_DEPRECATED, or */ 552 /* not IFF_UP). Has priority over */ 553 /* LIFC_NOXMIT. */ 554 #define LIFC_TEMPORARY 0x04 /* Include IFF_TEMPORARY interfaces */ 555 #define LIFC_ALLZONES 0x08 /* Include all zones */ 556 /* (must be issued from global zone) */ 557 558 #if defined(_SYSCALL32) 559 560 struct lifconf32 { 561 sa_family_t lifc_family; 562 int lifc_flags; /* request specific interfaces */ 563 int32_t lifc_len; /* size of associated buffer */ 564 union { 565 caddr32_t lifcu_buf; 566 caddr32_t lifcu_req; 567 } lifc_lifcu; 568 }; 569 570 struct lifsrcof32 { 571 uint_t lifs_ifindex; /* interface of interest */ 572 size32_t lifs_maxlen; /* size of buffer: input */ 573 size32_t lifs_len; /* size of buffer: output */ 574 union { 575 caddr32_t lifsu_buf; 576 caddr32_t lifsu_req; 577 } lifs_lifsu; 578 }; 579 580 #endif /* _SYSCALL32 */ 581 582 /* 583 * OBSOLETE: Structure used in SIOCGIFCONF request. 584 * Used to retrieve interface configuration 585 * for machine (useful for programs which 586 * must know all networks accessible). 587 */ 588 struct ifconf { 589 int ifc_len; /* size of associated buffer */ 590 union { 591 caddr_t ifcu_buf; 592 struct ifreq *ifcu_req; 593 } ifc_ifcu; 594 #define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ 595 #define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */ 596 }; 597 598 #if defined(_SYSCALL32) 599 600 struct ifconf32 { 601 int32_t ifc_len; /* size of associated buffer */ 602 union { 603 caddr32_t ifcu_buf; 604 caddr32_t ifcu_req; 605 } ifc_ifcu; 606 }; 607 608 #endif /* _SYSCALL32 */ 609 610 typedef struct if_data { 611 /* generic interface information */ 612 uchar_t ifi_type; /* ethernet, tokenring, etc */ 613 uchar_t ifi_addrlen; /* media address length */ 614 uchar_t ifi_hdrlen; /* media header length */ 615 uint_t ifi_mtu; /* maximum transmission unit */ 616 uint_t ifi_metric; /* routing metric (external only) */ 617 uint_t ifi_baudrate; /* linespeed */ 618 /* volatile statistics */ 619 uint_t ifi_ipackets; /* packets received on interface */ 620 uint_t ifi_ierrors; /* input errors on interface */ 621 uint_t ifi_opackets; /* packets sent on interface */ 622 uint_t ifi_oerrors; /* output errors on interface */ 623 uint_t ifi_collisions; /* collisions on csma interfaces */ 624 uint_t ifi_ibytes; /* total number of octets received */ 625 uint_t ifi_obytes; /* total number of octets sent */ 626 uint_t ifi_imcasts; /* packets received via multicast */ 627 uint_t ifi_omcasts; /* packets sent via multicast */ 628 uint_t ifi_iqdrops; /* dropped on input, this interface */ 629 uint_t ifi_noproto; /* destined for unsupported protocol */ 630 #if defined(_LP64) 631 struct timeval32 ifi_lastchange; /* last updated */ 632 #else 633 struct timeval ifi_lastchange; /* last updated */ 634 #endif 635 } if_data_t; 636 637 /* 638 * Message format for use in obtaining information about interfaces 639 * from the routing socket 640 */ 641 typedef struct if_msghdr { 642 ushort_t ifm_msglen; /* to skip over non-understood messages */ 643 uchar_t ifm_version; /* future binary compatibility */ 644 uchar_t ifm_type; /* message type */ 645 int ifm_addrs; /* like rtm_addrs */ 646 int ifm_flags; /* value of if_flags */ 647 ushort_t ifm_index; /* index for associated ifp */ 648 struct if_data ifm_data; /* statistics and other data about if */ 649 } if_msghdr_t; 650 651 /* 652 * Message format for use in obtaining information about interface addresses 653 * from the routing socket 654 */ 655 typedef struct ifa_msghdr { 656 ushort_t ifam_msglen; /* to skip over non-understood messages */ 657 uchar_t ifam_version; /* future binary compatibility */ 658 uchar_t ifam_type; /* message type */ 659 int ifam_addrs; /* like rtm_addrs */ 660 int ifam_flags; /* route flags */ 661 ushort_t ifam_index; /* index for associated ifp */ 662 int ifam_metric; /* value of ipif_metric */ 663 } ifa_msghdr_t; 664 665 /* currently tunnels only support IPv4 or IPv6 */ 666 enum ifta_proto { 667 IFTAP_INVALID, 668 IFTAP_IPV4, 669 IFTAP_IPV6 670 }; 671 672 #define IFTUN_SECINFOLEN 8 /* In units of 32-bit words. */ 673 #define IFTUN_VERSION 1 /* Current version number. */ 674 675 /* 676 * Used by tunneling module to get/set a tunnel parameters using 677 * SIOCTUN[SG]PARAM. 678 * 679 * There is a version number and an array of uint32_t at the end of this 680 * ioctl because in a perfect world, the ipsec_req_t would be inside 681 * tun_addreq. Since this file is independent of IP (and IPsec), I have to 682 * just leave room there, and have the appropriate handlers deal with the 683 * security information. 684 * 685 * In the future, the sockaddr types and the ta_vers could be used together 686 * to determine the nature of the security information that is at the end 687 * of this ioctl. 688 */ 689 struct iftun_req { 690 char ifta_lifr_name[LIFNAMSIZ]; /* if name */ 691 struct sockaddr_storage ifta_saddr; /* source address */ 692 struct sockaddr_storage ifta_daddr; /* destination address */ 693 uint_t ifta_flags; /* See below */ 694 /* IP version information is read only */ 695 enum ifta_proto ifta_upper; /* IP version above tunnel */ 696 enum ifta_proto ifta_lower; /* IP version below tunnel */ 697 uint_t ifta_vers; /* Version number */ 698 uint32_t ifta_secinfo[IFTUN_SECINFOLEN]; /* Security prefs. */ 699 int16_t ifta_encap_lim; /* Encapsulation limit */ 700 uint8_t ifta_hop_limit; /* Hop limit */ 701 uint8_t ifta_spare0; /* Pad to 64-bit boundary */ 702 uint32_t ifta_spare1; 703 }; 704 705 /* ifta_flags are set to indicate which members are valid */ 706 #define IFTUN_SRC 0x01 707 #define IFTUN_DST 0x02 708 #define IFTUN_SECURITY 0x04 /* Pay attention to secinfo */ 709 #define IFTUN_ENCAP 0x08 /* Pay attention to encap */ 710 #define IFTUN_HOPLIMIT 0x10 /* Pay attention to hoplimit */ 711 712 #endif /* !defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__) */ 713 714 /* 715 * The if_nameindex structure holds the interface index value about 716 * a single interface. An array of this structure is used to return 717 * all interfaces and indexes. 718 */ 719 struct if_nameindex { 720 unsigned if_index; /* positive interface index */ 721 char *if_name; /* if name, e.g. "en0" */ 722 }; 723 724 /* Interface index identification API definitions */ 725 extern unsigned if_nametoindex(const char *); 726 extern char *if_indextoname(unsigned, char *); 727 extern struct if_nameindex *if_nameindex(void); 728 extern void if_freenameindex(struct if_nameindex *); 729 730 #define IF_NAMESIZE _LIFNAMSIZ 731 732 #ifdef __cplusplus 733 } 734 #endif 735 736 #endif /* _NET_IF_H */ 737