summaryrefslogtreecommitdiff
path: root/ofproto
diff options
context:
space:
mode:
authorJan Scheurich <jan.scheurich@ericsson.com>2022-04-04 00:26:17 +0200
committerIlya Maximets <i.maximets@ovn.org>2022-04-27 00:32:38 +0200
commit0e0eef533fe725e496604174914e48da3747e8b5 (patch)
tree2953aa13974d2d2f8d81c7e21a046629c36a0dad /ofproto
parent4ea1bb63914198ad08ed29cc64d5d73e33a9d739 (diff)
downloadopenvswitch-0e0eef533fe725e496604174914e48da3747e8b5.tar.gz
ofproto-xlate: Fix crash when forwarding packet between legacy_l3 tunnels.
A packet received from a tunnel port with legacy_l3 packet-type (e.g. lisp, L3 gre, gtpu) is conceptually wrapped in a dummy Ethernet header for processing in an OF pipeline that is not packet-type-aware. Before transmission of the packet to another legacy_l3 tunnel port, the dummy Ethernet header is stripped again. In ofproto-xlate, wrapping in the dummy Ethernet header is done by simply changing the packet_type to PT_ETH. The generation of the push_eth datapath action is deferred until the packet's flow changes need to be committed, for example at output to a normal port. The deferred Ethernet encapsulation is marked in the pending_encap flag. This patch fixes a bug in the translation of the output action to a legacy_l3 tunnel port, where the packet_type of the flow is reverted from PT_ETH to PT_IPV4 or PT_IPV6 (depending on the dl_type) to remove its Ethernet header without clearing the pending_encap flag if it was set. At the subsequent commit of the flow changes, the unexpected combination of pending_encap == true with an PT_IPV4 or PT_IPV6 packet_type hit the OVS_NOT_REACHED() abortion clause. The pending_encap is now cleared in this situation. Reported-by: Dincer Beken <dbeken@blackned.de> Signed-off-by: Jan Scheurich <jan.scheurich@ericsson.com> Co-authored-by: Dincer Beken <dbeken@blackned.de> Signed-off-by: Dincer Beken <dbeken@blackned.de> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
Diffstat (limited to 'ofproto')
-rw-r--r--ofproto/ofproto-dpif-xlate.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index 5a770f171..d085c5ba5 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -4195,6 +4195,10 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
if (xport->pt_mode == NETDEV_PT_LEGACY_L3) {
flow->packet_type = PACKET_TYPE_BE(OFPHTN_ETHERTYPE,
ntohs(flow->dl_type));
+ if (ctx->pending_encap) {
+ /* The Ethernet header was not actually added yet. */
+ ctx->pending_encap = false;
+ }
}
}