On Mon, Jan 30, 2023 at 06:34:29PM +0100, Hans J. Schultz wrote: > For 802.1X or MAB security authed hosts we want to have these hosts authed > by adding dynamic FDB entries, so that if an authed host goes silent for > a time period it's FDB entry will be removed and it must reauth when > wanting to communicate again. > In the mv88e6xxx offloaded case, we can use the HoldAt1 feature, that > gives an age out interrupt when the FDB entry is about to age out, so > that userspace can be notified of the entry being deleted with the help > of an SWITCHDEV_FDB_DEL_TO_BRIDGE event. > When adding a dynamic entry the bridge must be informed that the driver > takes care of the ageing be sending an SWITCHDEV_FDB_OFFLOADED event, > telling the bridge that this added FDB entry will be handled by the > driver. > With this implementation, trace events for age out interrupts are also > added. > > note: A special case arises with the age out interrupt, as the entry > state/spid (source port id) value read from the registers will be zero. > Thus we need to extract the source port from the port vector instead. > > Signed-off-by: Hans J. Schultz <netdev@xxxxxxxxxxxxxxxxxxxx> > --- > drivers/net/dsa/mv88e6xxx/chip.c | 18 ++++++-- > drivers/net/dsa/mv88e6xxx/global1_atu.c | 21 +++++++++ > drivers/net/dsa/mv88e6xxx/port.c | 6 ++- > drivers/net/dsa/mv88e6xxx/switchdev.c | 61 +++++++++++++++++++++++++ > drivers/net/dsa/mv88e6xxx/switchdev.h | 5 ++ > drivers/net/dsa/mv88e6xxx/trace.h | 5 ++ > 6 files changed, 110 insertions(+), 6 deletions(-) > > diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c > index 61d5dc4680e3..a0007d96b2a3 100644 > --- a/drivers/net/dsa/mv88e6xxx/chip.c > +++ b/drivers/net/dsa/mv88e6xxx/chip.c > @@ -42,6 +42,7 @@ > #include "ptp.h" > #include "serdes.h" > #include "smi.h" > +#include "switchdev.h" > > static void assert_reg_lock(struct mv88e6xxx_chip *chip) > { > @@ -2726,18 +2727,25 @@ static int mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port, > const unsigned char *addr, u16 vid, > u16 fdb_flags, struct dsa_db db) > { > + bool is_dynamic = !!(fdb_flags & DSA_FDB_FLAG_DYNAMIC); > struct mv88e6xxx_chip *chip = ds->priv; > + u8 state; > int err; > > - /* Ignore entries with flags set */ > - if (fdb_flags) > - return 0; > + state = MV88E6XXX_G1_ATU_DATA_STATE_UC_STATIC; > + if (is_dynamic) > + state = MV88E6XXX_G1_ATU_DATA_STATE_UC_AGE_7_NEWEST; What if flags other than DSA_FDB_FLAG_DYNAMIC are set (in future)? > + else > + if (fdb_flags) nit: else if (fdb_flags) > + return 0; > ...