1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * Linux ethernet bridge |
4 | * |
5 | * Authors: |
6 | * Lennert Buytenhek <buytenh@gnu.org> |
7 | */ |
8 | #ifndef _LINUX_IF_BRIDGE_H |
9 | #define _LINUX_IF_BRIDGE_H |
10 | |
11 | |
12 | #include <linux/netdevice.h> |
13 | #include <uapi/linux/if_bridge.h> |
14 | #include <linux/bitops.h> |
15 | |
16 | struct br_ip { |
17 | union { |
18 | __be32 ip4; |
19 | #if IS_ENABLED(CONFIG_IPV6) |
20 | struct in6_addr ip6; |
21 | #endif |
22 | } src; |
23 | union { |
24 | __be32 ip4; |
25 | #if IS_ENABLED(CONFIG_IPV6) |
26 | struct in6_addr ip6; |
27 | #endif |
28 | unsigned char mac_addr[ETH_ALEN]; |
29 | } dst; |
30 | __be16 proto; |
31 | __u16 vid; |
32 | }; |
33 | |
34 | struct br_ip_list { |
35 | struct list_head list; |
36 | struct br_ip addr; |
37 | }; |
38 | |
39 | #define BR_HAIRPIN_MODE BIT(0) |
40 | #define BR_BPDU_GUARD BIT(1) |
41 | #define BR_ROOT_BLOCK BIT(2) |
42 | #define BR_MULTICAST_FAST_LEAVE BIT(3) |
43 | #define BR_ADMIN_COST BIT(4) |
44 | #define BR_LEARNING BIT(5) |
45 | #define BR_FLOOD BIT(6) |
46 | #define BR_AUTO_MASK (BR_FLOOD | BR_LEARNING) |
47 | #define BR_PROMISC BIT(7) |
48 | #define BR_PROXYARP BIT(8) |
49 | #define BR_LEARNING_SYNC BIT(9) |
50 | #define BR_PROXYARP_WIFI BIT(10) |
51 | #define BR_MCAST_FLOOD BIT(11) |
52 | #define BR_MULTICAST_TO_UNICAST BIT(12) |
53 | #define BR_VLAN_TUNNEL BIT(13) |
54 | #define BR_BCAST_FLOOD BIT(14) |
55 | #define BR_NEIGH_SUPPRESS BIT(15) |
56 | #define BR_ISOLATED BIT(16) |
57 | #define BR_MRP_AWARE BIT(17) |
58 | #define BR_MRP_LOST_CONT BIT(18) |
59 | #define BR_MRP_LOST_IN_CONT BIT(19) |
60 | #define BR_TX_FWD_OFFLOAD BIT(20) |
61 | #define BR_PORT_LOCKED BIT(21) |
62 | #define BR_PORT_MAB BIT(22) |
63 | #define BR_NEIGH_VLAN_SUPPRESS BIT(23) |
64 | |
65 | #define BR_DEFAULT_AGEING_TIME (300 * HZ) |
66 | |
67 | struct net_bridge; |
68 | void brioctl_set(int (*hook)(struct net *net, struct net_bridge *br, |
69 | unsigned int cmd, struct ifreq *ifr, |
70 | void __user *uarg)); |
71 | int br_ioctl_call(struct net *net, struct net_bridge *br, unsigned int cmd, |
72 | struct ifreq *ifr, void __user *uarg); |
73 | |
74 | #if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_IGMP_SNOOPING) |
75 | int br_multicast_list_adjacent(struct net_device *dev, |
76 | struct list_head *br_ip_list); |
77 | bool br_multicast_has_querier_anywhere(struct net_device *dev, int proto); |
78 | bool br_multicast_has_querier_adjacent(struct net_device *dev, int proto); |
79 | bool br_multicast_has_router_adjacent(struct net_device *dev, int proto); |
80 | bool br_multicast_enabled(const struct net_device *dev); |
81 | bool br_multicast_router(const struct net_device *dev); |
82 | #else |
83 | static inline int br_multicast_list_adjacent(struct net_device *dev, |
84 | struct list_head *br_ip_list) |
85 | { |
86 | return 0; |
87 | } |
88 | static inline bool br_multicast_has_querier_anywhere(struct net_device *dev, |
89 | int proto) |
90 | { |
91 | return false; |
92 | } |
93 | static inline bool br_multicast_has_querier_adjacent(struct net_device *dev, |
94 | int proto) |
95 | { |
96 | return false; |
97 | } |
98 | |
99 | static inline bool br_multicast_has_router_adjacent(struct net_device *dev, |
100 | int proto) |
101 | { |
102 | return true; |
103 | } |
104 | |
105 | static inline bool br_multicast_enabled(const struct net_device *dev) |
106 | { |
107 | return false; |
108 | } |
109 | static inline bool br_multicast_router(const struct net_device *dev) |
110 | { |
111 | return false; |
112 | } |
113 | #endif |
114 | |
115 | #if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_VLAN_FILTERING) |
116 | bool br_vlan_enabled(const struct net_device *dev); |
117 | int br_vlan_get_pvid(const struct net_device *dev, u16 *p_pvid); |
118 | int br_vlan_get_pvid_rcu(const struct net_device *dev, u16 *p_pvid); |
119 | int br_vlan_get_proto(const struct net_device *dev, u16 *p_proto); |
120 | int br_vlan_get_info(const struct net_device *dev, u16 vid, |
121 | struct bridge_vlan_info *p_vinfo); |
122 | int br_vlan_get_info_rcu(const struct net_device *dev, u16 vid, |
123 | struct bridge_vlan_info *p_vinfo); |
124 | bool br_mst_enabled(const struct net_device *dev); |
125 | int br_mst_get_info(const struct net_device *dev, u16 msti, unsigned long *vids); |
126 | int br_mst_get_state(const struct net_device *dev, u16 msti, u8 *state); |
127 | #else |
128 | static inline bool br_vlan_enabled(const struct net_device *dev) |
129 | { |
130 | return false; |
131 | } |
132 | |
133 | static inline int br_vlan_get_pvid(const struct net_device *dev, u16 *p_pvid) |
134 | { |
135 | return -EINVAL; |
136 | } |
137 | |
138 | static inline int br_vlan_get_proto(const struct net_device *dev, u16 *p_proto) |
139 | { |
140 | return -EINVAL; |
141 | } |
142 | |
143 | static inline int br_vlan_get_pvid_rcu(const struct net_device *dev, u16 *p_pvid) |
144 | { |
145 | return -EINVAL; |
146 | } |
147 | |
148 | static inline int br_vlan_get_info(const struct net_device *dev, u16 vid, |
149 | struct bridge_vlan_info *p_vinfo) |
150 | { |
151 | return -EINVAL; |
152 | } |
153 | |
154 | static inline int br_vlan_get_info_rcu(const struct net_device *dev, u16 vid, |
155 | struct bridge_vlan_info *p_vinfo) |
156 | { |
157 | return -EINVAL; |
158 | } |
159 | |
160 | static inline bool br_mst_enabled(const struct net_device *dev) |
161 | { |
162 | return false; |
163 | } |
164 | |
165 | static inline int br_mst_get_info(const struct net_device *dev, u16 msti, |
166 | unsigned long *vids) |
167 | { |
168 | return -EINVAL; |
169 | } |
170 | static inline int br_mst_get_state(const struct net_device *dev, u16 msti, |
171 | u8 *state) |
172 | { |
173 | return -EINVAL; |
174 | } |
175 | #endif |
176 | |
177 | #if IS_ENABLED(CONFIG_BRIDGE) |
178 | struct net_device *br_fdb_find_port(const struct net_device *br_dev, |
179 | const unsigned char *addr, |
180 | __u16 vid); |
181 | void br_fdb_clear_offload(const struct net_device *dev, u16 vid); |
182 | bool br_port_flag_is_set(const struct net_device *dev, unsigned long flag); |
183 | u8 br_port_get_stp_state(const struct net_device *dev); |
184 | clock_t br_get_ageing_time(const struct net_device *br_dev); |
185 | #else |
186 | static inline struct net_device * |
187 | br_fdb_find_port(const struct net_device *br_dev, |
188 | const unsigned char *addr, |
189 | __u16 vid) |
190 | { |
191 | return NULL; |
192 | } |
193 | |
194 | static inline void br_fdb_clear_offload(const struct net_device *dev, u16 vid) |
195 | { |
196 | } |
197 | |
198 | static inline bool |
199 | br_port_flag_is_set(const struct net_device *dev, unsigned long flag) |
200 | { |
201 | return false; |
202 | } |
203 | |
204 | static inline u8 br_port_get_stp_state(const struct net_device *dev) |
205 | { |
206 | return BR_STATE_DISABLED; |
207 | } |
208 | |
209 | static inline clock_t br_get_ageing_time(const struct net_device *br_dev) |
210 | { |
211 | return 0; |
212 | } |
213 | #endif |
214 | |
215 | #endif |
216 | |