Currently there is no way of querying whether a filter is
offloaded to HW or not when using both policy (no flag).

Reuse the skip flags to show the insertion status by setting
the skip_hw flag in case the filter wasn't offloaded.

Signed-off-by: Or Gerlitz <ogerl...@mellanox.com>
---
 net/sched/cls_bpf.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c
index d9c9701..91ba90d 100644
--- a/net/sched/cls_bpf.c
+++ b/net/sched/cls_bpf.c
@@ -185,14 +185,23 @@ static int cls_bpf_offload(struct tcf_proto *tp, struct 
cls_bpf_prog *prog,
                        return -EINVAL;
                }
        } else {
-               if (!tc_should_offload(dev, tp, prog->gen_flags))
-                       return skip_sw ? -EINVAL : 0;
+               if (!tc_should_offload(dev, tp, prog->gen_flags)) {
+                       if (tc_skip_sw(prog->gen_flags))
+                               return -EINVAL;
+                       prog->gen_flags |= TCA_CLS_FLAGS_SKIP_HW;
+                       return 0;
+               }
                cmd = TC_CLSBPF_ADD;
        }
 
        ret = cls_bpf_offload_cmd(tp, obj, cmd);
-       if (ret)
-               return skip_sw ? ret : 0;
+
+       if (ret) {
+               if (skip_sw)
+                       return ret;
+               prog->gen_flags |= TCA_CLS_FLAGS_SKIP_HW;
+               return 0;
+       }
 
        obj->offloaded = true;
        if (oldprog)
-- 
2.3.7

Reply via email to