The new do_gphystats() function is almost exactly the same as
do_gstats(), which is silly.

* Add parameters to do_gstats() for the command number, string set
  number and heading
* Introduce do_gnicstats() as a wrapper for do_gstats() that does
  what do_gstats() used to
* Change do_gphystats() into a wrapper for do_gstats()

Signed-off-by: Ben Hutchings <b...@decadent.org.uk>
---
 ethtool.c | 71 +++++++++++----------------------------------------------------
 1 file changed, 12 insertions(+), 59 deletions(-)

diff --git a/ethtool.c b/ethtool.c
index 1c988f7d8a9d..4f69a825849a 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -2937,7 +2937,8 @@ static int do_phys_id(struct cmd_context *ctx)
        return err;
 }
 
-static int do_gstats(struct cmd_context *ctx)
+static int do_gstats(struct cmd_context *ctx, int cmd, int stringset,
+                   const char *name)
 {
        struct ethtool_gstrings *strings;
        struct ethtool_stats *stats;
@@ -2947,7 +2948,7 @@ static int do_gstats(struct cmd_context *ctx)
        if (ctx->argc != 0)
                exit_bad_args();
 
-       strings = get_stringset(ctx, ETH_SS_STATS,
+       strings = get_stringset(ctx, stringset,
                                offsetof(struct ethtool_drvinfo, n_stats),
                                0);
        if (!strings) {
@@ -2971,7 +2972,7 @@ static int do_gstats(struct cmd_context *ctx)
                return 95;
        }
 
-       stats->cmd = ETHTOOL_GSTATS;
+       stats->cmd = cmd;
        stats->n_stats = n_stats;
        err = send_ioctl(ctx, stats);
        if (err < 0) {
@@ -2982,7 +2983,7 @@ static int do_gstats(struct cmd_context *ctx)
        }
 
        /* todo - pretty-print the strings per-driver */
-       fprintf(stdout, "NIC statistics:\n");
+       fprintf(stdout, "%s statistics:\n", name);
        for (i = 0; i < n_stats; i++) {
                fprintf(stdout, "     %.*s: %llu\n",
                        ETH_GSTRING_LEN,
@@ -2995,62 +2996,14 @@ static int do_gstats(struct cmd_context *ctx)
        return 0;
 }
 
-static int do_gphystats(struct cmd_context *ctx)
+static int do_gnicstats(struct cmd_context *ctx)
 {
-       struct ethtool_gstrings *strings;
-       struct ethtool_stats *stats;
-       unsigned int n_stats, sz_stats, i;
-       int err;
-
-       if (ctx->argc != 0)
-               exit_bad_args();
-
-       strings = get_stringset(ctx, ETH_SS_PHY_STATS,
-                               offsetof(struct ethtool_drvinfo, n_stats),
-                               0);
-       if (!strings) {
-               perror("Cannot get stats strings information");
-               return 96;
-       }
-
-       n_stats = strings->len;
-       if (n_stats < 1) {
-               fprintf(stderr, "no stats available\n");
-               free(strings);
-               return 94;
-       }
-
-       sz_stats = n_stats * sizeof(u64);
-
-       stats = calloc(1, sz_stats + sizeof(struct ethtool_stats));
-       if (!stats) {
-               fprintf(stderr, "no memory available\n");
-               free(strings);
-               return 95;
-       }
-
-       stats->cmd = ETHTOOL_GPHYSTATS;
-       stats->n_stats = n_stats;
-       err = send_ioctl(ctx, stats);
-       if (err < 0) {
-               perror("Cannot get stats information");
-               free(strings);
-               free(stats);
-               return 97;
-       }
-
-       /* todo - pretty-print the strings per-driver */
-       fprintf(stdout, "PHY statistics:\n");
-       for (i = 0; i < n_stats; i++) {
-               fprintf(stdout, "     %.*s: %llu\n",
-                       ETH_GSTRING_LEN,
-                       &strings->data[i * ETH_GSTRING_LEN],
-                       stats->data[i]);
-       }
-       free(strings);
-       free(stats);
+       return do_gstats(ctx, ETHTOOL_GSTATS, ETH_SS_STATS, "NIC");
+}
 
-       return 0;
+static int do_gphystats(struct cmd_context *ctx)
+{
+       return do_gstats(ctx, ETHTOOL_GPHYSTATS, ETH_SS_PHY_STATS, "PHY");
 }
 
 static int do_srxntuple(struct cmd_context *ctx,
@@ -4135,7 +4088,7 @@ static const struct option {
          "               [ TIME-IN-SECONDS ]\n" },
        { "-t|--test", 1, do_test, "Execute adapter self test",
          "               [ online | offline | external_lb ]\n" },
-       { "-S|--statistics", 1, do_gstats, "Show adapter statistics" },
+       { "-S|--statistics", 1, do_gnicstats, "Show adapter statistics" },
        { "--phy-statistics", 1, do_gphystats,
          "Show phy statistics" },
        { "-n|-u|--show-nfc|--show-ntuple", 1, do_grxclass,

Reply via email to