Merge branch 'mindspeed_drops' into master
Change-Id: Iace5a5c61f7b46f709904691be44fdda4a132b0b
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
index 3ae122f..d177c74 100644
--- a/net/bridge/br_fdb.c
+++ b/net/bridge/br_fdb.c
@@ -94,6 +94,21 @@
static inline void fdb_delete(struct net_bridge_fdb_entry *f)
{
+#if defined(CONFIG_COMCERTO_FP)
+ struct net_bridge_port *this_port = f->dst, *p;
+ struct net_bridge *br = this_port->br;
+
+ if (f->is_local) {
+ list_for_each_entry(p, &br->port_list, list) {
+ if (this_port == p)
+ continue;
+
+ dev_uc_del(this_port->dev, p->dev->dev_addr);
+ dev_uc_del(p->dev, f->addr.addr);
+ }
+ }
+#endif
+
fdb_notify(f, RTM_DELNEIGH);
hlist_del_rcu(&f->hlist);
call_rcu(&f->rcu, fdb_rcu_free);
@@ -378,6 +393,9 @@
{
struct hlist_head *head = &br->hash[br_mac_hash(addr)];
struct net_bridge_fdb_entry *fdb;
+#if defined(CONFIG_COMCERTO_FP)
+ struct net_bridge_port *p;
+#endif
if (!is_valid_ether_addr(addr))
return -EINVAL;
@@ -399,6 +417,15 @@
if (!fdb)
return -ENOMEM;
+#if defined(CONFIG_COMCERTO_FP)
+ list_for_each_entry(p, &br->port_list, list) {
+ if (source == p)
+ continue;
+
+ dev_uc_add(source->dev, p->dev->dev_addr);
+ dev_uc_add(p->dev, addr);
+ }
+#endif
fdb->is_local = fdb->is_static = 1;
return 0;
}