On 16 Nov 2023, at 15:58, Eelco Chaudron wrote:
> On 16 Nov 2023, at 15:08, Mohammad Heib wrote: > >> Store the igmp/mld protocol version into the >> mcast_group internally. >> >> This can be used by ovs consumers to update >> about the igmp/mld version of each group. >> >> Signed-off-by: Mohammad Heib <mh...@redhat.com> > > Hi Mohammad, > > Thanks for the patch, I have not reviewed the actual code yet, but it would > be good to include a use case for this patch (maybe expand this to a series). > This way it’s clear why we need to store this information. > > Cheers, > > Eelco After a quick code review I have one comment, see below. >> --- >> lib/mcast-snooping.c | 16 +++++++++------- >> lib/mcast-snooping.h | 9 ++++++--- >> ofproto/ofproto-dpif-xlate.c | 6 ++++-- >> 3 files changed, 19 insertions(+), 12 deletions(-) >> >> diff --git a/lib/mcast-snooping.c b/lib/mcast-snooping.c >> index 029ca2855..926daf9ac 100644 >> --- a/lib/mcast-snooping.c >> +++ b/lib/mcast-snooping.c >> @@ -389,7 +389,7 @@ mcast_snooping_prune_expired(struct mcast_snooping *ms, >> bool >> mcast_snooping_add_group(struct mcast_snooping *ms, >> const struct in6_addr *addr, >> - uint16_t vlan, void *port) >> + uint16_t vlan, void *port, uint8_t grp_proto) >> OVS_REQ_WRLOCK(ms->rwlock) >> { >> bool learned; >> @@ -415,6 +415,7 @@ mcast_snooping_add_group(struct mcast_snooping *ms, >> hmap_insert(&ms->table, &grp->hmap_node, hash); >> grp->addr = *addr; >> grp->vlan = vlan; >> + grp->protocol_version = grp_proto; >> ovs_list_init(&grp->bundle_lru); >> learned = true; >> ms->need_revalidate = true; >> @@ -431,17 +432,17 @@ mcast_snooping_add_group(struct mcast_snooping *ms, >> >> bool >> mcast_snooping_add_group4(struct mcast_snooping *ms, ovs_be32 ip4, >> - uint16_t vlan, void *port) >> + uint16_t vlan, void *port, uint8_t grp_proto) >> OVS_REQ_WRLOCK(ms->rwlock) >> { >> struct in6_addr addr = in6_addr_mapped_ipv4(ip4); >> - return mcast_snooping_add_group(ms, &addr, vlan, port); >> + return mcast_snooping_add_group(ms, &addr, vlan, port, grp_proto); >> } >> >> int >> mcast_snooping_add_report(struct mcast_snooping *ms, >> const struct dp_packet *p, >> - uint16_t vlan, void *port) >> + uint16_t vlan, void *port, uint8_t grp_proto) >> { >> ovs_be32 ip4; >> size_t offset; >> @@ -478,7 +479,7 @@ mcast_snooping_add_report(struct mcast_snooping *ms, >> || record->type == IGMPV3_CHANGE_TO_INCLUDE_MODE)) { >> ret = mcast_snooping_leave_group4(ms, ip4, vlan, port); >> } else { >> - ret = mcast_snooping_add_group4(ms, ip4, vlan, port); >> + ret = mcast_snooping_add_group4(ms, ip4, vlan, port, grp_proto); >> } >> if (ret) { >> count++; >> @@ -513,7 +514,7 @@ mcast_snooping_add_mld(struct mcast_snooping *ms, >> >> switch (mld->type) { >> case MLD_REPORT: >> - ret = mcast_snooping_add_group(ms, addr, vlan, port); >> + ret = mcast_snooping_add_group(ms, addr, vlan, port, MLD_REPORT); >> if (ret) { >> count++; >> } >> @@ -545,7 +546,8 @@ mcast_snooping_add_mld(struct mcast_snooping *ms, >> || record->type == IGMPV3_CHANGE_TO_INCLUDE_MODE)) { >> ret = mcast_snooping_leave_group(ms, addr, vlan, port); >> } else { >> - ret = mcast_snooping_add_group(ms, addr, vlan, port); >> + ret = mcast_snooping_add_group(ms, addr, vlan, port, >> + MLD2_REPORT); >> } >> if (ret) { >> count++; >> diff --git a/lib/mcast-snooping.h b/lib/mcast-snooping.h >> index f120405da..6321b63ab 100644 >> --- a/lib/mcast-snooping.h >> +++ b/lib/mcast-snooping.h >> @@ -51,6 +51,9 @@ struct mcast_group { >> /* VLAN tag. */ >> uint16_t vlan; >> >> + /* Multicast group IPv6/IPv4 Protocol version IGMPv1,2,3 or MLDv1,2 */ >> + uint8_t protocol_version; Not sure if this is the correct way to store the data. You are storing the IGMP type definition for IGMP, and for MLD the MLD ICMPv6 value. I would prefer a newly defined type (enum) that is globally unique because a new protocol in the future might use an overlapping value. >> /* Node in parent struct mcast_snooping group_lru. */ >> struct ovs_list group_node OVS_GUARDED; >> >> @@ -185,14 +188,14 @@ mcast_snooping_lookup4(const struct mcast_snooping >> *ms, ovs_be32 ip4, >> /* Learning. */ >> bool mcast_snooping_add_group(struct mcast_snooping *ms, >> const struct in6_addr *addr, >> - uint16_t vlan, void *port) >> + uint16_t vlan, void *port, uint8_t grp_proto) >> OVS_REQ_WRLOCK(ms->rwlock); >> bool mcast_snooping_add_group4(struct mcast_snooping *ms, ovs_be32 ip4, >> - uint16_t vlan, void *port) >> + uint16_t vlan, void *port, uint8_t grp_proto) >> OVS_REQ_WRLOCK(ms->rwlock); >> int mcast_snooping_add_report(struct mcast_snooping *ms, >> const struct dp_packet *p, >> - uint16_t vlan, void *port) >> + uint16_t vlan, void *port, uint8_t grp_proto) >> OVS_REQ_WRLOCK(ms->rwlock); >> int mcast_snooping_add_mld(struct mcast_snooping *ms, >> const struct dp_packet *p, >> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c >> index e24377330..26bd678cd 100644 >> --- a/ofproto/ofproto-dpif-xlate.c >> +++ b/ofproto/ofproto-dpif-xlate.c >> @@ -2781,7 +2781,8 @@ update_mcast_snooping_table4__(const struct xlate_ctx >> *ctx, >> switch (ntohs(flow->tp_src)) { >> case IGMP_HOST_MEMBERSHIP_REPORT: >> case IGMPV2_HOST_MEMBERSHIP_REPORT: >> - if (mcast_snooping_add_group4(ms, ip4, vlan, in_xbundle->ofbundle)) >> { >> + if (mcast_snooping_add_group4(ms, ip4, vlan, in_xbundle->ofbundle, >> + ntohs(flow->tp_src))) { >> xlate_report_debug(ctx, OFT_DETAIL, >> "multicast snooping learned that " >> IP_FMT" is on port %s in VLAN %d", >> @@ -2805,7 +2806,8 @@ update_mcast_snooping_table4__(const struct xlate_ctx >> *ctx, >> break; >> case IGMPV3_HOST_MEMBERSHIP_REPORT: >> count = mcast_snooping_add_report(ms, packet, vlan, >> - in_xbundle->ofbundle); >> + in_xbundle->ofbundle, >> + ntohs(flow->tp_src)); >> if (count) { >> xlate_report_debug(ctx, OFT_DETAIL, "multicast snooping >> processed " >> "%d addresses on port %s in VLAN %d", >> -- >> 2.34.3 >> >> _______________________________________________ >> dev mailing list >> d...@openvswitch.org >> https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev