netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch net-next] tools: ynl: introduce option to ignore unknown attributes or types
@ 2023-10-12 14:04 Jiri Pirko
  2023-10-12 14:32 ` Jakub Kicinski
  0 siblings, 1 reply; 3+ messages in thread
From: Jiri Pirko @ 2023-10-12 14:04 UTC (permalink / raw)
  To: netdev; +Cc: kuba, pabeni, davem, edumazet

From: Jiri Pirko <jiri@nvidia.com>

In case the kernel sends message back containing attribute not defined
in family spec, following exception is raised to the user:

$ sudo ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/devlink.yaml --do trap-get --json '{"bus-name": "netdevsim", "dev-name": "netdevsim1", "trap-name": "source_mac_is_multicast"}'
Traceback (most recent call last):
  File "/home/jiri/work/linux/tools/net/ynl/lib/ynl.py", line 521, in _decode
    attr_spec = attr_space.attrs_by_val[attr.type]
                ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
KeyError: 132

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/jiri/work/linux/./tools/net/ynl/cli.py", line 61, in <module>
    main()
  File "/home/jiri/work/linux/./tools/net/ynl/cli.py", line 49, in main
    reply = ynl.do(args.do, attrs, args.flags)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jiri/work/linux/tools/net/ynl/lib/ynl.py", line 731, in do
    return self._op(method, vals, flags)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jiri/work/linux/tools/net/ynl/lib/ynl.py", line 719, in _op
    rsp_msg = self._decode(decoded.raw_attrs, op.attr_set.name)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jiri/work/linux/tools/net/ynl/lib/ynl.py", line 525, in _decode
    raise Exception(f"Space '{space}' has no attribute with value '{attr.type}'")
Exception: Space 'devlink' has no attribute with value '132'

Introduce a command line option "ignore-unknown" and pass it down to
YnlFamily class constructor to allow user to get at least the part
of the message containing known attributes.

$ sudo ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/devlink.yaml --do trap-get --json '{"bus-name": "netdevsim", "dev-name": "netdevsim1", "trap-name": "source_mac_is_multicast"}' --ignore-unknown
{'bus-name': 'netdevsim',
 'dev-name': 'netdevsim1',
 'trap-action': 'drop',
 'trap-group-name': 'l2_drops',
 'trap-name': 'source_mac_is_multicast'}

Do the same for unknown attribute types.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 tools/net/ynl/cli.py     | 3 ++-
 tools/net/ynl/lib/ynl.py | 7 ++++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/tools/net/ynl/cli.py b/tools/net/ynl/cli.py
index 564ecf07cd2c..36fa0b2a8944 100755
--- a/tools/net/ynl/cli.py
+++ b/tools/net/ynl/cli.py
@@ -27,6 +27,7 @@ def main():
                         const=Netlink.NLM_F_CREATE)
     parser.add_argument('--append', dest='flags', action='append_const',
                         const=Netlink.NLM_F_APPEND)
+    parser.add_argument('--ignore-unknown', action=argparse.BooleanOptionalAction)
     args = parser.parse_args()
 
     if args.no_schema:
@@ -36,7 +37,7 @@ def main():
     if args.json_text:
         attrs = json.loads(args.json_text)
 
-    ynl = YnlFamily(args.spec, args.schema)
+    ynl = YnlFamily(args.spec, args.schema, args.ignore_unknown)
 
     if args.ntf:
         ynl.ntf_subscribe(args.ntf)
diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py
index 13c4b019a881..fdec6e4f8061 100644
--- a/tools/net/ynl/lib/ynl.py
+++ b/tools/net/ynl/lib/ynl.py
@@ -404,10 +404,11 @@ class GenlProtocol(NetlinkProtocol):
 
 
 class YnlFamily(SpecFamily):
-    def __init__(self, def_path, schema=None):
+    def __init__(self, def_path, schema=None, ignore_unknown=False):
         super().__init__(def_path, schema)
 
         self.include_raw = False
+        self.ignore_unknown = ignore_unknown
 
         try:
             if self.proto == "netlink-raw":
@@ -519,6 +520,8 @@ class YnlFamily(SpecFamily):
             try:
                 attr_spec = attr_space.attrs_by_val[attr.type]
             except KeyError:
+                if self.ignore_unknown:
+                    continue
                 raise Exception(f"Space '{space}' has no attribute with value '{attr.type}'")
             if attr_spec["type"] == 'nest':
                 subdict = self._decode(NlAttrs(attr.raw), attr_spec['nested-attributes'])
@@ -534,6 +537,8 @@ class YnlFamily(SpecFamily):
             elif attr_spec["type"] == 'array-nest':
                 decoded = self._decode_array_nest(attr, attr_spec)
             else:
+                if self.ignore_unknown:
+                    continue
                 raise Exception(f'Unknown {attr_spec["type"]} with name {attr_spec["name"]}')
 
             if 'enum' in attr_spec:
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [patch net-next] tools: ynl: introduce option to ignore unknown attributes or types
  2023-10-12 14:04 [patch net-next] tools: ynl: introduce option to ignore unknown attributes or types Jiri Pirko
@ 2023-10-12 14:32 ` Jakub Kicinski
  2023-10-13  7:49   ` Jiri Pirko
  0 siblings, 1 reply; 3+ messages in thread
From: Jakub Kicinski @ 2023-10-12 14:32 UTC (permalink / raw)
  To: Jiri Pirko; +Cc: netdev, pabeni, davem, edumazet

On Thu, 12 Oct 2023 16:04:38 +0200 Jiri Pirko wrote:
> $ sudo ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/devlink.yaml --do trap-get --json '{"bus-name": "netdevsim", "dev-name": "netdevsim1", "trap-name": "source_mac_is_multicast"}' --ignore-unknown
> {'bus-name': 'netdevsim',
>  'dev-name': 'netdevsim1',
>  'trap-action': 'drop',
>  'trap-group-name': 'l2_drops',
>  'trap-name': 'source_mac_is_multicast'}

Wouldn't it be better to put the unknown attr in as raw binary?
We can key it by attribute type (integer) and put the NlAttr object
in as the value.

That way at least the user still sees that the unknown attrs are
present.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [patch net-next] tools: ynl: introduce option to ignore unknown attributes or types
  2023-10-12 14:32 ` Jakub Kicinski
@ 2023-10-13  7:49   ` Jiri Pirko
  0 siblings, 0 replies; 3+ messages in thread
From: Jiri Pirko @ 2023-10-13  7:49 UTC (permalink / raw)
  To: Jakub Kicinski; +Cc: netdev, pabeni, davem, edumazet

Thu, Oct 12, 2023 at 04:32:23PM CEST, kuba@kernel.org wrote:
>On Thu, 12 Oct 2023 16:04:38 +0200 Jiri Pirko wrote:
>> $ sudo ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/devlink.yaml --do trap-get --json '{"bus-name": "netdevsim", "dev-name": "netdevsim1", "trap-name": "source_mac_is_multicast"}' --ignore-unknown
>> {'bus-name': 'netdevsim',
>>  'dev-name': 'netdevsim1',
>>  'trap-action': 'drop',
>>  'trap-group-name': 'l2_drops',
>>  'trap-name': 'source_mac_is_multicast'}
>
>Wouldn't it be better to put the unknown attr in as raw binary?
>We can key it by attribute type (integer) and put the NlAttr object
>in as the value.
>
>That way at least the user still sees that the unknown attrs are
>present.

Okay, will check that out.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-10-13  7:49 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-12 14:04 [patch net-next] tools: ynl: introduce option to ignore unknown attributes or types Jiri Pirko
2023-10-12 14:32 ` Jakub Kicinski
2023-10-13  7:49   ` Jiri Pirko

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).