2021-01-20 17:51:54 +03:00
/* 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_
2021-01-26 12:35:32 +03:00
# define BR_MCAST_DEFAULT_EHT_HOSTS_LIMIT 512
2021-01-20 17:51:54 +03:00
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 ;
} ;
2021-01-26 12:35:32 +03:00
# ifdef CONFIG_BRIDGE_IGMP_SNOOPING
2021-01-20 17:51:56 +03:00
void br_multicast_eht_clean_sets ( struct net_bridge_port_group * pg ) ;
2021-07-19 20:06:25 +03:00
bool br_multicast_eht_handle ( const struct net_bridge_mcast * brmctx ,
struct net_bridge_port_group * pg ,
2021-01-20 17:51:58 +03:00
void * h_addr ,
void * srcs ,
u32 nsrcs ,
size_t addr_size ,
int grec_type ) ;
2021-01-26 12:35:33 +03:00
int br_multicast_eht_set_hosts_limit ( struct net_bridge_port * p ,
u32 eht_hosts_limit ) ;
2021-01-20 17:51:56 +03:00
2021-01-20 17:51:59 +03:00
static inline bool
br_multicast_eht_should_del_pg ( const struct net_bridge_port_group * pg )
{
return ! ! ( ( pg - > key . port - > flags & BR_MULTICAST_FAST_LEAVE ) & &
RB_EMPTY_ROOT ( & pg - > eht_host_tree ) ) ;
}
2021-01-26 12:35:32 +03:00
static inline bool
br_multicast_eht_hosts_over_limit ( const struct net_bridge_port_group * pg )
{
const struct net_bridge_port * p = pg - > key . port ;
return ! ! ( p - > multicast_eht_hosts_cnt > = p - > multicast_eht_hosts_limit ) ;
}
static inline void br_multicast_eht_hosts_inc ( struct net_bridge_port_group * pg )
{
struct net_bridge_port * p = pg - > key . port ;
p - > multicast_eht_hosts_cnt + + ;
}
static inline void br_multicast_eht_hosts_dec ( struct net_bridge_port_group * pg )
{
struct net_bridge_port * p = pg - > key . port ;
p - > multicast_eht_hosts_cnt - - ;
}
# endif /* CONFIG_BRIDGE_IGMP_SNOOPING */
2021-01-20 17:51:54 +03:00
# endif /* _BR_PRIVATE_MCAST_EHT_H_ */