aboutsummaryrefslogtreecommitdiffstats
path: root/net/bridge/br_private.h
diff options
context:
space:
mode:
authorNikolay Aleksandrov <nikolay@cumulusnetworks.com>2020-09-07 12:56:19 +0300
committerJakub Kicinski <kuba@kernel.org>2020-09-07 13:16:36 -0700
commite12cec65b5546f19217e26aafb8add6e2fadca18 (patch)
treea23abc847500aee38959cbcf556b0392da42adc0 /net/bridge/br_private.h
parentnet: bridge: mcast: improve IGMPv3/MLDv2 query processing (diff)
downloadlinux-dev-e12cec65b5546f19217e26aafb8add6e2fadca18.tar.xz
linux-dev-e12cec65b5546f19217e26aafb8add6e2fadca18.zip
net: bridge: mcast: destroy all entries via gc
Since each entry type has timers that can be running simultaneously we need to make sure that entries are not freed before their timers have finished. In order to do that generalize the src gc work to mcast gc work and use a callback to free the entries (mdb, port group or src). v3: add IPv6 support v2: force mcast gc on port del to make sure all port group timers have finished before freeing the bridge port Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to '')
-rw-r--r--net/bridge/br_private.h13
1 files changed, 10 insertions, 3 deletions
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index fb35a73fc559..a23d2bae56e1 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -219,6 +219,11 @@ struct net_bridge_fdb_entry {
#define BR_SGRP_F_DELETE BIT(0)
#define BR_SGRP_F_SEND BIT(1)
+struct net_bridge_mcast_gc {
+ struct hlist_node gc_node;
+ void (*destroy)(struct net_bridge_mcast_gc *gc);
+};
+
struct net_bridge_group_src {
struct hlist_node node;
@@ -229,7 +234,7 @@ struct net_bridge_group_src {
struct timer_list timer;
struct net_bridge *br;
- struct hlist_node del_node;
+ struct net_bridge_mcast_gc mcast_gc;
struct rcu_head rcu;
};
@@ -248,6 +253,7 @@ struct net_bridge_port_group {
struct timer_list rexmit_timer;
struct hlist_node mglist;
+ struct net_bridge_mcast_gc mcast_gc;
struct rcu_head rcu;
};
@@ -261,6 +267,7 @@ struct net_bridge_mdb_entry {
struct timer_list timer;
struct hlist_node mdb_node;
+ struct net_bridge_mcast_gc mcast_gc;
struct rcu_head rcu;
};
@@ -434,7 +441,7 @@ struct net_bridge {
struct rhashtable mdb_hash_tbl;
- struct hlist_head src_gc_list;
+ struct hlist_head mcast_gc_list;
struct hlist_head mdb_list;
struct hlist_head router_list;
@@ -448,7 +455,7 @@ struct net_bridge {
struct bridge_mcast_own_query ip6_own_query;
struct bridge_mcast_querier ip6_querier;
#endif /* IS_ENABLED(CONFIG_IPV6) */
- struct work_struct src_gc_work;
+ struct work_struct mcast_gc_work;
#endif
struct timer_list hello_timer;