Print the nested stats attribute containing timestamping statistics when
the --show-time-stamping flag is used.
[root@binary-eater-vm-01 linux-ethtool-ts]# ./tools/net/ynl/ethtool.py --show-time-stamping mlx5_1
Time stamping parameters for mlx5_1:
Capabilities:
hardware-transmit
hardware-receive
hardware-raw-clock
PTP Hardware Clock: 0
Hardware Transmit Timestamp Modes:
off
on
Hardware Receive Filter Modes:
none
all
Statistics:
tx-pkts: 8
tx-lost: 0
tx-err: 0
Signed-off-by: Rahul Rameshbabu <rrameshbabu@nvidia.com>
---
tools/net/ynl/ethtool.py | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/tools/net/ynl/ethtool.py b/tools/net/ynl/ethtool.py
index 44ba3ba58ed9..193399e7fbd1 100755
--- a/tools/net/ynl/ethtool.py
+++ b/tools/net/ynl/ethtool.py
@@ -324,7 +324,13 @@ def main():
return
if args.show_time_stamping:
- tsinfo = dumpit(ynl, args, 'tsinfo-get')
+ req = {
+ 'header': {
+ 'flags': 1 << 2,
+ },
+ }
+
+ tsinfo = dumpit(ynl, args, 'tsinfo-get', req)
print(f'Time stamping parameters for {args.device}:')
@@ -338,6 +344,9 @@ def main():
print('Hardware Receive Filter Modes:')
[print(f'\t{v}') for v in bits_to_dict(tsinfo['rx-filters'])]
+
+ print('Statistics:')
+ [print(f'\t{k}: {v}') for k, v in tsinfo['stats'].items()]
return
print(f'Settings for {args.device}:')
--
2.42.0
On Sat, 9 Mar 2024 00:44:40 -0800 Rahul Rameshbabu wrote:
> + req = {
> + 'header': {
> + 'flags': 1 << 2,
> + },
> + }
You should be able to use the name of the flag instead of the raw value.
Jiri added that recently, IIRC.
On Tue, 12 Mar, 2024 16:55:44 -0700 Jakub Kicinski <kuba@kernel.org> wrote:
> On Sat, 9 Mar 2024 00:44:40 -0800 Rahul Rameshbabu wrote:
>> + req = {
>> + 'header': {
>> + 'flags': 1 << 2,
>> + },
>> + }
>
> You should be able to use the name of the flag instead of the raw value.
> Jiri added that recently, IIRC.
I think this is for 'flag' type attributes. Not for the "header" flags
for the ethtool request, so I believe this cannot be done here, since
the header flags are a u32 type, not a flag type.
https://lore.kernel.org/netdev/20240222134351.224704-2-jiri@resnulli.us/
-
name: header
attributes:
-
name: dev-index
type: u32
-
name: dev-name
type: string
-
name: flags
type: u32
vs
-
name: bitset-bit
attributes:
-
name: index
type: u32
-
name: name
type: string
-
name: value
type: flag
So I believe Jiri's change applies for the latter, not the former (could
be wrong here).
--
Thanks,
Rahul Rameshbabu
On Wed, 13 Mar 2024 17:22:50 -0700 Rahul Rameshbabu wrote:
> I think this is for 'flag' type attributes. Not for the "header" flags
> for the ethtool request, so I believe this cannot be done here, since
> the header flags are a u32 type, not a flag type.
>
> https://lore.kernel.org/netdev/20240222134351.224704-2-jiri@resnulli.us/
>
> -
> name: header
> attributes:
> -
> name: dev-index
> type: u32
> -
> name: dev-name
> type: string
> -
> name: flags
> type: u32
>
> vs
>
> -
> name: bitset-bit
> attributes:
> -
> name: index
> type: u32
> -
> name: name
> type: string
> -
> name: value
> type: flag
>
> So I believe Jiri's change applies for the latter, not the former (could
> be wrong here).
Ah, we're missing the enum definition and linking :S
I mean:
diff --git a/Documentation/netlink/specs/ethtool.yaml b/Documentation/netlink/specs/ethtool.yaml
index 197208f419dc..e1626c94d93b 100644
--- a/Documentation/netlink/specs/ethtool.yaml
+++ b/Documentation/netlink/specs/ethtool.yaml
@@ -16,6 +16,10 @@ doc: Partial family for Ethtool Netlink.
name: stringset
type: enum
entries: []
+ -
+ name: header-flags
+ type: flags
+ entries: [ compact-bitset, omit-reply, stats ]
attribute-sets:
-
@@ -30,6 +34,7 @@ doc: Partial family for Ethtool Netlink.
-
name: flags
type: u32
+ enum: header-flags
-
name: bitset-bit
See if that works and feel free to post it with my suggested-by
On Wed, 13 Mar 2024 17:47:07 -0700 Jakub Kicinski wrote: > + - > + name: header-flags > + type: flags > + entries: [ compact-bitset, omit-reply, stats ] Ah. Throw in an empty: enum-name: into this, or change the uAPI so that an enum called ethtool_header_flags actually exists :) Otherwise make -C tools/net/ynl will break
On Thu, 14 Mar, 2024 13:04:36 -0700 Jakub Kicinski <kuba@kernel.org> wrote: > On Wed, 13 Mar 2024 17:47:07 -0700 Jakub Kicinski wrote: >> + - >> + name: header-flags >> + type: flags >> + entries: [ compact-bitset, omit-reply, stats ] > > Ah. Throw in an empty: > > enum-name: > > into this, or change the uAPI so that an enum called > ethtool_header_flags actually exists :) > > Otherwise make -C tools/net/ynl will break Already handled this in my patches by making the enum for ethtool_header_flags. Thanks for double checking though. -- Rahul Rameshbabu
On Wed, 13 Mar, 2024 17:47:07 -0700 Jakub Kicinski <kuba@kernel.org> wrote:
>
> Ah, we're missing the enum definition and linking :S
>
> I mean:
>
> diff --git a/Documentation/netlink/specs/ethtool.yaml b/Documentation/netlink/specs/ethtool.yaml
> index 197208f419dc..e1626c94d93b 100644
> --- a/Documentation/netlink/specs/ethtool.yaml
> +++ b/Documentation/netlink/specs/ethtool.yaml
> @@ -16,6 +16,10 @@ doc: Partial family for Ethtool Netlink.
> name: stringset
> type: enum
> entries: []
> + -
> + name: header-flags
> + type: flags
> + entries: [ compact-bitset, omit-reply, stats ]
I am running into some strange issues with this even after regenerating
ynl generated/ by running make under tools/net/ynl/.
Traceback (most recent call last):
File "/root/linux-ethtool-ts/./tools/net/ynl/ethtool.py", line 437, in <module>
main()
File "/root/linux-ethtool-ts/./tools/net/ynl/ethtool.py", line 333, in main
tsinfo = dumpit(ynl, args, 'tsinfo-get', req)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/linux-ethtool-ts/./tools/net/ynl/ethtool.py", line 91, in dumpit
reply = ynl.dump(op_name, { 'header': {} } | extra)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/linux-ethtool-ts/tools/net/ynl/lib/ynl.py", line 873, in dump
return self._op(method, vals, [], dump=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/linux-ethtool-ts/tools/net/ynl/lib/ynl.py", line 824, in _op
msg += self._add_attr(op.attr_set.name, name, value, search_attrs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/linux-ethtool-ts/tools/net/ynl/lib/ynl.py", line 459, in _add_attr
attr_payload += self._add_attr(attr['nested-attributes'],
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/linux-ethtool-ts/tools/net/ynl/lib/ynl.py", line 481, in _add_attr
attr_payload = format.pack(int(value))
^^^^^^^^^^
TypeError: int() argument must be a string, a bytes-like object or a real number, not 'dict'
What's your expectation for how the request structure would look like? I
have tried the following.
if args.show_time_stamping:
req = {
'header': {
'flags': 'stats',
},
}
if args.show_time_stamping:
req = {
'header': {
'flags': {
'stats': True,
},
},
}
I tried looking through the lib/ynl.py code, but I did not understand
how the 'flags' type was specifically handled.
>
> attribute-sets:
> -
> @@ -30,6 +34,7 @@ doc: Partial family for Ethtool Netlink.
> -
> name: flags
> type: u32
> + enum: header-flags
>
> -
> name: bitset-bit
>
> See if that works and feel free to post it with my suggested-by
--
Thanks,
Rahul Rameshbabu
On Wed, 13 Mar 2024 23:07:22 -0700 Rahul Rameshbabu wrote:
> What's your expectation for how the request structure would look like? I
> have tried the following.
>
> if args.show_time_stamping:
> req = {
> 'header': {
> 'flags': 'stats',
> },
> }
>
> if args.show_time_stamping:
> req = {
> 'header': {
> 'flags': {
> 'stats': True,
> },
> },
> }
>
> I tried looking through the lib/ynl.py code, but I did not understand
> how the 'flags' type was specifically handled.
Rebased on latest net-next?
I used this:
./tools/net/ynl/cli.py \
--spec Documentation/netlink/specs/ethtool.yaml \
--do fec-get --json '{"header":{"dev-index": 2, "flags": "stats"}}'
On Thu, 14 Mar, 2024 11:05:53 -0700 Jakub Kicinski <kuba@kernel.org> wrote:
> On Wed, 13 Mar 2024 23:07:22 -0700 Rahul Rameshbabu wrote:
>> What's your expectation for how the request structure would look like? I
>> have tried the following.
>>
>> if args.show_time_stamping:
>> req = {
>> 'header': {
>> 'flags': 'stats',
>> },
>> }
>>
>> if args.show_time_stamping:
>> req = {
>> 'header': {
>> 'flags': {
>> 'stats': True,
>> },
>> },
>> }
>>
>> I tried looking through the lib/ynl.py code, but I did not understand
>> how the 'flags' type was specifically handled.
>
> Rebased on latest net-next?
Thanks, I was using our internal branch that mixes net-next with some of
our mlx5 changes for verification purposes, and it was not rebased to
latest net-next. Your suggestion works as expected with latest net-next
and will be integrated into the series (with the suggested-by trailer
added).
>
> I used this:
>
> ./tools/net/ynl/cli.py \
> --spec Documentation/netlink/specs/ethtool.yaml \
> --do fec-get --json '{"header":{"dev-index": 2, "flags": "stats"}}'
--
Thanks,
Rahul Rameshbabu
© 2016 - 2026 Red Hat, Inc.