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.
Unified · Split
| @@ -699,10 +699,11 @@ struct br_mdb_entry { · 698 unmodified lines | |||
| 699 | #define MDB_TEMPORARY 0 | 699 | #define MDB_TEMPORARY 0 |
| 700 | #define MDB_PERMANENT 1 | 700 | #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 { |
| @@ -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 | ||
| 149 | static void __mdb_entry_to_br_ip(struct br_mdb_entry *entry, struct br_ip *ip, | 151 | static void __mdb_entry_to_br_ip(struct br_mdb_entry *entry, struct br_ip *ip, |
| @@ -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 32 | 316 | #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 | |||
| 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 | } | ||
| 1345 | #else | 1355 | #else |
| 1346 | static inline int br_multicast_rcv(struct net_bridge_mcast **brmctx, | 1356 | static inline int br_multicast_rcv(struct net_bridge_mcast **brmctx, |
| 1347 | struct net_bridge_mcast_port **pmctx, | 1357 | struct net_bridge_mcast_port **pmctx, |
| @@ -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 | } |
| 521 | out: | 522 | out: |
| 522 | spin_unlock_bh(&br->multicast_lock); | 523 | spin_unlock_bh(&br->multicast_lock); |
| 523 | err: | 524 | out_free: |
| 524 | kfree(priv); | 525 | kfree(priv); |
| 525 | } | 526 | } |
| 526 | 527 | ||