| .. 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 whether the kernel validation policy is ``global`` i.e. the same for all | 
 | operations of the family, defined for each operation individually - ``per-op``, | 
 | or separately for each operation and operation type (do vs dump) - ``split``. | 
 | 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. |