History

net: bridge: mcast: Add offload failed mdb flag

Add MDB_FLAGS_OFFLOAD_FAILED and MDB_PG_FLAGS_OFFLOAD_FAILED to indicate that an attempt to offload the MDB entry to switchdev has failed.

Joseph Huang committed 1 year ago

Commit e846fb51 parent 1450e454 files · +27 −13Browse files

Unified · Split

4 files
  1. include/uapi/linux/if_bridge.h +5 −4
  2. net/bridge/br_mdb.c +2 −0
  3. net/bridge/br_private.h +15 −5
  4. net/bridge/br_switchdev.c +5 −4
include/uapi/linux/if_bridge.h+5−4
@@ -699,10 +699,11 @@ struct br_mdb_entry { · 698 unmodified lines
699699 #define MDB_TEMPORARY 0
700700 #define MDB_PERMANENT 1
701701 __u8 state;
702−#define MDB_FLAGS_OFFLOAD (1 << 0)
703−#define MDB_FLAGS_FAST_LEAVE (1 << 1)
704−#define MDB_FLAGS_STAR_EXCL (1 << 2)
705−#define MDB_FLAGS_BLOCKED (1 << 3)
702+#define MDB_FLAGS_OFFLOAD (1 << 0)
703+#define MDB_FLAGS_FAST_LEAVE (1 << 1)
704+#define MDB_FLAGS_STAR_EXCL (1 << 2)
705+#define MDB_FLAGS_BLOCKED (1 << 3)
706+#define MDB_FLAGS_OFFLOAD_FAILED (1 << 4)
706707 __u8 flags;
707708 __u16 vid;
708709 struct {
net/bridge/br_mdb.c+2−0
@@ -144,6 +144,8 @@ static void __mdb_entry_fill_flags(struct br_mdb_entry *e, unsigned char flags) · 143 unmodified lines
144144 e->flags |= MDB_FLAGS_STAR_EXCL;
145145 if (flags & MDB_PG_FLAGS_BLOCKED)
146146 e->flags |= MDB_FLAGS_BLOCKED;
147+ if (flags & MDB_PG_FLAGS_OFFLOAD_FAILED)
148+ e->flags |= MDB_FLAGS_OFFLOAD_FAILED;
147149 }
148150
149151 static void __mdb_entry_to_br_ip(struct br_mdb_entry *entry, struct br_ip *ip,
net/bridge/br_private.h+15−5
@@ -306,11 +306,12 @@ struct net_bridge_fdb_flush_desc { · 305 unmodified lines
306306 u16 vlan_id;
307307 };
308308
309−#define MDB_PG_FLAGS_PERMANENT BIT(0)
310−#define MDB_PG_FLAGS_OFFLOAD BIT(1)
311−#define MDB_PG_FLAGS_FAST_LEAVE BIT(2)
312−#define MDB_PG_FLAGS_STAR_EXCL BIT(3)
313−#define MDB_PG_FLAGS_BLOCKED BIT(4)
309+#define MDB_PG_FLAGS_PERMANENT BIT(0)
310+#define MDB_PG_FLAGS_OFFLOAD BIT(1)
311+#define MDB_PG_FLAGS_FAST_LEAVE BIT(2)
312+#define MDB_PG_FLAGS_STAR_EXCL BIT(3)
313+#define MDB_PG_FLAGS_BLOCKED BIT(4)
314+#define MDB_PG_FLAGS_OFFLOAD_FAILED BIT(5)
314315
315316 #define PG_SRC_ENT_LIMIT 32
316317
@@ -1342,6 +1343,15 @@ br_multicast_ctx_matches_vlan_snooping(const struct net_bridge_mcast *brmctx) · 1025 unmodified lines
13421343
13431344 return !!(vlan_snooping_enabled == br_multicast_ctx_is_vlan(brmctx));
13441345 }
1346+
1347+static inline void
1348+br_multicast_set_pg_offload_flags(struct net_bridge_port_group *p,
1349+ bool offloaded)
1350+{
1351+ p->flags &= ~(MDB_PG_FLAGS_OFFLOAD | MDB_PG_FLAGS_OFFLOAD_FAILED);
1352+ p->flags |= (offloaded ? MDB_PG_FLAGS_OFFLOAD :
1353+ MDB_PG_FLAGS_OFFLOAD_FAILED);
1354+}
13451355 #else
13461356 static inline int br_multicast_rcv(struct net_bridge_mcast **brmctx,
13471357 struct net_bridge_mcast_port **pmctx,
net/bridge/br_switchdev.c+5−4
@@ -505,8 +505,8 @@ static void br_switchdev_mdb_complete(struct net_device *dev, int err, void *pri · 504 unmodified lines
505505 struct net_bridge_port *port = data->port;
506506 struct net_bridge *br = port->br;
507507
508− if (err)
509− goto err;
508+ if (err == -EOPNOTSUPP)
509+ goto out_free;
510510
511511 spin_lock_bh(&br->multicast_lock);
512512 mp = br_mdb_ip_get(br, &data->ip);
@@ -516,11 +516,12 @@ static void br_switchdev_mdb_complete(struct net_device *dev, int err, void *pri · 3 unmodified lines
516516 pp = &p->next) {
517517 if (p->key.port != port)
518518 continue;
519− p->flags |= MDB_PG_FLAGS_OFFLOAD;
519+
520+ br_multicast_set_pg_offload_flags(p, !err);
520521 }
521522 out:
522523 spin_unlock_bh(&br->multicast_lock);
523−err:
524+out_free:
524525 kfree(priv);
525526 }
526527