| 1 | /*	$OpenBSD: if.h,v 1.223 2025/12/09 03:33:06 dlg Exp $	*/ |
| 2 | /*	$NetBSD: if.h,v 1.23 1996/05/07 02:40:27 thorpej Exp $	*/ |
| 3 | |
| 4 | /* |
| 5 | * Copyright (c) 1982, 1986, 1989, 1993 |
| 6 | *	The Regents of the University of California. All rights reserved. |
| 7 | * |
| 8 | * Redistribution and use in source and binary forms, with or without |
| 9 | * modification, are permitted provided that the following conditions |
| 10 | * are met: |
| 11 | * 1. Redistributions of source code must retain the above copyright |
| 12 | * notice, this list of conditions and the following disclaimer. |
| 13 | * 2. Redistributions in binary form must reproduce the above copyright |
| 14 | * notice, this list of conditions and the following disclaimer in the |
| 15 | * documentation and/or other materials provided with the distribution. |
| 16 | * 3. Neither the name of the University nor the names of its contributors |
| 17 | * may be used to endorse or promote products derived from this software |
| 18 | * without specific prior written permission. |
| 19 | * |
| 20 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
| 21 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 22 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 23 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
| 24 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 25 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| 26 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| 27 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| 28 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| 29 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| 30 | * SUCH DAMAGE. |
| 31 | * |
| 32 | *	@(#)if.h	8.1 (Berkeley) 6/10/93 |
| 33 | */ |
| 34 | |
| 35 | #ifndef _NET_IF_H_ |
| 36 | #define _NET_IF_H_ |
| 37 | |
| 38 | #include <sys/cdefs.h> |
| 39 | |
| 40 | /* |
| 41 | * Length of interface external name, including terminating '\0'. |
| 42 | * Note: this is the same size as a generic device's external name. |
| 43 | */ |
| 44 | #define	IF_NAMESIZE	16 |
| 45 | |
| 46 | struct if_nameindex { |
| 47 | 	unsigned int	if_index; |
| 48 | 	char		*if_name; |
| 49 | }; |
| 50 | |
| 51 | #ifndef _KERNEL |
| 52 | __BEGIN_DECLS |
| 53 | unsigned int if_nametoindex(const char *); |
| 54 | char	*if_indextoname(unsigned int, char *); |
| 55 | struct	if_nameindex *if_nameindex(void); |
| 56 | void	if_freenameindex(struct if_nameindex *); |
| 57 | __END_DECLS |
| 58 | #endif |
| 59 | |
| 60 | #if __BSD_VISIBLE |
| 61 | |
| 62 | #include <sys/types.h> |
| 63 | #include <sys/time.h> |
| 64 | #include <sys/socket.h> |
| 65 | |
| 66 | /* |
| 67 | * Structure used to query names of interface cloners. |
| 68 | */ |
| 69 | struct if_clonereq { |
| 70 | 	int	ifcr_total;		/* total cloners (out) */ |
| 71 | 	int	ifcr_count;		/* room for this many in user buffer */ |
| 72 | 	char	*ifcr_buffer;		/* buffer for cloner names */ |
| 73 | }; |
| 74 | |
| 75 | #define MCLPOOLS	8		/* number of cluster pools */ |
| 76 | |
| 77 | struct if_rxring { |
| 78 | 	int rxr_adjusted; |
| 79 | 	u_int	rxr_alive; |
| 80 | 	u_int	rxr_cwm; |
| 81 | 	u_int	rxr_lwm; |
| 82 | 	u_int	rxr_hwm; |
| 83 | }; |
| 84 | |
| 85 | struct if_rxring_info { |
| 86 | 	char	ifr_name[16];		/* name of the ring */ |
| 87 | 	u_int	ifr_size;		/* size of the packets on the ring */ |
| 88 | 	struct if_rxring ifr_info; |
| 89 | }; |
| 90 | |
| 91 | /* Structure used in SIOCGIFRXR request. */ |
| 92 | struct if_rxrinfo { |
| 93 | 	u_int	ifri_total; |
| 94 | 	struct if_rxring_info *ifri_entries; |
| 95 | }; |
| 96 | |
| 97 | /* |
| 98 | * Structure defining statistics and other data kept regarding a network |
| 99 | * interface. |
| 100 | */ |
| 101 | struct	if_data { |
| 102 | 	/* generic interface information */ |
| 103 | 	u_char		ifi_type;		/* ethernet, tokenring, etc. */ |
| 104 | 	u_char		ifi_addrlen;		/* media address length */ |
| 105 | 	u_char		ifi_hdrlen;		/* media header length */ |
| 106 | 	u_char		ifi_link_state;		/* current link state */ |
| 107 | 	u_int32_t	ifi_mtu;		/* maximum transmission unit */ |
| 108 | 	u_int32_t	ifi_metric;		/* routing metric (external only) */ |
| 109 | 	u_int32_t	ifi_rdomain;		/* routing instance */ |
| 110 | 	u_int64_t	ifi_baudrate;		/* linespeed */ |
| 111 | 	/* volatile statistics */ |
| 112 | 	u_int64_t	ifi_ipackets;		/* packets received on interface */ |
| 113 | 	u_int64_t	ifi_ierrors;		/* input errors on interface */ |
| 114 | 	u_int64_t	ifi_opackets;		/* packets sent on interface */ |
| 115 | 	u_int64_t	ifi_oerrors;		/* output errors on interface */ |
| 116 | 	u_int64_t	ifi_collisions;		/* collisions on csma interfaces */ |
| 117 | 	u_int64_t	ifi_ibytes;		/* total number of octets received */ |
| 118 | 	u_int64_t	ifi_obytes;		/* total number of octets sent */ |
| 119 | 	u_int64_t	ifi_imcasts;		/* packets received via multicast */ |
| 120 | 	u_int64_t	ifi_omcasts;		/* packets sent via multicast */ |
| 121 | 	u_int64_t	ifi_iqdrops;		/* dropped on input, this interface */ |
| 122 | 	u_int64_t	ifi_oqdrops;		/* dropped on output, this interface */ |
| 123 | 	u_int64_t	ifi_noproto;		/* destined for unsupported protocol */ |
| 124 | 	u_int32_t	ifi_capabilities;	/* interface capabilities */ |
| 125 | 	struct	timeval ifi_lastchange;	/* last operational state change */ |
| 126 | }; |
| 127 | |
| 128 | #define IFQ_NQUEUES	8 |
| 129 | #define IFQ_MINPRIO	0 |
| 130 | #define IFQ_MAXPRIO	IFQ_NQUEUES - 1 |
| 131 | #define IFQ_DEFPRIO	3 |
| 132 | #define IFQ_PRIO2TOS(_p) ((_p) << 5) |
| 133 | #define IFQ_TOS2PRIO(_t) ((_t) >> 5) |
| 134 | |
| 135 | /* |
| 136 | * Values for if_link_state. |
| 137 | */ |
| 138 | #define LINK_STATE_UNKNOWN	0	/* link unknown */ |
| 139 | #define LINK_STATE_INVALID	1	/* link invalid */ |
| 140 | #define LINK_STATE_DOWN		2	/* link is down */ |
| 141 | #define LINK_STATE_KALIVE_DOWN	3	/* keepalive reports down */ |
| 142 | #define LINK_STATE_UP		4	/* link is up */ |
| 143 | #define LINK_STATE_HALF_DUPLEX	5	/* link is up and half duplex */ |
| 144 | #define LINK_STATE_FULL_DUPLEX	6	/* link is up and full duplex */ |
| 145 | |
| 146 | #define LINK_STATE_IS_UP(_s)	\ |
| 147 | 		((_s) >= LINK_STATE_UP || (_s) == LINK_STATE_UNKNOWN) |
| 148 | |
| 149 | /* |
| 150 | * Status bit descriptions for the various interface types. |
| 151 | */ |
| 152 | struct if_status_description { |
| 153 | 	u_char	ifs_type; |
| 154 | 	u_char	ifs_state; |
| 155 | 	const char *ifs_string; |
| 156 | }; |
| 157 | |
| 158 | #define LINK_STATE_DESC_MATCH(_ifs, _t, _s)				\ |
| 159 | 	(((_ifs)->ifs_type == (_t) || (_ifs)->ifs_type == 0) &&		\ |
| 160 | 	 (_ifs)->ifs_state == (_s)) |
| 161 | |
| 162 | |
| 163 | #define LINK_STATE_DESCRIPTIONS {					\ |
| 164 | 	{ IFT_ETHER, LINK_STATE_DOWN, "no carrier" },			\ |
| 165 | 									\ |
| 166 | 	{ IFT_IEEE80211, LINK_STATE_DOWN, "no network" },		\ |
| 167 | 									\ |
| 168 | 	{ IFT_PPP, LINK_STATE_DOWN, "no carrier" },			\ |
| 169 | 									\ |
| 170 | 	{ IFT_CARP, LINK_STATE_DOWN, "backup" },			\ |
| 171 | 	{ IFT_CARP, LINK_STATE_UP, "master" },				\ |
| 172 | 	{ IFT_CARP, LINK_STATE_HALF_DUPLEX, "master" },			\ |
| 173 | 	{ IFT_CARP, LINK_STATE_FULL_DUPLEX, "master" },			\ |
| 174 | 									\ |
| 175 | 	{ 0, LINK_STATE_UP, "active" },					\ |
| 176 | 	{ 0, LINK_STATE_HALF_DUPLEX, "active" },			\ |
| 177 | 	{ 0, LINK_STATE_FULL_DUPLEX, "active" },			\ |
| 178 | 									\ |
| 179 | 	{ 0, LINK_STATE_UNKNOWN, "unknown" },				\ |
| 180 | 	{ 0, LINK_STATE_INVALID, "invalid" },				\ |
| 181 | 	{ 0, LINK_STATE_DOWN, "down" },					\ |
| 182 | 	{ 0, LINK_STATE_KALIVE_DOWN, "keepalive down" },		\ |
| 183 | 	{ 0, 0, NULL }							\ |
| 184 | } |
| 185 | |
| 186 | /* Traditional BSD name for length of interface external name. */ |
| 187 | #define	IFNAMSIZ	IF_NAMESIZE |
| 188 | |
| 189 | /* |
| 190 | * Length of interface description, including terminating '\0'. |
| 191 | */ |
| 192 | #define	IFDESCRSIZE	64 |
| 193 | |
| 194 | /* |
| 195 | * Interface flags can be either owned by the stack or the driver. The |
| 196 | * symbols below document who is toggling which flag. |
| 197 | * |
| 198 | *	I	immutable after creation |
| 199 | *	N	written by the stack (upon user request) |
| 200 | *	d	written by the driver |
| 201 | *	c	for userland compatibility only |
| 202 | */ |
| 203 | #define	IFF_UP		0x1		/* [N] interface is up */ |
| 204 | #define	IFF_BROADCAST	0x2		/* [I] broadcast address valid */ |
| 205 | #define	IFF_DEBUG	0x4		/* [N] turn on debugging */ |
| 206 | #define	IFF_LOOPBACK	0x8		/* [I] is a loopback net */ |
| 207 | #define	IFF_POINTOPOINT	0x10		/* [I] is point-to-point link */ |
| 208 | #define	IFF_STATICARP	0x20		/* [N] only static ARP */ |
| 209 | #define	IFF_RUNNING	0x40		/* [d] resources allocated */ |
| 210 | #define	IFF_NOARP	0x80		/* [N] no address resolution protocol */ |
| 211 | #define	IFF_PROMISC	0x100		/* [N] receive all packets */ |
| 212 | #define	IFF_ALLMULTI	0x200		/* [d] receive all multicast packets */ |
| 213 | #define	IFF_OACTIVE	0x400		/* [c] transmission in progress */ |
| 214 | #define	IFF_SIMPLEX	0x800		/* [I] can't hear own transmissions */ |
| 215 | #define	IFF_LINK0	0x1000		/* [N] per link layer defined bit */ |
| 216 | #define	IFF_LINK1	0x2000		/* [N] per link layer defined bit */ |
| 217 | #define	IFF_LINK2	0x4000		/* [N] per link layer defined bit */ |
| 218 | #define	IFF_MULTICAST	0x8000		/* [I] supports multicast */ |
| 219 | |
| 220 | /* flags set internally only: */ |
| 221 | #define	IFF_CANTCHANGE \ |
| 222 | 	(IFF_BROADCAST|IFF_LOOPBACK|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|\ |
| 223 | 	 IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI) |
| 224 | |
| 225 | #define	IFXF_MPSAFE		0x1	/* [I] if_start is mpsafe */ |
| 226 | #define	IFXF_CLONED		0x2	/* [I] pseudo interface */ |
| 227 | #define	IFXF_AUTOCONF6TEMP	0x4	/* [N] v6 temporary addrs enabled */ |
| 228 | #define	IFXF_MPLS		0x8	/* [N] supports MPLS */ |
| 229 | #define	IFXF_WOL		0x10	/* [N] wake on lan enabled */ |
| 230 | #define	IFXF_AUTOCONF6		0x20	/* [N] v6 autoconf enabled */ |
| 231 | #define IFXF_INET6_NOSOII	0x40	/* [N] don't do RFC 7217 */ |
| 232 | #define	IFXF_AUTOCONF4		0x80	/* [N] v4 autoconf (aka dhcp) enabled */ |
| 233 | #define	IFXF_MONITOR		0x100	/* [N] only used for bpf */ |
| 234 | #define	IFXF_LRO		0x200	/* [N] TCP large recv offload */ |
| 235 | |
| 236 | #define	IFXF_CANTCHANGE \ |
| 237 | 	(IFXF_MPSAFE|IFXF_CLONED) |
| 238 | |
| 239 | /* |
| 240 | * Some convenience macros used for setting ifi_baudrate. |
| 241 | */ |
| 242 | #define	IF_Kbps(x)	((x) * 1000ULL)			/* kilobits/sec. */ |
| 243 | #define	IF_Mbps(x)	(IF_Kbps((x) * 1000ULL))	/* megabits/sec. */ |
| 244 | #define	IF_Gbps(x)	(IF_Mbps((x) * 1000ULL))	/* gigabits/sec. */ |
| 245 | |
| 246 | /* Capabilities that interfaces can advertise. */ |
| 247 | #define	IFCAP_CSUM_IPv4		0x00000001	/* can do IPv4 header csum */ |
| 248 | #define	IFCAP_CSUM_TCPv4	0x00000002	/* can do IPv4/TCP csum */ |
| 249 | #define	IFCAP_CSUM_UDPv4	0x00000004	/* can do IPv4/UDP csum */ |
| 250 | #define	IFCAP_VLAN_MTU		0x00000010	/* VLAN-compatible MTU */ |
| 251 | #define	IFCAP_VLAN_HWTAGGING	0x00000020	/* hardware VLAN tag support */ |
| 252 | #define	IFCAP_VLAN_HWOFFLOAD	0x00000040	/* hw offload w/ inline tag */ |
| 253 | #define	IFCAP_CSUM_TCPv6	0x00000080	/* can do IPv6/TCP checksums */ |
| 254 | #define	IFCAP_CSUM_UDPv6	0x00000100	/* can do IPv6/UDP checksums */ |
| 255 | #define	IFCAP_TSOv4		0x00001000	/* IPv4/TCP segment offload */ |
| 256 | #define	IFCAP_TSOv6		0x00002000	/* IPv6/TCP segment offload */ |
| 257 | #define	IFCAP_LRO		0x00004000	/* TCP large recv offload */ |
| 258 | #define	IFCAP_WOL		0x00008000	/* can do wake on lan */ |
| 259 | |
| 260 | #define IFCAP_CSUM_MASK		(IFCAP_CSUM_IPv4 | IFCAP_CSUM_TCPv4 | \ |
| 261 | IFCAP_CSUM_UDPv4 | IFCAP_CSUM_TCPv6 | IFCAP_CSUM_UDPv6) |
| 262 | |
| 263 | /* symbolic names for terminal (per-protocol) CTL_IFQ_ nodes */ |
| 264 | #define IFQCTL_LEN 1 |
| 265 | #define IFQCTL_MAXLEN 2 |
| 266 | #define IFQCTL_DROPS 3 |
| 267 | #define IFQCTL_CONGESTION 4 |
| 268 | #define IFQCTL_MAXID 5 |
| 269 | |
| 270 | /* sysctl for ifq (per-protocol packet input queue variant of ifqueue) */ |
| 271 | #define CTL_IFQ_NAMES { \ |
| 272 | 	{ 0, 0 }, \ |
| 273 | 	{ "len", CTLTYPE_INT }, \ |
| 274 | 	{ "maxlen", CTLTYPE_INT }, \ |
| 275 | 	{ "drops", CTLTYPE_INT }, \ |
| 276 | 	{ "congestion", CTLTYPE_INT }, \ |
| 277 | } |
| 278 | |
| 279 | /* |
| 280 | * Message format for use in obtaining information about interfaces |
| 281 | * from sysctl and the routing socket. |
| 282 | */ |
| 283 | struct if_msghdr { |
| 284 | 	u_short	ifm_msglen;	/* to skip over non-understood messages */ |
| 285 | 	u_char	ifm_version;	/* future binary compatibility */ |
| 286 | 	u_char	ifm_type;	/* message type */ |
| 287 | 	u_short ifm_hdrlen;	/* sizeof(if_msghdr) to skip over the header */ |
| 288 | 	u_short	ifm_index;	/* index for associated ifp */ |
| 289 | 	u_short	ifm_tableid;	/* routing table id */ |
| 290 | 	u_char	ifm_pad1; |
| 291 | 	u_char	ifm_pad2; |
| 292 | 	int	ifm_addrs;	/* like rtm_addrs */ |
| 293 | 	int	ifm_flags;	/* value of if_flags */ |
| 294 | 	int	ifm_xflags; |
| 295 | 	struct	if_data ifm_data;/* statistics and other data about if */ |
| 296 | }; |
| 297 | |
| 298 | /* |
| 299 | * Message format for use in obtaining information about interface addresses |
| 300 | * from sysctl and the routing socket. |
| 301 | */ |
| 302 | struct ifa_msghdr { |
| 303 | 	u_short	ifam_msglen;	/* to skip over non-understood messages */ |
| 304 | 	u_char	ifam_version;	/* future binary compatibility */ |
| 305 | 	u_char	ifam_type;	/* message type */ |
| 306 | 	u_short ifam_hdrlen;	/* sizeof(ifa_msghdr) to skip over the header */ |
| 307 | 	u_short	ifam_index;	/* index for associated ifp */ |
| 308 | 	u_short	ifam_tableid;	/* routing table id */ |
| 309 | 	u_char	ifam_pad1; |
| 310 | 	u_char	ifam_pad2; |
| 311 | 	int	ifam_addrs;	/* like rtm_addrs */ |
| 312 | 	int	ifam_flags;	/* value of ifa_flags */ |
| 313 | 	int	ifam_metric;	/* value of ifa_metric */ |
| 314 | }; |
| 315 | |
| 316 | /* |
| 317 | * Message format announcing the arrival or departure of a network interface. |
| 318 | */ |
| 319 | struct if_announcemsghdr { |
| 320 | 	u_short	ifan_msglen;	/* to skip over non-understood messages */ |
| 321 | 	u_char	ifan_version;	/* future binary compatibility */ |
| 322 | 	u_char	ifan_type;	/* message type */ |
| 323 | 	u_short ifan_hdrlen;	/* sizeof(if_announcemsghdr) to skip header */ |
| 324 | 	u_short	ifan_index;	/* index for associated ifp */ |
| 325 | 	u_short	ifan_what;	/* what type of announcement */ |
| 326 | 	char	ifan_name[IFNAMSIZ];	/* if name, e.g. "en0" */ |
| 327 | }; |
| 328 | |
| 329 | #define IFAN_ARRIVAL	0	/* interface arrival */ |
| 330 | #define IFAN_DEPARTURE	1	/* interface departure */ |
| 331 | |
| 332 | /* message format used to pass 80211 interface info */ |
| 333 | struct if_ieee80211_data { |
| 334 | 	uint8_t		ifie_channel;	/* IEEE80211_CHAN_MAX == 255 */ |
| 335 | 	uint8_t		ifie_nwid_len; |
| 336 | 	uint32_t	ifie_flags;	/* ieee80211com.ic_flags */ |
| 337 | 	uint32_t	ifie_xflags;	/* ieee80211com.ic xflags */ |
| 338 | 	uint8_t		ifie_nwid[32];	/* IEEE80211_NWID_LEN */ |
| 339 | 	uint8_t		ifie_addr[6];	/* IEEE80211_ADDR_LEN */ |
| 340 | }; |
| 341 | |
| 342 | struct if_ieee80211_msghdr { |
| 343 | 	uint16_t	ifim_msglen; |
| 344 | 	uint8_t		ifim_version; |
| 345 | 	uint8_t		ifim_type; |
| 346 | 	uint16_t	ifim_hdrlen; |
| 347 | 	uint16_t	ifim_index; |
| 348 | 	uint16_t	ifim_tableid; |
| 349 | |
| 350 | 	struct if_ieee80211_data	ifim_ifie; |
| 351 | }; |
| 352 | |
| 353 | /* message format used to pass interface name to index mappings */ |
| 354 | struct if_nameindex_msg { |
| 355 | 	unsigned int	if_index; |
| 356 | 	char		if_name[IFNAMSIZ]; |
| 357 | }; |
| 358 | |
| 359 | /* |
| 360 | * interface groups |
| 361 | */ |
| 362 | |
| 363 | #define	IFG_ALL		"all"		/* group contains all interfaces */ |
| 364 | #define	IFG_EGRESS	"egress"	/* if(s) default route(s) point to */ |
| 365 | |
| 366 | struct ifg_req { |
| 367 | 	union { |
| 368 | 		char			 ifgrqu_group[IFNAMSIZ]; |
| 369 | 		char			 ifgrqu_member[IFNAMSIZ]; |
| 370 | 	} ifgrq_ifgrqu; |
| 371 | #define	ifgrq_group	ifgrq_ifgrqu.ifgrqu_group |
| 372 | #define	ifgrq_member	ifgrq_ifgrqu.ifgrqu_member |
| 373 | }; |
| 374 | |
| 375 | struct ifg_attrib { |
| 376 | 	int	ifg_carp_demoted; |
| 377 | }; |
| 378 | |
| 379 | /* |
| 380 | * Used to lookup groups for an interface |
| 381 | */ |
| 382 | struct ifgroupreq { |
| 383 | 	char	ifgr_name[IFNAMSIZ]; |
| 384 | 	u_int	ifgr_len; |
| 385 | 	union { |
| 386 | 		char			 ifgru_group[IFNAMSIZ]; |
| 387 | 		struct	ifg_req		*ifgru_groups; |
| 388 | 		struct	ifg_attrib	 ifgru_attrib; |
| 389 | 	} ifgr_ifgru; |
| 390 | #define ifgr_group	ifgr_ifgru.ifgru_group |
| 391 | #define ifgr_groups	ifgr_ifgru.ifgru_groups |
| 392 | #define ifgr_attrib	ifgr_ifgru.ifgru_attrib |
| 393 | }; |
| 394 | |
| 395 | /* |
| 396 | * Interface request structure used for socket |
| 397 | * ioctl's. All interface ioctl's must have parameter |
| 398 | * definitions which begin with ifr_name. The |
| 399 | * remainder may be interface specific. |
| 400 | */ |
| 401 | struct	ifreq { |
| 402 | 	char	ifr_name[IFNAMSIZ];		/* if name, e.g. "en0" */ |
| 403 | 	union { |
| 404 | 		struct	sockaddr	ifru_addr; |
| 405 | 		struct	sockaddr	ifru_dstaddr; |
| 406 | 		struct	sockaddr	ifru_broadaddr; |
| 407 | 		short			ifru_flags; |
| 408 | 		int			ifru_metric; |
| 409 | 		int64_t			ifru_vnetid; |
| 410 | 		uint64_t		ifru_media; |
| 411 | 		caddr_t			ifru_data; |
| 412 | 		unsigned int		ifru_index; |
| 413 | 	} ifr_ifru; |
| 414 | #define	ifr_addr	ifr_ifru.ifru_addr	/* address */ |
| 415 | #define	ifr_dstaddr	ifr_ifru.ifru_dstaddr	/* other end of p-to-p link */ |
| 416 | #define	ifr_broadaddr	ifr_ifru.ifru_broadaddr	/* broadcast address */ |
| 417 | #define	ifr_flags	ifr_ifru.ifru_flags	/* flags */ |
| 418 | #define	ifr_metric	ifr_ifru.ifru_metric	/* metric */ |
| 419 | #define	ifr_mtu		ifr_ifru.ifru_metric	/* mtu (overload) */ |
| 420 | #define	ifr_hardmtu	ifr_ifru.ifru_metric	/* hardmtu (overload) */ |
| 421 | #define	ifr_media	ifr_ifru.ifru_media	/* media options */ |
| 422 | #define	ifr_rdomainid	ifr_ifru.ifru_metric	/* VRF instance (overload) */ |
| 423 | #define ifr_vnetid	ifr_ifru.ifru_vnetid	/* Virtual Net Id */ |
| 424 | #define ifr_ttl		ifr_ifru.ifru_metric	/* tunnel TTL (overload) */ |
| 425 | #define ifr_df		ifr_ifru.ifru_metric	/* tunnel DF (overload) */ |
| 426 | #define	ifr_data	ifr_ifru.ifru_data	/* for use by interface */ |
| 427 | #define ifr_index	ifr_ifru.ifru_index	/* interface index */ |
| 428 | #define ifr_llprio	ifr_ifru.ifru_metric	/* link layer priority */ |
| 429 | #define ifr_hdrprio	ifr_ifru.ifru_metric	/* header prio field config */ |
| 430 | #define ifr_pwe3	ifr_ifru.ifru_metric	/* PWE3 type */ |
| 431 | }; |
| 432 | |
| 433 | #define IF_HDRPRIO_MIN		IFQ_MINPRIO |
| 434 | #define IF_HDRPRIO_MAX		IFQ_MAXPRIO |
| 435 | #define IF_HDRPRIO_PACKET	-1	/* use mbuf prio */ |
| 436 | #define IF_HDRPRIO_PAYLOAD	-2	/* copy payload prio */ |
| 437 | #define IF_HDRPRIO_OUTER	-3	/* use outer prio */ |
| 438 | |
| 439 | #define IF_PWE3_ETHERNET	1	/* ethernet or ethernet tagged */ |
| 440 | #define IF_PWE3_IP		2	/* IP layer 2 */ |
| 441 | |
| 442 | struct ifaliasreq { |
| 443 | 	char	ifra_name[IFNAMSIZ];		/* if name, e.g. "en0" */ |
| 444 | 	union { |
| 445 | 		struct	sockaddr ifrau_addr; |
| 446 | 		int	ifrau_align; |
| 447 | 	 } ifra_ifrau; |
| 448 | #ifndef ifra_addr |
| 449 | #define ifra_addr	ifra_ifrau.ifrau_addr |
| 450 | #endif |
| 451 | 	struct	sockaddr ifra_dstaddr; |
| 452 | #define	ifra_broadaddr	ifra_dstaddr |
| 453 | 	struct	sockaddr ifra_mask; |
| 454 | }; |
| 455 | |
| 456 | struct ifmediareq { |
| 457 | 	char		ifm_name[IFNAMSIZ];	/* if name, e.g. "en0" */ |
| 458 | 	uint64_t	ifm_current;		/* get/set current media options */ |
| 459 | 	uint64_t	ifm_mask;		/* don't care mask */ |
| 460 | 	uint64_t	ifm_status;		/* media status */ |
| 461 | 	uint64_t	ifm_active;		/* active options */ |
| 462 | 	int		ifm_count;		/* # entries in ifm_ulist array */ |
| 463 | 	uint64_t	*ifm_ulist;		/* media words */ |
| 464 | }; |
| 465 | |
| 466 | struct ifkalivereq { |
| 467 | 	char	ikar_name[IFNAMSIZ];		/* if name, e.g. "en0" */ |
| 468 | 	int	ikar_timeo; |
| 469 | 	int	ikar_cnt; |
| 470 | }; |
| 471 | |
| 472 | /* |
| 473 | * Structure used in SIOCGIFCONF request. |
| 474 | * Used to retrieve interface configuration |
| 475 | * for machine (useful for programs which |
| 476 | * must know all networks accessible). |
| 477 | */ |
| 478 | struct	ifconf { |
| 479 | 	int	ifc_len;		/* size of associated buffer */ |
| 480 | 	union { |
| 481 | 		caddr_t	ifcu_buf; |
| 482 | 		struct	ifreq *ifcu_req; |
| 483 | 	} ifc_ifcu; |
| 484 | #define	ifc_buf	ifc_ifcu.ifcu_buf	/* buffer address */ |
| 485 | #define	ifc_req	ifc_ifcu.ifcu_req	/* array of structures returned */ |
| 486 | }; |
| 487 | |
| 488 | /* |
| 489 | * Structure for SIOC[AGD]LIFADDR |
| 490 | */ |
| 491 | struct if_laddrreq { |
| 492 | 	char iflr_name[IFNAMSIZ]; |
| 493 | 	unsigned int flags; |
| 494 | #define IFLR_PREFIX	0x8000	/* in: prefix given out: kernel fills id */ |
| 495 | 	unsigned int prefixlen;		/* in/out */ |
| 496 | 	struct sockaddr_storage addr;	/* in/out */ |
| 497 | 	struct sockaddr_storage dstaddr; /* out */ |
| 498 | }; |
| 499 | |
| 500 | /* SIOCIFAFDETACH */ |
| 501 | struct if_afreq { |
| 502 | 	char		ifar_name[IFNAMSIZ]; |
| 503 | 	sa_family_t	ifar_af; |
| 504 | }; |
| 505 | |
| 506 | /* SIOC[SG]IFPARENT */ |
| 507 | struct if_parent { |
| 508 | 	char		ifp_name[IFNAMSIZ]; |
| 509 | 	char		ifp_parent[IFNAMSIZ]; |
| 510 | }; |
| 511 | |
| 512 | /* SIOCGIFSFFPAGE */ |
| 513 | |
| 514 | #define IFSFF_ADDR_EEPROM	0xa0 |
| 515 | #define IFSFF_ADDR_DDM		0xa2 |
| 516 | |
| 517 | #define IFSFF_DATA_LEN		256 |
| 518 | |
| 519 | struct if_sffpage { |
| 520 | 	char		 sff_ifname[IFNAMSIZ];		/* u -> k */ |
| 521 | 	uint8_t		 sff_addr;			/* u -> k */ |
| 522 | 	uint8_t		 sff_page;			/* u -> k */ |
| 523 | 	uint8_t		 sff_data[IFSFF_DATA_LEN];	/* k -> u */ |
| 524 | }; |
| 525 | |
| 526 | #include <net/if_arp.h> |
| 527 | |
| 528 | #ifdef _KERNEL |
| 529 | |
| 530 | #define IF_MAX_VECTORS		8 |
| 531 | |
| 532 | struct socket; |
| 533 | struct ifnet; |
| 534 | struct ifq_ops; |
| 535 | |
| 536 | void	if_alloc_sadl(struct ifnet *); |
| 537 | void	if_free_sadl(struct ifnet *); |
| 538 | void	if_attach(struct ifnet *); |
| 539 | void	if_attach_queues(struct ifnet *, unsigned int); |
| 540 | void	if_attach_iqueues(struct ifnet *, unsigned int); |
| 541 | void	if_attach_ifq(struct ifnet *, const struct ifq_ops *, void *); |
| 542 | void	if_attachhead(struct ifnet *); |
| 543 | void	if_deactivate(struct ifnet *); |
| 544 | void	if_detach(struct ifnet *); |
| 545 | void	if_down(struct ifnet *); |
| 546 | void	if_downall(void); |
| 547 | void	if_link_state_change(struct ifnet *); |
| 548 | void	if_up(struct ifnet *); |
| 549 | void	if_getdata(struct ifnet *, struct if_data *); |
| 550 | void	ifinit(void); |
| 551 | int	ifioctl(struct socket *, u_long, caddr_t, struct proc *); |
| 552 | int	ifpromisc(struct ifnet *, int); |
| 553 | int	ifsetlro(struct ifnet *, int); |
| 554 | struct	ifg_group *if_creategroup(const char *); |
| 555 | int	if_addgroup(struct ifnet *, const char *); |
| 556 | int	if_delgroup(struct ifnet *, const char *); |
| 557 | void	if_group_routechange(const struct sockaddr *, const struct sockaddr *); |
| 558 | struct	ifnet *if_unit(const char *); |
| 559 | struct	ifnet *if_get(unsigned int); |
| 560 | struct	ifnet *if_ref(struct ifnet *); |
| 561 | struct	ifnet *if_get_smr(unsigned int); |
| 562 | void	if_put(struct ifnet *); |
| 563 | void	ifnewlladdr(struct ifnet *); |
| 564 | void	if_congestion(void); |
| 565 | int	if_congested(void); |
| 566 | __dead void	unhandled_af(int); |
| 567 | int	if_setlladdr(struct ifnet *, const uint8_t *); |
| 568 | void	softnet_init(void); |
| 569 | void	softnet_percpu(void); |
| 570 | unsigned int |
| 571 | 	softnet_count(void); |
| 572 | struct taskq * |
| 573 | 	net_tq(unsigned int); |
| 574 | void	net_tq_barriers(const char *); |
| 575 | |
| 576 | #endif /* _KERNEL */ |
| 577 | |
| 578 | #endif /* __BSD_VISIBLE */ |
| 579 | |
| 580 | #endif /* _NET_IF_H_ */ |