Blame view

net/bridge/br_private.h 21.5 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
  /*
   *	Linux ethernet bridge
   *
   *	Authors:
   *	Lennert Buytenhek		<buytenh@gnu.org>
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
9
10
11
12
13
14
15
16
   *	This program is free software; you can redistribute it and/or
   *	modify it under the terms of the GNU General Public License
   *	as published by the Free Software Foundation; either version
   *	2 of the License, or (at your option) any later version.
   */
  
  #ifndef _BR_PRIVATE_H
  #define _BR_PRIVATE_H
  
  #include <linux/netdevice.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
  #include <linux/if_bridge.h>
91d2c34a4   Herbert Xu   bridge: Fix netpo...
18
  #include <linux/netpoll.h>
406818ff3   Eric Dumazet   bridge: 64bit rx/...
19
  #include <linux/u64_stats_sync.h>
4adf0af68   Simon Wunderlich   bridge: send corr...
20
  #include <net/route.h>
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
21
  #include <linux/if_vlan.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
23
24
25
26
27
28
29
  
  #define BR_HASH_BITS 8
  #define BR_HASH_SIZE (1 << BR_HASH_BITS)
  
  #define BR_HOLD_TIME (1*HZ)
  
  #define BR_PORT_BITS	10
  #define BR_MAX_PORTS	(1<<BR_PORT_BITS)
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
30
  #define BR_VLAN_BITMAP_LEN	BITS_TO_LONGS(VLAN_N_VID)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31

9cde07087   Stephen Hemminger   bridge: add suppo...
32
  #define BR_VERSION	"2.3"
515853cce   stephen hemminger   bridge: allow for...
33
34
35
36
  /* Control of forwarding link local multicast */
  #define BR_GROUPFWD_DEFAULT	0
  /* Don't allow forwarding control protocols like STP and LLDP */
  #define BR_GROUPFWD_RESTRICTED	0x4007u
9cde07087   Stephen Hemminger   bridge: add suppo...
37
38
  /* Path to usermode spanning tree program */
  #define BR_STP_PROG	"/sbin/bridge-stp"
8cbb512e5   Stephen Hemminger   [BRIDGE]: add ver...
39

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  typedef struct bridge_id bridge_id;
  typedef struct mac_addr mac_addr;
  typedef __u16 port_id;
  
  struct bridge_id
  {
  	unsigned char	prio[2];
  	unsigned char	addr[6];
  };
  
  struct mac_addr
  {
  	unsigned char	addr[6];
  };
8ef2a9a59   YOSHIFUJI Hideaki   bridge br_multica...
54
55
56
57
  struct br_ip
  {
  	union {
  		__be32	ip4;
dfd56b8b3   Eric Dumazet   net: use IS_ENABL...
58
  #if IS_ENABLED(CONFIG_IPV6)
08b202b67   YOSHIFUJI Hideaki   bridge br_multica...
59
60
  		struct in6_addr ip6;
  #endif
8ef2a9a59   YOSHIFUJI Hideaki   bridge br_multica...
61
62
  	} u;
  	__be16		proto;
b0e9a30dd   Vlad Yasevich   bridge: Add vlan ...
63
  	__u16		vid;
8ef2a9a59   YOSHIFUJI Hideaki   bridge br_multica...
64
  };
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
65
66
  struct net_port_vlans {
  	u16				port_idx;
788519886   Vlad Yasevich   bridge: Implement...
67
  	u16				pvid;
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
68
69
70
71
72
73
  	union {
  		struct net_bridge_port		*port;
  		struct net_bridge		*br;
  	}				parent;
  	struct rcu_head			rcu;
  	unsigned long			vlan_bitmap[BR_VLAN_BITMAP_LEN];
35e03f3a0   Vlad Yasevich   bridge: Separate ...
74
  	unsigned long			untagged_bitmap[BR_VLAN_BITMAP_LEN];
6cbdceeb1   Vlad Yasevich   bridge: Dump vlan...
75
  	u16				num_vlans;
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
76
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77
78
79
80
81
82
  struct net_bridge_fdb_entry
  {
  	struct hlist_node		hlist;
  	struct net_bridge_port		*dst;
  
  	struct rcu_head			rcu;
7cd8861ab   stephen hemminger   bridge: track las...
83
84
  	unsigned long			updated;
  	unsigned long			used;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
86
87
  	mac_addr			addr;
  	unsigned char			is_local;
  	unsigned char			is_static;
2ba071ecb   Vlad Yasevich   bridge: Add vlan ...
88
  	__u16				vlan_id;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89
  };
eb1d16414   Herbert Xu   bridge: Add core ...
90
91
  struct net_bridge_port_group {
  	struct net_bridge_port		*port;
e80516880   Eric Dumazet   bridge: add RCU a...
92
  	struct net_bridge_port_group __rcu *next;
eb1d16414   Herbert Xu   bridge: Add core ...
93
94
95
  	struct hlist_node		mglist;
  	struct rcu_head			rcu;
  	struct timer_list		timer;
8ef2a9a59   YOSHIFUJI Hideaki   bridge br_multica...
96
  	struct br_ip			addr;
ccb1c31a7   Amerigo Wang   bridge: add flags...
97
  	unsigned char			state;
eb1d16414   Herbert Xu   bridge: Add core ...
98
99
100
101
102
  };
  
  struct net_bridge_mdb_entry
  {
  	struct hlist_node		hlist[2];
eb1d16414   Herbert Xu   bridge: Add core ...
103
  	struct net_bridge		*br;
e80516880   Eric Dumazet   bridge: add RCU a...
104
  	struct net_bridge_port_group __rcu *ports;
eb1d16414   Herbert Xu   bridge: Add core ...
105
106
  	struct rcu_head			rcu;
  	struct timer_list		timer;
8ef2a9a59   YOSHIFUJI Hideaki   bridge br_multica...
107
  	struct br_ip			addr;
8a870178c   Herbert Xu   bridge: Replace m...
108
  	bool				mglist;
eb1d16414   Herbert Xu   bridge: Add core ...
109
110
111
112
113
114
115
116
117
118
119
120
  };
  
  struct net_bridge_mdb_htable
  {
  	struct hlist_head		*mhash;
  	struct rcu_head			rcu;
  	struct net_bridge_mdb_htable	*old;
  	u32				size;
  	u32				max;
  	u32				secret;
  	u32				ver;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
  struct net_bridge_port
  {
  	struct net_bridge		*br;
  	struct net_device		*dev;
  	struct list_head		list;
  
  	/* STP */
  	u8				priority;
  	u8				state;
  	u16				port_no;
  	unsigned char			topology_change_ack;
  	unsigned char			config_pending;
  	port_id				port_id;
  	port_id				designated_port;
  	bridge_id			designated_root;
  	bridge_id			designated_bridge;
  	u32				path_cost;
  	u32				designated_cost;
0c03150e7   stephen hemminger   bridge: send prop...
139
  	unsigned long			designated_age;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140
141
142
143
144
145
  
  	struct timer_list		forward_delay_timer;
  	struct timer_list		hold_timer;
  	struct timer_list		message_age_timer;
  	struct kobject			kobj;
  	struct rcu_head			rcu;
3982d3d28   Fischer, Anna   net/bridge: Add '...
146
147
148
  
  	unsigned long 			flags;
  #define BR_HAIRPIN_MODE		0x00000001
a2e01a65c   stephen hemminger   bridge: implement...
149
  #define BR_BPDU_GUARD           0x00000002
1007dd1aa   stephen hemminger   bridge: add root ...
150
  #define BR_ROOT_BLOCK		0x00000004
c2d3babfa   David S. Miller   bridge: implement...
151
  #define BR_MULTICAST_FAST_LEAVE	0x00000008
8f3359bdc   stephen hemminger   bridge: make user...
152
  #define BR_ADMIN_COST		0x00000010
eb1d16414   Herbert Xu   bridge: Add core ...
153
154
155
156
157
158
159
160
161
  
  #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
  	u32				multicast_startup_queries_sent;
  	unsigned char			multicast_router;
  	struct timer_list		multicast_router_timer;
  	struct timer_list		multicast_query_timer;
  	struct hlist_head		mglist;
  	struct hlist_node		rlist;
  #endif
e0f43752a   Simon Arlott   bridge: update sy...
162
163
164
165
  
  #ifdef CONFIG_SYSFS
  	char				sysfs_name[IFNAMSIZ];
  #endif
91d2c34a4   Herbert Xu   bridge: Fix netpo...
166
167
168
169
  
  #ifdef CONFIG_NET_POLL_CONTROLLER
  	struct netpoll			*np;
  #endif
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
170
171
172
  #ifdef CONFIG_BRIDGE_VLAN_FILTERING
  	struct net_port_vlans __rcu	*vlan_info;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
173
  };
f350a0a87   Jiri Pirko   bridge: use rx_ha...
174
  #define br_port_exists(dev) (dev->priv_flags & IFF_BRIDGE_PORT)
b5ed54e94   stephen hemminger   bridge: fix RCU r...
175
176
  static inline struct net_bridge_port *br_port_get_rcu(const struct net_device *dev)
  {
960b8e501   Hong Zhiguo   bridge: fix NULL ...
177
  	return rcu_dereference(dev->rx_handler_data);
b5ed54e94   stephen hemminger   bridge: fix RCU r...
178
  }
97ddc3e1f   Hong Zhiguo   bridge: use br_po...
179
  static inline struct net_bridge_port *br_port_get_rtnl(const struct net_device *dev)
b5ed54e94   stephen hemminger   bridge: fix RCU r...
180
  {
ec1e5610c   Eric Dumazet   bridge: add RCU a...
181
182
  	return br_port_exists(dev) ?
  		rtnl_dereference(dev->rx_handler_data) : NULL;
b5ed54e94   stephen hemminger   bridge: fix RCU r...
183
  }
0eae88f31   Eric Dumazet   net: Fix various ...
184
  struct br_cpu_netstats {
406818ff3   Eric Dumazet   bridge: 64bit rx/...
185
186
187
188
189
  	u64			rx_packets;
  	u64			rx_bytes;
  	u64			tx_packets;
  	u64			tx_bytes;
  	struct u64_stats_sync	syncp;
0eae88f31   Eric Dumazet   net: Fix various ...
190
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191
192
193
194
195
  struct net_bridge
  {
  	spinlock_t			lock;
  	struct list_head		port_list;
  	struct net_device		*dev;
14bb47898   stephen hemminger   bridge: per-cpu p...
196

0eae88f31   Eric Dumazet   net: Fix various ...
197
  	struct br_cpu_netstats __percpu *stats;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
199
  	spinlock_t			hash_lock;
  	struct hlist_head		hash[BR_HASH_SIZE];
4adf0af68   Simon Wunderlich   bridge: send corr...
200
201
  #ifdef CONFIG_BRIDGE_NETFILTER
  	struct rtable 			fake_rtable;
4df53d8ba   Patrick McHardy   bridge: add per b...
202
203
204
  	bool				nf_call_iptables;
  	bool				nf_call_ip6tables;
  	bool				nf_call_arptables;
4adf0af68   Simon Wunderlich   bridge: send corr...
205
  #endif
515853cce   stephen hemminger   bridge: allow for...
206
  	u16				group_fwd_mask;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207
208
209
210
211
212
213
214
215
216
217
  	/* STP */
  	bridge_id			designated_root;
  	bridge_id			bridge_id;
  	u32				root_path_cost;
  	unsigned long			max_age;
  	unsigned long			hello_time;
  	unsigned long			forward_delay;
  	unsigned long			bridge_max_age;
  	unsigned long			ageing_time;
  	unsigned long			bridge_hello_time;
  	unsigned long			bridge_forward_delay;
fda93d92d   Stephen Hemminger   [BRIDGE]: allow s...
218
  	u8				group_addr[ETH_ALEN];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
219
  	u16				root_port;
9cde07087   Stephen Hemminger   bridge: add suppo...
220
221
222
223
224
225
  
  	enum {
  		BR_NO_STP, 		/* no spanning tree */
  		BR_KERNEL_STP,		/* old STP in kernel */
  		BR_USER_STP,		/* new RSTP in userspace */
  	} stp_enabled;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
226
227
  	unsigned char			topology_change;
  	unsigned char			topology_change_detected;
eb1d16414   Herbert Xu   bridge: Add core ...
228
229
230
231
  #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
  	unsigned char			multicast_router;
  
  	u8				multicast_disabled:1;
c5c232605   Herbert Xu   bridge: Add multi...
232
  	u8				multicast_querier:1;
eb1d16414   Herbert Xu   bridge: Add core ...
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
  
  	u32				hash_elasticity;
  	u32				hash_max;
  
  	u32				multicast_last_member_count;
  	u32				multicast_startup_queries_sent;
  	u32				multicast_startup_query_count;
  
  	unsigned long			multicast_last_member_interval;
  	unsigned long			multicast_membership_interval;
  	unsigned long			multicast_querier_interval;
  	unsigned long			multicast_query_interval;
  	unsigned long			multicast_query_response_interval;
  	unsigned long			multicast_startup_query_interval;
  
  	spinlock_t			multicast_lock;
e80516880   Eric Dumazet   bridge: add RCU a...
249
  	struct net_bridge_mdb_htable __rcu *mdb;
eb1d16414   Herbert Xu   bridge: Add core ...
250
  	struct hlist_head		router_list;
eb1d16414   Herbert Xu   bridge: Add core ...
251
252
253
254
255
  
  	struct timer_list		multicast_router_timer;
  	struct timer_list		multicast_querier_timer;
  	struct timer_list		multicast_query_timer;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
256
257
258
259
  	struct timer_list		hello_timer;
  	struct timer_list		tcn_timer;
  	struct timer_list		topology_change_timer;
  	struct timer_list		gc_timer;
43b98c4a6   Greg Kroah-Hartman   Kobject: change n...
260
  	struct kobject			*ifobj;
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
261
262
263
264
  #ifdef CONFIG_BRIDGE_VLAN_FILTERING
  	u8				vlan_enabled;
  	struct net_port_vlans __rcu	*vlan_info;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
265
  };
68b7c895b   Herbert Xu   bridge: Allow tai...
266
267
  struct br_input_skb_cb {
  	struct net_device *brdev;
32dec5dd0   YOSHIFUJI Hideaki / 吉藤英明   bridge br_multica...
268
  #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
eb1d16414   Herbert Xu   bridge: Add core ...
269
270
  	int igmp;
  	int mrouters_only;
32dec5dd0   YOSHIFUJI Hideaki / 吉藤英明   bridge br_multica...
271
  #endif
68b7c895b   Herbert Xu   bridge: Allow tai...
272
273
274
  };
  
  #define BR_INPUT_SKB_CB(__skb)	((struct br_input_skb_cb *)(__skb)->cb)
32dec5dd0   YOSHIFUJI Hideaki / 吉藤英明   bridge br_multica...
275
276
277
278
279
  #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
  # define BR_INPUT_SKB_CB_MROUTERS_ONLY(__skb)	(BR_INPUT_SKB_CB(__skb)->mrouters_only)
  #else
  # define BR_INPUT_SKB_CB_MROUTERS_ONLY(__skb)	(0)
  #endif
28a16c979   stephen hemminger   bridge: change co...
280
281
282
283
284
285
286
287
288
289
290
291
292
293
  #define br_printk(level, br, format, args...)	\
  	printk(level "%s: " format, (br)->dev->name, ##args)
  
  #define br_err(__br, format, args...)			\
  	br_printk(KERN_ERR, __br, format, ##args)
  #define br_warn(__br, format, args...)			\
  	br_printk(KERN_WARNING, __br, format, ##args)
  #define br_notice(__br, format, args...)		\
  	br_printk(KERN_NOTICE, __br, format, ##args)
  #define br_info(__br, format, args...)			\
  	br_printk(KERN_INFO, __br, format, ##args)
  
  #define br_debug(br, format, args...)			\
  	pr_debug("%s: " format,  (br)->dev->name, ##args)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294
  extern struct notifier_block br_device_notifier;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
295
296
297
298
299
300
  
  /* called under bridge lock */
  static inline int br_is_root_bridge(const struct net_bridge *br)
  {
  	return !memcmp(&br->bridge_id, &br->designated_root, 8);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
301
302
  /* br_device.c */
  extern void br_dev_setup(struct net_device *dev);
1ce5cce89   stephen hemminger   bridge: fix hang ...
303
  extern void br_dev_delete(struct net_device *dev, struct list_head *list);
6fef4c0c8   Stephen Hemminger   netdev: convert p...
304
305
  extern netdev_tx_t br_dev_xmit(struct sk_buff *skb,
  			       struct net_device *dev);
cfb478da7   stephen hemminger   bridge: netpoll c...
306
  #ifdef CONFIG_NET_POLL_CONTROLLER
91d2c34a4   Herbert Xu   bridge: Fix netpo...
307
308
309
310
311
312
313
314
315
316
317
318
319
  static inline struct netpoll_info *br_netpoll_info(struct net_bridge *br)
  {
  	return br->dev->npinfo;
  }
  
  static inline void br_netpoll_send_skb(const struct net_bridge_port *p,
  				       struct sk_buff *skb)
  {
  	struct netpoll *np = p->np;
  
  	if (np)
  		netpoll_send_skb(np, skb);
  }
47be03a28   Amerigo Wang   netpoll: use GFP_...
320
  extern int br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp);
91d2c34a4   Herbert Xu   bridge: Fix netpo...
321
  extern void br_netpoll_disable(struct net_bridge_port *p);
cfb478da7   stephen hemminger   bridge: netpoll c...
322
  #else
91d2c34a4   Herbert Xu   bridge: Fix netpo...
323
324
325
326
  static inline struct netpoll_info *br_netpoll_info(struct net_bridge *br)
  {
  	return NULL;
  }
9f70b0fce   Herbert Xu   bridge: Add const...
327
  static inline void br_netpoll_send_skb(const struct net_bridge_port *p,
91d2c34a4   Herbert Xu   bridge: Fix netpo...
328
329
330
  				       struct sk_buff *skb)
  {
  }
cfb478da7   stephen hemminger   bridge: netpoll c...
331

47be03a28   Amerigo Wang   netpoll: use GFP_...
332
  static inline int br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp)
91d2c34a4   Herbert Xu   bridge: Fix netpo...
333
334
335
336
337
338
339
  {
  	return 0;
  }
  
  static inline void br_netpoll_disable(struct net_bridge_port *p)
  {
  }
cfb478da7   stephen hemminger   bridge: netpoll c...
340
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
341
342
  
  /* br_fdb.c */
87a596e0b   Akinobu Mita   bridge: check kme...
343
  extern int br_fdb_init(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
344
  extern void br_fdb_fini(void);
9cf637473   Stephen Hemminger   bridge: add sysfs...
345
  extern void br_fdb_flush(struct net_bridge *br);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
346
347
  extern void br_fdb_changeaddr(struct net_bridge_port *p,
  			      const unsigned char *newaddr);
435988133   stephen hemminger   bridge: add local...
348
  extern void br_fdb_change_mac_address(struct net_bridge *br, const u8 *newaddr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
349
350
  extern void br_fdb_cleanup(unsigned long arg);
  extern void br_fdb_delete_by_port(struct net_bridge *br,
1a620698c   Stephen Hemminger   [BRIDGE]: flush f...
351
  				  const struct net_bridge_port *p, int do_all);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
352
  extern struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br,
2ba071ecb   Vlad Yasevich   bridge: Add vlan ...
353
354
  						 const unsigned char *addr,
  						 __u16 vid);
da6782927   Michał Mirosław   bridge: Simplify ...
355
  extern int br_fdb_test_addr(struct net_device *dev, unsigned char *addr);
9d6f229fc   YOSHIFUJI Hideaki   [NET] BRIDGE: Fix...
356
  extern int br_fdb_fillbuf(struct net_bridge *br, void *buf,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
357
358
359
  			  unsigned long count, unsigned long off);
  extern int br_fdb_insert(struct net_bridge *br,
  			 struct net_bridge_port *source,
bc9a25d21   Vlad Yasevich   bridge: Add vlan ...
360
361
  			 const unsigned char *addr,
  			 u16 vid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
362
363
  extern void br_fdb_update(struct net_bridge *br,
  			  struct net_bridge_port *source,
2ba071ecb   Vlad Yasevich   bridge: Add vlan ...
364
365
  			  const unsigned char *addr,
  			  u16 vid);
bc9a25d21   Vlad Yasevich   bridge: Add vlan ...
366
  extern int fdb_delete_by_addr(struct net_bridge *br, const u8 *addr, u16 vid);
77162022a   John Fastabend   net: add generic ...
367

1690be63a   Vlad Yasevich   bridge: Add vlan ...
368
  extern int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
77162022a   John Fastabend   net: add generic ...
369
  			 struct net_device *dev,
6b6e27255   stephen hemminger   netdev: make addr...
370
  			 const unsigned char *addr);
edc7d5732   stephen hemminger   netlink: add attr...
371
  extern int br_fdb_add(struct ndmsg *nlh, struct nlattr *tb[],
77162022a   John Fastabend   net: add generic ...
372
  		      struct net_device *dev,
6b6e27255   stephen hemminger   netdev: make addr...
373
  		      const unsigned char *addr,
77162022a   John Fastabend   net: add generic ...
374
375
376
377
378
  		      u16 nlh_flags);
  extern int br_fdb_dump(struct sk_buff *skb,
  		       struct netlink_callback *cb,
  		       struct net_device *dev,
  		       int idx);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
379
380
381
382
383
384
  
  /* br_forward.c */
  extern void br_deliver(const struct net_bridge_port *to,
  		struct sk_buff *skb);
  extern int br_dev_queue_push_xmit(struct sk_buff *skb);
  extern void br_forward(const struct net_bridge_port *to,
7f7708f00   Michael Braun   bridge: Fix br_fo...
385
  		struct sk_buff *skb, struct sk_buff *skb0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
386
  extern int br_forward_finish(struct sk_buff *skb);
e081e1e3e   Herbert Xu   [BRIDGE]: Kill cl...
387
  extern void br_flood_deliver(struct net_bridge *br, struct sk_buff *skb);
b33084be1   Herbert Xu   bridge: Avoid unn...
388
389
  extern void br_flood_forward(struct net_bridge *br, struct sk_buff *skb,
  			     struct sk_buff *skb2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
390
391
  
  /* br_if.c */
269def7c5   Stephen Hemminger   [BRIDGE]: elimina...
392
  extern void br_port_carrier_check(struct net_bridge_port *p);
4aa678ba4   Alexey Dobriyan   netns bridge: all...
393
394
  extern int br_add_bridge(struct net *net, const char *name);
  extern int br_del_bridge(struct net *net, const char *name);
712d6954e   Alexey Dobriyan   netns bridge: cle...
395
  extern void br_net_exit(struct net *net);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
396
397
398
399
400
  extern int br_add_if(struct net_bridge *br,
  	      struct net_device *dev);
  extern int br_del_if(struct net_bridge *br,
  	      struct net_device *dev);
  extern int br_min_mtu(const struct net_bridge *br);
c8f44affb   Michał Mirosław   net: introduce an...
401
402
  extern netdev_features_t br_features_recompute(struct net_bridge *br,
  	netdev_features_t features);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
403
404
405
  
  /* br_input.c */
  extern int br_handle_frame_finish(struct sk_buff *skb);
8a4eb5734   Jiri Pirko   net: introduce rx...
406
  extern rx_handler_result_t br_handle_frame(struct sk_buff **pskb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
407
408
409
  
  /* br_ioctl.c */
  extern int br_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
881d966b4   Eric W. Biederman   [NET]: Make the d...
410
  extern int br_ioctl_deviceless_stub(struct net *net, unsigned int cmd, void __user *arg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
411

eb1d16414   Herbert Xu   bridge: Add core ...
412
413
  /* br_multicast.c */
  #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
2ce297fc2   Cong Wang   bridge: fix seq c...
414
  extern unsigned int br_mdb_rehash_seq;
eb1d16414   Herbert Xu   bridge: Add core ...
415
416
417
418
  extern int br_multicast_rcv(struct net_bridge *br,
  			    struct net_bridge_port *port,
  			    struct sk_buff *skb);
  extern struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
fbca58a22   Cong Wang   bridge: add missi...
419
  					       struct sk_buff *skb, u16 vid);
eb1d16414   Herbert Xu   bridge: Add core ...
420
421
422
423
424
425
426
  extern void br_multicast_add_port(struct net_bridge_port *port);
  extern void br_multicast_del_port(struct net_bridge_port *port);
  extern void br_multicast_enable_port(struct net_bridge_port *port);
  extern void br_multicast_disable_port(struct net_bridge_port *port);
  extern void br_multicast_init(struct net_bridge *br);
  extern void br_multicast_open(struct net_bridge *br);
  extern void br_multicast_stop(struct net_bridge *br);
5cb5e947d   Herbert Xu   bridge: Add multi...
427
428
429
430
  extern void br_multicast_deliver(struct net_bridge_mdb_entry *mdst,
  				 struct sk_buff *skb);
  extern void br_multicast_forward(struct net_bridge_mdb_entry *mdst,
  				 struct sk_buff *skb, struct sk_buff *skb2);
0909e1175   Herbert Xu   bridge: Add multi...
431
432
433
  extern int br_multicast_set_router(struct net_bridge *br, unsigned long val);
  extern int br_multicast_set_port_router(struct net_bridge_port *p,
  					unsigned long val);
561f1103a   Herbert Xu   bridge: Add multi...
434
  extern int br_multicast_toggle(struct net_bridge *br, unsigned long val);
c5c232605   Herbert Xu   bridge: Add multi...
435
  extern int br_multicast_set_querier(struct net_bridge *br, unsigned long val);
b195167fc   Herbert Xu   bridge: Add hash ...
436
  extern int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val);
cfd567543   Cong Wang   bridge: add suppo...
437
438
439
440
441
442
443
444
445
  extern struct net_bridge_mdb_entry *br_mdb_ip_get(
  				struct net_bridge_mdb_htable *mdb,
  				struct br_ip *dst);
  extern struct net_bridge_mdb_entry *br_multicast_new_group(struct net_bridge *br,
  				struct net_bridge_port *port, struct br_ip *group);
  extern void br_multicast_free_pg(struct rcu_head *head);
  extern struct net_bridge_port_group *br_multicast_new_port_group(
  				struct net_bridge_port *port,
  				struct br_ip *group,
ccb1c31a7   Amerigo Wang   bridge: add flags...
446
447
  				struct net_bridge_port_group *next,
  				unsigned char state);
ee07c6e7a   Cong Wang   bridge: export mu...
448
  extern void br_mdb_init(void);
63233159f   Vlad Yasevich   bridge: Do not un...
449
  extern void br_mdb_uninit(void);
37a393bc4   Cong Wang   bridge: notify md...
450
451
  extern void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port,
  			  struct br_ip *group, int type);
85b352693   Sridhar Samudrala   bridge: Fix build...
452

cfd567543   Cong Wang   bridge: add suppo...
453
454
455
456
457
458
459
460
461
462
463
464
  #define mlock_dereference(X, br) \
  	rcu_dereference_protected(X, lockdep_is_held(&br->multicast_lock))
  
  #if IS_ENABLED(CONFIG_IPV6)
  #include <net/addrconf.h>
  static inline int ipv6_is_transient_multicast(const struct in6_addr *addr)
  {
  	if (ipv6_addr_is_multicast(addr) && IPV6_ADDR_MC_FLAG_TRANSIENT(addr))
  		return 1;
  	return 0;
  }
  #endif
85b352693   Sridhar Samudrala   bridge: Fix build...
465
466
467
468
469
470
  static inline bool br_multicast_is_router(struct net_bridge *br)
  {
  	return br->multicast_router == 2 ||
  	       (br->multicast_router == 1 &&
  		timer_pending(&br->multicast_router_timer));
  }
eb1d16414   Herbert Xu   bridge: Add core ...
471
472
473
474
475
476
477
478
479
  #else
  static inline int br_multicast_rcv(struct net_bridge *br,
  				   struct net_bridge_port *port,
  				   struct sk_buff *skb)
  {
  	return 0;
  }
  
  static inline struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
fbca58a22   Cong Wang   bridge: add missi...
480
  						      struct sk_buff *skb, u16 vid)
eb1d16414   Herbert Xu   bridge: Add core ...
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
  {
  	return NULL;
  }
  
  static inline void br_multicast_add_port(struct net_bridge_port *port)
  {
  }
  
  static inline void br_multicast_del_port(struct net_bridge_port *port)
  {
  }
  
  static inline void br_multicast_enable_port(struct net_bridge_port *port)
  {
  }
  
  static inline void br_multicast_disable_port(struct net_bridge_port *port)
  {
  }
  
  static inline void br_multicast_init(struct net_bridge *br)
  {
  }
  
  static inline void br_multicast_open(struct net_bridge *br)
  {
  }
  
  static inline void br_multicast_stop(struct net_bridge *br)
  {
  }
5cb5e947d   Herbert Xu   bridge: Add multi...
512
513
514
515
516
517
518
519
520
521
522
  
  static inline void br_multicast_deliver(struct net_bridge_mdb_entry *mdst,
  					struct sk_buff *skb)
  {
  }
  
  static inline void br_multicast_forward(struct net_bridge_mdb_entry *mdst,
  					struct sk_buff *skb,
  					struct sk_buff *skb2)
  {
  }
eb1d16414   Herbert Xu   bridge: Add core ...
523
524
  static inline bool br_multicast_is_router(struct net_bridge *br)
  {
85b352693   Sridhar Samudrala   bridge: Fix build...
525
  	return 0;
eb1d16414   Herbert Xu   bridge: Add core ...
526
  }
fdb184d14   Rami Rosen   bridge: add empty...
527
528
529
530
531
532
  static inline void br_mdb_init(void)
  {
  }
  static inline void br_mdb_uninit(void)
  {
  }
85b352693   Sridhar Samudrala   bridge: Fix build...
533
  #endif
eb1d16414   Herbert Xu   bridge: Add core ...
534

243a2e63f   Vlad Yasevich   bridge: Add vlan ...
535
536
  /* br_vlan.c */
  #ifdef CONFIG_BRIDGE_VLAN_FILTERING
a37b85c9f   Vlad Yasevich   bridge: Validate ...
537
  extern bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
788519886   Vlad Yasevich   bridge: Implement...
538
  			       struct sk_buff *skb, u16 *vid);
85f46c6ba   Vlad Yasevich   bridge: Verify th...
539
540
541
  extern bool br_allowed_egress(struct net_bridge *br,
  			      const struct net_port_vlans *v,
  			      const struct sk_buff *skb);
788519886   Vlad Yasevich   bridge: Implement...
542
543
544
  extern struct sk_buff *br_handle_vlan(struct net_bridge *br,
  				      const struct net_port_vlans *v,
  				      struct sk_buff *skb);
552406c48   Vlad Yasevich   bridge: Add the a...
545
  extern int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags);
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
546
547
548
  extern int br_vlan_delete(struct net_bridge *br, u16 vid);
  extern void br_vlan_flush(struct net_bridge *br);
  extern int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val);
552406c48   Vlad Yasevich   bridge: Add the a...
549
  extern int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags);
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
550
551
  extern int nbp_vlan_delete(struct net_bridge_port *port, u16 vid);
  extern void nbp_vlan_flush(struct net_bridge_port *port);
bc9a25d21   Vlad Yasevich   bridge: Add vlan ...
552
  extern bool nbp_vlan_find(struct net_bridge_port *port, u16 vid);
a37b85c9f   Vlad Yasevich   bridge: Validate ...
553
554
555
556
  
  static inline struct net_port_vlans *br_get_vlan_info(
  						const struct net_bridge *br)
  {
1690be63a   Vlad Yasevich   bridge: Add vlan ...
557
  	return rcu_dereference_rtnl(br->vlan_info);
a37b85c9f   Vlad Yasevich   bridge: Validate ...
558
559
560
561
562
  }
  
  static inline struct net_port_vlans *nbp_get_vlan_info(
  						const struct net_bridge_port *p)
  {
1690be63a   Vlad Yasevich   bridge: Add vlan ...
563
  	return rcu_dereference_rtnl(p->vlan_info);
a37b85c9f   Vlad Yasevich   bridge: Validate ...
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
  }
  
  /* Since bridge now depends on 8021Q module, but the time bridge sees the
   * skb, the vlan tag will always be present if the frame was tagged.
   */
  static inline int br_vlan_get_tag(const struct sk_buff *skb, u16 *vid)
  {
  	int err = 0;
  
  	if (vlan_tx_tag_present(skb))
  		*vid = vlan_tx_tag_get(skb) & VLAN_VID_MASK;
  	else {
  		*vid = 0;
  		err = -EINVAL;
  	}
  
  	return err;
  }
788519886   Vlad Yasevich   bridge: Implement...
582
583
584
585
586
587
588
589
590
591
592
  
  static inline u16 br_get_pvid(const struct net_port_vlans *v)
  {
  	/* Return just the VID if it is set, or VLAN_N_VID (invalid vid) if
  	 * vid wasn't set
  	 */
  	smp_rmb();
  	return (v->pvid & VLAN_TAG_PRESENT) ?
  			(v->pvid & ~VLAN_TAG_PRESENT) :
  			VLAN_N_VID;
  }
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
593
  #else
a37b85c9f   Vlad Yasevich   bridge: Validate ...
594
595
  static inline bool br_allowed_ingress(struct net_bridge *br,
  				      struct net_port_vlans *v,
788519886   Vlad Yasevich   bridge: Implement...
596
597
  				      struct sk_buff *skb,
  				      u16 *vid)
a37b85c9f   Vlad Yasevich   bridge: Validate ...
598
599
600
  {
  	return true;
  }
85f46c6ba   Vlad Yasevich   bridge: Verify th...
601
602
603
604
605
606
  static inline bool br_allowed_egress(struct net_bridge *br,
  				     const struct net_port_vlans *v,
  				     const struct sk_buff *skb)
  {
  	return true;
  }
788519886   Vlad Yasevich   bridge: Implement...
607
608
609
610
611
612
  static inline struct sk_buff *br_handle_vlan(struct net_bridge *br,
  					     const struct net_port_vlans *v,
  					     struct sk_buff *skb)
  {
  	return skb;
  }
552406c48   Vlad Yasevich   bridge: Add the a...
613
  static inline int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags)
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
614
615
616
617
618
619
620
621
622
623
624
625
  {
  	return -EOPNOTSUPP;
  }
  
  static inline int br_vlan_delete(struct net_bridge *br, u16 vid)
  {
  	return -EOPNOTSUPP;
  }
  
  static inline void br_vlan_flush(struct net_bridge *br)
  {
  }
552406c48   Vlad Yasevich   bridge: Add the a...
626
  static inline int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags)
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
627
628
629
630
631
632
633
634
635
636
637
638
  {
  	return -EOPNOTSUPP;
  }
  
  static inline int nbp_vlan_delete(struct net_bridge_port *port, u16 vid)
  {
  	return -EOPNOTSUPP;
  }
  
  static inline void nbp_vlan_flush(struct net_bridge_port *port)
  {
  }
a37b85c9f   Vlad Yasevich   bridge: Validate ...
639
640
641
642
643
644
645
646
647
648
  static inline struct net_port_vlans *br_get_vlan_info(
  						const struct net_bridge *br)
  {
  	return NULL;
  }
  static inline struct net_port_vlans *nbp_get_vlan_info(
  						const struct net_bridge_port *p)
  {
  	return NULL;
  }
bc9a25d21   Vlad Yasevich   bridge: Add vlan ...
649
650
651
652
  static inline bool nbp_vlan_find(struct net_bridge_port *port, u16 vid)
  {
  	return false;
  }
788519886   Vlad Yasevich   bridge: Implement...
653
  static inline u16 br_vlan_get_tag(const struct sk_buff *skb, u16 *tag)
a37b85c9f   Vlad Yasevich   bridge: Validate ...
654
655
656
  {
  	return 0;
  }
788519886   Vlad Yasevich   bridge: Implement...
657
658
659
660
  static inline u16 br_get_pvid(const struct net_port_vlans *v)
  {
  	return VLAN_N_VID;	/* Returns invalid vid */
  }
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
661
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
662
  /* br_netfilter.c */
c09097132   Stephen Hemminger   [BRIDGE]: fix mod...
663
  #ifdef CONFIG_BRIDGE_NETFILTER
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
664
665
  extern int br_netfilter_init(void);
  extern void br_netfilter_fini(void);
4adf0af68   Simon Wunderlich   bridge: send corr...
666
  extern void br_netfilter_rtable_init(struct net_bridge *);
c09097132   Stephen Hemminger   [BRIDGE]: fix mod...
667
668
669
  #else
  #define br_netfilter_init()	(0)
  #define br_netfilter_fini()	do { } while(0)
4adf0af68   Simon Wunderlich   bridge: send corr...
670
  #define br_netfilter_rtable_init(x)
c09097132   Stephen Hemminger   [BRIDGE]: fix mod...
671
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
672
673
674
675
  
  /* br_stp.c */
  extern void br_log_state(const struct net_bridge_port *p);
  extern struct net_bridge_port *br_get_port(struct net_bridge *br,
9d6f229fc   YOSHIFUJI Hideaki   [NET] BRIDGE: Fix...
676
  					   u16 port_no);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
677
678
  extern void br_init_port(struct net_bridge_port *p);
  extern void br_become_designated_port(struct net_bridge_port *p);
dc45b846e   Herbert Xu   bridge: Clamp for...
679
  extern void __br_set_forward_delay(struct net_bridge *br, unsigned long t);
14f98f258   stephen hemminger   bridge: range che...
680
681
682
  extern int br_set_forward_delay(struct net_bridge *br, unsigned long x);
  extern int br_set_hello_time(struct net_bridge *br, unsigned long x);
  extern int br_set_max_age(struct net_bridge *br, unsigned long x);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
683
684
685
  /* br_stp_if.c */
  extern void br_stp_enable_bridge(struct net_bridge *br);
  extern void br_stp_disable_bridge(struct net_bridge *br);
9cde07087   Stephen Hemminger   bridge: add suppo...
686
  extern void br_stp_set_enabled(struct net_bridge *br, unsigned long val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
687
688
  extern void br_stp_enable_port(struct net_bridge_port *p);
  extern void br_stp_disable_port(struct net_bridge_port *p);
edf947f10   stephen hemminger   bridge: notify ap...
689
  extern bool br_stp_recalculate_bridge_id(struct net_bridge *br);
4505a3ef7   Stephen Hemminger   [BRIDGE]: allow s...
690
  extern void br_stp_change_bridge_id(struct net_bridge *br, const unsigned char *a);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
691
692
  extern void br_stp_set_bridge_priority(struct net_bridge *br,
  				       u16 newprio);
14f98f258   stephen hemminger   bridge: range che...
693
694
695
696
  extern int br_stp_set_port_priority(struct net_bridge_port *p,
  				    unsigned long newprio);
  extern int br_stp_set_path_cost(struct net_bridge_port *p,
  				unsigned long path_cost);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
697
698
699
  extern ssize_t br_show_bridge_id(char *buf, const struct bridge_id *id);
  
  /* br_stp_bpdu.c */
7c85fbf06   Patrick McHardy   bridge: Use STP d...
700
701
702
  struct stp_proto;
  extern void br_stp_rcv(const struct stp_proto *proto, struct sk_buff *skb,
  		       struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
703
704
705
706
707
708
709
  
  /* br_stp_timer.c */
  extern void br_stp_timer_init(struct net_bridge *br);
  extern void br_stp_port_timer_init(struct net_bridge_port *p);
  extern unsigned long br_timer_value(const struct timer_list *timer);
  
  /* br.c */
e6373c4c0   Igor Maravić   net:bridge: use I...
710
  #if IS_ENABLED(CONFIG_ATM_LANE)
da6782927   Michał Mirosław   bridge: Simplify ...
711
712
  extern int (*br_fdb_test_addr_hook)(struct net_device *dev, unsigned char *addr);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
713

11dc1f36a   Stephen Hemminger   [BRIDGE]: netlink...
714
  /* br_netlink.c */
149ddd83a   stephen hemminger   bridge: Assign rt...
715
  extern struct rtnl_link_ops br_link_ops;
32fe21c0c   Thomas Graf   [BRIDGE]: Use rtn...
716
  extern int br_netlink_init(void);
11dc1f36a   Stephen Hemminger   [BRIDGE]: netlink...
717
718
  extern void br_netlink_fini(void);
  extern void br_ifinfo_notify(int event, struct net_bridge_port *port);
e5a55a898   John Fastabend   net: create gener...
719
  extern int br_setlink(struct net_device *dev, struct nlmsghdr *nlmsg);
407af3299   Vlad Yasevich   bridge: Add netli...
720
  extern int br_dellink(struct net_device *dev, struct nlmsghdr *nlmsg);
e5a55a898   John Fastabend   net: create gener...
721
  extern int br_getlink(struct sk_buff *skb, u32 pid, u32 seq,
6cbdceeb1   Vlad Yasevich   bridge: Dump vlan...
722
  		      struct net_device *dev, u32 filter_mask);
11dc1f36a   Stephen Hemminger   [BRIDGE]: netlink...
723

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
724
725
  #ifdef CONFIG_SYSFS
  /* br_sysfs_if.c */
52cf25d0a   Emese Revfy   Driver core: Cons...
726
  extern const struct sysfs_ops brport_sysfs_ops;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
727
  extern int br_sysfs_addif(struct net_bridge_port *p);
e0f43752a   Simon Arlott   bridge: update sy...
728
  extern int br_sysfs_renameif(struct net_bridge_port *p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
729
730
731
732
733
734
  
  /* br_sysfs_br.c */
  extern int br_sysfs_addbr(struct net_device *dev);
  extern void br_sysfs_delbr(struct net_device *dev);
  
  #else
0cb2bbbea   Lee Jones   bridge: Avoid 'st...
735
736
737
738
  static inline int br_sysfs_addif(struct net_bridge_port *p) { return 0; }
  static inline int br_sysfs_renameif(struct net_bridge_port *p) { return 0; }
  static inline int br_sysfs_addbr(struct net_device *dev) { return 0; }
  static inline void br_sysfs_delbr(struct net_device *dev) { return; }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
739
740
741
  #endif /* CONFIG_SYSFS */
  
  #endif