1 .. SPDX-License-Identifier: BSD-3-Clause
3 =================================================================
4 Netlink specification support for legacy Generic Netlink families
5 =================================================================
7 This document describes the many additional quirks and properties
8 required to describe older Generic Netlink families which form
9 the ``genetlink-legacy`` protocol level.
17 Attributes listed directly at the root level of the spec file.
22 Generic Netlink family version, default is 1.
24 ``version`` has historically been used to introduce family changes
25 which may break backwards compatibility. Since compatibility breaking changes
26 are generally not allowed ``version`` is very rarely used.
31 New Netlink families should use ``multi-attr`` to define arrays.
32 Older families (e.g. ``genetlink`` control family) attempted to
33 define array types reusing attribute type to carry information.
35 For reference the ``multi-attr`` array may look like this::
47 where ``ARRAY-ATTR`` is the array entry type.
52 ``array-nest`` creates the following structure::
63 It wraps the entire array in an extra attribute (hence limiting its size
64 to 64kB). The ``ENTRY`` nests are special and have the index of the entry
65 as their type instead of normal attribute type.
70 ``type-value`` is a construct which uses attribute types to carry
71 information about a single object (often used when array is dumped
74 ``type-value`` can have multiple levels of nesting, for example
75 genetlink's policy dumps create the following structures::
82 Where the first level of nest has the policy index as it's attribute
83 type, it contains a single nest which has the attribute index as its
84 type. Inside the attr-index nest are the policy attributes. Modern
85 Netlink families should have instead defined this as a flat structure,
86 the nesting serves no good purpose here.
91 Enum (message ID) model
92 -----------------------
97 Modern families use the ``unified`` message ID model, which uses
98 a single enumeration for all messages within family. Requests and
99 responses share the same message ID. Notifications have separate
100 IDs from the same space. For example given the following list
120 Requests and responses for operation ``a`` will have the ID of 1,
121 the requests and responses of ``b`` - 2 (since there is no explicit
122 ``value`` it's previous operation ``+ 1``). Notification ``c`` will
123 use the ID of 4, operation ``d`` 5 etc.
128 The ``directional`` model splits the ID assignment by the direction of
129 the message. Messages from and to the kernel can't be confused with
130 each other so this conserves the ID space (at the cost of making
131 the programming more cumbersome).
133 In this case ``value`` attribute should be specified in the ``request``
134 ``reply`` sections of the operations (if an operation has both ``do``
135 and ``dump`` the IDs are shared, ``value`` should be set in ``do``).
136 For notifications the ``value`` is provided at the op level but it
137 only allocates a ``reply`` (i.e. a "from-kernel" ID). Let's look
162 In this case ``a`` will use 2 when sending the message to the kernel
163 and expects message with ID 1 in response. Notification ``b`` allocates
164 a "from-kernel" ID which is 2. ``c`` allocates "from-kernel" ID of 7.
165 If operation ``d`` does not set ``values`` explicitly in the spec
166 it will be allocated 3 for the request (``a`` is the previous operation
167 with a request section and the value of 2) and 8 for response (``c`` is
168 the previous operation in the "from-kernel" direction).
176 Legacy families can define C structures both to be used as the contents of
177 an attribute and as a fixed message header. Structures are defined in
178 ``definitions`` and referenced in operations or attributes.
183 - ``name`` - The attribute name of the struct member
184 - ``type`` - One of the scalar types ``u8``, ``u16``, ``u32``, ``u64``, ``s8``,
185 ``s16``, ``s32``, ``s64``, ``string``, ``binary`` or ``bitfield32``.
186 - ``byte-order`` - ``big-endian`` or ``little-endian``
187 - ``doc``, ``enum``, ``enum-as-flags``, ``display-hint`` - Same as for
188 :ref:`attribute definitions <attribute_properties>`
190 Note that structures defined in YAML are implicitly packed according to C
191 conventions. For example, the following struct is 4 bytes, not 6 bytes:
201 Any padding must be explicitly added and C-like languages should infer the
202 need for explicit padding from whether the members are naturally aligned.
204 Here is the struct definition from above, declared in YAML:
226 Fixed message headers can be added to operations using ``fixed-header``.
227 The default ``fixed-header`` can be set in ``operations`` and it can be set
228 or overridden for each operation.
233 fixed-header: message-header
237 fixed-header: custom-header
238 attribute-set: message-attrs
243 A ``binary`` attribute can be interpreted as a C structure using a
244 ``struct`` property with the name of the structure definition. The
245 ``struct`` property implies ``sub-type: struct`` so it is not necessary to
262 Legacy families also use ``binary`` attributes to encapsulate C arrays. The
263 ``sub-type`` is used to identify the type of scalar to extract.
276 New Netlink families should never respond to a DO operation with multiple
277 replies, with ``NLM_F_MULTI`` set. Use a filtered dump instead.
279 At the spec level we can define a ``dumps`` property for the ``do``,
280 perhaps with values of ``combine`` and ``multi-object`` depending
281 on how the parsing should be implemented (parse into a single reply
282 vs list of objects i.e. pretty much a dump).