Commit c5c0a0e3 authored by Stephen Hemminger's avatar Stephen Hemminger

[BRIDGE]: Handle delete of multiple devices with same address.

This fixes the issue discovered when removing bluetooth devices from a bridge.
Need to add special case code when forwarding table is being cleaned up to 
handle the case where several devices share the same hardware address.
parent e8d12276
...@@ -157,11 +157,30 @@ void br_fdb_delete_by_port(struct net_bridge *br, struct net_bridge_port *p) ...@@ -157,11 +157,30 @@ void br_fdb_delete_by_port(struct net_bridge *br, struct net_bridge_port *p)
hlist_for_each_safe(h, g, &br->hash[i]) { hlist_for_each_safe(h, g, &br->hash[i]) {
struct net_bridge_fdb_entry *f struct net_bridge_fdb_entry *f
= hlist_entry(h, struct net_bridge_fdb_entry, hlist); = hlist_entry(h, struct net_bridge_fdb_entry, hlist);
if (f->dst == p) { if (f->dst != p)
fdb_delete(f); continue;
/*
* if multiple ports all have the same device address
* then when one port is deleted, assign
* the local entry to other port
*/
if (f->is_local) {
struct net_bridge_port *op;
list_for_each_entry(op, &br->port_list, list) {
if (op != p &&
!memcmp(op->dev->dev_addr,
f->addr.addr, ETH_ALEN)) {
f->dst = op;
goto skip_delete;
} }
} }
} }
fdb_delete(f);
skip_delete: ;
}
}
write_unlock_bh(&br->hash_lock); write_unlock_bh(&br->hash_lock);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment