Skip to content

Commit 17ed5c1

Browse files
donaldhkuba-moo
authored andcommitted
doc/netlink: Document the sub-message format for netlink-raw
Document the spec format used by netlink-raw families like rt and tc. Reviewed-by: Jakub Kicinski <[email protected]> Signed-off-by: Donald Hunter <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent de2d987 commit 17ed5c1

File tree

1 file changed

+95
-1
lines changed

1 file changed

+95
-1
lines changed

Documentation/userspace-api/netlink/netlink-raw.rst

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ Specification
1414
The netlink-raw schema extends the :doc:`genetlink-legacy <genetlink-legacy>`
1515
schema with properties that are needed to specify the protocol numbers and
1616
multicast IDs used by raw netlink families. See :ref:`classic_netlink` for more
17-
information.
17+
information. The raw netlink families also make use of type-specific
18+
sub-messages.
1819

1920
Globals
2021
-------
@@ -56,3 +57,96 @@ group registration.
5657
-
5758
name: rtnlgrp-mctp-ifaddr
5859
value: 34
60+
61+
Sub-messages
62+
------------
63+
64+
Several raw netlink families such as
65+
:doc:`rt_link<../../networking/netlink_spec/rt_link>` and
66+
:doc:`tc<../../networking/netlink_spec/tc>` use attribute nesting as an
67+
abstraction to carry module specific information.
68+
69+
Conceptually it looks as follows::
70+
71+
[OUTER NEST OR MESSAGE LEVEL]
72+
[GENERIC ATTR 1]
73+
[GENERIC ATTR 2]
74+
[GENERIC ATTR 3]
75+
[GENERIC ATTR - wrapper]
76+
[MODULE SPECIFIC ATTR 1]
77+
[MODULE SPECIFIC ATTR 2]
78+
79+
The ``GENERIC ATTRs`` at the outer level are defined in the core (or rt_link or
80+
core TC), while specific drivers, TC classifiers, qdiscs etc. can carry their
81+
own information wrapped in the ``GENERIC ATTR - wrapper``. Even though the
82+
example above shows attributes nesting inside the wrapper, the modules generally
83+
have full freedom to define the format of the nest. In practice the payload of
84+
the wrapper attr has very similar characteristics to a netlink message. It may
85+
contain a fixed header / structure, netlink attributes, or both. Because of
86+
those shared characteristics we refer to the payload of the wrapper attribute as
87+
a sub-message.
88+
89+
A sub-message attribute uses the value of another attribute as a selector key to
90+
choose the right sub-message format. For example if the following attribute has
91+
already been decoded:
92+
93+
.. code-block:: json
94+
95+
{ "kind": "gre" }
96+
97+
and we encounter the following attribute spec:
98+
99+
.. code-block:: yaml
100+
101+
-
102+
name: data
103+
type: sub-message
104+
sub-message: linkinfo-data-msg
105+
selector: kind
106+
107+
Then we look for a sub-message definition called ``linkinfo-data-msg`` and use
108+
the value of the ``kind`` attribute i.e. ``gre`` as the key to choose the
109+
correct format for the sub-message:
110+
111+
.. code-block:: yaml
112+
113+
sub-messages:
114+
name: linkinfo-data-msg
115+
formats:
116+
-
117+
value: bridge
118+
attribute-set: linkinfo-bridge-attrs
119+
-
120+
value: gre
121+
attribute-set: linkinfo-gre-attrs
122+
-
123+
value: geneve
124+
attribute-set: linkinfo-geneve-attrs
125+
126+
This would decode the attribute value as a sub-message with the attribute-set
127+
called ``linkinfo-gre-attrs`` as the attribute space.
128+
129+
A sub-message can have an optional ``fixed-header`` followed by zero or more
130+
attributes from an ``attribute-set``. For example the following
131+
``tc-options-msg`` sub-message defines message formats that use a mixture of
132+
``fixed-header``, ``attribute-set`` or both together:
133+
134+
.. code-block:: yaml
135+
136+
sub-messages:
137+
-
138+
name: tc-options-msg
139+
formats:
140+
-
141+
value: bfifo
142+
fixed-header: tc-fifo-qopt
143+
-
144+
value: cake
145+
attribute-set: tc-cake-attrs
146+
-
147+
value: netem
148+
fixed-header: tc-netem-qopt
149+
attribute-set: tc-netem-attrs
150+
151+
Note that a selector attribute must appear in a netlink message before any
152+
sub-message attributes that depend on it.

0 commit comments

Comments
 (0)