0001
0002
0003
0004 #ifndef _BR_PRIVATE_MCAST_EHT_H_
0005 #define _BR_PRIVATE_MCAST_EHT_H_
0006
0007 #define BR_MCAST_DEFAULT_EHT_HOSTS_LIMIT 512
0008
0009 union net_bridge_eht_addr {
0010 __be32 ip4;
0011 #if IS_ENABLED(CONFIG_IPV6)
0012 struct in6_addr ip6;
0013 #endif
0014 };
0015
0016
0017 struct net_bridge_group_eht_host {
0018 struct rb_node rb_node;
0019
0020 union net_bridge_eht_addr h_addr;
0021 struct hlist_head set_entries;
0022 unsigned int num_entries;
0023 unsigned char filter_mode;
0024 struct net_bridge_port_group *pg;
0025 };
0026
0027
0028 struct net_bridge_group_eht_set_entry {
0029 struct rb_node rb_node;
0030 struct hlist_node host_list;
0031
0032 union net_bridge_eht_addr h_addr;
0033 struct timer_list timer;
0034 struct net_bridge *br;
0035 struct net_bridge_group_eht_set *eht_set;
0036 struct net_bridge_group_eht_host *h_parent;
0037 struct net_bridge_mcast_gc mcast_gc;
0038 };
0039
0040
0041 struct net_bridge_group_eht_set {
0042 struct rb_node rb_node;
0043
0044 union net_bridge_eht_addr src_addr;
0045 struct rb_root entry_tree;
0046 struct timer_list timer;
0047 struct net_bridge_port_group *pg;
0048 struct net_bridge *br;
0049 struct net_bridge_mcast_gc mcast_gc;
0050 };
0051
0052 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
0053 void br_multicast_eht_clean_sets(struct net_bridge_port_group *pg);
0054 bool br_multicast_eht_handle(const struct net_bridge_mcast *brmctx,
0055 struct net_bridge_port_group *pg,
0056 void *h_addr,
0057 void *srcs,
0058 u32 nsrcs,
0059 size_t addr_size,
0060 int grec_type);
0061 int br_multicast_eht_set_hosts_limit(struct net_bridge_port *p,
0062 u32 eht_hosts_limit);
0063
0064 static inline bool
0065 br_multicast_eht_should_del_pg(const struct net_bridge_port_group *pg)
0066 {
0067 return !!((pg->key.port->flags & BR_MULTICAST_FAST_LEAVE) &&
0068 RB_EMPTY_ROOT(&pg->eht_host_tree));
0069 }
0070
0071 static inline bool
0072 br_multicast_eht_hosts_over_limit(const struct net_bridge_port_group *pg)
0073 {
0074 const struct net_bridge_port *p = pg->key.port;
0075
0076 return !!(p->multicast_eht_hosts_cnt >= p->multicast_eht_hosts_limit);
0077 }
0078
0079 static inline void br_multicast_eht_hosts_inc(struct net_bridge_port_group *pg)
0080 {
0081 struct net_bridge_port *p = pg->key.port;
0082
0083 p->multicast_eht_hosts_cnt++;
0084 }
0085
0086 static inline void br_multicast_eht_hosts_dec(struct net_bridge_port_group *pg)
0087 {
0088 struct net_bridge_port *p = pg->key.port;
0089
0090 p->multicast_eht_hosts_cnt--;
0091 }
0092 #endif
0093
0094 #endif