diff options
Diffstat (limited to 'net/bridge/br_vlan.c')
-rw-r--r-- | net/bridge/br_vlan.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c index 4ca4d0a0151c..8249ca764c79 100644 --- a/net/bridge/br_vlan.c +++ b/net/bridge/br_vlan.c | |||
@@ -275,9 +275,7 @@ int br_vlan_delete(struct net_bridge *br, u16 vid) | |||
275 | if (!pv) | 275 | if (!pv) |
276 | return -EINVAL; | 276 | return -EINVAL; |
277 | 277 | ||
278 | spin_lock_bh(&br->hash_lock); | 278 | br_fdb_find_delete_local(br, NULL, br->dev->dev_addr, vid); |
279 | fdb_delete_by_addr(br, br->dev->dev_addr, vid); | ||
280 | spin_unlock_bh(&br->hash_lock); | ||
281 | 279 | ||
282 | __vlan_del(pv, vid); | 280 | __vlan_del(pv, vid); |
283 | return 0; | 281 | return 0; |
@@ -295,6 +293,25 @@ void br_vlan_flush(struct net_bridge *br) | |||
295 | __vlan_flush(pv); | 293 | __vlan_flush(pv); |
296 | } | 294 | } |
297 | 295 | ||
296 | bool br_vlan_find(struct net_bridge *br, u16 vid) | ||
297 | { | ||
298 | struct net_port_vlans *pv; | ||
299 | bool found = false; | ||
300 | |||
301 | rcu_read_lock(); | ||
302 | pv = rcu_dereference(br->vlan_info); | ||
303 | |||
304 | if (!pv) | ||
305 | goto out; | ||
306 | |||
307 | if (test_bit(vid, pv->vlan_bitmap)) | ||
308 | found = true; | ||
309 | |||
310 | out: | ||
311 | rcu_read_unlock(); | ||
312 | return found; | ||
313 | } | ||
314 | |||
298 | int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val) | 315 | int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val) |
299 | { | 316 | { |
300 | if (!rtnl_trylock()) | 317 | if (!rtnl_trylock()) |
@@ -359,9 +376,7 @@ int nbp_vlan_delete(struct net_bridge_port *port, u16 vid) | |||
359 | if (!pv) | 376 | if (!pv) |
360 | return -EINVAL; | 377 | return -EINVAL; |
361 | 378 | ||
362 | spin_lock_bh(&port->br->hash_lock); | 379 | br_fdb_find_delete_local(port->br, port, port->dev->dev_addr, vid); |
363 | fdb_delete_by_addr(port->br, port->dev->dev_addr, vid); | ||
364 | spin_unlock_bh(&port->br->hash_lock); | ||
365 | 380 | ||
366 | return __vlan_del(pv, vid); | 381 | return __vlan_del(pv, vid); |
367 | } | 382 | } |