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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.