mirror of
https://github.com/torvalds/linux.git
synced 2026-01-25 07:47:50 +00:00
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: Donald Hunter <donald.hunter@gmail.com> Link: https://patch.msgid.link/20250211120127.84858-5-donald.hunter@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
569a5d63fd
commit
c578bc3a00
@@ -536,9 +536,11 @@ class YnlFamily(SpecFamily):
|
||||
try:
|
||||
return int(value)
|
||||
except (ValueError, TypeError) as e:
|
||||
if 'enum' not in attr_spec:
|
||||
raise e
|
||||
return self._encode_enum(attr_spec, value)
|
||||
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,7 +573,10 @@ class YnlFamily(SpecFamily):
|
||||
if isinstance(value, bytes):
|
||||
attr_payload = value
|
||||
elif isinstance(value, str):
|
||||
attr_payload = bytes.fromhex(value)
|
||||
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)
|
||||
else:
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user