RE: [PATCH v5] virtio-net: Introduce a new field to indicate outer network header offset

Parav Pandit <[email protected]>
Newsgroups dev.linux.lists.virtio-comment
Message-ID <CY8PR12MB71952A4DB7191843654451C2DCB92@CY8PR12MB7195.namprd12.prod.outlook.com>

> From: Kommula Shiva Shankar <[email protected]>
> Sent: Wednesday, April 2, 2025 1:27 AM
>
> This patch introduces a new field in the virtio_net_hdr called outer_nh_offset,
> along with a new net device feature, VIRTIO_NET_F_OUT_NET_HEADER.
>
> Currently, drivers lack a dedicated field to signal the start of the network
> header to the device when performing checksum offload and segmentation
> offload. This requires the device to read the packet in data path, which
> significantly affects performance.
> Additionally, some hardware implementations require knowledge of the outer
> L3 offset (aka L2 length) for inline IPsec hardware acceleration.
>
> To address this limitation, we propose to introduce a new field in the
> virtio_net_hdr called outer_nh_offset.
>
> The outer_nh_offset represents the start byte offset of the outer network
> header from the beginning of the packet.
>
> This issue was briefly discussed on the mailing list in a different thread, which
> can be found here.
> https://lore.k/
> ernel.org%2Fall%2FDM4PR18MB4269FAAC3CFC7E57E25DFBD2DF8B2%40D
> M4PR18MB4269.namprd18.prod.outlook.com%2F&data=05%7C02%7Cparav
> %40nvidia.com%7Cedf3f285a2444bd9556b08dd71576107%7C43083d15727
> 340c1b7db39efd9ccc17a%7C0%7C0%7C638791342319588176%7CUnknown
> %7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAi
> OiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=
> nNqdyyxNprHlSB2XWV5fAxCbwvO3uP%2BgNLXkl2hJX04%3D&reserved=0
>
> v4->v5
>  - Added padding bytes to virtio_net_hdr to ensure 64b alignment
>  - Addressed pending review comments
> v4:https://lor/
> e.kernel.org%2Fvirtio-comment%2F20250304075955.208450-1-
> kshankar%40marvell.com%2F&data=05%7C02%7Cparav%40nvidia.com%7Ce
> df3f285a2444bd9556b08dd71576107%7C43083d15727340c1b7db39efd9ccc
> 17a%7C0%7C0%7C638791342319616725%7CUnknown%7CTWFpbGZsb3d8e
> yJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoi
> TWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=rrguhqiWyhYF3WqiN
> y361dZoVZhNOE6taSxTEPFJuQ0%3D&reserved=0
>
> v3 -> v4
>  - Removed the union of new flag with existing flags. Added as a separate field
>    in the virtio net header
>  - Renamed out_nh_offset to outer_nh_offset to maintain consistency with
> other fields
>  - Spellchecks in commit message description
> v3:https://lor/
> e.kernel.org%2Fall%2F20250217172509.107212-1-
> kshankar%40marvell.com&data=05%7C02%7Cparav%40nvidia.com%7Cedf3f
> 285a2444bd9556b08dd71576107%7C43083d15727340c1b7db39efd9ccc17a
> %7C0%7C0%7C638791342319633752%7CUnknown%7CTWFpbGZsb3d8eyJFb
> XB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWF
> pbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=RvjuY5N8yV3uXnETer4gRv
> NN2%2FhF23qrN9r1RFyF9%2BE%3D&reserved=0
>
> v2 -> v3:
>  - Rebase to virtio-1.4
>  - Addressed pending review comments related to wording.
> v2:https://lor/
> e.kernel.org%2Fall%2F20250128142152.3662988-1-
> kshankar%40marvell.com%2F&data=05%7C02%7Cparav%40nvidia.com%7Ce
> df3f285a2444bd9556b08dd71576107%7C43083d15727340c1b7db39efd9ccc
> 17a%7C0%7C0%7C638791342319647212%7CUnknown%7CTWFpbGZsb3d8e
> yJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoi
> TWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=1IoUxJKQff8XB%2FEe
> 5Zdn%2BXX0Df19o12BsG5Bshp8V3A%3D&reserved=0
>
> v1 -> v2:
>  - explicitly state that the out_nh_offset can be set only when a valid network
> header is present.
>  - updated out_nh_offset usage in the RX direction.
>  - minor word cleanup.
> v1:
> https://lore.k/
> ernel.org%2Fvirtio-comment%2F20250114171636.3175670-1-
> kshankar%40marvell.com%2F&data=05%7C02%7Cparav%40nvidia.com%7Ce
> df3f285a2444bd9556b08dd71576107%7C43083d15727340c1b7db39efd9ccc
> 17a%7C0%7C0%7C638791342319659853%7CUnknown%7CTWFpbGZsb3d8e
> yJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoi
> TWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=DBBnVhotS3Sgdf5%2
> BgahQEfrW48c%2FisMlh7c8I9qvOdQ%3D&reserved=0
>
> Signed-off-by: Kommula Shiva Shankar <[email protected]>
> ---
>  device-types/net/description.tex | 37
> +++++++++++++++++++++++++++++++-
>  1 file changed, 36 insertions(+), 1 deletion(-)
>
> diff --git a/device-types/net/description.tex b/device-
> types/net/description.tex
> index 1b6b54d..0bb1cef 100644
> --- a/device-types/net/description.tex
> +++ b/device-types/net/description.tex
> @@ -136,6 +136,10 @@ \subsection{Feature bits}\label{sec:Device Types /
> Network Device / Feature bits
>
>  \item[VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO_CSUM (68)] Device handles
> packets
>    carried by a UDP tunnel with partial csum for the outer header.
> +
> +\item[VIRTIO_NET_F_OUT_NET_HEADER(69)] Driver can provide the start of
> +\field{outer_nh_offset} value. Device gains advantage by not reading
> +packet
> +  to calculate outer network header offset.
>  \end{description}
>
>  \subsubsection{Feature bit requirements}\label{sec:Device Types / Network
> Device / Feature bits / Feature bit requirements} @@ -599,6 +603,8 @@
> \subsection{Device Operation}\label{sec:Device Types / Network Device /
> Device O
>          le16 padding_reserved;  (Only if VIRTIO_NET_F_HASH_REPORT
> negotiated)
>          le16 outer_th_offset    (Only if VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO
> or VIRTIO_NET_F_GUEST_UDP_TUNNEL_GSO negotiated)
>          le16 inner_nh_offset;   (Only if VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO
> or VIRTIO_NET_F_GUEST_UDP_TUNNEL_GSO negotiated)
> +        le16 outer_nh_offset;   /* Only if VIRTIO_NET_F_OUT_NET_HEADER
> negotiated */
> +        u8 padding_reserved_2[6]; /* Only if
> + VIRTIO_NET_F_OUT_NET_HEADER negotiated */
>  };
>  \end{lstlisting}
>
> @@ -633,6 +639,11 @@ \subsubsection{Packet
> Transmission}\label{sec:Device Types / Network Device / De  \item The driver
> can send a completely checksummed packet.  In this case,
>    \field{flags} will be zero, and \field{gso_type} will be
> VIRTIO_NET_HDR_GSO_NONE.
>
> +\item When VIRTIO_NET_F_OUT_NET_HEADER is negotiated, the driver MAY
> optionally provide
> +   the \field{outer_nh_offset} value. A nonzero value of
> \field{outer_nh_offset} indicates
> +   a valid outer network header with in the packet, and specifies the offset in
> bytes from
> +   the beginning of the packet. Otherwise \field{outer_nh_offset} MUST not
> be used.
> +
>  \item If the driver negotiated VIRTIO_NET_F_CSUM, it can skip
>    checksumming the packet:
>    \begin{itemize}
> @@ -767,6 +778,11 @@ \subsubsection{Packet
> Transmission}\label{sec:Device Types / Network Device / De  \field{flags} to
> zero and SHOULD supply a fully checksummed  packet to the device.
>
> +If the VIRTIO_NET_F_OUT_NET_HEADER feature has been negotiated, the
> +driver MAY set \field{outer_nh_offset} to nonzero value to indicate the
> +start of the outer network header offset, if the packet contains a
> +valid network header. Otherwise, \field{outer_nh_offset} is not used.
> +
>  If VIRTIO_NET_F_HOST_TSO4 is negotiated, the driver MAY set
> \field{gso_type} to VIRTIO_NET_HDR_GSO_TCPV4 to request TCPv4
> segmentation, otherwise the driver MUST NOT set @@ -948,6 +964,11 @@
> \subsubsection{Packet Transmission}\label{sec:Device Types / Network Device
> / De  If VIRTIO_NET_HDR_F_NEEDS_CSUM bit in \field{flags} is not set, the
> device MUST NOT use the \field{csum_start} and \field{csum_offset}.
>
> +If the VIRTIO_NET_F_OUT_NET_HEADER feature has been negotiated, and
> +\field{outer_nh_offset} is nonzero, the device MAY use
> +\field{outer_nh_offset} as the outer network header offset. Otherwise,
> +device MUST NOT use the \field{outer_nh_offset}.
> +
>  If one of the VIRTIO_NET_F_HOST_TSO4, TSO6, USO or UFO options have
> been negotiated:
>  \begin{itemize}
> @@ -1049,7 +1070,9 @@ \subsubsection{Setting Up Receive
> Buffers}\label{sec:Device Types / Network Devi  \end{note}
>
>  When calculating the size of \field{struct virtio_net_hdr}, the driver -MUST
> consider all the fields inclusive up to \field{padding_reserved},
> +MUST consider all the fields inclusive up to
> +\field{padding_reserved_2}, i.e. 32 bytes if
> +VIRTIO_NET_F_OUT_NET_HEADER is negotiated or up to
> +\field{inner_nh_offset} i.e. 24 bytes if
> +VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO is negotiated or up to
> +\field{padding_reserved}
>  i.e. 20 bytes if VIRTIO_NET_F_HASH_REPORT is negotiated, and 12 bytes if
> not.
>
>  If VIRTIO_NET_F_MQ is negotiated, each of receiveq1\ldots receiveqN @@ -
> 1102,6 +1125,9 @@ \subsubsection{Processing of Incoming
> Packets}\label{sec:Device Types / Network
>    both the outer UDP checksum and the inner transport checksum
>    have been validated, otherwise only one level of checksums (the outer one
>    in case of tunnels) has been validated.
> +\item If the VIRTIO_NET_F_OUT_NET_HEADER has been negotiated, and if
> +the packet
> +  contains a valid network header, \field{outer_nh_offset} MAY be set
> +to nonzero
> +  value to indicate the outer network header offset in packet.
>  \end{enumerate}
>
>  Additionally, VIRTIO_NET_F_GUEST_CSUM, TSO4, TSO6, UDP, UDP_TUNNEL
> @@ -1215,6 +1241,11 @@ \subsubsection{Processing of Incoming
> Packets}\label{sec:Device Types / Network  device MUST set the
> VIRTIO_NET_HDR_GSO_ECN bit in  \field{gso_type}.
>
> +If VIRTIO_NET_F_OUT_NET_HEADER has been negotiated, the device MAY
> set
> +the \field{outer_nh_offset} to nonzero value to indicate outer network
> +header offset, if packet contains a valid network header. Otherwise,
> +the device MUST not use \field{outer_nh_offset}.
> +
>  If the VIRTIO_NET_F_GUEST_CSUM feature has been negotiated, the  device
> MAY set the VIRTIO_NET_HDR_F_NEEDS_CSUM bit in  \field{flags}, if so:
> @@ -1302,6 +1333,10 @@ \subsubsection{Processing of Incoming
> Packets}\label{sec:Device Types / Network
>
>  The driver MUST ignore \field{flag} bits that it does not recognize.
>
> +If VIRTIO_NET_F_OUT_NET_HEADER has been negotiated, and if
> +\field{outer_nh_offset} is nonzero, the driver MAY use
> +\field{outer_nh_offset} as outer network header offset. Otherwise, the
> driver MUST not use the \field{outer_nh_offset}.
> +
>  If VIRTIO_NET_HDR_F_NEEDS_CSUM bit in \field{flags} is not set or  if
> VIRTIO_NET_HDR_F_RSC_INFO bit \field{flags} is set, the  driver MUST NOT
> use the \field{csum_start} and \field{csum_offset}.
> --
> 2.43.0

Reviewed-by: Parav Pandit <[email protected]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.