Hello Jan,

Thank you for the review.
The recirc_id_node, and thus the frozen_state with the the ofproto_uuid can be 
retrieved from recirc ID via recirc_id_node_find(). So I think, it would be 
feasible to get the ofproto from the recirc ID without calling tnl_find(). In 
addition we would need to store in_port in the frozen_state.

However, if we do not fix this in tnl_find(), then we need to make sure, that 
neither xlate_lookup_ofproto() nor xlate_lookup() are called after 
flow->packet_type has changed during xlate, don't we? For instance, calling 
revalidate() can lead to call xlate_lookup().

Btw, what about the case, when we have a L2 and L3 port with the same local IP. 
A packet is received on one of them, but the packet_type has changed during 
xlate and later revalidate leads to calling xlate_lookup()? It will provide the 
wrong tunnel port as in_port. Is this a valid case?

I was thinking about storing the original value of packet_type of received 
packet in dp_packet or in the flow structure. Then use the original value in 
tnl_find().

Best regards,
Zoltan

> -----Original Message-----
> From: Jan Scheurich
> Sent: Friday, December 08, 2017 11:30 AM
> To: Zoltán Balogh <zoltan.bal...@ericsson.com>; d...@openvswitch.org
> Cc: Ben Pfaff <b...@ovn.org>
> Subject: RE: [PATCH] tunnel: fix tnl_find() after packet_type changed
> 
> Hi Zoltan,
> 
> My feeling here is that it is conceptually wrong to do another tunnel lookup 
> if the packet is recirculated after it
> has already been de-tunneled. You are trying to fix the symptoms and I am not 
> sure that the more liberal check on
> packet type won't lead to incorrect proper tunnel port lookups.
> 
> The actual bridge is stored in the frozen state of the recirculation context, 
> and the OF in_port should be stored
> there as well (if it is not yet). I believe a recirculation should never 
> change the bridge and the OF in_port. @Ben:
> Can you confirm?
> 
> I think the order of things is wrong in an upcall. First ofproto should check 
> if it is a recirculation upcall, and
> only if it is not, it should derive the bridge and the in_port from the flow. 
> Today the first recirculation check
> happens later in upcall_xlate().
> 
> Can you look into that option and propose a better way to solve the issue?
> 
> Thanks, Jan
> 
> > -----Original Message-----
> > From: Zoltán Balogh
> > Sent: Friday, 08 December, 2017 10:56
> > To: d...@openvswitch.org
> > Cc: Zoltán Balogh <zoltan.bal...@ericsson.com>; Jan Scheurich 
> > <jan.scheur...@ericsson.com>; Ben Pfaff
> <b...@ovn.org>
> > Subject: [PATCH] tunnel: fix tnl_find() after packet_type changed
> >
> > During xlate, it can happen that tnl_find() is invoked when flow
> > packet_type has been already changed. For instance, pop_mpls and
> > resubmit actions should be applied to the packet in overlay bridge after
> > packet was received on a legacy_l3 tunnel port.
> > In this case, packet is recirculated after pop_mpls, a new tunnel lookup
> > is performed in order to find the proper ofproto, however packet_type of
> > flow is already PT_ETHERNET while the tunnel port mode is
> > NETDEV_PT_LEGACY_L3. So, no tunnel port is found and the packet is
> > dropped.
> >
> > This fix does an additional tnl_find() if no port is found. It looks for
> > L3 tunnel port in case of L2 packet and vice versa.
> >
> > Signed-off-by: Zoltan Balogh <zoltan.bal...@ericsson.com>
> > CC: Jan Scheurich <jan.scheur...@ericsson.com>
> > CC: Ben Pfaff <b...@ovn.org>
> > Fixes: 875ab13020b1 ("userspace: Handling of versatile tunnel ports")
> > ---
> >  ofproto/tunnel.c | 13 +++++++++++++
> >  1 file changed, 13 insertions(+)
> >
> > diff --git a/ofproto/tunnel.c b/ofproto/tunnel.c
> > index 1676f4d46..d497f026b 100644
> > --- a/ofproto/tunnel.c
> > +++ b/ofproto/tunnel.c
> > @@ -585,6 +585,19 @@ tnl_find(const struct flow *flow) 
> > OVS_REQ_RDLOCK(rwlock)
> >                      if (tnl_port) {
> >                          return tnl_port;
> >                      }
> > +
> > +                    /* Maybe flow->packet_type has been already changed 
> > during
> > +                     * xlate, so let's try to find L2 port for L3 packet or
> > +                     * L3 port for L2 packet. */
> > +                    if (pt_ns(flow->packet_type) == OFPHTN_ETHERTYPE) {
> > +                        match.pt_mode = NETDEV_PT_LEGACY_L2;
> > +                    } else {
> > +                        match.pt_mode = NETDEV_PT_LEGACY_L3;
> > +                    }
> > +                    tnl_port = tnl_find_exact(&match, map);
> > +                    if (tnl_port) {
> > +                        return tnl_port;
> > +                    }
> >                  }
> >
> >                  i++;
> > --
> > 2.14.1

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to