e9962dc
From 45a60c21fc17ba31199fa800cdce92cc1f17f06b Mon Sep 17 00:00:00 2001
e9962dc
From: Roi Dayan <roid@mellanox.com>
e9962dc
Date: Sun, 25 Mar 2018 12:11:48 +0300
e9962dc
Subject: [PATCH 1/2] lib/netdev-tc-offloads: Fix frag first/later translation
e9962dc
e9962dc
Fragment mask (any and later) always exists so we need to test
e9962dc
for FLOW_NW_FRAG_LATER only if the state is FLOW_NW_FRAG_ANY.
e9962dc
Before this fix we could pass frag no and first at the same time to TC
e9962dc
which is also not tested there for bad frag state.
e9962dc
This fix make sure we only pass frag first/later if is frag.
e9962dc
e9962dc
Fixes: 83e866067ea6 ("netdev-tc-offloads: Add support for IP fragmentation")
e9962dc
Signed-off-by: Roi Dayan <roid@mellanox.com>
e9962dc
Reviewed-by: Paul Blakey <paulb@mellanox.com>
e9962dc
Signed-off-by: Simon Horman <simon.horman@netronome.com>
e9962dc
---
e9962dc
 lib/netdev-tc-offloads.c | 19 +++++++++++++------
e9962dc
 1 file changed, 13 insertions(+), 6 deletions(-)
e9962dc
e9962dc
diff --git a/lib/netdev-tc-offloads.c b/lib/netdev-tc-offloads.c
e9962dc
index f22415ee1..6db76801f 100644
e9962dc
--- a/lib/netdev-tc-offloads.c
e9962dc
+++ b/lib/netdev-tc-offloads.c
e9962dc
@@ -948,14 +948,21 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match,
e9962dc
         flower.key.ip_ttl = key->nw_ttl;
e9962dc
         flower.mask.ip_ttl = mask->nw_ttl;
e9962dc
 
e9962dc
-        if (mask->nw_frag) {
e9962dc
-            if (key->nw_frag & FLOW_NW_FRAG_ANY)
e9962dc
+        if (mask->nw_frag & FLOW_NW_FRAG_ANY) {
e9962dc
+            flower.mask.flags |= TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT;
e9962dc
+
e9962dc
+            if (key->nw_frag & FLOW_NW_FRAG_ANY) {
e9962dc
                 flower.key.flags |= TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT;
e9962dc
-            if (!(key->nw_frag & FLOW_NW_FRAG_LATER))
e9962dc
-                flower.key.flags |= TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST;
e9962dc
 
e9962dc
-            flower.mask.flags |= TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT;
e9962dc
-            flower.mask.flags |= TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST;
e9962dc
+                if (mask->nw_frag & FLOW_NW_FRAG_LATER) {
e9962dc
+                    flower.mask.flags |= TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST;
e9962dc
+
e9962dc
+                    if (!(key->nw_frag & FLOW_NW_FRAG_LATER)) {
e9962dc
+                        flower.key.flags |= TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST;
e9962dc
+                    }
e9962dc
+                }
e9962dc
+            }
e9962dc
+
e9962dc
             mask->nw_frag = 0;
e9962dc
         }
e9962dc
 
e9962dc
-- 
e9962dc
2.17.0
e9962dc