Commit | Line | Data |
---|---|---|
8f07b831 NA |
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 | ||
89268b05 NA |
7 | #define BR_MCAST_DEFAULT_EHT_HOSTS_LIMIT 512 |
8 | ||
8f07b831 NA |
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 | ||
89268b05 | 52 | #ifdef CONFIG_BRIDGE_IGMP_SNOOPING |
baa74d39 | 53 | void br_multicast_eht_clean_sets(struct net_bridge_port_group *pg); |
adc47037 NA |
54 | bool br_multicast_eht_handle(const struct net_bridge_mcast *brmctx, |
55 | struct net_bridge_port_group *pg, | |
474ddb37 NA |
56 | void *h_addr, |
57 | void *srcs, | |
58 | u32 nsrcs, | |
59 | size_t addr_size, | |
60 | int grec_type); | |
2dba407f NA |
61 | int br_multicast_eht_set_hosts_limit(struct net_bridge_port *p, |
62 | u32 eht_hosts_limit); | |
baa74d39 | 63 | |
ddc255d9 NA |
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 | ||
89268b05 NA |
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 | ||
8f07b831 | 94 | #endif /* _BR_PRIVATE_MCAST_EHT_H_ */ |