| .. 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. |