Commit 7597b266 authored by Nikolay Aleksandrov's avatar Nikolay Aleksandrov Committed by David S. Miller

bridge: allow ext learned entries to change ports

current code silently ignores change of port in the request
message. This patch makes sure the port is modified and
notification is sent to userspace.

Fixes: cf6b8e1e ("bridge: add API to notify bridge driver of learned FBD on offloaded device")
Signed-off-by: default avatarNikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: default avatarRoopa Prabhu <roopa@cumulusnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e05a90ec
...@@ -1079,8 +1079,9 @@ void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p) ...@@ -1079,8 +1079,9 @@ void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p)
int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p, int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p,
const unsigned char *addr, u16 vid) const unsigned char *addr, u16 vid)
{ {
struct hlist_head *head;
struct net_bridge_fdb_entry *fdb; struct net_bridge_fdb_entry *fdb;
struct hlist_head *head;
bool modified = false;
int err = 0; int err = 0;
spin_lock_bh(&br->hash_lock); spin_lock_bh(&br->hash_lock);
...@@ -1095,14 +1096,25 @@ int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p, ...@@ -1095,14 +1096,25 @@ int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p,
} }
fdb->added_by_external_learn = 1; fdb->added_by_external_learn = 1;
fdb_notify(br, fdb, RTM_NEWNEIGH); fdb_notify(br, fdb, RTM_NEWNEIGH);
} else if (fdb->added_by_external_learn) { } else {
/* Refresh entry */
fdb->updated = fdb->used = jiffies;
} else if (!fdb->added_by_user) {
/* Take over SW learned entry */
fdb->added_by_external_learn = 1;
fdb->updated = jiffies; fdb->updated = jiffies;
fdb_notify(br, fdb, RTM_NEWNEIGH);
if (fdb->dst != p) {
fdb->dst = p;
modified = true;
}
if (fdb->added_by_external_learn) {
/* Refresh entry */
fdb->used = jiffies;
} else if (!fdb->added_by_user) {
/* Take over SW learned entry */
fdb->added_by_external_learn = 1;
modified = true;
}
if (modified)
fdb_notify(br, fdb, RTM_NEWNEIGH);
} }
err_unlock: err_unlock:
......
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