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 <[email protected]> CC: Jan Scheurich <[email protected]> CC: Ben Pfaff <[email protected]> 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 [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
