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