netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Gal Pressman <gal@nvidia.com>
To: "David S. Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Andrew Lunn <andrew+netdev@lunn.ch>, <netdev@vger.kernel.org>
Cc: Donald Hunter <donald.hunter@gmail.com>,
	Simon Horman <horms@kernel.org>,
	Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Jesper Dangaard Brouer <hawk@kernel.org>,
	John Fastabend <john.fastabend@gmail.com>,
	Stanislav Fomichev <sdf@fomichev.me>, <bpf@vger.kernel.org>,
	Gal Pressman <gal@nvidia.com>, Nimrod Oren <noren@nvidia.com>
Subject: [PATCH net-next 1/3] tools: ynl: cli: Add --list-attrs option to show operation attributes
Date: Sun, 16 Nov 2025 21:28:43 +0200	[thread overview]
Message-ID: <20251116192845.1693119-2-gal@nvidia.com> (raw)
In-Reply-To: <20251116192845.1693119-1-gal@nvidia.com>

Add a --list-attrs option to the YNL CLI that displays information about
netlink operations, including request and reply attributes.
This eliminates the need to manually inspect YAML spec files to
determine the JSON structure required for operations, or understand the
structure of the reply.

Example usage:
  # ./cli.py --family netdev --list-attrs dev-get
  Operation: dev-get

  Do request attributes:
    - ifindex: u32
      netdev ifindex

  Do reply attributes:
    - ifindex: u32
      netdev ifindex
    - xdp-features: u64 (enum: xdp-act)
      Bitmask of enabled xdp-features.
    - xdp-zc-max-segs: u32
      max fragment count supported by ZC driver
    - xdp-rx-metadata-features: u64 (enum: xdp-rx-metadata)
      Bitmask of supported XDP receive metadata features. See Documentation/networking/xdp-rx-metadata.rst for more details.
    - xsk-features: u64 (enum: xsk-flags)
      Bitmask of enabled AF_XDP features.

  Dump reply attributes:
    - ifindex: u32
      netdev ifindex
    - xdp-features: u64 (enum: xdp-act)
      Bitmask of enabled xdp-features.
    - xdp-zc-max-segs: u32
      max fragment count supported by ZC driver
    - xdp-rx-metadata-features: u64 (enum: xdp-rx-metadata)
      Bitmask of supported XDP receive metadata features. See Documentation/networking/xdp-rx-metadata.rst for more details.
    - xsk-features: u64 (enum: xsk-flags)
      Bitmask of enabled AF_XDP features.

Reviewed-by: Nimrod Oren <noren@nvidia.com>
Signed-off-by: Gal Pressman <gal@nvidia.com>
---
 tools/net/ynl/pyynl/cli.py | 55 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/tools/net/ynl/pyynl/cli.py b/tools/net/ynl/pyynl/cli.py
index 8c192e900bd3..7ac3b4627f1b 100755
--- a/tools/net/ynl/pyynl/cli.py
+++ b/tools/net/ynl/pyynl/cli.py
@@ -7,6 +7,7 @@ import os
 import pathlib
 import pprint
 import sys
+import textwrap
 
 sys.path.append(pathlib.Path(__file__).resolve().parent.as_posix())
 from lib import YnlFamily, Netlink, NlError
@@ -70,6 +71,8 @@ def main():
     group.add_argument('--dump', dest='dump', metavar='DUMP-OPERATION', type=str)
     group.add_argument('--list-ops', action='store_true')
     group.add_argument('--list-msgs', action='store_true')
+    group.add_argument('--list-attrs', dest='list_attrs', metavar='OPERATION', type=str,
+                       help='List attributes for an operation')
 
     parser.add_argument('--duration', dest='duration', type=int,
                         help='when subscribed, watch for DURATION seconds')
@@ -128,6 +131,40 @@ def main():
     if args.ntf:
         ynl.ntf_subscribe(args.ntf)
 
+    def print_attr_list(attr_names, attr_set):
+        """Print a list of attributes with their types and documentation."""
+        for attr_name in attr_names:
+            if attr_name in attr_set.attrs:
+                attr = attr_set.attrs[attr_name]
+                attr_info = f'  - {attr_name}: {attr.type}'
+                if 'enum' in attr.yaml:
+                    attr_info += f" (enum: {attr.yaml['enum']})"
+                if attr.yaml.get('doc'):
+                    doc_text = textwrap.indent(attr.yaml['doc'], '    ')
+                    attr_info += f"\n{doc_text}"
+                print(attr_info)
+            else:
+                print(f'  - {attr_name}')
+
+    def print_mode_attrs(mode, mode_spec, attr_set, print_request=True):
+        """Print a given mode (do/dump/event/notify)."""
+        mode_title = mode.capitalize()
+
+        if print_request and 'request' in mode_spec and 'attributes' in mode_spec['request']:
+            print(f'\n{mode_title} request attributes:')
+            print_attr_list(mode_spec['request']['attributes'], attr_set)
+
+        if 'reply' in mode_spec and 'attributes' in mode_spec['reply']:
+            print(f'\n{mode_title} reply attributes:')
+            print_attr_list(mode_spec['reply']['attributes'], attr_set)
+
+        if 'attributes' in mode_spec:
+            print(f'\n{mode_title} attributes:')
+            print_attr_list(mode_spec['attributes'], attr_set)
+
+        if 'mcgrp' in mode_spec:
+                print(f"Multicast group: {op.yaml['mcgrp']}")
+
     if args.list_ops:
         for op_name, op in ynl.ops.items():
             print(op_name, " [", ", ".join(op.modes), "]")
@@ -135,6 +172,24 @@ def main():
         for op_name, op in ynl.msgs.items():
             print(op_name, " [", ", ".join(op.modes), "]")
 
+    if args.list_attrs:
+        op = ynl.msgs.get(args.list_attrs)
+        if not op:
+            print(f'Operation {args.list_attrs} not found')
+            exit(1)
+
+        print(f'Operation: {op.name}')
+
+        for mode in ['do', 'dump', 'event']:
+            if mode in op.yaml:
+                print_mode_attrs(mode, op.yaml[mode], op.attr_set, True)
+
+        if 'notify' in op.yaml:
+            mode_spec = op.yaml['notify']
+            ref_spec = ynl.msgs.get(mode_spec).yaml.get('do')
+            if ref_spec:
+                print_mode_attrs(mode, ref_spec, op.attr_set, False)
+
     try:
         if args.do:
             reply = ynl.do(args.do, attrs, args.flags)
-- 
2.40.1


  reply	other threads:[~2025-11-16 19:27 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-16 19:28 [PATCH net-next 0/3] YNL CLI --list-attrs argument Gal Pressman
2025-11-16 19:28 ` Gal Pressman [this message]
2025-11-17 15:56   ` [PATCH net-next 1/3] tools: ynl: cli: Add --list-attrs option to show operation attributes Donald Hunter
2025-11-18  9:38     ` Gal Pressman
2025-11-18  1:35   ` Jakub Kicinski
2025-11-18  9:20     ` Donald Hunter
2025-11-18  9:38     ` Gal Pressman
2025-11-18 17:13       ` Jakub Kicinski
2025-11-19 11:36         ` Gal Pressman
2025-11-19 14:20           ` Jakub Kicinski
2025-11-18  1:38   ` Jakub Kicinski
2025-11-18  9:36     ` Gal Pressman
2025-11-16 19:28 ` [PATCH net-next 2/3] tools: ynl: cli: Parse nested attributes in --list-attrs output Gal Pressman
2025-11-17 15:57   ` Donald Hunter
2025-11-16 19:28 ` [PATCH net-next 3/3] tools: ynl: cli: Display enum values " Gal Pressman
2025-11-17 16:05   ` Donald Hunter
2025-11-18  9:35     ` Gal Pressman

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=20251116192845.1693119-2-gal@nvidia.com \
    --to=gal@nvidia.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=davem@davemloft.net \
    --cc=donald.hunter@gmail.com \
    --cc=edumazet@google.com \
    --cc=hawk@kernel.org \
    --cc=horms@kernel.org \
    --cc=john.fastabend@gmail.com \
    --cc=kuba@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=noren@nvidia.com \
    --cc=pabeni@redhat.com \
    --cc=sdf@fomichev.me \
    /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).