bridge: Add fdb dst check during fdb update
authorroopa <roopa@cumulusnetworks.com>
Mon, 22 Apr 2013 12:56:49 +0000 (12:56 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 29 Apr 2013 15:40:26 +0000 (11:40 -0400)
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>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/bridge/br_fdb.c

index c581f1200ef7f0afe3c0b8b65f184060b7a90436..ebfa4443c69b3cd62b1bcbf94190a579bfb0115b 100644 (file)
@@ -615,6 +615,7 @@ static int fdb_add_entry(struct net_bridge_port *source, const __u8 *addr,
        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_bridge_port *source, const __u8 *addr,
                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_bridge_port *source, const __u8 *addr,
                } 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);
        }