]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
tc: Add NLM_F_ECHO support for filters
authorVictor Nogueira <victor@mojatatu.com>
Wed, 24 Jan 2024 15:34:56 +0000 (12:34 -0300)
committerDavid Ahern <dsahern@kernel.org>
Tue, 30 Jan 2024 15:49:13 +0000 (15:49 +0000)
If the user specifies this flag for a filter command the kernel will
return the command's result back to user space.
For example:

  tc -echo filter add dev lo parent ffff: protocol ip matchall action ok

  added filter dev lo parent ffff: protocol ip pref 49152 matchall chain 0

As illustrated above, the kernel will give us a pref of 491252

The same can be done for other filter commands (replace, delete, and
change). For example:

  tc -echo filter del dev lo parent ffff: pref 49152 protocol ip matchall

  deleted filter dev lo parent ffff: protocol ip pref 49152 matchall chain 0

Signed-off-by: Victor Nogueira <victor@mojatatu.com>
Reviewed-by: Hangbin Liu <liuhangbin@gmail.com>
Signed-off-by: David Ahern <dsahern@kernel.org>
tc/tc_filter.c

index eb45c5887c08417b0551629dce9a1aa12fa24a65..54790ddc6cdfba3c9a96911b66a9567da9bb4bf7 100644 (file)
@@ -76,6 +76,7 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
        char  d[IFNAMSIZ] = {};
        char  k[FILTER_NAMESZ] = {};
        struct tc_estimator est = {};
+       int ret;
 
        if (cmd == RTM_NEWTFILTER && flags & NLM_F_CREATE)
                protocol = htons(ETH_P_ALL);
@@ -221,7 +222,12 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv)
        if (est.ewma_log)
                addattr_l(&req.n, sizeof(req), TCA_RATE, &est, sizeof(est));
 
-       if (rtnl_talk(&rth, &req.n, NULL) < 0) {
+       if (echo_request)
+               ret = rtnl_echo_talk(&rth, &req.n, json, print_filter);
+       else
+               ret = rtnl_talk(&rth, &req.n, NULL);
+
+       if (ret < 0) {
                fprintf(stderr, "We have an error talking to the kernel\n");
                return 2;
        }