Merge tag 'memblock-v5.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt...
[linux-2.6-microblaze.git] / net / bridge / br_private_mcast_eht.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright (c) 2020, Nikolay Aleksandrov <nikolay@nvidia.com>
3  */
4 #ifndef _BR_PRIVATE_MCAST_EHT_H_
5 #define _BR_PRIVATE_MCAST_EHT_H_
6
7 #define BR_MCAST_DEFAULT_EHT_HOSTS_LIMIT 512
8
9 union net_bridge_eht_addr {
10         __be32                          ip4;
11 #if IS_ENABLED(CONFIG_IPV6)
12         struct in6_addr                 ip6;
13 #endif
14 };
15
16 /* single host's list of set entries and filter_mode */
17 struct net_bridge_group_eht_host {
18         struct rb_node                  rb_node;
19
20         union net_bridge_eht_addr       h_addr;
21         struct hlist_head               set_entries;
22         unsigned int                    num_entries;
23         unsigned char                   filter_mode;
24         struct net_bridge_port_group    *pg;
25 };
26
27 /* (host, src entry) added to a per-src set and host's list */
28 struct net_bridge_group_eht_set_entry {
29         struct rb_node                  rb_node;
30         struct hlist_node               host_list;
31
32         union net_bridge_eht_addr       h_addr;
33         struct timer_list               timer;
34         struct net_bridge               *br;
35         struct net_bridge_group_eht_set *eht_set;
36         struct net_bridge_group_eht_host *h_parent;
37         struct net_bridge_mcast_gc      mcast_gc;
38 };
39
40 /* per-src set */
41 struct net_bridge_group_eht_set {
42         struct rb_node                  rb_node;
43
44         union net_bridge_eht_addr       src_addr;
45         struct rb_root                  entry_tree;
46         struct timer_list               timer;
47         struct net_bridge_port_group    *pg;
48         struct net_bridge               *br;
49         struct net_bridge_mcast_gc      mcast_gc;
50 };
51
52 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
53 void br_multicast_eht_clean_sets(struct net_bridge_port_group *pg);
54 bool br_multicast_eht_handle(const struct net_bridge_mcast *brmctx,
55                              struct net_bridge_port_group *pg,
56                              void *h_addr,
57                              void *srcs,
58                              u32 nsrcs,
59                              size_t addr_size,
60                              int grec_type);
61 int br_multicast_eht_set_hosts_limit(struct net_bridge_port *p,
62                                      u32 eht_hosts_limit);
63
64 static inline bool
65 br_multicast_eht_should_del_pg(const struct net_bridge_port_group *pg)
66 {
67         return !!((pg->key.port->flags & BR_MULTICAST_FAST_LEAVE) &&
68                   RB_EMPTY_ROOT(&pg->eht_host_tree));
69 }
70
71 static inline bool
72 br_multicast_eht_hosts_over_limit(const struct net_bridge_port_group *pg)
73 {
74         const struct net_bridge_port *p = pg->key.port;
75
76         return !!(p->multicast_eht_hosts_cnt >= p->multicast_eht_hosts_limit);
77 }
78
79 static inline void br_multicast_eht_hosts_inc(struct net_bridge_port_group *pg)
80 {
81         struct net_bridge_port *p = pg->key.port;
82
83         p->multicast_eht_hosts_cnt++;
84 }
85
86 static inline void br_multicast_eht_hosts_dec(struct net_bridge_port_group *pg)
87 {
88         struct net_bridge_port *p = pg->key.port;
89
90         p->multicast_eht_hosts_cnt--;
91 }
92 #endif /* CONFIG_BRIDGE_IGMP_SNOOPING */
93
94 #endif /* _BR_PRIVATE_MCAST_EHT_H_ */