€•¾ZŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ5/translations/zh_CN/userspace-api/netlink/netlink-raw”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/zh_TW/userspace-api/netlink/netlink-raw”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/it_IT/userspace-api/netlink/netlink-raw”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/ja_JP/userspace-api/netlink/netlink-raw”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/ko_KR/userspace-api/netlink/netlink-raw”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/pt_BR/userspace-api/netlink/netlink-raw”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/sp_SP/userspace-api/netlink/netlink-raw”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ%SPDX-License-Identifier: BSD-3-Clause”h]”hŒ%SPDX-License-Identifier: BSD-3-Clause”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒO/var/lib/git/docbuild/linux/Documentation/userspace-api/netlink/netlink-raw.rst”h´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ6Netlink specification support for raw Netlink families”h]”hŒ6Netlink specification support for raw Netlink families”…””}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ paragraph”“”)”}”(hŒ¢This document describes the additional properties required by raw Netlink families such as ``NETLINK_ROUTE`` which use the ``netlink-raw`` protocol specification.”h]”(hŒ[This document describes the additional properties required by raw Netlink families such as ”…””}”(hhßh²hh³Nh´NubhŒliteral”“”)”}”(hŒ``NETLINK_ROUTE``”h]”hŒ NETLINK_ROUTE”…””}”(hhéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhhßubhŒ which use the ”…””}”(hhßh²hh³Nh´Nubhè)”}”(hŒ``netlink-raw``”h]”hŒ netlink-raw”…””}”(hhûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhhßubhŒ protocol specification.”…””}”(hhßh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Specification”h]”hŒ Specification”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´K ubhÞ)”}”(hX;The netlink-raw schema extends the :doc:`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.”h]”(hŒ#The netlink-raw schema extends the ”…””}”(hj$h²hh³Nh´Nubh)”}”(hŒ*:doc:`genetlink-legacy `”h]”hŒinline”“”)”}”(hj.h]”hŒgenetlink-legacy”…””}”(hj2h²hh³Nh´Nubah}”(h]”h ]”(Œxref”Œstd”Œstd-doc”eh"]”h$]”h&]”uh1j0hj,ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ!userspace-api/netlink/netlink-raw”Œ refdomain”j=Œreftype”Œdoc”Œ refexplicit”ˆŒrefwarn”ˆŒ reftarget”Œgenetlink-legacy”uh1hh³hÇh´Khj$ubhŒ| schema with properties that are needed to specify the protocol numbers and multicast IDs used by raw netlink families. See ”…””}”(hj$h²hh³Nh´Nubh)”}”(hŒ:ref:`classic_netlink`”h]”j1)”}”(hjWh]”hŒclassic_netlink”…””}”(hjYh²hh³Nh´Nubah}”(h]”h ]”(j<Œstd”Œstd-ref”eh"]”h$]”h&]”uh1j0hjUubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jIŒ refdomain”jcŒreftype”Œref”Œ refexplicit”‰Œrefwarn”ˆjOŒclassic_netlink”uh1hh³hÇh´Khj$ubhŒ\ for more information. The raw netlink families also make use of type-specific sub-messages.”…””}”(hj$h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjh²hubhÉ)”}”(hhh]”(hÎ)”}”(hŒGlobals”h]”hŒGlobals”…””}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒprotonum”h]”hŒprotonum”…””}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´KubhÞ)”}”(hŒfThe ``protonum`` property is used to specify the protocol number to use when opening a netlink socket.”h]”(hŒThe ”…””}”(hj¡h²hh³Nh´Nubhè)”}”(hŒ ``protonum``”h]”hŒprotonum”…””}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj¡ubhŒV property is used to specify the protocol number to use when opening a netlink socket.”…””}”(hj¡h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjh²hubhŒ literal_block”“”)”}”(hŒ°# 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”h]”hŒ°# 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”…””}”hjÃsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒforce”‰Œlanguage”Œyaml”Œhighlight_args”}”uh1jÁh³hÇh´Khjh²hubeh}”(h]”Œprotonum”ah ]”h"]”Œprotonum”ah$]”h&]”uh1hÈhjh²hh³hÇh´Kubeh}”(h]”Œglobals”ah ]”h"]”Œglobals”ah$]”h&]”uh1hÈhjh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒMulticast group properties”h]”hŒMulticast group properties”…””}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjæh²hh³hÇh´K'ubhÉ)”}”(hhh]”(hÎ)”}”(hŒvalue”h]”hŒvalue”…””}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj÷h²hh³hÇh´K*ubhÞ)”}”(hŒ_The ``value`` property is used to specify the group ID to use for multicast group registration.”h]”(hŒThe ”…””}”(hjh²hh³Nh´Nubhè)”}”(hŒ ``value``”h]”hŒvalue”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjubhŒR property is used to specify the group ID to use for multicast group registration.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K,hj÷h²hubjÂ)”}”(hŒµmcast-groups: list: - name: rtnlgrp-ipv4-ifaddr value: 5 - name: rtnlgrp-ipv6-ifaddr value: 9 - name: rtnlgrp-mctp-ifaddr value: 34”h]”hŒµmcast-groups: list: - name: rtnlgrp-ipv4-ifaddr value: 5 - name: rtnlgrp-ipv6-ifaddr value: 9 - name: rtnlgrp-mctp-ifaddr value: 34”…””}”hj(sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆjщjÒŒyaml”jÔ}”uh1jÁh³hÇh´K/hj÷h²hubeh}”(h]”Œvalue”ah ]”h"]”Œvalue”ah$]”h&]”uh1hÈhjæh²hh³hÇh´K*ubeh}”(h]”Œmulticast-group-properties”ah ]”h"]”Œmulticast group properties”ah$]”h&]”uh1hÈhjh²hh³hÇh´K'ubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Sub-messages”h]”hŒ Sub-messages”…””}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjHh²hh³hÇh´K>ubhÞ)”}”(hŒ¬Several raw netlink families such as :ref:`rt-link` and :ref:`tc` use attribute nesting as an abstraction to carry module specific information.”h]”(hŒ%Several raw netlink families such as ”…””}”(hjYh²hh³Nh´Nubh)”}”(hŒ:ref:`rt-link`”h]”j1)”}”(hjch]”hŒrt-link”…””}”(hjeh²hh³Nh´Nubah}”(h]”h ]”(j<Œstd”Œstd-ref”eh"]”h$]”h&]”uh1j0hjaubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jIŒ refdomain”joŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆjOŒnetlink-rt-link”uh1hh³hÇh´K@hjYubhŒ and ”…””}”(hjYh²hh³Nh´Nubh)”}”(hŒ:ref:`tc`”h]”j1)”}”(hj‡h]”hŒtc”…””}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”(j<Œstd”Œstd-ref”eh"]”h$]”h&]”uh1j0hj…ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jIŒ refdomain”j“Œreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆjOŒ netlink-tc”uh1hh³hÇh´K@hjYubhŒN use attribute nesting as an abstraction to carry module specific information.”…””}”(hjYh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K@hjHh²hubhÞ)”}”(hŒ"Conceptually it looks as follows::”h]”hŒ!Conceptually it looks as follows:”…””}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KEhjHh²hubjÂ)”}”(hŒ«[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]”h]”hŒ«[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]”…””}”hj½sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÁh³hÇh´KGhjHh²hubhÞ)”}”(hXƒ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.”h]”(hŒThe ”…””}”(hjËh²hh³Nh´Nubhè)”}”(hŒ``GENERIC ATTRs``”h]”hŒ GENERIC ATTRs”…””}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjËubhŒ¨ 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 ”…””}”(hjËh²hh³Nh´Nubhè)”}”(hŒ``GENERIC ATTR - wrapper``”h]”hŒGENERIC ATTR - wrapper”…””}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjËubhX¬. 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.”…””}”(hjËh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KOhjHh²hubhÞ)”}”(hŒ¶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:”h]”hŒ¶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:”…””}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KYhjHh²hubjÂ)”}”(hŒ{ "kind": "gre" }”h]”hŒ{ "kind": "gre" }”…””}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆjщjÒŒjson”jÔ}”uh1jÁh³hÇh´K]hjHh²hubhÞ)”}”(hŒ.and we encounter the following attribute spec:”h]”hŒ.and we encounter the following attribute spec:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KahjHh²hubjÂ)”}”(hŒT- name: data type: sub-message sub-message: linkinfo-data-msg selector: kind”h]”hŒT- name: data type: sub-message sub-message: linkinfo-data-msg selector: kind”…””}”hj)sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆjщjÒŒyaml”jÔ}”uh1jÁh³hÇh´KchjHh²hubhÞ)”}”(hŒ¼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:”h]”(hŒ1Then we look for a sub-message definition called ”…””}”(hj9h²hh³Nh´Nubhè)”}”(hŒ``linkinfo-data-msg``”h]”hŒlinkinfo-data-msg”…””}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj9ubhŒ and use the value of the ”…””}”(hj9h²hh³Nh´Nubhè)”}”(hŒ``kind``”h]”hŒkind”…””}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj9ubhŒ attribute i.e. ”…””}”(hj9h²hh³Nh´Nubhè)”}”(hŒ``gre``”h]”hŒgre”…””}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj9ubhŒ= as the key to choose the correct format for the sub-message:”…””}”(hj9h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KkhjHh²hubjÂ)”}”(hŒû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”h]”hŒû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”…””}”hj}sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆjщjÒŒyaml”jÔ}”uh1jÁh³hÇh´KohjHh²hubhÞ)”}”(hŒƒThis would decode the attribute value as a sub-message with the attribute-set called ``linkinfo-gre-attrs`` as the attribute space.”h]”(hŒUThis would decode the attribute value as a sub-message with the attribute-set called ”…””}”(hjh²hh³Nh´Nubhè)”}”(hŒ``linkinfo-gre-attrs``”h]”hŒlinkinfo-gre-attrs”…””}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjubhŒ as the attribute space.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K~hjHh²hubhÞ)”}”(hXA 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:”h]”(hŒ#A sub-message can have an optional ”…””}”(hj­h²hh³Nh´Nubhè)”}”(hŒ``fixed-header``”h]”hŒ fixed-header”…””}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj­ubhŒ- followed by zero or more attributes from an ”…””}”(hj­h²hh³Nh´Nubhè)”}”(hŒ``attribute-set``”h]”hŒ attribute-set”…””}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj­ubhŒ. For example the following ”…””}”(hj­h²hh³Nh´Nubhè)”}”(hŒ``tc-options-msg``”h]”hŒtc-options-msg”…””}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj­ubhŒ; sub-message defines message formats that use a mixture of ”…””}”(hj­h²hh³Nh´Nubhè)”}”(hŒ``fixed-header``”h]”hŒ fixed-header”…””}”(hjëh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj­ubhŒ, ”…””}”(hj­h²hh³Nh´Nubhè)”}”(hŒ``attribute-set``”h]”hŒ attribute-set”…””}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj­ubhŒ or both together:”…””}”(hj­h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhjHh²hubjÂ)”}”(hXsub-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”h]”hXsub-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”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆjщjÒŒyaml”jÔ}”uh1jÁh³hÇh´K†hjHh²hubhÞ)”}”(hŒtNote that a selector attribute must appear in a netlink message before any sub-message attributes that depend on it.”h]”hŒtNote that a selector attribute must appear in a netlink message before any sub-message attributes that depend on it.”…””}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K—hjHh²hubhÞ)”}”(hXö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.”h]”(hŒIf an attribute such as ”…””}”(hj3h²hh³Nh´Nubhè)”}”(hŒ``kind``”h]”hŒkind”…””}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj3ubhŒÄ 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 ”…””}”(hj3h²hh³Nh´Nubhè)”}”(hŒ``attribute-set``”h]”hŒ attribute-set”…””}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj3ubhŒ: alongside a sub-message selector and also in a top level ”…””}”(hj3h²hh³Nh´Nubhè)”}”(hŒ``attribute-set``”h]”hŒ attribute-set”…””}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj3ubhŒ¾, 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.”…””}”(hj3h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KšhjHh²hubeh}”(h]”Œ sub-messages”ah ]”h"]”Œ sub-messages”ah$]”h&]”uh1hÈhjh²hh³hÇh´K>ubhÉ)”}”(hhh]”(hÎ)”}”(hŒNested struct definitions”h]”hŒNested struct definitions”…””}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´K£ubhÞ)”}”(hXMany raw netlink families such as :ref:`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``.”h]”(hŒ"Many raw netlink families such as ”…””}”(hjh²hh³Nh´Nubh)”}”(hŒ:ref:`tc`”h]”j1)”}”(hjšh]”hŒtc”…””}”(hjœh²hh³Nh´Nubah}”(h]”h ]”(j<Œstd”Œstd-ref”eh"]”h$]”h&]”uh1j0hj˜ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jIŒ refdomain”j¦Œreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆjOŒ netlink-tc”uh1hh³hÇh´K¥hjubhŒ, make use of nested struct definitions. The ”…””}”(hjh²hh³Nh´Nubhè)”}”(hŒ``netlink-raw``”h]”hŒ netlink-raw”…””}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjubhŒQ schema makes it possible to embed a struct within a struct definition using the ”…””}”(hjh²hh³Nh´Nubhè)”}”(hŒ ``struct``”h]”hŒstruct”…””}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjubhŒC property. For example, the following struct definition embeds the ”…””}”(hjh²hh³Nh´Nubhè)”}”(hŒ``tc-ratespec``”h]”hŒ tc-ratespec”…””}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjubhŒ struct definition for both the ”…””}”(hjh²hh³Nh´Nubhè)”}”(hŒ``rate``”h]”hŒrate”…””}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjubhŒ and the ”…””}”(hjh²hh³Nh´Nubhè)”}”(hŒ ``peakrate``”h]”hŒpeakrate”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjubhŒ members of ”…””}”(hjh²hh³Nh´Nubhè)”}”(hŒ``struct tc-tbf-qopt``”h]”hŒstruct tc-tbf-qopt”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjubhŒ.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¥hjh²hubjÂ)”}”(hX2- 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”h]”hX2- 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”…””}”hj.sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆjщjÒŒyaml”jÔ}”uh1jÁh³hÇh´K¬hjh²hubeh}”(h]”Œnested-struct-definitions”ah ]”h"]”Œnested struct definitions”ah$]”h&]”uh1hÈhjh²hh³hÇh´K£ubeh}”(h]”Œ specification”ah ]”h"]”Œ specification”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K ubeh}”(h]”Œ6netlink-specification-support-for-raw-netlink-families”ah ]”h"]”Œ6netlink specification support for raw netlink families”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jyŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jSjPjKjHjãjàjÛjØjEjBj=j:j|jyjCj@uŒ nametypes”}”(jS‰jK‰jã‰jÛ‰jE‰j=‰j|‰jC‰uh}”(jPhÊjHjjàjjØjjBjæj:j÷jyjHj@juŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.