mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
netlink: specs: finish up operation enum-models
I had a (bright?) idea of introducing the concept of enum-models to account for all the weird ways families enumerate their messages. I've never finished it because generating C code for each of them is pretty daunting. But for languages which can use ID values directly the support is simple enough, so clean this up a bit. "unified" model is what I recommend going forward. "directional" model is what ethtool uses. "notify-split" is used by the proposed DPLL code, but we can just make them use "unified", it hasn't been merged :) Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
5c6674f6eb
commit
8403bf0445
4 changed files with 92 additions and 9 deletions
|
@ -218,9 +218,7 @@ properties:
|
||||||
to a single enum.
|
to a single enum.
|
||||||
"directional" has the messages sent to the kernel and from the kernel
|
"directional" has the messages sent to the kernel and from the kernel
|
||||||
enumerated separately.
|
enumerated separately.
|
||||||
"notify-split" has the notifications and request-response types in
|
enum: [ unified ]
|
||||||
different enums.
|
|
||||||
enum: [ unified, directional, notify-split ]
|
|
||||||
name-prefix:
|
name-prefix:
|
||||||
description: |
|
description: |
|
||||||
Prefix for the C enum name of the command. The name is formed by concatenating
|
Prefix for the C enum name of the command. The name is formed by concatenating
|
||||||
|
|
|
@ -241,9 +241,7 @@ properties:
|
||||||
to a single enum.
|
to a single enum.
|
||||||
"directional" has the messages sent to the kernel and from the kernel
|
"directional" has the messages sent to the kernel and from the kernel
|
||||||
enumerated separately.
|
enumerated separately.
|
||||||
"notify-split" has the notifications and request-response types in
|
enum: [ unified, directional ] # Trim
|
||||||
different enums.
|
|
||||||
enum: [ unified, directional, notify-split ]
|
|
||||||
name-prefix:
|
name-prefix:
|
||||||
description: |
|
description: |
|
||||||
Prefix for the C enum name of the command. The name is formed by concatenating
|
Prefix for the C enum name of the command. The name is formed by concatenating
|
||||||
|
@ -307,6 +305,13 @@ properties:
|
||||||
type: array
|
type: array
|
||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
|
# Start genetlink-legacy
|
||||||
|
value:
|
||||||
|
description: |
|
||||||
|
ID of this message if value for request and response differ,
|
||||||
|
i.e. requests and responses have different message enums.
|
||||||
|
$ref: '#/$defs/uint'
|
||||||
|
# End genetlink-legacy
|
||||||
reply: *subop-attr-list
|
reply: *subop-attr-list
|
||||||
pre:
|
pre:
|
||||||
description: Hook for a function to run before the main callback (pre_doit or start).
|
description: Hook for a function to run before the main callback (pre_doit or start).
|
||||||
|
|
|
@ -188,9 +188,7 @@ properties:
|
||||||
to a single enum.
|
to a single enum.
|
||||||
"directional" has the messages sent to the kernel and from the kernel
|
"directional" has the messages sent to the kernel and from the kernel
|
||||||
enumerated separately.
|
enumerated separately.
|
||||||
"notify-split" has the notifications and request-response types in
|
enum: [ unified ]
|
||||||
different enums.
|
|
||||||
enum: [ unified, directional, notify-split ]
|
|
||||||
name-prefix:
|
name-prefix:
|
||||||
description: |
|
description: |
|
||||||
Prefix for the C enum name of the command. The name is formed by concatenating
|
Prefix for the C enum name of the command. The name is formed by concatenating
|
||||||
|
|
|
@ -74,6 +74,88 @@ type. Inside the attr-index nest are the policy attributes. Modern
|
||||||
Netlink families should have instead defined this as a flat structure,
|
Netlink families should have instead defined this as a flat structure,
|
||||||
the nesting serves no good purpose here.
|
the nesting serves no good purpose here.
|
||||||
|
|
||||||
|
Operations
|
||||||
|
==========
|
||||||
|
|
||||||
|
Enum (message ID) model
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
unified
|
||||||
|
~~~~~~~
|
||||||
|
|
||||||
|
Modern families use the ``unified`` message ID model, which uses
|
||||||
|
a single enumeration for all messages within family. Requests and
|
||||||
|
responses share the same message ID. Notifications have separate
|
||||||
|
IDs from the same space. For example given the following list
|
||||||
|
of operations:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
-
|
||||||
|
name: a
|
||||||
|
value: 1
|
||||||
|
do: ...
|
||||||
|
-
|
||||||
|
name: b
|
||||||
|
do: ...
|
||||||
|
-
|
||||||
|
name: c
|
||||||
|
value: 4
|
||||||
|
notify: a
|
||||||
|
-
|
||||||
|
name: d
|
||||||
|
do: ...
|
||||||
|
|
||||||
|
Requests and responses for operation ``a`` will have the ID of 1,
|
||||||
|
the requests and responses of ``b`` - 2 (since there is no explicit
|
||||||
|
``value`` it's previous operation ``+ 1``). Notification ``c`` will
|
||||||
|
use the ID of 4, operation ``d`` 5 etc.
|
||||||
|
|
||||||
|
directional
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
The ``directional`` model splits the ID assignment by the direction of
|
||||||
|
the message. Messages from and to the kernel can't be confused with
|
||||||
|
each other so this conserves the ID space (at the cost of making
|
||||||
|
the programming more cumbersome).
|
||||||
|
|
||||||
|
In this case ``value`` attribute should be specified in the ``request``
|
||||||
|
``reply`` sections of the operations (if an operation has both ``do``
|
||||||
|
and ``dump`` the IDs are shared, ``value`` should be set in ``do``).
|
||||||
|
For notifications the ``value`` is provided at the op level but it
|
||||||
|
only allocates a ``reply`` (i.e. a "from-kernel" ID). Let's look
|
||||||
|
at an example:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
-
|
||||||
|
name: a
|
||||||
|
do:
|
||||||
|
request:
|
||||||
|
value: 2
|
||||||
|
attributes: ...
|
||||||
|
reply:
|
||||||
|
value: 1
|
||||||
|
attributes: ...
|
||||||
|
-
|
||||||
|
name: b
|
||||||
|
notify: a
|
||||||
|
-
|
||||||
|
name: c
|
||||||
|
notify: a
|
||||||
|
value: 7
|
||||||
|
-
|
||||||
|
name: d
|
||||||
|
do: ...
|
||||||
|
|
||||||
|
In this case ``a`` will use 2 when sending the message to the kernel
|
||||||
|
and expects message with ID 1 in response. Notification ``b`` allocates
|
||||||
|
a "from-kernel" ID which is 2. ``c`` allocates "from-kernel" ID of 7.
|
||||||
|
If operation ``d`` does not set ``values`` explicitly in the spec
|
||||||
|
it will be allocated 3 for the request (``a`` is the previous operation
|
||||||
|
with a request section and the value of 2) and 8 for response (``c`` is
|
||||||
|
the previous operation in the "from-kernel" direction).
|
||||||
|
|
||||||
Other quirks (todo)
|
Other quirks (todo)
|
||||||
===================
|
===================
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue