xref: /linux-6.15/include/uapi/linux/if_bridge.h (revision 61ba1a2d)
1607ca46eSDavid Howells /*
2607ca46eSDavid Howells  *	Linux ethernet bridge
3607ca46eSDavid Howells  *
4607ca46eSDavid Howells  *	Authors:
5607ca46eSDavid Howells  *	Lennert Buytenhek		<[email protected]>
6607ca46eSDavid Howells  *
7607ca46eSDavid Howells  *	This program is free software; you can redistribute it and/or
8607ca46eSDavid Howells  *	modify it under the terms of the GNU General Public License
9607ca46eSDavid Howells  *	as published by the Free Software Foundation; either version
10607ca46eSDavid Howells  *	2 of the License, or (at your option) any later version.
11607ca46eSDavid Howells  */
12607ca46eSDavid Howells 
13607ca46eSDavid Howells #ifndef _UAPI_LINUX_IF_BRIDGE_H
14607ca46eSDavid Howells #define _UAPI_LINUX_IF_BRIDGE_H
15607ca46eSDavid Howells 
16607ca46eSDavid Howells #include <linux/types.h>
17e216975aSJoe Perches #include <linux/if_ether.h>
1866f1c448SGregory Fong #include <linux/in6.h>
19607ca46eSDavid Howells 
20607ca46eSDavid Howells #define SYSFS_BRIDGE_ATTR	"bridge"
21607ca46eSDavid Howells #define SYSFS_BRIDGE_FDB	"brforward"
22607ca46eSDavid Howells #define SYSFS_BRIDGE_PORT_SUBDIR "brif"
23607ca46eSDavid Howells #define SYSFS_BRIDGE_PORT_ATTR	"brport"
24607ca46eSDavid Howells #define SYSFS_BRIDGE_PORT_LINK	"bridge"
25607ca46eSDavid Howells 
26607ca46eSDavid Howells #define BRCTL_VERSION 1
27607ca46eSDavid Howells 
28607ca46eSDavid Howells #define BRCTL_GET_VERSION 0
29607ca46eSDavid Howells #define BRCTL_GET_BRIDGES 1
30607ca46eSDavid Howells #define BRCTL_ADD_BRIDGE 2
31607ca46eSDavid Howells #define BRCTL_DEL_BRIDGE 3
32607ca46eSDavid Howells #define BRCTL_ADD_IF 4
33607ca46eSDavid Howells #define BRCTL_DEL_IF 5
34607ca46eSDavid Howells #define BRCTL_GET_BRIDGE_INFO 6
35607ca46eSDavid Howells #define BRCTL_GET_PORT_LIST 7
36607ca46eSDavid Howells #define BRCTL_SET_BRIDGE_FORWARD_DELAY 8
37607ca46eSDavid Howells #define BRCTL_SET_BRIDGE_HELLO_TIME 9
38607ca46eSDavid Howells #define BRCTL_SET_BRIDGE_MAX_AGE 10
39607ca46eSDavid Howells #define BRCTL_SET_AGEING_TIME 11
40607ca46eSDavid Howells #define BRCTL_SET_GC_INTERVAL 12
41607ca46eSDavid Howells #define BRCTL_GET_PORT_INFO 13
42607ca46eSDavid Howells #define BRCTL_SET_BRIDGE_STP_STATE 14
43607ca46eSDavid Howells #define BRCTL_SET_BRIDGE_PRIORITY 15
44607ca46eSDavid Howells #define BRCTL_SET_PORT_PRIORITY 16
45607ca46eSDavid Howells #define BRCTL_SET_PATH_COST 17
46607ca46eSDavid Howells #define BRCTL_GET_FDB_ENTRIES 18
47607ca46eSDavid Howells 
48607ca46eSDavid Howells #define BR_STATE_DISABLED 0
49607ca46eSDavid Howells #define BR_STATE_LISTENING 1
50607ca46eSDavid Howells #define BR_STATE_LEARNING 2
51607ca46eSDavid Howells #define BR_STATE_FORWARDING 3
52607ca46eSDavid Howells #define BR_STATE_BLOCKING 4
53607ca46eSDavid Howells 
54607ca46eSDavid Howells struct __bridge_info {
55607ca46eSDavid Howells 	__u64 designated_root;
56607ca46eSDavid Howells 	__u64 bridge_id;
57607ca46eSDavid Howells 	__u32 root_path_cost;
58607ca46eSDavid Howells 	__u32 max_age;
59607ca46eSDavid Howells 	__u32 hello_time;
60607ca46eSDavid Howells 	__u32 forward_delay;
61607ca46eSDavid Howells 	__u32 bridge_max_age;
62607ca46eSDavid Howells 	__u32 bridge_hello_time;
63607ca46eSDavid Howells 	__u32 bridge_forward_delay;
64607ca46eSDavid Howells 	__u8 topology_change;
65607ca46eSDavid Howells 	__u8 topology_change_detected;
66607ca46eSDavid Howells 	__u8 root_port;
67607ca46eSDavid Howells 	__u8 stp_enabled;
68607ca46eSDavid Howells 	__u32 ageing_time;
69607ca46eSDavid Howells 	__u32 gc_interval;
70607ca46eSDavid Howells 	__u32 hello_timer_value;
71607ca46eSDavid Howells 	__u32 tcn_timer_value;
72607ca46eSDavid Howells 	__u32 topology_change_timer_value;
73607ca46eSDavid Howells 	__u32 gc_timer_value;
74607ca46eSDavid Howells };
75607ca46eSDavid Howells 
76607ca46eSDavid Howells struct __port_info {
77607ca46eSDavid Howells 	__u64 designated_root;
78607ca46eSDavid Howells 	__u64 designated_bridge;
79607ca46eSDavid Howells 	__u16 port_id;
80607ca46eSDavid Howells 	__u16 designated_port;
81607ca46eSDavid Howells 	__u32 path_cost;
82607ca46eSDavid Howells 	__u32 designated_cost;
83607ca46eSDavid Howells 	__u8 state;
84607ca46eSDavid Howells 	__u8 top_change_ack;
85607ca46eSDavid Howells 	__u8 config_pending;
86607ca46eSDavid Howells 	__u8 unused0;
87607ca46eSDavid Howells 	__u32 message_age_timer_value;
88607ca46eSDavid Howells 	__u32 forward_delay_timer_value;
89607ca46eSDavid Howells 	__u32 hold_timer_value;
90607ca46eSDavid Howells };
91607ca46eSDavid Howells 
92607ca46eSDavid Howells struct __fdb_entry {
93e216975aSJoe Perches 	__u8 mac_addr[ETH_ALEN];
94607ca46eSDavid Howells 	__u8 port_no;
95607ca46eSDavid Howells 	__u8 is_local;
96607ca46eSDavid Howells 	__u32 ageing_timer_value;
97607ca46eSDavid Howells 	__u8 port_hi;
98607ca46eSDavid Howells 	__u8 pad0;
99607ca46eSDavid Howells 	__u16 unused;
100607ca46eSDavid Howells };
101607ca46eSDavid Howells 
1022469ffd7SJohn Fastabend /* Bridge Flags */
1032469ffd7SJohn Fastabend #define BRIDGE_FLAGS_MASTER	1	/* Bridge command to/from master */
1042469ffd7SJohn Fastabend #define BRIDGE_FLAGS_SELF	2	/* Bridge command to/from lowerdev */
105607ca46eSDavid Howells 
1062469ffd7SJohn Fastabend #define BRIDGE_MODE_VEB		0	/* Default loopback mode */
1072469ffd7SJohn Fastabend #define BRIDGE_MODE_VEPA	1	/* 802.1Qbg defined VEPA mode */
108fc0bdbbcSRoopa Prabhu #define BRIDGE_MODE_UNDEF	0xFFFF  /* mode undefined */
1092469ffd7SJohn Fastabend 
1102469ffd7SJohn Fastabend /* Bridge management nested attributes
1112469ffd7SJohn Fastabend  * [IFLA_AF_SPEC] = {
1122469ffd7SJohn Fastabend  *     [IFLA_BRIDGE_FLAGS]
1132469ffd7SJohn Fastabend  *     [IFLA_BRIDGE_MODE]
114407af329SVlad Yasevich  *     [IFLA_BRIDGE_VLAN_INFO]
1152469ffd7SJohn Fastabend  * }
1162469ffd7SJohn Fastabend  */
1172469ffd7SJohn Fastabend enum {
1182469ffd7SJohn Fastabend 	IFLA_BRIDGE_FLAGS,
1192469ffd7SJohn Fastabend 	IFLA_BRIDGE_MODE,
120407af329SVlad Yasevich 	IFLA_BRIDGE_VLAN_INFO,
1212469ffd7SJohn Fastabend 	__IFLA_BRIDGE_MAX,
1222469ffd7SJohn Fastabend };
1232469ffd7SJohn Fastabend #define IFLA_BRIDGE_MAX (__IFLA_BRIDGE_MAX - 1)
124ee07c6e7SCong Wang 
125407af329SVlad Yasevich #define BRIDGE_VLAN_INFO_MASTER	(1<<0)	/* Operate on Bridge device as well */
126552406c4SVlad Yasevich #define BRIDGE_VLAN_INFO_PVID	(1<<1)	/* VLAN is PVID, ingress untagged */
12735e03f3aSVlad Yasevich #define BRIDGE_VLAN_INFO_UNTAGGED	(1<<2)	/* VLAN egresses untagged */
128bdced7efSRoopa Prabhu #define BRIDGE_VLAN_INFO_RANGE_BEGIN	(1<<3) /* VLAN is start of vlan range */
129bdced7efSRoopa Prabhu #define BRIDGE_VLAN_INFO_RANGE_END	(1<<4) /* VLAN is end of vlan range */
1302594e906SNikolay Aleksandrov #define BRIDGE_VLAN_INFO_BRENTRY	(1<<5) /* Global bridge VLAN entry */
131407af329SVlad Yasevich 
132407af329SVlad Yasevich struct bridge_vlan_info {
1339f89ec82SCong Wang 	__u16 flags;
1349f89ec82SCong Wang 	__u16 vid;
135407af329SVlad Yasevich };
136407af329SVlad Yasevich 
137a60c0903SNikolay Aleksandrov struct bridge_vlan_xstats {
138a60c0903SNikolay Aleksandrov 	__u64 rx_bytes;
139a60c0903SNikolay Aleksandrov 	__u64 rx_packets;
140a60c0903SNikolay Aleksandrov 	__u64 tx_bytes;
141a60c0903SNikolay Aleksandrov 	__u64 tx_packets;
142a60c0903SNikolay Aleksandrov 	__u16 vid;
143*61ba1a2dSNikolay Aleksandrov 	__u16 flags;
144a60c0903SNikolay Aleksandrov 	__u32 pad2;
145a60c0903SNikolay Aleksandrov };
146a60c0903SNikolay Aleksandrov 
147ee07c6e7SCong Wang /* Bridge multicast database attributes
148ee07c6e7SCong Wang  * [MDBA_MDB] = {
149ee07c6e7SCong Wang  *     [MDBA_MDB_ENTRY] = {
15021257156SNikolay Aleksandrov  *         [MDBA_MDB_ENTRY_INFO] {
15121257156SNikolay Aleksandrov  *		struct br_mdb_entry
15221257156SNikolay Aleksandrov  *		[MDBA_MDB_EATTR attributes]
15321257156SNikolay Aleksandrov  *         }
154ee07c6e7SCong Wang  *     }
155ee07c6e7SCong Wang  * }
156ee07c6e7SCong Wang  * [MDBA_ROUTER] = {
15759f78f9fSNikolay Aleksandrov  *    [MDBA_ROUTER_PORT] = {
15859f78f9fSNikolay Aleksandrov  *        u32 ifindex
15959f78f9fSNikolay Aleksandrov  *        [MDBA_ROUTER_PATTR attributes]
16059f78f9fSNikolay Aleksandrov  *    }
161ee07c6e7SCong Wang  * }
162ee07c6e7SCong Wang  */
163ee07c6e7SCong Wang enum {
164ee07c6e7SCong Wang 	MDBA_UNSPEC,
165ee07c6e7SCong Wang 	MDBA_MDB,
166ee07c6e7SCong Wang 	MDBA_ROUTER,
167ee07c6e7SCong Wang 	__MDBA_MAX,
168ee07c6e7SCong Wang };
169ee07c6e7SCong Wang #define MDBA_MAX (__MDBA_MAX - 1)
170ee07c6e7SCong Wang 
171ee07c6e7SCong Wang enum {
172ee07c6e7SCong Wang 	MDBA_MDB_UNSPEC,
173ee07c6e7SCong Wang 	MDBA_MDB_ENTRY,
174ee07c6e7SCong Wang 	__MDBA_MDB_MAX,
175ee07c6e7SCong Wang };
176ee07c6e7SCong Wang #define MDBA_MDB_MAX (__MDBA_MDB_MAX - 1)
177ee07c6e7SCong Wang 
178ee07c6e7SCong Wang enum {
179ee07c6e7SCong Wang 	MDBA_MDB_ENTRY_UNSPEC,
180ee07c6e7SCong Wang 	MDBA_MDB_ENTRY_INFO,
181ee07c6e7SCong Wang 	__MDBA_MDB_ENTRY_MAX,
182ee07c6e7SCong Wang };
183ee07c6e7SCong Wang #define MDBA_MDB_ENTRY_MAX (__MDBA_MDB_ENTRY_MAX - 1)
184ee07c6e7SCong Wang 
18521257156SNikolay Aleksandrov /* per mdb entry additional attributes */
18621257156SNikolay Aleksandrov enum {
18721257156SNikolay Aleksandrov 	MDBA_MDB_EATTR_UNSPEC,
18821257156SNikolay Aleksandrov 	MDBA_MDB_EATTR_TIMER,
18921257156SNikolay Aleksandrov 	__MDBA_MDB_EATTR_MAX
19021257156SNikolay Aleksandrov };
19121257156SNikolay Aleksandrov #define MDBA_MDB_EATTR_MAX (__MDBA_MDB_EATTR_MAX - 1)
19221257156SNikolay Aleksandrov 
1937f0aec7aSNikolay Aleksandrov /* multicast router types */
1947f0aec7aSNikolay Aleksandrov enum {
1957f0aec7aSNikolay Aleksandrov 	MDB_RTR_TYPE_DISABLED,
1967f0aec7aSNikolay Aleksandrov 	MDB_RTR_TYPE_TEMP_QUERY,
1977f0aec7aSNikolay Aleksandrov 	MDB_RTR_TYPE_PERM,
198a55d8246SNikolay Aleksandrov 	MDB_RTR_TYPE_TEMP
1997f0aec7aSNikolay Aleksandrov };
2007f0aec7aSNikolay Aleksandrov 
201ee07c6e7SCong Wang enum {
202ee07c6e7SCong Wang 	MDBA_ROUTER_UNSPEC,
203ee07c6e7SCong Wang 	MDBA_ROUTER_PORT,
204ee07c6e7SCong Wang 	__MDBA_ROUTER_MAX,
205ee07c6e7SCong Wang };
206ee07c6e7SCong Wang #define MDBA_ROUTER_MAX (__MDBA_ROUTER_MAX - 1)
207ee07c6e7SCong Wang 
20859f78f9fSNikolay Aleksandrov /* router port attributes */
20959f78f9fSNikolay Aleksandrov enum {
21059f78f9fSNikolay Aleksandrov 	MDBA_ROUTER_PATTR_UNSPEC,
21159f78f9fSNikolay Aleksandrov 	MDBA_ROUTER_PATTR_TIMER,
21259f78f9fSNikolay Aleksandrov 	MDBA_ROUTER_PATTR_TYPE,
21359f78f9fSNikolay Aleksandrov 	__MDBA_ROUTER_PATTR_MAX
21459f78f9fSNikolay Aleksandrov };
21559f78f9fSNikolay Aleksandrov #define MDBA_ROUTER_PATTR_MAX (__MDBA_ROUTER_PATTR_MAX - 1)
21659f78f9fSNikolay Aleksandrov 
217ee07c6e7SCong Wang struct br_port_msg {
218cfd56754SCong Wang 	__u8  family;
219ee07c6e7SCong Wang 	__u32 ifindex;
220ee07c6e7SCong Wang };
221ee07c6e7SCong Wang 
222ee07c6e7SCong Wang struct br_mdb_entry {
223ee07c6e7SCong Wang 	__u32 ifindex;
224ccb1c31aSAmerigo Wang #define MDB_TEMPORARY 0
225ccb1c31aSAmerigo Wang #define MDB_PERMANENT 1
226ccb1c31aSAmerigo Wang 	__u8 state;
227157ede67SElad Raz #define MDB_FLAGS_OFFLOAD	(1 << 0)
228157ede67SElad Raz 	__u8 flags;
22974fe61f1SNikolay Aleksandrov 	__u16 vid;
230ee07c6e7SCong Wang 	struct {
231ee07c6e7SCong Wang 		union {
232ee07c6e7SCong Wang 			__be32	ip4;
233ee07c6e7SCong Wang 			struct in6_addr ip6;
234ee07c6e7SCong Wang 		} u;
235ee07c6e7SCong Wang 		__be16		proto;
236ee07c6e7SCong Wang 	} addr;
237ee07c6e7SCong Wang };
238ee07c6e7SCong Wang 
239cfd56754SCong Wang enum {
240cfd56754SCong Wang 	MDBA_SET_ENTRY_UNSPEC,
241cfd56754SCong Wang 	MDBA_SET_ENTRY,
242cfd56754SCong Wang 	__MDBA_SET_ENTRY_MAX,
243cfd56754SCong Wang };
244cfd56754SCong Wang #define MDBA_SET_ENTRY_MAX (__MDBA_SET_ENTRY_MAX - 1)
245cfd56754SCong Wang 
246a60c0903SNikolay Aleksandrov /* Embedded inside LINK_XSTATS_TYPE_BRIDGE */
247a60c0903SNikolay Aleksandrov enum {
248a60c0903SNikolay Aleksandrov 	BRIDGE_XSTATS_UNSPEC,
249a60c0903SNikolay Aleksandrov 	BRIDGE_XSTATS_VLAN,
2501080ab95SNikolay Aleksandrov 	BRIDGE_XSTATS_MCAST,
2511080ab95SNikolay Aleksandrov 	BRIDGE_XSTATS_PAD,
252a60c0903SNikolay Aleksandrov 	__BRIDGE_XSTATS_MAX
253a60c0903SNikolay Aleksandrov };
254a60c0903SNikolay Aleksandrov #define BRIDGE_XSTATS_MAX (__BRIDGE_XSTATS_MAX - 1)
255a60c0903SNikolay Aleksandrov 
2561080ab95SNikolay Aleksandrov enum {
2571080ab95SNikolay Aleksandrov 	BR_MCAST_DIR_RX,
2581080ab95SNikolay Aleksandrov 	BR_MCAST_DIR_TX,
2591080ab95SNikolay Aleksandrov 	BR_MCAST_DIR_SIZE
2601080ab95SNikolay Aleksandrov };
2611080ab95SNikolay Aleksandrov 
2621080ab95SNikolay Aleksandrov /* IGMP/MLD statistics */
2631080ab95SNikolay Aleksandrov struct br_mcast_stats {
264a65056ecSNikolay Aleksandrov 	__u64 igmp_v1queries[BR_MCAST_DIR_SIZE];
265a65056ecSNikolay Aleksandrov 	__u64 igmp_v2queries[BR_MCAST_DIR_SIZE];
266a65056ecSNikolay Aleksandrov 	__u64 igmp_v3queries[BR_MCAST_DIR_SIZE];
2671080ab95SNikolay Aleksandrov 	__u64 igmp_leaves[BR_MCAST_DIR_SIZE];
2681080ab95SNikolay Aleksandrov 	__u64 igmp_v1reports[BR_MCAST_DIR_SIZE];
2691080ab95SNikolay Aleksandrov 	__u64 igmp_v2reports[BR_MCAST_DIR_SIZE];
2701080ab95SNikolay Aleksandrov 	__u64 igmp_v3reports[BR_MCAST_DIR_SIZE];
2711080ab95SNikolay Aleksandrov 	__u64 igmp_parse_errors;
2721080ab95SNikolay Aleksandrov 
273a65056ecSNikolay Aleksandrov 	__u64 mld_v1queries[BR_MCAST_DIR_SIZE];
274a65056ecSNikolay Aleksandrov 	__u64 mld_v2queries[BR_MCAST_DIR_SIZE];
2751080ab95SNikolay Aleksandrov 	__u64 mld_leaves[BR_MCAST_DIR_SIZE];
2761080ab95SNikolay Aleksandrov 	__u64 mld_v1reports[BR_MCAST_DIR_SIZE];
2771080ab95SNikolay Aleksandrov 	__u64 mld_v2reports[BR_MCAST_DIR_SIZE];
2781080ab95SNikolay Aleksandrov 	__u64 mld_parse_errors;
2791080ab95SNikolay Aleksandrov 
2801080ab95SNikolay Aleksandrov 	__u64 mcast_bytes[BR_MCAST_DIR_SIZE];
2811080ab95SNikolay Aleksandrov 	__u64 mcast_packets[BR_MCAST_DIR_SIZE];
2821080ab95SNikolay Aleksandrov };
283607ca46eSDavid Howells #endif /* _UAPI_LINUX_IF_BRIDGE_H */
284