aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Pettit <jpettit@nicira.com>2013-02-13 14:50:24 -0800
committerJustin Pettit <jpettit@nicira.com>2013-03-06 13:55:35 -0800
commitd8629119d3517a72dcebcf77e25b09dcd0f3189d (patch)
treee2109a0379ac16d15d113a6355f04a212ec8a63e
parent2fe37b93bea9c87be387aeede4f38e7a0b360cf2 (diff)
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 <jpettit@nicira.com>
-rw-r--r--ofproto/ofproto-dpif.c14
-rw-r--r--ofproto/tunnel.c1
-rw-r--r--tests/tunnel.at4
3 files changed, 11 insertions, 8 deletions
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 81118915..b204fce3 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -6276,11 +6276,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 82879376..13d821ce 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 fa019eef..2cf83560 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