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