]> git.baikalelectronics.ru Git - kernel.git/commitdiff
net: bridge: multicast: add EHT structures and definitions
authorNikolay Aleksandrov <nikolay@nvidia.com>
Wed, 20 Jan 2021 14:51:54 +0000 (16:51 +0200)
committerJakub Kicinski <kuba@kernel.org>
Sat, 23 Jan 2021 03:39:56 +0000 (19:39 -0800)
Add EHT structures for tracking hosts and sources per group. We keep one
set for each host which has all of the host's S,G entries, and one set for
each multicast source which has all hosts that have joined that S,G. For
each host, source entry we record the filter_mode and we keep an expiry
timer. There is also one global expiry timer per source set, it is
updated with each set entry update, it will be later used to lower the
set's timer instead of lowering each entry's timer separately.

Signed-off-by: Nikolay Aleksandrov <nikolay@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/bridge/br_multicast.c
net/bridge/br_private.h
net/bridge/br_private_mcast_eht.h [new file with mode: 0644]

index f8b685ae56d47866f593fd3a76304eb7a3253b5a..3aaa6adbff828c5edb3649ab81088bd3ea9bf7c7 100644 (file)
@@ -33,6 +33,7 @@
 #endif
 
 #include "br_private.h"
+#include "br_private_mcast_eht.h"
 
 static const struct rhashtable_params br_mdb_rht_params = {
        .head_offset = offsetof(struct net_bridge_mdb_entry, rhnode),
index d62c6e1af64a1a9296138921db79d58b1946fceb..0bf4c544a5da40aaea510411db52c27013a00eec 100644 (file)
@@ -252,6 +252,8 @@ struct net_bridge_port_group {
        struct timer_list               timer;
        struct timer_list               rexmit_timer;
        struct hlist_node               mglist;
+       struct rb_root                  eht_set_tree;
+       struct rb_root                  eht_host_tree;
 
        struct rhash_head               rhnode;
        struct net_bridge_mcast_gc      mcast_gc;
diff --git a/net/bridge/br_private_mcast_eht.h b/net/bridge/br_private_mcast_eht.h
new file mode 100644 (file)
index 0000000..0c9c426
--- /dev/null
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright (c) 2020, Nikolay Aleksandrov <nikolay@nvidia.com>
+ */
+#ifndef _BR_PRIVATE_MCAST_EHT_H_
+#define _BR_PRIVATE_MCAST_EHT_H_
+
+union net_bridge_eht_addr {
+       __be32                          ip4;
+#if IS_ENABLED(CONFIG_IPV6)
+       struct in6_addr                 ip6;
+#endif
+};
+
+/* single host's list of set entries and filter_mode */
+struct net_bridge_group_eht_host {
+       struct rb_node                  rb_node;
+
+       union net_bridge_eht_addr       h_addr;
+       struct hlist_head               set_entries;
+       unsigned int                    num_entries;
+       unsigned char                   filter_mode;
+       struct net_bridge_port_group    *pg;
+};
+
+/* (host, src entry) added to a per-src set and host's list */
+struct net_bridge_group_eht_set_entry {
+       struct rb_node                  rb_node;
+       struct hlist_node               host_list;
+
+       union net_bridge_eht_addr       h_addr;
+       struct timer_list               timer;
+       struct net_bridge               *br;
+       struct net_bridge_group_eht_set *eht_set;
+       struct net_bridge_group_eht_host *h_parent;
+       struct net_bridge_mcast_gc      mcast_gc;
+};
+
+/* per-src set */
+struct net_bridge_group_eht_set {
+       struct rb_node                  rb_node;
+
+       union net_bridge_eht_addr       src_addr;
+       struct rb_root                  entry_tree;
+       struct timer_list               timer;
+       struct net_bridge_port_group    *pg;
+       struct net_bridge               *br;
+       struct net_bridge_mcast_gc      mcast_gc;
+};
+
+#endif /* _BR_PRIVATE_MCAST_EHT_H_ */