| 1 | /*- |
| 2 | * SPDX-License-Identifier: BSD-3-Clause |
| 3 | * |
| 4 | * Copyright (c) 1982, 1986, 1989, 1993 |
| 5 | *	The Regents of the University of California. All rights reserved. |
| 6 | * |
| 7 | * Redistribution and use in source and binary forms, with or without |
| 8 | * modification, are permitted provided that the following conditions |
| 9 | * are met: |
| 10 | * 1. Redistributions of source code must retain the above copyright |
| 11 | * notice, this list of conditions and the following disclaimer. |
| 12 | * 2. Redistributions in binary form must reproduce the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer in the |
| 14 | * documentation and/or other materials provided with the distribution. |
| 15 | * 3. Neither the name of the University nor the names of its contributors |
| 16 | * may be used to endorse or promote products derived from this software |
| 17 | * without specific prior written permission. |
| 18 | * |
| 19 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
| 20 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 21 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 22 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
| 23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| 25 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| 26 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| 28 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| 29 | * SUCH DAMAGE. |
| 30 | */ |
| 31 | |
| 32 | #ifndef _NET_IF_H_ |
| 33 | #define	_NET_IF_H_ |
| 34 | |
| 35 | #include <sys/cdefs.h> |
| 36 | |
| 37 | #if __BSD_VISIBLE |
| 38 | /* |
| 39 | * <net/if.h> does not depend on <sys/time.h> on most other systems. This |
| 40 | * helps userland compatibility. (struct timeval ifi_lastchange) |
| 41 | * The same holds for <sys/socket.h>. (struct sockaddr ifru_addr) |
| 42 | */ |
| 43 | #ifndef _KERNEL |
| 44 | #include <sys/time.h> |
| 45 | #include <sys/socket.h> |
| 46 | #endif |
| 47 | #endif |
| 48 | |
| 49 | /* |
| 50 | * Length of interface external name, including terminating '\0'. |
| 51 | * Note: this is the same size as a generic device's external name. |
| 52 | */ |
| 53 | #define		IF_NAMESIZE	16 |
| 54 | #if __BSD_VISIBLE |
| 55 | #define		IFNAMSIZ	IF_NAMESIZE |
| 56 | #define		IF_MAXUNIT	0x7fff	/* historical value */ |
| 57 | #endif |
| 58 | #if __BSD_VISIBLE |
| 59 | |
| 60 | /* |
| 61 | * Structure used to query names of interface cloners. |
| 62 | */ |
| 63 | |
| 64 | struct if_clonereq { |
| 65 | 	int	ifcr_total;		/* total cloners (out) */ |
| 66 | 	int	ifcr_count;		/* room for this many in user buffer */ |
| 67 | 	char	*ifcr_buffer;		/* buffer for cloner names */ |
| 68 | }; |
| 69 | |
| 70 | /* |
| 71 | * Structure describing information about an interface |
| 72 | * which may be of interest to management entities. |
| 73 | */ |
| 74 | struct if_data { |
| 75 | 	/* generic interface information */ |
| 76 | 	uint8_t	ifi_type;		/* ethernet, tokenring, etc */ |
| 77 | 	uint8_t	ifi_physical;		/* e.g., AUI, Thinnet, 10base-T, etc */ |
| 78 | 	uint8_t	ifi_addrlen;		/* media address length */ |
| 79 | 	uint8_t	ifi_hdrlen;		/* media header length */ |
| 80 | 	uint8_t	ifi_link_state;		/* current link state */ |
| 81 | 	uint8_t	ifi_vhid;		/* carp vhid */ |
| 82 | 	uint16_t	ifi_datalen;	/* length of this data struct */ |
| 83 | 	uint32_t	ifi_mtu;	/* maximum transmission unit */ |
| 84 | 	uint32_t	ifi_metric;	/* routing metric (external only) */ |
| 85 | 	uint64_t	ifi_baudrate;	/* linespeed */ |
| 86 | 	/* volatile statistics */ |
| 87 | 	uint64_t	ifi_ipackets;	/* packets received on interface */ |
| 88 | 	uint64_t	ifi_ierrors;	/* input errors on interface */ |
| 89 | 	uint64_t	ifi_opackets;	/* packets sent on interface */ |
| 90 | 	uint64_t	ifi_oerrors;	/* output errors on interface */ |
| 91 | 	uint64_t	ifi_collisions;	/* collisions on csma interfaces */ |
| 92 | 	uint64_t	ifi_ibytes;	/* total number of octets received */ |
| 93 | 	uint64_t	ifi_obytes;	/* total number of octets sent */ |
| 94 | 	uint64_t	ifi_imcasts;	/* packets received via multicast */ |
| 95 | 	uint64_t	ifi_omcasts;	/* packets sent via multicast */ |
| 96 | 	uint64_t	ifi_iqdrops;	/* dropped on input */ |
| 97 | 	uint64_t	ifi_oqdrops;	/* dropped on output */ |
| 98 | 	uint64_t	ifi_noproto;	/* destined for unsupported protocol */ |
| 99 | 	uint64_t	ifi_hwassist;	/* HW offload capabilities, see IFCAP */ |
| 100 | |
| 101 | 	/* Unions are here to make sizes MI. */ |
| 102 | 	union {				/* uptime at attach or stat reset */ |
| 103 | 		time_t		tt; |
| 104 | 		uint64_t	ph; |
| 105 | 	} __ifi_epoch; |
| 106 | #define	ifi_epoch	__ifi_epoch.tt |
| 107 | 	union {				/* time of last administrative change */ |
| 108 | 		struct timeval	tv; |
| 109 | 		struct { |
| 110 | 			uint64_t ph1; |
| 111 | 			uint64_t ph2; |
| 112 | 		} ph; |
| 113 | 	} __ifi_lastchange; |
| 114 | #define	ifi_lastchange	__ifi_lastchange.tv |
| 115 | }; |
| 116 | |
| 117 | /*- |
| 118 | * Interface flags are of two types: network stack owned flags, and driver |
| 119 | * owned flags. Historically, these values were stored in the same ifnet |
| 120 | * flags field, but with the advent of fine-grained locking, they have been |
| 121 | * broken out such that the network stack is responsible for synchronizing |
| 122 | * the stack-owned fields, and the device driver the device-owned fields. |
| 123 | * Both halves can perform lockless reads of the other half's field, subject |
| 124 | * to accepting the involved races. |
| 125 | * |
| 126 | * Both sets of flags come from the same number space, and should not be |
| 127 | * permitted to conflict, as they are exposed to user space via a single |
| 128 | * field. |
| 129 | * |
| 130 | * The following symbols identify read and write requirements for fields: |
| 131 | * |
| 132 | * (i) if_flags field set by device driver before attach, read-only there |
| 133 | * after. |
| 134 | * (n) if_flags field written only by the network stack, read by either the |
| 135 | * stack or driver. |
| 136 | * (d) if_drv_flags field written only by the device driver, read by either |
| 137 | * the stack or driver. |
| 138 | */ |
| 139 | #define	IFF_UP		0x1		/* (n) interface is up */ |
| 140 | #define	IFF_BROADCAST	0x2		/* (i) broadcast address valid */ |
| 141 | #define	IFF_DEBUG	0x4		/* (n) turn on debugging */ |
| 142 | #define	IFF_LOOPBACK	0x8		/* (i) is a loopback net */ |
| 143 | #define	IFF_POINTOPOINT	0x10		/* (i) is a point-to-point link */ |
| 144 | #define	IFF_NEEDSEPOCH	0x20		/* (i) calls if_input w/o net epoch */ |
| 145 | #define	IFF_DRV_RUNNING	0x40		/* (d) resources allocated */ |
| 146 | #define	IFF_NOARP	0x80		/* (n) no address resolution protocol */ |
| 147 | #define	IFF_PROMISC	0x100		/* (n) receive all packets */ |
| 148 | #define	IFF_ALLMULTI	0x200		/* (n) receive all multicast packets */ |
| 149 | #define	IFF_DRV_OACTIVE	0x400		/* (d) tx hardware queue is full */ |
| 150 | #define	IFF_SIMPLEX	0x800		/* (i) can't hear own transmissions */ |
| 151 | #define	IFF_LINK0	0x1000		/* per link layer defined bit */ |
| 152 | #define	IFF_LINK1	0x2000		/* per link layer defined bit */ |
| 153 | #define	IFF_LINK2	0x4000		/* per link layer defined bit */ |
| 154 | #define	IFF_ALTPHYS	IFF_LINK2	/* use alternate physical connection */ |
| 155 | #define	IFF_MULTICAST	0x8000		/* (i) supports multicast */ |
| 156 | #define	IFF_CANTCONFIG	0x10000		/* (i) unconfigurable using ioctl(2) */ |
| 157 | #define	IFF_PPROMISC	0x20000		/* (n) user-requested promisc mode */ |
| 158 | #define	IFF_MONITOR	0x40000		/* (n) user-requested monitor mode */ |
| 159 | #define	IFF_STATICARP	0x80000		/* (n) static ARP */ |
| 160 | #define	IFF_STICKYARP	0x100000	/* (n) sticky ARP */ |
| 161 | #define	IFF_DYING	0x200000	/* (n) interface is winding down */ |
| 162 | #define	IFF_RENAMING	0x400000	/* (n) interface is being renamed */ |
| 163 | #define	IFF_PALLMULTI	0x800000	/* (n) user-requested allmulti mode */ |
| 164 | #define	IFF_NETLINK_1	0x1000000	/* (n) used by netlink */ |
| 165 | |
| 166 | /* |
| 167 | * Old names for driver flags so that user space tools can continue to use |
| 168 | * the old (portable) names. |
| 169 | */ |
| 170 | #ifndef _KERNEL |
| 171 | #define	IFF_RUNNING	IFF_DRV_RUNNING |
| 172 | #define	IFF_OACTIVE	IFF_DRV_OACTIVE |
| 173 | #endif |
| 174 | |
| 175 | /* flags set internally only: */ |
| 176 | #define	IFF_CANTCHANGE \ |
| 177 | 	(IFF_BROADCAST|IFF_POINTOPOINT|IFF_DRV_RUNNING|IFF_DRV_OACTIVE|\ |
| 178 | 	 IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI|IFF_PROMISC|\ |
| 179 | 	 IFF_DYING|IFF_CANTCONFIG|IFF_NEEDSEPOCH) |
| 180 | |
| 181 | /* |
| 182 | * Values for if_link_state. |
| 183 | */ |
| 184 | #define	LINK_STATE_UNKNOWN	0	/* link invalid/unknown */ |
| 185 | #define	LINK_STATE_DOWN		1	/* link is down */ |
| 186 | #define	LINK_STATE_UP		2	/* link is up */ |
| 187 | |
| 188 | /* |
| 189 | * Some convenience macros used for setting ifi_baudrate. |
| 190 | * XXX 1000 vs. 1024? --thorpej@netbsd.org |
| 191 | */ |
| 192 | #define	IF_Kbps(x)	((uintmax_t)(x) * 1000)	/* kilobits/sec. */ |
| 193 | #define	IF_Mbps(x)	(IF_Kbps((x) * 1000))	/* megabits/sec. */ |
| 194 | #define	IF_Gbps(x)	(IF_Mbps((x) * 1000))	/* gigabits/sec. */ |
| 195 | |
| 196 | /* |
| 197 | * Capabilities that interfaces can advertise. |
| 198 | * |
| 199 | * struct ifnet.if_capabilities |
| 200 | * contains the optional features & capabilities a particular interface |
| 201 | * supports (not only the driver but also the detected hw revision). |
| 202 | * Capabilities are defined by IFCAP_* below. |
| 203 | * struct ifnet.if_capenable |
| 204 | * contains the enabled (either by default or through ifconfig) optional |
| 205 | * features & capabilities on this interface. |
| 206 | * Capabilities are defined by IFCAP_* below. |
| 207 | * struct if_data.ifi_hwassist in mbuf CSUM_ flag form, controlled by above |
| 208 | * contains the enabled optional feature & capabilites that can be used |
| 209 | * individually per packet and are specified in the mbuf pkthdr.csum_flags |
| 210 | * field. IFCAP_* and CSUM_* do not match one to one and CSUM_* may be |
| 211 | * more detailed or differentiated than IFCAP_*. |
| 212 | * Hwassist features are defined CSUM_* in sys/mbuf.h |
| 213 | * |
| 214 | * Capabilities that cannot be arbitrarily changed with ifconfig/ioctl |
| 215 | * are listed in IFCAP_CANTCHANGE, similar to IFF_CANTCHANGE. |
| 216 | * This is not strictly necessary because the common code never |
| 217 | * changes capabilities, and it is left to the individual driver |
| 218 | * to do the right thing. However, having the filter here |
| 219 | * avoids replication of the same code in all individual drivers. |
| 220 | */ |
| 221 | |
| 222 | /* IFCAP values as bit indexes */ |
| 223 | |
| 224 | #define	IFCAP_B_RXCSUM		0 /* can offload checksum on RX */ |
| 225 | #define	IFCAP_B_TXCSUM		1 /* can offload checksum on TX */ |
| 226 | #define	IFCAP_B_NETCONS		2 /* can be a network console */ |
| 227 | #define	IFCAP_B_VLAN_MTU	3 /* VLAN-compatible MTU */ |
| 228 | #define	IFCAP_B_VLAN_HWTAGGING	4 /* hardware VLAN tag support */ |
| 229 | #define	IFCAP_B_JUMBO_MTU	5 /* 9000 byte MTU supported */ |
| 230 | #define	IFCAP_B_POLLING		6 /* driver supports polling */ |
| 231 | #define	IFCAP_B_VLAN_HWCSUM	7 /* can do IFCAP_HWCSUM on VLANs */ |
| 232 | #define	IFCAP_B_TSO4		8 /* can do TCP Segmentation Offload */ |
| 233 | #define	IFCAP_B_TSO6		9 /* can do TCP6 Segmentation Offload */ |
| 234 | #define	IFCAP_B_LRO		10 /* can do Large Receive Offload */ |
| 235 | #define	IFCAP_B_WOL_UCAST	11 /* wake on any unicast frame */ |
| 236 | #define	IFCAP_B_WOL_MCAST	12 /* wake on any multicast frame */ |
| 237 | #define	IFCAP_B_WOL_MAGIC	13 /* wake on any Magic Packet */ |
| 238 | #define	IFCAP_B_TOE4		14 /* interface can offload TCP */ |
| 239 | #define	IFCAP_B_TOE6		15 /* interface can offload TCP6 */ |
| 240 | #define	IFCAP_B_VLAN_HWFILTER	16 /* interface hw can filter vlan tag */ |
| 241 | #define	IFCAP_B_NV		17 /* can do SIOCGIFCAPNV/SIOCSIFCAPNV */ |
| 242 | #define	IFCAP_B_VLAN_HWTSO	18 /* can do IFCAP_TSO on VLANs */ |
| 243 | #define	IFCAP_B_LINKSTATE	19 /* the runtime link state is dynamic */ |
| 244 | #define	IFCAP_B_NETMAP		20 /* netmap mode supported/enabled */ |
| 245 | #define	IFCAP_B_RXCSUM_IPV6	21 /* can offload checksum on IPv6 RX */ |
| 246 | #define	IFCAP_B_TXCSUM_IPV6	22 /* can offload checksum on IPv6 TX */ |
| 247 | #define	IFCAP_B_HWSTATS		23 /* manages counters internally */ |
| 248 | #define	IFCAP_B_TXRTLMT		24 /* hardware supports TX rate limiting */ |
| 249 | #define	IFCAP_B_HWRXTSTMP	25 /* hardware rx timestamping */ |
| 250 | #define	IFCAP_B_MEXTPG		26 /* understands M_EXTPG mbufs */ |
| 251 | #define	IFCAP_B_TXTLS4		27 /* can do TLS encryption and segmentation for TCP */ |
| 252 | #define	IFCAP_B_TXTLS6		28 /* can do TLS encryption and segmentation for TCP6 */ |
| 253 | #define	IFCAP_B_VXLAN_HWCSUM	29 /* can do IFCAN_HWCSUM on VXLANs */ |
| 254 | #define	IFCAP_B_VXLAN_HWTSO	30 /* can do IFCAP_TSO on VXLANs */ |
| 255 | #define	IFCAP_B_TXTLS_RTLMT	31 /* can do TLS with rate limiting */ |
| 256 | #define	IFCAP_B_RXTLS4		32 /* can to TLS receive for TCP */ |
| 257 | #define	IFCAP_B_RXTLS6		33 /* can to TLS receive for TCP6 */ |
| 258 | #define	IFCAP_B_IPSEC_OFFLOAD	34 /* inline IPSEC offload */ |
| 259 | #define	__IFCAP_B_SIZE		35 |
| 260 | |
| 261 | #define	IFCAP_B_MAX	(__IFCAP_B_MAX - 1) |
| 262 | #define	IFCAP_B_SIZE	(__IFCAP_B_SIZE) |
| 263 | |
| 264 | #define	IFCAP_BIT(x)		(1 << (x)) |
| 265 | |
| 266 | #define	IFCAP_RXCSUM		IFCAP_BIT(IFCAP_B_RXCSUM) |
| 267 | #define	IFCAP_TXCSUM		IFCAP_BIT(IFCAP_B_TXCSUM) |
| 268 | #define	IFCAP_NETCONS		IFCAP_BIT(IFCAP_B_NETCONS) |
| 269 | #define	IFCAP_VLAN_MTU		IFCAP_BIT(IFCAP_B_VLAN_MTU) |
| 270 | #define	IFCAP_VLAN_HWTAGGING	IFCAP_BIT(IFCAP_B_VLAN_HWTAGGING) |
| 271 | #define	IFCAP_JUMBO_MTU		IFCAP_BIT(IFCAP_B_JUMBO_MTU) |
| 272 | #define	IFCAP_POLLING		IFCAP_BIT(IFCAP_B_POLLING) |
| 273 | #define	IFCAP_VLAN_HWCSUM	IFCAP_BIT(IFCAP_B_VLAN_HWCSUM) |
| 274 | #define	IFCAP_TSO4		IFCAP_BIT(IFCAP_B_TSO4) |
| 275 | #define	IFCAP_TSO6		IFCAP_BIT(IFCAP_B_TSO6) |
| 276 | #define	IFCAP_LRO		IFCAP_BIT(IFCAP_B_LRO) |
| 277 | #define	IFCAP_WOL_UCAST		IFCAP_BIT(IFCAP_B_WOL_UCAST) |
| 278 | #define	IFCAP_WOL_MCAST		IFCAP_BIT(IFCAP_B_WOL_MCAST) |
| 279 | #define	IFCAP_WOL_MAGIC		IFCAP_BIT(IFCAP_B_WOL_MAGIC) |
| 280 | #define	IFCAP_TOE4		IFCAP_BIT(IFCAP_B_TOE4) |
| 281 | #define	IFCAP_TOE6		IFCAP_BIT(IFCAP_B_TOE6) |
| 282 | #define	IFCAP_VLAN_HWFILTER	IFCAP_BIT(IFCAP_B_VLAN_HWFILTER) |
| 283 | #define	IFCAP_NV		IFCAP_BIT(IFCAP_B_NV) |
| 284 | #define	IFCAP_VLAN_HWTSO	IFCAP_BIT(IFCAP_B_VLAN_HWTSO) |
| 285 | #define	IFCAP_LINKSTATE		IFCAP_BIT(IFCAP_B_LINKSTATE) |
| 286 | #define	IFCAP_NETMAP		IFCAP_BIT(IFCAP_B_NETMAP) |
| 287 | #define	IFCAP_RXCSUM_IPV6	IFCAP_BIT(IFCAP_B_RXCSUM_IPV6) |
| 288 | #define	IFCAP_TXCSUM_IPV6	IFCAP_BIT(IFCAP_B_TXCSUM_IPV6) |
| 289 | #define	IFCAP_HWSTATS		IFCAP_BIT(IFCAP_B_HWSTATS) |
| 290 | #define	IFCAP_TXRTLMT		IFCAP_BIT(IFCAP_B_TXRTLMT) |
| 291 | #define	IFCAP_HWRXTSTMP		IFCAP_BIT(IFCAP_B_HWRXTSTMP) |
| 292 | #define	IFCAP_MEXTPG		IFCAP_BIT(IFCAP_B_MEXTPG) |
| 293 | #define	IFCAP_TXTLS4		IFCAP_BIT(IFCAP_B_TXTLS4) |
| 294 | #define	IFCAP_TXTLS6		IFCAP_BIT(IFCAP_B_TXTLS6) |
| 295 | #define	IFCAP_VXLAN_HWCSUM	IFCAP_BIT(IFCAP_B_VXLAN_HWCSUM) |
| 296 | #define	IFCAP_VXLAN_HWTSO	IFCAP_BIT(IFCAP_B_VXLAN_HWTSO) |
| 297 | #define	IFCAP_TXTLS_RTLMT	IFCAP_BIT(IFCAP_B_TXTLS_RTLMT) |
| 298 | |
| 299 | /* IFCAP2_* are integers, not bits. */ |
| 300 | #define	IFCAP2_RXTLS4		(IFCAP_B_RXTLS4 - 32) |
| 301 | #define	IFCAP2_RXTLS6		(IFCAP_B_RXTLS6 - 32) |
| 302 | #define	IFCAP2_IPSEC_OFFLOAD	(IFCAP_B_IPSEC_OFFLOAD - 32) |
| 303 | |
| 304 | #define	IFCAP2_BIT(x)		(1UL << (x)) |
| 305 | |
| 306 | #define IFCAP_HWCSUM_IPV6	(IFCAP_RXCSUM_IPV6 | IFCAP_TXCSUM_IPV6) |
| 307 | |
| 308 | #define IFCAP_HWCSUM	(IFCAP_RXCSUM | IFCAP_TXCSUM) |
| 309 | #define	IFCAP_TSO	(IFCAP_TSO4 | IFCAP_TSO6) |
| 310 | #define	IFCAP_WOL	(IFCAP_WOL_UCAST | IFCAP_WOL_MCAST | IFCAP_WOL_MAGIC) |
| 311 | #define	IFCAP_TOE	(IFCAP_TOE4 | IFCAP_TOE6) |
| 312 | #define	IFCAP_TXTLS	(IFCAP_TXTLS4 | IFCAP_TXTLS6) |
| 313 | |
| 314 | #define	IFCAP_CANTCHANGE	(IFCAP_NETMAP | IFCAP_NV) |
| 315 | #define	IFCAP_ALLCAPS		0xffffffff |
| 316 | |
| 317 | #define	IFQ_MAXLEN	50 |
| 318 | #define	IFNET_SLOWHZ	1		/* granularity is 1 second */ |
| 319 | |
| 320 | /* |
| 321 | * Message format for use in obtaining information about interfaces |
| 322 | * from getkerninfo and the routing socket |
| 323 | * For the new, extensible interface see struct if_msghdrl below. |
| 324 | */ |
| 325 | struct if_msghdr { |
| 326 | 	u_short	ifm_msglen;	/* to skip over non-understood messages */ |
| 327 | 	u_char	ifm_version;	/* future binary compatibility */ |
| 328 | 	u_char	ifm_type;	/* message type */ |
| 329 | 	int	ifm_addrs;	/* like rtm_addrs */ |
| 330 | 	int	ifm_flags;	/* value of if_flags */ |
| 331 | 	u_short	ifm_index;	/* index for associated ifp */ |
| 332 | 	u_short	_ifm_spare1; |
| 333 | 	struct	if_data ifm_data;/* statistics and other data about if */ |
| 334 | }; |
| 335 | |
| 336 | /* |
| 337 | * The 'l' version shall be used by new interfaces, like NET_RT_IFLISTL. It is |
| 338 | * extensible after ifm_data_off or within ifm_data. Both the if_msghdr and |
| 339 | * if_data now have a member field detailing the struct length in addition to |
| 340 | * the routing message length. Macros are provided to find the start of |
| 341 | * ifm_data and the start of the socket address structures immediately following |
| 342 | * struct if_msghdrl given a pointer to struct if_msghdrl. |
| 343 | */ |
| 344 | #define	IF_MSGHDRL_IFM_DATA(_l) \ |
| 345 | (struct if_data *)((char *)(_l) + (_l)->ifm_data_off) |
| 346 | #define	IF_MSGHDRL_RTA(_l) \ |
| 347 | (void *)((uintptr_t)(_l) + (_l)->ifm_len) |
| 348 | struct if_msghdrl { |
| 349 | 	u_short	ifm_msglen;	/* to skip over non-understood messages */ |
| 350 | 	u_char	ifm_version;	/* future binary compatibility */ |
| 351 | 	u_char	ifm_type;	/* message type */ |
| 352 | 	int	ifm_addrs;	/* like rtm_addrs */ |
| 353 | 	int	ifm_flags;	/* value of if_flags */ |
| 354 | 	u_short	ifm_index;	/* index for associated ifp */ |
| 355 | 	u_short _ifm_spare1;	/* spare space to grow if_index, see if_var.h */ |
| 356 | 	u_short	ifm_len;	/* length of if_msghdrl incl. if_data */ |
| 357 | 	u_short	ifm_data_off;	/* offset of if_data from beginning */ |
| 358 | 	int	_ifm_spare2; |
| 359 | 	struct	if_data ifm_data;/* statistics and other data about if */ |
| 360 | }; |
| 361 | |
| 362 | /* |
| 363 | * Message format for use in obtaining information about interface addresses |
| 364 | * from getkerninfo and the routing socket |
| 365 | * For the new, extensible interface see struct ifa_msghdrl below. |
| 366 | */ |
| 367 | struct ifa_msghdr { |
| 368 | 	u_short	ifam_msglen;	/* to skip over non-understood messages */ |
| 369 | 	u_char	ifam_version;	/* future binary compatibility */ |
| 370 | 	u_char	ifam_type;	/* message type */ |
| 371 | 	int	ifam_addrs;	/* like rtm_addrs */ |
| 372 | 	int	ifam_flags;	/* value of ifa_flags */ |
| 373 | 	u_short	ifam_index;	/* index for associated ifp */ |
| 374 | 	u_short	_ifam_spare1; |
| 375 | 	int	ifam_metric;	/* value of ifa_ifp->if_metric */ |
| 376 | }; |
| 377 | |
| 378 | /* |
| 379 | * The 'l' version shall be used by new interfaces, like NET_RT_IFLISTL. It is |
| 380 | * extensible after ifam_metric or within ifam_data. Both the ifa_msghdrl and |
| 381 | * if_data now have a member field detailing the struct length in addition to |
| 382 | * the routing message length. Macros are provided to find the start of |
| 383 | * ifm_data and the start of the socket address structures immediately following |
| 384 | * struct ifa_msghdrl given a pointer to struct ifa_msghdrl. |
| 385 | */ |
| 386 | #define	IFA_MSGHDRL_IFAM_DATA(_l) \ |
| 387 | (struct if_data *)((char *)(_l) + (_l)->ifam_data_off) |
| 388 | #define	IFA_MSGHDRL_RTA(_l) \ |
| 389 | (void *)((uintptr_t)(_l) + (_l)->ifam_len) |
| 390 | struct ifa_msghdrl { |
| 391 | 	u_short	ifam_msglen;	/* to skip over non-understood messages */ |
| 392 | 	u_char	ifam_version;	/* future binary compatibility */ |
| 393 | 	u_char	ifam_type;	/* message type */ |
| 394 | 	int	ifam_addrs;	/* like rtm_addrs */ |
| 395 | 	int	ifam_flags;	/* value of ifa_flags */ |
| 396 | 	u_short	ifam_index;	/* index for associated ifp */ |
| 397 | 	u_short _ifam_spare1;	/* spare space to grow if_index, see if_var.h */ |
| 398 | 	u_short	ifam_len;	/* length of ifa_msghdrl incl. if_data */ |
| 399 | 	u_short	ifam_data_off;	/* offset of if_data from beginning */ |
| 400 | 	int	ifam_metric;	/* value of ifa_ifp->if_metric */ |
| 401 | 	struct	if_data ifam_data;/* statistics and other data about if or |
| 402 | 				 * address */ |
| 403 | }; |
| 404 | |
| 405 | /* |
| 406 | * Message format for use in obtaining information about multicast addresses |
| 407 | * from the routing socket |
| 408 | */ |
| 409 | struct ifma_msghdr { |
| 410 | 	u_short	ifmam_msglen;	/* to skip over non-understood messages */ |
| 411 | 	u_char	ifmam_version;	/* future binary compatibility */ |
| 412 | 	u_char	ifmam_type;	/* message type */ |
| 413 | 	int	ifmam_addrs;	/* like rtm_addrs */ |
| 414 | 	int	ifmam_flags;	/* value of ifa_flags */ |
| 415 | 	u_short	ifmam_index;	/* index for associated ifp */ |
| 416 | 	u_short	_ifmam_spare1; |
| 417 | }; |
| 418 | |
| 419 | /* |
| 420 | * Message format announcing the arrival or departure of a network interface. |
| 421 | */ |
| 422 | struct if_announcemsghdr { |
| 423 | 	u_short	ifan_msglen;	/* to skip over non-understood messages */ |
| 424 | 	u_char	ifan_version;	/* future binary compatibility */ |
| 425 | 	u_char	ifan_type;	/* message type */ |
| 426 | 	u_short	ifan_index;	/* index for associated ifp */ |
| 427 | 	char	ifan_name[IFNAMSIZ]; /* if name, e.g. "en0" */ |
| 428 | 	u_short	ifan_what;	/* what type of announcement */ |
| 429 | }; |
| 430 | |
| 431 | #define	IFAN_ARRIVAL	0	/* interface arrival */ |
| 432 | #define	IFAN_DEPARTURE	1	/* interface departure */ |
| 433 | |
| 434 | /* |
| 435 | * Buffer with length to be used in SIOCGIFDESCR/SIOCSIFDESCR requests |
| 436 | */ |
| 437 | struct ifreq_buffer { |
| 438 | 	size_t	length; |
| 439 | 	void	*buffer; |
| 440 | }; |
| 441 | |
| 442 | struct ifreq_nv_req { |
| 443 | 	u_int	buf_length;	/* Total size of buffer, |
| 444 | 				 u_int for ABI struct ifreq */ |
| 445 | 	u_int	length;		/* Length of the filled part */ |
| 446 | 	void	*buffer;	/* Buffer itself, containing packed nv */ |
| 447 | }; |
| 448 | |
| 449 | #define	IFR_CAP_NV_MAXBUFSIZE	(2 * 1024 * 1024) |
| 450 | |
| 451 | /* |
| 452 | * Interface request structure used for socket |
| 453 | * ioctl's. All interface ioctl's must have parameter |
| 454 | * definitions which begin with ifr_name. The |
| 455 | * remainder may be interface specific. |
| 456 | */ |
| 457 | struct ifreq { |
| 458 | 	char	ifr_name[IFNAMSIZ];		/* if name, e.g. "en0" */ |
| 459 | 	union { |
| 460 | 		struct	sockaddr ifru_addr; |
| 461 | 		struct	sockaddr ifru_dstaddr; |
| 462 | 		struct	sockaddr ifru_broadaddr; |
| 463 | 		struct	ifreq_buffer ifru_buffer; |
| 464 | 		short	ifru_flags[2]; |
| 465 | 		short	ifru_index; |
| 466 | 		int	ifru_jid; |
| 467 | 		int	ifru_metric; |
| 468 | 		int	ifru_mtu; |
| 469 | 		int	ifru_phys; |
| 470 | 		int	ifru_media; |
| 471 | 		caddr_t	ifru_data; |
| 472 | 		int	ifru_cap[2]; |
| 473 | 		u_int	ifru_fib; |
| 474 | 		u_char	ifru_vlan_pcp; |
| 475 | 		struct	ifreq_nv_req ifru_nv; |
| 476 | 	} ifr_ifru; |
| 477 | #define	ifr_addr	ifr_ifru.ifru_addr	/* address */ |
| 478 | #define	ifr_dstaddr	ifr_ifru.ifru_dstaddr	/* other end of p-to-p link */ |
| 479 | #define	ifr_broadaddr	ifr_ifru.ifru_broadaddr	/* broadcast address */ |
| 480 | #ifndef _KERNEL |
| 481 | #define	ifr_buffer	ifr_ifru.ifru_buffer	/* user supplied buffer with its length */ |
| 482 | #endif |
| 483 | #define	ifr_flags	ifr_ifru.ifru_flags[0]	/* flags (low 16 bits) */ |
| 484 | #define	ifr_flagshigh	ifr_ifru.ifru_flags[1]	/* flags (high 16 bits) */ |
| 485 | #define	ifr_jid		ifr_ifru.ifru_jid	/* jail/vnet */ |
| 486 | #define	ifr_metric	ifr_ifru.ifru_metric	/* metric */ |
| 487 | #define	ifr_mtu		ifr_ifru.ifru_mtu	/* mtu */ |
| 488 | #define ifr_phys	ifr_ifru.ifru_phys	/* physical wire */ |
| 489 | #define ifr_media	ifr_ifru.ifru_media	/* physical media */ |
| 490 | #ifndef _KERNEL |
| 491 | #define	ifr_data	ifr_ifru.ifru_data	/* for use by interface */ |
| 492 | #endif |
| 493 | #define	ifr_reqcap	ifr_ifru.ifru_cap[0]	/* requested capabilities */ |
| 494 | #define	ifr_curcap	ifr_ifru.ifru_cap[1]	/* current capabilities */ |
| 495 | #define	ifr_index	ifr_ifru.ifru_index	/* interface index */ |
| 496 | #define	ifr_fib		ifr_ifru.ifru_fib	/* interface fib */ |
| 497 | #define	ifr_vlan_pcp	ifr_ifru.ifru_vlan_pcp	/* VLAN priority */ |
| 498 | #define	ifr_lan_pcp	ifr_ifru.ifru_vlan_pcp	/* VLAN priority */ |
| 499 | #define	ifr_cap_nv	ifr_ifru.ifru_nv	/* nv-based cap interface */ |
| 500 | }; |
| 501 | |
| 502 | #define	_SIZEOF_ADDR_IFREQ(ifr) \ |
| 503 | 	((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \ |
| 504 | 	 (sizeof(struct ifreq) - sizeof(struct sockaddr) + \ |
| 505 | 	 (ifr).ifr_addr.sa_len) : sizeof(struct ifreq)) |
| 506 | |
| 507 | struct ifaliasreq { |
| 508 | 	char	ifra_name[IFNAMSIZ];		/* if name, e.g. "en0" */ |
| 509 | 	struct	sockaddr ifra_addr; |
| 510 | 	struct	sockaddr ifra_broadaddr; |
| 511 | 	struct	sockaddr ifra_mask; |
| 512 | 	int	ifra_vhid; |
| 513 | }; |
| 514 | |
| 515 | /* 9.x compat */ |
| 516 | struct oifaliasreq { |
| 517 | 	char	ifra_name[IFNAMSIZ]; |
| 518 | 	struct	sockaddr ifra_addr; |
| 519 | 	struct	sockaddr ifra_broadaddr; |
| 520 | 	struct	sockaddr ifra_mask; |
| 521 | }; |
| 522 | |
| 523 | struct ifmediareq { |
| 524 | 	char	ifm_name[IFNAMSIZ];	/* if name, e.g. "en0" */ |
| 525 | 	int	ifm_current;		/* current media options */ |
| 526 | 	int	ifm_mask;		/* don't care mask */ |
| 527 | 	int	ifm_status;		/* media status */ |
| 528 | 	int	ifm_active;		/* active options */ |
| 529 | 	int	ifm_count;		/* # entries in ifm_ulist array */ |
| 530 | 	int	*ifm_ulist;		/* media words */ |
| 531 | }; |
| 532 | |
| 533 | struct ifdrv { |
| 534 | 	char		ifd_name[IFNAMSIZ];	/* if name, e.g. "en0" */ |
| 535 | 	unsigned long	ifd_cmd; |
| 536 | 	size_t		ifd_len; |
| 537 | 	void		*ifd_data; |
| 538 | }; |
| 539 | |
| 540 | /* |
| 541 | * Structure used to retrieve aux status data from interfaces. |
| 542 | * Kernel suppliers to this interface should respect the formatting |
| 543 | * needed by ifconfig(8): each line starts with a TAB and ends with |
| 544 | * a newline. The canonical example to copy and paste is in if_tun.c. |
| 545 | */ |
| 546 | |
| 547 | #define	IFSTATMAX	800		/* 10 lines of text */ |
| 548 | struct ifstat { |
| 549 | 	char	ifs_name[IFNAMSIZ];	/* if name, e.g. "en0" */ |
| 550 | 	char	ascii[IFSTATMAX + 1]; |
| 551 | }; |
| 552 | |
| 553 | /* |
| 554 | * Structure used in SIOCGIFCONF request. |
| 555 | * Used to retrieve interface configuration |
| 556 | * for machine (useful for programs which |
| 557 | * must know all networks accessible). |
| 558 | */ |
| 559 | struct ifconf { |
| 560 | 	int	ifc_len;		/* size of associated buffer */ |
| 561 | 	union { |
| 562 | 		caddr_t	ifcu_buf; |
| 563 | 		struct	ifreq *ifcu_req; |
| 564 | 	} ifc_ifcu; |
| 565 | #define	ifc_buf	ifc_ifcu.ifcu_buf	/* buffer address */ |
| 566 | #define	ifc_req	ifc_ifcu.ifcu_req	/* array of structures returned */ |
| 567 | }; |
| 568 | |
| 569 | /* |
| 570 | * interface groups |
| 571 | */ |
| 572 | |
| 573 | #define	IFG_ALL		"all"		/* group contains all interfaces */ |
| 574 | /* XXX: will we implement this? */ |
| 575 | #define	IFG_EGRESS	"egress"	/* if(s) default route(s) point to */ |
| 576 | |
| 577 | struct ifg_req { |
| 578 | 	union { |
| 579 | 		char			 ifgrqu_group[IFNAMSIZ]; |
| 580 | 		char			 ifgrqu_member[IFNAMSIZ]; |
| 581 | 	} ifgrq_ifgrqu; |
| 582 | #define	ifgrq_group	ifgrq_ifgrqu.ifgrqu_group |
| 583 | #define	ifgrq_member	ifgrq_ifgrqu.ifgrqu_member |
| 584 | }; |
| 585 | |
| 586 | /* |
| 587 | * Used to lookup groups for an interface |
| 588 | */ |
| 589 | struct ifgroupreq { |
| 590 | 	char	ifgr_name[IFNAMSIZ]; |
| 591 | 	u_int	ifgr_len; |
| 592 | 	union { |
| 593 | 		char	ifgru_group[IFNAMSIZ]; |
| 594 | 		struct	ifg_req *ifgru_groups; |
| 595 | 	} ifgr_ifgru; |
| 596 | #define ifgr_group	ifgr_ifgru.ifgru_group |
| 597 | #define ifgr_groups	ifgr_ifgru.ifgru_groups |
| 598 | }; |
| 599 | |
| 600 | /* |
| 601 | * Structure used to request i2c data |
| 602 | * from interface transceivers. |
| 603 | */ |
| 604 | struct ifi2creq { |
| 605 | 	uint8_t dev_addr;	/* i2c address (0xA0, 0xA2) */ |
| 606 | 	uint8_t offset;		/* read offset */ |
| 607 | 	uint8_t len;		/* read length */ |
| 608 | 	uint8_t spare0; |
| 609 | 	uint32_t spare1; |
| 610 | 	uint8_t data[8];	/* read buffer */ |
| 611 | }; |
| 612 | |
| 613 | /* |
| 614 | * RSS hash. |
| 615 | */ |
| 616 | |
| 617 | #define	RSS_FUNC_NONE		0		/* RSS disabled */ |
| 618 | #define	RSS_FUNC_PRIVATE	1		/* non-standard */ |
| 619 | #define	RSS_FUNC_TOEPLITZ	2 |
| 620 | |
| 621 | #define	RSS_TYPE_IPV4		0x00000001 |
| 622 | #define	RSS_TYPE_TCP_IPV4	0x00000002 |
| 623 | #define	RSS_TYPE_IPV6		0x00000004 |
| 624 | #define	RSS_TYPE_IPV6_EX	0x00000008 |
| 625 | #define	RSS_TYPE_TCP_IPV6	0x00000010 |
| 626 | #define	RSS_TYPE_TCP_IPV6_EX	0x00000020 |
| 627 | #define	RSS_TYPE_UDP_IPV4	0x00000040 |
| 628 | #define	RSS_TYPE_UDP_IPV6	0x00000080 |
| 629 | #define	RSS_TYPE_UDP_IPV6_EX	0x00000100 |
| 630 | |
| 631 | #define	RSS_KEYLEN		128 |
| 632 | |
| 633 | struct ifrsskey { |
| 634 | 	char		ifrk_name[IFNAMSIZ];	/* if name, e.g. "en0" */ |
| 635 | 	uint8_t		ifrk_func;		/* RSS_FUNC_ */ |
| 636 | 	uint8_t		ifrk_spare0; |
| 637 | 	uint16_t	ifrk_keylen; |
| 638 | 	uint8_t		ifrk_key[RSS_KEYLEN]; |
| 639 | }; |
| 640 | |
| 641 | struct ifrsshash { |
| 642 | 	char		ifrh_name[IFNAMSIZ];	/* if name, e.g. "en0" */ |
| 643 | 	uint8_t		ifrh_func;		/* RSS_FUNC_ */ |
| 644 | 	uint8_t		ifrh_spare0; |
| 645 | 	uint16_t	ifrh_spare1; |
| 646 | 	uint32_t	ifrh_types;		/* RSS_TYPE_ */ |
| 647 | }; |
| 648 | |
| 649 | #define	IFNET_PCP_NONE	0xff	/* PCP disabled */ |
| 650 | |
| 651 | #define	IFDR_MSG_SIZE		64 |
| 652 | #define	IFDR_REASON_MSG		1 |
| 653 | #define	IFDR_REASON_VENDOR	2 |
| 654 | struct ifdownreason { |
| 655 | 	char		ifdr_name[IFNAMSIZ]; |
| 656 | 	uint32_t	ifdr_reason; |
| 657 | 	uint32_t	ifdr_vendor; |
| 658 | 	char		ifdr_msg[IFDR_MSG_SIZE]; |
| 659 | }; |
| 660 | |
| 661 | #endif /* __BSD_VISIBLE */ |
| 662 | |
| 663 | /* |
| 664 | * Opaque interface structure. |
| 665 | */ |
| 666 | |
| 667 | typedef struct ifnet *if_t; |
| 668 | |
| 669 | #ifdef _KERNEL |
| 670 | #ifdef MALLOC_DECLARE |
| 671 | MALLOC_DECLARE(M_IFADDR); |
| 672 | MALLOC_DECLARE(M_IFMADDR); |
| 673 | #endif |
| 674 | |
| 675 | extern struct sx ifnet_detach_sxlock; |
| 676 | |
| 677 | struct nvlist; |
| 678 | struct ifcap_nv_bit_name; |
| 679 | int if_capnv_to_capint(const struct nvlist *nv, int *old_cap, |
| 680 | const struct ifcap_nv_bit_name *nn, bool all); |
| 681 | void if_capint_to_capnv(struct nvlist *nv, |
| 682 | const struct ifcap_nv_bit_name *nn, int ifr_cap, int ifr_req); |
| 683 | struct siocsifcapnv_driver_data { |
| 684 | 	int reqcap; |
| 685 | 	int reqcap2; |
| 686 | 	struct nvlist *nvcap; |
| 687 | }; |
| 688 | #endif |
| 689 | |
| 690 | #ifndef _KERNEL |
| 691 | struct if_nameindex { |
| 692 | 	unsigned int	if_index;	/* 1, 2, ... */ |
| 693 | 	char		*if_name;	/* null terminated name: "le0", ... */ |
| 694 | }; |
| 695 | |
| 696 | __BEGIN_DECLS |
| 697 | void			 if_freenameindex(struct if_nameindex *); |
| 698 | char			*if_indextoname(unsigned int, char *); |
| 699 | struct if_nameindex	*if_nameindex(void); |
| 700 | unsigned int		 if_nametoindex(const char *); |
| 701 | __END_DECLS |
| 702 | #endif |
| 703 | #endif /* !_NET_IF_H_ */ |