commit 0a6fd6b024db77e3a460c22ab8a496a714bc71b7 Author: Jamal Hadi Salim Date: Fri Aug 12 06:10:46 2016 -0400 actions: add support for cookies Signed-off-by: Jamal Hadi Salim diff --git a/tc/m_action.c b/tc/m_action.c index c416d98..75d1a5a 100644 --- a/tc/m_action.c +++ b/tc/m_action.c @@ -137,8 +137,7 @@ noexist: return a; } -static int -new_cmd(char **argv) +static int new_cmd(char **argv) { if ((matches(*argv, "change") == 0) || (matches(*argv, "replace") == 0) || @@ -151,8 +150,7 @@ new_cmd(char **argv) } -int -parse_action(int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) +int parse_action(int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) { int argc = *argc_p; char **argv = *argv_p; @@ -160,6 +158,7 @@ parse_action(int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) char k[16]; int ok = 0; int eap = 0; /* expect action parameters */ + __u64 act_ck = 0; int ret = 0; int prio = 0; @@ -215,13 +214,28 @@ done0: tail = NLMSG_TAIL(n); addattr_l(n, MAX_MSG, ++prio, NULL, 0); addattr_l(n, MAX_MSG, TCA_ACT_KIND, k, strlen(k) + 1); - - ret = a->parse_aopt(a, &argc, &argv, TCA_ACT_OPTIONS, n); + ret = a->parse_aopt(a, &argc, &argv, TCA_ACT_OPTIONS, + n); if (ret < 0) { - fprintf(stderr, "bad action parsing\n"); + fprintf(stderr, "bad action option parsing\n"); goto bad_val; } + + if (*argv && strcmp(*argv, "cookie") == 0) { + NEXT_ARG(); + ret = get_u64(&act_ck, *argv, 0); + if (ret) { + fprintf(stderr, "bad cookie <%s>\n", + *argv); + goto bad_val; + } + argc--; + argv++; + } + + if (act_ck) + addattr64(n, MAX_MSG, TCA_ACT_COOKIE, act_ck); tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail; ok++; } @@ -246,8 +260,7 @@ bad_val: return -1; } -static int -tc_print_one_action(FILE *f, struct rtattr *arg) +static int tc_print_one_action(FILE *f, struct rtattr *arg) { struct rtattr *tb[TCA_ACT_MAX + 1]; @@ -277,6 +290,10 @@ tc_print_one_action(FILE *f, struct rtattr *arg) if (show_stats && tb[TCA_ACT_STATS]) { fprintf(f, "\tAction statistics:\n"); print_tcstats2_attr(f, tb[TCA_ACT_STATS], "\t", NULL); + if (tb[TCA_ACT_COOKIE]) { + __u64 acookie = rta_getattr_u64(tb[TCA_ACT_COOKIE]); + fprintf(f, "cookie 0x%llx ", acookie); + } fprintf(f, "\n"); }