1/*-
  2 * SPDX-License-Identifier: BSD-2-Clause
  3 *
  4 * Copyright (c) 2022 Alexander V. Chernikov <melifaro@FreeBSD.org>
  5 *
  6 * Redistribution and use in source and binary forms, with or without
  7 * modification, are permitted provided that the following conditions
  8 * are met:
  9 * 1. Redistributions of source code must retain the above copyright
 10 *    notice, this list of conditions and the following disclaimer.
 11 * 2. Redistributions in binary form must reproduce the above copyright
 12 *    notice, this list of conditions and the following disclaimer in the
 13 *    documentation and/or other materials provided with the distribution.
 14 *
 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 25 * SUCH DAMAGE.
 26 */
 27
 28/*
 29 * Interface-related (RTM_<NEW|DEL|GET|SET>LINK) message header and attributes.
 30 */
 31
 32#ifndef _NETLINK_ROUTE_INTERFACE_H_
 33#define _NETLINK_ROUTE_INTERFACE_H_
 34
 35/* Base header for all of the relevant messages */
 36struct ifinfomsg {
 37	unsigned char	ifi_family;	/* not used */
 38	unsigned char	__ifi_pad;
 39	unsigned short	ifi_type;	/* ARPHRD_* */
 40	int		ifi_index;	/* Inteface index */
 41	unsigned	ifi_flags;	/* IFF_* flags */
 42	unsigned	ifi_change;	/* IFF_* change mask */
 43};
 44
 45/* Linux-specific link-level state flag */
 46#define	IFF_LOWER_UP	IFF_NETLINK_1
 47
 48#ifndef _KERNEL
 49/* Compatilbility helpers */
 50#define	_IFINFO_HDRLEN		((int)sizeof(struct ifinfomsg))
 51#define	IFLA_RTA(_ifi)		((struct rtattr *)NL_ITEM_DATA(_ifi, _IFINFO_HDRLEN))
 52#define	IFLA_PAYLOAD(_ifi)	NLMSG_PAYLOAD(_ifi, _IFINFO_HDRLEN)
 53#endif
 54
 55enum {
 56	IFLA_UNSPEC	= 0,
 57	IFLA_ADDRESS	= 1,	/* binary: Link-level address (MAC) */
 58#define	IFLA_ADDRESS IFLA_ADDRESS
 59	IFLA_BROADCAST	= 2,	/* binary: link-level broadcast address */
 60#define	IFLA_BROADCAST IFLA_BROADCAST
 61	IFLA_IFNAME	= 3,	/* string: Interface name */
 62#define	IFLA_IFNAME IFLA_IFNAME
 63	IFLA_MTU	= 4,	/* u32: Current interface L3 mtu */
 64#define	IFLA_MTU IFLA_MTU
 65	IFLA_LINK	= 5,	/* u32: interface index */
 66#define	IFLA_LINK IFLA_LINK
 67	IFLA_QDISC	= 6,	/* string: Queing policy (not supported) */
 68#define	IFLA_QDISC IFLA_QDISC
 69	IFLA_STATS	= 7,	/* Interface counters */
 70#define	IFLA_STATS IFLA_STATS
 71	IFLA_COST	= 8,	/* not supported */
 72#define IFLA_COST IFLA_COST
 73	IFLA_PRIORITY	= 9,	/* not supported */
 74#define IFLA_PRIORITY IFLA_PRIORITY
 75	IFLA_MASTER	= 10,	/* u32: parent interface ifindex */
 76#define IFLA_MASTER IFLA_MASTER
 77	IFLA_WIRELESS	= 11,	/* not supported */
 78#define IFLA_WIRELESS IFLA_WIRELESS
 79	IFLA_PROTINFO	= 12,	/* protocol-specific data */
 80#define IFLA_PROTINFO IFLA_PROTINFO
 81	IFLA_TXQLEN	= 13,	/* u32: transmit queue length */
 82#define IFLA_TXQLEN IFLA_TXQLEN
 83	IFLA_MAP	= 14,	/* not supported */
 84#define IFLA_MAP IFLA_MAP
 85	IFLA_WEIGHT	= 15,	/* not supported */
 86#define IFLA_WEIGHT IFLA_WEIGHT
 87	IFLA_OPERSTATE	= 16,	/* u8: ifOperStatus per RFC 2863 */
 88#define	IFLA_OPERSTATE IFLA_OPERSTATE
 89	IFLA_LINKMODE	= 17,	/* u8: ifmedia (not supported) */
 90#define	IFLA_LINKMODE IFLA_LINKMODE
 91	IFLA_LINKINFO	= 18,	/* nested: IFLA_INFO_ */
 92#define IFLA_LINKINFO IFLA_LINKINFO
 93	IFLA_NET_NS_PID	= 19,	/* u32: vnet id (not supported) */
 94#define	IFLA_NET_NS_PID IFLA_NET_NS_PID
 95	IFLA_IFALIAS	= 20,	/* string: interface description */
 96#define	IFLA_IFALIAS IFLA_IFALIAS
 97	IFLA_NUM_VF	= 21,	/* not supported */
 98#define	IFLA_NUM_VF IFLA_NUM_VF
 99	IFLA_VFINFO_LIST= 22,	/* not supported */
100#define	IFLA_VFINFO_LIST IFLA_VFINFO_LIST
101	IFLA_STATS64	= 23,	/* rtnl_link_stats64: iface stats */
102#define	IFLA_STATS64 IFLA_STATS64
103	IFLA_VF_PORTS,
104	IFLA_PORT_SELF,
105	IFLA_AF_SPEC,
106	IFLA_GROUP, /* Group the device belongs to */
107	IFLA_NET_NS_FD,
108	IFLA_EXT_MASK,	  /* Extended info mask, VFs, etc */
109	IFLA_PROMISCUITY, /* Promiscuity count: > 0 means acts PROMISC */
110#define IFLA_PROMISCUITY IFLA_PROMISCUITY
111	IFLA_NUM_TX_QUEUES,
112	IFLA_NUM_RX_QUEUES,
113	IFLA_CARRIER,
114	IFLA_PHYS_PORT_ID,
115	IFLA_CARRIER_CHANGES,
116	IFLA_PHYS_SWITCH_ID,
117	IFLA_LINK_NETNSID,
118	IFLA_PHYS_PORT_NAME,
119	IFLA_PROTO_DOWN,
120	IFLA_GSO_MAX_SEGS,
121	IFLA_GSO_MAX_SIZE,
122	IFLA_PAD,
123	IFLA_XDP,
124	IFLA_EVENT,
125	IFLA_NEW_NETNSID,
126	IFLA_IF_NETNSID,
127	IFLA_TARGET_NETNSID = IFLA_IF_NETNSID, /* new alias */
128	IFLA_CARRIER_UP_COUNT,
129	IFLA_CARRIER_DOWN_COUNT,
130	IFLA_NEW_IFINDEX,
131	IFLA_MIN_MTU,
132	IFLA_MAX_MTU,
133	IFLA_PROP_LIST,
134	IFLA_ALT_IFNAME, /* Alternative ifname */
135	IFLA_PERM_ADDRESS,
136	IFLA_PROTO_DOWN_REASON,
137	IFLA_PARENT_DEV_NAME,
138	IFLA_PARENT_DEV_BUS_NAME,
139	IFLA_GRO_MAX_SIZE,
140	IFLA_TSO_MAX_SEGS,
141	IFLA_ALLMULTI,
142	IFLA_DEVLINK_PORT,
143	IFLA_GSO_IPV4_MAX_SIZE,
144	IFLA_GRO_IPV4_MAX_SIZE,
145	IFLA_FREEBSD,
146	__IFLA_MAX
147};
148#define IFLA_MAX (__IFLA_MAX - 1)
149
150enum {
151	IFLAF_UNSPEC		= 0,
152	IFLAF_ORIG_IFNAME	= 1,	/* string, original interface name at creation */
153	IFLAF_ORIG_HWADDR	= 2,	/* binary, original hardware address */
154	IFLAF_CAPS		= 3,	/* bitset, interface capabilities */
155	__IFLAF_MAX
156};
157#define IFLAF_MAX (__IFLAF_MAX - 1)
158
159/*
160 * Attributes that can be used as filters:
161 *  IFLA_IFNAME, IFLA_GROUP, IFLA_ALT_IFNAME
162 * Headers that can be used as filters:
163 *  ifi_index, ifi_type
164 */
165
166/*
167 * IFLA_OPERSTATE.
168 * The values below represent the possible
169 * states of ifOperStatus defined by RFC 2863
170 */
171enum {
172	IF_OPER_UNKNOWN		= 0, /* status can not be determined */
173	IF_OPER_NOTPRESENT	= 1, /* some (hardware) component not present */
174	IF_OPER_DOWN		= 2, /* down */
175	IF_OPER_LOWERLAYERDOWN	= 3, /* some lower-level interface is down */
176	IF_OPER_TESTING		= 4, /* in some test mode */
177	IF_OPER_DORMANT		= 5, /* "up" but waiting for some condition (802.1X) */
178	IF_OPER_UP		= 6, /* ready to pass packets */
179};
180
181/* IFLA_STATS */
182struct rtnl_link_stats {
183	uint32_t rx_packets;	/* total RX packets (IFCOUNTER_IPACKETS) */
184	uint32_t tx_packets;	/* total TX packets (IFCOUNTER_OPACKETS) */
185	uint32_t rx_bytes;	/* total RX bytes (IFCOUNTER_IBYTES) */
186	uint32_t tx_bytes;	/* total TX bytes (IFCOUNTER_OBYTES) */
187	uint32_t rx_errors;	/* RX errors (IFCOUNTER_IERRORS) */
188	uint32_t tx_errors;	/* RX errors (IFCOUNTER_OERRORS) */
189	uint32_t rx_dropped;	/* RX drop (no space in ring/no bufs) (IFCOUNTER_IQDROPS) */
190	uint32_t tx_dropped;	/* TX drop (IFCOUNTER_OQDROPS) */
191	uint32_t multicast;	/* RX multicast packets (IFCOUNTER_IMCASTS) */
192	uint32_t collisions;	/* not supported */
193	uint32_t rx_length_errors;	/* not supported */
194	uint32_t rx_over_errors;	/* not supported */
195	uint32_t rx_crc_errors;		/* not supported */
196	uint32_t rx_frame_errors;	/* not supported */
197	uint32_t rx_fifo_errors;	/* not supported */
198	uint32_t rx_missed_errors;	/* not supported */
199	uint32_t tx_aborted_errors;	/* not supported */
200	uint32_t tx_carrier_errors;	/* not supported */
201	uint32_t tx_fifo_errors;	/* not supported */
202	uint32_t tx_heartbeat_errors;	/* not supported */
203	uint32_t tx_window_errors;	/* not supported */
204	uint32_t rx_compressed;		/* not supported */
205	uint32_t tx_compressed;		/* not supported */
206	uint32_t rx_nohandler;	/* dropped due to no proto handler (IFCOUNTER_NOPROTO) */
207};
208
209/* IFLA_STATS64 */
210struct rtnl_link_stats64 {
211	uint64_t rx_packets;	/* total RX packets (IFCOUNTER_IPACKETS) */
212	uint64_t tx_packets;	/* total TX packets (IFCOUNTER_OPACKETS) */
213	uint64_t rx_bytes;	/* total RX bytes (IFCOUNTER_IBYTES) */
214	uint64_t tx_bytes;	/* total TX bytes (IFCOUNTER_OBYTES) */
215	uint64_t rx_errors;	/* RX errors (IFCOUNTER_IERRORS) */
216	uint64_t tx_errors;	/* RX errors (IFCOUNTER_OERRORS) */
217	uint64_t rx_dropped;	/* RX drop (no space in ring/no bufs) (IFCOUNTER_IQDROPS) */
218	uint64_t tx_dropped;	/* TX drop (IFCOUNTER_OQDROPS) */
219	uint64_t multicast;	/* RX multicast packets (IFCOUNTER_IMCASTS) */
220	uint64_t collisions;	/* not supported */
221	uint64_t rx_length_errors;	/* not supported */
222	uint64_t rx_over_errors;	/* not supported */
223	uint64_t rx_crc_errors;		/* not supported */
224	uint64_t rx_frame_errors;	/* not supported */
225	uint64_t rx_fifo_errors;	/* not supported */
226	uint64_t rx_missed_errors;	/* not supported */
227	uint64_t tx_aborted_errors;	/* not supported */
228	uint64_t tx_carrier_errors;	/* not supported */
229	uint64_t tx_fifo_errors;	/* not supported */
230	uint64_t tx_heartbeat_errors;	/* not supported */
231	uint64_t tx_window_errors;	/* not supported */
232	uint64_t rx_compressed;		/* not supported */
233	uint64_t tx_compressed;		/* not supported */
234	uint64_t rx_nohandler;	/* dropped due to no proto handler (IFCOUNTER_NOPROTO) */
235};
236
237/* IFLA_LINKINFO child nlattr types */
238enum {
239	IFLA_INFO_UNSPEC,
240	IFLA_INFO_KIND		= 1, /* string, link type ("vlan") */
241	IFLA_INFO_DATA		= 2, /* Per-link-type custom data */
242	IFLA_INFO_XSTATS	= 3,
243	IFLA_INFO_SLAVE_KIND	= 4,
244	IFLA_INFO_SLAVE_DATA	= 5,
245	__IFLA_INFO_MAX,
246};
247#define IFLA_INFO_MAX	(__IFLA_INFO_MAX - 1)
248
249/* IFLA_INFO_DATA vlan attributes */
250enum {
251	IFLA_VLAN_UNSPEC,
252	IFLA_VLAN_ID,
253	IFLA_VLAN_FLAGS,
254	IFLA_VLAN_EGRESS_QOS,
255	IFLA_VLAN_INGRESS_QOS,
256	IFLA_VLAN_PROTOCOL,
257	__IFLA_VLAN_MAX,
258};
259
260#define IFLA_VLAN_MAX	(__IFLA_VLAN_MAX - 1)
261struct ifla_vlan_flags {
262	uint32_t flags;
263	uint32_t mask;
264};
265
266#endif