* [PATCH net-next v1 1/6] doc/netlink: Add bitfield32, s8, s16 to the netlink-raw schema
2023-11-30 21:49 [PATCH net-next v1 0/6] tools/net/ynl: Add 'sub-message' support to ynl Donald Hunter
@ 2023-11-30 21:49 ` Donald Hunter
2023-12-02 1:47 ` Jakub Kicinski
2023-11-30 21:49 ` [PATCH net-next v1 2/6] doc/netlink: Add sub-message support to netlink-raw Donald Hunter
` (6 subsequent siblings)
7 siblings, 1 reply; 27+ messages in thread
From: Donald Hunter @ 2023-11-30 21:49 UTC (permalink / raw)
To: netdev, Jakub Kicinski, David S. Miller, Eric Dumazet,
Paolo Abeni, Jonathan Corbet, linux-doc, Jacob Keller
Cc: donald.hunter, Donald Hunter
The netlink-raw schema was not updated when bitfield32 was added
to the genetlink-legacy schema. It is needed for rtnetlink families.
s8 and s16 were also missing.
Signed-off-by: Donald Hunter <donald.hunter@gmail.com>
---
Documentation/netlink/netlink-raw.yaml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Documentation/netlink/netlink-raw.yaml b/Documentation/netlink/netlink-raw.yaml
index 775cce8c548a..ad5395040765 100644
--- a/Documentation/netlink/netlink-raw.yaml
+++ b/Documentation/netlink/netlink-raw.yaml
@@ -200,7 +200,8 @@ properties:
type: string
type: &attr-type
description: The netlink attribute type
- enum: [ unused, pad, flag, binary, u8, u16, u32, u64, s32, s64,
+ enum: [ unused, pad, flag, binary, bitfield32,
+ u8, u16, u32, u64, s8, s16, s32, s64,
string, nest, array-nest, nest-type-value ]
doc:
description: Documentation of the attribute.
--
2.42.0
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH net-next v1 1/6] doc/netlink: Add bitfield32, s8, s16 to the netlink-raw schema
2023-11-30 21:49 ` [PATCH net-next v1 1/6] doc/netlink: Add bitfield32, s8, s16 to the netlink-raw schema Donald Hunter
@ 2023-12-02 1:47 ` Jakub Kicinski
0 siblings, 0 replies; 27+ messages in thread
From: Jakub Kicinski @ 2023-12-02 1:47 UTC (permalink / raw)
To: Donald Hunter
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
On Thu, 30 Nov 2023 21:49:53 +0000 Donald Hunter wrote:
> The netlink-raw schema was not updated when bitfield32 was added
> to the genetlink-legacy schema. It is needed for rtnetlink families.
>
> s8 and s16 were also missing.
Let me apply this one already, it's kinda independent.
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH net-next v1 2/6] doc/netlink: Add sub-message support to netlink-raw
2023-11-30 21:49 [PATCH net-next v1 0/6] tools/net/ynl: Add 'sub-message' support to ynl Donald Hunter
2023-11-30 21:49 ` [PATCH net-next v1 1/6] doc/netlink: Add bitfield32, s8, s16 to the netlink-raw schema Donald Hunter
@ 2023-11-30 21:49 ` Donald Hunter
2023-12-02 1:53 ` Jakub Kicinski
2023-11-30 21:49 ` [PATCH net-next v1 3/6] tools/net/ynl: Add 'sub-message' attribute decoding to ynl Donald Hunter
` (5 subsequent siblings)
7 siblings, 1 reply; 27+ messages in thread
From: Donald Hunter @ 2023-11-30 21:49 UTC (permalink / raw)
To: netdev, Jakub Kicinski, David S. Miller, Eric Dumazet,
Paolo Abeni, Jonathan Corbet, linux-doc, Jacob Keller
Cc: donald.hunter, Donald Hunter
Add a 'sub-message' attribute type with a selector that supports
polymorphic attribute formats for raw netlink families like tc.
A sub-message attribute uses the value of another attribute as a
selector key to choose the right sub-message format. For example if the
following attribute has already been decoded:
{ "kind": "gre" }
and we encounter the following attribute spec:
-
name: data
type: sub-message
sub-message: linkinfo-data-msg
selector: kind
Then we look for a sub-message definition called 'linkinfo-data-msg' and
use the value of the 'kind' attribute i.e. 'gre' as the key to choose
the correct format for the sub-message:
sub-messages:
name: linkinfo-data-msg
formats:
-
value: bridge
attribute-set: linkinfo-bridge-attrs
-
value: gre
attribute-set: linkinfo-gre-attrs
-
value: geneve
attribute-set: linkinfo-geneve-attrs
This would decode the attribute value as a sub-message with the
attribute-set called 'linkinfo-gre-attrs' as the attribute space.
A sub-message can have an optional 'fixed-header' followed by zero or
more attributes from an attribute-set. For example the following
'tc-options-msg' sub-message defines message formats that use a mixture
of fixed-header, attribute-set or both together:
sub-messages:
-
name: tc-options-msg
formats:
-
value: bfifo
fixed-header: tc-fifo-qopt
-
value: cake
attribute-set: tc-cake-attrs
-
value: netem
fixed-header: tc-netem-qopt
attribute-set: tc-netem-attrs
Signed-off-by: Donald Hunter <donald.hunter@gmail.com>
---
Documentation/netlink/netlink-raw.yaml | 51 +++++++++++++++++++++++++-
1 file changed, 50 insertions(+), 1 deletion(-)
diff --git a/Documentation/netlink/netlink-raw.yaml b/Documentation/netlink/netlink-raw.yaml
index ad5395040765..26203282422f 100644
--- a/Documentation/netlink/netlink-raw.yaml
+++ b/Documentation/netlink/netlink-raw.yaml
@@ -202,7 +202,8 @@ properties:
description: The netlink attribute type
enum: [ unused, pad, flag, binary, bitfield32,
u8, u16, u32, u64, s8, s16, s32, s64,
- string, nest, array-nest, nest-type-value ]
+ string, nest, array-nest, nest-type-value,
+ sub-message ]
doc:
description: Documentation of the attribute.
type: string
@@ -261,6 +262,17 @@ properties:
description: Name of the struct type used for the attribute.
type: string
# End genetlink-legacy
+ # Start netlink-raw
+ sub-message:
+ description:
+ Name of the sub-message definition to use for the attribute.
+ type: string
+ selector:
+ description:
+ Name of the attribute to use for dynamic selection of sub-message
+ format specifier.
+ type: string
+ # End netlink-raw
# Make sure name-prefix does not appear in subsets (subsets inherit naming)
dependencies:
@@ -283,6 +295,43 @@ properties:
items:
required: [ type ]
+ # Start netlink-raw
+ sub-messages:
+ description: Definition of sub message attributes
+ type: array
+ items:
+ type: object
+ additionalProperties: False
+ required: [ name, formats ]
+ properties:
+ name:
+ description: Name of the sub-message definition
+ type: string
+ formats:
+ description: Dynamically selected format specifiers
+ type: array
+ items:
+ type: object
+ additionalProperties: False
+ required: [ value ]
+ properties:
+ value:
+ description:
+ Value to match for dynamic selection of sub-message format
+ specifier.
+ type: string
+ fixed-header:
+ description:
+ Name of the struct definition to use as the fixed header
+ for the sub message.
+ type: string
+ attribute-set:
+ description:
+ Name of the attribute space from which to resolve attributes
+ in the sub message.
+ type: string
+ # End netlink-raw
+
operations:
description: Operations supported by the protocol.
type: object
--
2.42.0
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH net-next v1 2/6] doc/netlink: Add sub-message support to netlink-raw
2023-11-30 21:49 ` [PATCH net-next v1 2/6] doc/netlink: Add sub-message support to netlink-raw Donald Hunter
@ 2023-12-02 1:53 ` Jakub Kicinski
2023-12-04 15:58 ` Donald Hunter
0 siblings, 1 reply; 27+ messages in thread
From: Jakub Kicinski @ 2023-12-02 1:53 UTC (permalink / raw)
To: Donald Hunter
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
On Thu, 30 Nov 2023 21:49:54 +0000 Donald Hunter wrote:
> Add a 'sub-message' attribute type with a selector that supports
> polymorphic attribute formats for raw netlink families like tc.
>
> A sub-message attribute uses the value of another attribute as a
> selector key to choose the right sub-message format. For example if the
> following attribute has already been decoded:
>
> { "kind": "gre" }
>
> and we encounter the following attribute spec:
>
> -
> name: data
> type: sub-message
> sub-message: linkinfo-data-msg
> selector: kind
>
> Then we look for a sub-message definition called 'linkinfo-data-msg' and
> use the value of the 'kind' attribute i.e. 'gre' as the key to choose
> the correct format for the sub-message:
>
> sub-messages:
> name: linkinfo-data-msg
> formats:
> -
> value: bridge
> attribute-set: linkinfo-bridge-attrs
> -
> value: gre
> attribute-set: linkinfo-gre-attrs
> -
> value: geneve
> attribute-set: linkinfo-geneve-attrs
>
> This would decode the attribute value as a sub-message with the
> attribute-set called 'linkinfo-gre-attrs' as the attribute space.
>
> A sub-message can have an optional 'fixed-header' followed by zero or
> more attributes from an attribute-set. For example the following
> 'tc-options-msg' sub-message defines message formats that use a mixture
> of fixed-header, attribute-set or both together:
>
> sub-messages:
> -
> name: tc-options-msg
> formats:
> -
> value: bfifo
> fixed-header: tc-fifo-qopt
> -
> value: cake
> attribute-set: tc-cake-attrs
> -
> value: netem
> fixed-header: tc-netem-qopt
> attribute-set: tc-netem-attrs
SGTM, could you add all the info from the commit message somewhere
in the documentation? Perhaps a new section at the end of
Documentation/userspace-api/netlink/specs.rst
> @@ -261,6 +262,17 @@ properties:
> description: Name of the struct type used for the attribute.
> type: string
> # End genetlink-legacy
> + # Start netlink-raw
> + sub-message:
> + description:
> + Name of the sub-message definition to use for the attribute.
> + type: string
> + selector:
> + description:
> + Name of the attribute to use for dynamic selection of sub-message
> + format specifier.
> + type: string
We can leave it for later either way, but have you seen any selectors
which would key on an integer, rather than a string?
^ permalink raw reply [flat|nested] 27+ messages in thread* Re: [PATCH net-next v1 2/6] doc/netlink: Add sub-message support to netlink-raw
2023-12-02 1:53 ` Jakub Kicinski
@ 2023-12-04 15:58 ` Donald Hunter
0 siblings, 0 replies; 27+ messages in thread
From: Donald Hunter @ 2023-12-04 15:58 UTC (permalink / raw)
To: Jakub Kicinski
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
Jakub Kicinski <kuba@kernel.org> writes:
>
> SGTM, could you add all the info from the commit message somewhere
> in the documentation? Perhaps a new section at the end of
> Documentation/userspace-api/netlink/specs.rst
Ack, will do.
>> @@ -261,6 +262,17 @@ properties:
>> description: Name of the struct type used for the attribute.
>> type: string
>> # End genetlink-legacy
>> + # Start netlink-raw
>> + sub-message:
>> + description:
>> + Name of the sub-message definition to use for the attribute.
>> + type: string
>> + selector:
>> + description:
>> + Name of the attribute to use for dynamic selection of sub-message
>> + format specifier.
>> + type: string
>
> We can leave it for later either way, but have you seen any selectors
> which would key on an integer, rather than a string?
From what I have seen, I am fairly sure it's always going to be a
string. (famous last words)
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH net-next v1 3/6] tools/net/ynl: Add 'sub-message' attribute decoding to ynl
2023-11-30 21:49 [PATCH net-next v1 0/6] tools/net/ynl: Add 'sub-message' support to ynl Donald Hunter
2023-11-30 21:49 ` [PATCH net-next v1 1/6] doc/netlink: Add bitfield32, s8, s16 to the netlink-raw schema Donald Hunter
2023-11-30 21:49 ` [PATCH net-next v1 2/6] doc/netlink: Add sub-message support to netlink-raw Donald Hunter
@ 2023-11-30 21:49 ` Donald Hunter
2023-12-02 2:00 ` Jakub Kicinski
2023-11-30 21:49 ` [PATCH net-next v1 4/6] tools/net/ynl: Add binary and pad support to structs for tc Donald Hunter
` (4 subsequent siblings)
7 siblings, 1 reply; 27+ messages in thread
From: Donald Hunter @ 2023-11-30 21:49 UTC (permalink / raw)
To: netdev, Jakub Kicinski, David S. Miller, Eric Dumazet,
Paolo Abeni, Jonathan Corbet, linux-doc, Jacob Keller
Cc: donald.hunter, Donald Hunter
Implement the 'sub-message' attribute type in ynl.
Encode support is not yet implemented. Support for sub-message selectors
at a different nest level from the key attribute is not yet supported.
Signed-off-by: Donald Hunter <donald.hunter@gmail.com>
---
tools/net/ynl/lib/nlspec.py | 57 ++++++++++++++++++++++++++++++++++++-
tools/net/ynl/lib/ynl.py | 48 +++++++++++++++++++++++++------
2 files changed, 96 insertions(+), 9 deletions(-)
diff --git a/tools/net/ynl/lib/nlspec.py b/tools/net/ynl/lib/nlspec.py
index 92889298b197..58663dcb2876 100644
--- a/tools/net/ynl/lib/nlspec.py
+++ b/tools/net/ynl/lib/nlspec.py
@@ -158,6 +158,9 @@ class SpecAttr(SpecElement):
len integer, optional byte length of binary types
display_hint string, hint to help choose format specifier
when displaying the value
+ sub_message string, name of sub message type
+ selector string, name of attribute used to select
+ sub-message type
is_auto_scalar bool, attr is a variable-size scalar
"""
@@ -173,6 +176,8 @@ class SpecAttr(SpecElement):
self.byte_order = yaml.get('byte-order')
self.len = yaml.get('len')
self.display_hint = yaml.get('display-hint')
+ self.sub_message = yaml.get('sub-message')
+ self.selector = yaml.get('selector')
self.is_auto_scalar = self.type == "sint" or self.type == "uint"
@@ -278,6 +283,47 @@ class SpecStruct(SpecElement):
return self.members.items()
+class SpecSubMessage(SpecElement):
+ """ Netlink sub-message definition
+
+ Represents a set of sub-message formats for polymorphic nlattrs
+ that contain type-specific sub messages.
+
+ Attributes:
+ name string, name of sub-message definition
+ formats dict of sub-message formats indexed by match value
+ """
+ def __init__(self, family, yaml):
+ super().__init__(family, yaml)
+
+ self.formats = collections.OrderedDict()
+ for elem in self.yaml['formats']:
+ format = self.new_format(family, elem)
+ self.formats[format.value] = format
+
+ def new_format(self, family, format):
+ return SpecSubMessageFormat(family, format)
+
+
+class SpecSubMessageFormat(SpecElement):
+ """ Netlink sub-message definition
+
+ Represents a set of sub-message formats for polymorphic nlattrs
+ that contain type-specific sub messages.
+
+ Attributes:
+ value attribute value to match against type selector
+ fixed_header string, name of fixed header, or None
+ attr_set string, name of attribute set, or None
+ """
+ def __init__(self, family, yaml):
+ super().__init__(family, yaml)
+
+ self.value = yaml.get('value')
+ self.fixed_header = yaml.get('fixed-header')
+ self.attr_set = yaml.get('attribute-set')
+
+
class SpecOperation(SpecElement):
"""Netlink Operation
@@ -365,6 +411,7 @@ class SpecFamily(SpecElement):
attr_sets dict of attribute sets
msgs dict of all messages (index by name)
+ sub_msgs dict of all sub messages (index by name)
ops dict of all valid requests / responses
ntfs dict of all async events
consts dict of all constants/enums
@@ -405,6 +452,7 @@ class SpecFamily(SpecElement):
jsonschema.validate(self.yaml, schema)
self.attr_sets = collections.OrderedDict()
+ self.sub_msgs = collections.OrderedDict()
self.msgs = collections.OrderedDict()
self.req_by_value = collections.OrderedDict()
self.rsp_by_value = collections.OrderedDict()
@@ -441,6 +489,9 @@ class SpecFamily(SpecElement):
def new_struct(self, elem):
return SpecStruct(self, elem)
+ def new_sub_message(self, elem):
+ return SpecSubMessage(self, elem);
+
def new_operation(self, elem, req_val, rsp_val):
return SpecOperation(self, elem, req_val, rsp_val)
@@ -510,7 +561,7 @@ class SpecFamily(SpecElement):
"""
for op in self.yaml['operations']['list']:
if name == op['name']:
- return op
+ return op
return None
def resolve(self):
@@ -529,6 +580,10 @@ class SpecFamily(SpecElement):
attr_set = self.new_attr_set(elem)
self.attr_sets[elem['name']] = attr_set
+ for elem in self.yaml['sub-messages']:
+ sub_message = self.new_sub_message(elem)
+ self.sub_msgs[sub_message.name] = sub_message
+
if self.msg_id_model == 'unified':
self._dictify_ops_unified()
elif self.msg_id_model == 'directional':
diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py
index 92995bca14e1..886ecef5319e 100644
--- a/tools/net/ynl/lib/ynl.py
+++ b/tools/net/ynl/lib/ynl.py
@@ -170,10 +170,9 @@ class NlAttr:
class NlAttrs:
- def __init__(self, msg):
+ def __init__(self, msg, offset=0):
self.attrs = []
- offset = 0
while offset < len(msg):
attr = NlAttr(msg, offset)
offset += attr.full_len
@@ -371,8 +370,8 @@ class NetlinkProtocol:
fixed_header_size = 0
if ynl:
op = ynl.rsp_by_value[msg.cmd()]
- fixed_header_size = ynl._fixed_header_size(op)
- msg.raw_attrs = NlAttrs(msg.raw[fixed_header_size:])
+ fixed_header_size = ynl._fixed_header_size(op.fixed_header)
+ msg.raw_attrs = NlAttrs(msg.raw, fixed_header_size)
return msg
def get_mcast_id(self, mcast_name, mcast_groups):
@@ -549,6 +548,37 @@ class YnlFamily(SpecFamily):
else:
rsp[name] = [decoded]
+ def _resolve_selector(self, attr_spec, vals):
+ sub_msg = attr_spec.sub_message
+ if sub_msg not in self.sub_msgs:
+ raise Exception(f"No sub-message spec named {sub_msg} for {attr_spec.name}")
+ sub_msg_spec = self.sub_msgs[sub_msg]
+
+ selector = attr_spec.selector
+ if selector not in vals:
+ raise Exception(f"There is no value for {selector} to resolve '{attr_spec.name}'")
+ value = vals[selector]
+ if value not in sub_msg_spec.formats:
+ raise Exception(f"No message format for '{value}' in sub-message spec '{sub_msg}'")
+
+ spec = sub_msg_spec.formats[value]
+ return spec
+
+ def _decode_sub_msg(self, attr, attr_spec, rsp):
+ msg_format = self._resolve_selector(attr_spec, rsp)
+ decoded = {}
+ offset = 0
+ if msg_format.fixed_header:
+ decoded.update(self._decode_fixed_header(attr, msg_format.fixed_header));
+ offset = self._fixed_header_size(msg_format.fixed_header)
+ if msg_format.attr_set:
+ if msg_format.attr_set in self.attr_sets:
+ subdict = self._decode(NlAttrs(attr.raw, offset), msg_format.attr_set)
+ decoded.update(subdict)
+ else:
+ raise Exception(f"Unknown attribute-set '{attr_space}' when decoding '{attr_spec.name}'")
+ return decoded
+
def _decode(self, attrs, space):
if space:
attr_space = self.attr_sets[space]
@@ -586,6 +616,8 @@ class YnlFamily(SpecFamily):
value = self._decode_enum(value, attr_spec)
selector = self._decode_enum(selector, attr_spec)
decoded = {"value": value, "selector": selector}
+ elif attr_spec["type"] == 'sub-message':
+ decoded = self._decode_sub_msg(attr, attr_spec, rsp)
else:
if not self.process_unknown:
raise Exception(f'Unknown {attr_spec["type"]} with name {attr_spec["name"]}')
@@ -626,16 +658,16 @@ class YnlFamily(SpecFamily):
return
msg = self.nlproto.decode(self, NlMsg(request, 0, op.attr_set))
- offset = 20 + self._fixed_header_size(op)
+ offset = 20 + self._fixed_header_size(op.fixed_header)
path = self._decode_extack_path(msg.raw_attrs, op.attr_set, offset,
extack['bad-attr-offs'])
if path:
del extack['bad-attr-offs']
extack['bad-attr'] = path
- def _fixed_header_size(self, op):
- if op.fixed_header:
- fixed_header_members = self.consts[op.fixed_header].members
+ def _fixed_header_size(self, name):
+ if name:
+ fixed_header_members = self.consts[name].members
size = 0
for m in fixed_header_members:
format = NlAttr.get_format(m.type, m.byte_order)
--
2.42.0
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH net-next v1 3/6] tools/net/ynl: Add 'sub-message' attribute decoding to ynl
2023-11-30 21:49 ` [PATCH net-next v1 3/6] tools/net/ynl: Add 'sub-message' attribute decoding to ynl Donald Hunter
@ 2023-12-02 2:00 ` Jakub Kicinski
2023-12-04 15:59 ` Donald Hunter
0 siblings, 1 reply; 27+ messages in thread
From: Jakub Kicinski @ 2023-12-02 2:00 UTC (permalink / raw)
To: Donald Hunter
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
On Thu, 30 Nov 2023 21:49:55 +0000 Donald Hunter wrote:
> @@ -510,7 +561,7 @@ class SpecFamily(SpecElement):
> """
> for op in self.yaml['operations']['list']:
> if name == op['name']:
> - return op
> + return op
> return None
>
> def resolve(self):
Looks unrelated, plus the 'for' vs 'if' are still indented by 2.
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH net-next v1 3/6] tools/net/ynl: Add 'sub-message' attribute decoding to ynl
2023-12-02 2:00 ` Jakub Kicinski
@ 2023-12-04 15:59 ` Donald Hunter
0 siblings, 0 replies; 27+ messages in thread
From: Donald Hunter @ 2023-12-04 15:59 UTC (permalink / raw)
To: Jakub Kicinski
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
Jakub Kicinski <kuba@kernel.org> writes:
> On Thu, 30 Nov 2023 21:49:55 +0000 Donald Hunter wrote:
>> @@ -510,7 +561,7 @@ class SpecFamily(SpecElement):
>> """
>> for op in self.yaml['operations']['list']:
>> if name == op['name']:
>> - return op
>> + return op
>> return None
>>
>> def resolve(self):
>
> Looks unrelated, plus the 'for' vs 'if' are still indented by 2.
Yep, I can drop this.
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH net-next v1 4/6] tools/net/ynl: Add binary and pad support to structs for tc
2023-11-30 21:49 [PATCH net-next v1 0/6] tools/net/ynl: Add 'sub-message' support to ynl Donald Hunter
` (2 preceding siblings ...)
2023-11-30 21:49 ` [PATCH net-next v1 3/6] tools/net/ynl: Add 'sub-message' attribute decoding to ynl Donald Hunter
@ 2023-11-30 21:49 ` Donald Hunter
2023-12-02 2:06 ` Jakub Kicinski
2023-11-30 21:49 ` [PATCH net-next v1 5/6] doc/netlink/specs: add sub-message type to rt_link family Donald Hunter
` (3 subsequent siblings)
7 siblings, 1 reply; 27+ messages in thread
From: Donald Hunter @ 2023-11-30 21:49 UTC (permalink / raw)
To: netdev, Jakub Kicinski, David S. Miller, Eric Dumazet,
Paolo Abeni, Jonathan Corbet, linux-doc, Jacob Keller
Cc: donald.hunter, Donald Hunter
The tc netlink-raw family needs binary and pad types for several
qopt C structs. Add support for them to ynl.
Signed-off-by: Donald Hunter <donald.hunter@gmail.com>
---
Documentation/netlink/netlink-raw.yaml | 2 +-
tools/net/ynl/lib/ynl.py | 36 +++++++++++++++++++-------
2 files changed, 27 insertions(+), 11 deletions(-)
diff --git a/Documentation/netlink/netlink-raw.yaml b/Documentation/netlink/netlink-raw.yaml
index 26203282422f..dc3d4eeb67bb 100644
--- a/Documentation/netlink/netlink-raw.yaml
+++ b/Documentation/netlink/netlink-raw.yaml
@@ -127,7 +127,7 @@ properties:
type: string
type:
description: The netlink attribute type
- enum: [ u8, u16, u32, u64, s8, s16, s32, s64, string, binary ]
+ enum: [ u8, u16, u32, u64, s8, s16, s32, s64, string, binary, pad ]
len:
$ref: '#/$defs/len-or-define'
byte-order:
diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py
index 886ecef5319e..4f1c1e51845e 100644
--- a/tools/net/ynl/lib/ynl.py
+++ b/tools/net/ynl/lib/ynl.py
@@ -670,8 +670,11 @@ class YnlFamily(SpecFamily):
fixed_header_members = self.consts[name].members
size = 0
for m in fixed_header_members:
- format = NlAttr.get_format(m.type, m.byte_order)
- size += format.size
+ if m.type in ['pad', 'binary']:
+ size += m.len
+ else:
+ format = NlAttr.get_format(m.type, m.byte_order)
+ size += format.size
return size
else:
return 0
@@ -681,12 +684,20 @@ class YnlFamily(SpecFamily):
fixed_header_attrs = dict()
offset = 0
for m in fixed_header_members:
- format = NlAttr.get_format(m.type, m.byte_order)
- [ value ] = format.unpack_from(msg.raw, offset)
- offset += format.size
- if m.enum:
- value = self._decode_enum(value, m)
- fixed_header_attrs[m.name] = value
+ value = None
+ if m.type == 'pad':
+ offset += m.len
+ elif m.type == 'binary':
+ value = msg.raw[offset:offset+m.len]
+ offset += m.len
+ else:
+ format = NlAttr.get_format(m.type, m.byte_order)
+ [ value ] = format.unpack_from(msg.raw, offset)
+ offset += format.size
+ if value is not None:
+ if m.enum:
+ value = self._decode_enum(value, m)
+ fixed_header_attrs[m.name] = value
return fixed_header_attrs
def handle_ntf(self, decoded):
@@ -753,8 +764,13 @@ class YnlFamily(SpecFamily):
fixed_header_members = self.consts[op.fixed_header].members
for m in fixed_header_members:
value = vals.pop(m.name) if m.name in vals else 0
- format = NlAttr.get_format(m.type, m.byte_order)
- msg += format.pack(value)
+ if m.type == 'pad':
+ msg += bytearray(m.len)
+ elif m.type == 'binary':
+ msg += bytes.fromhex(value)
+ else:
+ format = NlAttr.get_format(m.type, m.byte_order)
+ msg += format.pack(value)
for name, value in vals.items():
msg += self._add_attr(op.attr_set.name, name, value)
msg = _genl_msg_finalize(msg)
--
2.42.0
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH net-next v1 4/6] tools/net/ynl: Add binary and pad support to structs for tc
2023-11-30 21:49 ` [PATCH net-next v1 4/6] tools/net/ynl: Add binary and pad support to structs for tc Donald Hunter
@ 2023-12-02 2:06 ` Jakub Kicinski
2023-12-04 16:18 ` Donald Hunter
0 siblings, 1 reply; 27+ messages in thread
From: Jakub Kicinski @ 2023-12-02 2:06 UTC (permalink / raw)
To: Donald Hunter
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
On Thu, 30 Nov 2023 21:49:56 +0000 Donald Hunter wrote:
> The tc netlink-raw family needs binary and pad types for several
> qopt C structs. Add support for them to ynl.
Nice reuse of the concept of "pad", I don't see why not:
Reviewed-by: Jakub Kicinski <kuba@kernel.org>
> + value = msg.raw[offset:offset+m.len]
What does Python style guide say about spaces around '+' here?
I tend to use C style, no idea if it's right.
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH net-next v1 4/6] tools/net/ynl: Add binary and pad support to structs for tc
2023-12-02 2:06 ` Jakub Kicinski
@ 2023-12-04 16:18 ` Donald Hunter
2023-12-04 18:21 ` Jakub Kicinski
0 siblings, 1 reply; 27+ messages in thread
From: Donald Hunter @ 2023-12-04 16:18 UTC (permalink / raw)
To: Jakub Kicinski
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
Jakub Kicinski <kuba@kernel.org> writes:
> On Thu, 30 Nov 2023 21:49:56 +0000 Donald Hunter wrote:
>> The tc netlink-raw family needs binary and pad types for several
>> qopt C structs. Add support for them to ynl.
>
> Nice reuse of the concept of "pad", I don't see why not:
>
> Reviewed-by: Jakub Kicinski <kuba@kernel.org>
>
>> + value = msg.raw[offset:offset+m.len]
>
> What does Python style guide say about spaces around '+' here?
> I tend to use C style, no idea if it's right.
The relevant section seems to be this:
However, in a slice the colon acts like a binary operator, and should
have equal amounts on either side (treating it as the operator with
the lowest priority). In an extended slice, both colons must have the
same amount of spacing applied. Exception: when a slice parameter is
omitted, the space is omitted:
# Correct:
ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:]
ham[lower:upper], ham[lower:upper:], ham[lower::step]
ham[lower+offset : upper+offset]
ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)]
ham[lower + offset : upper + offset]
# Wrong:
ham[lower + offset:upper + offset]
ham[1: 9], ham[1 :9], ham[1:9 :3]
ham[lower : : step]
ham[ : upper]
On that basis I could change it to:
(a) value = msg.raw[offset : offset+m.len]
or:
(b) value = msg.raw[offset : offset + m.len]
But the existing convention in the code is a mix of these styles:
raw[offset:offset + 4]
raw[offset:offset+m['len']]
Happy to go with whatever preference, though maximising whitespace per
(b) follows python style _and_ C style?
Also happy to make it consistent across the file (in a separate patch)?
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH net-next v1 4/6] tools/net/ynl: Add binary and pad support to structs for tc
2023-12-04 16:18 ` Donald Hunter
@ 2023-12-04 18:21 ` Jakub Kicinski
0 siblings, 0 replies; 27+ messages in thread
From: Jakub Kicinski @ 2023-12-04 18:21 UTC (permalink / raw)
To: Donald Hunter
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
On Mon, 04 Dec 2023 16:18:14 +0000 Donald Hunter wrote:
> (b) value = msg.raw[offset : offset + m.len]
>
> Happy to go with whatever preference, though maximising whitespace per
> (b) follows python style _and_ C style?
Yup, style (b) does look the least surprising to my C-accustomed eyes,
so +1 on using that.
> Also happy to make it consistent across the file (in a separate patch)?
Follow up cleanup sounds good!
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH net-next v1 5/6] doc/netlink/specs: add sub-message type to rt_link family
2023-11-30 21:49 [PATCH net-next v1 0/6] tools/net/ynl: Add 'sub-message' support to ynl Donald Hunter
` (3 preceding siblings ...)
2023-11-30 21:49 ` [PATCH net-next v1 4/6] tools/net/ynl: Add binary and pad support to structs for tc Donald Hunter
@ 2023-11-30 21:49 ` Donald Hunter
2023-12-02 2:10 ` Jakub Kicinski
2023-11-30 21:49 ` [PATCH net-next v1 6/6] doc/netlink/specs: Add a spec for tc Donald Hunter
` (2 subsequent siblings)
7 siblings, 1 reply; 27+ messages in thread
From: Donald Hunter @ 2023-11-30 21:49 UTC (permalink / raw)
To: netdev, Jakub Kicinski, David S. Miller, Eric Dumazet,
Paolo Abeni, Jonathan Corbet, linux-doc, Jacob Keller
Cc: donald.hunter, Donald Hunter
Switch to using a sub-message selector in the rt_link spec for the
link-specific 'data' attribute.
Signed-off-by: Donald Hunter <donald.hunter@gmail.com>
---
Documentation/netlink/specs/rt_link.yaml | 273 ++++++++++++++++++++++-
1 file changed, 269 insertions(+), 4 deletions(-)
diff --git a/Documentation/netlink/specs/rt_link.yaml b/Documentation/netlink/specs/rt_link.yaml
index d86a68f8475c..3a6a97b5f50a 100644
--- a/Documentation/netlink/specs/rt_link.yaml
+++ b/Documentation/netlink/specs/rt_link.yaml
@@ -966,8 +966,9 @@ attribute-sets:
type: string
-
name: data
- type: binary
- # kind specific nest, e.g. linkinfo-bridge-attrs
+ type: sub-message
+ sub-message: linkinfo-data-msg
+ selector: kind
-
name: xstats
type: binary
@@ -976,10 +977,10 @@ attribute-sets:
type: string
-
name: slave-data
- type: binary
- # kind specific nest
+ type: binary # kind specific nest
-
name: linkinfo-bridge-attrs
+ name-prefix: ifla-br-
attributes:
-
name: forward-delay
@@ -1123,6 +1124,238 @@ attribute-sets:
-
name: mcast-querier-state
type: binary
+ -
+ name: linkinfo-gre-attrs
+ name-prefix: ifla-gre-
+ attributes:
+ -
+ name: link
+ type: u32
+ -
+ name: iflags
+ type: u16
+ -
+ name: oflags
+ type: u16
+ -
+ name: ikey
+ type: u32
+ -
+ name: okey
+ type: u32
+ -
+ name: local
+ type: binary
+ display-hint: ipv4
+ -
+ name: remote
+ type: binary
+ display-hint: ipv4
+ -
+ name: ttl
+ type: u8
+ -
+ name: tos
+ type: u8
+ -
+ name: pmtudisc
+ type: u8
+ -
+ name: encap-limit
+ type: u32
+ -
+ name: flowinfo
+ type: u32
+ -
+ name: flags
+ type: u32
+ -
+ name: encap-type
+ type: u16
+ -
+ name: encap-flags
+ type: u16
+ -
+ name: encap-sport
+ type: u16
+ -
+ name: encap-dport
+ type: u16
+ -
+ name: collect-metadata
+ type: flag
+ -
+ name: ignore-df
+ type: u8
+ -
+ name: fwmark
+ type: u32
+ -
+ name: erspan-index
+ type: u32
+ -
+ name: erspan-ver
+ type: u8
+ -
+ name: erspan-dir
+ type: u8
+ -
+ name: erspan-hwid
+ type: u16
+ -
+ name: linkinfo-geneve-attrs
+ name-prefix: ifla-geneve-
+ attributes:
+ -
+ name: id
+ type: u32
+ -
+ name: remote
+ type: binary
+ display-hint: ipv4
+ -
+ name: ttl
+ type: u8
+ -
+ name: tos
+ type: u8
+ -
+ name: port
+ type: u16
+ -
+ name: collect-metadata
+ type: flag
+ -
+ name: remote6
+ type: binary
+ display-hint: ipv6
+ -
+ name: udp-csum
+ type: u8
+ -
+ name: udp-zero-csum6-tx
+ type: u8
+ -
+ name: udp-zero-csum6-rx
+ type: u8
+ -
+ name: label
+ type: u32
+ -
+ name: ttl-inherit
+ type: u8
+ -
+ name: df
+ type: u8
+ -
+ name: inner-proto-inherit
+ type: flag
+ -
+ name: linkinfo-iptun-attrs
+ name-prefix: ifla-iptun-
+ attributes:
+ -
+ name: link
+ type: u32
+ -
+ name: local
+ type: binary
+ display-hint: ipv4
+ -
+ name: remote
+ type: binary
+ display-hint: ipv4
+ -
+ name: ttl
+ type: u8
+ -
+ name: tos
+ type: u8
+ -
+ name: encap-limit
+ type: u8
+ -
+ name: flowinfo
+ type: u32
+ -
+ name: flags
+ type: u16
+ -
+ name: proto
+ type: u8
+ -
+ name: pmtudisc
+ type: u8
+ -
+ name: 6rd-prefix
+ type: binary
+ display-hint: ipv6
+ -
+ name: 6rd-relay-prefix
+ type: binary
+ display-hint: ipv4
+ -
+ name: 6rd-prefixlen
+ type: u16
+ -
+ name: 6rd-relay-prefixlen
+ type: u16
+ -
+ name: encap-type
+ type: u16
+ -
+ name: encap-flags
+ type: u16
+ -
+ name: encap-sport
+ type: u16
+ -
+ name: encap-dport
+ type: u16
+ -
+ name: collect-metadata
+ type: flag
+ -
+ name: fwmark
+ type: u32
+ -
+ name: linkinfo-tun-attrs
+ name-prefix: ifla-tun-
+ attributes:
+ -
+ name: owner
+ type: u32
+ -
+ name: group
+ type: u32
+ -
+ name: type
+ type: u8
+ -
+ name: pi
+ type: u8
+ -
+ name: vnet-hdr
+ type: u8
+ -
+ name: persist
+ type: u8
+ -
+ name: multi-queue
+ type: u8
+ -
+ name: num-queues
+ type: u32
+ -
+ name: num-disabled-queues
+ type: u32
+ -
+ name: linkinfo-vrf-attrs
+ name-prefix: ifla-vrf-
+ attributes:
+ -
+ name: table
+ type: u32
-
name: xdp-attrs
attributes:
@@ -1241,6 +1474,38 @@ attribute-sets:
name: used
type: u8
+sub-messages:
+ -
+ name: linkinfo-data-msg
+ formats:
+ -
+ value: bridge
+ attribute-set: linkinfo-bridge-attrs
+ -
+ value: erspan
+ attribute-set: linkinfo-gre-attrs
+ -
+ value: gre
+ attribute-set: linkinfo-gre-attrs
+ -
+ value: gretap
+ attribute-set: linkinfo-gre-attrs
+ -
+ value: geneve
+ attribute-set: linkinfo-geneve-attrs
+ -
+ value: ipip
+ attribute-set: linkinfo-iptun-attrs
+ -
+ value: sit
+ attribute-set: linkinfo-iptun-attrs
+ -
+ value: tun
+ attribute-set: linkinfo-tun-attrs
+ -
+ value: vrf
+ attribute-set: linkinfo-vrf-attrs
+
operations:
enum-model: directional
list:
--
2.42.0
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH net-next v1 5/6] doc/netlink/specs: add sub-message type to rt_link family
2023-11-30 21:49 ` [PATCH net-next v1 5/6] doc/netlink/specs: add sub-message type to rt_link family Donald Hunter
@ 2023-12-02 2:10 ` Jakub Kicinski
2023-12-04 16:22 ` Donald Hunter
0 siblings, 1 reply; 27+ messages in thread
From: Jakub Kicinski @ 2023-12-02 2:10 UTC (permalink / raw)
To: Donald Hunter
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
On Thu, 30 Nov 2023 21:49:57 +0000 Donald Hunter wrote:
> -
> name: slave-data
> - type: binary
> - # kind specific nest
> + type: binary # kind specific nest
Just to be clear - we can define sub-message for this nest, too, right?
Not sure if it's worth moving the comment in the commit, it's just
noise..
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH net-next v1 5/6] doc/netlink/specs: add sub-message type to rt_link family
2023-12-02 2:10 ` Jakub Kicinski
@ 2023-12-04 16:22 ` Donald Hunter
0 siblings, 0 replies; 27+ messages in thread
From: Donald Hunter @ 2023-12-04 16:22 UTC (permalink / raw)
To: Jakub Kicinski
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
Jakub Kicinski <kuba@kernel.org> writes:
> On Thu, 30 Nov 2023 21:49:57 +0000 Donald Hunter wrote:
>> -
>> name: slave-data
>> - type: binary
>> - # kind specific nest
>> + type: binary # kind specific nest
>
> Just to be clear - we can define sub-message for this nest, too, right?
>
> Not sure if it's worth moving the comment in the commit, it's just
> noise..
Ah, good catch. I can at least put in a sub-message placeholder for
slave-data.
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH net-next v1 6/6] doc/netlink/specs: Add a spec for tc
2023-11-30 21:49 [PATCH net-next v1 0/6] tools/net/ynl: Add 'sub-message' support to ynl Donald Hunter
` (4 preceding siblings ...)
2023-11-30 21:49 ` [PATCH net-next v1 5/6] doc/netlink/specs: add sub-message type to rt_link family Donald Hunter
@ 2023-11-30 21:49 ` Donald Hunter
2023-12-02 2:13 ` Jakub Kicinski
2023-12-02 1:50 ` [PATCH net-next v1 0/6] tools/net/ynl: Add 'sub-message' support to ynl patchwork-bot+netdevbpf
2023-12-02 2:15 ` Jakub Kicinski
7 siblings, 1 reply; 27+ messages in thread
From: Donald Hunter @ 2023-11-30 21:49 UTC (permalink / raw)
To: netdev, Jakub Kicinski, David S. Miller, Eric Dumazet,
Paolo Abeni, Jonathan Corbet, linux-doc, Jacob Keller
Cc: donald.hunter, Donald Hunter
This is a work-in-progress spec for tc that covers:
- most of the qdiscs
- the flower classifier
- new, del, get for qdisc, chain, class and filter
Notable omissions:
- most of the stats attrs are left as binary blobs
- notifications are not yet implemented
Signed-off-by: Donald Hunter <donald.hunter@gmail.com>
---
Documentation/netlink/specs/tc.yaml | 2008 +++++++++++++++++++++++++++
1 file changed, 2008 insertions(+)
create mode 100644 Documentation/netlink/specs/tc.yaml
diff --git a/Documentation/netlink/specs/tc.yaml b/Documentation/netlink/specs/tc.yaml
new file mode 100644
index 000000000000..20743ebbf049
--- /dev/null
+++ b/Documentation/netlink/specs/tc.yaml
@@ -0,0 +1,2008 @@
+# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
+
+name: tc
+protocol: netlink-raw
+protonum: 0
+
+doc:
+ Netlink raw family for tc qdisc, chain, class and filter configuration
+ over rtnetlink.
+
+definitions:
+ -
+ name: tcmsg
+ type: struct
+ members:
+ -
+ name: family
+ type: u8
+ -
+ name: pad
+ type: pad
+ len: 3
+ -
+ name: ifindex
+ type: s32
+ -
+ name: handle
+ type: u32
+ -
+ name: parent
+ type: u32
+ -
+ name: info
+ type: u32
+ -
+ name: tc-cls-flags
+ type: flags
+ entries:
+ - skip-hw
+ - skip-sw
+ - in-hw
+ - not-in-nw
+ - verbose
+ -
+ name: tc-stats
+ type: struct
+ members:
+ -
+ name: bytes
+ type: u64
+ -
+ name: packets
+ type: u32
+ -
+ name: drops
+ type: u32
+ -
+ name: overlimits
+ type: u32
+ -
+ name: bps
+ type: u32
+ -
+ name: pps
+ type: u32
+ -
+ name: qlen
+ type: u32
+ -
+ name: backlog
+ type: u32
+ -
+ name: tc-cbs-qopt
+ type: struct
+ members:
+ -
+ name: offload
+ type: u8
+ -
+ name: pad
+ type: pad
+ len: 3
+ -
+ name: hicredit
+ type: s32
+ -
+ name: locredit
+ type: s32
+ -
+ name: idleslope
+ type: s32
+ -
+ name: sendslope
+ type: s32
+ -
+ name: tc-etf-qopt
+ type: struct
+ members:
+ -
+ name: delta
+ type: s32
+ -
+ name: clockid
+ type: s32
+ -
+ name: flags
+ type: s32
+ -
+ name: tc-fifo-qopt
+ type: struct
+ members:
+ -
+ name: limit
+ type: u32
+ -
+ name: tc-htb-opt
+ type: struct
+ members:
+ -
+ name: rate
+ type: binary
+ len: 12
+ -
+ name: ceil
+ type: binary
+ len: 12
+ -
+ name: buffer
+ type: u32
+ -
+ name: cbuffer
+ type: u32
+ -
+ name: quantum
+ type: u32
+ -
+ name: level
+ type: u32
+ -
+ name: prio
+ type: u32
+ -
+ name: tc-htb-glob
+ type: struct
+ members:
+ -
+ name: version
+ type: u32
+ -
+ name: rate2quantum
+ type: u32
+ -
+ name: defcls
+ type: u32
+ -
+ name: debug
+ type: u32
+ -
+ name: direct-pkts
+ type: u32
+ -
+ name: tc-gred-qopt
+ type: struct
+ members:
+ -
+ name: limit
+ type: u32
+ -
+ name: qth-min
+ type: u32
+ -
+ name: qth-max
+ type: u32
+ -
+ name: DP
+ type: u32
+ -
+ name: backlog
+ type: u32
+ -
+ name: qave
+ type: u32
+ -
+ name: forced
+ type: u32
+ -
+ name: early
+ type: u32
+ -
+ name: other
+ type: u32
+ -
+ name: pdrop
+ type: u32
+ -
+ name: Wlog
+ type: u8
+ -
+ name: Plog
+ type: u8
+ -
+ name: Scell_log
+ type: u8
+ -
+ name: prio
+ type: u8
+ -
+ name: packets
+ type: u32
+ -
+ name: bytesin
+ type: u32
+ -
+ name: tc-gred-sopt
+ type: struct
+ members:
+ -
+ name: DPs
+ type: u32
+ -
+ name: def_DP
+ type: u32
+ -
+ name: grio
+ type: u8
+ -
+ name: flags
+ type: u8
+ -
+ name: pad1
+ type: u16
+ -
+ name: tc-hfsc-qopt
+ type: struct
+ members:
+ -
+ name: defcls
+ type: u16
+ -
+ name: tc-mqprio-qopt
+ type: struct
+ members:
+ -
+ name: num-tc
+ type: u8
+ -
+ name: prio-tc-map
+ type: binary
+ len: 16
+ -
+ name: hw
+ type: u8
+ -
+ name: count
+ type: binary
+ len: 32
+ -
+ name: offset
+ type: binary
+ len: 32
+ -
+ name: tc-multiq-qopt
+ type: struct
+ members:
+ -
+ name: bands
+ type: u16
+ -
+ name: max-bands
+ type: u16
+ -
+ name: tc-netem-qopt
+ type: struct
+ members:
+ -
+ name: latency
+ type: u32
+ -
+ name: limit
+ type: u32
+ -
+ name: loss
+ type: u32
+ -
+ name: gap
+ type: u32
+ -
+ name: duplicate
+ type: u32
+ -
+ name: jitter
+ type: u32
+ -
+ name: tc-prio-qopt
+ type: struct
+ members:
+ -
+ name: bands
+ type: u16
+ -
+ name: priomap
+ type: binary
+ len: 16
+ -
+ name: tc-red-qopt
+ type: struct
+ members:
+ -
+ name: limit
+ type: u32
+ -
+ name: qth-min
+ type: u32
+ -
+ name: qth-max
+ type: u32
+ -
+ name: Wlog
+ type: u8
+ -
+ name: Plog
+ type: u8
+ -
+ name: Scell-log
+ type: u8
+ -
+ name: flags
+ type: u8
+ -
+ name: tc-sfb-qopt
+ type: struct
+ members:
+ -
+ name: rehash-interval
+ type: u32
+ -
+ name: warmup-time
+ type: u32
+ -
+ name: max
+ type: u32
+ -
+ name: bin-size
+ type: u32
+ -
+ name: increment
+ type: u32
+ -
+ name: decrement
+ type: u32
+ -
+ name: limit
+ type: u32
+ -
+ name: penalty-rate
+ type: u32
+ -
+ name: penalty-burst
+ type: u32
+ -
+ name: tc-sfq-qopt-v1 # TODO nested structs
+ type: struct
+ members:
+ -
+ name: quantum
+ type: u32
+ -
+ name: perturb-period
+ type: s32
+ -
+ name: limit
+ type: u32
+ -
+ name: divisor
+ type: u32
+ -
+ name: flows
+ type: u32
+ -
+ name: depth
+ type: u32
+ -
+ name: headdrop
+ type: u32
+ -
+ name: limit
+ type: u32
+ -
+ name: qth-min
+ type: u32
+ -
+ name: qth-mac
+ type: u32
+ -
+ name: Wlog
+ type: u8
+ -
+ name: Plog
+ type: u8
+ -
+ name: Scell-log
+ type: u8
+ -
+ name: flags
+ type: u8
+ -
+ name: max-P
+ type: u32
+ -
+ name: prob-drop
+ type: u32
+ -
+ name: forced-drop
+ type: u32
+ -
+ name: prob-mark
+ type: u32
+ -
+ name: forced-mark
+ type: u32
+ -
+ name: prob-mark-head
+ type: u32
+ -
+ name: forced-mark-head
+ type: u32
+ -
+ name: tc-tbf-qopt
+ type: struct
+ members:
+ -
+ name: rate
+ type: binary # TODO nested struct tc_ratespec
+ len: 12
+ -
+ name: peakrate
+ type: binary # TODO nested struct tc_ratespec
+ len: 12
+ -
+ name: limit
+ type: u32
+ -
+ name: buffer
+ type: u32
+ -
+ name: mtu
+ type: u32
+ -
+ name: tc-sizespec
+ type: struct
+ members:
+ -
+ name: cell-log
+ type: u8
+ -
+ name: size-log
+ type: u8
+ -
+ name: cell-align
+ type: s16
+ -
+ name: overhead
+ type: s32
+ -
+ name: linklayer
+ type: u32
+ -
+ name: mpu
+ type: u32
+ -
+ name: mtu
+ type: u32
+ -
+ name: tsize
+ type: u32
+ -
+ name: gnet-estimator
+ type: struct
+ members:
+ -
+ name: interval
+ type: s8
+ -
+ name: ewma-log
+ type: u8
+attribute-sets:
+ -
+ name: tc-attrs
+ attributes:
+ -
+ name: kind
+ type: string
+ -
+ name: options
+ type: sub-message
+ sub-message: tc-options-msg
+ selector: kind
+ -
+ name: stats
+ type: binary
+ struct: tc-stats
+ -
+ name: xstats
+ type: binary
+ -
+ name: rate
+ type: binary
+ struct: gnet-estimator
+ -
+ name: fcnt
+ type: u32
+ -
+ name: stats2
+ type: nest
+ nested-attributes: tca-stats-attrs
+ -
+ name: stab
+ type: nest
+ nested-attributes: tca-stab-attrs
+ -
+ name: pad
+ type: pad
+ -
+ name: dump-invisible
+ type: flag
+ -
+ name: chain
+ type: u32
+ -
+ name: hw-offload
+ type: u8
+ -
+ name: ingress-block
+ type: u32
+ -
+ name: egress-block
+ type: u32
+ -
+ name: dump-flags
+ type: bitfield32
+ -
+ name: ext-warn-msg
+ type: string
+ -
+ name: tc-cake-attrs
+ attributes:
+ -
+ name: pad
+ type: pad
+ -
+ name: base-rate64
+ type: u64
+ -
+ name: diffserv-mode
+ type: u32
+ -
+ name: atm
+ type: u32
+ -
+ name: flow-mode
+ type: u32
+ -
+ name: overhead
+ type: u32
+ -
+ name: rtt
+ type: u32
+ -
+ name: target
+ type: u32
+ -
+ name: autorate
+ type: u32
+ -
+ name: memory
+ type: u32
+ -
+ name: nat
+ type: u32
+ -
+ name: raw
+ type: u32
+ -
+ name: wash
+ type: u32
+ -
+ name: mpu
+ type: u32
+ -
+ name: ingress
+ type: u32
+ -
+ name: ack-filter
+ type: u32
+ -
+ name: split-gso
+ type: u32
+ -
+ name: fwmark
+ type: u32
+ -
+ name: tc-cake-stats-attrs
+ attributes:
+ -
+ name: pad
+ type: pad
+ -
+ name: capacity-estimate64
+ type: u64
+ -
+ name: memory-limit
+ type: u32
+ -
+ name: memory-used
+ type: u32
+ -
+ name: avg-netoff
+ type: u32
+ -
+ name: min-netlen
+ type: u32
+ -
+ name: max-netlen
+ type: u32
+ -
+ name: min-adjlen
+ type: u32
+ -
+ name: max-adjlen
+ type: u32
+ -
+ name: tin-stats
+ type: binary
+ -
+ name: deficit
+ type: s32
+ -
+ name: cobalt-count
+ type: u32
+ -
+ name: dropping
+ type: u32
+ -
+ name: drop-next-us
+ type: s32
+ -
+ name: p-drop
+ type: u32
+ -
+ name: blue-timer-us
+ type: s32
+ -
+ name: tc-cbs-attrs
+ attributes:
+ -
+ name: parms
+ type: binary
+ struct: tc-cbs-qopt
+ -
+ name: tc-choke-attrs
+ attributes:
+ -
+ name: parms
+ type: binary
+ struct: tc-red-qopt
+ -
+ name: stab
+ type: binary
+ -
+ name: max-p
+ type: u32
+ -
+ name: tc-codel-attrs
+ attributes:
+ -
+ name: target
+ type: u32
+ -
+ name: limit
+ type: u32
+ -
+ name: interval
+ type: u32
+ -
+ name: ecn
+ type: u32
+ -
+ name: ce-threshold
+ type: u32
+ -
+ name: tc-flower-attrs
+ attributes:
+ -
+ name: classid
+ type: u32
+ -
+ name: indev
+ type: string
+ -
+ name: act
+ type: array-nest
+ nested-attributes: tc-act-attrs
+ -
+ name: key-eth-dst
+ type: binary
+ display-hint: mac
+ -
+ name: key-eth-dst-mask
+ type: binary
+ display-hint: mac
+ -
+ name: key-eth-src
+ type: binary
+ display-hint: mac
+ -
+ name: key-eth-src-mask
+ type: binary
+ display-hint: mac
+ -
+ name: key-eth-type
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-ip-proto
+ type: u8
+ -
+ name: key-ipv4-src
+ type: u32
+ byte-order: big-endian
+ display-hint: ipv4
+ -
+ name: key-ipv4-src-mask
+ type: u32
+ byte-order: big-endian
+ display-hint: ipv4
+ -
+ name: key-ipv4-dst
+ type: u32
+ byte-order: big-endian
+ display-hint: ipv4
+ -
+ name: key-ipv4-dst-mask
+ type: u32
+ byte-order: big-endian
+ display-hint: ipv4
+ -
+ name: key-ipv6-src
+ type: binary
+ display-hint: ipv6
+ -
+ name: key-ipv6-src-mask
+ type: binary
+ display-hint: ipv6
+ -
+ name: key-ipv6-dst
+ type: binary
+ display-hint: ipv6
+ -
+ name: key-ipv6-dst-mask
+ type: binary
+ display-hint: ipv6
+ -
+ name: key-tcp-src
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-tcp-dst
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-udp-src
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-udp-dst
+ type: u16
+ byte-order: big-endian
+ -
+ name: flags
+ type: u32
+ enum: tc-cls-flags
+ enum-as-flags: true
+ -
+ name: key-vlan-id
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-vlan-prio
+ type: u8
+ -
+ name: key-vlan-eth-type
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-enc-key-id
+ type: u32
+ byte-order: big-endian
+ -
+ name: key-enc-ipv4-src
+ type: u32
+ byte-order: big-endian
+ display-hint: ipv4
+ -
+ name: key-enc-ipv4-src-mask
+ type: u32
+ byte-order: big-endian
+ display-hint: ipv4
+ -
+ name: key-enc-ipv4-dst
+ type: u32
+ byte-order: big-endian
+ display-hint: ipv4
+ -
+ name: key-enc-ipv4-dst-mask
+ type: u32
+ byte-order: big-endian
+ display-hint: ipv4
+ -
+ name: key-enc-ipv6-src
+ type: binary
+ display-hint: ipv6
+ -
+ name: key-enc-ipv6-src-mask
+ type: binary
+ display-hint: ipv6
+ -
+ name: key-enc-ipv6-dst
+ type: binary
+ display-hint: ipv6
+ -
+ name: key-enc-ipv6-dst-mask
+ type: binary
+ display-hint: ipv6
+ -
+ name: key-tcp-src-mask
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-tcp-dst-mask
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-udp-src-mask
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-udp-dst-mask
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-sctp-src-mask
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-sctp-dst-mask
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-sctp-src
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-sctp-dst
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-enc-udp-src-port
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-enc-udp-src-port-mask
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-enc-udp-dst-port
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-enc-udp-dst-port-mask
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-flags
+ type: u32
+ byte-order: big-endian
+ -
+ name: key-flags-mask
+ type: u32
+ byte-order: big-endian
+ -
+ name: key-icmpv4-code
+ type: u8
+ -
+ name: key-icmpv4-code-mask
+ type: u8
+ -
+ name: key-icmpv4-type
+ type: u8
+ -
+ name: key-icmpv4-type-mask
+ type: u8
+ -
+ name: key-icmpv6-code
+ type: u8
+ -
+ name: key-icmpv6-code-mask
+ type: u8
+ -
+ name: key-icmpv6-type
+ type: u8
+ -
+ name: key-icmpv6-type-mask
+ type: u8
+ -
+ name: key-arp-sip
+ type: u32
+ byte-order: big-endian
+ -
+ name: key-arp-sip-mask
+ type: u32
+ byte-order: big-endian
+ -
+ name: key-arp-tip
+ type: u32
+ byte-order: big-endian
+ -
+ name: key-arp-tip-mask
+ type: u32
+ byte-order: big-endian
+ -
+ name: key-arp-op
+ type: u8
+ -
+ name: key-arp-op-mask
+ type: u8
+ -
+ name: key-arp-sha
+ type: binary
+ -
+ name: key-arp-sha-mask
+ type: binary
+ -
+ name: key-arp-tha
+ type: binary
+ -
+ name: key-arp-tha-mask
+ type: binary
+ -
+ name: key-mpls-ttl
+ type: u8
+ -
+ name: key-mpls-bos
+ type: u8
+ -
+ name: key-mpls-tc
+ type: u8
+ -
+ name: key-mpls-label
+ type: u32
+ byte-order: big-endian
+ -
+ name: key-tcp-flags
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-tcp-flags-mask
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-ip-tos
+ type: u8
+ -
+ name: key-ip-tos-mask
+ type: u8
+ -
+ name: key-ip-ttl
+ type: u8
+ -
+ name: key-ip-ttl-mask
+ type: u8
+ -
+ name: key-cvlan-id
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-cvlan-prio
+ type: u8
+ -
+ name: key-cvlan-eth-type
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-enc-ip-tos
+ type: u8
+ -
+ name: key-enc-ip-tos-mask
+ type: u8
+ -
+ name: key-enc-ip-ttl
+ type: u8
+ -
+ name: key-enc-ip-ttl-mask
+ type: u8
+ -
+ name: key-enc-opts
+ type: binary
+ -
+ name: key-enc-opts-mask
+ type: binary
+ -
+ name: in-hw-count
+ type: u32
+ -
+ name: key-port-src-min
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-port-src-max
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-port-dst-min
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-port-dst-max
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-ct-state
+ type: u16
+ -
+ name: key-ct-state-mask
+ type: u16
+ -
+ name: key-ct-zone
+ type: u16
+ -
+ name: key-ct-zone-mask
+ type: u16
+ -
+ name: key-ct-mark
+ type: u32
+ -
+ name: key-ct-mark-mask
+ type: u32
+ -
+ name: key-ct-labels
+ type: binary
+ -
+ name: key-ct-labels-mask
+ type: binary
+ -
+ name: key-mpls-opts
+ type: binary
+ -
+ name: key-hash
+ type: u32
+ -
+ name: key-hash-mask
+ type: u32
+ -
+ name: key-num-of-vlans
+ type: u8
+ -
+ name: key-pppoe-sid
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-ppp-proto
+ type: u16
+ byte-order: big-endian
+ -
+ name: key-l2-tpv3-sid
+ type: u32
+ byte-order: big-endian
+ -
+ name: tc-gred-attrs
+ attributes:
+ -
+ name: parms
+ type: binary # array of struct: tc-gred-qopt
+ -
+ name: stab
+ type: binary
+ sub-type: u8
+ -
+ name: dps
+ type: binary
+ struct: tc-gred-sopt
+ -
+ name: max-p
+ type: binary
+ sub-type: u32
+ -
+ name: limit
+ type: u32
+ -
+ name: vq-list
+ type: nest
+ nested-attributes: tca-gred-vq-list-attrs
+ -
+ name: tca-gred-vq-list-attrs
+ attributes:
+ -
+ name: entry
+ type: nest
+ nested-attributes: tca-gred-vq-entry-attrs
+ multi-attr: true
+ -
+ name: tca-gred-vq-entry-attrs
+ attributes:
+ -
+ name: pad
+ type: pad
+ -
+ name: dp
+ type: u32
+ -
+ name: stat-bytes
+ type: u32
+ -
+ name: stat-packets
+ type: u32
+ -
+ name: stat-backlog
+ type: u32
+ -
+ name: stat-prob-drop
+ type: u32
+ -
+ name: stat-prob-mark
+ type: u32
+ -
+ name: stat-forced-drop
+ type: u32
+ -
+ name: stat-forced-mark
+ type: u32
+ -
+ name: stat-pdrop
+ type: u32
+ -
+ name: stat-other
+ type: u32
+ -
+ name: flags
+ type: u32
+ -
+ name: tc-hfsc-attrs
+ attributes:
+ -
+ name: rsc
+ type: binary
+ -
+ name: fsc
+ type: binary
+ -
+ name: usc
+ type: binary
+ -
+ name: tc-hhf-attrs
+ attributes:
+ -
+ name: backlog-limit
+ type: u32
+ -
+ name: quantum
+ type: u32
+ -
+ name: hh-flows-limit
+ type: u32
+ -
+ name: reset-timeout
+ type: u32
+ -
+ name: admit-bytes
+ type: u32
+ -
+ name: evict-timeout
+ type: u32
+ -
+ name: non-hh-weight
+ type: u32
+ -
+ name: tc-htb-attrs
+ attributes:
+ -
+ name: parms
+ type: binary
+ struct: tc-htb-opt
+ -
+ name: init
+ type: binary
+ struct: tc-htb-glob
+ -
+ name: ctab
+ type: binary
+ -
+ name: rtab
+ type: binary
+ -
+ name: direct-qlen
+ type: u32
+ -
+ name: rate64
+ type: u64
+ -
+ name: ceil64
+ type: u64
+ -
+ name: pad
+ type: pad
+ -
+ name: offload
+ type: flag
+ -
+ name: tc-act-attrs
+ attributes:
+ -
+ name: kind
+ type: string
+ -
+ name: options
+ type: sub-message
+ sub-message: tc-act-options-msg
+ selector: kind
+ -
+ name: index
+ type: u32
+ -
+ name: stats
+ type: binary
+ -
+ name: pad
+ type: pad
+ -
+ name: cookie
+ type: binary
+ -
+ name: flags
+ type: bitfield32
+ -
+ name: hw-stats
+ type: bitfield32
+ -
+ name: used-hw-stats
+ type: bitfield32
+ -
+ name: in-hw-count
+ type: u32
+ -
+ name: tc-etf-attrs
+ attributes:
+ -
+ name: parms
+ type: binary
+ struct: tc-etf-qopt
+ -
+ name: tc-ets-attrs
+ attributes:
+ -
+ name: nbands
+ type: u8
+ -
+ name: nstrict
+ type: u8
+ -
+ name: quanta
+ type: nest
+ nested-attributes: tc-ets-attrs
+ -
+ name: quanta-band
+ type: u32
+ multi-attr: true
+ -
+ name: priomap
+ type: nest
+ nested-attributes: tc-ets-attrs
+ -
+ name: priomap-band
+ type: u8
+ multi-attr: true
+ -
+ name: tc-fq-attrs
+ attributes:
+ -
+ name: plimit
+ type: u32
+ -
+ name: flow-plimit
+ type: u32
+ -
+ name: quantum
+ type: u32
+ -
+ name: initial-quantum
+ type: u32
+ -
+ name: rate-enable
+ type: u32
+ -
+ name: flow-default-rate
+ type: u32
+ -
+ name: flow-max-rate
+ type: u32
+ -
+ name: buckets-log
+ type: u32
+ -
+ name: flow-refill-delay
+ type: u32
+ -
+ name: orphan-mask
+ type: u32
+ -
+ name: low-rate-threshold
+ type: u32
+ -
+ name: ce-threshold
+ type: u32
+ -
+ name: timer-slack
+ type: u32
+ -
+ name: horizon
+ type: u32
+ -
+ name: horizon-drop
+ type: u8
+ -
+ name: tc-fq-codel-attrs
+ attributes:
+ -
+ name: target
+ type: u32
+ -
+ name: limit
+ type: u32
+ -
+ name: interval
+ type: u32
+ -
+ name: ecn
+ type: u32
+ -
+ name: flows
+ type: u32
+ -
+ name: quantum
+ type: u32
+ -
+ name: ce-threshold
+ type: u32
+ -
+ name: drop-batch-size
+ type: u32
+ -
+ name: memory-limit
+ type: u32
+ -
+ name: ce-threshold-selector
+ type: u8
+ -
+ name: ce-threshold-mask
+ type: u8
+ -
+ name: tc-fq-pie-attrs
+ attributes:
+ -
+ name: limit
+ type: u32
+ -
+ name: flows
+ type: u32
+ -
+ name: target
+ type: u32
+ -
+ name: tupdate
+ type: u32
+ -
+ name: alpha
+ type: u32
+ -
+ name: beta
+ type: u32
+ -
+ name: quantum
+ type: u32
+ -
+ name: memory-limit
+ type: u32
+ -
+ name: ecn-prob
+ type: u32
+ -
+ name: ecn
+ type: u32
+ -
+ name: bytemode
+ type: u32
+ -
+ name: dq-rate-estimator
+ type: u32
+ -
+ name: tc-netem-attrs
+ attributes:
+ -
+ name: corr
+ type: binary
+ -
+ name: delay-dist
+ type: binary
+ sub-type: s16
+ -
+ name: reorder
+ type: binary
+ -
+ name: corrupt
+ type: binary
+ -
+ name: loss
+ type: binary
+ -
+ name: rate
+ type: binary
+ -
+ name: ecn
+ type: u32
+ -
+ name: rate64
+ type: u64
+ -
+ name: pad
+ type: u32
+ -
+ name: latency64
+ type: s64
+ -
+ name: jitter64
+ type: s64
+ -
+ name: slot
+ type: binary
+ -
+ name: slot-dist
+ type: binary
+ sub-type: s16
+ -
+ name: tc-pie-attrs
+ attributes:
+ -
+ name: target
+ type: u32
+ -
+ name: limit
+ type: u32
+ -
+ name: tupdate
+ type: u32
+ -
+ name: alpha
+ type: u32
+ -
+ name: beta
+ type: u32
+ -
+ name: ecn
+ type: u32
+ -
+ name: bytemode
+ type: u32
+ -
+ name: dq-rate-estimator
+ type: u32
+ -
+ name: tc-red-attrs
+ attributes:
+ -
+ name: parms
+ type: binary
+ struct: tc-red-qopt
+ -
+ name: stab
+ type: binary
+ -
+ name: max-p
+ type: u32
+ -
+ name: flags
+ type: binary
+ -
+ name: early-drop-block
+ type: u32
+ -
+ name: mark-block
+ type: u32
+ -
+ name: tc-taprio-attrs
+ attributes:
+ -
+ name: priomap
+ type: binary
+ struct: tc-mqprio-qopt
+ -
+ name: sched-entry-list
+ type: nest
+ nested-attributes: tc-taprio-sched-entry-list
+ -
+ name: sched-base-time
+ type: s64
+ -
+ name: sched-single-entry
+ type: nest
+ nested-attributes: tc-taprio-sched-entry
+ -
+ name: sched-clockid
+ type: s32
+ -
+ name: pad
+ type: pad
+ -
+ name: admin-sched
+ type: binary
+ -
+ name: sched-cycle-time
+ type: s64
+ -
+ name: sched-cycle-time-extension
+ type: s64
+ -
+ name: flags
+ type: u32
+ -
+ name: txtime-delay
+ type: u32
+ -
+ name: tc-entry
+ type: nest
+ nested-attributes: tc-taprio-tc-entry-attrs
+ -
+ name: tc-taprio-sched-entry-list
+ attributes:
+ -
+ name: entry
+ type: nest
+ nested-attributes: tc-taprio-sched-entry
+ -
+ name: tc-taprio-sched-entry
+ attributes:
+ -
+ name: index
+ type: u32
+ -
+ name: cmd
+ type: u8
+ -
+ name: gate-mask
+ type: u32
+ -
+ name: interval
+ type: u32
+ -
+ name: tc-taprio-tc-entry-attrs
+ attributes:
+ -
+ name: index
+ type: u32
+ -
+ name: max-sdu
+ type: u32
+ -
+ name: fp
+ type: u32
+ -
+ name: tc-tbf-attrs
+ attributes:
+ -
+ name: parms
+ type: binary
+ struct: tc-tbf-qopt
+ -
+ name: rtab
+ type: binary
+ -
+ name: ptab
+ type: binary
+ -
+ name: rate64
+ type: u64
+ -
+ name: prate4
+ type: u64
+ -
+ name: burst
+ type: u32
+ -
+ name: pburst
+ type: u32
+ -
+ name: pad
+ type: pad
+ -
+ name: tca-gact-attrs
+ attributes:
+ -
+ name: tm
+ type: binary
+ -
+ name: parms
+ type: binary
+ -
+ name: prob
+ type: binary
+ -
+ name: pad
+ type: pad
+ -
+ name: tca-stab-attrs
+ attributes:
+ -
+ name: base
+ type: binary
+ struct: tc-sizespec
+ -
+ name: data
+ type: binary
+ -
+ name: tca-stats-attrs
+ attributes:
+ -
+ name: basic
+ type: binary
+ -
+ name: rate-est
+ type: binary
+ -
+ name: queue
+ type: binary
+ -
+ name: app
+ type: binary # TODO sub-message needs 2+ level deep lookup
+ sub-message: tca-stats-app-msg
+ selector: kind
+ -
+ name: rate-est64
+ type: binary
+ -
+ name: pad
+ type: pad
+ -
+ name: basic-hw
+ type: binary
+ -
+ name: pkt64
+ type: binary
+
+sub-messages:
+ -
+ name: tc-options-msg
+ formats:
+ -
+ value: bfifo
+ fixed-header: tc-fifo-qopt
+ -
+ value: cake
+ attribute-set: tc-cake-attrs
+ -
+ value: cbs
+ attribute-set: tc-cbs-attrs
+ -
+ value: choke
+ attribute-set: tc-choke-attrs
+ -
+ value: clsact # no content
+ -
+ value: codel
+ attribute-set: tc-codel-attrs
+ -
+ value: drr # TODO
+ -
+ value: etf
+ attribute-set: tc-etf-attrs
+ -
+ value: ets
+ attribute-set: tc-ets-attrs
+ -
+ value: fq
+ attribute-set: tc-fq-attrs
+ -
+ value: fq_codel
+ attribute-set: tc-fq-codel-attrs
+ -
+ value: fq_pie
+ attribute-set: tc-fq-pie-attrs
+ -
+ value: flower
+ attribute-set: tc-flower-attrs
+ -
+ value: gred
+ attribute-set: tc-gred-attrs
+ -
+ value: hfsc
+ fixed-header: tc-hfsc-qopt
+ -
+ value: hhf
+ attribute-set: tc-hhf-attrs
+ -
+ value: htb
+ attribute-set: tc-htb-attrs
+ -
+ value: ingress # no content
+ -
+ value: mq # TODO
+ -
+ value: mqprio
+ fixed-header: tc-mqprio-qopt
+ -
+ value: multiq
+ fixed-header: tc-multiq-qopt
+ -
+ value: netem
+ fixed-header: tc-netem-qopt
+ attribute-set: tc-netem-attrs
+ -
+ value: pfifo
+ fixed-header: tc-fifo-qopt
+ -
+ value: pfifo_fast
+ fixed-header: tc-prio-qopt
+ -
+ value: pfifo_head_drop
+ fixed-header: tc-fifo-qopt
+ -
+ value: pie
+ attribute-set: tc-pie-attrs
+ -
+ value: plug # TODO
+ -
+ value: prio
+ fixed-header: tc-prio-qopt
+ -
+ value: qfq # TODO
+ -
+ value: red
+ attribute-set: tc-red-attrs
+ -
+ value: sfb
+ fixed-header: tc-sfb-qopt
+ -
+ value: sfq
+ fixed-header: tc-sfq-qopt-v1
+ -
+ value: taprio
+ attribute-set: tc-taprio-attrs
+ -
+ value: tbf
+ attribute-set: tc-tbf-attrs
+ -
+ name: tc-act-options-msg
+ formats:
+ -
+ value: gact
+ attribute-set: tca-gact-attrs
+ -
+ name: tca-stats-app-msg
+ formats:
+ -
+ value: bfifo
+ -
+ value: blackhole
+ -
+ value: cake
+ attribute-set: tc-cake-stats-attrs
+ -
+ value: cbs
+ -
+ value: choke
+ -
+ value: clsact
+ -
+ value: codel
+ -
+ value: drr
+ -
+ value: etf
+ -
+ value: ets
+ -
+ value: fq
+ -
+ value: fq_codel
+ -
+ value: fq_pie
+ -
+ value: flower
+ -
+ value: gred
+ -
+ value: hfsc
+ -
+ value: hhf
+ -
+ value: htb
+ -
+ value: ingress
+ -
+ value: mq
+ -
+ value: mqprio
+ -
+ value: multiq
+ -
+ value: netem
+ -
+ value: noqueue
+ -
+ value: pfifo
+ -
+ value: pfifo_fast
+ -
+ value: pfifo_head_drop
+ -
+ value: pie
+ -
+ value: plug
+ -
+ value: prio
+ -
+ value: qfq
+ -
+ value: red
+ -
+ value: sfb
+ -
+ value: sfq
+ -
+ value: taprio
+ -
+ value: tbf
+
+operations:
+ enum-model: directional
+ list:
+ -
+ name: newqdisc
+ doc: Create new tc qdisc.
+ attribute-set: tc-attrs
+ fixed-header: tcmsg
+ do:
+ request:
+ value: 36
+ attributes: &create-params
+ - tcm-family
+ - tcm-ifindex
+ - tcm-handle
+ - tcm-parent
+ - tca-kind
+ - tca-options
+ - tca-rate
+ - tca-stab
+ - tca-chain
+ - tca-ingress-block
+ - tca-egress-block
+ -
+ name: delqdisc
+ doc: Delete existing tc qdisc.
+ attribute-set: tc-attrs
+ fixed-header: tcmsg
+ do:
+ request:
+ value: 37
+ attributes: &lookup-params
+ - tcm-family
+ - tcm-ifindex
+ - tcm-handle
+ - tcm-parent
+ -
+ name: getqdisc
+ doc: Get / dump tc qdisc information.
+ attribute-set: tc-attrs
+ fixed-header: tcmsg
+ do:
+ request:
+ value: 38
+ attributes:
+ - tcm-family
+ - tcm-ifindex
+ - tcm-handle
+ - tcm-parent
+ - tca-dump-invisible
+ - tca-dump-flags
+ reply:
+ value: 36
+ attributes: &tc-all
+ - tcm-family
+ - tcm-ifindex
+ - tcm-handle
+ - tcm-parent
+ - tca-kind
+ - tca-options
+ - tca-stats
+ - tca-xstats
+ - tca-rate
+ - tca-fcnt
+ - tca-stats2
+ - tca-stab
+ - tca-chain
+ - tca-ingress-block
+ - tca-egress-block
+ -
+ name: newtclass
+ doc: Get / dump tc traffic class information.
+ attribute-set: tc-attrs
+ fixed-header: tcmsg
+ do:
+ request:
+ value: 40
+ attributes: *create-params
+ -
+ name: deltclass
+ doc: Get / dump tc traffic class information.
+ attribute-set: tc-attrs
+ fixed-header: tcmsg
+ do:
+ request:
+ value: 41
+ attributes: *lookup-params
+ -
+ name: gettclass
+ doc: Get / dump tc traffic class information.
+ attribute-set: tc-attrs
+ fixed-header: tcmsg
+ do:
+ request:
+ value: 42
+ attributes: *lookup-params
+ reply:
+ value: 40
+ attributes: *tc-all
+ -
+ name: newtfilter
+ doc: Get / dump tc filter information.
+ attribute-set: tc-attrs
+ fixed-header: tcmsg
+ do:
+ request:
+ value: 44
+ attributes: *create-params
+ -
+ name: deltfilter
+ doc: Get / dump tc filter information.
+ attribute-set: tc-attrs
+ fixed-header: tcmsg
+ do:
+ request:
+ value: 45
+ attributes: *lookup-params
+ -
+ name: gettfilter
+ doc: Get / dump tc filter information.
+ attribute-set: tc-attrs
+ fixed-header: tcmsg
+ do:
+ request:
+ value: 46
+ attributes: *lookup-params
+ reply:
+ value: 44
+ attributes: *tc-all
+ -
+ name: newchain
+ doc: Get / dump tc chain information.
+ attribute-set: tc-attrs
+ fixed-header: tcmsg
+ do:
+ request:
+ value: 100
+ attributes: *create-params
+ -
+ name: delchain
+ doc: Get / dump tc chain information.
+ attribute-set: tc-attrs
+ fixed-header: tcmsg
+ do:
+ request:
+ value: 101
+ attributes: *lookup-params
+ -
+ name: getchain
+ doc: Get / dump tc chain information.
+ attribute-set: tc-attrs
+ fixed-header: tcmsg
+ do:
+ request:
+ value: 102
+ attributes: *lookup-params
+ reply:
+ value: 100
+ attributes: *tc-all
+
+mcast-groups:
+ list:
+ -
+ name: rtnlgrp-tc
+ value: 4
--
2.42.0
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH net-next v1 6/6] doc/netlink/specs: Add a spec for tc
2023-11-30 21:49 ` [PATCH net-next v1 6/6] doc/netlink/specs: Add a spec for tc Donald Hunter
@ 2023-12-02 2:13 ` Jakub Kicinski
2023-12-04 16:27 ` Donald Hunter
0 siblings, 1 reply; 27+ messages in thread
From: Jakub Kicinski @ 2023-12-02 2:13 UTC (permalink / raw)
To: Donald Hunter
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
On Thu, 30 Nov 2023 21:49:58 +0000 Donald Hunter wrote:
> + -
> + name: app
> + type: binary # TODO sub-message needs 2+ level deep lookup
> + sub-message: tca-stats-app-msg
> + selector: kind
Ugh. Meaning the selector is at a "previous" level of nesting?
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH net-next v1 6/6] doc/netlink/specs: Add a spec for tc
2023-12-02 2:13 ` Jakub Kicinski
@ 2023-12-04 16:27 ` Donald Hunter
2023-12-04 18:32 ` Jakub Kicinski
0 siblings, 1 reply; 27+ messages in thread
From: Donald Hunter @ 2023-12-04 16:27 UTC (permalink / raw)
To: Jakub Kicinski
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
Jakub Kicinski <kuba@kernel.org> writes:
> On Thu, 30 Nov 2023 21:49:58 +0000 Donald Hunter wrote:
>> + -
>> + name: app
>> + type: binary # TODO sub-message needs 2+ level deep lookup
>> + sub-message: tca-stats-app-msg
>> + selector: kind
>
> Ugh. Meaning the selector is at a "previous" level of nesting?
That's right. I wonder if we should use a relative syntax like "../kind"
for the selector. Will either need to pass the known attrs to nest
parsing, or pass a resolver instead?
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH net-next v1 6/6] doc/netlink/specs: Add a spec for tc
2023-12-04 16:27 ` Donald Hunter
@ 2023-12-04 18:32 ` Jakub Kicinski
2023-12-04 22:38 ` Donald Hunter
0 siblings, 1 reply; 27+ messages in thread
From: Jakub Kicinski @ 2023-12-04 18:32 UTC (permalink / raw)
To: Donald Hunter
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
On Mon, 04 Dec 2023 16:27:24 +0000 Donald Hunter wrote:
> > Ugh. Meaning the selector is at a "previous" level of nesting?
>
> That's right. I wonder if we should use a relative syntax like "../kind"
> for the selector. Will either need to pass the known attrs to nest
> parsing, or pass a resolver instead?
../kind is my first thought, too.
But on reflection I reckon it may make the codegen and Python parser
quite a bit more complex. :S
Passing in known selector attrs to nests sounds good. Assuming we never
have to do something like: "../other-nest/attr".
Or perhaps in that case we can support passing in nested attrs, just
not backtracking? Backtracking is the hard part, really. Yeah, that
sounds simplest, at least at the "thought exercise level" :)
What would "resolver" look like?
BTW how do we deal with ordering. Do we require that selector attr
must be present in the message before the submsg? I think in practice
is should always be the case, but we should document that.
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH net-next v1 6/6] doc/netlink/specs: Add a spec for tc
2023-12-04 18:32 ` Jakub Kicinski
@ 2023-12-04 22:38 ` Donald Hunter
0 siblings, 0 replies; 27+ messages in thread
From: Donald Hunter @ 2023-12-04 22:38 UTC (permalink / raw)
To: Jakub Kicinski
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
Jakub Kicinski <kuba@kernel.org> writes:
> On Mon, 04 Dec 2023 16:27:24 +0000 Donald Hunter wrote:
>> > Ugh. Meaning the selector is at a "previous" level of nesting?
>>
>> That's right. I wonder if we should use a relative syntax like "../kind"
>> for the selector. Will either need to pass the known attrs to nest
>> parsing, or pass a resolver instead?
>
> ../kind is my first thought, too.
>
> But on reflection I reckon it may make the codegen and Python parser
> quite a bit more complex. :S
That was my main concern with it too.
Another thought I had was to explicitly mark attrs that get used as
selector keys, but I don't think that actually buys us anything.
> Passing in known selector attrs to nests sounds good. Assuming we never
> have to do something like: "../other-nest/attr".
> Or perhaps in that case we can support passing in nested attrs, just
> not backtracking? Backtracking is the hard part, really. Yeah, that
> sounds simplest, at least at the "thought exercise level" :)
>
> What would "resolver" look like?
I was thinking a resolver would be a class with a single lookup method
that internally holds attributes from the current scope and has a parent
it can delegate to. It would try to resolve e.g. "kind" in current scope
then, on failure, delegate to its parent. When recursing to decode a
submsg, create a new resolver with the current one as its parent.
If we did it this way, there'd be no need for "../kind".
> BTW how do we deal with ordering. Do we require that selector attr
> must be present in the message before the submsg? I think in practice
> is should always be the case, but we should document that.
The selector attr is de-facto present in the message before it is
needed, both at the same level and for sub messages. So, yeah, I think
we require this and agreed we should document it. I will do that in
the next revision.
From what I have seen so far, selector attrs are at same level or at
root level, but I'm not confident that will hold true for all of the raw
families.
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH net-next v1 0/6] tools/net/ynl: Add 'sub-message' support to ynl
2023-11-30 21:49 [PATCH net-next v1 0/6] tools/net/ynl: Add 'sub-message' support to ynl Donald Hunter
` (5 preceding siblings ...)
2023-11-30 21:49 ` [PATCH net-next v1 6/6] doc/netlink/specs: Add a spec for tc Donald Hunter
@ 2023-12-02 1:50 ` patchwork-bot+netdevbpf
2023-12-02 2:15 ` Jakub Kicinski
7 siblings, 0 replies; 27+ messages in thread
From: patchwork-bot+netdevbpf @ 2023-12-02 1:50 UTC (permalink / raw)
To: Donald Hunter
Cc: netdev, kuba, davem, edumazet, pabeni, corbet, linux-doc,
jacob.e.keller, donald.hunter
Hello:
This series was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:
On Thu, 30 Nov 2023 21:49:52 +0000 you wrote:
> This patchset adds a 'sub-message' attribute type to the netlink-raw
> schema and implements it in ynl. This provides support for kind-specific
> options attributes as used in rt_link and tc raw netlink families.
>
> A description of the new 'sub-message' attribute type and the
> corresponding sub-message definitions is provided in patch 2.
>
> [...]
Here is the summary with links:
- [net-next,v1,1/6] doc/netlink: Add bitfield32, s8, s16 to the netlink-raw schema
https://git.kernel.org/netdev/net-next/c/527d2cd8b852
- [net-next,v1,2/6] doc/netlink: Add sub-message support to netlink-raw
(no matching commit)
- [net-next,v1,3/6] tools/net/ynl: Add 'sub-message' attribute decoding to ynl
(no matching commit)
- [net-next,v1,4/6] tools/net/ynl: Add binary and pad support to structs for tc
(no matching commit)
- [net-next,v1,5/6] doc/netlink/specs: add sub-message type to rt_link family
(no matching commit)
- [net-next,v1,6/6] doc/netlink/specs: Add a spec for tc
(no matching commit)
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 27+ messages in thread* Re: [PATCH net-next v1 0/6] tools/net/ynl: Add 'sub-message' support to ynl
2023-11-30 21:49 [PATCH net-next v1 0/6] tools/net/ynl: Add 'sub-message' support to ynl Donald Hunter
` (6 preceding siblings ...)
2023-12-02 1:50 ` [PATCH net-next v1 0/6] tools/net/ynl: Add 'sub-message' support to ynl patchwork-bot+netdevbpf
@ 2023-12-02 2:15 ` Jakub Kicinski
2023-12-04 15:54 ` Donald Hunter
7 siblings, 1 reply; 27+ messages in thread
From: Jakub Kicinski @ 2023-12-02 2:15 UTC (permalink / raw)
To: Donald Hunter
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
On Thu, 30 Nov 2023 21:49:52 +0000 Donald Hunter wrote:
> Documentation/netlink/specs/rt_link.yaml | 273 ++-
> Documentation/netlink/specs/tc.yaml | 2008 ++++++++++++++++++++++
Should we add sub-messages to tools/net/ynl/ynl-gen-rst.py ?
Does the output look sane with the new attributes?
^ permalink raw reply [flat|nested] 27+ messages in thread* Re: [PATCH net-next v1 0/6] tools/net/ynl: Add 'sub-message' support to ynl
2023-12-02 2:15 ` Jakub Kicinski
@ 2023-12-04 15:54 ` Donald Hunter
2023-12-04 18:33 ` Jakub Kicinski
0 siblings, 1 reply; 27+ messages in thread
From: Donald Hunter @ 2023-12-04 15:54 UTC (permalink / raw)
To: Jakub Kicinski
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
Jakub Kicinski <kuba@kernel.org> writes:
> On Thu, 30 Nov 2023 21:49:52 +0000 Donald Hunter wrote:
>> Documentation/netlink/specs/rt_link.yaml | 273 ++-
>> Documentation/netlink/specs/tc.yaml | 2008 ++++++++++++++++++++++
>
> Should we add sub-messages to tools/net/ynl/ynl-gen-rst.py ?
> Does the output look sane with the new attributes?
Ah, yes we should. Okay if I look at this as a followup patch?
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH net-next v1 0/6] tools/net/ynl: Add 'sub-message' support to ynl
2023-12-04 15:54 ` Donald Hunter
@ 2023-12-04 18:33 ` Jakub Kicinski
0 siblings, 0 replies; 27+ messages in thread
From: Jakub Kicinski @ 2023-12-04 18:33 UTC (permalink / raw)
To: Donald Hunter
Cc: netdev, David S. Miller, Eric Dumazet, Paolo Abeni,
Jonathan Corbet, linux-doc, Jacob Keller, donald.hunter
On Mon, 04 Dec 2023 15:54:13 +0000 Donald Hunter wrote:
> > Should we add sub-messages to tools/net/ynl/ynl-gen-rst.py ?
> > Does the output look sane with the new attributes?
>
> Ah, yes we should. Okay if I look at this as a followup patch?
Improving looks is 100% fine as a follow up.
But do check we don't break rendering completely for stuff we should
already support when sub-messages appear.
^ permalink raw reply [flat|nested] 27+ messages in thread