From 29a5df0ae41eb7cf6393a0f23cc51c2d3fbe69f1 Mon Sep 17 00:00:00 2001 From: Justin Pettit Date: Wed, 13 Feb 2013 14:50:24 -0800 Subject: [PATCH] tunnel: Mark ECN status on decapsulated tunnel packets. In the kernel tunnel implementation, if a packet was marked as ECN CE on the outer packet then we would carry this over to the inner packet on decapsulation. With the switch to flow based tunneling, this stopped happening. This commit reintroduces that behavior by using the set IP header action. Bug #15072 Signed-off-by: Justin Pettit --- ofproto/ofproto-dpif.c | 14 +++++++++----- ofproto/tunnel.c | 1 - tests/tunnel.at | 4 ++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 79088db8f..89f5bf48a 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -6321,11 +6321,15 @@ static bool tunnel_ecn_ok(struct action_xlate_ctx *ctx) { if (is_ip_any(&ctx->base_flow) - && (ctx->base_flow.tunnel.ip_tos & IP_ECN_MASK) == IP_ECN_CE - && (ctx->base_flow.nw_tos & IP_ECN_MASK) == IP_ECN_NOT_ECT) { - VLOG_WARN_RL(&rl, "dropping tunnel packet marked ECN CE but is not ECN" - " capable"); - return false; + && (ctx->base_flow.tunnel.ip_tos & IP_ECN_MASK) == IP_ECN_CE) { + if ((ctx->base_flow.nw_tos & IP_ECN_MASK) == IP_ECN_NOT_ECT) { + VLOG_WARN_RL(&rl, "dropping tunnel packet marked ECN CE" + " but is not ECN capable"); + return false; + } else { + /* Set the ECN CE value in the tunneled packet. */ + ctx->flow.nw_tos |= IP_ECN_CE; + } } return true; diff --git a/ofproto/tunnel.c b/ofproto/tunnel.c index 82879376d..13d821ce1 100644 --- a/ofproto/tunnel.c +++ b/ofproto/tunnel.c @@ -32,7 +32,6 @@ /* XXX: * - * Ability to generate actions on input for ECN * Ability to generate metadata for packet-outs * Disallow netdevs with names like "gre64_system" to prevent collisions. */ diff --git a/tests/tunnel.at b/tests/tunnel.at index 97d245b94..24af06136 100644 --- a/tests/tunnel.at +++ b/tests/tunnel.at @@ -96,13 +96,13 @@ AT_CHECK([tail -1 stdout], [0], dnl Tunnel CE and encapsulated packet ECT(1) AT_CHECK([ovs-appctl ofproto/trace br0 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0x3,ttl=64,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=1,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], - [Datapath actions: 2 + [Datapath actions: set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0x3,ttl=64,frag=no)),2 ]) dnl Tunnel CE and encapsulated packet ECT(2) AT_CHECK([ovs-appctl ofproto/trace br0 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,tos=0x3,ttl=64,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=2,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], - [Datapath actions: 2 + [Datapath actions: set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0x3,ttl=64,frag=no)),2 ]) dnl Tunnel CE and encapsulated packet Non-ECT -- 2.47.0