Signed-off-by: Marcelo Ricardo Leitner <mleit...@redhat.com>
---
 include/uapi/linux/tc_act/tc_ct.h |  6 ++++++
 tc/m_ct.c                         | 14 ++++++++++++--
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/include/uapi/linux/tc_act/tc_ct.h 
b/include/uapi/linux/tc_act/tc_ct.h
index 
d08a5afdc4b453c5388ad2ae63a00fd3b48457f0..37b95cda1dedd283b0244a03a20860ba22966dfa
 100644
--- a/include/uapi/linux/tc_act/tc_ct.h
+++ b/include/uapi/linux/tc_act/tc_ct.h
@@ -23,6 +23,12 @@ enum {
 };
 #define TCA_CT_MAX (__TCA_CT_MAX - 1)
 
+enum {
+       TC_CT_COMMIT,
+       __TC_CT_MAX
+};
+#define TC_CT_MAX (__TC_CT_MAX - 1)
+
 struct tc_ct {
        tc_gen;
 };
diff --git a/tc/m_ct.c b/tc/m_ct.c
index 
e20837ba4f9c49d1603b14721cabca1fbeca0c74..0e9b20edab8c870f93657d43bb5e72c13e9b6bd4
 100644
--- a/tc/m_ct.c
+++ b/tc/m_ct.c
@@ -27,7 +27,7 @@ static void
 explain(void)
 {
        fprintf(stderr,
-               "Usage: ct [mark <mark>] [zone <zone>] [label <label>] [chain 
<chain>]\n"
+               "Usage: ct [mark <mark>] [zone <zone>] [label <label>] [chain 
<chain>] [commit]\n"
                "where:\n");
 }
 
@@ -181,6 +181,7 @@ parse_ct(struct action_util *a, int *argc_p, char ***argv_p,
        char **argv = *argv_p;
        struct tc_ct p = {};
        struct rtattr *tail;
+       __u32 flags = 0;
 
        if (argc <= 0) {
                fprintf(stderr, "ct bad argument count %d\n", argc);
@@ -198,6 +199,8 @@ parse_ct(struct action_util *a, int *argc_p, char ***argv_p,
 
 again:
        if (argc <= 0) {
+out:
+               addattr32(n, MAX_MSG, TCA_CT_FLAGS, flags);
                addattr_l(n, MAX_MSG, TCA_CT_PARMS, &p, sizeof(p));
                addattr_nest_end(n, tail);
 
@@ -224,6 +227,11 @@ again:
                NEXT_ARG_FWD();
                goto again;
        }
+       if (!matches(*argv, "commit")) {
+               NEXT_ARG_FWD();
+               flags |= BIT(TC_CT_COMMIT);
+               goto again;
+       }
 /*     if (!matches(*argv, "state")) {
                NEXT_ARG();
                ct_parse_u8(*argv,
@@ -242,7 +250,9 @@ again:
                goto again;
        }*/
 
-       if (!matches(*argv, "help") == 0) {
+       if (!matches(*argv, "action"))
+               goto out;
+       if (!matches(*argv, "help")) {
                usage();
        } else {
                fprintf(stderr, "ct option not supported %s\n", *argv);
-- 
2.20.1

Reply via email to