lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <599e8a11-3276-4d67-8ef6-c335be560ea8@oracle.com>
Date: Sat, 4 Oct 2025 15:23:37 +0530
From: ALOK TIWARI <alok.a.tiwari@...cle.com>
To: Vadim Fedorenko <vadim.fedorenko@...ux.dev>, mkubecek@...e.cz
Cc: Jakub Kicinski <kuba@...nel.org>, netdev@...r.kernel.org
Subject: Re: [External] : [PATCH ethtool-next] netlink: fec: add errors
 histogram statistics



On 10/4/2025 4:22 AM, Vadim Fedorenko wrote:
> 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@...ux.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 */

typo depeding -> depending

> +	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;

8 -> sizeof(uint64_t)

> +	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) {

"mnl_attr_for_each_nested(attr, nest) {" or 
"mnl_attr_for_each_nested(attr, tb[ETHTOOL_A_FEC_STAT_HIST]) {" ? please 
check it

> +			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;

Thanks,
Alok


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ