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