Message ID | 20231012140438.306857-1-jiri@resnulli.us (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next] tools: ynl: introduce option to ignore unknown attributes or types | expand |
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.
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.
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: