1/*
2 *	Linux ethernet bridge
3 *
4 *	Authors:
5 *	Lennert Buytenhek		<buytenh@gnu.org>
6 *
7 *	This program is free software; you can redistribute it and/or
8 *	modify it under the terms of the GNU General Public License
9 *	as published by the Free Software Foundation; either version
10 *	2 of the License, or (at your option) any later version.
11 */
12
13#ifndef _BR_PRIVATE_H
14#define _BR_PRIVATE_H
15
16#include <linux/netdevice.h>
17#include <linux/if_bridge.h>
18#include <linux/netpoll.h>
19#include <linux/u64_stats_sync.h>
20#include <net/route.h>
21#include <linux/if_vlan.h>
22
23#define BR_HASH_BITS 8
24#define BR_HASH_SIZE (1 << BR_HASH_BITS)
25
26#define BR_HOLD_TIME (1*HZ)
27
28#define BR_PORT_BITS	10
29#define BR_MAX_PORTS	(1<<BR_PORT_BITS)
30#define BR_VLAN_BITMAP_LEN	BITS_TO_LONGS(VLAN_N_VID)
31
32#define BR_VERSION	"2.3"
33
34/* Control of forwarding link local multicast */
35#define BR_GROUPFWD_DEFAULT	0
36/* Don't allow forwarding control protocols like STP and LLDP */
37#define BR_GROUPFWD_RESTRICTED	0x4007u
38
39/* Path to usermode spanning tree program */
40#define BR_STP_PROG	"/sbin/bridge-stp"
41
42typedef struct bridge_id bridge_id;
43typedef struct mac_addr mac_addr;
44typedef __u16 port_id;
45
46struct bridge_id
47{
48	unsigned char	prio[2];
49	unsigned char	addr[6];
50};
51
52struct mac_addr
53{
54	unsigned char	addr[6];
55};
56
57struct br_ip
58{
59	union {
60		__be32	ip4;
61#if IS_ENABLED(CONFIG_IPV6)
62		struct in6_addr ip6;
63#endif
64	} u;
65	__be16		proto;
66	__u16		vid;
67};
68
69struct net_port_vlans {
70	u16				port_idx;
71	u16				pvid;
72	union {
73		struct net_bridge_port		*port;
74		struct net_bridge		*br;
75	}				parent;
76	struct rcu_head			rcu;
77	unsigned long			vlan_bitmap[BR_VLAN_BITMAP_LEN];
78	unsigned long			untagged_bitmap[BR_VLAN_BITMAP_LEN];
79	u16				num_vlans;
80};
81
82struct net_bridge_fdb_entry
83{
84	struct hlist_node		hlist;
85	struct net_bridge_port		*dst;
86
87	struct rcu_head			rcu;
88	unsigned long			updated;
89	unsigned long			used;
90	mac_addr			addr;
91	unsigned char			is_local;
92	unsigned char			is_static;
93	__u16				vlan_id;
94};
95
96struct net_bridge_port_group {
97	struct net_bridge_port		*port;
98	struct net_bridge_port_group __rcu *next;
99	struct hlist_node		mglist;
100	struct rcu_head			rcu;
101	struct timer_list		timer;
102	struct br_ip			addr;
103	unsigned char			state;
104};
105
106struct net_bridge_mdb_entry
107{
108	struct hlist_node		hlist[2];
109	struct net_bridge		*br;
110	struct net_bridge_port_group __rcu *ports;
111	struct rcu_head			rcu;
112	struct timer_list		timer;
113	struct br_ip			addr;
114	bool				mglist;
115};
116
117struct net_bridge_mdb_htable
118{
119	struct hlist_head		*mhash;
120	struct rcu_head			rcu;
121	struct net_bridge_mdb_htable	*old;
122	u32				size;
123	u32				max;
124	u32				secret;
125	u32				ver;
126};
127
128struct net_bridge_port
129{
130	struct net_bridge		*br;
131	struct net_device		*dev;
132	struct list_head		list;
133
134	/* STP */
135	u8				priority;
136	u8				state;
137	u16				port_no;
138	unsigned char			topology_change_ack;
139	unsigned char			config_pending;
140	port_id				port_id;
141	port_id				designated_port;
142	bridge_id			designated_root;
143	bridge_id			designated_bridge;
144	u32				path_cost;
145	u32				designated_cost;
146	unsigned long			designated_age;
147
148	struct timer_list		forward_delay_timer;
149	struct timer_list		hold_timer;
150	struct timer_list		message_age_timer;
151	struct kobject			kobj;
152	struct rcu_head			rcu;
153
154	unsigned long 			flags;
155#define BR_HAIRPIN_MODE		0x00000001
156#define BR_BPDU_GUARD           0x00000002
157#define BR_ROOT_BLOCK		0x00000004
158#define BR_MULTICAST_FAST_LEAVE	0x00000008
159#define BR_ADMIN_COST		0x00000010
160
161#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
162	u32				multicast_startup_queries_sent;
163	unsigned char			multicast_router;
164	struct timer_list		multicast_router_timer;
165	struct timer_list		multicast_query_timer;
166	struct hlist_head		mglist;
167	struct hlist_node		rlist;
168#endif
169
170#ifdef CONFIG_SYSFS
171	char				sysfs_name[IFNAMSIZ];
172#endif
173
174#ifdef CONFIG_NET_POLL_CONTROLLER
175	struct netpoll			*np;
176#endif
177#ifdef CONFIG_BRIDGE_VLAN_FILTERING
178	struct net_port_vlans __rcu	*vlan_info;
179#endif
180};
181
182#define br_port_exists(dev) (dev->priv_flags & IFF_BRIDGE_PORT)
183
184static inline struct net_bridge_port *br_port_get_rcu(const struct net_device *dev)
185{
186	struct net_bridge_port *port =
187			rcu_dereference_rtnl(dev->rx_handler_data);
188
189	return br_port_exists(dev) ? port : NULL;
190}
191
192static inline struct net_bridge_port *br_port_get_rtnl(struct net_device *dev)
193{
194	return br_port_exists(dev) ?
195		rtnl_dereference(dev->rx_handler_data) : NULL;
196}
197
198struct br_cpu_netstats {
199	u64			rx_packets;
200	u64			rx_bytes;
201	u64			tx_packets;
202	u64			tx_bytes;
203	struct u64_stats_sync	syncp;
204};
205
206struct net_bridge
207{
208	spinlock_t			lock;
209	struct list_head		port_list;
210	struct net_device		*dev;
211
212	struct br_cpu_netstats __percpu *stats;
213	spinlock_t			hash_lock;
214	struct hlist_head		hash[BR_HASH_SIZE];
215#ifdef CONFIG_BRIDGE_NETFILTER
216	struct rtable 			fake_rtable;
217	bool				nf_call_iptables;
218	bool				nf_call_ip6tables;
219	bool				nf_call_arptables;
220#endif
221	u16				group_fwd_mask;
222
223	/* STP */
224	bridge_id			designated_root;
225	bridge_id			bridge_id;
226	u32				root_path_cost;
227	unsigned long			max_age;
228	unsigned long			hello_time;
229	unsigned long			forward_delay;
230	unsigned long			bridge_max_age;
231	unsigned long			ageing_time;
232	unsigned long			bridge_hello_time;
233	unsigned long			bridge_forward_delay;
234
235	u8				group_addr[ETH_ALEN];
236	u16				root_port;
237
238	enum {
239		BR_NO_STP, 		/* no spanning tree */
240		BR_KERNEL_STP,		/* old STP in kernel */
241		BR_USER_STP,		/* new RSTP in userspace */
242	} stp_enabled;
243
244	unsigned char			topology_change;
245	unsigned char			topology_change_detected;
246
247#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
248	unsigned char			multicast_router;
249
250	u8				multicast_disabled:1;
251	u8				multicast_querier:1;
252
253	u32				hash_elasticity;
254	u32				hash_max;
255
256	u32				multicast_last_member_count;
257	u32				multicast_startup_queries_sent;
258	u32				multicast_startup_query_count;
259
260	unsigned long			multicast_last_member_interval;
261	unsigned long			multicast_membership_interval;
262	unsigned long			multicast_querier_interval;
263	unsigned long			multicast_query_interval;
264	unsigned long			multicast_query_response_interval;
265	unsigned long			multicast_startup_query_interval;
266
267	spinlock_t			multicast_lock;
268	struct net_bridge_mdb_htable __rcu *mdb;
269	struct hlist_head		router_list;
270
271	struct timer_list		multicast_router_timer;
272	struct timer_list		multicast_querier_timer;
273	struct timer_list		multicast_query_timer;
274#endif
275
276	struct timer_list		hello_timer;
277	struct timer_list		tcn_timer;
278	struct timer_list		topology_change_timer;
279	struct timer_list		gc_timer;
280	struct kobject			*ifobj;
281#ifdef CONFIG_BRIDGE_VLAN_FILTERING
282	u8				vlan_enabled;
283	struct net_port_vlans __rcu	*vlan_info;
284#endif
285};
286
287struct br_input_skb_cb {
288	struct net_device *brdev;
289#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
290	int igmp;
291	int mrouters_only;
292#endif
293};
294
295#define BR_INPUT_SKB_CB(__skb)	((struct br_input_skb_cb *)(__skb)->cb)
296
297#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
298# define BR_INPUT_SKB_CB_MROUTERS_ONLY(__skb)	(BR_INPUT_SKB_CB(__skb)->mrouters_only)
299#else
300# define BR_INPUT_SKB_CB_MROUTERS_ONLY(__skb)	(0)
301#endif
302
303#define br_printk(level, br, format, args...)	\
304	printk(level "%s: " format, (br)->dev->name, ##args)
305
306#define br_err(__br, format, args...)			\
307	br_printk(KERN_ERR, __br, format, ##args)
308#define br_warn(__br, format, args...)			\
309	br_printk(KERN_WARNING, __br, format, ##args)
310#define br_notice(__br, format, args...)		\
311	br_printk(KERN_NOTICE, __br, format, ##args)
312#define br_info(__br, format, args...)			\
313	br_printk(KERN_INFO, __br, format, ##args)
314
315#define br_debug(br, format, args...)			\
316	pr_debug("%s: " format,  (br)->dev->name, ##args)
317
318extern struct notifier_block br_device_notifier;
319
320/* called under bridge lock */
321static inline int br_is_root_bridge(const struct net_bridge *br)
322{
323	return !memcmp(&br->bridge_id, &br->designated_root, 8);
324}
325
326/* br_device.c */
327extern void br_dev_setup(struct net_device *dev);
328extern void br_dev_delete(struct net_device *dev, struct list_head *list);
329extern netdev_tx_t br_dev_xmit(struct sk_buff *skb,
330			       struct net_device *dev);
331#ifdef CONFIG_NET_POLL_CONTROLLER
332static inline struct netpoll_info *br_netpoll_info(struct net_bridge *br)
333{
334	return br->dev->npinfo;
335}
336
337static inline void br_netpoll_send_skb(const struct net_bridge_port *p,
338				       struct sk_buff *skb)
339{
340	struct netpoll *np = p->np;
341
342	if (np)
343		netpoll_send_skb(np, skb);
344}
345
346extern int br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp);
347extern void br_netpoll_disable(struct net_bridge_port *p);
348#else
349static inline struct netpoll_info *br_netpoll_info(struct net_bridge *br)
350{
351	return NULL;
352}
353
354static inline void br_netpoll_send_skb(const struct net_bridge_port *p,
355				       struct sk_buff *skb)
356{
357}
358
359static inline int br_netpoll_enable(struct net_bridge_port *p, gfp_t gfp)
360{
361	return 0;
362}
363
364static inline void br_netpoll_disable(struct net_bridge_port *p)
365{
366}
367#endif
368
369/* br_fdb.c */
370extern int br_fdb_init(void);
371extern void br_fdb_fini(void);
372extern void br_fdb_flush(struct net_bridge *br);
373extern void br_fdb_changeaddr(struct net_bridge_port *p,
374			      const unsigned char *newaddr);
375extern void br_fdb_change_mac_address(struct net_bridge *br, const u8 *newaddr);
376extern void br_fdb_cleanup(unsigned long arg);
377extern void br_fdb_delete_by_port(struct net_bridge *br,
378				  const struct net_bridge_port *p, int do_all);
379extern struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br,
380						 const unsigned char *addr,
381						 __u16 vid);
382extern int br_fdb_test_addr(struct net_device *dev, unsigned char *addr);
383extern int br_fdb_fillbuf(struct net_bridge *br, void *buf,
384			  unsigned long count, unsigned long off);
385extern int br_fdb_insert(struct net_bridge *br,
386			 struct net_bridge_port *source,
387			 const unsigned char *addr,
388			 u16 vid);
389extern void br_fdb_update(struct net_bridge *br,
390			  struct net_bridge_port *source,
391			  const unsigned char *addr,
392			  u16 vid);
393extern int fdb_delete_by_addr(struct net_bridge *br, const u8 *addr, u16 vid);
394
395extern int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
396			 struct net_device *dev,
397			 const unsigned char *addr);
398extern int br_fdb_add(struct ndmsg *nlh, struct nlattr *tb[],
399		      struct net_device *dev,
400		      const unsigned char *addr,
401		      u16 nlh_flags);
402extern int br_fdb_dump(struct sk_buff *skb,
403		       struct netlink_callback *cb,
404		       struct net_device *dev,
405		       int idx);
406
407/* br_forward.c */
408extern void br_deliver(const struct net_bridge_port *to,
409		struct sk_buff *skb);
410extern int br_dev_queue_push_xmit(struct sk_buff *skb);
411extern void br_forward(const struct net_bridge_port *to,
412		struct sk_buff *skb, struct sk_buff *skb0);
413extern int br_forward_finish(struct sk_buff *skb);
414extern void br_flood_deliver(struct net_bridge *br, struct sk_buff *skb);
415extern void br_flood_forward(struct net_bridge *br, struct sk_buff *skb,
416			     struct sk_buff *skb2);
417
418/* br_if.c */
419extern void br_port_carrier_check(struct net_bridge_port *p);
420extern int br_add_bridge(struct net *net, const char *name);
421extern int br_del_bridge(struct net *net, const char *name);
422extern void br_net_exit(struct net *net);
423extern int br_add_if(struct net_bridge *br,
424	      struct net_device *dev);
425extern int br_del_if(struct net_bridge *br,
426	      struct net_device *dev);
427extern int br_min_mtu(const struct net_bridge *br);
428extern netdev_features_t br_features_recompute(struct net_bridge *br,
429	netdev_features_t features);
430
431/* br_input.c */
432extern int br_handle_frame_finish(struct sk_buff *skb);
433extern rx_handler_result_t br_handle_frame(struct sk_buff **pskb);
434
435/* br_ioctl.c */
436extern int br_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
437extern int br_ioctl_deviceless_stub(struct net *net, unsigned int cmd, void __user *arg);
438
439/* br_multicast.c */
440#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
441extern unsigned int br_mdb_rehash_seq;
442extern int br_multicast_rcv(struct net_bridge *br,
443			    struct net_bridge_port *port,
444			    struct sk_buff *skb);
445extern struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
446					       struct sk_buff *skb, u16 vid);
447extern void br_multicast_add_port(struct net_bridge_port *port);
448extern void br_multicast_del_port(struct net_bridge_port *port);
449extern void br_multicast_enable_port(struct net_bridge_port *port);
450extern void br_multicast_disable_port(struct net_bridge_port *port);
451extern void br_multicast_init(struct net_bridge *br);
452extern void br_multicast_open(struct net_bridge *br);
453extern void br_multicast_stop(struct net_bridge *br);
454extern void br_multicast_deliver(struct net_bridge_mdb_entry *mdst,
455				 struct sk_buff *skb);
456extern void br_multicast_forward(struct net_bridge_mdb_entry *mdst,
457				 struct sk_buff *skb, struct sk_buff *skb2);
458extern int br_multicast_set_router(struct net_bridge *br, unsigned long val);
459extern int br_multicast_set_port_router(struct net_bridge_port *p,
460					unsigned long val);
461extern int br_multicast_toggle(struct net_bridge *br, unsigned long val);
462extern int br_multicast_set_querier(struct net_bridge *br, unsigned long val);
463extern int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val);
464extern struct net_bridge_mdb_entry *br_mdb_ip_get(
465				struct net_bridge_mdb_htable *mdb,
466				struct br_ip *dst);
467extern struct net_bridge_mdb_entry *br_multicast_new_group(struct net_bridge *br,
468				struct net_bridge_port *port, struct br_ip *group);
469extern void br_multicast_free_pg(struct rcu_head *head);
470extern struct net_bridge_port_group *br_multicast_new_port_group(
471				struct net_bridge_port *port,
472				struct br_ip *group,
473				struct net_bridge_port_group *next,
474				unsigned char state);
475extern void br_mdb_init(void);
476extern void br_mdb_uninit(void);
477extern void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port,
478			  struct br_ip *group, int type);
479
480#define mlock_dereference(X, br) \
481	rcu_dereference_protected(X, lockdep_is_held(&br->multicast_lock))
482
483#if IS_ENABLED(CONFIG_IPV6)
484#include <net/addrconf.h>
485static inline int ipv6_is_transient_multicast(const struct in6_addr *addr)
486{
487	if (ipv6_addr_is_multicast(addr) && IPV6_ADDR_MC_FLAG_TRANSIENT(addr))
488		return 1;
489	return 0;
490}
491#endif
492
493static inline bool br_multicast_is_router(struct net_bridge *br)
494{
495	return br->multicast_router == 2 ||
496	       (br->multicast_router == 1 &&
497		timer_pending(&br->multicast_router_timer));
498}
499#else
500static inline int br_multicast_rcv(struct net_bridge *br,
501				   struct net_bridge_port *port,
502				   struct sk_buff *skb)
503{
504	return 0;
505}
506
507static inline struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
508						      struct sk_buff *skb, u16 vid)
509{
510	return NULL;
511}
512
513static inline void br_multicast_add_port(struct net_bridge_port *port)
514{
515}
516
517static inline void br_multicast_del_port(struct net_bridge_port *port)
518{
519}
520
521static inline void br_multicast_enable_port(struct net_bridge_port *port)
522{
523}
524
525static inline void br_multicast_disable_port(struct net_bridge_port *port)
526{
527}
528
529static inline void br_multicast_init(struct net_bridge *br)
530{
531}
532
533static inline void br_multicast_open(struct net_bridge *br)
534{
535}
536
537static inline void br_multicast_stop(struct net_bridge *br)
538{
539}
540
541static inline void br_multicast_deliver(struct net_bridge_mdb_entry *mdst,
542					struct sk_buff *skb)
543{
544}
545
546static inline void br_multicast_forward(struct net_bridge_mdb_entry *mdst,
547					struct sk_buff *skb,
548					struct sk_buff *skb2)
549{
550}
551static inline bool br_multicast_is_router(struct net_bridge *br)
552{
553	return 0;
554}
555static inline void br_mdb_init(void)
556{
557}
558static inline void br_mdb_uninit(void)
559{
560}
561#endif
562
563/* br_vlan.c */
564#ifdef CONFIG_BRIDGE_VLAN_FILTERING
565extern bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
566			       struct sk_buff *skb, u16 *vid);
567extern bool br_allowed_egress(struct net_bridge *br,
568			      const struct net_port_vlans *v,
569			      const struct sk_buff *skb);
570extern struct sk_buff *br_handle_vlan(struct net_bridge *br,
571				      const struct net_port_vlans *v,
572				      struct sk_buff *skb);
573extern int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags);
574extern int br_vlan_delete(struct net_bridge *br, u16 vid);
575extern void br_vlan_flush(struct net_bridge *br);
576extern int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val);
577extern int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags);
578extern int nbp_vlan_delete(struct net_bridge_port *port, u16 vid);
579extern void nbp_vlan_flush(struct net_bridge_port *port);
580extern bool nbp_vlan_find(struct net_bridge_port *port, u16 vid);
581
582static inline struct net_port_vlans *br_get_vlan_info(
583						const struct net_bridge *br)
584{
585	return rcu_dereference_rtnl(br->vlan_info);
586}
587
588static inline struct net_port_vlans *nbp_get_vlan_info(
589						const struct net_bridge_port *p)
590{
591	return rcu_dereference_rtnl(p->vlan_info);
592}
593
594/* Since bridge now depends on 8021Q module, but the time bridge sees the
595 * skb, the vlan tag will always be present if the frame was tagged.
596 */
597static inline int br_vlan_get_tag(const struct sk_buff *skb, u16 *vid)
598{
599	int err = 0;
600
601	if (vlan_tx_tag_present(skb))
602		*vid = vlan_tx_tag_get(skb) & VLAN_VID_MASK;
603	else {
604		*vid = 0;
605		err = -EINVAL;
606	}
607
608	return err;
609}
610
611static inline u16 br_get_pvid(const struct net_port_vlans *v)
612{
613	/* Return just the VID if it is set, or VLAN_N_VID (invalid vid) if
614	 * vid wasn't set
615	 */
616	smp_rmb();
617	return (v->pvid & VLAN_TAG_PRESENT) ?
618			(v->pvid & ~VLAN_TAG_PRESENT) :
619			VLAN_N_VID;
620}
621
622#else
623static inline bool br_allowed_ingress(struct net_bridge *br,
624				      struct net_port_vlans *v,
625				      struct sk_buff *skb,
626				      u16 *vid)
627{
628	return true;
629}
630
631static inline bool br_allowed_egress(struct net_bridge *br,
632				     const struct net_port_vlans *v,
633				     const struct sk_buff *skb)
634{
635	return true;
636}
637
638static inline struct sk_buff *br_handle_vlan(struct net_bridge *br,
639					     const struct net_port_vlans *v,
640					     struct sk_buff *skb)
641{
642	return skb;
643}
644
645static inline int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags)
646{
647	return -EOPNOTSUPP;
648}
649
650static inline int br_vlan_delete(struct net_bridge *br, u16 vid)
651{
652	return -EOPNOTSUPP;
653}
654
655static inline void br_vlan_flush(struct net_bridge *br)
656{
657}
658
659static inline int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags)
660{
661	return -EOPNOTSUPP;
662}
663
664static inline int nbp_vlan_delete(struct net_bridge_port *port, u16 vid)
665{
666	return -EOPNOTSUPP;
667}
668
669static inline void nbp_vlan_flush(struct net_bridge_port *port)
670{
671}
672
673static inline struct net_port_vlans *br_get_vlan_info(
674						const struct net_bridge *br)
675{
676	return NULL;
677}
678static inline struct net_port_vlans *nbp_get_vlan_info(
679						const struct net_bridge_port *p)
680{
681	return NULL;
682}
683
684static inline bool nbp_vlan_find(struct net_bridge_port *port, u16 vid)
685{
686	return false;
687}
688
689static inline u16 br_vlan_get_tag(const struct sk_buff *skb, u16 *tag)
690{
691	return 0;
692}
693static inline u16 br_get_pvid(const struct net_port_vlans *v)
694{
695	return VLAN_N_VID;	/* Returns invalid vid */
696}
697#endif
698
699/* br_netfilter.c */
700#ifdef CONFIG_BRIDGE_NETFILTER
701extern int br_netfilter_init(void);
702extern void br_netfilter_fini(void);
703extern void br_netfilter_rtable_init(struct net_bridge *);
704#else
705#define br_netfilter_init()	(0)
706#define br_netfilter_fini()	do { } while(0)
707#define br_netfilter_rtable_init(x)
708#endif
709
710/* br_stp.c */
711extern void br_log_state(const struct net_bridge_port *p);
712extern struct net_bridge_port *br_get_port(struct net_bridge *br,
713					   u16 port_no);
714extern void br_init_port(struct net_bridge_port *p);
715extern void br_become_designated_port(struct net_bridge_port *p);
716
717extern int br_set_forward_delay(struct net_bridge *br, unsigned long x);
718extern int br_set_hello_time(struct net_bridge *br, unsigned long x);
719extern int br_set_max_age(struct net_bridge *br, unsigned long x);
720
721
722/* br_stp_if.c */
723extern void br_stp_enable_bridge(struct net_bridge *br);
724extern void br_stp_disable_bridge(struct net_bridge *br);
725extern void br_stp_set_enabled(struct net_bridge *br, unsigned long val);
726extern void br_stp_enable_port(struct net_bridge_port *p);
727extern void br_stp_disable_port(struct net_bridge_port *p);
728extern bool br_stp_recalculate_bridge_id(struct net_bridge *br);
729extern void br_stp_change_bridge_id(struct net_bridge *br, const unsigned char *a);
730extern void br_stp_set_bridge_priority(struct net_bridge *br,
731				       u16 newprio);
732extern int br_stp_set_port_priority(struct net_bridge_port *p,
733				    unsigned long newprio);
734extern int br_stp_set_path_cost(struct net_bridge_port *p,
735				unsigned long path_cost);
736extern ssize_t br_show_bridge_id(char *buf, const struct bridge_id *id);
737
738/* br_stp_bpdu.c */
739struct stp_proto;
740extern void br_stp_rcv(const struct stp_proto *proto, struct sk_buff *skb,
741		       struct net_device *dev);
742
743/* br_stp_timer.c */
744extern void br_stp_timer_init(struct net_bridge *br);
745extern void br_stp_port_timer_init(struct net_bridge_port *p);
746extern unsigned long br_timer_value(const struct timer_list *timer);
747
748/* br.c */
749#if IS_ENABLED(CONFIG_ATM_LANE)
750extern int (*br_fdb_test_addr_hook)(struct net_device *dev, unsigned char *addr);
751#endif
752
753/* br_netlink.c */
754extern struct rtnl_link_ops br_link_ops;
755extern int br_netlink_init(void);
756extern void br_netlink_fini(void);
757extern void br_ifinfo_notify(int event, struct net_bridge_port *port);
758extern int br_setlink(struct net_device *dev, struct nlmsghdr *nlmsg);
759extern int br_dellink(struct net_device *dev, struct nlmsghdr *nlmsg);
760extern int br_getlink(struct sk_buff *skb, u32 pid, u32 seq,
761		      struct net_device *dev, u32 filter_mask);
762
763#ifdef CONFIG_SYSFS
764/* br_sysfs_if.c */
765extern const struct sysfs_ops brport_sysfs_ops;
766extern int br_sysfs_addif(struct net_bridge_port *p);
767extern int br_sysfs_renameif(struct net_bridge_port *p);
768
769/* br_sysfs_br.c */
770extern int br_sysfs_addbr(struct net_device *dev);
771extern void br_sysfs_delbr(struct net_device *dev);
772
773#else
774
775static inline int br_sysfs_addif(struct net_bridge_port *p) { return 0; }
776static inline int br_sysfs_renameif(struct net_bridge_port *p) { return 0; }
777static inline int br_sysfs_addbr(struct net_device *dev) { return 0; }
778static inline void br_sysfs_delbr(struct net_device *dev) { return; }
779#endif /* CONFIG_SYSFS */
780
781#endif
782