diff options
author | David S. Miller <davem@davemloft.net> | 2017-03-24 20:30:22 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-03-24 20:30:22 +0100 |
commit | 9096643856919eba4ea7dd462e3528bc6d230f4f (patch) | |
tree | dbb754ed82d3266d438fba54a6dfc4273c385c85 | |
parent | mlxsw: Remove debugfs interface (diff) | |
parent | net: bridge: allow to add externally learned entries from user-space (diff) | |
download | linux-9096643856919eba4ea7dd462e3528bc6d230f4f.tar.xz linux-9096643856919eba4ea7dd462e3528bc6d230f4f.zip |
Merge branch 'bridge-ext-learned-entries'
Nikolay Aleksandrov says
====================
net: bridge: allow user-space to add ext learned entries
This set adds the ability to add externally learned entries from
user-space. For symmetry and proper function we need to allow SW entries
to take over HW learned ones (similar to how HW can take over SW entries
currently) which is needed for our use case (evpn) where we have pure SW
ports and HW ports mixed in a single bridge. This does not play well with
switchdev devices currently because there's no feedback when the entry is
taken over, but this case has never worked anyway and feedback can be
easily added when needed.
Patch 02 simply allows to use NTF_EXT_LEARNED from user-space, we already
have Quagga patches that make use of this functionality.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/bridge/br_fdb.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c index 6e08b7199dd7..5a40a87c4f4f 100644 --- a/net/bridge/br_fdb.c +++ b/net/bridge/br_fdb.c @@ -594,6 +594,9 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, fdb->updated = now; if (unlikely(added_by_user)) fdb->added_by_user = 1; + /* Take over HW learned entry */ + if (unlikely(fdb->added_by_external_learn)) + fdb->added_by_external_learn = 0; if (unlikely(fdb_modified)) fdb_notify(br, fdb, RTM_NEWNEIGH); } @@ -854,6 +857,8 @@ static int __br_fdb_add(struct ndmsg *ndm, struct net_bridge *br, br_fdb_update(br, p, addr, vid, true); rcu_read_unlock(); local_bh_enable(); + } else if (ndm->ndm_flags & NTF_EXT_LEARNED) { + err = br_fdb_external_learn_add(br, p, addr, vid); } else { spin_lock_bh(&br->hash_lock); err = fdb_add_entry(br, p, addr, ndm->ndm_state, |