blob: 6822ef1715936458e40792e68924c1ea2c66292e [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/*
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
22#define BR_HASH_BITS 8
23#define BR_HASH_SIZE (1 << BR_HASH_BITS)
24
25/* edit by shisheng for power saving*/
26/* #define BR_HOLD_TIME (1*HZ) */
27#define BR_HOLD_TIME (5*HZ)
28
29#define BR_PORT_BITS 10
30#define BR_MAX_PORTS (1<<BR_PORT_BITS)
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};
67
68struct net_bridge_fdb_entry
69{
70 struct hlist_node hlist;
71 struct net_bridge_port *dst;
72
73 struct rcu_head rcu;
74 unsigned long updated;
75 unsigned long used;
76 mac_addr addr;
77 unsigned char is_local;
78 unsigned char is_static;
79};
80
81struct net_bridge_port_group {
82 struct net_bridge_port *port;
83 struct net_bridge_port_group __rcu *next;
84 struct hlist_node mglist;
85 struct rcu_head rcu;
86 struct timer_list timer;
87 struct br_ip addr;
88};
89
90struct net_bridge_mdb_entry
91{
92 struct hlist_node hlist[2];
93 struct net_bridge *br;
94 struct net_bridge_port_group __rcu *ports;
95 struct rcu_head rcu;
96 struct timer_list timer;
97 struct br_ip addr;
98 bool mglist;
99};
100
101struct net_bridge_mdb_htable
102{
103 struct hlist_head *mhash;
104 struct rcu_head rcu;
105 struct net_bridge_mdb_htable *old;
106 u32 size;
107 u32 max;
108 u32 secret;
109 u32 ver;
110};
111
112struct net_bridge_port
113{
114 struct net_bridge *br;
115 struct net_device *dev;
116 struct list_head list;
117
118 /* STP */
119 u8 priority;
120 u8 state;
121 u16 port_no;
122 unsigned char topology_change_ack;
123 unsigned char config_pending;
124 port_id port_id;
125 port_id designated_port;
126 bridge_id designated_root;
127 bridge_id designated_bridge;
128 u32 path_cost;
129 u32 designated_cost;
130 unsigned long designated_age;
131
132 struct timer_list forward_delay_timer;
133 struct timer_list hold_timer;
134 struct timer_list message_age_timer;
135 struct kobject kobj;
136 struct rcu_head rcu;
137
138 unsigned long flags;
139#define BR_HAIRPIN_MODE 0x00000001
140
141#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
142 u32 multicast_startup_queries_sent;
143 unsigned char multicast_router;
144 struct timer_list multicast_router_timer;
145 struct timer_list multicast_query_timer;
146 struct hlist_head mglist;
147 struct hlist_node rlist;
148#endif
149
150#ifdef CONFIG_SYSFS
151 char sysfs_name[IFNAMSIZ];
152#endif
153
154#ifdef CONFIG_NET_POLL_CONTROLLER
155 struct netpoll *np;
156#endif
157};
158
159#define br_port_exists(dev) (dev->priv_flags & IFF_BRIDGE_PORT)
160
161static inline struct net_bridge_port *br_port_get_rcu(const struct net_device *dev)
162{
163 struct net_bridge_port *port = rcu_dereference(dev->rx_handler_data);
164 return port; //ͬ²½linux5.7.8ʵÏÖ
165}
166
167static inline struct net_bridge_port *br_port_get_rtnl(struct net_device *dev)
168{
169 return br_port_exists(dev) ?
170 rtnl_dereference(dev->rx_handler_data) : NULL;
171}
172
173struct br_cpu_netstats {
174 u64 rx_packets;
175 u64 rx_bytes;
176 u64 tx_packets;
177 u64 tx_bytes;
178 struct u64_stats_sync syncp;
179};
180
181struct net_bridge
182{
183 spinlock_t lock;
184 struct list_head port_list;
185 struct net_device *dev;
186
187 struct br_cpu_netstats __percpu *stats;
188 spinlock_t hash_lock;
189 struct hlist_head hash[BR_HASH_SIZE];
190#ifdef CONFIG_BRIDGE_NETFILTER
191 struct rtable fake_rtable;
192 bool nf_call_iptables;
193 bool nf_call_ip6tables;
194 bool nf_call_arptables;
195#endif
196 unsigned long flags;
197#define BR_SET_MAC_ADDR 0x00000001
198
199 u16 group_fwd_mask;
200
201 /* STP */
202 bridge_id designated_root;
203 bridge_id bridge_id;
204 u32 root_path_cost;
205 unsigned long max_age;
206 unsigned long hello_time;
207 unsigned long forward_delay;
208 unsigned long bridge_max_age;
209 unsigned long ageing_time;
210 unsigned long bridge_hello_time;
211 unsigned long bridge_forward_delay;
212
213 u8 group_addr[ETH_ALEN];
214 u16 root_port;
215
216 enum {
217 BR_NO_STP, /* no spanning tree */
218 BR_KERNEL_STP, /* old STP in kernel */
219 BR_USER_STP, /* new RSTP in userspace */
220 } stp_enabled;
221
222 unsigned char topology_change;
223 unsigned char topology_change_detected;
224
225#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
226 unsigned char multicast_router;
227
228 u8 multicast_disabled:1;
229
230 u32 hash_elasticity;
231 u32 hash_max;
232
233 u32 multicast_last_member_count;
234 u32 multicast_startup_queries_sent;
235 u32 multicast_startup_query_count;
236
237 unsigned long multicast_last_member_interval;
238 unsigned long multicast_membership_interval;
239 unsigned long multicast_querier_interval;
240 unsigned long multicast_query_interval;
241 unsigned long multicast_query_response_interval;
242 unsigned long multicast_startup_query_interval;
243
244 spinlock_t multicast_lock;
245 struct net_bridge_mdb_htable __rcu *mdb;
246 struct hlist_head router_list;
247
248 struct timer_list multicast_router_timer;
249 struct timer_list multicast_querier_timer;
250 struct timer_list multicast_query_timer;
251#endif
252
253 struct timer_list hello_timer;
254 struct timer_list tcn_timer;
255 struct timer_list topology_change_timer;
256 struct timer_list gc_timer;
257 struct kobject *ifobj;
258};
259
260struct br_input_skb_cb {
261 struct net_device *brdev;
262#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
263 int igmp;
264 int mrouters_only;
265#endif
266};
267
268#define BR_INPUT_SKB_CB(__skb) ((struct br_input_skb_cb *)(__skb)->cb)
269
270#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
271# define BR_INPUT_SKB_CB_MROUTERS_ONLY(__skb) (BR_INPUT_SKB_CB(__skb)->mrouters_only)
272#else
273# define BR_INPUT_SKB_CB_MROUTERS_ONLY(__skb) (0)
274#endif
275
276#define br_printk(level, br, format, args...) \
277 printk(level "%s: " format, (br)->dev->name, ##args)
278
279#define br_err(__br, format, args...) \
280 br_printk(KERN_ERR, __br, format, ##args)
281#define br_warn(__br, format, args...) \
282 br_printk(KERN_WARNING, __br, format, ##args)
283#define br_notice(__br, format, args...) \
284 br_printk(KERN_NOTICE, __br, format, ##args)
285#define br_info(__br, format, args...) \
286 br_printk(KERN_INFO, __br, format, ##args)
287
288#define br_debug(br, format, args...) \
289 pr_debug("%s: " format, (br)->dev->name, ##args)
290
291extern struct notifier_block br_device_notifier;
292extern const u8 br_group_address[ETH_ALEN];
293
294/* called under bridge lock */
295static inline int br_is_root_bridge(const struct net_bridge *br)
296{
297 return !memcmp(&br->bridge_id, &br->designated_root, 8);
298}
299
300/* br_device.c */
301extern void br_dev_setup(struct net_device *dev);
302extern void br_dev_delete(struct net_device *dev, struct list_head *list);
303extern netdev_tx_t br_dev_xmit(struct sk_buff *skb,
304 struct net_device *dev);
305#ifdef CONFIG_NET_POLL_CONTROLLER
306static inline struct netpoll_info *br_netpoll_info(struct net_bridge *br)
307{
308 return br->dev->npinfo;
309}
310
311static inline void br_netpoll_send_skb(const struct net_bridge_port *p,
312 struct sk_buff *skb)
313{
314 struct netpoll *np = p->np;
315
316 if (np)
317 netpoll_send_skb(np, skb);
318}
319
320extern int br_netpoll_enable(struct net_bridge_port *p);
321extern void br_netpoll_disable(struct net_bridge_port *p);
322#else
323static inline struct netpoll_info *br_netpoll_info(struct net_bridge *br)
324{
325 return NULL;
326}
327
328static inline void br_netpoll_send_skb(const struct net_bridge_port *p,
329 struct sk_buff *skb)
330{
331}
332
333static inline int br_netpoll_enable(struct net_bridge_port *p)
334{
335 return 0;
336}
337
338static inline void br_netpoll_disable(struct net_bridge_port *p)
339{
340}
341#endif
342
343/* br_fdb.c */
344extern int br_fdb_init(void);
345extern void br_fdb_fini(void);
346extern void br_fdb_flush(struct net_bridge *br);
347extern void br_fdb_changeaddr(struct net_bridge_port *p,
348 const unsigned char *newaddr);
349extern void br_fdb_change_mac_address(struct net_bridge *br, const u8 *newaddr);
350extern void br_fdb_cleanup(unsigned long arg);
351extern void br_fdb_delete_by_port(struct net_bridge *br,
352 const struct net_bridge_port *p, int do_all);
353extern struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br,
354 const unsigned char *addr);
355extern int br_fdb_test_addr(struct net_device *dev, unsigned char *addr);
356extern int br_fdb_fillbuf(struct net_bridge *br, void *buf,
357 unsigned long count, unsigned long off);
358extern int br_fdb_insert(struct net_bridge *br,
359 struct net_bridge_port *source,
360 const unsigned char *addr);
361extern void br_fdb_update(struct net_bridge *br,
362 struct net_bridge_port *source,
363 const unsigned char *addr);
364extern int br_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb);
365extern int br_fdb_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg);
366extern int br_fdb_delete(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg);
367
368/* br_forward.c */
369extern void br_deliver(const struct net_bridge_port *to,
370 struct sk_buff *skb);
371extern int br_dev_queue_push_xmit(struct sk_buff *skb);
372extern void br_forward(const struct net_bridge_port *to,
373 struct sk_buff *skb, struct sk_buff *skb0);
374extern int br_forward_finish(struct sk_buff *skb);
375extern void br_flood_deliver(struct net_bridge *br, struct sk_buff *skb);
376extern void br_flood_forward(struct net_bridge *br, struct sk_buff *skb,
377 struct sk_buff *skb2);
378
379/* br_if.c */
380extern void br_port_carrier_check(struct net_bridge_port *p);
381extern int br_add_bridge(struct net *net, const char *name);
382extern int br_del_bridge(struct net *net, const char *name);
383extern void br_net_exit(struct net *net);
384extern int br_add_if(struct net_bridge *br,
385 struct net_device *dev);
386extern int br_del_if(struct net_bridge *br,
387 struct net_device *dev);
388extern int br_min_mtu(const struct net_bridge *br);
389extern netdev_features_t br_features_recompute(struct net_bridge *br,
390 netdev_features_t features);
391
392/* br_input.c */
393extern int br_handle_frame_finish(struct sk_buff *skb);
394extern rx_handler_result_t br_handle_frame(struct sk_buff **pskb);
395
396/* br_ioctl.c */
397extern int br_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
398extern int br_ioctl_deviceless_stub(struct net *net, unsigned int cmd, void __user *arg);
399
400/* br_multicast.c */
401#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
402extern int br_multicast_rcv(struct net_bridge *br,
403 struct net_bridge_port *port,
404 struct sk_buff *skb);
405extern struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
406 struct sk_buff *skb);
407extern void br_multicast_add_port(struct net_bridge_port *port);
408extern void br_multicast_del_port(struct net_bridge_port *port);
409extern void br_multicast_enable_port(struct net_bridge_port *port);
410extern void br_multicast_disable_port(struct net_bridge_port *port);
411extern void br_multicast_init(struct net_bridge *br);
412extern void br_multicast_open(struct net_bridge *br);
413extern void br_multicast_stop(struct net_bridge *br);
414extern void br_multicast_deliver(struct net_bridge_mdb_entry *mdst,
415 struct sk_buff *skb);
416extern void br_multicast_forward(struct net_bridge_mdb_entry *mdst,
417 struct sk_buff *skb, struct sk_buff *skb2);
418extern int br_multicast_set_router(struct net_bridge *br, unsigned long val);
419extern int br_multicast_set_port_router(struct net_bridge_port *p,
420 unsigned long val);
421extern int br_multicast_toggle(struct net_bridge *br, unsigned long val);
422extern int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val);
423
424static inline bool br_multicast_is_router(struct net_bridge *br)
425{
426 return br->multicast_router == 2 ||
427 (br->multicast_router == 1 &&
428 timer_pending(&br->multicast_router_timer));
429}
430#else
431static inline int br_multicast_rcv(struct net_bridge *br,
432 struct net_bridge_port *port,
433 struct sk_buff *skb)
434{
435 return 0;
436}
437
438static inline struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
439 struct sk_buff *skb)
440{
441 return NULL;
442}
443
444static inline void br_multicast_add_port(struct net_bridge_port *port)
445{
446}
447
448static inline void br_multicast_del_port(struct net_bridge_port *port)
449{
450}
451
452static inline void br_multicast_enable_port(struct net_bridge_port *port)
453{
454}
455
456static inline void br_multicast_disable_port(struct net_bridge_port *port)
457{
458}
459
460static inline void br_multicast_init(struct net_bridge *br)
461{
462}
463
464static inline void br_multicast_open(struct net_bridge *br)
465{
466}
467
468static inline void br_multicast_stop(struct net_bridge *br)
469{
470}
471
472static inline void br_multicast_deliver(struct net_bridge_mdb_entry *mdst,
473 struct sk_buff *skb)
474{
475}
476
477static inline void br_multicast_forward(struct net_bridge_mdb_entry *mdst,
478 struct sk_buff *skb,
479 struct sk_buff *skb2)
480{
481}
482static inline bool br_multicast_is_router(struct net_bridge *br)
483{
484 return 0;
485}
486#endif
487
488/* br_netfilter.c */
489#ifdef CONFIG_BRIDGE_NETFILTER
490extern int br_netfilter_init(void);
491extern void br_netfilter_fini(void);
492extern void br_netfilter_rtable_init(struct net_bridge *);
493#else
494#define br_netfilter_init() (0)
495#define br_netfilter_fini() do { } while(0)
496#define br_netfilter_rtable_init(x)
497#endif
498
499/* br_stp.c */
500extern void br_log_state(const struct net_bridge_port *p);
501extern struct net_bridge_port *br_get_port(struct net_bridge *br,
502 u16 port_no);
503extern void br_init_port(struct net_bridge_port *p);
504extern void br_become_designated_port(struct net_bridge_port *p);
505
506extern void __br_set_forward_delay(struct net_bridge *br, unsigned long t);
507extern int br_set_forward_delay(struct net_bridge *br, unsigned long x);
508extern int br_set_hello_time(struct net_bridge *br, unsigned long x);
509extern int br_set_max_age(struct net_bridge *br, unsigned long x);
510
511
512/* br_stp_if.c */
513extern void br_stp_enable_bridge(struct net_bridge *br);
514extern void br_stp_disable_bridge(struct net_bridge *br);
515extern void br_stp_set_enabled(struct net_bridge *br, unsigned long val);
516extern void br_stp_enable_port(struct net_bridge_port *p);
517extern void br_stp_disable_port(struct net_bridge_port *p);
518extern bool br_stp_recalculate_bridge_id(struct net_bridge *br);
519extern void br_stp_change_bridge_id(struct net_bridge *br, const unsigned char *a);
520extern void br_stp_set_bridge_priority(struct net_bridge *br,
521 u16 newprio);
522extern int br_stp_set_port_priority(struct net_bridge_port *p,
523 unsigned long newprio);
524extern int br_stp_set_path_cost(struct net_bridge_port *p,
525 unsigned long path_cost);
526extern ssize_t br_show_bridge_id(char *buf, const struct bridge_id *id);
527
528/* br_stp_bpdu.c */
529struct stp_proto;
530extern void br_stp_rcv(const struct stp_proto *proto, struct sk_buff *skb,
531 struct net_device *dev);
532
533/* br_stp_timer.c */
534extern void br_stp_timer_init(struct net_bridge *br);
535extern void br_stp_port_timer_init(struct net_bridge_port *p);
536extern unsigned long br_timer_value(const struct timer_list *timer);
537
538/* br.c */
539#if IS_ENABLED(CONFIG_ATM_LANE)
540extern int (*br_fdb_test_addr_hook)(struct net_device *dev, unsigned char *addr);
541#endif
542
543/* br_netlink.c */
544extern struct rtnl_link_ops br_link_ops;
545extern int br_netlink_init(void);
546extern void br_netlink_fini(void);
547extern void br_ifinfo_notify(int event, struct net_bridge_port *port);
548
549#ifdef CONFIG_SYSFS
550/* br_sysfs_if.c */
551extern const struct sysfs_ops brport_sysfs_ops;
552extern int br_sysfs_addif(struct net_bridge_port *p);
553extern int br_sysfs_renameif(struct net_bridge_port *p);
554
555/* br_sysfs_br.c */
556extern int br_sysfs_addbr(struct net_device *dev);
557extern void br_sysfs_delbr(struct net_device *dev);
558
559#else
560
561#define br_sysfs_addif(p) (0)
562#define br_sysfs_renameif(p) (0)
563#define br_sysfs_addbr(dev) (0)
564#define br_sysfs_delbr(dev) do { } while(0)
565#endif /* CONFIG_SYSFS */
566
567#endif