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