]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
tc_util: Add support for showing TCA_STATS_BASIC_HW statistics
authorEelco Chaudron <echaudro@redhat.com>
Tue, 2 Oct 2018 07:27:18 +0000 (03:27 -0400)
committerDavid Ahern <dsahern@gmail.com>
Tue, 2 Oct 2018 21:45:33 +0000 (14:45 -0700)
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

index cafbe49f3ec87aad1cd2d40762e2adde5425954a..a082c73c9350070463492c74c0201370f38a5943 100644 (file)
@@ -754,6 +754,44 @@ void print_tm(FILE *f, const struct tcf_t *tm)
        }
 }
 
+static void print_tcstats_basic_hw(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) {
+                       print_string(PRINT_FP, NULL, "%s", _SL_);
+                       print_string(PRINT_FP, NULL, "%s", prefix);
+                       print_lluint(PRINT_ANY, "sw_bytes",
+                                    "Sent software %llu bytes",
+                                    bs.bytes - bs_hw.bytes);
+                       print_uint(PRINT_ANY, "sw_packets", " %u pkt",
+                                  bs.packets - bs_hw.packets);
+               }
+       }
+
+       print_string(PRINT_FP, NULL, "%s", _SL_);
+       print_string(PRINT_FP, NULL, "%s", prefix);
+       print_lluint(PRINT_ANY, "hw_bytes", "Sent hardware %llu bytes",
+                    bs_hw.bytes);
+       print_uint(PRINT_ANY, "hw_packets", " %u pkt", bs_hw.packets);
+}
+
 void print_tcstats2_attr(FILE *fp, struct rtattr *rta, char *prefix, struct rtattr **xstats)
 {
        SPRINT_BUF(b1);
@@ -780,6 +818,9 @@ void print_tcstats2_attr(FILE *fp, struct rtattr *rta, char *prefix, struct rtat
                print_uint(PRINT_ANY, "requeues", " requeues %u) ", q.requeues);
        }
 
+       if (tbs[TCA_STATS_BASIC_HW])
+               print_tcstats_basic_hw(tbs, prefix);
+
        if (tbs[TCA_STATS_RATE_EST64]) {
                struct gnet_stats_rate_est64 re = {0};