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