|
@@ -487,6 +487,7 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,
|
|
|
{
|
|
|
struct hlist_head *head = &br->hash[br_mac_hash(addr, vid)];
|
|
|
struct net_bridge_fdb_entry *fdb;
|
|
|
+ bool fdb_modified = false;
|
|
|
|
|
|
/* some users want to always flood. */
|
|
|
if (hold_time(br) == 0)
|
|
@@ -507,10 +508,15 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,
|
|
|
source->dev->name);
|
|
|
} else {
|
|
|
/* fastpath: update of existing entry */
|
|
|
- fdb->dst = source;
|
|
|
+ if (unlikely(source != fdb->dst)) {
|
|
|
+ fdb->dst = source;
|
|
|
+ fdb_modified = true;
|
|
|
+ }
|
|
|
fdb->updated = jiffies;
|
|
|
if (unlikely(added_by_user))
|
|
|
fdb->added_by_user = 1;
|
|
|
+ if (unlikely(fdb_modified))
|
|
|
+ fdb_notify(br, fdb, RTM_NEWNEIGH);
|
|
|
}
|
|
|
} else {
|
|
|
spin_lock(&br->hash_lock);
|