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 */ 36 struct ifinfomsg { 37 unsigned char ifi_family; /* not used */ 38 unsigned char __ifi_pad; 39 unsigned short ifi_type; /* IFT_* (net/if_types.h) */ 40 int ifi_index; /* Interface 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 55 enum { 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, /* u32: active VFs, when requested */ 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 150 /* IFLA_EXT_MASK values. */ 151 #define RTEXT_FILTER_VF (1U << 0) 152 153 enum { 154 IFLAF_UNSPEC = 0, 155 IFLAF_ORIG_IFNAME = 1, /* string, original interface name at creation */ 156 IFLAF_ORIG_HWADDR = 2, /* binary, original hardware address */ 157 IFLAF_CAPS = 3, /* bitset, interface capabilities */ 158 IFLAF_VF_STATUS = 4, /* nested, IFLAF_VFS_* */ 159 __IFLAF_MAX 160 }; 161 #define IFLAF_MAX (__IFLAF_MAX - 1) 162 163 /* IFLAF_VF_STATUS attributes. */ 164 enum { 165 IFLAF_VFS_UNSPEC = 0, 166 IFLAF_VFS_VERSION = 1, /* u32: IFVF_STATUS_VERSION */ 167 IFLAF_VFS_ERROR = 2, /* u32: errno from requested query */ 168 IFLAF_VFS_PF_LINK_STATE = 3, /* u8: IFLAF_VF_LINK_* */ 169 IFLAF_VFS_PF_LINK_SPEED = 4, /* u64: bits per second */ 170 IFLAF_VFS_LIST = 5, /* nested, IFLAF_VF_LIST_* */ 171 __IFLAF_VFS_MAX 172 }; 173 #define IFLAF_VFS_MAX (__IFLAF_VFS_MAX - 1) 174 175 /* IFLAF_VFS_LIST attributes. */ 176 enum { 177 IFLAF_VF_LIST_UNSPEC = 0, 178 IFLAF_VF_LIST_ENTRY = 1, /* nested, IFLAF_VF_*; repeated */ 179 __IFLAF_VF_LIST_MAX 180 }; 181 #define IFLAF_VF_LIST_MAX (__IFLAF_VF_LIST_MAX - 1) 182 183 /* IFLAF_VF_LIST_ENTRY attributes. */ 184 enum { 185 IFLAF_VF_UNSPEC = 0, 186 IFLAF_VF_INDEX = 1, /* u32 */ 187 IFLAF_VF_CONFIGURED = 2, /* u8 boolean */ 188 IFLAF_VF_INITIALIZED = 3, /* u8 boolean */ 189 IFLAF_VF_MAC = 4, /* binary */ 190 IFLAF_VF_VLAN_MODE = 5, /* u8: IFLAF_VF_VLAN_* */ 191 IFLAF_VF_VLAN = 6, /* u16 */ 192 IFLAF_VF_VLAN_COUNT = 7, /* u32 */ 193 IFLAF_VF_VLAN_LIMIT = 8, /* u32 */ 194 IFLAF_VF_NUM_QUEUES = 9, /* u32 */ 195 IFLAF_VF_ALLOW_SET_MAC = 10, /* u8 boolean */ 196 IFLAF_VF_ALLOW_SET_VLAN = 11, /* u8 boolean */ 197 IFLAF_VF_MAC_ANTI_SPOOF = 12, /* u8 boolean */ 198 IFLAF_VF_ALLOW_PROMISC = 13, /* u8 boolean */ 199 IFLAF_VF_TRAFFIC_ENABLED = 14, /* u8 boolean */ 200 IFLAF_VF_MDD_BLOCKED = 15, /* u8 boolean */ 201 IFLAF_VF_QUARANTINED = 16, /* u8 boolean */ 202 IFLAF_VF_API_VERSION = 17, /* string */ 203 IFLAF_VF_LINK_STATE_POLICY = 18, /* u8: IFLAF_VF_LINK_* */ 204 IFLAF_VF_EXTENSIONS = 19, /* nested, IFLAF_VF_EXT_LIST_* */ 205 __IFLAF_VF_MAX 206 }; 207 #define IFLAF_VF_MAX (__IFLAF_VF_MAX - 1) 208 209 /* IFLAF_VF_EXTENSIONS attributes. */ 210 enum { 211 IFLAF_VF_EXT_LIST_UNSPEC = 0, 212 IFLAF_VF_EXT_LIST_ENTRY = 1, /* nested; repeated */ 213 __IFLAF_VF_EXT_LIST_MAX 214 }; 215 #define IFLAF_VF_EXT_LIST_MAX (__IFLAF_VF_EXT_LIST_MAX - 1) 216 217 /* IFLAF_VF_EXT_LIST_ENTRY attributes. */ 218 enum { 219 IFLAF_VF_EXT_UNSPEC = 0, 220 IFLAF_VF_EXT_NAME = 1, /* string: stable namespace */ 221 IFLAF_VF_EXT_DATA = 2, /* binary: packed namespace nvlist */ 222 __IFLAF_VF_EXT_MAX 223 }; 224 #define IFLAF_VF_EXT_MAX (__IFLAF_VF_EXT_MAX - 1) 225 226 enum { 227 IFLAF_VF_LINK_UNKNOWN = 0, 228 IFLAF_VF_LINK_DOWN = 1, 229 IFLAF_VF_LINK_UP = 2, 230 IFLAF_VF_LINK_AUTO = 3, 231 }; 232 233 enum { 234 IFLAF_VF_VLAN_UNKNOWN = 0, 235 IFLAF_VF_VLAN_ACCESS = 1, 236 IFLAF_VF_VLAN_TRUNK = 2, 237 }; 238 239 /* 240 * Attributes that can be used as filters: 241 * IFLA_IFNAME, IFLA_GROUP, IFLA_ALT_IFNAME 242 * Headers that can be used as filters: 243 * ifi_index, ifi_type 244 */ 245 246 /* 247 * IFLA_OPERSTATE. 248 * The values below represent the possible 249 * states of ifOperStatus defined by RFC 2863 250 */ 251 enum { 252 IF_OPER_UNKNOWN = 0, /* status can not be determined */ 253 IF_OPER_NOTPRESENT = 1, /* some (hardware) component not present */ 254 IF_OPER_DOWN = 2, /* down */ 255 IF_OPER_LOWERLAYERDOWN = 3, /* some lower-level interface is down */ 256 IF_OPER_TESTING = 4, /* in some test mode */ 257 IF_OPER_DORMANT = 5, /* "up" but waiting for some condition (802.1X) */ 258 IF_OPER_UP = 6, /* ready to pass packets */ 259 }; 260 261 /* IFLA_STATS */ 262 struct rtnl_link_stats { 263 uint32_t rx_packets; /* total RX packets (IFCOUNTER_IPACKETS) */ 264 uint32_t tx_packets; /* total TX packets (IFCOUNTER_OPACKETS) */ 265 uint32_t rx_bytes; /* total RX bytes (IFCOUNTER_IBYTES) */ 266 uint32_t tx_bytes; /* total TX bytes (IFCOUNTER_OBYTES) */ 267 uint32_t rx_errors; /* RX errors (IFCOUNTER_IERRORS) */ 268 uint32_t tx_errors; /* RX errors (IFCOUNTER_OERRORS) */ 269 uint32_t rx_dropped; /* RX drop (no space in ring/no bufs) (IFCOUNTER_IQDROPS) */ 270 uint32_t tx_dropped; /* TX drop (IFCOUNTER_OQDROPS) */ 271 uint32_t multicast; /* RX multicast packets (IFCOUNTER_IMCASTS) */ 272 uint32_t collisions; /* not supported */ 273 uint32_t rx_length_errors; /* not supported */ 274 uint32_t rx_over_errors; /* not supported */ 275 uint32_t rx_crc_errors; /* not supported */ 276 uint32_t rx_frame_errors; /* not supported */ 277 uint32_t rx_fifo_errors; /* not supported */ 278 uint32_t rx_missed_errors; /* not supported */ 279 uint32_t tx_aborted_errors; /* not supported */ 280 uint32_t tx_carrier_errors; /* not supported */ 281 uint32_t tx_fifo_errors; /* not supported */ 282 uint32_t tx_heartbeat_errors; /* not supported */ 283 uint32_t tx_window_errors; /* not supported */ 284 uint32_t rx_compressed; /* not supported */ 285 uint32_t tx_compressed; /* not supported */ 286 uint32_t rx_nohandler; /* dropped due to no proto handler (IFCOUNTER_NOPROTO) */ 287 }; 288 289 /* IFLA_STATS64 */ 290 struct rtnl_link_stats64 { 291 uint64_t rx_packets; /* total RX packets (IFCOUNTER_IPACKETS) */ 292 uint64_t tx_packets; /* total TX packets (IFCOUNTER_OPACKETS) */ 293 uint64_t rx_bytes; /* total RX bytes (IFCOUNTER_IBYTES) */ 294 uint64_t tx_bytes; /* total TX bytes (IFCOUNTER_OBYTES) */ 295 uint64_t rx_errors; /* RX errors (IFCOUNTER_IERRORS) */ 296 uint64_t tx_errors; /* RX errors (IFCOUNTER_OERRORS) */ 297 uint64_t rx_dropped; /* RX drop (no space in ring/no bufs) (IFCOUNTER_IQDROPS) */ 298 uint64_t tx_dropped; /* TX drop (IFCOUNTER_OQDROPS) */ 299 uint64_t multicast; /* RX multicast packets (IFCOUNTER_IMCASTS) */ 300 uint64_t collisions; /* not supported */ 301 uint64_t rx_length_errors; /* not supported */ 302 uint64_t rx_over_errors; /* not supported */ 303 uint64_t rx_crc_errors; /* not supported */ 304 uint64_t rx_frame_errors; /* not supported */ 305 uint64_t rx_fifo_errors; /* not supported */ 306 uint64_t rx_missed_errors; /* not supported */ 307 uint64_t tx_aborted_errors; /* not supported */ 308 uint64_t tx_carrier_errors; /* not supported */ 309 uint64_t tx_fifo_errors; /* not supported */ 310 uint64_t tx_heartbeat_errors; /* not supported */ 311 uint64_t tx_window_errors; /* not supported */ 312 uint64_t rx_compressed; /* not supported */ 313 uint64_t tx_compressed; /* not supported */ 314 uint64_t rx_nohandler; /* dropped due to no proto handler (IFCOUNTER_NOPROTO) */ 315 }; 316 317 /* IFLA_LINKINFO child nlattr types */ 318 enum { 319 IFLA_INFO_UNSPEC, 320 IFLA_INFO_KIND = 1, /* string, link type ("vlan") */ 321 IFLA_INFO_DATA = 2, /* Per-link-type custom data */ 322 IFLA_INFO_XSTATS = 3, 323 IFLA_INFO_SLAVE_KIND = 4, 324 IFLA_INFO_SLAVE_DATA = 5, 325 __IFLA_INFO_MAX, 326 }; 327 #define IFLA_INFO_MAX (__IFLA_INFO_MAX - 1) 328 329 /* Encapsulation Types */ 330 enum { 331 IFLA_TUNNEL_NONE, 332 IFLA_TUNNEL_GRE_UDP, /* GRE UDP Encapsulation */ 333 __IFLA_TUNNEL_MAX, 334 }; 335 336 #define IFLA_TUNNEL_MAX (__IFLA_TUNNEL_MAX - 1) 337 338 /* IFLA_INFO_DATA vlan attributes */ 339 enum { 340 IFLA_VLAN_UNSPEC, 341 IFLA_VLAN_ID, 342 IFLA_VLAN_FLAGS, 343 IFLA_VLAN_EGRESS_QOS, 344 IFLA_VLAN_INGRESS_QOS, 345 IFLA_VLAN_PROTOCOL, 346 __IFLA_VLAN_MAX, 347 }; 348 349 #define IFLA_VLAN_MAX (__IFLA_VLAN_MAX - 1) 350 struct ifla_vlan_flags { 351 uint32_t flags; 352 uint32_t mask; 353 }; 354 355 /* IFLA_INFO_DATA gif attributes */ 356 enum { 357 IFLA_IPTUN_UNSPEC, 358 IFLA_IPTUN_LOCAL, 359 IFLA_IPTUN_REMOTE, 360 IFLA_IPTUN_FLAGS, 361 __IFLA_IPTUN_MAX, 362 }; 363 #define IFLA_IPTUN_MAX (__IFLA_IPTUN_MAX - 1) 364 365 /* IFLA_INFO_DATA gre attributes */ 366 enum { 367 IFLA_GRE_UNSPEC, 368 IFLA_GRE_LOCAL, 369 IFLA_GRE_REMOTE, 370 IFLA_GRE_FLAGS, 371 IFLA_GRE_OKEY, 372 IFLA_GRE_ENCAP_TYPE, 373 IFLA_GRE_ENCAP_SPORT, 374 __IFLA_GRE_MAX, 375 }; 376 377 #define IFLA_GRE_MAX (__IFLA_GRE_MAX - 1) 378 379 /* IFLA_INFO_DATA geneve attributes */ 380 enum { 381 IFLA_GENEVE_UNSPEC, 382 IFLA_GENEVE_ID, 383 IFLA_GENEVE_PROTOCOL, 384 IFLA_GENEVE_LOCAL, 385 IFLA_GENEVE_REMOTE, 386 IFLA_GENEVE_LOCAL_PORT, 387 IFLA_GENEVE_PORT, 388 IFLA_GENEVE_PORT_RANGE, 389 IFLA_GENEVE_DF, 390 IFLA_GENEVE_TTL, 391 IFLA_GENEVE_TTL_INHERIT, 392 IFLA_GENEVE_DSCP_INHERIT, 393 IFLA_GENEVE_COLLECT_METADATA, 394 IFLA_GENEVE_FTABLE_LEARN, 395 IFLA_GENEVE_FTABLE_FLUSH, 396 IFLA_GENEVE_FTABLE_MAX, 397 IFLA_GENEVE_FTABLE_TIMEOUT, 398 IFLA_GENEVE_FTABLE_COUNT, 399 IFLA_GENEVE_FTABLE_NOSPACE_CNT, 400 IFLA_GENEVE_FTABLE_LOCK_UP_FAIL_CNT, 401 IFLA_GENEVE_MC_IFNAME, 402 IFLA_GENEVE_MC_IFINDEX, 403 IFLA_GENEVE_TXCSUM_CNT, 404 IFLA_GENEVE_TSO_CNT, 405 IFLA_GENEVE_RXCSUM_CNT, 406 __IFLA_GENEVE_MAX, 407 }; 408 #define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1) 409 410 enum ifla_geneve_df { 411 IFLA_GENEVE_DF_UNSET, 412 IFLA_GENEVE_DF_SET, 413 IFLA_GENEVE_DF_INHERIT, 414 __IFLA_GENEVE_DF_MAX, 415 }; 416 #define IFLA_GENEVE_DF_MAX (__IFLA_GENEVE_DF_MAX - 1) 417 418 struct ifla_geneve_port_range { 419 uint16_t low; 420 uint16_t high; 421 }; 422 423 #endif 424