|  | .. SPDX-License-Identifier: BSD-3-Clause | 
|  |  | 
|  | ====================================================== | 
|  | Netlink specification support for raw Netlink families | 
|  | ====================================================== | 
|  |  | 
|  | This document describes the additional properties required by raw Netlink | 
|  | families such as ``NETLINK_ROUTE`` which use the ``netlink-raw`` protocol | 
|  | specification. | 
|  |  | 
|  | Specification | 
|  | ============= | 
|  |  | 
|  | The netlink-raw schema extends the :doc:`genetlink-legacy <genetlink-legacy>` | 
|  | schema with properties that are needed to specify the protocol numbers and | 
|  | multicast IDs used by raw netlink families. See :ref:`classic_netlink` for more | 
|  | information. The raw netlink families also make use of type-specific | 
|  | sub-messages. | 
|  |  | 
|  | Globals | 
|  | ------- | 
|  |  | 
|  | protonum | 
|  | ~~~~~~~~ | 
|  |  | 
|  | The ``protonum`` property is used to specify the protocol number to use when | 
|  | opening a netlink socket. | 
|  |  | 
|  | .. code-block:: yaml | 
|  |  | 
|  | # SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) | 
|  |  | 
|  | name: rt-addr | 
|  | protocol: netlink-raw | 
|  | protonum: 0             # part of the NETLINK_ROUTE protocol | 
|  |  | 
|  |  | 
|  | Multicast group properties | 
|  | -------------------------- | 
|  |  | 
|  | value | 
|  | ~~~~~ | 
|  |  | 
|  | The ``value`` property is used to specify the group ID to use for multicast | 
|  | group registration. | 
|  |  | 
|  | .. code-block:: yaml | 
|  |  | 
|  | mcast-groups: | 
|  | list: | 
|  | - | 
|  | name: rtnlgrp-ipv4-ifaddr | 
|  | value: 5 | 
|  | - | 
|  | name: rtnlgrp-ipv6-ifaddr | 
|  | value: 9 | 
|  | - | 
|  | name: rtnlgrp-mctp-ifaddr | 
|  | value: 34 | 
|  |  | 
|  | Sub-messages | 
|  | ------------ | 
|  |  | 
|  | Several raw netlink families such as | 
|  | :ref:`rt-link<netlink-rt-link>` and | 
|  | :ref:`tc<netlink-tc>` use attribute nesting as an | 
|  | abstraction to carry module specific information. | 
|  |  | 
|  | Conceptually it looks as follows:: | 
|  |  | 
|  | [OUTER NEST OR MESSAGE LEVEL] | 
|  | [GENERIC ATTR 1] | 
|  | [GENERIC ATTR 2] | 
|  | [GENERIC ATTR 3] | 
|  | [GENERIC ATTR - wrapper] | 
|  | [MODULE SPECIFIC ATTR 1] | 
|  | [MODULE SPECIFIC ATTR 2] | 
|  |  | 
|  | The ``GENERIC ATTRs`` at the outer level are defined in the core (or rt_link or | 
|  | core TC), while specific drivers, TC classifiers, qdiscs etc. can carry their | 
|  | own information wrapped in the ``GENERIC ATTR - wrapper``. Even though the | 
|  | example above shows attributes nesting inside the wrapper, the modules generally | 
|  | have full freedom to define the format of the nest. In practice the payload of | 
|  | the wrapper attr has very similar characteristics to a netlink message. It may | 
|  | contain a fixed header / structure, netlink attributes, or both. Because of | 
|  | those shared characteristics we refer to the payload of the wrapper attribute as | 
|  | a sub-message. | 
|  |  | 
|  | A sub-message attribute uses the value of another attribute as a selector key to | 
|  | choose the right sub-message format. For example if the following attribute has | 
|  | already been decoded: | 
|  |  | 
|  | .. code-block:: json | 
|  |  | 
|  | { "kind": "gre" } | 
|  |  | 
|  | and we encounter the following attribute spec: | 
|  |  | 
|  | .. code-block:: yaml | 
|  |  | 
|  | - | 
|  | name: data | 
|  | type: sub-message | 
|  | sub-message: linkinfo-data-msg | 
|  | selector: kind | 
|  |  | 
|  | Then we look for a sub-message definition called ``linkinfo-data-msg`` and use | 
|  | the value of the ``kind`` attribute i.e. ``gre`` as the key to choose the | 
|  | correct format for the sub-message: | 
|  |  | 
|  | .. code-block:: yaml | 
|  |  | 
|  | sub-messages: | 
|  | name: linkinfo-data-msg | 
|  | formats: | 
|  | - | 
|  | value: bridge | 
|  | attribute-set: linkinfo-bridge-attrs | 
|  | - | 
|  | value: gre | 
|  | attribute-set: linkinfo-gre-attrs | 
|  | - | 
|  | value: geneve | 
|  | attribute-set: linkinfo-geneve-attrs | 
|  |  | 
|  | This would decode the attribute value as a sub-message with the attribute-set | 
|  | called ``linkinfo-gre-attrs`` as the attribute space. | 
|  |  | 
|  | A sub-message can have an optional ``fixed-header`` followed by zero or more | 
|  | attributes from an ``attribute-set``. For example the following | 
|  | ``tc-options-msg`` sub-message defines message formats that use a mixture of | 
|  | ``fixed-header``, ``attribute-set`` or both together: | 
|  |  | 
|  | .. code-block:: yaml | 
|  |  | 
|  | sub-messages: | 
|  | - | 
|  | name: tc-options-msg | 
|  | formats: | 
|  | - | 
|  | value: bfifo | 
|  | fixed-header: tc-fifo-qopt | 
|  | - | 
|  | value: cake | 
|  | attribute-set: tc-cake-attrs | 
|  | - | 
|  | value: netem | 
|  | fixed-header: tc-netem-qopt | 
|  | attribute-set: tc-netem-attrs | 
|  |  | 
|  | Note that a selector attribute must appear in a netlink message before any | 
|  | sub-message attributes that depend on it. | 
|  |  | 
|  | If an attribute such as ``kind`` is defined at more than one nest level, then a | 
|  | sub-message selector will be resolved using the value 'closest' to the selector. | 
|  | For example, if the same attribute name is defined in a nested ``attribute-set`` | 
|  | alongside a sub-message selector and also in a top level ``attribute-set``, then | 
|  | the selector will be resolved using the value 'closest' to the selector. If the | 
|  | value is not present in the message at the same level as defined in the spec | 
|  | then this is an error. | 
|  |  | 
|  | Nested struct definitions | 
|  | ------------------------- | 
|  |  | 
|  | Many raw netlink families such as :ref:`tc<netlink-tc>` | 
|  | make use of nested struct definitions. The ``netlink-raw`` schema makes it | 
|  | possible to embed a struct within a struct definition using the ``struct`` | 
|  | property. For example, the following struct definition embeds the | 
|  | ``tc-ratespec`` struct definition for both the ``rate`` and the ``peakrate`` | 
|  | members of ``struct tc-tbf-qopt``. | 
|  |  | 
|  | .. code-block:: yaml | 
|  |  | 
|  | - | 
|  | name: tc-tbf-qopt | 
|  | type: struct | 
|  | members: | 
|  | - | 
|  | name: rate | 
|  | type: binary | 
|  | struct: tc-ratespec | 
|  | - | 
|  | name: peakrate | 
|  | type: binary | 
|  | struct: tc-ratespec | 
|  | - | 
|  | name: limit | 
|  | type: u32 | 
|  | - | 
|  | name: buffer | 
|  | type: u32 | 
|  | - | 
|  | name: mtu | 
|  | type: u32 |