diff mbox series

[ovs-dev,v2] odp-util: Remove unnecessary TOS ECN bits rewrite for tunnels

Message ID 20180501123606.23148-1-jianbol@mellanox.com
State Accepted
Headers show
Series [ovs-dev,v2] odp-util: Remove unnecessary TOS ECN bits rewrite for tunnels | expand

Commit Message

Jianbo Liu May 1, 2018, 12:36 p.m. UTC
For tunnels, TOS ECN bits are never wildcard for the reason that they
are always inherited. OVS will create a rewrite action if we add rule
to modify other IP headers. But it also adds an extra ECN rewrite for
the action because of this ECN un-wildcarding.

It seems no error because the ECN bits to be changed are same in this
case. But as rule can't be offloaded to hardware, the unnecssary ECN
rewrite should be removed.

Signed-off-by: Jianbo Liu <jianbol@mellanox.com>
Reviewed-by: Paul Blakey <paulb@mellanox.com>
Reviewed-by: Roi Dayan <roid@mellanox.com>
---
 lib/odp-util.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

Comments

Simon Horman May 1, 2018, 3:31 p.m. UTC | #1
On Tue, May 01, 2018 at 12:36:06PM +0000, Jianbo Liu wrote:
> For tunnels, TOS ECN bits are never wildcard for the reason that they
> are always inherited. OVS will create a rewrite action if we add rule
> to modify other IP headers. But it also adds an extra ECN rewrite for
> the action because of this ECN un-wildcarding.
> 
> It seems no error because the ECN bits to be changed are same in this
> case. But as rule can't be offloaded to hardware, the unnecssary ECN
> rewrite should be removed.
> 
> Signed-off-by: Jianbo Liu <jianbol@mellanox.com>
> Reviewed-by: Paul Blakey <paulb@mellanox.com>
> Reviewed-by: Roi Dayan <roid@mellanox.com>

Thanks, applied to mater, branch-2.9 and branch.2.8.
diff mbox series

Patch

diff --git a/lib/odp-util.c b/lib/odp-util.c
index 6db241a..95c584b 100644
--- a/lib/odp-util.c
+++ b/lib/odp-util.c
@@ -6962,6 +6962,11 @@  commit_set_ipv4_action(const struct flow *flow, struct flow *base_flow,
     mask.ipv4_proto = 0;        /* Not writeable. */
     mask.ipv4_frag = 0;         /* Not writable. */
 
+    if (flow_tnl_dst_is_set(&base_flow->tunnel) &&
+        ((base_flow->nw_tos ^ flow->nw_tos) & IP_ECN_MASK) == 0) {
+        mask.ipv4_tos &= ~IP_ECN_MASK;
+    }
+
     if (commit(OVS_KEY_ATTR_IPV4, use_masked, &key, &base, &mask, sizeof key,
                odp_actions)) {
         put_ipv4_key(&base, base_flow, false);
@@ -7012,6 +7017,11 @@  commit_set_ipv6_action(const struct flow *flow, struct flow *base_flow,
     mask.ipv6_proto = 0;        /* Not writeable. */
     mask.ipv6_frag = 0;         /* Not writable. */
 
+    if (flow_tnl_dst_is_set(&base_flow->tunnel) &&
+        ((base_flow->nw_tos ^ flow->nw_tos) & IP_ECN_MASK) == 0) {
+        mask.ipv6_tclass &= ~IP_ECN_MASK;
+    }
+
     if (commit(OVS_KEY_ATTR_IPV6, use_masked, &key, &base, &mask, sizeof key,
                odp_actions)) {
         put_ipv6_key(&base, base_flow, false);