tc: implement support for action terse dump

Implement support for action terse dump using new TCA_ACT_FLAG_TERSE_DUMP
value of TCA_ROOT_FLAGS tlv. Set the flag when user requested it with
following example CLI (-br for 'brief'):

$ tc -s -br actions ls action tunnel_key
total acts 2

        action order 0: tunnel_key       index 1
        Action statistics:
        Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
        backlog 0b 0p requeues 0

        action order 1: tunnel_key       index 2
        Action statistics:
        Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
        backlog 0b 0p requeues 0

In terse mode dump only outputs essential data needed to identify the
action (kind, index) and stats, if requested by the user.

Signed-off-by: Vlad Buslov <vlad@buslov.dev>
Suggested-by: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
Vlad Buslov 2020-11-30 21:32:50 +02:00 committed by David Ahern
parent 00fffb2d79
commit ea130da81e
2 changed files with 10 additions and 1 deletions

View File

@ -858,7 +858,7 @@ alias.
.BR "\-br" , " \-brief" .BR "\-br" , " \-brief"
Print only essential data needed to identify the filter and action (handle, Print only essential data needed to identify the filter and action (handle,
cookie, etc.) and stats. This option is currently only supported by cookie, etc.) and stats. This option is currently only supported by
.BR "tc filter show " command. .BR "tc filter show " and " tc actions ls " commands.
.SH "EXAMPLES" .SH "EXAMPLES"
.PP .PP

View File

@ -374,6 +374,11 @@ static int tc_print_one_action(FILE *f, struct rtattr *arg)
if (err < 0) if (err < 0)
return err; return err;
if (brief && tb[TCA_ACT_INDEX]) {
print_uint(PRINT_ANY, "index", "\t index %u",
rta_getattr_u32(tb[TCA_ACT_INDEX]));
print_nl();
}
if (show_stats && tb[TCA_ACT_STATS]) { if (show_stats && tb[TCA_ACT_STATS]) {
print_string(PRINT_FP, NULL, "\tAction statistics:", NULL); print_string(PRINT_FP, NULL, "\tAction statistics:", NULL);
print_nl(); print_nl();
@ -737,6 +742,10 @@ static int tc_act_list_or_flush(int *argc_p, char ***argv_p, int event)
tail3 = NLMSG_TAIL(&req.n); tail3 = NLMSG_TAIL(&req.n);
flag_select.value |= TCA_ACT_FLAG_LARGE_DUMP_ON; flag_select.value |= TCA_ACT_FLAG_LARGE_DUMP_ON;
flag_select.selector |= TCA_ACT_FLAG_LARGE_DUMP_ON; flag_select.selector |= TCA_ACT_FLAG_LARGE_DUMP_ON;
if (brief) {
flag_select.value |= TCA_ACT_FLAG_TERSE_DUMP;
flag_select.selector |= TCA_ACT_FLAG_TERSE_DUMP;
}
addattr_l(&req.n, MAX_MSG, TCA_ROOT_FLAGS, &flag_select, addattr_l(&req.n, MAX_MSG, TCA_ROOT_FLAGS, &flag_select,
sizeof(struct nla_bitfield32)); sizeof(struct nla_bitfield32));
tail3->rta_len = (void *) NLMSG_TAIL(&req.n) - (void *) tail3; tail3->rta_len = (void *) NLMSG_TAIL(&req.n) - (void *) tail3;