Thread (10 messages) flat view 10 messages, 2 authors, 7d ago
COOLING7d

[RFC PATCH net-next v2 1/6] net: dsa: qca8k: implement LAG FDB operations

From: Brandon Mahdavi <hidden>
Date: 2026-08-02 03:47:17
Also in: lkml
Subsystem: networking drivers, networking [dsa], the rest · Maintainers: Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Andrew Lunn, Vladimir Oltean, Linus Torvalds

From: Christian Marangi <ansuelsmth@gmail.com>

DSA sends FDB notifications for addresses associated with an
offloaded LAG through lag_fdb_add() and lag_fdb_del(). QCA8K
represents a LAG destination by setting every local member in the
ATU destination port mask.

Build that mask from DSA LAG membership and use the existing
static FDB helpers. This also provides the callback path needed when
a DSA conduit is itself a LAG.

Link: https://github.com/openwrt/openwrt/commit/500dbaefd2a6a1c9c0d81e275a28c6a8e26519e4
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
Signed-off-by: Brandon Mahdavi <redacted>
---
 drivers/net/dsa/qca/qca8k-8xxx.c   |  2 ++
 drivers/net/dsa/qca/qca8k-common.c | 40 ++++++++++++++++++++++++++++++
 drivers/net/dsa/qca/qca8k.h        |  6 +++++
 3 files changed, 48 insertions(+)
diff --git a/drivers/net/dsa/qca/qca8k-8xxx.c b/drivers/net/dsa/qca/qca8k-8xxx.c
index 4c928983b862..9dce23aaed76 100644
--- a/drivers/net/dsa/qca/qca8k-8xxx.c
+++ b/drivers/net/dsa/qca/qca8k-8xxx.c
@@ -2040,6 +2040,8 @@ static const struct dsa_switch_ops qca8k_switch_ops = {
 	.port_fdb_add		= qca8k_port_fdb_add,
 	.port_fdb_del		= qca8k_port_fdb_del,
 	.port_fdb_dump		= qca8k_port_fdb_dump,
+	.lag_fdb_add		= qca8k_lag_fdb_add,
+	.lag_fdb_del		= qca8k_lag_fdb_del,
 	.port_mdb_add		= qca8k_port_mdb_add,
 	.port_mdb_del		= qca8k_port_mdb_del,
 	.port_mirror_add	= qca8k_port_mirror_add,
diff --git a/drivers/net/dsa/qca/qca8k-common.c b/drivers/net/dsa/qca/qca8k-common.c
index 13005f10edb7..5f0a875e5c87 100644
--- a/drivers/net/dsa/qca/qca8k-common.c
+++ b/drivers/net/dsa/qca/qca8k-common.c
@@ -868,6 +868,46 @@ int qca8k_port_fdb_dump(struct dsa_switch *ds, int port,
 	return 0;
 }
 
+static u8 qca8k_lag_port_mask(struct dsa_switch *ds,
+			      const struct dsa_lag *lag)
+{
+	struct dsa_port *dp;
+	u8 port_mask = 0;
+
+	dsa_lag_foreach_port(dp, ds->dst, lag)
+		if (dp->ds == ds)
+			port_mask |= BIT(dp->index);
+
+	return port_mask;
+}
+
+int qca8k_lag_fdb_add(struct dsa_switch *ds, struct dsa_lag lag,
+		      const unsigned char *addr, u16 vid,
+		      struct dsa_db db)
+{
+	struct qca8k_priv *priv = ds->priv;
+	u8 port_mask;
+
+	port_mask = qca8k_lag_port_mask(ds, &lag);
+
+	return qca8k_port_fdb_insert(priv, addr, port_mask, vid);
+}
+
+int qca8k_lag_fdb_del(struct dsa_switch *ds, struct dsa_lag lag,
+		      const unsigned char *addr, u16 vid,
+		      struct dsa_db db)
+{
+	struct qca8k_priv *priv = ds->priv;
+	u8 port_mask;
+
+	if (!vid)
+		vid = QCA8K_PORT_VID_DEF;
+
+	port_mask = qca8k_lag_port_mask(ds, &lag);
+
+	return qca8k_fdb_del(priv, addr, port_mask, vid);
+}
+
 int qca8k_port_mdb_add(struct dsa_switch *ds, int port,
 		       const struct switchdev_obj_port_mdb *mdb,
 		       struct dsa_db db)
diff --git a/drivers/net/dsa/qca/qca8k.h b/drivers/net/dsa/qca/qca8k.h
index 956338893032..ab8ea261c0b9 100644
--- a/drivers/net/dsa/qca/qca8k.h
+++ b/drivers/net/dsa/qca/qca8k.h
@@ -561,6 +561,12 @@ int qca8k_port_fdb_del(struct dsa_switch *ds, int port,
 		       struct dsa_db db);
 int qca8k_port_fdb_dump(struct dsa_switch *ds, int port,
 			dsa_fdb_dump_cb_t *cb, void *data);
+int qca8k_lag_fdb_add(struct dsa_switch *ds, struct dsa_lag lag,
+		      const unsigned char *addr, u16 vid,
+		      struct dsa_db db);
+int qca8k_lag_fdb_del(struct dsa_switch *ds, struct dsa_lag lag,
+		      const unsigned char *addr, u16 vid,
+		      struct dsa_db db);
 
 /* Common MDB function */
 int qca8k_port_mdb_add(struct dsa_switch *ds, int port,
-- 
2.43.0
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help