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