1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Linux ethernet bridge 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Authors: 6*4882a593Smuzhiyun * Lennert Buytenhek <buytenh@gnu.org> 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or 9*4882a593Smuzhiyun * modify it under the terms of the GNU General Public License 10*4882a593Smuzhiyun * as published by the Free Software Foundation; either version 11*4882a593Smuzhiyun * 2 of the License, or (at your option) any later version. 12*4882a593Smuzhiyun */ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #ifndef _UAPI_LINUX_IF_BRIDGE_H 15*4882a593Smuzhiyun #define _UAPI_LINUX_IF_BRIDGE_H 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #include <linux/types.h> 18*4882a593Smuzhiyun #include <linux/if_ether.h> 19*4882a593Smuzhiyun #include <linux/in6.h> 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define SYSFS_BRIDGE_ATTR "bridge" 22*4882a593Smuzhiyun #define SYSFS_BRIDGE_FDB "brforward" 23*4882a593Smuzhiyun #define SYSFS_BRIDGE_PORT_SUBDIR "brif" 24*4882a593Smuzhiyun #define SYSFS_BRIDGE_PORT_ATTR "brport" 25*4882a593Smuzhiyun #define SYSFS_BRIDGE_PORT_LINK "bridge" 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #define BRCTL_VERSION 1 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #define BRCTL_GET_VERSION 0 30*4882a593Smuzhiyun #define BRCTL_GET_BRIDGES 1 31*4882a593Smuzhiyun #define BRCTL_ADD_BRIDGE 2 32*4882a593Smuzhiyun #define BRCTL_DEL_BRIDGE 3 33*4882a593Smuzhiyun #define BRCTL_ADD_IF 4 34*4882a593Smuzhiyun #define BRCTL_DEL_IF 5 35*4882a593Smuzhiyun #define BRCTL_GET_BRIDGE_INFO 6 36*4882a593Smuzhiyun #define BRCTL_GET_PORT_LIST 7 37*4882a593Smuzhiyun #define BRCTL_SET_BRIDGE_FORWARD_DELAY 8 38*4882a593Smuzhiyun #define BRCTL_SET_BRIDGE_HELLO_TIME 9 39*4882a593Smuzhiyun #define BRCTL_SET_BRIDGE_MAX_AGE 10 40*4882a593Smuzhiyun #define BRCTL_SET_AGEING_TIME 11 41*4882a593Smuzhiyun #define BRCTL_SET_GC_INTERVAL 12 42*4882a593Smuzhiyun #define BRCTL_GET_PORT_INFO 13 43*4882a593Smuzhiyun #define BRCTL_SET_BRIDGE_STP_STATE 14 44*4882a593Smuzhiyun #define BRCTL_SET_BRIDGE_PRIORITY 15 45*4882a593Smuzhiyun #define BRCTL_SET_PORT_PRIORITY 16 46*4882a593Smuzhiyun #define BRCTL_SET_PATH_COST 17 47*4882a593Smuzhiyun #define BRCTL_GET_FDB_ENTRIES 18 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun #define BR_STATE_DISABLED 0 50*4882a593Smuzhiyun #define BR_STATE_LISTENING 1 51*4882a593Smuzhiyun #define BR_STATE_LEARNING 2 52*4882a593Smuzhiyun #define BR_STATE_FORWARDING 3 53*4882a593Smuzhiyun #define BR_STATE_BLOCKING 4 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun struct __bridge_info { 56*4882a593Smuzhiyun __u64 designated_root; 57*4882a593Smuzhiyun __u64 bridge_id; 58*4882a593Smuzhiyun __u32 root_path_cost; 59*4882a593Smuzhiyun __u32 max_age; 60*4882a593Smuzhiyun __u32 hello_time; 61*4882a593Smuzhiyun __u32 forward_delay; 62*4882a593Smuzhiyun __u32 bridge_max_age; 63*4882a593Smuzhiyun __u32 bridge_hello_time; 64*4882a593Smuzhiyun __u32 bridge_forward_delay; 65*4882a593Smuzhiyun __u8 topology_change; 66*4882a593Smuzhiyun __u8 topology_change_detected; 67*4882a593Smuzhiyun __u8 root_port; 68*4882a593Smuzhiyun __u8 stp_enabled; 69*4882a593Smuzhiyun __u32 ageing_time; 70*4882a593Smuzhiyun __u32 gc_interval; 71*4882a593Smuzhiyun __u32 hello_timer_value; 72*4882a593Smuzhiyun __u32 tcn_timer_value; 73*4882a593Smuzhiyun __u32 topology_change_timer_value; 74*4882a593Smuzhiyun __u32 gc_timer_value; 75*4882a593Smuzhiyun }; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun struct __port_info { 78*4882a593Smuzhiyun __u64 designated_root; 79*4882a593Smuzhiyun __u64 designated_bridge; 80*4882a593Smuzhiyun __u16 port_id; 81*4882a593Smuzhiyun __u16 designated_port; 82*4882a593Smuzhiyun __u32 path_cost; 83*4882a593Smuzhiyun __u32 designated_cost; 84*4882a593Smuzhiyun __u8 state; 85*4882a593Smuzhiyun __u8 top_change_ack; 86*4882a593Smuzhiyun __u8 config_pending; 87*4882a593Smuzhiyun __u8 unused0; 88*4882a593Smuzhiyun __u32 message_age_timer_value; 89*4882a593Smuzhiyun __u32 forward_delay_timer_value; 90*4882a593Smuzhiyun __u32 hold_timer_value; 91*4882a593Smuzhiyun }; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun struct __fdb_entry { 94*4882a593Smuzhiyun __u8 mac_addr[ETH_ALEN]; 95*4882a593Smuzhiyun __u8 port_no; 96*4882a593Smuzhiyun __u8 is_local; 97*4882a593Smuzhiyun __u32 ageing_timer_value; 98*4882a593Smuzhiyun __u8 port_hi; 99*4882a593Smuzhiyun __u8 pad0; 100*4882a593Smuzhiyun __u16 unused; 101*4882a593Smuzhiyun }; 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun /* Bridge Flags */ 104*4882a593Smuzhiyun #define BRIDGE_FLAGS_MASTER 1 /* Bridge command to/from master */ 105*4882a593Smuzhiyun #define BRIDGE_FLAGS_SELF 2 /* Bridge command to/from lowerdev */ 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun #define BRIDGE_MODE_VEB 0 /* Default loopback mode */ 108*4882a593Smuzhiyun #define BRIDGE_MODE_VEPA 1 /* 802.1Qbg defined VEPA mode */ 109*4882a593Smuzhiyun #define BRIDGE_MODE_UNDEF 0xFFFF /* mode undefined */ 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun /* Bridge management nested attributes 112*4882a593Smuzhiyun * [IFLA_AF_SPEC] = { 113*4882a593Smuzhiyun * [IFLA_BRIDGE_FLAGS] 114*4882a593Smuzhiyun * [IFLA_BRIDGE_MODE] 115*4882a593Smuzhiyun * [IFLA_BRIDGE_VLAN_INFO] 116*4882a593Smuzhiyun * } 117*4882a593Smuzhiyun */ 118*4882a593Smuzhiyun enum { 119*4882a593Smuzhiyun IFLA_BRIDGE_FLAGS, 120*4882a593Smuzhiyun IFLA_BRIDGE_MODE, 121*4882a593Smuzhiyun IFLA_BRIDGE_VLAN_INFO, 122*4882a593Smuzhiyun IFLA_BRIDGE_VLAN_TUNNEL_INFO, 123*4882a593Smuzhiyun IFLA_BRIDGE_MRP, 124*4882a593Smuzhiyun __IFLA_BRIDGE_MAX, 125*4882a593Smuzhiyun }; 126*4882a593Smuzhiyun #define IFLA_BRIDGE_MAX (__IFLA_BRIDGE_MAX - 1) 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun #define BRIDGE_VLAN_INFO_MASTER (1<<0) /* Operate on Bridge device as well */ 129*4882a593Smuzhiyun #define BRIDGE_VLAN_INFO_PVID (1<<1) /* VLAN is PVID, ingress untagged */ 130*4882a593Smuzhiyun #define BRIDGE_VLAN_INFO_UNTAGGED (1<<2) /* VLAN egresses untagged */ 131*4882a593Smuzhiyun #define BRIDGE_VLAN_INFO_RANGE_BEGIN (1<<3) /* VLAN is start of vlan range */ 132*4882a593Smuzhiyun #define BRIDGE_VLAN_INFO_RANGE_END (1<<4) /* VLAN is end of vlan range */ 133*4882a593Smuzhiyun #define BRIDGE_VLAN_INFO_BRENTRY (1<<5) /* Global bridge VLAN entry */ 134*4882a593Smuzhiyun #define BRIDGE_VLAN_INFO_ONLY_OPTS (1<<6) /* Skip create/delete/flags */ 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun struct bridge_vlan_info { 137*4882a593Smuzhiyun __u16 flags; 138*4882a593Smuzhiyun __u16 vid; 139*4882a593Smuzhiyun }; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun enum { 142*4882a593Smuzhiyun IFLA_BRIDGE_VLAN_TUNNEL_UNSPEC, 143*4882a593Smuzhiyun IFLA_BRIDGE_VLAN_TUNNEL_ID, 144*4882a593Smuzhiyun IFLA_BRIDGE_VLAN_TUNNEL_VID, 145*4882a593Smuzhiyun IFLA_BRIDGE_VLAN_TUNNEL_FLAGS, 146*4882a593Smuzhiyun __IFLA_BRIDGE_VLAN_TUNNEL_MAX, 147*4882a593Smuzhiyun }; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun #define IFLA_BRIDGE_VLAN_TUNNEL_MAX (__IFLA_BRIDGE_VLAN_TUNNEL_MAX - 1) 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun struct bridge_vlan_xstats { 152*4882a593Smuzhiyun __u64 rx_bytes; 153*4882a593Smuzhiyun __u64 rx_packets; 154*4882a593Smuzhiyun __u64 tx_bytes; 155*4882a593Smuzhiyun __u64 tx_packets; 156*4882a593Smuzhiyun __u16 vid; 157*4882a593Smuzhiyun __u16 flags; 158*4882a593Smuzhiyun __u32 pad2; 159*4882a593Smuzhiyun }; 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun enum { 162*4882a593Smuzhiyun IFLA_BRIDGE_MRP_UNSPEC, 163*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INSTANCE, 164*4882a593Smuzhiyun IFLA_BRIDGE_MRP_PORT_STATE, 165*4882a593Smuzhiyun IFLA_BRIDGE_MRP_PORT_ROLE, 166*4882a593Smuzhiyun IFLA_BRIDGE_MRP_RING_STATE, 167*4882a593Smuzhiyun IFLA_BRIDGE_MRP_RING_ROLE, 168*4882a593Smuzhiyun IFLA_BRIDGE_MRP_START_TEST, 169*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO, 170*4882a593Smuzhiyun IFLA_BRIDGE_MRP_IN_ROLE, 171*4882a593Smuzhiyun IFLA_BRIDGE_MRP_IN_STATE, 172*4882a593Smuzhiyun IFLA_BRIDGE_MRP_START_IN_TEST, 173*4882a593Smuzhiyun __IFLA_BRIDGE_MRP_MAX, 174*4882a593Smuzhiyun }; 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #define IFLA_BRIDGE_MRP_MAX (__IFLA_BRIDGE_MRP_MAX - 1) 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun enum { 179*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INSTANCE_UNSPEC, 180*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INSTANCE_RING_ID, 181*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INSTANCE_P_IFINDEX, 182*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INSTANCE_S_IFINDEX, 183*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INSTANCE_PRIO, 184*4882a593Smuzhiyun __IFLA_BRIDGE_MRP_INSTANCE_MAX, 185*4882a593Smuzhiyun }; 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun #define IFLA_BRIDGE_MRP_INSTANCE_MAX (__IFLA_BRIDGE_MRP_INSTANCE_MAX - 1) 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun enum { 190*4882a593Smuzhiyun IFLA_BRIDGE_MRP_PORT_STATE_UNSPEC, 191*4882a593Smuzhiyun IFLA_BRIDGE_MRP_PORT_STATE_STATE, 192*4882a593Smuzhiyun __IFLA_BRIDGE_MRP_PORT_STATE_MAX, 193*4882a593Smuzhiyun }; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun #define IFLA_BRIDGE_MRP_PORT_STATE_MAX (__IFLA_BRIDGE_MRP_PORT_STATE_MAX - 1) 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun enum { 198*4882a593Smuzhiyun IFLA_BRIDGE_MRP_PORT_ROLE_UNSPEC, 199*4882a593Smuzhiyun IFLA_BRIDGE_MRP_PORT_ROLE_ROLE, 200*4882a593Smuzhiyun __IFLA_BRIDGE_MRP_PORT_ROLE_MAX, 201*4882a593Smuzhiyun }; 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun #define IFLA_BRIDGE_MRP_PORT_ROLE_MAX (__IFLA_BRIDGE_MRP_PORT_ROLE_MAX - 1) 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun enum { 206*4882a593Smuzhiyun IFLA_BRIDGE_MRP_RING_STATE_UNSPEC, 207*4882a593Smuzhiyun IFLA_BRIDGE_MRP_RING_STATE_RING_ID, 208*4882a593Smuzhiyun IFLA_BRIDGE_MRP_RING_STATE_STATE, 209*4882a593Smuzhiyun __IFLA_BRIDGE_MRP_RING_STATE_MAX, 210*4882a593Smuzhiyun }; 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun #define IFLA_BRIDGE_MRP_RING_STATE_MAX (__IFLA_BRIDGE_MRP_RING_STATE_MAX - 1) 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun enum { 215*4882a593Smuzhiyun IFLA_BRIDGE_MRP_RING_ROLE_UNSPEC, 216*4882a593Smuzhiyun IFLA_BRIDGE_MRP_RING_ROLE_RING_ID, 217*4882a593Smuzhiyun IFLA_BRIDGE_MRP_RING_ROLE_ROLE, 218*4882a593Smuzhiyun __IFLA_BRIDGE_MRP_RING_ROLE_MAX, 219*4882a593Smuzhiyun }; 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun #define IFLA_BRIDGE_MRP_RING_ROLE_MAX (__IFLA_BRIDGE_MRP_RING_ROLE_MAX - 1) 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun enum { 224*4882a593Smuzhiyun IFLA_BRIDGE_MRP_START_TEST_UNSPEC, 225*4882a593Smuzhiyun IFLA_BRIDGE_MRP_START_TEST_RING_ID, 226*4882a593Smuzhiyun IFLA_BRIDGE_MRP_START_TEST_INTERVAL, 227*4882a593Smuzhiyun IFLA_BRIDGE_MRP_START_TEST_MAX_MISS, 228*4882a593Smuzhiyun IFLA_BRIDGE_MRP_START_TEST_PERIOD, 229*4882a593Smuzhiyun IFLA_BRIDGE_MRP_START_TEST_MONITOR, 230*4882a593Smuzhiyun __IFLA_BRIDGE_MRP_START_TEST_MAX, 231*4882a593Smuzhiyun }; 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun #define IFLA_BRIDGE_MRP_START_TEST_MAX (__IFLA_BRIDGE_MRP_START_TEST_MAX - 1) 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun enum { 236*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO_UNSPEC, 237*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO_RING_ID, 238*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO_P_IFINDEX, 239*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO_S_IFINDEX, 240*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO_PRIO, 241*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO_RING_STATE, 242*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO_RING_ROLE, 243*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO_TEST_INTERVAL, 244*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO_TEST_MAX_MISS, 245*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO_TEST_MONITOR, 246*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO_I_IFINDEX, 247*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO_IN_STATE, 248*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO_IN_ROLE, 249*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO_IN_TEST_INTERVAL, 250*4882a593Smuzhiyun IFLA_BRIDGE_MRP_INFO_IN_TEST_MAX_MISS, 251*4882a593Smuzhiyun __IFLA_BRIDGE_MRP_INFO_MAX, 252*4882a593Smuzhiyun }; 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun #define IFLA_BRIDGE_MRP_INFO_MAX (__IFLA_BRIDGE_MRP_INFO_MAX - 1) 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun enum { 257*4882a593Smuzhiyun IFLA_BRIDGE_MRP_IN_STATE_UNSPEC, 258*4882a593Smuzhiyun IFLA_BRIDGE_MRP_IN_STATE_IN_ID, 259*4882a593Smuzhiyun IFLA_BRIDGE_MRP_IN_STATE_STATE, 260*4882a593Smuzhiyun __IFLA_BRIDGE_MRP_IN_STATE_MAX, 261*4882a593Smuzhiyun }; 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun #define IFLA_BRIDGE_MRP_IN_STATE_MAX (__IFLA_BRIDGE_MRP_IN_STATE_MAX - 1) 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun enum { 266*4882a593Smuzhiyun IFLA_BRIDGE_MRP_IN_ROLE_UNSPEC, 267*4882a593Smuzhiyun IFLA_BRIDGE_MRP_IN_ROLE_RING_ID, 268*4882a593Smuzhiyun IFLA_BRIDGE_MRP_IN_ROLE_IN_ID, 269*4882a593Smuzhiyun IFLA_BRIDGE_MRP_IN_ROLE_ROLE, 270*4882a593Smuzhiyun IFLA_BRIDGE_MRP_IN_ROLE_I_IFINDEX, 271*4882a593Smuzhiyun __IFLA_BRIDGE_MRP_IN_ROLE_MAX, 272*4882a593Smuzhiyun }; 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun #define IFLA_BRIDGE_MRP_IN_ROLE_MAX (__IFLA_BRIDGE_MRP_IN_ROLE_MAX - 1) 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun enum { 277*4882a593Smuzhiyun IFLA_BRIDGE_MRP_START_IN_TEST_UNSPEC, 278*4882a593Smuzhiyun IFLA_BRIDGE_MRP_START_IN_TEST_IN_ID, 279*4882a593Smuzhiyun IFLA_BRIDGE_MRP_START_IN_TEST_INTERVAL, 280*4882a593Smuzhiyun IFLA_BRIDGE_MRP_START_IN_TEST_MAX_MISS, 281*4882a593Smuzhiyun IFLA_BRIDGE_MRP_START_IN_TEST_PERIOD, 282*4882a593Smuzhiyun __IFLA_BRIDGE_MRP_START_IN_TEST_MAX, 283*4882a593Smuzhiyun }; 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun #define IFLA_BRIDGE_MRP_START_IN_TEST_MAX (__IFLA_BRIDGE_MRP_START_IN_TEST_MAX - 1) 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun struct br_mrp_instance { 288*4882a593Smuzhiyun __u32 ring_id; 289*4882a593Smuzhiyun __u32 p_ifindex; 290*4882a593Smuzhiyun __u32 s_ifindex; 291*4882a593Smuzhiyun __u16 prio; 292*4882a593Smuzhiyun }; 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun struct br_mrp_ring_state { 295*4882a593Smuzhiyun __u32 ring_id; 296*4882a593Smuzhiyun __u32 ring_state; 297*4882a593Smuzhiyun }; 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun struct br_mrp_ring_role { 300*4882a593Smuzhiyun __u32 ring_id; 301*4882a593Smuzhiyun __u32 ring_role; 302*4882a593Smuzhiyun }; 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun struct br_mrp_start_test { 305*4882a593Smuzhiyun __u32 ring_id; 306*4882a593Smuzhiyun __u32 interval; 307*4882a593Smuzhiyun __u32 max_miss; 308*4882a593Smuzhiyun __u32 period; 309*4882a593Smuzhiyun __u32 monitor; 310*4882a593Smuzhiyun }; 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun struct br_mrp_in_state { 313*4882a593Smuzhiyun __u32 in_state; 314*4882a593Smuzhiyun __u16 in_id; 315*4882a593Smuzhiyun }; 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun struct br_mrp_in_role { 318*4882a593Smuzhiyun __u32 ring_id; 319*4882a593Smuzhiyun __u32 in_role; 320*4882a593Smuzhiyun __u32 i_ifindex; 321*4882a593Smuzhiyun __u16 in_id; 322*4882a593Smuzhiyun }; 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun struct br_mrp_start_in_test { 325*4882a593Smuzhiyun __u32 interval; 326*4882a593Smuzhiyun __u32 max_miss; 327*4882a593Smuzhiyun __u32 period; 328*4882a593Smuzhiyun __u16 in_id; 329*4882a593Smuzhiyun }; 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun struct bridge_stp_xstats { 332*4882a593Smuzhiyun __u64 transition_blk; 333*4882a593Smuzhiyun __u64 transition_fwd; 334*4882a593Smuzhiyun __u64 rx_bpdu; 335*4882a593Smuzhiyun __u64 tx_bpdu; 336*4882a593Smuzhiyun __u64 rx_tcn; 337*4882a593Smuzhiyun __u64 tx_tcn; 338*4882a593Smuzhiyun }; 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun /* Bridge vlan RTM header */ 341*4882a593Smuzhiyun struct br_vlan_msg { 342*4882a593Smuzhiyun __u8 family; 343*4882a593Smuzhiyun __u8 reserved1; 344*4882a593Smuzhiyun __u16 reserved2; 345*4882a593Smuzhiyun __u32 ifindex; 346*4882a593Smuzhiyun }; 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun enum { 349*4882a593Smuzhiyun BRIDGE_VLANDB_DUMP_UNSPEC, 350*4882a593Smuzhiyun BRIDGE_VLANDB_DUMP_FLAGS, 351*4882a593Smuzhiyun __BRIDGE_VLANDB_DUMP_MAX, 352*4882a593Smuzhiyun }; 353*4882a593Smuzhiyun #define BRIDGE_VLANDB_DUMP_MAX (__BRIDGE_VLANDB_DUMP_MAX - 1) 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun /* flags used in BRIDGE_VLANDB_DUMP_FLAGS attribute to affect dumps */ 356*4882a593Smuzhiyun #define BRIDGE_VLANDB_DUMPF_STATS (1 << 0) /* Include stats in the dump */ 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun /* Bridge vlan RTM attributes 359*4882a593Smuzhiyun * [BRIDGE_VLANDB_ENTRY] = { 360*4882a593Smuzhiyun * [BRIDGE_VLANDB_ENTRY_INFO] 361*4882a593Smuzhiyun * ... 362*4882a593Smuzhiyun * } 363*4882a593Smuzhiyun */ 364*4882a593Smuzhiyun enum { 365*4882a593Smuzhiyun BRIDGE_VLANDB_UNSPEC, 366*4882a593Smuzhiyun BRIDGE_VLANDB_ENTRY, 367*4882a593Smuzhiyun __BRIDGE_VLANDB_MAX, 368*4882a593Smuzhiyun }; 369*4882a593Smuzhiyun #define BRIDGE_VLANDB_MAX (__BRIDGE_VLANDB_MAX - 1) 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun enum { 372*4882a593Smuzhiyun BRIDGE_VLANDB_ENTRY_UNSPEC, 373*4882a593Smuzhiyun BRIDGE_VLANDB_ENTRY_INFO, 374*4882a593Smuzhiyun BRIDGE_VLANDB_ENTRY_RANGE, 375*4882a593Smuzhiyun BRIDGE_VLANDB_ENTRY_STATE, 376*4882a593Smuzhiyun BRIDGE_VLANDB_ENTRY_TUNNEL_INFO, 377*4882a593Smuzhiyun BRIDGE_VLANDB_ENTRY_STATS, 378*4882a593Smuzhiyun __BRIDGE_VLANDB_ENTRY_MAX, 379*4882a593Smuzhiyun }; 380*4882a593Smuzhiyun #define BRIDGE_VLANDB_ENTRY_MAX (__BRIDGE_VLANDB_ENTRY_MAX - 1) 381*4882a593Smuzhiyun 382*4882a593Smuzhiyun /* [BRIDGE_VLANDB_ENTRY] = { 383*4882a593Smuzhiyun * [BRIDGE_VLANDB_ENTRY_TUNNEL_INFO] = { 384*4882a593Smuzhiyun * [BRIDGE_VLANDB_TINFO_ID] 385*4882a593Smuzhiyun * ... 386*4882a593Smuzhiyun * } 387*4882a593Smuzhiyun * } 388*4882a593Smuzhiyun */ 389*4882a593Smuzhiyun enum { 390*4882a593Smuzhiyun BRIDGE_VLANDB_TINFO_UNSPEC, 391*4882a593Smuzhiyun BRIDGE_VLANDB_TINFO_ID, 392*4882a593Smuzhiyun BRIDGE_VLANDB_TINFO_CMD, 393*4882a593Smuzhiyun __BRIDGE_VLANDB_TINFO_MAX, 394*4882a593Smuzhiyun }; 395*4882a593Smuzhiyun #define BRIDGE_VLANDB_TINFO_MAX (__BRIDGE_VLANDB_TINFO_MAX - 1) 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun /* [BRIDGE_VLANDB_ENTRY] = { 398*4882a593Smuzhiyun * [BRIDGE_VLANDB_ENTRY_STATS] = { 399*4882a593Smuzhiyun * [BRIDGE_VLANDB_STATS_RX_BYTES] 400*4882a593Smuzhiyun * ... 401*4882a593Smuzhiyun * } 402*4882a593Smuzhiyun * ... 403*4882a593Smuzhiyun * } 404*4882a593Smuzhiyun */ 405*4882a593Smuzhiyun enum { 406*4882a593Smuzhiyun BRIDGE_VLANDB_STATS_UNSPEC, 407*4882a593Smuzhiyun BRIDGE_VLANDB_STATS_RX_BYTES, 408*4882a593Smuzhiyun BRIDGE_VLANDB_STATS_RX_PACKETS, 409*4882a593Smuzhiyun BRIDGE_VLANDB_STATS_TX_BYTES, 410*4882a593Smuzhiyun BRIDGE_VLANDB_STATS_TX_PACKETS, 411*4882a593Smuzhiyun BRIDGE_VLANDB_STATS_PAD, 412*4882a593Smuzhiyun __BRIDGE_VLANDB_STATS_MAX, 413*4882a593Smuzhiyun }; 414*4882a593Smuzhiyun #define BRIDGE_VLANDB_STATS_MAX (__BRIDGE_VLANDB_STATS_MAX - 1) 415*4882a593Smuzhiyun 416*4882a593Smuzhiyun /* Bridge multicast database attributes 417*4882a593Smuzhiyun * [MDBA_MDB] = { 418*4882a593Smuzhiyun * [MDBA_MDB_ENTRY] = { 419*4882a593Smuzhiyun * [MDBA_MDB_ENTRY_INFO] { 420*4882a593Smuzhiyun * struct br_mdb_entry 421*4882a593Smuzhiyun * [MDBA_MDB_EATTR attributes] 422*4882a593Smuzhiyun * } 423*4882a593Smuzhiyun * } 424*4882a593Smuzhiyun * } 425*4882a593Smuzhiyun * [MDBA_ROUTER] = { 426*4882a593Smuzhiyun * [MDBA_ROUTER_PORT] = { 427*4882a593Smuzhiyun * u32 ifindex 428*4882a593Smuzhiyun * [MDBA_ROUTER_PATTR attributes] 429*4882a593Smuzhiyun * } 430*4882a593Smuzhiyun * } 431*4882a593Smuzhiyun */ 432*4882a593Smuzhiyun enum { 433*4882a593Smuzhiyun MDBA_UNSPEC, 434*4882a593Smuzhiyun MDBA_MDB, 435*4882a593Smuzhiyun MDBA_ROUTER, 436*4882a593Smuzhiyun __MDBA_MAX, 437*4882a593Smuzhiyun }; 438*4882a593Smuzhiyun #define MDBA_MAX (__MDBA_MAX - 1) 439*4882a593Smuzhiyun 440*4882a593Smuzhiyun enum { 441*4882a593Smuzhiyun MDBA_MDB_UNSPEC, 442*4882a593Smuzhiyun MDBA_MDB_ENTRY, 443*4882a593Smuzhiyun __MDBA_MDB_MAX, 444*4882a593Smuzhiyun }; 445*4882a593Smuzhiyun #define MDBA_MDB_MAX (__MDBA_MDB_MAX - 1) 446*4882a593Smuzhiyun 447*4882a593Smuzhiyun enum { 448*4882a593Smuzhiyun MDBA_MDB_ENTRY_UNSPEC, 449*4882a593Smuzhiyun MDBA_MDB_ENTRY_INFO, 450*4882a593Smuzhiyun __MDBA_MDB_ENTRY_MAX, 451*4882a593Smuzhiyun }; 452*4882a593Smuzhiyun #define MDBA_MDB_ENTRY_MAX (__MDBA_MDB_ENTRY_MAX - 1) 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun /* per mdb entry additional attributes */ 455*4882a593Smuzhiyun enum { 456*4882a593Smuzhiyun MDBA_MDB_EATTR_UNSPEC, 457*4882a593Smuzhiyun MDBA_MDB_EATTR_TIMER, 458*4882a593Smuzhiyun MDBA_MDB_EATTR_SRC_LIST, 459*4882a593Smuzhiyun MDBA_MDB_EATTR_GROUP_MODE, 460*4882a593Smuzhiyun MDBA_MDB_EATTR_SOURCE, 461*4882a593Smuzhiyun MDBA_MDB_EATTR_RTPROT, 462*4882a593Smuzhiyun __MDBA_MDB_EATTR_MAX 463*4882a593Smuzhiyun }; 464*4882a593Smuzhiyun #define MDBA_MDB_EATTR_MAX (__MDBA_MDB_EATTR_MAX - 1) 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun /* per mdb entry source */ 467*4882a593Smuzhiyun enum { 468*4882a593Smuzhiyun MDBA_MDB_SRCLIST_UNSPEC, 469*4882a593Smuzhiyun MDBA_MDB_SRCLIST_ENTRY, 470*4882a593Smuzhiyun __MDBA_MDB_SRCLIST_MAX 471*4882a593Smuzhiyun }; 472*4882a593Smuzhiyun #define MDBA_MDB_SRCLIST_MAX (__MDBA_MDB_SRCLIST_MAX - 1) 473*4882a593Smuzhiyun 474*4882a593Smuzhiyun /* per mdb entry per source attributes 475*4882a593Smuzhiyun * these are embedded in MDBA_MDB_SRCLIST_ENTRY 476*4882a593Smuzhiyun */ 477*4882a593Smuzhiyun enum { 478*4882a593Smuzhiyun MDBA_MDB_SRCATTR_UNSPEC, 479*4882a593Smuzhiyun MDBA_MDB_SRCATTR_ADDRESS, 480*4882a593Smuzhiyun MDBA_MDB_SRCATTR_TIMER, 481*4882a593Smuzhiyun __MDBA_MDB_SRCATTR_MAX 482*4882a593Smuzhiyun }; 483*4882a593Smuzhiyun #define MDBA_MDB_SRCATTR_MAX (__MDBA_MDB_SRCATTR_MAX - 1) 484*4882a593Smuzhiyun 485*4882a593Smuzhiyun /* multicast router types */ 486*4882a593Smuzhiyun enum { 487*4882a593Smuzhiyun MDB_RTR_TYPE_DISABLED, 488*4882a593Smuzhiyun MDB_RTR_TYPE_TEMP_QUERY, 489*4882a593Smuzhiyun MDB_RTR_TYPE_PERM, 490*4882a593Smuzhiyun MDB_RTR_TYPE_TEMP 491*4882a593Smuzhiyun }; 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun enum { 494*4882a593Smuzhiyun MDBA_ROUTER_UNSPEC, 495*4882a593Smuzhiyun MDBA_ROUTER_PORT, 496*4882a593Smuzhiyun __MDBA_ROUTER_MAX, 497*4882a593Smuzhiyun }; 498*4882a593Smuzhiyun #define MDBA_ROUTER_MAX (__MDBA_ROUTER_MAX - 1) 499*4882a593Smuzhiyun 500*4882a593Smuzhiyun /* router port attributes */ 501*4882a593Smuzhiyun enum { 502*4882a593Smuzhiyun MDBA_ROUTER_PATTR_UNSPEC, 503*4882a593Smuzhiyun MDBA_ROUTER_PATTR_TIMER, 504*4882a593Smuzhiyun MDBA_ROUTER_PATTR_TYPE, 505*4882a593Smuzhiyun __MDBA_ROUTER_PATTR_MAX 506*4882a593Smuzhiyun }; 507*4882a593Smuzhiyun #define MDBA_ROUTER_PATTR_MAX (__MDBA_ROUTER_PATTR_MAX - 1) 508*4882a593Smuzhiyun 509*4882a593Smuzhiyun struct br_port_msg { 510*4882a593Smuzhiyun __u8 family; 511*4882a593Smuzhiyun __u32 ifindex; 512*4882a593Smuzhiyun }; 513*4882a593Smuzhiyun 514*4882a593Smuzhiyun struct br_mdb_entry { 515*4882a593Smuzhiyun __u32 ifindex; 516*4882a593Smuzhiyun #define MDB_TEMPORARY 0 517*4882a593Smuzhiyun #define MDB_PERMANENT 1 518*4882a593Smuzhiyun __u8 state; 519*4882a593Smuzhiyun #define MDB_FLAGS_OFFLOAD (1 << 0) 520*4882a593Smuzhiyun #define MDB_FLAGS_FAST_LEAVE (1 << 1) 521*4882a593Smuzhiyun #define MDB_FLAGS_STAR_EXCL (1 << 2) 522*4882a593Smuzhiyun #define MDB_FLAGS_BLOCKED (1 << 3) 523*4882a593Smuzhiyun __u8 flags; 524*4882a593Smuzhiyun __u16 vid; 525*4882a593Smuzhiyun struct { 526*4882a593Smuzhiyun union { 527*4882a593Smuzhiyun __be32 ip4; 528*4882a593Smuzhiyun struct in6_addr ip6; 529*4882a593Smuzhiyun } u; 530*4882a593Smuzhiyun __be16 proto; 531*4882a593Smuzhiyun } addr; 532*4882a593Smuzhiyun }; 533*4882a593Smuzhiyun 534*4882a593Smuzhiyun enum { 535*4882a593Smuzhiyun MDBA_SET_ENTRY_UNSPEC, 536*4882a593Smuzhiyun MDBA_SET_ENTRY, 537*4882a593Smuzhiyun MDBA_SET_ENTRY_ATTRS, 538*4882a593Smuzhiyun __MDBA_SET_ENTRY_MAX, 539*4882a593Smuzhiyun }; 540*4882a593Smuzhiyun #define MDBA_SET_ENTRY_MAX (__MDBA_SET_ENTRY_MAX - 1) 541*4882a593Smuzhiyun 542*4882a593Smuzhiyun /* [MDBA_SET_ENTRY_ATTRS] = { 543*4882a593Smuzhiyun * [MDBE_ATTR_xxx] 544*4882a593Smuzhiyun * ... 545*4882a593Smuzhiyun * } 546*4882a593Smuzhiyun */ 547*4882a593Smuzhiyun enum { 548*4882a593Smuzhiyun MDBE_ATTR_UNSPEC, 549*4882a593Smuzhiyun MDBE_ATTR_SOURCE, 550*4882a593Smuzhiyun __MDBE_ATTR_MAX, 551*4882a593Smuzhiyun }; 552*4882a593Smuzhiyun #define MDBE_ATTR_MAX (__MDBE_ATTR_MAX - 1) 553*4882a593Smuzhiyun 554*4882a593Smuzhiyun /* Embedded inside LINK_XSTATS_TYPE_BRIDGE */ 555*4882a593Smuzhiyun enum { 556*4882a593Smuzhiyun BRIDGE_XSTATS_UNSPEC, 557*4882a593Smuzhiyun BRIDGE_XSTATS_VLAN, 558*4882a593Smuzhiyun BRIDGE_XSTATS_MCAST, 559*4882a593Smuzhiyun BRIDGE_XSTATS_PAD, 560*4882a593Smuzhiyun BRIDGE_XSTATS_STP, 561*4882a593Smuzhiyun __BRIDGE_XSTATS_MAX 562*4882a593Smuzhiyun }; 563*4882a593Smuzhiyun #define BRIDGE_XSTATS_MAX (__BRIDGE_XSTATS_MAX - 1) 564*4882a593Smuzhiyun 565*4882a593Smuzhiyun enum { 566*4882a593Smuzhiyun BR_MCAST_DIR_RX, 567*4882a593Smuzhiyun BR_MCAST_DIR_TX, 568*4882a593Smuzhiyun BR_MCAST_DIR_SIZE 569*4882a593Smuzhiyun }; 570*4882a593Smuzhiyun 571*4882a593Smuzhiyun /* IGMP/MLD statistics */ 572*4882a593Smuzhiyun struct br_mcast_stats { 573*4882a593Smuzhiyun __u64 igmp_v1queries[BR_MCAST_DIR_SIZE]; 574*4882a593Smuzhiyun __u64 igmp_v2queries[BR_MCAST_DIR_SIZE]; 575*4882a593Smuzhiyun __u64 igmp_v3queries[BR_MCAST_DIR_SIZE]; 576*4882a593Smuzhiyun __u64 igmp_leaves[BR_MCAST_DIR_SIZE]; 577*4882a593Smuzhiyun __u64 igmp_v1reports[BR_MCAST_DIR_SIZE]; 578*4882a593Smuzhiyun __u64 igmp_v2reports[BR_MCAST_DIR_SIZE]; 579*4882a593Smuzhiyun __u64 igmp_v3reports[BR_MCAST_DIR_SIZE]; 580*4882a593Smuzhiyun __u64 igmp_parse_errors; 581*4882a593Smuzhiyun 582*4882a593Smuzhiyun __u64 mld_v1queries[BR_MCAST_DIR_SIZE]; 583*4882a593Smuzhiyun __u64 mld_v2queries[BR_MCAST_DIR_SIZE]; 584*4882a593Smuzhiyun __u64 mld_leaves[BR_MCAST_DIR_SIZE]; 585*4882a593Smuzhiyun __u64 mld_v1reports[BR_MCAST_DIR_SIZE]; 586*4882a593Smuzhiyun __u64 mld_v2reports[BR_MCAST_DIR_SIZE]; 587*4882a593Smuzhiyun __u64 mld_parse_errors; 588*4882a593Smuzhiyun 589*4882a593Smuzhiyun __u64 mcast_bytes[BR_MCAST_DIR_SIZE]; 590*4882a593Smuzhiyun __u64 mcast_packets[BR_MCAST_DIR_SIZE]; 591*4882a593Smuzhiyun }; 592*4882a593Smuzhiyun 593*4882a593Smuzhiyun /* bridge boolean options 594*4882a593Smuzhiyun * BR_BOOLOPT_NO_LL_LEARN - disable learning from link-local packets 595*4882a593Smuzhiyun * 596*4882a593Smuzhiyun * IMPORTANT: if adding a new option do not forget to handle 597*4882a593Smuzhiyun * it in br_boolopt_toggle/get and bridge sysfs 598*4882a593Smuzhiyun */ 599*4882a593Smuzhiyun enum br_boolopt_id { 600*4882a593Smuzhiyun BR_BOOLOPT_NO_LL_LEARN, 601*4882a593Smuzhiyun BR_BOOLOPT_MAX 602*4882a593Smuzhiyun }; 603*4882a593Smuzhiyun 604*4882a593Smuzhiyun /* struct br_boolopt_multi - change multiple bridge boolean options 605*4882a593Smuzhiyun * 606*4882a593Smuzhiyun * @optval: new option values (bit per option) 607*4882a593Smuzhiyun * @optmask: options to change (bit per option) 608*4882a593Smuzhiyun */ 609*4882a593Smuzhiyun struct br_boolopt_multi { 610*4882a593Smuzhiyun __u32 optval; 611*4882a593Smuzhiyun __u32 optmask; 612*4882a593Smuzhiyun }; 613*4882a593Smuzhiyun #endif /* _UAPI_LINUX_IF_BRIDGE_H */ 614