Message ID | 20130422155649.2e4aebcf@nehalam.linuxnetplumber.net |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Stephen Hemminger <stephen@networkplumber.org> Date: Mon, 22 Apr 2013 15:56:49 -0700 > From: roopa <roopa@cumulusnetworks.com> > > Current bridge fdb update code does not seem to update the port > during fdb update. This patch adds a check for fdb dst (port) > change during fdb update. Also rearranges the call to > fdb_notify to send only one notification for create and update. > > Changelog: > v2 - Change notify flag to bool > > Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com> > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> Applied. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
--- a/net/bridge/br_fdb.c 2013-03-28 14:26:20.746064670 -0700 +++ b/net/bridge/br_fdb.c 2013-04-22 15:52:24.183494631 -0700 @@ -615,6 +615,7 @@ static int fdb_add_entry(struct net_brid struct net_bridge *br = source->br; struct hlist_head *head = &br->hash[br_mac_hash(addr, vid)]; struct net_bridge_fdb_entry *fdb; + bool modified = false; fdb = fdb_find(head, addr, vid); if (fdb == NULL) { @@ -624,10 +625,16 @@ static int fdb_add_entry(struct net_brid fdb = fdb_create(head, source, addr, vid); if (!fdb) return -ENOMEM; - fdb_notify(br, fdb, RTM_NEWNEIGH); + + modified = true; } else { if (flags & NLM_F_EXCL) return -EEXIST; + + if (fdb->dst != source) { + fdb->dst = source; + modified = true; + } } if (fdb_to_nud(fdb) != state) { @@ -639,7 +646,12 @@ static int fdb_add_entry(struct net_brid } else fdb->is_local = fdb->is_static = 0; - fdb->updated = fdb->used = jiffies; + modified = true; + } + + fdb->used = jiffies; + if (modified) { + fdb->updated = jiffies; fdb_notify(br, fdb, RTM_NEWNEIGH); }