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