From: Jamal Hadi Salim Date: Sun, 21 Sep 2014 16:29:14 +0000 (-0400) Subject: actions: BugFix action stats to display with -s X-Git-Tag: v3.17.0~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=954de6c72b242cdef14cd3bcbcdbef78c70f155a;p=thirdparty%2Fiproute2.git actions: BugFix action stats to display with -s Was broken by commit 288abf513f5d11b98f09c6977d2019097afb7e9f Lets not be too clever and have a separate call to print flushed actions info. Broken looks like: root@moja-1:~# tc actions add action drop index 4 root@moja-1:~# tc -s actions ls action gact action order 0: gact action drop random type none pass val 0 index 4 ref 1 bind 0 installed 9 sec used 4 sec The fixed version looks like: action order 0: gact action drop random type none pass val 0 index 4 ref 1 bind 0 installed 9 sec used 4 sec Sent 108948 bytes 1297 pkts (dropped 1297, overlimits 0) Signed-off-by: Jamal Hadi Salim --- diff --git a/tc/m_action.c b/tc/m_action.c index 7dbcf5bcc..486123ea5 100644 --- a/tc/m_action.c +++ b/tc/m_action.c @@ -249,38 +249,31 @@ static int tc_print_one_action(FILE * f, struct rtattr *arg) { - struct rtattr *tb[TCA_MAX + 1]; + struct rtattr *tb[TCA_ACT_MAX + 1]; int err = 0; struct action_util *a = NULL; if (arg == NULL) return -1; - parse_rtattr_nested(tb, TCA_MAX, arg); - if (tb[TCA_KIND] == NULL) { + parse_rtattr_nested(tb, TCA_ACT_MAX, arg); + + if (tb[TCA_ACT_KIND] == NULL) { fprintf(stderr, "NULL Action!\n"); return -1; } - a = get_action_kind(RTA_DATA(tb[TCA_KIND])); + a = get_action_kind(RTA_DATA(tb[TCA_ACT_KIND])); if (NULL == a) return err; - if (tab_flush) { - __u32 *delete_count = RTA_DATA(tb[TCA_FCNT]); - fprintf(f," %s (%d entries)\n", a->id, *delete_count); - tab_flush = 0; - return 0; - } - - err = a->print_aopt(a,f,tb[TCA_OPTIONS]); - + err = a->print_aopt(a, f, tb[TCA_ACT_OPTIONS]); if (0 > err) return err; - if (show_stats && tb[TCA_STATS]) { + if (show_stats && tb[TCA_ACT_STATS]) { fprintf(f, "\tAction statistics:\n"); print_tcstats2_attr(f, tb[TCA_ACT_STATS], "\t", NULL); fprintf(f, "\n"); @@ -289,8 +282,34 @@ tc_print_one_action(FILE * f, struct rtattr *arg) return 0; } +static int +tc_print_action_flush(FILE *f, const struct rtattr *arg) +{ + + struct rtattr *tb[TCA_MAX + 1]; + int err = 0; + struct action_util *a = NULL; + __u32 *delete_count = 0; + + parse_rtattr_nested(tb, TCA_MAX, arg); + + if (tb[TCA_KIND] == NULL) { + fprintf(stderr, "NULL Action!\n"); + return -1; + } + + a = get_action_kind(RTA_DATA(tb[TCA_KIND])); + if (NULL == a) + return err; + + delete_count = RTA_DATA(tb[TCA_FCNT]); + fprintf(f," %s (%d entries)\n", a->id, *delete_count); + tab_flush = 0; + return 0; +} + int -tc_print_action(FILE * f, const struct rtattr *arg) +tc_print_action(FILE *f, const struct rtattr *arg) { int i; @@ -301,10 +320,8 @@ tc_print_action(FILE * f, const struct rtattr *arg) parse_rtattr_nested(tb, TCA_ACT_MAX_PRIO, arg); - if (tab_flush && NULL != tb[0] && NULL == tb[1]) { - int ret = tc_print_one_action(f, tb[0]); - return ret; - } + if (tab_flush && NULL != tb[0] && NULL == tb[1]) + return tc_print_action_flush(f, tb[0]); for (i = 0; i < TCA_ACT_MAX_PRIO; i++) { if (tb[i]) {