| 1 | /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ |
| 2 | /* |
| 3 | * INET		An implementation of the TCP/IP protocol suite for the LINUX |
| 4 | *		operating system. INET is implemented using the BSD Socket |
| 5 | *		interface as the means of communication with the user level. |
| 6 | * |
| 7 | *		Global definitions for the INET interface module. |
| 8 | * |
| 9 | * Version:	@(#)if.h	1.0.2	04/18/93 |
| 10 | * |
| 11 | * Authors:	Original taken from Berkeley UNIX 4.3, (c) UCB 1982-1988 |
| 12 | *		Ross Biro |
| 13 | *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> |
| 14 | * |
| 15 | *		This program is free software; you can redistribute it and/or |
| 16 | *		modify it under the terms of the GNU General Public License |
| 17 | *		as published by the Free Software Foundation; either version |
| 18 | *		2 of the License, or (at your option) any later version. |
| 19 | */ |
| 20 | #ifndef _LINUX_IF_H |
| 21 | #define _LINUX_IF_H |
| 22 | |
| 23 | #include <linux/libc-compat.h> /* for compatibility with glibc */ |
| 24 | #include <linux/types.h>		/* for "__kernel_caddr_t" et al	*/ |
| 25 | #include <linux/socket.h>		/* for "struct sockaddr" et al	*/ |
| 26 | 		/* for "__user" et al */ |
| 27 | |
| 28 | #include <sys/socket.h>			/* for struct sockaddr.		*/ |
| 29 | |
| 30 | #if __UAPI_DEF_IF_IFNAMSIZ |
| 31 | #define	IFNAMSIZ	16 |
| 32 | #endif /* __UAPI_DEF_IF_IFNAMSIZ */ |
| 33 | #define	IFALIASZ	256 |
| 34 | #define	ALTIFNAMSIZ	128 |
| 35 | #include <linux/hdlc/ioctl.h> |
| 36 | |
| 37 | /* For glibc compatibility. An empty enum does not compile. */ |
| 38 | #if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || \ |
| 39 | __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 |
| 40 | /** |
| 41 | * enum net_device_flags - &struct net_device flags |
| 42 | * |
| 43 | * These are the &struct net_device flags, they can be set by drivers, the |
| 44 | * kernel and some can be triggered by userspace. Userspace can query and |
| 45 | * set these flags using userspace utilities but there is also a sysfs |
| 46 | * entry available for all dev flags which can be queried and set. These flags |
| 47 | * are shared for all types of net_devices. The sysfs entries are available |
| 48 | * via /sys/class/net/<dev>/flags. Flags which can be toggled through sysfs |
| 49 | * are annotated below, note that only a few flags can be toggled and some |
| 50 | * other flags are always preserved from the original net_device flags |
| 51 | * even if you try to set them via sysfs. Flags which are always preserved |
| 52 | * are kept under the flag grouping @IFF_VOLATILE. Flags which are __volatile__ |
| 53 | * are annotated below as such. |
| 54 | * |
| 55 | * You should have a pretty good reason to be extending these flags. |
| 56 | * |
| 57 | * @IFF_UP: interface is up. Can be toggled through sysfs. |
| 58 | * @IFF_BROADCAST: broadcast address valid. Volatile. |
| 59 | * @IFF_DEBUG: turn on debugging. Can be toggled through sysfs. |
| 60 | * @IFF_LOOPBACK: is a loopback net. Volatile. |
| 61 | * @IFF_POINTOPOINT: interface is has p-p link. Volatile. |
| 62 | * @IFF_NOTRAILERS: avoid use of trailers. Can be toggled through sysfs. |
| 63 | *	Volatile. |
| 64 | * @IFF_RUNNING: interface RFC2863 OPER_UP. Volatile. |
| 65 | * @IFF_NOARP: no ARP protocol. Can be toggled through sysfs. Volatile. |
| 66 | * @IFF_PROMISC: receive all packets. Can be toggled through sysfs. |
| 67 | * @IFF_ALLMULTI: receive all multicast packets. Can be toggled through |
| 68 | *	sysfs. |
| 69 | * @IFF_MASTER: master of a load balancer. Volatile. |
| 70 | * @IFF_SLAVE: slave of a load balancer. Volatile. |
| 71 | * @IFF_MULTICAST: Supports multicast. Can be toggled through sysfs. |
| 72 | * @IFF_PORTSEL: can set media type. Can be toggled through sysfs. |
| 73 | * @IFF_AUTOMEDIA: auto media select active. Can be toggled through sysfs. |
| 74 | * @IFF_DYNAMIC: dialup device with changing addresses. Can be toggled |
| 75 | *	through sysfs. |
| 76 | * @IFF_LOWER_UP: driver signals L1 up. Volatile. |
| 77 | * @IFF_DORMANT: driver signals dormant. Volatile. |
| 78 | * @IFF_ECHO: echo sent packets. Volatile. |
| 79 | */ |
| 80 | enum net_device_flags { |
| 81 | /* for compatibility with glibc net/if.h */ |
| 82 | #if __UAPI_DEF_IF_NET_DEVICE_FLAGS |
| 83 | 	IFF_UP				= 1<<0, /* sysfs */ |
| 84 | 	IFF_BROADCAST			= 1<<1, /* __volatile__ */ |
| 85 | 	IFF_DEBUG			= 1<<2, /* sysfs */ |
| 86 | 	IFF_LOOPBACK			= 1<<3, /* __volatile__ */ |
| 87 | 	IFF_POINTOPOINT			= 1<<4, /* __volatile__ */ |
| 88 | 	IFF_NOTRAILERS			= 1<<5, /* sysfs */ |
| 89 | 	IFF_RUNNING			= 1<<6, /* __volatile__ */ |
| 90 | 	IFF_NOARP			= 1<<7, /* sysfs */ |
| 91 | 	IFF_PROMISC			= 1<<8, /* sysfs */ |
| 92 | 	IFF_ALLMULTI			= 1<<9, /* sysfs */ |
| 93 | 	IFF_MASTER			= 1<<10, /* __volatile__ */ |
| 94 | 	IFF_SLAVE			= 1<<11, /* __volatile__ */ |
| 95 | 	IFF_MULTICAST			= 1<<12, /* sysfs */ |
| 96 | 	IFF_PORTSEL			= 1<<13, /* sysfs */ |
| 97 | 	IFF_AUTOMEDIA			= 1<<14, /* sysfs */ |
| 98 | 	IFF_DYNAMIC			= 1<<15, /* sysfs */ |
| 99 | #endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */ |
| 100 | #if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO |
| 101 | 	IFF_LOWER_UP			= 1<<16, /* __volatile__ */ |
| 102 | 	IFF_DORMANT			= 1<<17, /* __volatile__ */ |
| 103 | 	IFF_ECHO			= 1<<18, /* __volatile__ */ |
| 104 | #endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ |
| 105 | }; |
| 106 | #endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 */ |
| 107 | |
| 108 | /* for compatibility with glibc net/if.h */ |
| 109 | #if __UAPI_DEF_IF_NET_DEVICE_FLAGS |
| 110 | #define IFF_UP				IFF_UP |
| 111 | #define IFF_BROADCAST			IFF_BROADCAST |
| 112 | #define IFF_DEBUG			IFF_DEBUG |
| 113 | #define IFF_LOOPBACK			IFF_LOOPBACK |
| 114 | #define IFF_POINTOPOINT			IFF_POINTOPOINT |
| 115 | #define IFF_NOTRAILERS			IFF_NOTRAILERS |
| 116 | #define IFF_RUNNING			IFF_RUNNING |
| 117 | #define IFF_NOARP			IFF_NOARP |
| 118 | #define IFF_PROMISC			IFF_PROMISC |
| 119 | #define IFF_ALLMULTI			IFF_ALLMULTI |
| 120 | #define IFF_MASTER			IFF_MASTER |
| 121 | #define IFF_SLAVE			IFF_SLAVE |
| 122 | #define IFF_MULTICAST			IFF_MULTICAST |
| 123 | #define IFF_PORTSEL			IFF_PORTSEL |
| 124 | #define IFF_AUTOMEDIA			IFF_AUTOMEDIA |
| 125 | #define IFF_DYNAMIC			IFF_DYNAMIC |
| 126 | #endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */ |
| 127 | |
| 128 | #if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO |
| 129 | #define IFF_LOWER_UP			IFF_LOWER_UP |
| 130 | #define IFF_DORMANT			IFF_DORMANT |
| 131 | #define IFF_ECHO			IFF_ECHO |
| 132 | #endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ |
| 133 | |
| 134 | #define IFF_VOLATILE	(IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\ |
| 135 | 		IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT) |
| 136 | |
| 137 | #define IF_GET_IFACE	0x0001		/* for querying only */ |
| 138 | #define IF_GET_PROTO	0x0002 |
| 139 | |
| 140 | /* For definitions see hdlc.h */ |
| 141 | #define IF_IFACE_V35	0x1000		/* V.35 serial interface	*/ |
| 142 | #define IF_IFACE_V24	0x1001		/* V.24 serial interface	*/ |
| 143 | #define IF_IFACE_X21	0x1002		/* X.21 serial interface	*/ |
| 144 | #define IF_IFACE_T1	0x1003		/* T1 telco serial interface	*/ |
| 145 | #define IF_IFACE_E1	0x1004		/* E1 telco serial interface	*/ |
| 146 | #define IF_IFACE_SYNC_SERIAL 0x1005	/* can't be set by software	*/ |
| 147 | #define IF_IFACE_X21D 0x1006 /* X.21 Dual Clocking (FarSite) */ |
| 148 | |
| 149 | /* For definitions see hdlc.h */ |
| 150 | #define IF_PROTO_HDLC	0x2000		/* raw HDLC protocol		*/ |
| 151 | #define IF_PROTO_PPP	0x2001		/* PPP protocol			*/ |
| 152 | #define IF_PROTO_CISCO	0x2002		/* Cisco HDLC protocol		*/ |
| 153 | #define IF_PROTO_FR	0x2003		/* Frame Relay protocol		*/ |
| 154 | #define IF_PROTO_FR_ADD_PVC 0x2004	/* Create FR PVC		*/ |
| 155 | #define IF_PROTO_FR_DEL_PVC 0x2005	/* Delete FR PVC		*/ |
| 156 | #define IF_PROTO_X25	0x2006		/* X.25				*/ |
| 157 | #define IF_PROTO_HDLC_ETH 0x2007	/* raw HDLC, Ethernet emulation	*/ |
| 158 | #define IF_PROTO_FR_ADD_ETH_PVC 0x2008	/* Create FR Ethernet-bridged PVC */ |
| 159 | #define IF_PROTO_FR_DEL_ETH_PVC 0x2009	/* Delete FR Ethernet-bridged PVC */ |
| 160 | #define IF_PROTO_FR_PVC	0x200A		/* for reading PVC status	*/ |
| 161 | #define IF_PROTO_FR_ETH_PVC 0x200B |
| 162 | #define IF_PROTO_RAW 0x200C /* RAW Socket */ |
| 163 | |
| 164 | /* RFC 2863 operational status */ |
| 165 | enum { |
| 166 | 	IF_OPER_UNKNOWN, |
| 167 | 	IF_OPER_NOTPRESENT, |
| 168 | 	IF_OPER_DOWN, |
| 169 | 	IF_OPER_LOWERLAYERDOWN, |
| 170 | 	IF_OPER_TESTING, |
| 171 | 	IF_OPER_DORMANT, |
| 172 | 	IF_OPER_UP, |
| 173 | }; |
| 174 | |
| 175 | /* link modes */ |
| 176 | enum { |
| 177 | 	IF_LINK_MODE_DEFAULT, |
| 178 | 	IF_LINK_MODE_DORMANT,	/* limit upward transition to dormant */ |
| 179 | 	IF_LINK_MODE_TESTING,	/* limit upward transition to testing */ |
| 180 | }; |
| 181 | |
| 182 | /* |
| 183 | *	Device mapping structure. I'd just gone off and designed a |
| 184 | *	beautiful scheme using only loadable modules with arguments |
| 185 | *	for driver options and along come the PCMCIA people 8) |
| 186 | * |
| 187 | *	Ah well. The get() side of this is good for WDSETUP, and it'll |
| 188 | *	be handy for debugging things. The set side is fine for now and |
| 189 | *	being very small might be worth keeping for clean configuration. |
| 190 | */ |
| 191 | |
| 192 | /* for compatibility with glibc net/if.h */ |
| 193 | #if __UAPI_DEF_IF_IFMAP |
| 194 | struct ifmap { |
| 195 | 	unsigned long mem_start; |
| 196 | 	unsigned long mem_end; |
| 197 | 	unsigned short base_addr; |
| 198 | 	unsigned char irq; |
| 199 | 	unsigned char dma; |
| 200 | 	unsigned char port; |
| 201 | 	/* 3 bytes spare */ |
| 202 | }; |
| 203 | #endif /* __UAPI_DEF_IF_IFMAP */ |
| 204 | |
| 205 | struct if_settings { |
| 206 | 	unsigned int type;	/* Type of physical device or protocol */ |
| 207 | 	unsigned int size;	/* Size of the data allocated by the caller */ |
| 208 | 	union { |
| 209 | 		/* {atm/eth/dsl}_settings anyone ? */ |
| 210 | 		raw_hdlc_proto		*raw_hdlc; |
| 211 | 		cisco_proto		*cisco; |
| 212 | 		fr_proto		*fr; |
| 213 | 		fr_proto_pvc		*fr_pvc; |
| 214 | 		fr_proto_pvc_info	*fr_pvc_info; |
| 215 | 		x25_hdlc_proto		*x25; |
| 216 | |
| 217 | 		/* interface settings */ |
| 218 | 		sync_serial_settings	*sync; |
| 219 | 		te1_settings		*te1; |
| 220 | 	} ifs_ifsu; |
| 221 | }; |
| 222 | |
| 223 | /* |
| 224 | * Interface request structure used for socket |
| 225 | * ioctl's. All interface ioctl's must have parameter |
| 226 | * definitions which begin with ifr_name. The |
| 227 | * remainder may be interface specific. |
| 228 | */ |
| 229 | |
| 230 | /* for compatibility with glibc net/if.h */ |
| 231 | #if __UAPI_DEF_IF_IFREQ |
| 232 | struct ifreq { |
| 233 | #define IFHWADDRLEN	6 |
| 234 | 	union |
| 235 | 	{ |
| 236 | 		char	ifrn_name[IFNAMSIZ];		/* if name, e.g. "en0" */ |
| 237 | 	} ifr_ifrn; |
| 238 | 	 |
| 239 | 	union { |
| 240 | 		struct	sockaddr ifru_addr; |
| 241 | 		struct	sockaddr ifru_dstaddr; |
| 242 | 		struct	sockaddr ifru_broadaddr; |
| 243 | 		struct	sockaddr ifru_netmask; |
| 244 | 		struct sockaddr ifru_hwaddr; |
| 245 | 		short	ifru_flags; |
| 246 | 		int	ifru_ivalue; |
| 247 | 		int	ifru_mtu; |
| 248 | 		struct ifmap ifru_map; |
| 249 | 		char	ifru_slave[IFNAMSIZ];	/* Just fits the size */ |
| 250 | 		char	ifru_newname[IFNAMSIZ]; |
| 251 | 		void *	ifru_data; |
| 252 | 		struct	if_settings ifru_settings; |
| 253 | 	} ifr_ifru; |
| 254 | }; |
| 255 | #endif /* __UAPI_DEF_IF_IFREQ */ |
| 256 | |
| 257 | #define ifr_name	ifr_ifrn.ifrn_name	/* interface name 	*/ |
| 258 | #define ifr_hwaddr	ifr_ifru.ifru_hwaddr	/* MAC address 		*/ |
| 259 | #define	ifr_addr	ifr_ifru.ifru_addr	/* address		*/ |
| 260 | #define	ifr_dstaddr	ifr_ifru.ifru_dstaddr	/* other end of p-p lnk	*/ |
| 261 | #define	ifr_broadaddr	ifr_ifru.ifru_broadaddr	/* broadcast address	*/ |
| 262 | #define	ifr_netmask	ifr_ifru.ifru_netmask	/* interface net mask	*/ |
| 263 | #define	ifr_flags	ifr_ifru.ifru_flags	/* flags		*/ |
| 264 | #define	ifr_metric	ifr_ifru.ifru_ivalue	/* metric		*/ |
| 265 | #define	ifr_mtu		ifr_ifru.ifru_mtu	/* mtu			*/ |
| 266 | #define ifr_map		ifr_ifru.ifru_map	/* device map		*/ |
| 267 | #define ifr_slave	ifr_ifru.ifru_slave	/* slave device		*/ |
| 268 | #define	ifr_data	ifr_ifru.ifru_data	/* for use by interface	*/ |
| 269 | #define ifr_ifindex	ifr_ifru.ifru_ivalue	/* interface index	*/ |
| 270 | #define ifr_bandwidth	ifr_ifru.ifru_ivalue /* link bandwidth	*/ |
| 271 | #define ifr_qlen	ifr_ifru.ifru_ivalue	/* Queue length 	*/ |
| 272 | #define ifr_newname	ifr_ifru.ifru_newname	/* New name		*/ |
| 273 | #define ifr_settings	ifr_ifru.ifru_settings	/* Device/proto settings*/ |
| 274 | |
| 275 | /* |
| 276 | * Structure used in SIOCGIFCONF request. |
| 277 | * Used to retrieve interface configuration |
| 278 | * for machine (useful for programs which |
| 279 | * must know all networks accessible). |
| 280 | */ |
| 281 | |
| 282 | /* for compatibility with glibc net/if.h */ |
| 283 | #if __UAPI_DEF_IF_IFCONF |
| 284 | struct ifconf { |
| 285 | 	int	ifc_len;			/* size of buffer	*/ |
| 286 | 	union { |
| 287 | 		char *ifcu_buf; |
| 288 | 		struct ifreq *ifcu_req; |
| 289 | 	} ifc_ifcu; |
| 290 | }; |
| 291 | #endif /* __UAPI_DEF_IF_IFCONF */ |
| 292 | |
| 293 | #define	ifc_buf	ifc_ifcu.ifcu_buf		/* buffer address	*/ |
| 294 | #define	ifc_req	ifc_ifcu.ifcu_req		/* array of structures	*/ |
| 295 | |
| 296 | #endif /* _LINUX_IF_H */ |