| From 74fa5754e5a7cc140a7b586d22d9e7e7272ed28b Mon Sep 17 00:00:00 2001 |
| From: Andrea Claudi <aclaudi@redhat.com> |
| Date: Tue, 21 Apr 2020 14:53:23 +0200 |
| Subject: [PATCH] tc_util: Add support for showing TCA_STATS_BASIC_HW |
| statistics |
| |
| Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1637437 |
| Upstream Status: iproute2.git commit 5ac138324e31c |
| Conflicts: adjust the code to make it compile due to missing |
| commit c91d262f414d2 ("tc: jsonify qdisc core") |
| |
| commit 5ac138324e31c75edc65c69cedcf699fb624c113 |
| Author: Eelco Chaudron <echaudro@redhat.com> |
| Date: Tue Oct 2 03:27:18 2018 -0400 |
| |
| tc_util: Add support for showing TCA_STATS_BASIC_HW statistics |
| |
| Add support for showing hardware specific counters to easy |
| troubleshooting hardware offload. |
| |
| $ tc -s filter show dev enp3s0np0 parent ffff: |
| filter protocol ip pref 1 flower chain 0 |
| filter protocol ip pref 1 flower chain 0 handle 0x1 |
| eth_type ipv4 |
| dst_ip 2.0.0.0 |
| src_ip 1.0.0.0 |
| ip_flags nofrag |
| in_hw |
| action order 1: mirred (Egress Redirect to device eth1) stolen |
| index 1 ref 1 bind 1 installed 0 sec used 0 sec |
| Action statistics: |
| Sent 534884742 bytes 8915697 pkt (dropped 0, overlimits 0 requeues 0) |
| Sent software 187542 bytes 4077 pkt |
| Sent hardware 534697200 bytes 8911620 pkt |
| backlog 0b 0p requeues 0 |
| cookie 89173e6a44447001becfd486bda17e29 |
| |
| Signed-off-by: Eelco Chaudron <echaudro@redhat.com> |
| Signed-off-by: David Ahern <dsahern@gmail.com> |
| |
| tc/tc_util.c | 35 +++++++++++++++++++++++++++++++++++ |
| 1 file changed, 35 insertions(+) |
| |
| diff --git a/tc/tc_util.c b/tc/tc_util.c |
| index e115e5a70e3a1..ecc6fa1cca5f1 100644 |
| |
| |
| @@ -693,6 +693,38 @@ void print_tm(FILE *f, const struct tcf_t *tm) |
| fprintf(f, " expires %u sec", (unsigned int)(tm->expires/hz)); |
| } |
| |
| +static void print_tcstats_basic_hw(FILE *f, struct rtattr **tbs, char *prefix) |
| +{ |
| + struct gnet_stats_basic bs_hw; |
| + |
| + if (!tbs[TCA_STATS_BASIC_HW]) |
| + return; |
| + |
| + memcpy(&bs_hw, RTA_DATA(tbs[TCA_STATS_BASIC_HW]), |
| + MIN(RTA_PAYLOAD(tbs[TCA_STATS_BASIC_HW]), sizeof(bs_hw))); |
| + |
| + if (bs_hw.bytes == 0 && bs_hw.packets == 0) |
| + return; |
| + |
| + if (tbs[TCA_STATS_BASIC]) { |
| + struct gnet_stats_basic bs; |
| + |
| + memcpy(&bs, RTA_DATA(tbs[TCA_STATS_BASIC]), |
| + MIN(RTA_PAYLOAD(tbs[TCA_STATS_BASIC]), |
| + sizeof(bs))); |
| + |
| + if (bs.bytes >= bs_hw.bytes && bs.packets >= bs_hw.packets) { |
| + fprintf(f, "%s", prefix); |
| + fprintf(f, "Sent software %llu bytes", bs.bytes - bs_hw.bytes); |
| + fprintf(f, " %u pkt", bs.packets - bs_hw.packets); |
| + } |
| + } |
| + |
| + fprintf(f, "%s", prefix); |
| + fprintf(f, "Sent hardware %llu bytes", bs_hw.bytes); |
| + fprintf(f, " %u pkt", bs_hw.packets); |
| +} |
| + |
| void print_tcstats2_attr(FILE *fp, struct rtattr *rta, char *prefix, struct rtattr **xstats) |
| { |
| SPRINT_BUF(b1); |
| @@ -716,6 +748,9 @@ void print_tcstats2_attr(FILE *fp, struct rtattr *rta, char *prefix, struct rtat |
| q.drops, q.overlimits, q.requeues); |
| } |
| |
| + if (tbs[TCA_STATS_BASIC_HW]) |
| + print_tcstats_basic_hw(fp, tbs, prefix); |
| + |
| if (tbs[TCA_STATS_RATE_EST64]) { |
| struct gnet_stats_rate_est64 re = {0}; |
| |
| -- |
| 2.25.3 |
| |