| .. 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/networking/netlink_spec/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. |