netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Vadim Fedorenko <vadim.fedorenko@linux.dev>
To: mkubecek@suse.cz
Cc: Vadim Fedorenko <vadim.fedorenko@linux.dev>,
	Jakub Kicinski <kuba@kernel.org>,
	netdev@vger.kernel.org
Subject: [PATCH ethtool-next] netlink: fec: add errors histogram statistics
Date: Fri,  3 Oct 2025 22:52:53 +0000	[thread overview]
Message-ID: <20251003225253.3291333-1-vadim.fedorenko@linux.dev> (raw)

Linux 6.18 has FEC errors histogram statistics API added. Add support
for extra attributes in ethtool.

 # ethtool -I --show-fec eni8np1
FEC parameters for eni8np1:
Supported/Configured FEC encodings: None
Active FEC encoding: None
Statistics:
  corrected_blocks: 123
  uncorrectable_blocks: 4
  fec_bit_err_0: 445 [ per_lane:  125, 120, 100, 100 ]
  fec_bit_err_1_to_3: 12
  fec_bit_err_4_to_7: 2

 # ethtool -j -I --show-fec eni8np1
[ {
        "ifname": "eni8np1",
        "config": [ "None" ],
        "active": [ "None" ],
        "statistics": {
            "corrected_blocks": {
                "total": 123
            },
            "uncorrectable_blocks": {
                "total": 4
            },
            "hist": [ {
                    "bin_low": 0,
                    "bin_high": 0,
                    "total": 445,
                    "lanes": [ 125,120,100,100 ]
                },{
                    "bin_low": 1,
                    "bin_high": 3,
                    "total": 12
                },{
                    "bin_low": 4,
                    "bin_high": 7,
                    "total": 2
                } ]
        }
    } ]

Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
---
 netlink/fec.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 72 insertions(+)

diff --git a/netlink/fec.c b/netlink/fec.c
index ed100d7..32f7ca7 100644
--- a/netlink/fec.c
+++ b/netlink/fec.c
@@ -44,6 +44,64 @@ fec_mode_walk(unsigned int idx, const char *name, bool val, void *data)
 	print_string(PRINT_ANY, NULL, " %s", name);
 }
 
+static void fec_show_hist_bin(const struct nlattr *hist)
+{
+	const struct nlattr *tb[ETHTOOL_A_FEC_HIST_MAX + 1] = {};
+	DECLARE_ATTR_TB_INFO(tb);
+	unsigned int i, lanes, bin_high, bin_low;
+	uint64_t val, *vals;
+	int ret;
+
+	ret = mnl_attr_parse_nested(hist, attr_cb, &tb_info);
+	if (ret < 0)
+		return;
+
+	if (!tb[ETHTOOL_A_FEC_HIST_BIN_LOW] || !tb[ETHTOOL_A_FEC_HIST_BIN_HIGH])
+		return;
+
+	bin_high = mnl_attr_get_u32(tb[ETHTOOL_A_FEC_HIST_BIN_HIGH]);
+	bin_low  = mnl_attr_get_u32(tb[ETHTOOL_A_FEC_HIST_BIN_LOW]);
+	/* Bin value is uint, so it may be u32 or u64 depeding on the value */
+	if (mnl_attr_validate(tb[ETHTOOL_A_FEC_HIST_BIN_VAL], MNL_TYPE_U32) < 0)
+		val = mnl_attr_get_u64(tb[ETHTOOL_A_FEC_HIST_BIN_VAL]);
+	else
+		val = mnl_attr_get_u32(tb[ETHTOOL_A_FEC_HIST_BIN_VAL]);
+
+	if (is_json_context()) {
+		print_u64(PRINT_JSON, "bin_low", NULL, bin_low);
+		print_u64(PRINT_JSON, "bin_high", NULL, bin_high);
+		print_u64(PRINT_JSON, "total", NULL, val);
+	} else {
+		printf("  fec_bit_err_%d", bin_low);
+		if (bin_low != bin_high)
+			printf("_to_%d", bin_high);
+		printf(": %" PRIu64, val);
+	}
+	if (!tb[ETHTOOL_A_FEC_HIST_BIN_VAL_PER_LANE]) {
+		if (!is_json_context())
+			print_nl();
+		return;
+	}
+
+	vals = mnl_attr_get_payload(tb[ETHTOOL_A_FEC_HIST_BIN_VAL_PER_LANE]);
+	lanes = mnl_attr_get_payload_len(tb[ETHTOOL_A_FEC_HIST_BIN_VAL_PER_LANE]) / 8;
+	if (is_json_context())
+		open_json_array("lanes", "");
+	else
+		printf(" [ per_lane:");
+	for (i = 0; i < lanes; i++) {
+		if (is_json_context())
+			print_u64(PRINT_JSON, NULL, NULL, *vals++);
+		else
+			printf("%s %" PRIu64, i ? "," : "", *vals++);
+	}
+
+	if (is_json_context())
+		close_json_array("");
+	else
+		printf(" ]\n");
+}
+
 static int fec_show_stats(const struct nlattr *nest)
 {
 	const struct nlattr *tb[ETHTOOL_A_FEC_STAT_MAX + 1] = {};
@@ -108,6 +166,20 @@ static int fec_show_stats(const struct nlattr *nest)
 
 		close_json_object();
 	}
+
+	if (tb[ETHTOOL_A_FEC_STAT_HIST]) {
+		const struct nlattr *attr;
+
+		open_json_array("hist", "");
+		mnl_attr_for_each_nested(attr, nest) {
+			if (mnl_attr_get_type(attr) == ETHTOOL_A_FEC_STAT_HIST) {
+				open_json_object(NULL);
+				fec_show_hist_bin(attr);
+				close_json_object();
+			}
+		}
+		close_json_array("");
+	}
 	close_json_object();
 
 	return 0;
-- 
2.47.3


             reply	other threads:[~2025-10-03 22:53 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-03 22:52 Vadim Fedorenko [this message]
2025-10-04  9:53 ` [External] : [PATCH ethtool-next] netlink: fec: add errors histogram statistics ALOK TIWARI
2025-10-04 12:33   ` Vadim Fedorenko

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=20251003225253.3291333-1-vadim.fedorenko@linux.dev \
    --to=vadim.fedorenko@linux.dev \
    --cc=kuba@kernel.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).