Message ID | 20210414151540.1808871-1-olteanv@gmail.com |
---|---|
State | New |
Headers | show |
Series | [net-next,1/2] net: bridge: switchdev: refactor br_switchdev_fdb_notify | expand |
On Wed, Apr 14, 2021 at 06:25:03PM +0300, Nikolay Aleksandrov wrote: > On 14/04/2021 18:15, Vladimir Oltean wrote: > > From: Tobias Waldekranz <tobias@waldekranz.com> > > > > Instead of having to add more and more arguments to > > br_switchdev_fdb_call_notifiers, get rid of it and build the info > > struct directly in br_switchdev_fdb_notify. > > > > Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com> > > Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com> > > Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> > > --- > > net/bridge/br_switchdev.c | 41 +++++++++++---------------------------- > > 1 file changed, 11 insertions(+), 30 deletions(-) > > > > Hi, > Is there a PATCH 0/2 with overview and explanation of what's happening in this set ? > If there isn't one please add it and explain the motivation and the change. > > Thanks, > Nik Nope, there isn't. Being a 2-patch series, and having the explanation already provided in patch 2, I didn't consider a cover letter as necessary. Change #1 is just preliminary refactoring.
On Wed, Apr 14, 2021 at 05:58:44PM +0200, Andrew Lunn wrote: > > Let us now add the 'is_local' bit to bridge FDB entries, and make all > > drivers ignore these entries by their own choice. > > Hi Vladimir > > This goes to the question about the missing cover letter. Why should > drivers get to ignore them, rather than the core? It feels like there > should be another patch in the series, where a driver does not > actually ignore them, but does something? Hi Andrew, Bridge fdb entries with the is_local flag are entries which are terminated locally and not forwarded. Switchdev drivers might want to be notified of these addresses so they can trap them (otherwise, if they don't program these entries to hardware, there is no guarantee that they will do the right thing with these entries, and they won't be, let's say, flooded). Of course, ideally none of the switchdev drivers should ignore them, but having access to the is_local bit is the bare minimum change that should be done in the bridge layer, before this is even possible. These 2 changes are actually part of a larger group of changes that together form the "RX filtering for DSA" series. I haven't had a lot of success with that, so I thought a better approach would be to take it step by step. DSA will need to be notified of local FDB entries. For now, it ignores them like everybody else. This is supposed to be a non-functional patch series because I don't want to spam every switchdev maintainer with 15+ DSA RX filtering patches.
diff --git a/net/bridge/br_switchdev.c b/net/bridge/br_switchdev.c index 1e24d9a2c9a7..c390f84adea2 100644 --- a/net/bridge/br_switchdev.c +++ b/net/bridge/br_switchdev.c @@ -107,25 +107,16 @@ int br_switchdev_set_port_flag(struct net_bridge_port *p, return 0; } -static void -br_switchdev_fdb_call_notifiers(bool adding, const unsigned char *mac, - u16 vid, struct net_device *dev, - bool added_by_user, bool offloaded) -{ - struct switchdev_notifier_fdb_info info; - unsigned long notifier_type; - - info.addr = mac; - info.vid = vid; - info.added_by_user = added_by_user; - info.offloaded = offloaded; - notifier_type = adding ? SWITCHDEV_FDB_ADD_TO_DEVICE : SWITCHDEV_FDB_DEL_TO_DEVICE; - call_switchdev_notifiers(notifier_type, dev, &info.info, NULL); -} - void br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type) { + struct switchdev_notifier_fdb_info info = { + .addr = fdb->key.addr.addr, + .vid = fdb->key.vlan_id, + .added_by_user = test_bit(BR_FDB_ADDED_BY_USER, &fdb->flags), + .offloaded = test_bit(BR_FDB_OFFLOADED, &fdb->flags), + }; + if (!fdb->dst) return; if (test_bit(BR_FDB_LOCAL, &fdb->flags)) @@ -133,22 +124,12 @@ br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type) switch (type) { case RTM_DELNEIGH: - br_switchdev_fdb_call_notifiers(false, fdb->key.addr.addr, - fdb->key.vlan_id, - fdb->dst->dev, - test_bit(BR_FDB_ADDED_BY_USER, - &fdb->flags), - test_bit(BR_FDB_OFFLOADED, - &fdb->flags)); + call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_DEVICE, + fdb->dst->dev, &info.info, NULL); break; case RTM_NEWNEIGH: - br_switchdev_fdb_call_notifiers(true, fdb->key.addr.addr, - fdb->key.vlan_id, - fdb->dst->dev, - test_bit(BR_FDB_ADDED_BY_USER, - &fdb->flags), - test_bit(BR_FDB_OFFLOADED, - &fdb->flags)); + call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_DEVICE, + fdb->dst->dev, &info.info, NULL); break; } }