xref: /illumos-gate/usr/src/uts/common/net/if.h (revision b11ac39f7d50211a3de081489d8d964e4cfeb0f9)
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	0x0100000000ll	/* IPv6 external resolver */
157 #define	IFF_COS_ENABLED	0x0200000000ll	/* If interface supports CoS marking */
158 #define	IFF_PREFERRED	0x0400000000ll	/* Prefer as source address */
159 #define	IFF_TEMPORARY	0x0800000000ll	/* RFC3041 */
160 
161 #define	IFF_FIXEDMTU	0x1000000000ll	/* MTU manually set with SIOCSLIFMTU */
162 
163 #define	IFF_VIRTUAL	0x2000000000ll	/* 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