From: Eran Ben Elisha <[email protected]>

Enable reading and displaying SRIOV VFs traffic statistics through 
the host PF netdevice using the nested IFLA_VF_STATS attribute.

Signed-off-by: Eran Ben Elisha <[email protected]>
Signed-off-by: Hadar Hen Zion <[email protected]>
Signed-off-by: Or Gerlitz <[email protected]>

---
 include/linux/if_link.h |   13 +++++++++++++
 ip/ipaddress.c          |   34 ++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 0 deletions(-)

diff --git a/include/linux/if_link.h b/include/linux/if_link.h
index 3d0d613..772debf 100644
--- a/include/linux/if_link.h
+++ b/include/linux/if_link.h
@@ -466,6 +466,7 @@ enum {
        IFLA_VF_RSS_QUERY_EN,   /* RSS Redirection Table and Hash Key query
                                 * on/off switch
                                 */
+       IFLA_VF_STATS,          /* network device statistics */
        __IFLA_VF_MAX,
 };
 
@@ -515,6 +516,18 @@ struct ifla_vf_rss_query_en {
        __u32 setting;
 };
 
+enum {
+       IFLA_VF_STATS_RX_PACKETS,
+       IFLA_VF_STATS_TX_PACKETS,
+       IFLA_VF_STATS_RX_BYTES,
+       IFLA_VF_STATS_TX_BYTES,
+       IFLA_VF_STATS_BROADCAST,
+       IFLA_VF_STATS_MULTICAST,
+       __IFLA_VF_STATS_MAX,
+};
+
+#define IFLA_VF_STATS_MAX (__IFLA_VF_STATS_MAX - 1)
+
 /* VF ports management section
  *
  *     Nested layout of set/get msg is:
diff --git a/ip/ipaddress.c b/ip/ipaddress.c
index 340e1c9..5bbb59e 100644
--- a/ip/ipaddress.c
+++ b/ip/ipaddress.c
@@ -287,6 +287,8 @@ static void print_af_spec(FILE *fp, struct rtattr 
*af_spec_attr)
        }
 }
 
+static void print_vf_stats64(FILE *fp, struct rtattr *vfstats);
+
 static void print_vfinfo(FILE *fp, struct rtattr *vfinfo)
 {
        struct ifla_vf_mac *vf_mac;
@@ -367,6 +369,8 @@ static void print_vfinfo(FILE *fp, struct rtattr *vfinfo)
                else
                        fprintf(fp, ", link-state disable");
        }
+       if (vf[IFLA_VF_STATS] && show_stats)
+               print_vf_stats64(fp, vf[IFLA_VF_STATS]);
 }
 
 static void print_num(FILE *fp, unsigned width, uint64_t count)
@@ -408,6 +412,36 @@ static void print_num(FILE *fp, unsigned width, uint64_t 
count)
        fprintf(fp, "%-*s ", width, buf);
 }
 
+static void print_vf_stats64(FILE *fp, struct rtattr *vfstats)
+{
+       struct rtattr *vf[IFLA_VF_STATS_MAX + 1] = {};
+
+       if (vfstats->rta_type != IFLA_VF_STATS) {
+               fprintf(stderr, "BUG: rta type is %d\n", vfstats->rta_type);
+               return;
+       }
+
+       parse_rtattr_nested(vf, IFLA_VF_MAX, vfstats);
+
+       /* RX stats */
+       fprintf(fp, "%s", _SL_);
+       fprintf(fp, "    RX: bytes  packets  mcast   bcast %s", _SL_);
+       fprintf(fp, "    ");
+
+       print_num(fp, 10, *(__u64 *)RTA_DATA(vf[IFLA_VF_STATS_RX_BYTES]));
+       print_num(fp, 8, *(__u64 *)RTA_DATA(vf[IFLA_VF_STATS_RX_PACKETS]));
+       print_num(fp, 7, *(__u64 *)RTA_DATA(vf[IFLA_VF_STATS_MULTICAST]));
+       print_num(fp, 7, *(__u64 *)RTA_DATA(vf[IFLA_VF_STATS_BROADCAST]));
+
+       /* TX stats */
+       fprintf(fp, "%s", _SL_);
+       fprintf(fp, "    TX: bytes  packets %s", _SL_);
+       fprintf(fp, "    ");
+
+       print_num(fp, 10, *(__u64 *)RTA_DATA(vf[IFLA_VF_STATS_TX_BYTES]));
+       print_num(fp, 8, *(__u64 *)RTA_DATA(vf[IFLA_VF_STATS_TX_PACKETS]));
+}
+
 static void print_link_stats64(FILE *fp, const struct rtnl_link_stats64 *s,
                                const struct rtattr *carrier_changes)
 {
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to