Hans Schultz
2022-Mar-23 12:49 UTC
[Bridge] [PATCH v2 net-next 2/4] net: switchdev: add support for offloading of fdb locked flag
On ons, mar 23, 2022 at 14:35, Vladimir Oltean <olteanv at gmail.com> wrote:> On Wed, Mar 23, 2022 at 01:29:52PM +0100, Hans Schultz wrote: >> On tor, mar 17, 2022 at 10:39, Hans Schultz <schultz.hans at gmail.com> wrote: >> > Used for Mac-auth/MAB feature in the offloaded case. >> > >> > Signed-off-by: Hans Schultz <schultz.hans+netdev at gmail.com> >> > --- >> > include/net/switchdev.h | 3 ++- >> > net/bridge/br.c | 3 ++- >> > net/bridge/br_fdb.c | 7 +++++-- >> > net/bridge/br_private.h | 2 +- >> > 4 files changed, 10 insertions(+), 5 deletions(-) >> > >> > diff --git a/include/net/switchdev.h b/include/net/switchdev.h >> > index 3e424d40fae3..d5d923411f5e 100644 >> > --- a/include/net/switchdev.h >> > +++ b/include/net/switchdev.h >> > @@ -229,7 +229,8 @@ struct switchdev_notifier_fdb_info { >> > u16 vid; >> > u8 added_by_user:1, >> > is_local:1, >> > - offloaded:1; >> > + offloaded:1, >> > + locked:1; >> > }; >> > >> > struct switchdev_notifier_port_obj_info { >> > diff --git a/net/bridge/br.c b/net/bridge/br.c >> > index b1dea3febeea..adcdbecbc218 100644 >> > --- a/net/bridge/br.c >> > +++ b/net/bridge/br.c >> > @@ -166,7 +166,8 @@ static int br_switchdev_event(struct notifier_block *unused, >> > case SWITCHDEV_FDB_ADD_TO_BRIDGE: >> > fdb_info = ptr; >> > err = br_fdb_external_learn_add(br, p, fdb_info->addr, >> > - fdb_info->vid, false); >> > + fdb_info->vid, false, >> > + fdb_info->locked); >> > if (err) { >> > err = notifier_from_errno(err); >> > break; >> > diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c >> > index 57ec559a85a7..57aa1955d34d 100644 >> > --- a/net/bridge/br_fdb.c >> > +++ b/net/bridge/br_fdb.c >> > @@ -987,7 +987,7 @@ static int __br_fdb_add(struct ndmsg *ndm, struct net_bridge *br, >> > "FDB entry towards bridge must be permanent"); >> > return -EINVAL; >> > } >> > - err = br_fdb_external_learn_add(br, p, addr, vid, true); >> > + err = br_fdb_external_learn_add(br, p, addr, vid, true, >> > false); >> >> Does someone have an idea why there at this point is no option to add a >> dynamic fdb entry? >> >> The fdb added entries here do not age out, while the ATU entries do >> (after 5 min), resulting in unsynced ATU vs fdb. > > I think the expectation is to use br_fdb_external_learn_del() if the > externally learned entry expires. The bridge should not age by itself > FDB entries learned externally. >It seems to me that something is missing then? My tests using trafgen that I gave a report on to Lunn generated massive amounts of fdb entries, but after a while the ATU was clean and the fdb was still full of random entries...>> > } else { >> > spin_lock_bh(&br->hash_lock); >> > err = fdb_add_entry(br, p, addr, ndm, nlh_flags, vid, nfea_tb); >> > @@ -1216,7 +1216,7 @@ 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, >> > const unsigned char *addr, u16 vid, >> > - bool swdev_notify) >> > + bool swdev_notify, bool locked) >> > { >> > struct net_bridge_fdb_entry *fdb; >> > bool modified = false; >> > @@ -1236,6 +1236,9 @@ int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p, >> > if (!p) >> > flags |= BIT(BR_FDB_LOCAL); >> > >> > + if (locked) >> > + flags |= BIT(BR_FDB_ENTRY_LOCKED); >> > + >> > fdb = fdb_create(br, p, addr, vid, flags); >> > if (!fdb) { >> > err = -ENOMEM; >> > diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h >> > index f5a0b68c4857..3275e33b112f 100644 >> > --- a/net/bridge/br_private.h >> > +++ b/net/bridge/br_private.h >> > @@ -790,7 +790,7 @@ int br_fdb_sync_static(struct net_bridge *br, struct net_bridge_port *p); >> > 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, >> > const unsigned char *addr, u16 vid, >> > - bool swdev_notify); >> > + bool swdev_notify, bool locked); >> > int br_fdb_external_learn_del(struct net_bridge *br, struct net_bridge_port *p, >> > const unsigned char *addr, u16 vid, >> > bool swdev_notify); >> > -- >> > 2.30.2
Vladimir Oltean
2022-Mar-23 14:43 UTC
[Bridge] [PATCH v2 net-next 2/4] net: switchdev: add support for offloading of fdb locked flag
On Wed, Mar 23, 2022 at 01:49:32PM +0100, Hans Schultz wrote:> >> Does someone have an idea why there at this point is no option to add a > >> dynamic fdb entry? > >> > >> The fdb added entries here do not age out, while the ATU entries do > >> (after 5 min), resulting in unsynced ATU vs fdb. > > > > I think the expectation is to use br_fdb_external_learn_del() if the > > externally learned entry expires. The bridge should not age by itself > > FDB entries learned externally. > > > > It seems to me that something is missing then? > My tests using trafgen that I gave a report on to Lunn generated massive > amounts of fdb entries, but after a while the ATU was clean and the fdb > was still full of random entries...I'm no longer sure where you are, sorry.. I think we discussed that you need to enable ATU age interrupts in order to keep the ATU in sync with the bridge FDB? Which means either to delete the locked FDB entries from the bridge when they age out in the ATU, or to keep refreshing locked ATU entries. So it seems that you're doing neither of those 2 things if you end up with bridge FDB entries which are no longer in the ATU.