| .. SPDX-License-Identifier: BSD-3-Clause | |
| ========================================= | |
| Netlink protocol specifications (in YAML) | |
| ========================================= | |
| Netlink protocol specifications are complete, machine readable descriptions of | |
| Netlink protocols written in YAML. The goal of the specifications is to allow | |
| separating Netlink parsing from user space logic and minimize the amount of | |
| hand written Netlink code for each new family, command, attribute. | |
| Netlink specs should be complete and not depend on any other spec | |
| or C header file, making it easy to use in languages which can't include | |
| kernel headers directly. | |
| Internally kernel uses the YAML specs to generate: | |
| - the C uAPI header | |
| - documentation of the protocol as a ReST file - see :ref:`Documentation/netlink/specs/index.rst <specs>` | |
| - policy tables for input attribute validation | |
| - operation tables | |
| YAML specifications can be found under ``Documentation/netlink/specs/`` | |
| This document describes details of the schema. | |
| See :doc:`intro-specs` for a practical starting guide. | |
| All specs must be licensed under | |
| ``((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)`` | |
| to allow for easy adoption in user space code. | |
| Compatibility levels | |
| ==================== | |
| There are four schema levels for Netlink specs, from the simplest used | |
| by new families to the most complex covering all the quirks of the old ones. | |
| Each next level inherits the attributes of the previous level, meaning that | |
| user capable of parsing more complex ``genetlink`` schemas is also compatible | |
| with simpler ones. The levels are: | |
| - ``genetlink`` - most streamlined, should be used by all new families | |
| - ``genetlink-c`` - superset of ``genetlink`` with extra attributes allowing | |
| customization of define and enum type and value names; this schema should | |
| be equivalent to ``genetlink`` for all implementations which don't interact | |
| directly with C uAPI headers | |
| - ``genetlink-legacy`` - Generic Netlink catch all schema supporting quirks of | |
| all old genetlink families, strange attribute formats, binary structures etc. | |
| - ``netlink-raw`` - catch all schema supporting pre-Generic Netlink protocols | |
| such as ``NETLINK_ROUTE`` | |
| The definition of the schemas (in ``jsonschema``) can be found | |
| under ``Documentation/netlink/``. | |
| Schema structure | |
| ================ | |
| YAML schema has the following conceptual sections: | |
| - globals | |
| - definitions | |
| - attributes | |
| - operations | |
| - multicast groups | |
| Most properties in the schema accept (or in fact require) a ``doc`` | |
| sub-property documenting the defined object. | |
| The following sections describe the properties of the most modern ``genetlink`` | |
| schema. See the documentation of :doc:`genetlink-c <c-code-gen>` | |
| for information on how C names are derived from name properties. | |
| See also :ref:`Documentation/core-api/netlink.rst <kernel_netlink>` for | |
| information on the Netlink specification properties that are only relevant to | |
| the kernel space and not part of the user space API. | |
| genetlink | |
| ========= | |
| Globals | |
| ------- | |
| Attributes listed directly at the root level of the spec file. | |
| name | |
| ~~~~ | |
| Name of the family. Name identifies the family in a unique way, since | |
| the Family IDs are allocated dynamically. | |
| protocol | |
| ~~~~~~~~ | |
| The schema level, default is ``genetlink``, which is the only value | |
| allowed for new ``genetlink`` families. | |
| definitions | |
| ----------- | |
| Array of type and constant definitions. | |
| name | |
| ~~~~ | |
| Name of the type / constant. | |
| type | |
| ~~~~ | |
| One of the following types: | |
| - const - a single, standalone constant | |
| - enum - defines an integer enumeration, with values for each entry | |
| incrementing by 1, (e.g. 0, 1, 2, 3) | |
| - flags - defines an integer enumeration, with values for each entry | |
| occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8) | |
| value | |
| ~~~~~ | |
| The value for the ``const``. | |
| value-start | |
| ~~~~~~~~~~~ | |
| The first value for ``enum`` and ``flags``, allows overriding the default | |
| start value of ``0`` (for ``enum``) and starting bit (for ``flags``). | |
| For ``flags`` ``value-start`` selects the starting bit, not the shifted value. | |
| Sparse enumerations are not supported. | |
| entries | |
| ~~~~~~~ | |
| Array of names of the entries for ``enum`` and ``flags``. | |
| header | |
| ~~~~~~ | |
| For C-compatible languages, header which already defines this value. | |
| In case the definition is shared by multiple families (e.g. ``IFNAMSIZ``) | |
| code generators for C-compatible languages may prefer to add an appropriate | |
| include instead of rendering a new definition. | |
| attribute-sets | |
| -------------- | |
| This property contains information about netlink attributes of the family. | |
| All families have at least one attribute set, most have multiple. | |
| ``attribute-sets`` is an array, with each entry describing a single set. | |
| Note that the spec is "flattened" and is not meant to visually resemble | |
| the format of the netlink messages (unlike certain ad-hoc documentation | |
| formats seen in kernel comments). In the spec subordinate attribute sets | |
| are not defined inline as a nest, but defined in a separate attribute set | |
| referred to with a ``nested-attributes`` property of the container. | |
| Spec may also contain fractional sets - sets which contain a ``subset-of`` | |
| property. Such sets describe a section of a full set, allowing narrowing down | |
| which attributes are allowed in a nest or refining the validation criteria. | |
| Fractional sets can only be used in nests. They are not rendered to the uAPI | |
| in any fashion. | |
| name | |
| ~~~~ | |
| Uniquely identifies the attribute set, operations and nested attributes | |
| refer to the sets by the ``name``. | |
| subset-of | |
| ~~~~~~~~~ | |
| Re-defines a portion of another set (a fractional set). | |
| Allows narrowing down fields and changing validation criteria | |
| or even types of attributes depending on the nest in which they | |
| are contained. The ``value`` of each attribute in the fractional | |
| set is implicitly the same as in the main set. | |
| attributes | |
| ~~~~~~~~~~ | |
| List of attributes in the set. | |
| .. _attribute_properties: | |
| Attribute properties | |
| -------------------- | |
| name | |
| ~~~~ | |
| Identifies the attribute, unique within the set. | |
| type | |
| ~~~~ | |
| Netlink attribute type, see :ref:`attr_types`. | |
| .. _assign_val: | |
| value | |
| ~~~~~ | |
| Numerical attribute ID, used in serialized Netlink messages. | |
| The ``value`` property can be skipped, in which case the attribute ID | |
| will be the value of the previous attribute plus one (recursively) | |
| and ``1`` for the first attribute in the attribute set. | |
| Attributes (and operations) use ``1`` as the default value for the first | |
| entry (unlike enums in definitions which start from ``0``) because | |
| entry ``0`` is almost always reserved as undefined. Spec can explicitly | |
| set value to ``0`` if needed. | |
| Note that the ``value`` of an attribute is defined only in its main set | |
| (not in subsets). | |
| enum | |
| ~~~~ | |
| For integer types specifies that values in the attribute belong | |
| to an ``enum`` or ``flags`` from the ``definitions`` section. | |
| enum-as-flags | |
| ~~~~~~~~~~~~~ | |
| Treat ``enum`` as ``flags`` regardless of its type in ``definitions``. | |
| When both ``enum`` and ``flags`` forms are needed ``definitions`` should | |
| contain an ``enum`` and attributes which need the ``flags`` form should | |
| use this attribute. | |
| nested-attributes | |
| ~~~~~~~~~~~~~~~~~ | |
| Identifies the attribute space for attributes nested within given attribute. | |
| Only valid for complex attributes which may have sub-attributes. | |
| multi-attr (arrays) | |
| ~~~~~~~~~~~~~~~~~~~ | |
| Boolean property signifying that the attribute may be present multiple times. | |
| Allowing an attribute to repeat is the recommended way of implementing arrays | |
| (no extra nesting). | |
| byte-order | |
| ~~~~~~~~~~ | |
| For integer types specifies attribute byte order - ``little-endian`` | |
| or ``big-endian``. | |
| checks | |
| ~~~~~~ | |
| Input validation constraints used by the kernel. User space should query | |
| the policy of the running kernel using Generic Netlink introspection, | |
| rather than depend on what is specified in the spec file. | |
| The validation policy in the kernel is formed by combining the type | |
| definition (``type`` and ``nested-attributes``) and the ``checks``. | |
| sub-type | |
| ~~~~~~~~ | |
| Legacy families have special ways of expressing arrays. ``sub-type`` can be | |
| used to define the type of array members in case array members are not | |
| fully defined as attributes (in a bona fide attribute space). For instance | |
| a C array of u32 values can be specified with ``type: binary`` and | |
| ``sub-type: u32``. Binary types and legacy array formats are described in | |
| more detail in :doc:`genetlink-legacy`. | |
| display-hint | |
| ~~~~~~~~~~~~ | |
| Optional format indicator that is intended only for choosing the right | |
| formatting mechanism when displaying values of this type. Currently supported | |
| hints are ``hex``, ``mac``, ``fddi``, ``ipv4``, ``ipv6`` and ``uuid``. | |
| operations | |
| ---------- | |
| This section describes messages passed between the kernel and the user space. | |
| There are three types of entries in this section - operations, notifications | |
| and events. | |
| Operations describe the most common request - response communication. User | |
| sends a request and kernel replies. Each operation may contain any combination | |
| of the two modes familiar to netlink users - ``do`` and ``dump``. | |
| ``do`` and ``dump`` in turn contain a combination of ``request`` and | |
| ``response`` properties. If no explicit message with attributes is passed | |
| in a given direction (e.g. a ``dump`` which does not accept filter, or a ``do`` | |
| of a SET operation to which the kernel responds with just the netlink error | |
| code) ``request`` or ``response`` section can be skipped. | |
| ``request`` and ``response`` sections list the attributes allowed in a message. | |
| The list contains only the names of attributes from a set referred | |
| to by the ``attribute-set`` property. | |
| Notifications and events both refer to the asynchronous messages sent by | |
| the kernel to members of a multicast group. The difference between the | |
| two is that a notification shares its contents with a GET operation | |
| (the name of the GET operation is specified in the ``notify`` property). | |
| This arrangement is commonly used for notifications about | |
| objects where the notification carries the full object definition. | |
| Events are more focused and carry only a subset of information rather than full | |
| object state (a made up example would be a link state change event with just | |
| the interface name and the new link state). Events contain the ``event`` | |
| property. Events are considered less idiomatic for netlink and notifications | |
| should be preferred. | |
| list | |
| ~~~~ | |
| The only property of ``operations`` for ``genetlink``, holds the list of | |
| operations, notifications etc. | |
| Operation properties | |
| -------------------- | |
| name | |
| ~~~~ | |
| Identifies the operation. | |
| value | |
| ~~~~~ | |
| Numerical message ID, used in serialized Netlink messages. | |
| The same enumeration rules are applied as to | |
| :ref:`attribute values<assign_val>`. | |
| attribute-set | |
| ~~~~~~~~~~~~~ | |
| Specifies the attribute set contained within the message. | |
| do | |
| ~~~ | |
| Specification for the ``doit`` request. Should contain ``request``, ``reply`` | |
| or both of these properties, each holding a :ref:`attr_list`. | |
| dump | |
| ~~~~ | |
| Specification for the ``dumpit`` request. Should contain ``request``, ``reply`` | |
| or both of these properties, each holding a :ref:`attr_list`. | |
| notify | |
| ~~~~~~ | |
| Designates the message as a notification. Contains the name of the operation | |
| (possibly the same as the operation holding this property) which shares | |
| the contents with the notification (``do``). | |
| event | |
| ~~~~~ | |
| Specification of attributes in the event, holds a :ref:`attr_list`. | |
| ``event`` property is mutually exclusive with ``notify``. | |
| mcgrp | |
| ~~~~~ | |
| Used with ``event`` and ``notify``, specifies which multicast group | |
| message belongs to. | |
| .. _attr_list: | |
| Message attribute list | |
| ---------------------- | |
| ``request``, ``reply`` and ``event`` properties have a single ``attributes`` | |
| property which holds the list of attribute names. | |
| Messages can also define ``pre`` and ``post`` properties which will be rendered | |
| as ``pre_doit`` and ``post_doit`` calls in the kernel (these properties should | |
| be ignored by user space). | |
| mcast-groups | |
| ------------ | |
| This section lists the multicast groups of the family. | |
| list | |
| ~~~~ | |
| The only property of ``mcast-groups`` for ``genetlink``, holds the list | |
| of groups. | |
| Multicast group properties | |
| -------------------------- | |
| name | |
| ~~~~ | |
| Uniquely identifies the multicast group in the family. Similarly to | |
| Family ID, Multicast Group ID needs to be resolved at runtime, based | |
| on the name. | |
| .. _attr_types: | |
| Attribute types | |
| =============== | |
| This section describes the attribute types supported by the ``genetlink`` | |
| compatibility level. Refer to documentation of different levels for additional | |
| attribute types. | |
| Common integer types | |
| -------------------- | |
| ``sint`` and ``uint`` represent signed and unsigned 64 bit integers. | |
| If the value can fit on 32 bits only 32 bits are carried in netlink | |
| messages, otherwise full 64 bits are carried. Note that the payload | |
| is only aligned to 4B, so the full 64 bit value may be unaligned! | |
| Common integer types should be preferred over fix-width types in majority | |
| of cases. | |
| Fix-width integer types | |
| ----------------------- | |
| Fixed-width integer types include: | |
| ``u8``, ``u16``, ``u32``, ``u64``, ``s8``, ``s16``, ``s32``, ``s64``. | |
| Note that types smaller than 32 bit should be avoided as using them | |
| does not save any memory in Netlink messages (due to alignment). | |
| See :ref:`pad_type` for padding of 64 bit attributes. | |
| The payload of the attribute is the integer in host order unless ``byte-order`` | |
| specifies otherwise. | |
| 64 bit values are usually aligned by the kernel but it is recommended | |
| that the user space is able to deal with unaligned values. | |
| .. _pad_type: | |
| pad | |
| --- | |
| Special attribute type used for padding attributes which require alignment | |
| bigger than standard 4B alignment required by netlink (e.g. 64 bit integers). | |
| There can only be a single attribute of the ``pad`` type in any attribute set | |
| and it should be automatically used for padding when needed. | |
| flag | |
| ---- | |
| Attribute with no payload, its presence is the entire information. | |
| binary | |
| ------ | |
| Raw binary data attribute, the contents are opaque to generic code. | |
| string | |
| ------ | |
| Character string. Unless ``checks`` has ``unterminated-ok`` set to ``true`` | |
| the string is required to be null terminated. | |
| ``max-len`` in ``checks`` indicates the longest possible string, | |
| if not present the length of the string is unbounded. | |
| Note that ``max-len`` does not count the terminating character. | |
| nest | |
| ---- | |
| Attribute containing other (nested) attributes. | |
| ``nested-attributes`` specifies which attribute set is used inside. |