Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later
0002  * Copyright (c) 2020, Nikolay Aleksandrov <nikolay@nvidia.com>
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 /* single host's list of set entries and filter_mode */
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 /* (host, src entry) added to a per-src set and host's list */
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 /* per-src set */
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 /* CONFIG_BRIDGE_IGMP_SNOOPING */
0093 
0094 #endif /* _BR_PRIVATE_MCAST_EHT_H_ */