On Tue, Jun 09, 2015 at 06:19:35PM -0300, Thadeu Lima de Souza Cascardo wrote:
> On Tue, Jun 09, 2015 at 03:03:03PM -0300, Flavio Leitner wrote:
> > On Mon, Jun 08, 2015 at 01:05:41PM -0300, Thadeu Lima de Souza Cascardo 
> > wrote:
> > > Support IGMPv3 messages with multiple records. Make sure all IGMPv3
> > > messages go through slow path, since they may carry multiple multicast
> > > addresses, unlike IGMPv2.
> > > 
> > > Tests done:
> > > 
> > > * multiple addresses in IGMPv3 report are inserted in mdb;
> > > * address is removed from IGMPv3 if record is INCLUDE_MODE;
> > > * reports sent on a burst with same flow all go to userspace;
> > > * IGMPv3 reports go to mrouters, i.e., ports that have issued a query.
> > > 
> > > Signed-off-by: Thadeu Lima de Souza Cascardo <casca...@redhat.com>
> > > ---
> > >  lib/mcast-snooping.c         | 52 
> > > ++++++++++++++++++++++++++++++++++++++++++++
> > >  lib/mcast-snooping.h         |  5 +++++
> > >  lib/packets.h                | 28 ++++++++++++++++++++++++
> > >  ofproto/ofproto-dpif-xlate.c | 27 +++++++++++++++++++----
> > >  4 files changed, 108 insertions(+), 4 deletions(-)
> > > 
> > > diff --git a/lib/mcast-snooping.c b/lib/mcast-snooping.c
> > > index c3ffd6b..6b89a6c 100644
> > > --- a/lib/mcast-snooping.c
> > > +++ b/lib/mcast-snooping.c
> > > @@ -69,6 +69,7 @@ mcast_snooping_is_membership(ovs_be16 igmp_type)
> > >      switch (ntohs(igmp_type)) {
> > >      case IGMP_HOST_MEMBERSHIP_REPORT:
> > >      case IGMPV2_HOST_MEMBERSHIP_REPORT:
> > > +    case IGMPV3_HOST_MEMBERSHIP_REPORT:
> > >      case IGMP_HOST_LEAVE_MESSAGE:
> > >          return true;
> > >      }
> > > @@ -416,6 +417,57 @@ mcast_snooping_add_group(struct mcast_snooping *ms, 
> > > ovs_be32 ip4,
> > >      return learned;
> > >  }
> > >  
> > > +int
> > > +mcast_snooping_add_report(struct mcast_snooping *ms,
> > > +                          const struct dp_packet *p,
> > > +                          uint16_t vlan, void *port)
> > > +{
> > > +    ovs_be32 ip4;
> > > +    size_t offset;
> > > +    const struct igmpv3_header *igmpv3;
> > > +    const struct igmpv3_record *record;
> > > +    int count = 0;
> > > +    int ngrp;
> > > +
> > > +    offset = p->l4_ofs;
> > 
> > The above could be like this:
> > offset = dp_packet_l4(p) - dp_packet_data(p)
> > to avoid accessing internals of dp_packet.
> > 
> 
> That's how it originally was written, but I thought that using it like
> this would protect the code against l4_ofs being UINT16_MAX, and
> dp_packet_l4 returning NULL.
> 
> Any thoughs on that? Should I just check for dp_packet_l4 returning NULL?

The UINT16_MAX is reserved and means not set.
see dp_packet_reset_offsets()

[...]
> > > @@ -2270,8 +2281,16 @@ xlate_normal(struct xlate_ctx *ctx)
> > >                  if (mcast_snooping_is_membership(flow->tp_src) ||
> > >                      mcast_snooping_is_query(flow->tp_src)) {
> > >                      update_mcast_snooping_table(ctx->xbridge, flow, vlan,
> > > -                                                in_xbundle);
> > > +                                                in_xbundle, 
> > > ctx->xin->packet);
> > > +                    /*
> > > +                     * Since there may be multiple addresses in the
> > > +                     * packet, flow keys can't be used. Setting slow
> > > +                     * prevents the flow from being installed in the DP.
> > > +                     */
> > > +                    if (ntohs(flow->tp_src) == 
> > > IGMPV3_HOST_MEMBERSHIP_REPORT) {
> > > +                        ctx->xout->slow |= SLOW_ACTION;
> > >                      }
> > 
> > Hm, I think the slow path enforcement is valid for all IGMP versions
> > because even for IGMPv1 or v2, a report can't pass through the DP
> > directly without refreshing the mdb.  It works today because the
> > flow will expire way before the IGMP expiration or next querier
> > probe.
> > 
> > fbl
> 
> That makes sense. In that case, I think I could send a different patch
> for that, to be applied before IGMPv3 support.

Agree.
Thanks,
fbl

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to