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
699#define MDB_TEMPORARY 0699#define MDB_TEMPORARY 0
700#define MDB_PERMANENT 1700#define MDB_PERMANENT 1
701 __u8 state;701 __u8 state;
702#define MDB_FLAGS_OFFLOAD (1 << 0)702#define MDB_FLAGS_OFFLOAD (1 << 0)
703#define MDB_FLAGS_FAST_LEAVE (1 << 1)703#define MDB_FLAGS_FAST_LEAVE (1 << 1)
704#define MDB_FLAGS_STAR_EXCL (1 << 2)704#define MDB_FLAGS_STAR_EXCL (1 << 2)
705#define MDB_FLAGS_BLOCKED (1 << 3)705#define MDB_FLAGS_BLOCKED (1 << 3)
706#define MDB_FLAGS_OFFLOAD_FAILED (1 << 4)
706 __u8 flags;707 __u8 flags;
707 __u16 vid;708 __u16 vid;
708 struct {709 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
144 e->flags |= MDB_FLAGS_STAR_EXCL;144 e->flags |= MDB_FLAGS_STAR_EXCL;
145 if (flags & MDB_PG_FLAGS_BLOCKED)145 if (flags & MDB_PG_FLAGS_BLOCKED)
146 e->flags |= MDB_FLAGS_BLOCKED;146 e->flags |= MDB_FLAGS_BLOCKED;
147 if (flags & MDB_PG_FLAGS_OFFLOAD_FAILED)
148 e->flags |= MDB_FLAGS_OFFLOAD_FAILED;
147}149}
148 150
149static void __mdb_entry_to_br_ip(struct br_mdb_entry *entry, struct br_ip *ip,151static 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
306 u16 vlan_id;306 u16 vlan_id;
307};307};
308 308
309#define MDB_PG_FLAGS_PERMANENT BIT(0)309#define MDB_PG_FLAGS_PERMANENT BIT(0)
310#define MDB_PG_FLAGS_OFFLOAD BIT(1)310#define MDB_PG_FLAGS_OFFLOAD BIT(1)
311#define MDB_PG_FLAGS_FAST_LEAVE BIT(2)311#define MDB_PG_FLAGS_FAST_LEAVE BIT(2)
312#define MDB_PG_FLAGS_STAR_EXCL BIT(3)312#define MDB_PG_FLAGS_STAR_EXCL BIT(3)
313#define MDB_PG_FLAGS_BLOCKED BIT(4)313#define MDB_PG_FLAGS_BLOCKED BIT(4)
314#define MDB_PG_FLAGS_OFFLOAD_FAILED BIT(5)
314 315
315#define PG_SRC_ENT_LIMIT 32316#define PG_SRC_ENT_LIMIT 32
316 317
@@ -1342,6 +1343,15 @@ br_multicast_ctx_matches_vlan_snooping(const struct net_bridge_mcast *brmctx) · 1025 unmodified lines
1342 1343
1343 return !!(vlan_snooping_enabled == br_multicast_ctx_is_vlan(brmctx));1344 return !!(vlan_snooping_enabled == br_multicast_ctx_is_vlan(brmctx));
1344}1345}
1346
1347static inline void
1348br_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}
1345#else1355#else
1346static inline int br_multicast_rcv(struct net_bridge_mcast **brmctx,1356static inline int br_multicast_rcv(struct net_bridge_mcast **brmctx,
1347 struct net_bridge_mcast_port **pmctx,1357 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
505 struct net_bridge_port *port = data->port;505 struct net_bridge_port *port = data->port;
506 struct net_bridge *br = port->br;506 struct net_bridge *br = port->br;
507 507
508 if (err)508 if (err == -EOPNOTSUPP)
509 goto err;509 goto out_free;
510 510
511 spin_lock_bh(&br->multicast_lock);511 spin_lock_bh(&br->multicast_lock);
512 mp = br_mdb_ip_get(br, &data->ip);512 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
516 pp = &p->next) {516 pp = &p->next) {
517 if (p->key.port != port)517 if (p->key.port != port)
518 continue;518 continue;
519 p->flags |= MDB_PG_FLAGS_OFFLOAD;519
520 br_multicast_set_pg_offload_flags(p, !err);
520 }521 }
521out:522out:
522 spin_unlock_bh(&br->multicast_lock);523 spin_unlock_bh(&br->multicast_lock);
523err:524out_free:
524 kfree(priv);525 kfree(priv);
525}526}
526 527