From: Jakub Kicinski <kuba@kernel.org>
To: mkubecek@suse.cz
Cc: netdev@vger.kernel.org, kernel-team@fb.com,
Jakub Kicinski <kuba@kernel.org>
Subject: [PATCH ethtool-next v2 6/6] pause: add support for dumping statistics
Date: Tue, 6 Oct 2020 08:04:25 -0700 [thread overview]
Message-ID: <20201006150425.2631432-7-kuba@kernel.org> (raw)
In-Reply-To: <20201006150425.2631432-1-kuba@kernel.org>
Add support for requesting pause frame stats from the kernel.
# ./ethtool -I -a eth0
Pause parameters for eth0:
Autonegotiate: on
RX: on
TX: on
Statistics:
tx_pause_frames: 1
rx_pause_frames: 1
# ./ethtool -I --json -a eth0
[ {
"ifname": "eth0",
"autonegotiate": true,
"rx": true,
"tx": true,
"statistics": {
"tx_pause_frames": 1,
"rx_pause_frames": 1
}
} ]
v2: - correct print format for u64
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
netlink/pause.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 66 insertions(+), 1 deletion(-)
diff --git a/netlink/pause.c b/netlink/pause.c
index c960c82cba5f..9bc9a301821f 100644
--- a/netlink/pause.c
+++ b/netlink/pause.c
@@ -5,6 +5,7 @@
*/
#include <errno.h>
+#include <inttypes.h>
#include <string.h>
#include <stdio.h>
@@ -105,6 +106,62 @@ static int show_pause_autoneg_status(struct nl_context *nlctx)
return ret;
}
+static int show_pause_stats(const struct nlattr *nest)
+{
+ const struct nlattr *tb[ETHTOOL_A_PAUSE_STAT_MAX + 1] = {};
+ DECLARE_ATTR_TB_INFO(tb);
+ static const struct {
+ unsigned int attr;
+ char *name;
+ } stats[] = {
+ { ETHTOOL_A_PAUSE_STAT_TX_FRAMES, "tx_pause_frames" },
+ { ETHTOOL_A_PAUSE_STAT_RX_FRAMES, "rx_pause_frames" },
+ };
+ bool header = false;
+ unsigned int i;
+ size_t n;
+ int ret;
+
+ ret = mnl_attr_parse_nested(nest, attr_cb, &tb_info);
+ if (ret < 0)
+ return ret;
+
+ open_json_object("statistics");
+ for (i = 0; i < ARRAY_SIZE(stats); i++) {
+ char fmt[32];
+
+ if (!tb[stats[i].attr])
+ continue;
+
+ if (!header && !is_json_context()) {
+ printf("Statistics:\n");
+ header = true;
+ }
+
+ if (mnl_attr_validate(tb[stats[i].attr], MNL_TYPE_U64)) {
+ fprintf(stderr, "malformed netlink message (statistic)\n");
+ goto err_close_stats;
+ }
+
+ n = snprintf(fmt, sizeof(fmt), " %s: %%" PRIu64 "\n",
+ stats[i].name);
+ if (n >= sizeof(fmt)) {
+ fprintf(stderr, "internal error - malformed label\n");
+ goto err_close_stats;
+ }
+
+ print_u64(PRINT_ANY, stats[i].name, fmt,
+ mnl_attr_get_u64(tb[stats[i].attr]));
+ }
+ close_json_object();
+
+ return 0;
+
+err_close_stats:
+ close_json_object();
+ return -1;
+}
+
int pause_reply_cb(const struct nlmsghdr *nlhdr, void *data)
{
const struct nlattr *tb[ETHTOOL_A_PAUSE_MAX + 1] = {};
@@ -142,6 +199,11 @@ int pause_reply_cb(const struct nlmsghdr *nlhdr, void *data)
if (ret < 0)
goto err_close_dev;
}
+ if (tb[ETHTOOL_A_PAUSE_STATS]) {
+ ret = show_pause_stats(tb[ETHTOOL_A_PAUSE_STATS]);
+ if (ret < 0)
+ goto err_close_dev;
+ }
if (!silent)
print_nl();
@@ -158,6 +220,7 @@ int nl_gpause(struct cmd_context *ctx)
{
struct nl_context *nlctx = ctx->nlctx;
struct nl_socket *nlsk = nlctx->ethnl_socket;
+ u32 flags;
int ret;
if (netlink_cmd_check(ctx, ETHTOOL_MSG_PAUSE_GET, true))
@@ -168,8 +231,10 @@ int nl_gpause(struct cmd_context *ctx)
return 1;
}
+ flags = get_stats_flag(nlctx, ETHTOOL_MSG_PAUSE_GET,
+ ETHTOOL_A_PAUSE_HEADER);
ret = nlsock_prep_get_request(nlsk, ETHTOOL_MSG_PAUSE_GET,
- ETHTOOL_A_PAUSE_HEADER, 0);
+ ETHTOOL_A_PAUSE_HEADER, flags);
if (ret < 0)
return ret;
--
2.26.2
prev parent reply other threads:[~2020-10-06 15:04 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-06 15:04 [PATCH ethtool-next v2 0/6] pause frame stats Jakub Kicinski
2020-10-06 15:04 ` [PATCH ethtool-next v2 1/6] update UAPI header copies Jakub Kicinski
2020-10-06 15:04 ` [PATCH ethtool-next v2 2/6] pause: add --json support Jakub Kicinski
2020-10-06 15:04 ` [PATCH ethtool-next v2 3/6] separate FLAGS out in -h Jakub Kicinski
2020-10-06 15:04 ` [PATCH ethtool-next v2 4/6] add support for stats in subcommands Jakub Kicinski
2020-10-06 15:04 ` [PATCH ethtool-next v2 5/6] netlink: use policy dumping to check if stats flag is supported Jakub Kicinski
2020-10-06 19:39 ` Ido Schimmel
2020-10-06 20:00 ` Michal Kubecek
2020-10-12 15:44 ` Michal Kubecek
2020-10-06 15:04 ` Jakub Kicinski [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201006150425.2631432-7-kuba@kernel.org \
--to=kuba@kernel.org \
--cc=kernel-team@fb.com \
--cc=mkubecek@suse.cz \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.