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 <[email protected]> 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 > --- > 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; > + > /* 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 > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
