Blame view

net/bridge/br_private.h 31 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>
efb6de9b4   Bernhard Thaler   netfilter: bridge...
21
  #include <net/ip6_fib.h>
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
22
  #include <linux/if_vlan.h>
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
23
  #include <linux/rhashtable.h>
251277598   Reshetova, Elena   net, bridge: conv...
24
  #include <linux/refcount.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
27
28
29
30
31
32
  
  #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)
9cde07087   Stephen Hemminger   bridge: add suppo...
33
  #define BR_VERSION	"2.3"
515853cce   stephen hemminger   bridge: allow for...
34
35
  /* Control of forwarding link local multicast */
  #define BR_GROUPFWD_DEFAULT	0
784b58a32   Bernhard Thaler   bridge: change BR...
36
37
  /* Don't allow forwarding of control protocols like STP, MAC PAUSE and LACP */
  #define BR_GROUPFWD_RESTRICTED	0x0007u
f2808d226   Toshiaki Makita   bridge: Prepare f...
38
39
  /* The Nearest Customer Bridge Group Address, 01-80-C2-00-00-[00,0B,0C,0D,0F] */
  #define BR_GROUPFWD_8021AD	0xB801u
515853cce   stephen hemminger   bridge: allow for...
40

9cde07087   Stephen Hemminger   bridge: add suppo...
41
42
  /* Path to usermode spanning tree program */
  #define BR_STP_PROG	"/sbin/bridge-stp"
8cbb512e5   Stephen Hemminger   [BRIDGE]: add ver...
43

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
45
46
47
48
49
50
  typedef struct bridge_id bridge_id;
  typedef struct mac_addr mac_addr;
  typedef __u16 port_id;
  
  struct bridge_id
  {
  	unsigned char	prio[2];
e5a727f66   Joe Perches   bridge: Use ether...
51
  	unsigned char	addr[ETH_ALEN];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
54
55
  };
  
  struct mac_addr
  {
e5a727f66   Joe Perches   bridge: Use ether...
56
  	unsigned char	addr[ETH_ALEN];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
  };
cc0fdd802   Linus Lüssing   bridge: separate ...
58
59
  #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
  /* our own querier */
90010b36e   Linus Lüssing   bridge: rename st...
60
  struct bridge_mcast_own_query {
cc0fdd802   Linus Lüssing   bridge: separate ...
61
62
63
64
65
  	struct timer_list	timer;
  	u32			startup_sent;
  };
  
  /* other querier */
90010b36e   Linus Lüssing   bridge: rename st...
66
  struct bridge_mcast_other_query {
cc0fdd802   Linus Lüssing   bridge: separate ...
67
68
69
  	struct timer_list		timer;
  	unsigned long			delay_time;
  };
dc4eb53a9   Linus Lüssing   bridge: adhere to...
70
71
72
73
  
  /* selected querier */
  struct bridge_mcast_querier {
  	struct br_ip addr;
2cd414319   Linus Lüssing   bridge: memorize ...
74
  	struct net_bridge_port __rcu	*port;
dc4eb53a9   Linus Lüssing   bridge: adhere to...
75
  };
1080ab95e   Nikolay Aleksandrov   net: bridge: add ...
76
77
78
79
80
81
  
  /* IGMP/MLD statistics */
  struct bridge_mcast_stats {
  	struct br_mcast_stats mstats;
  	struct u64_stats_sync syncp;
  };
cc0fdd802   Linus Lüssing   bridge: separate ...
82
  #endif
6dada9b10   Nikolay Aleksandrov   bridge: vlan: lea...
83
84
85
86
87
88
89
  struct br_vlan_stats {
  	u64 rx_bytes;
  	u64 rx_packets;
  	u64 tx_bytes;
  	u64 tx_packets;
  	struct u64_stats_sync syncp;
  };
efa5356b0   Roopa Prabhu   bridge: per vlan ...
90
91
92
93
  struct br_tunnel_info {
  	__be64			tunnel_id;
  	struct metadata_dst	*tunnel_dst;
  };
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
94
95
96
97
98
99
  /**
   * struct net_bridge_vlan - per-vlan entry
   *
   * @vnode: rhashtable member
   * @vid: VLAN id
   * @flags: bridge vlan flags
6dada9b10   Nikolay Aleksandrov   bridge: vlan: lea...
100
   * @stats: per-cpu VLAN statistics
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
   * @br: if MASTER flag set, this points to a bridge struct
   * @port: if MASTER flag unset, this points to a port struct
   * @refcnt: if MASTER flag set, this is bumped for each port referencing it
   * @brvlan: if MASTER flag unset, this points to the global per-VLAN context
   *          for this VLAN entry
   * @vlist: sorted list of VLAN entries
   * @rcu: used for entry destruction
   *
   * This structure is shared between the global per-VLAN entries contained in
   * the bridge rhashtable and the local per-port per-VLAN entries contained in
   * the port's rhashtable. The union entries should be interpreted depending on
   * the entry flags that are set.
   */
  struct net_bridge_vlan {
  	struct rhash_head		vnode;
efa5356b0   Roopa Prabhu   bridge: per vlan ...
116
  	struct rhash_head		tnode;
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
117
118
  	u16				vid;
  	u16				flags;
6dada9b10   Nikolay Aleksandrov   bridge: vlan: lea...
119
  	struct br_vlan_stats __percpu	*stats;
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
120
  	union {
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
121
122
123
124
  		struct net_bridge	*br;
  		struct net_bridge_port	*port;
  	};
  	union {
251277598   Reshetova, Elena   net, bridge: conv...
125
  		refcount_t		refcnt;
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
126
127
  		struct net_bridge_vlan	*brvlan;
  	};
efa5356b0   Roopa Prabhu   bridge: per vlan ...
128
129
  
  	struct br_tunnel_info		tinfo;
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
130
  	struct list_head		vlist;
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
131
  	struct rcu_head			rcu;
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
132
133
134
135
136
137
138
139
  };
  
  /**
   * struct net_bridge_vlan_group
   *
   * @vlan_hash: VLAN entry rhashtable
   * @vlan_list: sorted VLAN entry list
   * @num_vlans: number of total VLAN entries
77751ee8a   Nikolay Aleksandrov   bridge: vlan: mov...
140
   * @pvid: PVID VLAN id
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
141
142
143
144
145
146
147
148
149
   *
   * IMPORTANT: Be careful when checking if there're VLAN entries using list
   *            primitives because the bridge can have entries in its list which
   *            are just for global context but not for filtering, i.e. they have
   *            the master flag set but not the brentry flag. If you have to check
   *            if there're "real" entries in the bridge please test @num_vlans
   */
  struct net_bridge_vlan_group {
  	struct rhashtable		vlan_hash;
efa5356b0   Roopa Prabhu   bridge: per vlan ...
150
  	struct rhashtable		tunnel_hash;
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
151
  	struct list_head		vlan_list;
6cbdceeb1   Vlad Yasevich   bridge: Dump vlan...
152
  	u16				num_vlans;
77751ee8a   Nikolay Aleksandrov   bridge: vlan: mov...
153
  	u16				pvid;
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
154
  };
1214628cb   Nikolay Aleksandrov   bridge: move writ...
155
  struct net_bridge_fdb_entry {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
156
157
  	struct hlist_node		hlist;
  	struct net_bridge_port		*dst;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
158
  	mac_addr			addr;
b22fbf22f   Nikolay Aleksandrov   bridge: fdb: rear...
159
  	__u16				vlan_id;
93859b13f   Jiri Pirko   bridge: convert f...
160
161
  	unsigned char			is_local:1,
  					is_static:1,
cf6b8e1ee   Scott Feldman   bridge: add API t...
162
  					added_by_user:1,
9fe8bcec0   Arkadi Sharshevsky   net: bridge: Rece...
163
164
  					added_by_external_learn:1,
  					offloaded:1;
1214628cb   Nikolay Aleksandrov   bridge: move writ...
165
166
167
168
  
  	/* write-heavy members should not affect lookups */
  	unsigned long			updated ____cacheline_aligned_in_smp;
  	unsigned long			used;
b22fbf22f   Nikolay Aleksandrov   bridge: fdb: rear...
169
  	struct rcu_head			rcu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
170
  };
9d06b6d8a   Elad Raz   bridge: mdb: Sepa...
171
172
  #define MDB_PG_FLAGS_PERMANENT	BIT(0)
  #define MDB_PG_FLAGS_OFFLOAD	BIT(1)
eb1d16414   Herbert Xu   bridge: Add core ...
173
174
  struct net_bridge_port_group {
  	struct net_bridge_port		*port;
e80516880   Eric Dumazet   bridge: add RCU a...
175
  	struct net_bridge_port_group __rcu *next;
eb1d16414   Herbert Xu   bridge: Add core ...
176
177
178
  	struct hlist_node		mglist;
  	struct rcu_head			rcu;
  	struct timer_list		timer;
8ef2a9a59   YOSHIFUJI Hideaki   bridge br_multica...
179
  	struct br_ip			addr;
9d06b6d8a   Elad Raz   bridge: mdb: Sepa...
180
  	unsigned char			flags;
6db6f0eae   Felix Fietkau   bridge: multicast...
181
  	unsigned char			eth_addr[ETH_ALEN];
eb1d16414   Herbert Xu   bridge: Add core ...
182
183
184
185
186
  };
  
  struct net_bridge_mdb_entry
  {
  	struct hlist_node		hlist[2];
eb1d16414   Herbert Xu   bridge: Add core ...
187
  	struct net_bridge		*br;
e80516880   Eric Dumazet   bridge: add RCU a...
188
  	struct net_bridge_port_group __rcu *ports;
eb1d16414   Herbert Xu   bridge: Add core ...
189
190
  	struct rcu_head			rcu;
  	struct timer_list		timer;
8ef2a9a59   YOSHIFUJI Hideaki   bridge br_multica...
191
  	struct br_ip			addr;
8a870178c   Herbert Xu   bridge: Replace m...
192
  	bool				mglist;
eb1d16414   Herbert Xu   bridge: Add core ...
193
194
195
196
197
198
199
200
201
202
203
204
  };
  
  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;
  };
1f90c7f34   Nikolay Aleksandrov   bridge: modify br...
205
  struct net_bridge_port {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
207
208
  	struct net_bridge		*br;
  	struct net_device		*dev;
  	struct list_head		list;
1f90c7f34   Nikolay Aleksandrov   bridge: modify br...
209
210
211
212
  	unsigned long			flags;
  #ifdef CONFIG_BRIDGE_VLAN_FILTERING
  	struct net_bridge_vlan_group	__rcu *vlgrp;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
213
214
215
216
217
218
219
220
221
222
223
224
  	/* 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...
225
  	unsigned long			designated_age;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
226
227
228
229
230
231
  
  	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 '...
232

eb1d16414   Herbert Xu   bridge: Add core ...
233
  #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
90010b36e   Linus Lüssing   bridge: rename st...
234
  	struct bridge_mcast_own_query	ip4_own_query;
cc0fdd802   Linus Lüssing   bridge: separate ...
235
  #if IS_ENABLED(CONFIG_IPV6)
90010b36e   Linus Lüssing   bridge: rename st...
236
  	struct bridge_mcast_own_query	ip6_own_query;
cc0fdd802   Linus Lüssing   bridge: separate ...
237
  #endif /* IS_ENABLED(CONFIG_IPV6) */
eb1d16414   Herbert Xu   bridge: Add core ...
238
  	unsigned char			multicast_router;
1080ab95e   Nikolay Aleksandrov   net: bridge: add ...
239
  	struct bridge_mcast_stats	__percpu *mcast_stats;
eb1d16414   Herbert Xu   bridge: Add core ...
240
  	struct timer_list		multicast_router_timer;
eb1d16414   Herbert Xu   bridge: Add core ...
241
242
243
  	struct hlist_head		mglist;
  	struct hlist_node		rlist;
  #endif
e0f43752a   Simon Arlott   bridge: update sy...
244
245
246
247
  
  #ifdef CONFIG_SYSFS
  	char				sysfs_name[IFNAMSIZ];
  #endif
91d2c34a4   Herbert Xu   bridge: Fix netpo...
248
249
250
251
  
  #ifdef CONFIG_NET_POLL_CONTROLLER
  	struct netpoll			*np;
  #endif
6bc506b4f   Ido Schimmel   bridge: switchdev...
252
253
254
  #ifdef CONFIG_NET_SWITCHDEV
  	int				offload_fwd_mark;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255
  };
e028e4b8d   Vlad Yasevich   bridge: Keep trac...
256
  #define br_auto_port(p) ((p)->flags & BR_AUTO_MASK)
f3a6ddf15   Vlad Yasevich   bridge: Introduce...
257
  #define br_promisc_port(p) ((p)->flags & BR_PROMISC)
e028e4b8d   Vlad Yasevich   bridge: Keep trac...
258

f350a0a87   Jiri Pirko   bridge: use rx_ha...
259
  #define br_port_exists(dev) (dev->priv_flags & IFF_BRIDGE_PORT)
b5ed54e94   stephen hemminger   bridge: fix RCU r...
260
261
  static inline struct net_bridge_port *br_port_get_rcu(const struct net_device *dev)
  {
716ec052d   Hong Zhiguo   bridge: fix NULL ...
262
  	return rcu_dereference(dev->rx_handler_data);
b5ed54e94   stephen hemminger   bridge: fix RCU r...
263
  }
1fb1754a8   Hong Zhiguo   bridge: use br_po...
264
  static inline struct net_bridge_port *br_port_get_rtnl(const struct net_device *dev)
b5ed54e94   stephen hemminger   bridge: fix RCU r...
265
  {
ec1e5610c   Eric Dumazet   bridge: add RCU a...
266
267
  	return br_port_exists(dev) ?
  		rtnl_dereference(dev->rx_handler_data) : NULL;
b5ed54e94   stephen hemminger   bridge: fix RCU r...
268
  }
0baa10fff   Arkadi Sharshevsky   net: bridge: Add ...
269
270
271
272
273
  static inline struct net_bridge_port *br_port_get_rtnl_rcu(const struct net_device *dev)
  {
  	return br_port_exists(dev) ?
  		rcu_dereference_rtnl(dev->rx_handler_data) : NULL;
  }
1f90c7f34   Nikolay Aleksandrov   bridge: modify br...
274
  struct net_bridge {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
275
  	spinlock_t			lock;
1f90c7f34   Nikolay Aleksandrov   bridge: modify br...
276
  	spinlock_t			hash_lock;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
277
278
  	struct list_head		port_list;
  	struct net_device		*dev;
8f84985fe   Li RongQing   net: unify the pc...
279
  	struct pcpu_sw_netstats		__percpu *stats;
1f90c7f34   Nikolay Aleksandrov   bridge: modify br...
280
281
282
283
284
285
286
287
  	/* These fields are accessed on each packet */
  #ifdef CONFIG_BRIDGE_VLAN_FILTERING
  	u8				vlan_enabled;
  	u8				vlan_stats_enabled;
  	__be16				vlan_proto;
  	u16				default_pvid;
  	struct net_bridge_vlan_group	__rcu *vlgrp;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
288
  	struct hlist_head		hash[BR_HASH_SIZE];
34666d467   Pablo Neira Ayuso   netfilter: bridge...
289
  #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
efb6de9b4   Bernhard Thaler   netfilter: bridge...
290
291
292
293
  	union {
  		struct rtable		fake_rtable;
  		struct rt6_info		fake_rt6_info;
  	};
4df53d8ba   Patrick McHardy   bridge: add per b...
294
295
296
  	bool				nf_call_iptables;
  	bool				nf_call_ip6tables;
  	bool				nf_call_arptables;
4adf0af68   Simon Wunderlich   bridge: send corr...
297
  #endif
515853cce   stephen hemminger   bridge: allow for...
298
  	u16				group_fwd_mask;
f2808d226   Toshiaki Makita   bridge: Prepare f...
299
  	u16				group_fwd_mask_required;
515853cce   stephen hemminger   bridge: allow for...
300

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
301
302
303
304
  	/* STP */
  	bridge_id			designated_root;
  	bridge_id			bridge_id;
  	u32				root_path_cost;
1f90c7f34   Nikolay Aleksandrov   bridge: modify br...
305
306
307
  	unsigned char			topology_change;
  	unsigned char			topology_change_detected;
  	u16				root_port;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
308
309
310
  	unsigned long			max_age;
  	unsigned long			hello_time;
  	unsigned long			forward_delay;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
311
  	unsigned long			ageing_time;
34d8acd8a   Vivien Didelot   net: bridge: shor...
312
  	unsigned long			bridge_max_age;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
313
314
  	unsigned long			bridge_hello_time;
  	unsigned long			bridge_forward_delay;
34d8acd8a   Vivien Didelot   net: bridge: shor...
315
  	unsigned long			bridge_ageing_time;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316

fda93d92d   Stephen Hemminger   [BRIDGE]: allow s...
317
  	u8				group_addr[ETH_ALEN];
204177f3f   Toshiaki Makita   bridge: Support 8...
318
  	bool				group_addr_set;
9cde07087   Stephen Hemminger   bridge: add suppo...
319
320
321
322
323
324
  
  	enum {
  		BR_NO_STP, 		/* no spanning tree */
  		BR_KERNEL_STP,		/* old STP in kernel */
  		BR_USER_STP,		/* new RSTP in userspace */
  	} stp_enabled;
eb1d16414   Herbert Xu   bridge: Add core ...
325
326
327
328
  #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
  	unsigned char			multicast_router;
  
  	u8				multicast_disabled:1;
c5c232605   Herbert Xu   bridge: Add multi...
329
  	u8				multicast_querier:1;
1c8ad5bfa   Cong Wang   bridge: use the b...
330
  	u8				multicast_query_use_ifaddr:1;
0888d5f3c   Daniel   Bridge: Fix ipv6 ...
331
  	u8				has_ipv6_addr:1;
1080ab95e   Nikolay Aleksandrov   net: bridge: add ...
332
  	u8				multicast_stats_enabled:1;
eb1d16414   Herbert Xu   bridge: Add core ...
333
334
335
336
337
  
  	u32				hash_elasticity;
  	u32				hash_max;
  
  	u32				multicast_last_member_count;
eb1d16414   Herbert Xu   bridge: Add core ...
338
  	u32				multicast_startup_query_count;
5e9235853   Nikolay Aleksandrov   bridge: mcast: ad...
339
  	u8				multicast_igmp_version;
eb1d16414   Herbert Xu   bridge: Add core ...
340
341
342
343
344
345
346
347
  	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...
348
  	struct net_bridge_mdb_htable __rcu *mdb;
eb1d16414   Herbert Xu   bridge: Add core ...
349
  	struct hlist_head		router_list;
eb1d16414   Herbert Xu   bridge: Add core ...
350
351
  
  	struct timer_list		multicast_router_timer;
90010b36e   Linus Lüssing   bridge: rename st...
352
353
  	struct bridge_mcast_other_query	ip4_other_query;
  	struct bridge_mcast_own_query	ip4_own_query;
dc4eb53a9   Linus Lüssing   bridge: adhere to...
354
  	struct bridge_mcast_querier	ip4_querier;
1080ab95e   Nikolay Aleksandrov   net: bridge: add ...
355
  	struct bridge_mcast_stats	__percpu *mcast_stats;
cc0fdd802   Linus Lüssing   bridge: separate ...
356
  #if IS_ENABLED(CONFIG_IPV6)
90010b36e   Linus Lüssing   bridge: rename st...
357
358
  	struct bridge_mcast_other_query	ip6_other_query;
  	struct bridge_mcast_own_query	ip6_own_query;
dc4eb53a9   Linus Lüssing   bridge: adhere to...
359
  	struct bridge_mcast_querier	ip6_querier;
aa2ae3e71   Nikolay Aleksandrov   bridge: mcast: ad...
360
  	u8				multicast_mld_version;
cc0fdd802   Linus Lüssing   bridge: separate ...
361
  #endif /* IS_ENABLED(CONFIG_IPV6) */
eb1d16414   Herbert Xu   bridge: Add core ...
362
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
363
364
365
  	struct timer_list		hello_timer;
  	struct timer_list		tcn_timer;
  	struct timer_list		topology_change_timer;
f7cdee8a7   Nikolay Aleksandrov   bridge: move to w...
366
  	struct delayed_work		gc_work;
43b98c4a6   Greg Kroah-Hartman   Kobject: change n...
367
  	struct kobject			*ifobj;
e028e4b8d   Vlad Yasevich   bridge: Keep trac...
368
  	u32				auto_cnt;
6bc506b4f   Ido Schimmel   bridge: switchdev...
369
370
371
372
  
  #ifdef CONFIG_NET_SWITCHDEV
  	int offload_fwd_mark;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
373
  };
68b7c895b   Herbert Xu   bridge: Allow tai...
374
375
  struct br_input_skb_cb {
  	struct net_device *brdev;
93fdd47e5   Herbert Xu   bridge: Save frag...
376

32dec5dd0   YOSHIFUJI Hideaki / 吉藤英明   bridge br_multica...
377
  #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
eb1d16414   Herbert Xu   bridge: Add core ...
378
379
  	int igmp;
  	int mrouters_only;
32dec5dd0   YOSHIFUJI Hideaki / 吉藤英明   bridge br_multica...
380
  #endif
93fdd47e5   Herbert Xu   bridge: Save frag...
381

842a9ae08   Jouni Malinen   bridge: Extend Pr...
382
  	bool proxyarp_replied;
93fdd47e5   Herbert Xu   bridge: Save frag...
383

20adfa1a8   Vlad Yasevich   bridge: Check if ...
384
385
386
  #ifdef CONFIG_BRIDGE_VLAN_FILTERING
  	bool vlan_filtered;
  #endif
6bc506b4f   Ido Schimmel   bridge: switchdev...
387
388
389
390
  
  #ifdef CONFIG_NET_SWITCHDEV
  	int offload_fwd_mark;
  #endif
68b7c895b   Herbert Xu   bridge: Allow tai...
391
392
393
  };
  
  #define BR_INPUT_SKB_CB(__skb)	((struct br_input_skb_cb *)(__skb)->cb)
32dec5dd0   YOSHIFUJI Hideaki / 吉藤英明   bridge br_multica...
394
395
396
397
398
  #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...
399
400
401
402
403
404
405
406
407
408
409
410
411
412
  #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
413
414
415
416
417
  /* 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);
  }
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
418
419
420
421
422
423
424
425
426
427
428
  /* check if a VLAN entry is global */
  static inline bool br_vlan_is_master(const struct net_bridge_vlan *v)
  {
  	return v->flags & BRIDGE_VLAN_INFO_MASTER;
  }
  
  /* check if a VLAN entry is used by the bridge */
  static inline bool br_vlan_is_brentry(const struct net_bridge_vlan *v)
  {
  	return v->flags & BRIDGE_VLAN_INFO_BRENTRY;
  }
6be144f62   Nikolay Aleksandrov   bridge: vlan: use...
429
  /* check if we should use the vlan entry, returns false if it's only context */
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
430
431
432
433
434
435
436
437
438
439
440
  static inline bool br_vlan_should_use(const struct net_bridge_vlan *v)
  {
  	if (br_vlan_is_master(v)) {
  		if (br_vlan_is_brentry(v))
  			return true;
  		else
  			return false;
  	}
  
  	return true;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
441
  /* br_device.c */
348662a14   Joe Perches   net: 8021q/blueto...
442
443
444
  void br_dev_setup(struct net_device *dev);
  void br_dev_delete(struct net_device *dev, struct list_head *list);
  netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev);
cfb478da7   stephen hemminger   bridge: netpoll c...
445
  #ifdef CONFIG_NET_POLL_CONTROLLER
91d2c34a4   Herbert Xu   bridge: Fix netpo...
446
447
448
449
450
451
452
453
  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);
  }
a8779ec1c   Eric W. Biederman   netpoll: Remove g...
454
  int br_netpoll_enable(struct net_bridge_port *p);
348662a14   Joe Perches   net: 8021q/blueto...
455
  void br_netpoll_disable(struct net_bridge_port *p);
cfb478da7   stephen hemminger   bridge: netpoll c...
456
  #else
9f70b0fce   Herbert Xu   bridge: Add const...
457
  static inline void br_netpoll_send_skb(const struct net_bridge_port *p,
91d2c34a4   Herbert Xu   bridge: Fix netpo...
458
459
460
  				       struct sk_buff *skb)
  {
  }
cfb478da7   stephen hemminger   bridge: netpoll c...
461

a8779ec1c   Eric W. Biederman   netpoll: Remove g...
462
  static inline int br_netpoll_enable(struct net_bridge_port *p)
91d2c34a4   Herbert Xu   bridge: Fix netpo...
463
464
465
466
467
468
469
  {
  	return 0;
  }
  
  static inline void br_netpoll_disable(struct net_bridge_port *p)
  {
  }
cfb478da7   stephen hemminger   bridge: netpoll c...
470
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
471
472
  
  /* br_fdb.c */
348662a14   Joe Perches   net: 8021q/blueto...
473
474
475
  int br_fdb_init(void);
  void br_fdb_fini(void);
  void br_fdb_flush(struct net_bridge *br);
424bb9c97   Toshiaki Makita   bridge: Properly ...
476
477
478
  void br_fdb_find_delete_local(struct net_bridge *br,
  			      const struct net_bridge_port *p,
  			      const unsigned char *addr, u16 vid);
348662a14   Joe Perches   net: 8021q/blueto...
479
480
  void br_fdb_changeaddr(struct net_bridge_port *p, const unsigned char *newaddr);
  void br_fdb_change_mac_address(struct net_bridge *br, const u8 *newaddr);
f7cdee8a7   Nikolay Aleksandrov   bridge: move to w...
481
  void br_fdb_cleanup(struct work_struct *work);
348662a14   Joe Perches   net: 8021q/blueto...
482
  void br_fdb_delete_by_port(struct net_bridge *br,
1ea2d020b   Nikolay Aleksandrov   bridge: vlan: flu...
483
  			   const struct net_bridge_port *p, u16 vid, int do_all);
bfd0aeac5   Nikolay Aleksandrov   bridge: fdb: conv...
484
485
486
  struct net_bridge_fdb_entry *br_fdb_find_rcu(struct net_bridge *br,
  					     const unsigned char *addr,
  					     __u16 vid);
348662a14   Joe Perches   net: 8021q/blueto...
487
488
489
490
491
492
  int br_fdb_test_addr(struct net_device *dev, unsigned char *addr);
  int br_fdb_fillbuf(struct net_bridge *br, void *buf, unsigned long count,
  		   unsigned long off);
  int br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source,
  		  const unsigned char *addr, u16 vid);
  void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,
a5642ab47   Toshiaki Makita   bridge: Fix the w...
493
  		   const unsigned char *addr, u16 vid, bool added_by_user);
348662a14   Joe Perches   net: 8021q/blueto...
494
495
  
  int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
f6f6424ba   Jiri Pirko   net: make vid as ...
496
  		  struct net_device *dev, const unsigned char *addr, u16 vid);
348662a14   Joe Perches   net: 8021q/blueto...
497
  int br_fdb_add(struct ndmsg *nlh, struct nlattr *tb[], struct net_device *dev,
f6f6424ba   Jiri Pirko   net: make vid as ...
498
  	       const unsigned char *addr, u16 vid, u16 nlh_flags);
348662a14   Joe Perches   net: 8021q/blueto...
499
  int br_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
d297653dd   Roopa Prabhu   rtnetlink: fdb du...
500
  		struct net_device *dev, struct net_device *fdev, int *idx);
8db24af71   Vlad Yasevich   bridge: Add funct...
501
502
  int br_fdb_sync_static(struct net_bridge *br, struct net_bridge_port *p);
  void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p);
3aeb66176   Jiri Pirko   net: replace br_f...
503
504
505
506
  int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p,
  			      const unsigned char *addr, u16 vid);
  int br_fdb_external_learn_del(struct net_bridge *br, struct net_bridge_port *p,
  			      const unsigned char *addr, u16 vid);
9fe8bcec0   Arkadi Sharshevsky   net: bridge: Rece...
507
508
  void br_fdb_offloaded_set(struct net_bridge *br, struct net_bridge_port *p,
  			  const unsigned char *addr, u16 vid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
509
510
  
  /* br_forward.c */
8addd5e7d   Nikolay Aleksandrov   net: bridge: chan...
511
512
513
514
515
  enum br_pkt_type {
  	BR_PKT_UNICAST,
  	BR_PKT_MULTICAST,
  	BR_PKT_BROADCAST
  };
0c4b51f00   Eric W. Biederman   netfilter: Pass n...
516
  int br_dev_queue_push_xmit(struct net *net, struct sock *sk, struct sk_buff *skb);
b35c5f632   Nikolay Aleksandrov   net: bridge: drop...
517
  void br_forward(const struct net_bridge_port *to, struct sk_buff *skb,
37b090e6b   Nikolay Aleksandrov   net: bridge: remo...
518
  		bool local_rcv, bool local_orig);
0c4b51f00   Eric W. Biederman   netfilter: Pass n...
519
  int br_forward_finish(struct net *net, struct sock *sk, struct sk_buff *skb);
37b090e6b   Nikolay Aleksandrov   net: bridge: remo...
520
  void br_flood(struct net_bridge *br, struct sk_buff *skb,
8addd5e7d   Nikolay Aleksandrov   net: bridge: chan...
521
  	      enum br_pkt_type pkt_type, bool local_rcv, bool local_orig);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
522
523
  
  /* br_if.c */
348662a14   Joe Perches   net: 8021q/blueto...
524
525
526
  void br_port_carrier_check(struct net_bridge_port *p);
  int br_add_bridge(struct net *net, const char *name);
  int br_del_bridge(struct net *net, const char *name);
348662a14   Joe Perches   net: 8021q/blueto...
527
528
529
530
531
  int br_add_if(struct net_bridge *br, struct net_device *dev);
  int br_del_if(struct net_bridge *br, struct net_device *dev);
  int br_min_mtu(const struct net_bridge *br);
  netdev_features_t br_features_recompute(struct net_bridge *br,
  					netdev_features_t features);
e028e4b8d   Vlad Yasevich   bridge: Keep trac...
532
  void br_port_flags_change(struct net_bridge_port *port, unsigned long mask);
2796d0c64   Vlad Yasevich   bridge: Automatic...
533
  void br_manage_promisc(struct net_bridge *br);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
534
535
  
  /* br_input.c */
0c4b51f00   Eric W. Biederman   netfilter: Pass n...
536
  int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb);
348662a14   Joe Perches   net: 8021q/blueto...
537
  rx_handler_result_t br_handle_frame(struct sk_buff **pskb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
538

859828c0e   Jiri Pirko   br: fix use of ->...
539
540
541
542
543
544
545
546
547
  static inline bool br_rx_handler_check_rcu(const struct net_device *dev)
  {
  	return rcu_dereference(dev->rx_handler) == br_handle_frame;
  }
  
  static inline struct net_bridge_port *br_port_get_check_rcu(const struct net_device *dev)
  {
  	return br_rx_handler_check_rcu(dev) ? br_port_get_rcu(dev) : NULL;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
548
  /* br_ioctl.c */
348662a14   Joe Perches   net: 8021q/blueto...
549
550
551
  int br_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
  int br_ioctl_deviceless_stub(struct net *net, unsigned int cmd,
  			     void __user *arg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
552

eb1d16414   Herbert Xu   bridge: Add core ...
553
554
  /* br_multicast.c */
  #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
2ce297fc2   Cong Wang   bridge: fix seq c...
555
  extern unsigned int br_mdb_rehash_seq;
348662a14   Joe Perches   net: 8021q/blueto...
556
  int br_multicast_rcv(struct net_bridge *br, struct net_bridge_port *port,
394efd19d   David S. Miller   Merge git://git.k...
557
  		     struct sk_buff *skb, u16 vid);
348662a14   Joe Perches   net: 8021q/blueto...
558
559
  struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
  					struct sk_buff *skb, u16 vid);
1080ab95e   Nikolay Aleksandrov   net: bridge: add ...
560
  int br_multicast_add_port(struct net_bridge_port *port);
348662a14   Joe Perches   net: 8021q/blueto...
561
562
563
564
565
566
  void br_multicast_del_port(struct net_bridge_port *port);
  void br_multicast_enable_port(struct net_bridge_port *port);
  void br_multicast_disable_port(struct net_bridge_port *port);
  void br_multicast_init(struct net_bridge *br);
  void br_multicast_open(struct net_bridge *br);
  void br_multicast_stop(struct net_bridge *br);
e10177abf   Satish Ashok   bridge: multicast...
567
  void br_multicast_dev_del(struct net_bridge *br);
37b090e6b   Nikolay Aleksandrov   net: bridge: remo...
568
569
  void br_multicast_flood(struct net_bridge_mdb_entry *mdst,
  			struct sk_buff *skb, bool local_rcv, bool local_orig);
348662a14   Joe Perches   net: 8021q/blueto...
570
571
572
573
574
  int br_multicast_set_router(struct net_bridge *br, unsigned long val);
  int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val);
  int br_multicast_toggle(struct net_bridge *br, unsigned long val);
  int br_multicast_set_querier(struct net_bridge *br, unsigned long val);
  int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val);
5e9235853   Nikolay Aleksandrov   bridge: mcast: ad...
575
  int br_multicast_set_igmp_version(struct net_bridge *br, unsigned long val);
aa2ae3e71   Nikolay Aleksandrov   bridge: mcast: ad...
576
577
578
  #if IS_ENABLED(CONFIG_IPV6)
  int br_multicast_set_mld_version(struct net_bridge *br, unsigned long val);
  #endif
348662a14   Joe Perches   net: 8021q/blueto...
579
580
581
582
583
584
585
586
587
  struct net_bridge_mdb_entry *
  br_mdb_ip_get(struct net_bridge_mdb_htable *mdb, struct br_ip *dst);
  struct net_bridge_mdb_entry *
  br_multicast_new_group(struct net_bridge *br, struct net_bridge_port *port,
  		       struct br_ip *group);
  void br_multicast_free_pg(struct rcu_head *head);
  struct net_bridge_port_group *
  br_multicast_new_port_group(struct net_bridge_port *port, struct br_ip *group,
  			    struct net_bridge_port_group __rcu *next,
6db6f0eae   Felix Fietkau   bridge: multicast...
588
  			    unsigned char flags, const unsigned char *src);
348662a14   Joe Perches   net: 8021q/blueto...
589
590
  void br_mdb_init(void);
  void br_mdb_uninit(void);
45ebcce56   Elad Raz   bridge: mdb: Mark...
591
592
  void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port,
  		   struct br_ip *group, int type, u8 flags);
949f1e39a   Satish Ashok   bridge: mdb: noti...
593
594
  void br_rtr_notify(struct net_device *dev, struct net_bridge_port *port,
  		   int type);
1080ab95e   Nikolay Aleksandrov   net: bridge: add ...
595
  void br_multicast_count(struct net_bridge *br, const struct net_bridge_port *p,
a65056ecf   Nikolay Aleksandrov   net: bridge: exte...
596
  			const struct sk_buff *skb, u8 type, u8 dir);
1080ab95e   Nikolay Aleksandrov   net: bridge: add ...
597
  int br_multicast_init_stats(struct net_bridge *br);
b6fe0440c   Ido Schimmel   bridge: implement...
598
  void br_multicast_uninit_stats(struct net_bridge *br);
1080ab95e   Nikolay Aleksandrov   net: bridge: add ...
599
600
601
  void br_multicast_get_stats(const struct net_bridge *br,
  			    const struct net_bridge_port *p,
  			    struct br_mcast_stats *dest);
85b352693   Sridhar Samudrala   bridge: Fix build...
602

cfd567543   Cong Wang   bridge: add suppo...
603
604
  #define mlock_dereference(X, br) \
  	rcu_dereference_protected(X, lockdep_is_held(&br->multicast_lock))
85b352693   Sridhar Samudrala   bridge: Fix build...
605
606
607
608
609
610
  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));
  }
b00589af3   Linus Lüssing   bridge: disable s...
611

cc0fdd802   Linus Lüssing   bridge: separate ...
612
613
  static inline bool
  __br_multicast_querier_exists(struct net_bridge *br,
0888d5f3c   Daniel   Bridge: Fix ipv6 ...
614
615
  				struct bridge_mcast_other_query *querier,
  				const bool is_ipv6)
b00589af3   Linus Lüssing   bridge: disable s...
616
  {
0888d5f3c   Daniel   Bridge: Fix ipv6 ...
617
618
619
620
621
622
623
624
625
626
  	bool own_querier_enabled;
  
  	if (br->multicast_querier) {
  		if (is_ipv6 && !br->has_ipv6_addr)
  			own_querier_enabled = false;
  		else
  			own_querier_enabled = true;
  	} else {
  		own_querier_enabled = false;
  	}
cc0fdd802   Linus Lüssing   bridge: separate ...
627
  	return time_is_before_jiffies(querier->delay_time) &&
0888d5f3c   Daniel   Bridge: Fix ipv6 ...
628
  	       (own_querier_enabled || timer_pending(&querier->timer));
cc0fdd802   Linus Lüssing   bridge: separate ...
629
630
631
632
633
634
635
  }
  
  static inline bool br_multicast_querier_exists(struct net_bridge *br,
  					       struct ethhdr *eth)
  {
  	switch (eth->h_proto) {
  	case (htons(ETH_P_IP)):
0888d5f3c   Daniel   Bridge: Fix ipv6 ...
636
637
  		return __br_multicast_querier_exists(br,
  			&br->ip4_other_query, false);
cc0fdd802   Linus Lüssing   bridge: separate ...
638
639
  #if IS_ENABLED(CONFIG_IPV6)
  	case (htons(ETH_P_IPV6)):
0888d5f3c   Daniel   Bridge: Fix ipv6 ...
640
641
  		return __br_multicast_querier_exists(br,
  			&br->ip6_other_query, true);
cc0fdd802   Linus Lüssing   bridge: separate ...
642
643
644
645
  #endif
  	default:
  		return false;
  	}
b00589af3   Linus Lüssing   bridge: disable s...
646
  }
1080ab95e   Nikolay Aleksandrov   net: bridge: add ...
647
648
649
650
651
  
  static inline int br_multicast_igmp_type(const struct sk_buff *skb)
  {
  	return BR_INPUT_SKB_CB(skb)->igmp;
  }
eb1d16414   Herbert Xu   bridge: Add core ...
652
653
654
  #else
  static inline int br_multicast_rcv(struct net_bridge *br,
  				   struct net_bridge_port *port,
06499098a   Vlad Yasevich   bridge: pass corr...
655
656
  				   struct sk_buff *skb,
  				   u16 vid)
eb1d16414   Herbert Xu   bridge: Add core ...
657
658
659
660
661
  {
  	return 0;
  }
  
  static inline struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
fbca58a22   Cong Wang   bridge: add missi...
662
  						      struct sk_buff *skb, u16 vid)
eb1d16414   Herbert Xu   bridge: Add core ...
663
664
665
  {
  	return NULL;
  }
1080ab95e   Nikolay Aleksandrov   net: bridge: add ...
666
  static inline int br_multicast_add_port(struct net_bridge_port *port)
eb1d16414   Herbert Xu   bridge: Add core ...
667
  {
1080ab95e   Nikolay Aleksandrov   net: bridge: add ...
668
  	return 0;
eb1d16414   Herbert Xu   bridge: Add core ...
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
  }
  
  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...
694

a7ce45a74   Nikolay Aleksandrov   bridge: mcast: fi...
695
696
697
  static inline void br_multicast_dev_del(struct net_bridge *br)
  {
  }
37b090e6b   Nikolay Aleksandrov   net: bridge: remo...
698
699
700
  static inline void br_multicast_flood(struct net_bridge_mdb_entry *mdst,
  				      struct sk_buff *skb,
  				      bool local_rcv, bool local_orig)
5cb5e947d   Herbert Xu   bridge: Add multi...
701
702
  {
  }
eb1d16414   Herbert Xu   bridge: Add core ...
703
704
  static inline bool br_multicast_is_router(struct net_bridge *br)
  {
85b352693   Sridhar Samudrala   bridge: Fix build...
705
  	return 0;
eb1d16414   Herbert Xu   bridge: Add core ...
706
  }
37b090e6b   Nikolay Aleksandrov   net: bridge: remo...
707

cc0fdd802   Linus Lüssing   bridge: separate ...
708
709
  static inline bool br_multicast_querier_exists(struct net_bridge *br,
  					       struct ethhdr *eth)
b00589af3   Linus Lüssing   bridge: disable s...
710
711
712
  {
  	return false;
  }
37b090e6b   Nikolay Aleksandrov   net: bridge: remo...
713

fdb184d14   Rami Rosen   bridge: add empty...
714
715
716
  static inline void br_mdb_init(void)
  {
  }
37b090e6b   Nikolay Aleksandrov   net: bridge: remo...
717

fdb184d14   Rami Rosen   bridge: add empty...
718
719
720
  static inline void br_mdb_uninit(void)
  {
  }
1080ab95e   Nikolay Aleksandrov   net: bridge: add ...
721
722
723
  
  static inline void br_multicast_count(struct net_bridge *br,
  				      const struct net_bridge_port *p,
a65056ecf   Nikolay Aleksandrov   net: bridge: exte...
724
725
  				      const struct sk_buff *skb,
  				      u8 type, u8 dir)
1080ab95e   Nikolay Aleksandrov   net: bridge: add ...
726
727
728
729
730
731
732
  {
  }
  
  static inline int br_multicast_init_stats(struct net_bridge *br)
  {
  	return 0;
  }
b6fe0440c   Ido Schimmel   bridge: implement...
733
734
735
  static inline void br_multicast_uninit_stats(struct net_bridge *br)
  {
  }
1080ab95e   Nikolay Aleksandrov   net: bridge: add ...
736
737
738
739
  static inline int br_multicast_igmp_type(const struct sk_buff *skb)
  {
  	return 0;
  }
85b352693   Sridhar Samudrala   bridge: Fix build...
740
  #endif
eb1d16414   Herbert Xu   bridge: Add core ...
741

243a2e63f   Vlad Yasevich   bridge: Add vlan ...
742
743
  /* br_vlan.c */
  #ifdef CONFIG_BRIDGE_VLAN_FILTERING
77751ee8a   Nikolay Aleksandrov   bridge: vlan: mov...
744
745
746
747
  bool br_allowed_ingress(const struct net_bridge *br,
  			struct net_bridge_vlan_group *vg, struct sk_buff *skb,
  			u16 *vid);
  bool br_allowed_egress(struct net_bridge_vlan_group *vg,
348662a14   Joe Perches   net: 8021q/blueto...
748
  		       const struct sk_buff *skb);
e0d7968ab   Toshiaki Makita   bridge: Prevent i...
749
  bool br_should_learn(struct net_bridge_port *p, struct sk_buff *skb, u16 *vid);
348662a14   Joe Perches   net: 8021q/blueto...
750
  struct sk_buff *br_handle_vlan(struct net_bridge *br,
11538d039   Roopa Prabhu   bridge: vlan dst_...
751
  			       const struct net_bridge_port *port,
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
752
  			       struct net_bridge_vlan_group *vg,
348662a14   Joe Perches   net: 8021q/blueto...
753
754
755
756
  			       struct sk_buff *skb);
  int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags);
  int br_vlan_delete(struct net_bridge *br, u16 vid);
  void br_vlan_flush(struct net_bridge *br);
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
757
  struct net_bridge_vlan *br_vlan_find(struct net_bridge_vlan_group *vg, u16 vid);
204177f3f   Toshiaki Makita   bridge: Support 8...
758
  void br_recalculate_fwd_mask(struct net_bridge *br);
a7854037d   Nikolay Aleksandrov   bridge: netlink: ...
759
  int __br_vlan_filter_toggle(struct net_bridge *br, unsigned long val);
348662a14   Joe Perches   net: 8021q/blueto...
760
  int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val);
d2d427b39   Toshiaki Makita   bridge: Add netli...
761
  int __br_vlan_set_proto(struct net_bridge *br, __be16 proto);
204177f3f   Toshiaki Makita   bridge: Support 8...
762
  int br_vlan_set_proto(struct net_bridge *br, unsigned long val);
6dada9b10   Nikolay Aleksandrov   bridge: vlan: lea...
763
  int br_vlan_set_stats(struct net_bridge *br, unsigned long val);
5be5a2df4   Vlad Yasevich   bridge: Add filte...
764
  int br_vlan_init(struct net_bridge *br);
96a20d9d7   Vlad Yasevich   bridge: Add a def...
765
  int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val);
0f963b759   Nikolay Aleksandrov   bridge: netlink: ...
766
  int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid);
348662a14   Joe Perches   net: 8021q/blueto...
767
768
769
  int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags);
  int nbp_vlan_delete(struct net_bridge_port *port, u16 vid);
  void nbp_vlan_flush(struct net_bridge_port *port);
5be5a2df4   Vlad Yasevich   bridge: Add filte...
770
  int nbp_vlan_init(struct net_bridge_port *port);
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
771
  int nbp_get_num_vlan_infos(struct net_bridge_port *p, u32 filter_mask);
a60c09036   Nikolay Aleksandrov   bridge: netlink: ...
772
773
  void br_vlan_get_stats(const struct net_bridge_vlan *v,
  		       struct br_vlan_stats *stats);
a37b85c9f   Vlad Yasevich   bridge: Validate ...
774

2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
775
776
  static inline struct net_bridge_vlan_group *br_vlan_group(
  					const struct net_bridge *br)
a37b85c9f   Vlad Yasevich   bridge: Validate ...
777
  {
907b1e6e8   Nikolay Aleksandrov   bridge: vlan: use...
778
  	return rtnl_dereference(br->vlgrp);
a37b85c9f   Vlad Yasevich   bridge: Validate ...
779
  }
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
780
781
  static inline struct net_bridge_vlan_group *nbp_vlan_group(
  					const struct net_bridge_port *p)
a37b85c9f   Vlad Yasevich   bridge: Validate ...
782
  {
907b1e6e8   Nikolay Aleksandrov   bridge: vlan: use...
783
784
785
786
787
788
789
790
791
792
793
794
795
  	return rtnl_dereference(p->vlgrp);
  }
  
  static inline struct net_bridge_vlan_group *br_vlan_group_rcu(
  					const struct net_bridge *br)
  {
  	return rcu_dereference(br->vlgrp);
  }
  
  static inline struct net_bridge_vlan_group *nbp_vlan_group_rcu(
  					const struct net_bridge_port *p)
  {
  	return rcu_dereference(p->vlgrp);
a37b85c9f   Vlad Yasevich   bridge: Validate ...
796
797
798
799
800
801
802
803
  }
  
  /* 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;
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
804
  	if (skb_vlan_tag_present(skb)) {
df8a39def   Jiri Pirko   net: rename vlan_...
805
  		*vid = skb_vlan_tag_get(skb) & VLAN_VID_MASK;
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
806
  	} else {
a37b85c9f   Vlad Yasevich   bridge: Validate ...
807
808
809
810
811
812
  		*vid = 0;
  		err = -EINVAL;
  	}
  
  	return err;
  }
788519886   Vlad Yasevich   bridge: Implement...
813

77751ee8a   Nikolay Aleksandrov   bridge: vlan: mov...
814
  static inline u16 br_get_pvid(const struct net_bridge_vlan_group *vg)
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
815
  {
77751ee8a   Nikolay Aleksandrov   bridge: vlan: mov...
816
  	if (!vg)
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
817
818
819
  		return 0;
  
  	smp_rmb();
77751ee8a   Nikolay Aleksandrov   bridge: vlan: mov...
820
  	return vg->pvid;
788519886   Vlad Yasevich   bridge: Implement...
821
  }
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
822
  #else
77751ee8a   Nikolay Aleksandrov   bridge: vlan: mov...
823
824
  static inline bool br_allowed_ingress(const struct net_bridge *br,
  				      struct net_bridge_vlan_group *vg,
788519886   Vlad Yasevich   bridge: Implement...
825
826
  				      struct sk_buff *skb,
  				      u16 *vid)
a37b85c9f   Vlad Yasevich   bridge: Validate ...
827
828
829
  {
  	return true;
  }
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
830
  static inline bool br_allowed_egress(struct net_bridge_vlan_group *vg,
85f46c6ba   Vlad Yasevich   bridge: Verify th...
831
832
833
834
  				     const struct sk_buff *skb)
  {
  	return true;
  }
e0d7968ab   Toshiaki Makita   bridge: Prevent i...
835
836
837
838
839
  static inline bool br_should_learn(struct net_bridge_port *p,
  				   struct sk_buff *skb, u16 *vid)
  {
  	return true;
  }
788519886   Vlad Yasevich   bridge: Implement...
840
  static inline struct sk_buff *br_handle_vlan(struct net_bridge *br,
11538d039   Roopa Prabhu   bridge: vlan dst_...
841
  					     const struct net_bridge_port *port,
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
842
  					     struct net_bridge_vlan_group *vg,
788519886   Vlad Yasevich   bridge: Implement...
843
844
845
846
  					     struct sk_buff *skb)
  {
  	return skb;
  }
552406c48   Vlad Yasevich   bridge: Add the a...
847
  static inline int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags)
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
848
849
850
851
852
853
854
855
856
857
858
859
  {
  	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)
  {
  }
204177f3f   Toshiaki Makita   bridge: Support 8...
860
861
862
  static inline void br_recalculate_fwd_mask(struct net_bridge *br)
  {
  }
5be5a2df4   Vlad Yasevich   bridge: Add filte...
863
  static inline int br_vlan_init(struct net_bridge *br)
8580e2117   Toshiaki Makita   bridge: Prepare f...
864
  {
5be5a2df4   Vlad Yasevich   bridge: Add filte...
865
  	return 0;
8580e2117   Toshiaki Makita   bridge: Prepare f...
866
  }
552406c48   Vlad Yasevich   bridge: Add the a...
867
  static inline int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags)
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
868
869
870
871
872
873
874
875
876
877
878
879
  {
  	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)
  {
  }
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
880
881
  static inline struct net_bridge_vlan *br_vlan_find(struct net_bridge_vlan_group *vg,
  						   u16 vid)
a37b85c9f   Vlad Yasevich   bridge: Validate ...
882
883
884
  {
  	return NULL;
  }
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
885
  static inline int nbp_vlan_init(struct net_bridge_port *port)
bc9a25d21   Vlad Yasevich   bridge: Add vlan ...
886
  {
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
887
  	return 0;
bc9a25d21   Vlad Yasevich   bridge: Add vlan ...
888
  }
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
889
  static inline u16 br_vlan_get_tag(const struct sk_buff *skb, u16 *tag)
5be5a2df4   Vlad Yasevich   bridge: Add filte...
890
891
892
  {
  	return 0;
  }
77751ee8a   Nikolay Aleksandrov   bridge: vlan: mov...
893
  static inline u16 br_get_pvid(const struct net_bridge_vlan_group *vg)
788519886   Vlad Yasevich   bridge: Implement...
894
  {
3df6bf45e   Vlad Yasevich   bridge: Simplify ...
895
  	return 0;
788519886   Vlad Yasevich   bridge: Implement...
896
  }
2796d0c64   Vlad Yasevich   bridge: Automatic...
897

a7854037d   Nikolay Aleksandrov   bridge: netlink: ...
898
899
900
901
902
  static inline int __br_vlan_filter_toggle(struct net_bridge *br,
  					  unsigned long val)
  {
  	return -EOPNOTSUPP;
  }
2594e9064   Nikolay Aleksandrov   bridge: vlan: add...
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
  
  static inline int nbp_get_num_vlan_infos(struct net_bridge_port *p,
  					 u32 filter_mask)
  {
  	return 0;
  }
  
  static inline struct net_bridge_vlan_group *br_vlan_group(
  					const struct net_bridge *br)
  {
  	return NULL;
  }
  
  static inline struct net_bridge_vlan_group *nbp_vlan_group(
  					const struct net_bridge_port *p)
  {
  	return NULL;
  }
907b1e6e8   Nikolay Aleksandrov   bridge: vlan: use...
921
922
923
924
925
926
927
928
929
930
931
932
  
  static inline struct net_bridge_vlan_group *br_vlan_group_rcu(
  					const struct net_bridge *br)
  {
  	return NULL;
  }
  
  static inline struct net_bridge_vlan_group *nbp_vlan_group_rcu(
  					const struct net_bridge_port *p)
  {
  	return NULL;
  }
a60c09036   Nikolay Aleksandrov   bridge: netlink: ...
933
934
935
936
937
  
  static inline void br_vlan_get_stats(const struct net_bridge_vlan *v,
  				     struct br_vlan_stats *stats)
  {
  }
243a2e63f   Vlad Yasevich   bridge: Add vlan ...
938
  #endif
1a4ba64d1   Pablo Neira Ayuso   netfilter: bridge...
939
940
941
942
  struct nf_br_ops {
  	int (*br_dev_xmit_hook)(struct sk_buff *skb);
  };
  extern const struct nf_br_ops __rcu *nf_br_ops;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
943
  /* br_netfilter.c */
34666d467   Pablo Neira Ayuso   netfilter: bridge...
944
945
946
  #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
  int br_nf_core_init(void);
  void br_nf_core_fini(void);
348662a14   Joe Perches   net: 8021q/blueto...
947
  void br_netfilter_rtable_init(struct net_bridge *);
c09097132   Stephen Hemminger   [BRIDGE]: fix mod...
948
  #else
34666d467   Pablo Neira Ayuso   netfilter: bridge...
949
950
  static inline int br_nf_core_init(void) { return 0; }
  static inline void br_nf_core_fini(void) {}
4adf0af68   Simon Wunderlich   bridge: send corr...
951
  #define br_netfilter_rtable_init(x)
c09097132   Stephen Hemminger   [BRIDGE]: fix mod...
952
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
953
954
  
  /* br_stp.c */
775dd692b   Florian Fainelli   net: bridge: add ...
955
  void br_set_state(struct net_bridge_port *p, unsigned int state);
348662a14   Joe Perches   net: 8021q/blueto...
956
957
958
  struct net_bridge_port *br_get_port(struct net_bridge *br, u16 port_no);
  void br_init_port(struct net_bridge_port *p);
  void br_become_designated_port(struct net_bridge_port *p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
959

348662a14   Joe Perches   net: 8021q/blueto...
960
961
962
963
  void __br_set_forward_delay(struct net_bridge *br, unsigned long t);
  int br_set_forward_delay(struct net_bridge *br, unsigned long x);
  int br_set_hello_time(struct net_bridge *br, unsigned long x);
  int br_set_max_age(struct net_bridge *br, unsigned long x);
82dd4332a   Vivien Didelot   net: bridge: add ...
964
  int __set_ageing_time(struct net_device *dev, unsigned long t);
9e0b27fe5   Vivien Didelot   net: bridge: br_s...
965
  int br_set_ageing_time(struct net_bridge *br, clock_t ageing_time);
14f98f258   stephen hemminger   bridge: range che...
966

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
967
  /* br_stp_if.c */
348662a14   Joe Perches   net: 8021q/blueto...
968
969
970
971
972
973
974
975
976
977
978
  void br_stp_enable_bridge(struct net_bridge *br);
  void br_stp_disable_bridge(struct net_bridge *br);
  void br_stp_set_enabled(struct net_bridge *br, unsigned long val);
  void br_stp_enable_port(struct net_bridge_port *p);
  void br_stp_disable_port(struct net_bridge_port *p);
  bool br_stp_recalculate_bridge_id(struct net_bridge *br);
  void br_stp_change_bridge_id(struct net_bridge *br, const unsigned char *a);
  void br_stp_set_bridge_priority(struct net_bridge *br, u16 newprio);
  int br_stp_set_port_priority(struct net_bridge_port *p, unsigned long newprio);
  int br_stp_set_path_cost(struct net_bridge_port *p, unsigned long path_cost);
  ssize_t br_show_bridge_id(char *buf, const struct bridge_id *id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
979
980
  
  /* br_stp_bpdu.c */
7c85fbf06   Patrick McHardy   bridge: Use STP d...
981
  struct stp_proto;
348662a14   Joe Perches   net: 8021q/blueto...
982
983
  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
984
985
  
  /* br_stp_timer.c */
348662a14   Joe Perches   net: 8021q/blueto...
986
987
988
  void br_stp_timer_init(struct net_bridge *br);
  void br_stp_port_timer_init(struct net_bridge_port *p);
  unsigned long br_timer_value(const struct timer_list *timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
989
990
  
  /* br.c */
e6373c4c0   Igor Maravić   net:bridge: use I...
991
  #if IS_ENABLED(CONFIG_ATM_LANE)
da6782927   Michał Mirosław   bridge: Simplify ...
992
993
  extern int (*br_fdb_test_addr_hook)(struct net_device *dev, unsigned char *addr);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
994

11dc1f36a   Stephen Hemminger   [BRIDGE]: netlink...
995
  /* br_netlink.c */
149ddd83a   stephen hemminger   bridge: Assign rt...
996
  extern struct rtnl_link_ops br_link_ops;
348662a14   Joe Perches   net: 8021q/blueto...
997
998
999
  int br_netlink_init(void);
  void br_netlink_fini(void);
  void br_ifinfo_notify(int event, struct net_bridge_port *port);
add511b38   Roopa Prabhu   bridge: add flags...
1000
1001
  int br_setlink(struct net_device *dev, struct nlmsghdr *nlmsg, u16 flags);
  int br_dellink(struct net_device *dev, struct nlmsghdr *nlmsg, u16 flags);
348662a14   Joe Perches   net: 8021q/blueto...
1002
  int br_getlink(struct sk_buff *skb, u32 pid, u32 seq, struct net_device *dev,
46c264daa   Nicolas Dichtel   bridge/nl: remove...
1003
  	       u32 filter_mask, int nlflags);
11dc1f36a   Stephen Hemminger   [BRIDGE]: netlink...
1004

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1005
1006
  #ifdef CONFIG_SYSFS
  /* br_sysfs_if.c */
52cf25d0a   Emese Revfy   Driver core: Cons...
1007
  extern const struct sysfs_ops brport_sysfs_ops;
348662a14   Joe Perches   net: 8021q/blueto...
1008
1009
  int br_sysfs_addif(struct net_bridge_port *p);
  int br_sysfs_renameif(struct net_bridge_port *p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1010
1011
  
  /* br_sysfs_br.c */
348662a14   Joe Perches   net: 8021q/blueto...
1012
1013
  int br_sysfs_addbr(struct net_device *dev);
  void br_sysfs_delbr(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1014
1015
  
  #else
0cb2bbbea   Lee Jones   bridge: Avoid 'st...
1016
1017
1018
1019
  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
1020
  #endif /* CONFIG_SYSFS */
6bc506b4f   Ido Schimmel   bridge: switchdev...
1021
1022
1023
1024
1025
1026
1027
  /* br_switchdev.c */
  #ifdef CONFIG_NET_SWITCHDEV
  int nbp_switchdev_mark_set(struct net_bridge_port *p);
  void nbp_switchdev_frame_mark(const struct net_bridge_port *p,
  			      struct sk_buff *skb);
  bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p,
  				  const struct sk_buff *skb);
3922285d9   Arkadi Sharshevsky   net: bridge: Add ...
1028
1029
1030
  int br_switchdev_set_port_flag(struct net_bridge_port *p,
  			       unsigned long flags,
  			       unsigned long mask);
6b26b51b1   Arkadi Sharshevsky   net: bridge: Add ...
1031
1032
  void br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb,
  			     int type);
f1c2eddf4   Ido Schimmel   bridge: switchdev...
1033
1034
1035
1036
1037
  
  static inline void br_switchdev_frame_unmark(struct sk_buff *skb)
  {
  	skb->offload_fwd_mark = 0;
  }
6bc506b4f   Ido Schimmel   bridge: switchdev...
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
  #else
  static inline int nbp_switchdev_mark_set(struct net_bridge_port *p)
  {
  	return 0;
  }
  
  static inline void nbp_switchdev_frame_mark(const struct net_bridge_port *p,
  					    struct sk_buff *skb)
  {
  }
  
  static inline bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p,
  						const struct sk_buff *skb)
  {
  	return true;
  }
3922285d9   Arkadi Sharshevsky   net: bridge: Add ...
1054
1055
1056
1057
1058
1059
1060
  
  static inline int br_switchdev_set_port_flag(struct net_bridge_port *p,
  					     unsigned long flags,
  					     unsigned long mask)
  {
  	return 0;
  }
6b26b51b1   Arkadi Sharshevsky   net: bridge: Add ...
1061
1062
1063
1064
1065
  
  static inline void
  br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type)
  {
  }
f1c2eddf4   Ido Schimmel   bridge: switchdev...
1066
1067
1068
1069
  
  static inline void br_switchdev_frame_unmark(struct sk_buff *skb)
  {
  }
6bc506b4f   Ido Schimmel   bridge: switchdev...
1070
  #endif /* CONFIG_NET_SWITCHDEV */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1071
  #endif