Skip to content

Commit 9264e4a

Browse files
vladimirolteandavem330
authored andcommitted
net: dsa: flush the dynamic FDB of the software bridge when fast ageing a port
Currently, when DSA performs fast ageing on a port, 'bridge fdb' shows us that the 'self' entries (corresponding to the hardware bridge, as printed by dsa_slave_fdb_dump) are deleted, but the 'master' entries (corresponding to the software bridge) aren't. Indeed, searching through the bridge driver, neither the brport_attr_learning handler nor the IFLA_BRPORT_LEARNING handler call br_fdb_delete_by_port. However, br_stp_disable_port does, which is one of the paths which DSA uses to trigger a fast ageing process anyway. There is, however, one other very promising caller of br_fdb_delete_by_port, and that is the bridge driver's handler of the SWITCHDEV_FDB_FLUSH_TO_BRIDGE atomic notifier. Currently the s390/qeth HiperSockets card driver is the only user of this. I can't say I understand that driver's architecture or interaction with the bridge, but it appears to not be a switchdev driver in the traditional sense of the word. Nonetheless, the mechanism it provides is a useful way for DSA to express the fact that it performs fast ageing too, in a way that does not change the existing behavior for other drivers. Cc: Alexandra Winter <wintera@linux.ibm.com> Cc: Julian Wiedmann <jwi@linux.ibm.com> Cc: Roopa Prabhu <roopa@nvidia.com> Cc: Nikolay Aleksandrov <nikolay@nvidia.com> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 4eab90d commit 9264e4a

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

net/dsa/port.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,24 @@ static int dsa_port_notify(const struct dsa_port *dp, unsigned long e, void *v)
3030
return dsa_tree_notify(dp->ds->dst, e, v);
3131
}
3232

33+
static void dsa_port_notify_bridge_fdb_flush(const struct dsa_port *dp)
34+
{
35+
struct net_device *brport_dev = dsa_port_to_bridge_port(dp);
36+
struct switchdev_notifier_fdb_info info = {
37+
/* flush all VLANs */
38+
.vid = 0,
39+
};
40+
41+
/* When the port becomes standalone it has already left the bridge.
42+
* Don't notify the bridge in that case.
43+
*/
44+
if (!brport_dev)
45+
return;
46+
47+
call_switchdev_notifiers(SWITCHDEV_FDB_FLUSH_TO_BRIDGE,
48+
brport_dev, &info.info, NULL);
49+
}
50+
3351
static void dsa_port_fast_age(const struct dsa_port *dp)
3452
{
3553
struct dsa_switch *ds = dp->ds;
@@ -38,6 +56,8 @@ static void dsa_port_fast_age(const struct dsa_port *dp)
3856
return;
3957

4058
ds->ops->port_fast_age(ds, dp->index);
59+
60+
dsa_port_notify_bridge_fdb_flush(dp);
4161
}
4262

4363
int dsa_port_set_state(struct dsa_port *dp, u8 state, bool do_fast_age)

0 commit comments

Comments
 (0)