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