br_private_mcast_eht.h 2.5 KB

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