€•Ž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Œ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¹hhÿhž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 ”…””}”(hjhžhhŸNh Nubh)”}”(hŒ*:doc:`genetlink-legacy `”h]”hŒinline”“”)”}”(hjh]”hŒgenetlink-legacy”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”(Œxref”Œstd”Œstd-doc”eh"]”h$]”h&]”uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ!userspace-api/netlink/netlink-raw”Œ refdomain”j)Œreftype”Œdoc”Œ refexplicit”ˆŒrefwarn”ˆŒ reftarget”Œgenetlink-legacy”uh1hhŸh³h KhjubhŒ| schema with properties that are needed to specify the protocol numbers and multicast IDs used by raw netlink families. See ”…””}”(hjhžhhŸNh Nubh)”}”(hŒ:ref:`classic_netlink`”h]”j)”}”(hjCh]”hŒclassic_netlink”…””}”(hjEhžhhŸNh Nubah}”(h]”h ]”(j(Œstd”Œstd-ref”eh"]”h$]”h&]”uh1jhjAubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j5Œ refdomain”jOŒreftype”Œref”Œ refexplicit”‰Œrefwarn”ˆj;Œclassic_netlink”uh1hhŸh³h KhjubhŒ\ for more information. The raw netlink families also make use of type-specific sub-messages.”…””}”(hjhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khhÿhžhubhµ)”}”(hhh]”(hº)”}”(hŒGlobals”h]”hŒGlobals”…””}”(hjnhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hjkhžhhŸh³h Kubhµ)”}”(hhh]”(hº)”}”(hŒprotonum”h]”hŒprotonum”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hj|hž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 ”…””}”(hjhžhhŸNh NubhÔ)”}”(hŒ ``protonum``”h]”hŒprotonum”…””}”(hj•hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÓhjubhŒV property is used to specify the protocol number to use when opening a netlink socket.”…””}”(hjhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khj|hž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 Khj|hžhubeh}”(h]”Œprotonum”ah ]”h"]”Œprotonum”ah$]”h&]”uh1h´hjkhžhhŸh³h Kubeh}”(h]”Œglobals”ah ]”h"]”Œglobals”ah$]”h&]”uh1h´hhÿhž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 ”…””}”(hjôhžhhŸNh NubhÔ)”}”(hŒ ``value``”h]”hŒvalue”…””}”(hjühžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÓhjôubhŒR property is used to specify the group ID to use for multicast group registration.”…””}”(hjôhž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”…””}”hjsbah}”(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´hhÿhžhhŸh³h K'ubhµ)”}”(hhh]”(hº)”}”(hŒ Sub-messages”h]”hŒ Sub-messages”…””}”(hj7hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hj4hžhhŸh³h K>ubhÊ)”}”(hŒØSeveral raw netlink families such as :doc:`rt_link<../../networking/netlink_spec/rt_link>` and :doc:`tc<../../networking/netlink_spec/tc>` use attribute nesting as an abstraction to carry module specific information.”h]”(hŒ%Several raw netlink families such as ”…””}”(hjEhžhhŸNh Nubh)”}”(hŒ5:doc:`rt_link<../../networking/netlink_spec/rt_link>`”h]”j)”}”(hjOh]”hŒrt_link”…””}”(hjQhžhhŸNh Nubah}”(h]”h ]”(j(Œstd”Œstd-doc”eh"]”h$]”h&]”uh1jhjMubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j5Œ refdomain”j[Œreftype”Œdoc”Œ refexplicit”ˆŒrefwarn”ˆj;Œ%../../networking/netlink_spec/rt_link”uh1hhŸh³h K@hjEubhŒ and ”…””}”(hjEhžhhŸNh Nubh)”}”(hŒ+:doc:`tc<../../networking/netlink_spec/tc>`”h]”j)”}”(hjsh]”hŒtc”…””}”(hjuhžhhŸNh Nubah}”(h]”h ]”(j(Œstd”Œstd-doc”eh"]”h$]”h&]”uh1jhjqubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j5Œ refdomain”jŒreftype”Œdoc”Œ refexplicit”ˆŒrefwarn”ˆj;Œ ../../networking/netlink_spec/tc”uh1hhŸh³h K@hjEubhŒN use attribute nesting as an abstraction to carry module specific information.”…””}”(hjEhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K@hj4hž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 KEhj4hž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 KGhj4hž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 KOhj4hž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 KYhj4hž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]hj4hž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 Kahj4hž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”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”h±h²j½‰j¾Œyaml”jÀ}”uh1j­hŸh³h Kchj4hž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 ”…””}”(hj%hžhhŸNh NubhÔ)”}”(hŒ``linkinfo-data-msg``”h]”hŒlinkinfo-data-msg”…””}”(hj-hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÓhj%ubhŒ and use the value of the ”…””}”(hj%hžhhŸNh NubhÔ)”}”(hŒ``kind``”h]”hŒkind”…””}”(hj?hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÓhj%ubhŒ attribute i.e. ”…””}”(hj%hžhhŸNh NubhÔ)”}”(hŒ``gre``”h]”hŒgre”…””}”(hjQhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÓhj%ubhŒ= as the key to choose the correct format for the sub-message:”…””}”(hj%hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Kkhj4hž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”…””}”hjisbah}”(h]”h ]”h"]”h$]”h&]”h±h²j½‰j¾Œyaml”jÀ}”uh1j­hŸh³h Kohj4hž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 ”…””}”(hjyhžhhŸNh NubhÔ)”}”(hŒ``linkinfo-gre-attrs``”h]”hŒlinkinfo-gre-attrs”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÓhjyubhŒ as the attribute space.”…””}”(hjyhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K~hj4hž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 Khj4hž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†hj4hž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.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K—hj4hž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 ”…””}”(hjhžhhŸNh NubhÔ)”}”(hŒ``kind``”h]”hŒkind”…””}”(hj'hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÓhjubhŒÄ 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 ”…””}”(hjhžhhŸNh NubhÔ)”}”(hŒ``attribute-set``”h]”hŒ attribute-set”…””}”(hj9hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÓhjubhŒ: alongside a sub-message selector and also in a top level ”…””}”(hjhžhhŸNh NubhÔ)”}”(hŒ``attribute-set``”h]”hŒ attribute-set”…””}”(hjKhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÓhjubhŒ¾, 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.”…””}”(hjhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Kšhj4hžhubeh}”(h]”Œ sub-messages”ah ]”h"]”Œ sub-messages”ah$]”h&]”uh1h´hhÿhžhhŸh³h K>ubhµ)”}”(hhh]”(hº)”}”(hŒNested struct definitions”h]”hŒNested struct definitions”…””}”(hjnhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hjkhžhhŸh³h K£ubhÊ)”}”(hX•Many raw netlink families such as :doc:`tc<../../networking/netlink_spec/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 ”…””}”(hj|hžhhŸNh Nubh)”}”(hŒ+:doc:`tc<../../networking/netlink_spec/tc>`”h]”j)”}”(hj†h]”hŒtc”…””}”(hjˆhžhhŸNh Nubah}”(h]”h ]”(j(Œstd”Œstd-doc”eh"]”h$]”h&]”uh1jhj„ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j5Œ refdomain”j’Œreftype”Œdoc”Œ refexplicit”ˆŒrefwarn”ˆj;Œ ../../networking/netlink_spec/tc”uh1hhŸh³h K¥hj|ubhŒ, make use of nested struct definitions. The ”…””}”(hj|hžhhŸNh NubhÔ)”}”(hŒ``netlink-raw``”h]”hŒ netlink-raw”…””}”(hj¨hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÓhj|ubhŒQ schema makes it possible to embed a struct within a struct definition using the ”…””}”(hj|hžhhŸNh NubhÔ)”}”(hŒ ``struct``”h]”hŒstruct”…””}”(hjºhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÓhj|ubhŒC property. For example, the following struct definition embeds the ”…””}”(hj|hžhhŸNh NubhÔ)”}”(hŒ``tc-ratespec``”h]”hŒ tc-ratespec”…””}”(hjÌhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÓhj|ubhŒ struct definition for both the ”…””}”(hj|hžhhŸNh NubhÔ)”}”(hŒ``rate``”h]”hŒrate”…””}”(hjÞhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÓhj|ubhŒ and the ”…””}”(hj|hžhhŸNh NubhÔ)”}”(hŒ ``peakrate``”h]”hŒpeakrate”…””}”(hjðhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÓhj|ubhŒ members of ”…””}”(hj|hžhhŸNh NubhÔ)”}”(hŒ``struct tc-tbf-qopt``”h]”hŒstruct tc-tbf-qopt”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÓhj|ubhŒ.”…””}”(hj|hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K¥hjkhž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”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”h±h²j½‰j¾Œyaml”jÀ}”uh1j­hŸh³h K¬hjkhžhubeh}”(h]”Œnested-struct-definitions”ah ]”h"]”Œnested struct definitions”ah$]”h&]”uh1h´hhÿhž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”jeŒ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”}”(j?j<j7j4jÏjÌjÇjÄj1j.j)j&jhjej/j,uŒ nametypes”}”(j?‰j7‰jωjljj1‰j)‰jh‰j/‰uh}”(j<h¶j4hÿjÌjkjÄj|j.jÒj&jãjej4j,jkuŒ 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.