forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
docs: add more netlink docs (incl. spec docs)
Add documentation about the upcoming Netlink protocol specs. Reviewed-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> Reviewed-by: Bagas Sanjaya <bagasdotme@gmail.com> Acked-by: Stanislav Fomichev <sdf@google.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
- Loading branch information
Showing
7 changed files
with
734 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
.. SPDX-License-Identifier: BSD-3-Clause | ||
.. _kernel_netlink: | ||
|
||
=================================== | ||
Netlink notes for kernel developers | ||
=================================== | ||
|
||
General guidance | ||
================ | ||
|
||
Attribute enums | ||
--------------- | ||
|
||
Older families often define "null" attributes and commands with value | ||
of ``0`` and named ``unspec``. This is supported (``type: unused``) | ||
but should be avoided in new families. The ``unspec`` enum values are | ||
not used in practice, so just set the value of the first attribute to ``1``. | ||
|
||
Message enums | ||
------------- | ||
|
||
Use the same command IDs for requests and replies. This makes it easier | ||
to match them up, and we have plenty of ID space. | ||
|
||
Use separate command IDs for notifications. This makes it easier to | ||
sort the notifications from replies (and present them to the user | ||
application via a different API than replies). | ||
|
||
Answer requests | ||
--------------- | ||
|
||
Older families do not reply to all of the commands, especially NEW / ADD | ||
commands. User only gets information whether the operation succeeded or | ||
not via the ACK. Try to find useful data to return. Once the command is | ||
added whether it replies with a full message or only an ACK is uAPI and | ||
cannot be changed. It's better to err on the side of replying. | ||
|
||
Specifically NEW and ADD commands should reply with information identifying | ||
the created object such as the allocated object's ID (without having to | ||
resort to using ``NLM_F_ECHO``). | ||
|
||
NLM_F_ECHO | ||
---------- | ||
|
||
Make sure to pass the request info to genl_notify() to allow ``NLM_F_ECHO`` | ||
to take effect. This is useful for programs that need precise feedback | ||
from the kernel (for example for logging purposes). | ||
|
||
Support dump consistency | ||
------------------------ | ||
|
||
If iterating over objects during dump may skip over objects or repeat | ||
them - make sure to report dump inconsistency with ``NLM_F_DUMP_INTR``. | ||
This is usually implemented by maintaining a generation id for the | ||
structure and recording it in the ``seq`` member of struct netlink_callback. | ||
|
||
Netlink specification | ||
===================== | ||
|
||
Documentation of the Netlink specification parts which are only relevant | ||
to the kernel space. | ||
|
||
Globals | ||
------- | ||
|
||
kernel-policy | ||
~~~~~~~~~~~~~ | ||
|
||
Defines if the kernel validation policy is per operation (``per-op``) | ||
or for the entire family (``global``). New families should use ``per-op`` | ||
(default) to be able to narrow down the attributes accepted by a specific | ||
command. | ||
|
||
checks | ||
------ | ||
|
||
Documentation for the ``checks`` sub-sections of attribute specs. | ||
|
||
unterminated-ok | ||
~~~~~~~~~~~~~~~ | ||
|
||
Accept strings without the null-termination (for legacy families only). | ||
Switches from the ``NLA_NUL_STRING`` to ``NLA_STRING`` policy type. | ||
|
||
max-len | ||
~~~~~~~ | ||
|
||
Defines max length for a binary or string attribute (corresponding | ||
to the ``len`` member of struct nla_policy). For string attributes terminating | ||
null character is not counted towards ``max-len``. | ||
|
||
The field may either be a literal integer value or a name of a defined | ||
constant. String types may reduce the constant by one | ||
(i.e. specify ``max-len: CONST - 1``) to reserve space for the terminating | ||
character so implementations should recognize such pattern. | ||
|
||
min-len | ||
~~~~~~~ | ||
|
||
Similar to ``max-len`` but defines minimum length. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
.. SPDX-License-Identifier: BSD-3-Clause | ||
============================== | ||
Netlink spec C code generation | ||
============================== | ||
|
||
This document describes how Netlink specifications are used to render | ||
C code (uAPI, policies etc.). It also defines the additional properties | ||
allowed in older families by the ``genetlink-c`` protocol level, | ||
to control the naming. | ||
|
||
For brevity this document refers to ``name`` properties of various | ||
objects by the object type. For example ``$attr`` is the value | ||
of ``name`` in an attribute, and ``$family`` is the name of the | ||
family (the global ``name`` property). | ||
|
||
The upper case is used to denote literal values, e.g. ``$family-CMD`` | ||
means the concatenation of ``$family``, a dash character, and the literal | ||
``CMD``. | ||
|
||
The names of ``#defines`` and enum values are always converted to upper case, | ||
and with dashes (``-``) replaced by underscores (``_``). | ||
|
||
If the constructed name is a C keyword, an extra underscore is | ||
appended (``do`` -> ``do_``). | ||
|
||
Globals | ||
======= | ||
|
||
``c-family-name`` controls the name of the ``#define`` for the family | ||
name, default is ``$family-FAMILY-NAME``. | ||
|
||
``c-version-name`` controls the name of the ``#define`` for the version | ||
of the family, default is ``$family-FAMILY-VERSION``. | ||
|
||
``max-by-define`` selects if max values for enums are defined as a | ||
``#define`` rather than inside the enum. | ||
|
||
Definitions | ||
=========== | ||
|
||
Constants | ||
--------- | ||
|
||
Every constant is rendered as a ``#define``. | ||
The name of the constant is ``$family-$constant`` and the value | ||
is rendered as a string or integer according to its type in the spec. | ||
|
||
Enums and flags | ||
--------------- | ||
|
||
Enums are named ``$family-$enum``. The full name can be set directly | ||
or suppressed by specifying the ``enum-name`` property. | ||
Default entry name is ``$family-$enum-$entry``. | ||
If ``name-prefix`` is specified it replaces the ``$family-$enum`` | ||
portion of the entry name. | ||
|
||
Boolean ``render-max`` controls creation of the max values | ||
(which are enabled by default for attribute enums). | ||
|
||
Attributes | ||
========== | ||
|
||
Each attribute set (excluding fractional sets) is rendered as an enum. | ||
|
||
Attribute enums are traditionally unnamed in netlink headers. | ||
If naming is desired ``enum-name`` can be used to specify the name. | ||
|
||
The default attribute name prefix is ``$family-A`` if the name of the set | ||
is the same as the name of the family and ``$family-A-$set`` if the names | ||
differ. The prefix can be overridden by the ``name-prefix`` property of a set. | ||
The rest of the section will refer to the prefix as ``$pfx``. | ||
|
||
Attributes are named ``$pfx-$attribute``. | ||
|
||
Attribute enums end with two special values ``__$pfx-MAX`` and ``$pfx-MAX`` | ||
which are used for sizing attribute tables. | ||
These two names can be specified directly with the ``attr-cnt-name`` | ||
and ``attr-max-name`` properties respectively. | ||
|
||
If ``max-by-define`` is set to ``true`` at the global level ``attr-max-name`` | ||
will be specified as a ``#define`` rather than an enum value. | ||
|
||
Operations | ||
========== | ||
|
||
Operations are named ``$family-CMD-$operation``. | ||
If ``name-prefix`` is specified it replaces the ``$family-CMD`` | ||
portion of the name. | ||
|
||
Similarly to attribute enums operation enums end with special count and max | ||
attributes. For operations those attributes can be renamed with | ||
``cmd-cnt-name`` and ``cmd-max-name``. Max will be a define if ``max-by-define`` | ||
is ``true``. | ||
|
||
Multicast groups | ||
================ | ||
|
||
Each multicast group gets a define rendered into the kernel uAPI header. | ||
The name of the define is ``$family-MCGRP-$group``, and can be overwritten | ||
with the ``c-define-name`` property. | ||
|
||
Code generation | ||
=============== | ||
|
||
uAPI header is assumed to come from ``<linux/$family.h>`` in the default header | ||
search path. It can be changed using the ``uapi-header`` global property. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
.. SPDX-License-Identifier: BSD-3-Clause | ||
================================================================= | ||
Netlink specification support for legacy Generic Netlink families | ||
================================================================= | ||
|
||
This document describes the many additional quirks and properties | ||
required to describe older Generic Netlink families which form | ||
the ``genetlink-legacy`` protocol level. | ||
|
||
The spec is a work in progress, some of the quirks are just documented | ||
for future reference. | ||
|
||
Specification (defined) | ||
======================= | ||
|
||
Attribute type nests | ||
-------------------- | ||
|
||
New Netlink families should use ``multi-attr`` to define arrays. | ||
Older families (e.g. ``genetlink`` control family) attempted to | ||
define array types reusing attribute type to carry information. | ||
|
||
For reference the ``multi-attr`` array may look like this:: | ||
|
||
[ARRAY-ATTR] | ||
[INDEX (optionally)] | ||
[MEMBER1] | ||
[MEMBER2] | ||
[SOME-OTHER-ATTR] | ||
[ARRAY-ATTR] | ||
[INDEX (optionally)] | ||
[MEMBER1] | ||
[MEMBER2] | ||
|
||
where ``ARRAY-ATTR`` is the array entry type. | ||
|
||
array-nest | ||
~~~~~~~~~~ | ||
|
||
``array-nest`` creates the following structure:: | ||
|
||
[SOME-OTHER-ATTR] | ||
[ARRAY-ATTR] | ||
[ENTRY] | ||
[MEMBER1] | ||
[MEMBER2] | ||
[ENTRY] | ||
[MEMBER1] | ||
[MEMBER2] | ||
|
||
It wraps the entire array in an extra attribute (hence limiting its size | ||
to 64kB). The ``ENTRY`` nests are special and have the index of the entry | ||
as their type instead of normal attribute type. | ||
|
||
type-value | ||
~~~~~~~~~~ | ||
|
||
``type-value`` is a construct which uses attribute types to carry | ||
information about a single object (often used when array is dumped | ||
entry-by-entry). | ||
|
||
``type-value`` can have multiple levels of nesting, for example | ||
genetlink's policy dumps create the following structures:: | ||
|
||
[POLICY-IDX] | ||
[ATTR-IDX] | ||
[POLICY-INFO-ATTR1] | ||
[POLICY-INFO-ATTR2] | ||
|
||
Where the first level of nest has the policy index as it's attribute | ||
type, it contains a single nest which has the attribute index as its | ||
type. Inside the attr-index nest are the policy attributes. Modern | ||
Netlink families should have instead defined this as a flat structure, | ||
the nesting serves no good purpose here. | ||
|
||
Other quirks (todo) | ||
=================== | ||
|
||
Structures | ||
---------- | ||
|
||
Legacy families can define C structures both to be used as the contents | ||
of an attribute and as a fixed message header. The plan is to define | ||
the structs in ``definitions`` and link the appropriate attrs. | ||
|
||
Multi-message DO | ||
---------------- | ||
|
||
New Netlink families should never respond to a DO operation with multiple | ||
replies, with ``NLM_F_MULTI`` set. Use a filtered dump instead. | ||
|
||
At the spec level we can define a ``dumps`` property for the ``do``, | ||
perhaps with values of ``combine`` and ``multi-object`` depending | ||
on how the parsing should be implemented (parse into a single reply | ||
vs list of objects i.e. pretty much a dump). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.