Commit c578bc3a authored by Donald Hunter's avatar Donald Hunter Committed by Jakub Kicinski
Browse files

tools/net/ynl: accept IP string inputs



The ynl tool uses display-hint to know when to format IP addresses in
printed output, but not to parse IP addresses from --json input. Add
support for parsing ipv4 and ipv6 strings.

Signed-off-by: default avatarDonald Hunter <donald.hunter@gmail.com>
Link: https://patch.msgid.link/20250211120127.84858-5-donald.hunter@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 569a5d63
Loading
Loading
Loading
Loading
+21 −4
Original line number Diff line number Diff line
@@ -536,9 +536,11 @@ class YnlFamily(SpecFamily):
        try:
            return int(value)
        except (ValueError, TypeError) as e:
            if 'enum' not in attr_spec:
                raise e
            if 'enum' in attr_spec:
                return self._encode_enum(attr_spec, value)
            if attr_spec.display_hint:
                return self._from_string(value, attr_spec)
            raise e

    def _add_attr(self, space, name, value, search_attrs):
        try:
@@ -571,6 +573,9 @@ class YnlFamily(SpecFamily):
            if isinstance(value, bytes):
                attr_payload = value
            elif isinstance(value, str):
                if attr.display_hint:
                    attr_payload = self._from_string(value, attr)
                else:
                    attr_payload = bytes.fromhex(value)
            elif isinstance(value, dict) and attr.struct_name:
                attr_payload = self._encode_struct(attr.struct_name, value)
@@ -906,6 +911,18 @@ class YnlFamily(SpecFamily):
            formatted = raw
        return formatted

    def _from_string(self, string, attr_spec):
        if attr_spec.display_hint in ['ipv4', 'ipv6']:
            ip = ipaddress.ip_address(string)
            if attr_spec['type'] == 'binary':
                raw = ip.packed
            else:
                raw = int(ip)
        else:
            raise Exception(f"Display hint '{attr_spec.display_hint}' not implemented"
                            f" when parsing '{attr_spec['name']}'")
        return raw

    def handle_ntf(self, decoded):
        msg = dict()
        if self.include_raw: