#define MCAST_SNOOPING_H 1
#include <time.h>
+#include "dp-packet.h"
#include "hmap.h"
#include "list.h"
#include "ovs-atomic.h"
/* Node in parent struct mcast_snooping hmap. */
struct hmap_node hmap_node;
- /* Multicast group IPv4 address. */
- ovs_be32 ip4;
+ /* Multicast group IPv6/IPv4 address. */
+ struct in6_addr addr;
/* VLAN tag. */
uint16_t vlan;
/* Node in parent struct mcast_snooping group_lru. */
- struct list group_node OVS_GUARDED;
+ struct ovs_list group_node OVS_GUARDED;
/* Contains struct mcast_group_bundle (ports), least recently used
* at the front, most recently used at the back. */
- struct list bundle_lru OVS_GUARDED;
+ struct ovs_list bundle_lru OVS_GUARDED;
};
/* The bundle associated to the multicast group.
* Guarded by owning 'mcast_snooping''s rwlock. */
struct mcast_group_bundle {
/* Node in parent struct mcast_group bundle_lru list. */
- struct list bundle_node OVS_GUARDED;
+ struct ovs_list bundle_node OVS_GUARDED;
/* When this node expires. */
time_t expires;
* Guarded by owning 'mcast_snooping''s rwlock. */
struct mcast_mrouter_bundle {
/* Node in parent struct mcast_group mrouter_lru list. */
- struct list mrouter_node OVS_GUARDED;
+ struct ovs_list mrouter_node OVS_GUARDED;
/* When this node expires. */
time_t expires;
void *port OVS_GUARDED;
};
-/* The bundle to be flooded with multicast traffic.
+/* The bundle to send multicast traffic or Reports.
* Guarded by owning 'mcast_snooping''s rwlock */
-struct mcast_fport_bundle {
- /* Node in parent struct mcast_snooping fport_list. */
- struct list fport_node;
+struct mcast_port_bundle {
+ /* Node in parent struct mcast_snooping. */
+ struct ovs_list node;
/* VLAN tag. */
uint16_t vlan;
/* Learned port. */
- void *port OVS_GUARDED;
+ void *port;
};
/* Multicast snooping table. */
/* Contains struct mcast_group, least recently used at the front,
* most recently used at the back. */
- struct list group_lru OVS_GUARDED;
+ struct ovs_list group_lru OVS_GUARDED;
/* Contains struct mcast_mrouter_bundle, least recently used at the
* front, most recently used at the back. */
- struct list mrouter_lru OVS_GUARDED;
+ struct ovs_list mrouter_lru OVS_GUARDED;
- /* Contains struct mcast_fport_bundle to be flooded with multicast
+ /* Contains struct mcast_port_bundle to be flooded with multicast
* packets in no special order. */
- struct list fport_list OVS_GUARDED;
+ struct ovs_list fport_list OVS_GUARDED;
+
+ /* Contains struct mcast_port_bundle to forward Reports in
+ * no special order. */
+ struct ovs_list rport_list OVS_GUARDED;
/* Secret for randomizing hash table. */
uint32_t secret;
bool
mcast_snooping_set_flood_unreg(struct mcast_snooping *ms, bool enable)
OVS_REQ_WRLOCK(ms->rwlock);
-void mcast_snooping_set_port_flood(struct mcast_snooping *ms, uint16_t vlan,
- void *port, bool flood)
+void mcast_snooping_set_port_flood(struct mcast_snooping *ms, void *port,
+ bool flood)
+ OVS_REQ_WRLOCK(ms->rwlock);
+void mcast_snooping_set_port_flood_reports(struct mcast_snooping *ms,
+ void *port, bool flood)
OVS_REQ_WRLOCK(ms->rwlock);
/* Lookup. */
struct mcast_group *
-mcast_snooping_lookup(const struct mcast_snooping *ms, ovs_be32 dip,
- uint16_t vlan)
+mcast_snooping_lookup(const struct mcast_snooping *ms,
+ const struct in6_addr *dip, uint16_t vlan)
+ OVS_REQ_RDLOCK(ms->rwlock);
+struct mcast_group *
+mcast_snooping_lookup4(const struct mcast_snooping *ms, ovs_be32 ip4,
+ uint16_t vlan)
OVS_REQ_RDLOCK(ms->rwlock);
/* Learning. */
-bool mcast_snooping_add_group(struct mcast_snooping *ms, ovs_be32 ip4,
+bool mcast_snooping_add_group(struct mcast_snooping *ms,
+ const struct in6_addr *addr,
uint16_t vlan, void *port)
OVS_REQ_WRLOCK(ms->rwlock);
-bool mcast_snooping_leave_group(struct mcast_snooping *ms, ovs_be32 ip4,
+bool mcast_snooping_add_group4(struct mcast_snooping *ms, ovs_be32 ip4,
+ uint16_t vlan, void *port)
+ OVS_REQ_WRLOCK(ms->rwlock);
+int mcast_snooping_add_report(struct mcast_snooping *ms,
+ const struct dp_packet *p,
+ uint16_t vlan, void *port)
+ OVS_REQ_WRLOCK(ms->rwlock);
+int mcast_snooping_add_mld(struct mcast_snooping *ms,
+ const struct dp_packet *p,
+ uint16_t vlan, void *port)
+ OVS_REQ_WRLOCK(ms->rwlock);
+bool mcast_snooping_leave_group(struct mcast_snooping *ms,
+ const struct in6_addr *addr,
uint16_t vlan, void *port)
OVS_REQ_WRLOCK(ms->rwlock);
+bool mcast_snooping_leave_group4(struct mcast_snooping *ms, ovs_be32 ip4,
+ uint16_t vlan, void *port)
+ OVS_REQ_WRLOCK(ms->rwlock);
bool mcast_snooping_add_mrouter(struct mcast_snooping *ms, uint16_t vlan,
void *port)
OVS_REQ_WRLOCK(ms->rwlock);
-struct mcast_fport_bundle *
-mcast_snooping_fport_lookup(struct mcast_snooping *ms, uint16_t vlan,
- void *port)
- OVS_REQ_RDLOCK(ms->rwlock);
bool mcast_snooping_is_query(ovs_be16 igmp_type);
bool mcast_snooping_is_membership(ovs_be16 igmp_type);