Message ID | 20230319193803.97453-4-donald.hunter@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | ynl: add support for user headers and struct attrs | expand |
Context | Check | Description |
---|---|---|
netdev/series_format | success | Posting correctly formatted |
netdev/tree_selection | success | Clearly marked for net-next |
netdev/fixes_present | success | Fixes tag not required for -next series |
netdev/header_inline | success | No static functions without inline keyword in header files |
netdev/build_32bit | success | Errors and warnings before: 18 this patch: 18 |
netdev/cc_maintainers | success | CCed 5 of 5 maintainers |
netdev/build_clang | success | Errors and warnings before: 18 this patch: 18 |
netdev/verify_signedoff | success | Signed-off-by tag matches author and committer |
netdev/deprecated_api | success | None detected |
netdev/check_selftest | success | No net selftest shell script |
netdev/verify_fixes | success | No Fixes tag |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 18 this patch: 18 |
netdev/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 18 lines checked |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/source_inline | success | Was 0 now: 0 |
On Sun, 19 Mar 2023 19:38:00 +0000 Donald Hunter wrote: > Add support for decoding nested arrays of scalars in netlink messages. example? > Signed-off-by: Donald Hunter <donald.hunter@gmail.com> > --- > tools/net/ynl/lib/ynl.py | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py > index 32536e1f9064..077ba9e8dc98 100644 > --- a/tools/net/ynl/lib/ynl.py > +++ b/tools/net/ynl/lib/ynl.py > @@ -93,6 +93,10 @@ class NlAttr: > def as_bin(self): > return self.raw > > + def as_array(self, type): > + format, _ = self.type_formats[type] > + return list({ x[0] for x in struct.iter_unpack(format, self.raw) }) So in terms of C this treats the payload of the attr as a packed array? That's not what array-nest is, array-nest wraps every entry in another nlattr: https://docs.kernel.org/next/userspace-api/netlink/genetlink-legacy.html#array-nest It's not a C array dumped into an attribute. IIRC I was intending to use 'binary' for packed arrays. Still use sub-type to carry the type, but main type should be 'binary'. If that sounds reasonable could you document or remind me to document this as the expected behavior? Sub-type appears completely undocumented now :S > def __repr__(self): > return f"[type:{self.type} len:{self._len}] {self.raw}" > > @@ -381,6 +385,8 @@ class YnlFamily(SpecFamily): > decoded = attr.as_bin() > elif attr_spec["type"] == 'flag': > decoded = True > + elif attr_spec["type"] == 'array-nest': > + decoded = attr.as_array(attr_spec["sub-type"]) > else: > raise Exception(f'Unknown {attr.type} {attr_spec["name"]} {attr_spec["type"]}') >
Jakub Kicinski <kuba@kernel.org> writes: > On Sun, 19 Mar 2023 19:38:00 +0000 Donald Hunter wrote: >> Add support for decoding nested arrays of scalars in netlink messages. > > example? OVS_VPORT_ATTR_UPCALL_PID is a C array of u32 values. I can provide that as an example in the commit message. >> Signed-off-by: Donald Hunter <donald.hunter@gmail.com> >> --- >> tools/net/ynl/lib/ynl.py | 6 ++++++ >> 1 file changed, 6 insertions(+) >> >> diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py >> index 32536e1f9064..077ba9e8dc98 100644 >> --- a/tools/net/ynl/lib/ynl.py >> +++ b/tools/net/ynl/lib/ynl.py >> @@ -93,6 +93,10 @@ class NlAttr: >> def as_bin(self): >> return self.raw >> >> + def as_array(self, type): >> + format, _ = self.type_formats[type] >> + return list({ x[0] for x in struct.iter_unpack(format, self.raw) }) > > So in terms of C this treats the payload of the attr as a packed array? > That's not what array-nest is, array-nest wraps every entry in another > nlattr: > https://docs.kernel.org/next/userspace-api/netlink/genetlink-legacy.html#array-nest > > It's not a C array dumped into an attribute. > > IIRC I was intending to use 'binary' for packed arrays. Still use > sub-type to carry the type, but main type should be 'binary'. > > If that sounds reasonable could you document or remind me to document > this as the expected behavior? Sub-type appears completely undocumented > now :S That sounds reasonable, yes. I will also rename the method to 'as_c_array'. I think it should just be restricted to scalar subtypes, i.e. u16, u32, etc. Do you agree? I will update the documentation for this.
On Wed, 22 Mar 2023 11:27:25 +0000 Donald Hunter wrote: > > So in terms of C this treats the payload of the attr as a packed array? > > That's not what array-nest is, array-nest wraps every entry in another > > nlattr: > > https://docs.kernel.org/next/userspace-api/netlink/genetlink-legacy.html#array-nest > > > > It's not a C array dumped into an attribute. > > > > IIRC I was intending to use 'binary' for packed arrays. Still use > > sub-type to carry the type, but main type should be 'binary'. > > > > If that sounds reasonable could you document or remind me to document > > this as the expected behavior? Sub-type appears completely undocumented > > now :S > > That sounds reasonable, yes. I will also rename the method to > 'as_c_array'. I think it should just be restricted to scalar subtypes, > i.e. u16, u32, etc. Do you agree? We can limit it to scalars for now. There are some arrays of structs (from memory TC GRED had VCs defined as array of structs?) but that should hopefully be rare and can be added later.
diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py index 32536e1f9064..077ba9e8dc98 100644 --- a/tools/net/ynl/lib/ynl.py +++ b/tools/net/ynl/lib/ynl.py @@ -93,6 +93,10 @@ class NlAttr: def as_bin(self): return self.raw + def as_array(self, type): + format, _ = self.type_formats[type] + return list({ x[0] for x in struct.iter_unpack(format, self.raw) }) + def __repr__(self): return f"[type:{self.type} len:{self._len}] {self.raw}" @@ -381,6 +385,8 @@ class YnlFamily(SpecFamily): decoded = attr.as_bin() elif attr_spec["type"] == 'flag': decoded = True + elif attr_spec["type"] == 'array-nest': + decoded = attr.as_array(attr_spec["sub-type"]) else: raise Exception(f'Unknown {attr.type} {attr_spec["name"]} {attr_spec["type"]}')
Add support for decoding nested arrays of scalars in netlink messages. Signed-off-by: Donald Hunter <donald.hunter@gmail.com> --- tools/net/ynl/lib/ynl.py | 6 ++++++ 1 file changed, 6 insertions(+)