diff mbox series

[ovs-dev,08/10] netdev-offload-tc: Check for none offloadable ct_state flag combination

Message ID 164329048673.2583748.5352493729960470353.stgit@ebuild
State Superseded
Headers show
Series netdev-offload-tc: Fix various tc-offload related problems | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test fail github build: failed

Commit Message

Eelco Chaudron Jan. 27, 2022, 1:34 p.m. UTC
This patch checks for none offloadable ct_state match flag combinations.
If they exist tell the user about it once, and ignore the offload.

Signed-off-by: Eelco Chaudron <echaudro@redhat.com>
---
 lib/netdev-offload-tc.c |   18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
index 8135441c6..f3d1d3e61 100644
--- a/lib/netdev-offload-tc.c
+++ b/lib/netdev-offload-tc.c
@@ -1478,14 +1478,14 @@  flower_match_to_tun_opt(struct tc_flower *flower, const struct flow_tnl *tnl,
     flower->mask.tunnel.metadata.present.len = tnl->metadata.present.len;
 }
 
-static void
+static int
 parse_match_ct_state_to_flower(struct tc_flower *flower, struct match *match)
 {
     const struct flow *key = &match->flow;
     struct flow *mask = &match->wc.masks;
 
     if (!ct_state_support) {
-        return;
+        return 0;
     }
 
     if ((ct_state_support & mask->ct_state) == mask->ct_state) {
@@ -1541,6 +1541,13 @@  parse_match_ct_state_to_flower(struct tc_flower *flower, struct match *match)
             flower->key.ct_state &= ~(TCA_FLOWER_KEY_CT_FLAGS_NEW);
             flower->mask.ct_state &= ~(TCA_FLOWER_KEY_CT_FLAGS_NEW);
         }
+
+        if (flower->key.ct_state &&
+            !(flower->key.ct_state & TCA_FLOWER_KEY_CT_FLAGS_TRACKED)) {
+            VLOG_INFO_ONCE("For ct_state match offload to work, you must "
+                           "include +trk with any other flags set!");
+            return EOPNOTSUPP;
+        }
     }
 
     if (mask->ct_zone) {
@@ -1560,6 +1567,8 @@  parse_match_ct_state_to_flower(struct tc_flower *flower, struct match *match)
         flower->mask.ct_label = mask->ct_label;
         mask->ct_label = OVS_U128_ZERO;
     }
+
+    return 0;
 }
 
 static int
@@ -1814,7 +1823,10 @@  netdev_tc_flow_put(struct netdev *netdev, struct match *match,
         }
     }
 
-    parse_match_ct_state_to_flower(&flower, match);
+    err = parse_match_ct_state_to_flower(&flower, match);
+    if (err) {
+        return err;
+    }
 
     /* ignore exact match on skb_mark of 0. */
     if (mask->pkt_mark == UINT32_MAX && !key->pkt_mark) {