nsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget./translations/zh_CN/networking/xsk-tx-metadatamodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/zh_TW/networking/xsk-tx-metadatamodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/it_IT/networking/xsk-tx-metadatamodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/ja_JP/networking/xsk-tx-metadatamodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/ko_KR/networking/xsk-tx-metadatamodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/sp_SP/networking/xsk-tx-metadatamodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhH/var/lib/git/docbuild/linux/Documentation/networking/xsk-tx-metadata.rsthKubhsection)}(hhh](htitle)}(hAF_XDP TX Metadatah]hAF_XDP TX Metadata}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hThis document describes how to enable offloads when transmitting packets via :doc:`af_xdp`. Refer to :doc:`xdp-rx-metadata` on how to access similar metadata on the receive side.h](hMThis document describes how to enable offloads when transmitting packets via }(hhhhhNhNubh)}(h :doc:`af_xdp`h]hinline)}(hhh]haf_xdp}(hhhhhNhNubah}(h]h ](xrefstdstd-doceh"]h$]h&]uh1hhhubah}(h]h ]h"]h$]h&]refdocnetworking/xsk-tx-metadata refdomainhreftypedoc refexplicitrefwarn reftargetaf_xdpuh1hhhhKhhubh . Refer to }(hhhhhNhNubh)}(h:doc:`xdp-rx-metadata`h]h)}(hhh]hxdp-rx-metadata}(hjhhhNhNubah}(h]h ](hstdstd-doceh"]h$]h&]uh1hhhubah}(h]h ]h"]h$]h&]refdoch refdomainj reftypedoc refexplicitrefwarnhxdp-rx-metadatauh1hhhhKhhubh7 on how to access similar metadata on the receive side.}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hGeneral Designh]hGeneral Design}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hhhhhK ubh)}(hXThe headroom for the metadata is reserved via ``tx_metadata_len`` and ``XDP_UMEM_TX_METADATA_LEN`` flag in ``struct xdp_umem_reg``. The metadata length is therefore the same for every socket that shares the same umem. The metadata layout is a fixed UAPI, refer to ``union xsk_tx_metadata`` in ``include/uapi/linux/if_xdp.h``. Thus, generally, the ``tx_metadata_len`` field above should contain ``sizeof(union xsk_tx_metadata)``.h](h.The headroom for the metadata is reserved via }(hj7hhhNhNubhliteral)}(h``tx_metadata_len``h]htx_metadata_len}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hj7ubh and }(hj7hhhNhNubj@)}(h``XDP_UMEM_TX_METADATA_LEN``h]hXDP_UMEM_TX_METADATA_LEN}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1j?hj7ubh flag in }(hj7hhhNhNubj@)}(h``struct xdp_umem_reg``h]hstruct xdp_umem_reg}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1j?hj7ubh. The metadata length is therefore the same for every socket that shares the same umem. The metadata layout is a fixed UAPI, refer to }(hj7hhhNhNubj@)}(h``union xsk_tx_metadata``h]hunion xsk_tx_metadata}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hj7ubh in }(hj7hhhNhNubj@)}(h``include/uapi/linux/if_xdp.h``h]hinclude/uapi/linux/if_xdp.h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hj7ubh. Thus, generally, the }(hj7hhhNhNubj@)}(h``tx_metadata_len``h]htx_metadata_len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hj7ubh field above should contain }(hj7hhhNhNubj@)}(h!``sizeof(union xsk_tx_metadata)``h]hsizeof(union xsk_tx_metadata)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hj7ubh.}(hj7hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj&hhubh)}(hNote that in the original implementation the ``XDP_UMEM_TX_METADATA_LEN`` flag was not required. Applications might attempt to create a umem with a flag first and if it fails, do another attempt without a flag.h](h-Note that in the original implementation the }(hjhhhNhNubj@)}(h``XDP_UMEM_TX_METADATA_LEN``h]hXDP_UMEM_TX_METADATA_LEN}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh flag was not required. Applications might attempt to create a umem with a flag first and if it fails, do another attempt without a flag.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj&hhubh)}(hThe headroom and the metadata itself should be located right before ``xdp_desc->addr`` in the umem frame. Within a frame, the metadata layout is as follows::h](hDThe headroom and the metadata itself should be located right before }(hjhhhNhNubj@)}(h``xdp_desc->addr``h]hxdp_desc->addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubhF in the umem frame. Within a frame, the metadata layout is as follows:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj&hhubh literal_block)}(hXE tx_metadata_len / \ +-----------------+---------+----------------------------+ | xsk_tx_metadata | padding | payload | +-----------------+---------+----------------------------+ ^ | xdp_desc->addrh]hXE tx_metadata_len / \ +-----------------+---------+----------------------------+ | xsk_tx_metadata | padding | payload | +-----------------+---------+----------------------------+ ^ | xdp_desc->addr}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKhj&hhubh)}(hX}An AF_XDP application can request headrooms larger than ``sizeof(struct xsk_tx_metadata)``. The kernel will ignore the padding (and will still use ``xdp_desc->addr - tx_metadata_len`` to locate the ``xsk_tx_metadata``). For the frames that shouldn't carry any metadata (i.e., the ones that don't have ``XDP_TX_METADATA`` option), the metadata area is ignored by the kernel as well.h](h8An AF_XDP application can request headrooms larger than }(hjhhhNhNubj@)}(h"``sizeof(struct xsk_tx_metadata)``h]hsizeof(struct xsk_tx_metadata)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh9. The kernel will ignore the padding (and will still use }(hjhhhNhNubj@)}(h$``xdp_desc->addr - tx_metadata_len``h]h xdp_desc->addr - tx_metadata_len}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh to locate the }(hjhhhNhNubj@)}(h``xsk_tx_metadata``h]hxsk_tx_metadata}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubhX). For the frames that shouldn’t carry any metadata (i.e., the ones that don’t have }(hjhhhNhNubj@)}(h``XDP_TX_METADATA``h]hXDP_TX_METADATA}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh= option), the metadata area is ignored by the kernel as well.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK&hj&hhubh)}(h/The flags field enables the particular offload:h]h/The flags field enables the particular offload:}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hj&hhubh bullet_list)}(hhh](h list_item)}(h``XDP_TXMD_FLAGS_TIMESTAMP``: requests the device to put transmission timestamp into ``tx_timestamp`` field of ``union xsk_tx_metadata``.h]h)}(h``XDP_TXMD_FLAGS_TIMESTAMP``: requests the device to put transmission timestamp into ``tx_timestamp`` field of ``union xsk_tx_metadata``.h](j@)}(h``XDP_TXMD_FLAGS_TIMESTAMP``h]hXDP_TXMD_FLAGS_TIMESTAMP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh9: requests the device to put transmission timestamp into }(hjhhhNhNubj@)}(h``tx_timestamp``h]h tx_timestamp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh field of }(hjhhhNhNubj@)}(h``union xsk_tx_metadata``h]hunion xsk_tx_metadata}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK/hjubah}(h]h ]h"]h$]h&]uh1j~hj{hhhhhNubj)}(h``XDP_TXMD_FLAGS_CHECKSUM``: requests the device to calculate L4 checksum. ``csum_start`` specifies byte offset of where the checksumming should start and ``csum_offset`` specifies byte offset where the device should store the computed checksum.h]h)}(h``XDP_TXMD_FLAGS_CHECKSUM``: requests the device to calculate L4 checksum. ``csum_start`` specifies byte offset of where the checksumming should start and ``csum_offset`` specifies byte offset where the device should store the computed checksum.h](j@)}(h``XDP_TXMD_FLAGS_CHECKSUM``h]hXDP_TXMD_FLAGS_CHECKSUM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh0: requests the device to calculate L4 checksum. }(hjhhhNhNubj@)}(h``csum_start``h]h csum_start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubhB specifies byte offset of where the checksumming should start and }(hjhhhNhNubj@)}(h``csum_offset``h]h csum_offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubhK specifies byte offset where the device should store the computed checksum.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK1hjubah}(h]h ]h"]h$]h&]uh1j~hj{hhhhhNubj)}(h``XDP_TXMD_FLAGS_LAUNCH_TIME``: requests the device to schedule the packet for transmission at a pre-determined time called launch time. The value of launch time is indicated by ``launch_time`` field of ``union xsk_tx_metadata``. h]h)}(h``XDP_TXMD_FLAGS_LAUNCH_TIME``: requests the device to schedule the packet for transmission at a pre-determined time called launch time. The value of launch time is indicated by ``launch_time`` field of ``union xsk_tx_metadata``.h](j@)}(h``XDP_TXMD_FLAGS_LAUNCH_TIME``h]hXDP_TXMD_FLAGS_LAUNCH_TIME}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh: requests the device to schedule the packet for transmission at a pre-determined time called launch time. The value of launch time is indicated by }(hjhhhNhNubj@)}(h``launch_time``h]h launch_time}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh field of }(hjhhhNhNubj@)}(h``union xsk_tx_metadata``h]hunion xsk_tx_metadata}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK5hjubah}(h]h ]h"]h$]h&]uh1j~hj{hhhhhNubeh}(h]h ]h"]h$]h&]bullet-uh1jyhhhK/hj&hhubh)}(hXBesides the flags above, in order to trigger the offloads, the first packet's ``struct xdp_desc`` descriptor should set ``XDP_TX_METADATA`` bit in the ``options`` field. Also note that in a multi-buffer packet only the first chunk should carry the metadata.h](hPBesides the flags above, in order to trigger the offloads, the first packet’s }(hjfhhhNhNubj@)}(h``struct xdp_desc``h]hstruct xdp_desc}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjfubh descriptor should set }(hjfhhhNhNubj@)}(h``XDP_TX_METADATA``h]hXDP_TX_METADATA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjfubh bit in the }(hjfhhhNhNubj@)}(h ``options``h]hoptions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjfubh_ field. Also note that in a multi-buffer packet only the first chunk should carry the metadata.}(hjfhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK:hj&hhubeh}(h]general-designah ]h"]general designah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hSoftware TX Checksumh]hSoftware TX Checksum}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK@ubh)}(hX4For development and testing purposes its possible to pass ``XDP_UMEM_TX_SW_CSUM`` flag to ``XDP_UMEM_REG`` UMEM registration call. In this case, when running in ``XDK_COPY`` mode, the TX checksum is calculated on the CPU. Do not enable this option in production because it will negatively affect performance.h](h:For development and testing purposes its possible to pass }(hjhhhNhNubj@)}(h``XDP_UMEM_TX_SW_CSUM``h]hXDP_UMEM_TX_SW_CSUM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh flag to }(hjhhhNhNubj@)}(h``XDP_UMEM_REG``h]h XDP_UMEM_REG}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh7 UMEM registration call. In this case, when running in }(hjhhhNhNubj@)}(h ``XDK_COPY``h]hXDK_COPY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh mode, the TX checksum is calculated on the CPU. Do not enable this option in production because it will negatively affect performance.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKBhjhhubeh}(h]software-tx-checksumah ]h"]software tx checksumah$]h&]uh1hhhhhhhhK@ubh)}(hhh](h)}(h Launch Timeh]h Launch Time}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKIubh)}(hXThe value of the requested launch time should be based on the device's PTP Hardware Clock (PHC) to ensure accuracy. AF_XDP takes a different data path compared to the ETF queuing discipline, which organizes packets and delays their transmission. Instead, AF_XDP immediately hands off the packets to the device driver without rearranging their order or holding them prior to transmission. Since the driver maintains FIFO behavior and does not perform packet reordering, a packet with a launch time request will block other packets in the same Tx Queue until it is sent. Therefore, it is recommended to allocate separate queue for scheduling traffic that is intended for future transmission.h]hXThe value of the requested launch time should be based on the device’s PTP Hardware Clock (PHC) to ensure accuracy. AF_XDP takes a different data path compared to the ETF queuing discipline, which organizes packets and delays their transmission. Instead, AF_XDP immediately hands off the packets to the device driver without rearranging their order or holding them prior to transmission. Since the driver maintains FIFO behavior and does not perform packet reordering, a packet with a launch time request will block other packets in the same Tx Queue until it is sent. Therefore, it is recommended to allocate separate queue for scheduling traffic that is intended for future transmission.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKKhjhhubh)}(hXIn scenarios where the launch time offload feature is disabled, the device driver is expected to disregard the launch time request. For correct interpretation and meaningful operation, the launch time should never be set to a value larger than the farthest programmable time in the future (the horizon). Different devices have different hardware limitations on the launch time offload feature.h]hXIn scenarios where the launch time offload feature is disabled, the device driver is expected to disregard the launch time request. For correct interpretation and meaningful operation, the launch time should never be set to a value larger than the farthest programmable time in the future (the horizon). Different devices have different hardware limitations on the launch time offload feature.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKVhjhhubh)}(hhh](h)}(h stmmac driverh]h stmmac driver}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hhhhhK^ubh)}(hX[For stmmac, TSO and launch time (TBS) features are mutually exclusive for each individual Tx Queue. By default, the driver configures Tx Queue 0 to support TSO and the rest of the Tx Queues to support TBS. The launch time hardware offload feature can be enabled or disabled by using the tc-etf command to call the driver's ndo_setup_tc() callback.h]hX]For stmmac, TSO and launch time (TBS) features are mutually exclusive for each individual Tx Queue. By default, the driver configures Tx Queue 0 to support TSO and the rest of the Tx Queues to support TBS. The launch time hardware offload feature can be enabled or disabled by using the tc-etf command to call the driver’s ndo_setup_tc() callback.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK`hj<hhubh)}(hXThe value of the launch time that is programmed in the Enhanced Normal Transmit Descriptors is a 32-bit value, where the most significant 8 bits represent the time in seconds and the remaining 24 bits represent the time in 256 ns increments. The programmed launch time is compared against the PTP time (bits[39:8]) and rolls over after 256 seconds. Therefore, the horizon of the launch time for dwmac4 and dwxlgmac2 is 128 seconds in the future.h]hXThe value of the launch time that is programmed in the Enhanced Normal Transmit Descriptors is a 32-bit value, where the most significant 8 bits represent the time in seconds and the remaining 24 bits represent the time in 256 ns increments. The programmed launch time is compared against the PTP time (bits[39:8]) and rolls over after 256 seconds. Therefore, the horizon of the launch time for dwmac4 and dwxlgmac2 is 128 seconds in the future.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKfhj<hhubeh}(h] stmmac-driverah ]h"] stmmac driverah$]h&]uh1hhjhhhhhK^ubh)}(hhh](h)}(h igc driverh]h igc driver}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhhhhhKoubh)}(hXkFor igc, all four Tx Queues support the launch time feature. The launch time hardware offload feature can be enabled or disabled by using the tc-etf command to call the driver's ndo_setup_tc() callback. When entering TSN mode, the igc driver will reset the device and create a default Qbv schedule with a 1-second cycle time, with all Tx Queues open at all times.h]hXmFor igc, all four Tx Queues support the launch time feature. The launch time hardware offload feature can be enabled or disabled by using the tc-etf command to call the driver’s ndo_setup_tc() callback. When entering TSN mode, the igc driver will reset the device and create a default Qbv schedule with a 1-second cycle time, with all Tx Queues open at all times.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKqhjqhhubh)}(hXLThe value of the launch time that is programmed in the Advanced Transmit Context Descriptor is a relative offset to the starting time of the Qbv transmission window of the queue. The Frst flag of the descriptor can be set to schedule the packet for the next Qbv cycle. Therefore, the horizon of the launch time for i225 and i226 is the ending time of the next cycle of the Qbv transmission window of the queue. For example, when the Qbv cycle time is set to 1 second, the horizon of the launch time ranges from 1 second to 2 seconds, depending on where the Qbv cycle is currently running.h]hXLThe value of the launch time that is programmed in the Advanced Transmit Context Descriptor is a relative offset to the starting time of the Qbv transmission window of the queue. The Frst flag of the descriptor can be set to schedule the packet for the next Qbv cycle. Therefore, the horizon of the launch time for i225 and i226 is the ending time of the next cycle of the Qbv transmission window of the queue. For example, when the Qbv cycle time is set to 1 second, the horizon of the launch time ranges from 1 second to 2 seconds, depending on where the Qbv cycle is currently running.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKwhjqhhubeh}(h] igc-driverah ]h"] igc driverah$]h&]uh1hhjhhhhhKoubeh}(h] launch-timeah ]h"] launch timeah$]h&]uh1hhhhhhhhKIubh)}(hhh](h)}(hQuerying Device Capabilitiesh]hQuerying Device Capabilities}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hEvery devices exports its offloads capabilities via netlink netdev family. Refer to ``xsk-flags`` features bitmask in ``Documentation/netlink/specs/netdev.yaml``.h](hTEvery devices exports its offloads capabilities via netlink netdev family. Refer to }(hjhhhNhNubj@)}(h ``xsk-flags``h]h xsk-flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh features bitmask in }(hjhhhNhNubj@)}(h+``Documentation/netlink/specs/netdev.yaml``h]h'Documentation/netlink/specs/netdev.yaml}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubjz)}(hhh](j)}(h>``tx-timestamp``: device supports ``XDP_TXMD_FLAGS_TIMESTAMP``h]h)}(hjh](j@)}(h``tx-timestamp``h]h tx-timestamp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh: device supports }(hjhhhNhNubj@)}(h``XDP_TXMD_FLAGS_TIMESTAMP``h]hXDP_TXMD_FLAGS_TIMESTAMP}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j~hjhhhhhNubj)}(h<``tx-checksum``: device supports ``XDP_TXMD_FLAGS_CHECKSUM``h]h)}(hj)h](j@)}(h``tx-checksum``h]h tx-checksum}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j?hj+ubh: device supports }(hj+hhhNhNubj@)}(h``XDP_TXMD_FLAGS_CHECKSUM``h]hXDP_TXMD_FLAGS_CHECKSUM}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j?hj+ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj'ubah}(h]h ]h"]h$]h&]uh1j~hjhhhhhNubj)}(hH``tx-launch-time-fifo``: device supports ``XDP_TXMD_FLAGS_LAUNCH_TIME`` h]h)}(hG``tx-launch-time-fifo``: device supports ``XDP_TXMD_FLAGS_LAUNCH_TIME``h](j@)}(h``tx-launch-time-fifo``h]htx-launch-time-fifo}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hj^ubh: device supports }(hj^hhhNhNubj@)}(h``XDP_TXMD_FLAGS_LAUNCH_TIME``h]hXDP_TXMD_FLAGS_LAUNCH_TIME}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1j?hj^ubeh}(h]h ]h"]h$]h&]uh1hhhhKhjZubah}(h]h ]h"]h$]h&]uh1j~hjhhhhhNubeh}(h]h ]h"]h$]h&]jdjeuh1jyhhhKhjhhubh)}(hHSee ``tools/net/ynl/samples/netdev.c`` on how to query this information.h](hSee }(hjhhhNhNubj@)}(h"``tools/net/ynl/samples/netdev.c``h]htools/net/ynl/samples/netdev.c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh" on how to query this information.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]querying-device-capabilitiesah ]h"]querying device capabilitiesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hExampleh]hExample}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hSee ``tools/testing/selftests/bpf/xdp_hw_metadata.c`` for an example program that handles TX metadata. Also see https://github.com/fomichev/xskgen for a more bare-bones example.h](hSee }(hjhhhNhNubj@)}(h1``tools/testing/selftests/bpf/xdp_hw_metadata.c``h]h-tools/testing/selftests/bpf/xdp_hw_metadata.c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j?hjubh; for an example program that handles TX metadata. Also see }(hjhhhNhNubh reference)}(h"https://github.com/fomichev/xskgenh]h"https://github.com/fomichev/xskgen}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1jhjubh for a more bare-bones example.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]exampleah ]h"]exampleah$]h&]uh1hhhhhhhhKubeh}(h]af-xdp-tx-metadataah ]h"]af_xdp tx metadataah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj5error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jj jjj j jjjnjkjjjjjju nametypes}(jjj jjnjjjuh}(j hjj&j jjjjkj<jjqjjjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.