From: Jakub Kicinski <kuba@kernel.org>
To: Donald Hunter <donald.hunter@gmail.com>
Cc: netdev@vger.kernel.org, "David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Paolo Abeni <pabeni@redhat.com>, Jonathan Corbet <corbet@lwn.net>,
linux-doc@vger.kernel.org, donald.hunter@redhat.com
Subject: Re: [RFC PATCH net-next v1 0/6] tools/net/ynl: Add dynamic selector for options attrs
Date: Wed, 29 Nov 2023 08:09:43 -0800 [thread overview]
Message-ID: <20231129080943.01d81902@kernel.org> (raw)
In-Reply-To: <20231129101159.99197-1-donald.hunter@gmail.com>
On Wed, 29 Nov 2023 10:11:53 +0000 Donald Hunter wrote:
> This patchset adds a dynamic selector mechanism to YNL for kind-specific
> options attributes. I am sending this as an RFC solicit feedback on a
> couple of issues before I complete the patchset.
Exciting stuff!
> I started adding this feature for the rt_link spec which is monomorphic,
> i.e. the kind-specific 'data' attribute is always a nest. The selector
> looked like this:
>
> -
> name: data
> type: dynamic
> selector:
> attribute: kind
> list:
> -
> value: bridge
> nested-attributes: linkinfo-bridge-attrs
> -
> value: erspan
> nested-attributes: linkinfo-gre-attrs
It's kinda moot given your discovery below :(, but FWIW this is very
close to what I've been thinking.
After some pondering I thought it'd be better to structure it just
a bit differently:
-
name: data
type: poly-nest
selector: kind # which attr carries the key
that's it for the attr, and then in attr-set I'd add a "key":
-
name: linkinfo-bridge-attrs
poly-key: bridge
putting the key on the attr set is worse if we ever need to "key"
the same attr set with different selectors, but it makes the attr
definition a lot smaller. And in practice I didn't expect us
to ever need keying into one attr set with different selectors.
If we did - we could complicate it later, but start simple.
> Then I started working on tc and found that the 'options' attribute is
> poymorphic. It is typically either a C struct or a nest. So I extended the
> dynamic selector to include a 'type' field and type-specific sub-fields:
>
> -
> name: options
> type: dynamic
> selector:
> attribute: kind
> list:
> -
> value: bfifo
> type: binary
> struct: tc-fifo-qopt
> -
> value: cake
> type: nest
> nested-attributes: tc-cake-attrs
> -
> value: cbs
> type: nest
> nested-attributes: tc-cbs-attrs
>
> Then I encountered 'netem' which has a nest with a C struct header. I
> realised that maybe my mental model had been wrong and that all cases
> could be supported by a nest type with an optional fixed-header followed
> by zero or more nlattrs.
>
> -
> value: netem
> type: nest
> fixed-header: tc-netem-qopt
> nested-attributes: tc-netem-attrs
>
> Perhaps it is attribute-sets in general that should have an optional
> fixed-header, which would also work for fixed-headers at the start of
> genetlink messages. I originally added fixed-header support to
> operations for genetlink, but fixed headers on attribute sets would work
> for all these cases.
>
> I now see a few possible ways forward and would like feedback on the
> preferred approach:
>
> 1. Simplify the current patchset to implement fixed-header & nest
> support in the dynamic selector. This would leave existing
> fixed-header support for messages unchanged. We could drop the 'type'
> field.
>
> -
> value: netem
> fixed-header: tc-netem-qopt
> nested-attributes: tc-netem-attrs
>
> 2. Keep the 'type' field and support for the 'binary' type which is
> useful for specifying nests with unknown attribute spaces. An
> alternative would be to default to 'binary' behaviour if there is no
> selector entry.
>
> 3. Refactor the existing fixed-header support to be an optional part of
> all attribute sets instead of just messages (in legacy and raw specs)
> and dynamic attribute nests (in raw specs).
>
> attribute-sets:
> -
> name: tc-netem-attrs
> fixed-header: tc-netem-qopt
> attributes:
Reading this makes me feel like netem wants to be a "sub-message"?
It has a fixed header followed by attrs, that's quite message-like.
Something along the lines of 1 makes most sense to me, but can we
put the "selector ladder" out-of-line? I'm worried that the attr
definition will get crazy long.
attribute-sets:
-
name: outside-attrs
attributes:
...
-
name: kind
type: string
-
name: options
type: sub-message
sub-type: inside-msg # reuse sub-type or new property?
selector: kind
...
-
name: inside-attrs:
attributes:
...
sub-messages:
list:
-
name: inside-msg
formats: # not a great name?..
-
value: some-value
fixed-header: struct-name
-
value: other-value
fixed-header: struct-name-two
nested-attributes: inside-attrs
-
value: another-one
nested-attributes: inside-attrs
-
name: different-inside-msg
...
operations:
...
At least that's what comes to my mind after reading the problem
description. Does it make sense?
next prev parent reply other threads:[~2023-11-29 16:09 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-29 10:11 [RFC PATCH net-next v1 0/6] tools/net/ynl: Add dynamic selector for options attrs Donald Hunter
2023-11-29 10:11 ` [RFC PATCH net-next v1 1/6] doc/netlink: Add bitfield32, s8, s16 to the netlink-raw schema Donald Hunter
2023-11-29 10:11 ` [RFC PATCH net-next v1 2/6] doc/netlink: Add a nest selector to " Donald Hunter
2023-11-29 10:11 ` [RFC PATCH net-next v1 3/6] tools/net/ynl: Add dynamic attribute decoding to ynl Donald Hunter
2023-11-29 10:11 ` [RFC PATCH net-next v1 4/6] doc/netlink/specs: add dynamic nest selector for rt_link data Donald Hunter
2023-11-29 10:11 ` [RFC PATCH net-next v1 5/6] doc/netlink/specs: Add a spec for tc Donald Hunter
2023-11-29 10:11 ` [RFC PATCH net-next v1 6/6] tools/net/ynl: Add optional fixed-header to dynamic nests Donald Hunter
2023-11-29 16:09 ` Jakub Kicinski [this message]
2023-11-29 16:58 ` [RFC PATCH net-next v1 0/6] tools/net/ynl: Add dynamic selector for options attrs Donald Hunter
2023-11-29 17:49 ` Jakub Kicinski
2023-11-30 8:48 ` Donald Hunter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231129080943.01d81902@kernel.org \
--to=kuba@kernel.org \
--cc=corbet@lwn.net \
--cc=davem@davemloft.net \
--cc=donald.hunter@gmail.com \
--cc=donald.hunter@redhat.com \
--cc=edumazet@google.com \
--cc=linux-doc@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).