netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 net-next  0/3]  virtio_net: Implement VIRTIO_NET_F_OUT_NET_HEADER from virtio spec 1.4
@ 2025-10-08 11:00 Kommula Shiva Shankar
  2025-10-08 11:00 ` [PATCH v2 net-next 1/3] net: implement virtio helper to handle outer nw offset Kommula Shiva Shankar
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Kommula Shiva Shankar @ 2025-10-08 11:00 UTC (permalink / raw)
  To: netdev, mst, jasowang, pabeni, xuanzhuo
  Cc: virtualization, parav, jerinj, ndabilpuram, sburla, schalla

This series implements the VIRTIO_NET_F_OUT_NET_HEADER feature which was introduced in the virtio specification 1.4 recently.
With this change, segmentation offload functionality now propagates outer IP header offset information to the device/apps running on NIC.

The virtio 1.4 spec introduced VIRTIO_NET_F_OUT_NET_HEADER feature[1] to address the performance issue caused by reading packet data
to determine outer network header offset and to support Inline IPSec functionality,
where vendor hardware devices need to know the outer network header offset for Inline IPSec acceleration.

Currently, devices must parse through packet headers to determine the outer network header which impacts performance.
This patch series implements the outer_nh_offset field in virtio_net_hdr to avoid parsing overhead.

This series was tested on ARM platform with virtio-net driver where ~4% performance improvement was measured
for device applications.

V1 -> V2: Added IPv6 support to outer network header offset feature 
	  Fixed sparse build warnings

[1] https://lore.kernel.org/virtio-comment/20250401195655.486230-1-kshankar@marvell.com/

Kommula Shiva Shankar (3):
  net: implement virtio helper to handle outer nw offset
  virtio_net: enable outer nw header offset support
  vhost/net: enable outer nw header offset support

 drivers/net/virtio_net.c        | 23 +++++++++++++++----
 drivers/vhost/net.c             |  4 ++++
 include/linux/virtio_net.h      | 40 +++++++++++++++++++++++++++++++++
 include/uapi/linux/virtio_net.h |  8 +++++++
 4 files changed, 71 insertions(+), 4 deletions(-)

-- 
2.48.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 net-next  1/3] net: implement virtio helper to handle outer nw offset
  2025-10-08 11:00 [PATCH v2 net-next 0/3] virtio_net: Implement VIRTIO_NET_F_OUT_NET_HEADER from virtio spec 1.4 Kommula Shiva Shankar
@ 2025-10-08 11:00 ` Kommula Shiva Shankar
  2025-10-08 11:00 ` [PATCH v2 net-next 2/3] virtio_net: enable outer nw header offset support Kommula Shiva Shankar
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Kommula Shiva Shankar @ 2025-10-08 11:00 UTC (permalink / raw)
  To: netdev, mst, jasowang, pabeni, xuanzhuo
  Cc: virtualization, parav, jerinj, ndabilpuram, sburla, schalla

virtio specification introduced support for outer network
header offset broadcast.

This patch implements the needed defines and virtio header
parsing capabilities.

Signed-off-by: Kommula Shiva Shankar <kshankar@marvell.com>
---
 include/linux/virtio_net.h      | 40 +++++++++++++++++++++++++++++++++
 include/uapi/linux/virtio_net.h |  8 +++++++
 2 files changed, 48 insertions(+)

diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h
index 20e0584db1dd..7ab872a11a21 100644
--- a/include/linux/virtio_net.h
+++ b/include/linux/virtio_net.h
@@ -374,6 +374,46 @@ static inline int virtio_net_handle_csum_offload(struct sk_buff *skb,
 	return 0;
 }
 
+static inline int
+virtio_net_out_net_header_to_skb(struct sk_buff *skb,
+				 struct virtio_net_hdr_v1_hash_tunnel_out_net_hdr *vhdr,
+				 bool out_net_hdr_negotiated,
+				 bool little_endian)
+{
+	unsigned int out_net_hdr_off;
+
+	if (!out_net_hdr_negotiated)
+		return 0;
+
+	if (vhdr->outer_nh_offset) {
+		out_net_hdr_off = le16_to_cpu(vhdr->outer_nh_offset);
+		skb_set_network_header(skb, out_net_hdr_off);
+	}
+
+	return 0;
+}
+
+static inline int
+virtio_net_out_net_header_from_skb(const struct sk_buff *skb,
+				   struct virtio_net_hdr_v1_hash_tunnel_out_net_hdr *vhdr,
+				   bool out_net_hdr_negotiated,
+				   bool little_endian)
+{
+	unsigned int out_net_hdr_off;
+
+	if (!out_net_hdr_negotiated) {
+		vhdr->outer_nh_offset = 0;
+		return 0;
+	}
+
+	out_net_hdr_off = skb_network_offset(skb);
+	if (out_net_hdr_off && (skb->protocol == htons(ETH_P_IP) ||
+				skb->protocol == htons(ETH_P_IPV6)))
+		vhdr->outer_nh_offset = cpu_to_le16(out_net_hdr_off);
+
+	return 0;
+}
+
 /*
  * vlan_hlen always refers to the outermost MAC header. That also
  * means it refers to the only MAC header, if the packet does not carry
diff --git a/include/uapi/linux/virtio_net.h b/include/uapi/linux/virtio_net.h
index 8bf27ab8bcb4..6032b9e443bb 100644
--- a/include/uapi/linux/virtio_net.h
+++ b/include/uapi/linux/virtio_net.h
@@ -86,6 +86,7 @@
 						  * packets with partial csum
 						  * for the outer header
 						  */
+#define VIRTIO_NET_F_OUT_NET_HEADER 69	/* Outer network header offset */
 
 /* Offloads bits corresponding to VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO{,_CSUM}
  * features
@@ -214,6 +215,13 @@ struct virtio_net_hdr_v1_hash_tunnel {
 	__le16 inner_nh_offset;
 };
 
+/* outer network header */
+struct virtio_net_hdr_v1_hash_tunnel_out_net_hdr {
+	struct virtio_net_hdr_v1_hash_tunnel tnl_hdr;
+	__le16 outer_nh_offset;
+	__u8 padding_reserved_2[6];
+};
+
 #ifndef VIRTIO_NET_NO_LEGACY
 /* This header comes first in the scatter-gather list.
  * For legacy virtio, if VIRTIO_F_ANY_LAYOUT is not negotiated, it must
-- 
2.48.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 net-next  2/3] virtio_net: enable outer nw header offset support
  2025-10-08 11:00 [PATCH v2 net-next 0/3] virtio_net: Implement VIRTIO_NET_F_OUT_NET_HEADER from virtio spec 1.4 Kommula Shiva Shankar
  2025-10-08 11:00 ` [PATCH v2 net-next 1/3] net: implement virtio helper to handle outer nw offset Kommula Shiva Shankar
@ 2025-10-08 11:00 ` Kommula Shiva Shankar
  2025-10-08 11:00 ` [PATCH v2 net-next 3/3] vhost/net: " Kommula Shiva Shankar
  2025-10-08 11:26 ` [PATCH v2 net-next 0/3] virtio_net: Implement VIRTIO_NET_F_OUT_NET_HEADER from virtio spec 1.4 Parav Pandit
  3 siblings, 0 replies; 7+ messages in thread
From: Kommula Shiva Shankar @ 2025-10-08 11:00 UTC (permalink / raw)
  To: netdev, mst, jasowang, pabeni, xuanzhuo
  Cc: virtualization, parav, jerinj, ndabilpuram, sburla, schalla

If outer network header feature is set, update header offset
in ingress and egress path.

If feature is not set, reset header offset to zero.

Signed-off-by: Kommula Shiva Shankar <kshankar@marvell.com>
---
 drivers/net/virtio_net.c | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 7da5a37917e9..0b60cbbb3d33 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -451,6 +451,9 @@ struct virtnet_info {
 
 	bool rx_tnl_csum;
 
+	/* Outer network header support */
+	bool out_net_hdr_negotiated;
+
 	/* Is delayed refill enabled? */
 	bool refill_enabled;
 
@@ -511,6 +514,7 @@ struct virtio_net_common_hdr {
 		struct virtio_net_hdr_mrg_rxbuf	mrg_hdr;
 		struct virtio_net_hdr_v1_hash hash_v1_hdr;
 		struct virtio_net_hdr_v1_hash_tunnel tnl_hdr;
+		struct virtio_net_hdr_v1_hash_tunnel_out_net_hdr out_net_hdr;
 	};
 };
 
@@ -2576,8 +2580,8 @@ static void virtnet_receive_done(struct virtnet_info *vi, struct receive_queue *
 	hdr->hdr.flags = flags;
 	if (virtio_net_handle_csum_offload(skb, &hdr->hdr, vi->rx_tnl_csum)) {
 		net_warn_ratelimited("%s: bad csum: flags: %x, gso_type: %x rx_tnl_csum %d\n",
-				     dev->name, hdr->hdr.flags,
-				     hdr->hdr.gso_type, vi->rx_tnl_csum);
+				dev->name, hdr->hdr.flags,
+				hdr->hdr.gso_type, vi->rx_tnl_csum);
 		goto frame_err;
 	}
 
@@ -2591,6 +2595,8 @@ static void virtnet_receive_done(struct virtnet_info *vi, struct receive_queue *
 		goto frame_err;
 	}
 
+	virtio_net_out_net_header_to_skb(skb, &hdr->out_net_hdr, vi->out_net_hdr_negotiated,
+					 virtio_is_little_endian(vi->vdev));
 	skb_record_rx_queue(skb, vq2rxq(rq->vq));
 	skb->protocol = eth_type_trans(skb, dev);
 	pr_debug("Receiving skb proto 0x%04x len %i type %i\n",
@@ -3317,6 +3323,9 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb, bool orphan)
 	else
 		hdr = &skb_vnet_common_hdr(skb)->tnl_hdr;
 
+	virtio_net_out_net_header_from_skb(skb, &skb_vnet_common_hdr(skb)->out_net_hdr,
+					   vi->out_net_hdr_negotiated,
+					   virtio_is_little_endian(vi->vdev));
 	if (virtio_net_hdr_tnl_from_skb(skb, hdr, vi->tx_tnl,
 					virtio_is_little_endian(vi->vdev), 0))
 		return -EPROTO;
@@ -6915,8 +6924,10 @@ static int virtnet_probe(struct virtio_device *vdev)
 		dev->xdp_metadata_ops = &virtnet_xdp_metadata_ops;
 	}
 
-	if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_UDP_TUNNEL_GSO) ||
-	    virtio_has_feature(vdev, VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO))
+	if (virtio_has_feature(vdev, VIRTIO_NET_F_OUT_NET_HEADER))
+		vi->hdr_len = sizeof(struct virtio_net_hdr_v1_hash_tunnel_out_net_hdr);
+	else if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_UDP_TUNNEL_GSO) ||
+		 virtio_has_feature(vdev, VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO))
 		vi->hdr_len = sizeof(struct virtio_net_hdr_v1_hash_tunnel);
 	else if (vi->has_rss_hash_report)
 		vi->hdr_len = sizeof(struct virtio_net_hdr_v1_hash);
@@ -6933,6 +6944,9 @@ static int virtnet_probe(struct virtio_device *vdev)
 	if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO))
 		vi->tx_tnl = true;
 
+	if (virtio_has_feature(vdev, VIRTIO_NET_F_OUT_NET_HEADER))
+		vi->out_net_hdr_negotiated = true;
+
 	if (virtio_has_feature(vdev, VIRTIO_F_ANY_LAYOUT) ||
 	    virtio_has_feature(vdev, VIRTIO_F_VERSION_1))
 		vi->any_header_sg = true;
@@ -7247,6 +7261,7 @@ static unsigned int features[] = {
 	VIRTIO_NET_F_GUEST_UDP_TUNNEL_GSO_CSUM,
 	VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO,
 	VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO_CSUM,
+	VIRTIO_NET_F_OUT_NET_HEADER,
 };
 
 static unsigned int features_legacy[] = {
-- 
2.48.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 net-next  3/3] vhost/net: enable outer nw header offset support
  2025-10-08 11:00 [PATCH v2 net-next 0/3] virtio_net: Implement VIRTIO_NET_F_OUT_NET_HEADER from virtio spec 1.4 Kommula Shiva Shankar
  2025-10-08 11:00 ` [PATCH v2 net-next 1/3] net: implement virtio helper to handle outer nw offset Kommula Shiva Shankar
  2025-10-08 11:00 ` [PATCH v2 net-next 2/3] virtio_net: enable outer nw header offset support Kommula Shiva Shankar
@ 2025-10-08 11:00 ` Kommula Shiva Shankar
  2025-10-09  9:44   ` Paolo Abeni
  2025-10-09 10:31   ` Michael S. Tsirkin
  2025-10-08 11:26 ` [PATCH v2 net-next 0/3] virtio_net: Implement VIRTIO_NET_F_OUT_NET_HEADER from virtio spec 1.4 Parav Pandit
  3 siblings, 2 replies; 7+ messages in thread
From: Kommula Shiva Shankar @ 2025-10-08 11:00 UTC (permalink / raw)
  To: netdev, mst, jasowang, pabeni, xuanzhuo
  Cc: virtualization, parav, jerinj, ndabilpuram, sburla, schalla

apprise vhost net about the virtio net header size.

Signed-off-by: Kommula Shiva Shankar <kshankar@marvell.com>
---
 drivers/vhost/net.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index 35ded4330431..8d055405746d 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -78,6 +78,7 @@ static const u64 vhost_net_features[VIRTIO_FEATURES_DWORDS] = {
 	(1ULL << VIRTIO_F_IN_ORDER),
 	VIRTIO_BIT(VIRTIO_NET_F_GUEST_UDP_TUNNEL_GSO) |
 	VIRTIO_BIT(VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO),
+	VIRTIO_BIT(VIRTIO_NET_F_OUT_NET_HEADER),
 };
 
 enum {
@@ -1655,6 +1656,9 @@ static int vhost_net_set_features(struct vhost_net *n, const u64 *features)
 		  sizeof(struct virtio_net_hdr_mrg_rxbuf) :
 		  sizeof(struct virtio_net_hdr);
 
+	if (virtio_features_test_bit(features,
+				     VIRTIO_NET_F_OUT_NET_HEADER))
+		hdr_len = sizeof(struct virtio_net_hdr_v1_hash_tunnel_out_net_hdr);
 	if (virtio_features_test_bit(features,
 				     VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO) ||
 	    virtio_features_test_bit(features,
-- 
2.48.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* RE: [PATCH v2 net-next  0/3]  virtio_net: Implement VIRTIO_NET_F_OUT_NET_HEADER from virtio spec 1.4
  2025-10-08 11:00 [PATCH v2 net-next 0/3] virtio_net: Implement VIRTIO_NET_F_OUT_NET_HEADER from virtio spec 1.4 Kommula Shiva Shankar
                   ` (2 preceding siblings ...)
  2025-10-08 11:00 ` [PATCH v2 net-next 3/3] vhost/net: " Kommula Shiva Shankar
@ 2025-10-08 11:26 ` Parav Pandit
  3 siblings, 0 replies; 7+ messages in thread
From: Parav Pandit @ 2025-10-08 11:26 UTC (permalink / raw)
  To: Kommula Shiva Shankar, netdev@vger.kernel.org, mst@redhat.com,
	jasowang@redhat.com, pabeni@redhat.com,
	xuanzhuo@linux.alibaba.com
  Cc: virtualization@lists.linux.dev, jerinj@marvell.com,
	ndabilpuram@marvell.com, sburla@marvell.com, schalla@marvell.com



> From: Kommula Shiva Shankar <kshankar@marvell.com>
> Sent: 08 October 2025 04:30 PM
> To: netdev@vger.kernel.org; mst@redhat.com; 

Net-next is closed for submissions.
Expected to open on 13th Oct as listed at [1].
Please repost the net-next patches after that.
https://patchwork.hopto.org/net-next.html

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 net-next 3/3] vhost/net: enable outer nw header offset support
  2025-10-08 11:00 ` [PATCH v2 net-next 3/3] vhost/net: " Kommula Shiva Shankar
@ 2025-10-09  9:44   ` Paolo Abeni
  2025-10-09 10:31   ` Michael S. Tsirkin
  1 sibling, 0 replies; 7+ messages in thread
From: Paolo Abeni @ 2025-10-09  9:44 UTC (permalink / raw)
  To: Kommula Shiva Shankar, netdev, mst, jasowang, xuanzhuo
  Cc: virtualization, parav, jerinj, ndabilpuram, sburla, schalla

On 10/8/25 1:00 PM, Kommula Shiva Shankar wrote:
> apprise vhost net about the virtio net header size.
> 
> Signed-off-by: Kommula Shiva Shankar <kshankar@marvell.com>
> ---
>  drivers/vhost/net.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
> index 35ded4330431..8d055405746d 100644
> --- a/drivers/vhost/net.c
> +++ b/drivers/vhost/net.c
> @@ -78,6 +78,7 @@ static const u64 vhost_net_features[VIRTIO_FEATURES_DWORDS] = {
>  	(1ULL << VIRTIO_F_IN_ORDER),
>  	VIRTIO_BIT(VIRTIO_NET_F_GUEST_UDP_TUNNEL_GSO) |
>  	VIRTIO_BIT(VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO),
> +	VIRTIO_BIT(VIRTIO_NET_F_OUT_NET_HEADER),

I guess this patch needs better testing; the above triggers a compile
warning:

./drivers/vhost/net.c:81:2: warning: excess elements in array
initializer [-Wexcess-initializers]
   81 |         VIRTIO_BIT(VIRTIO_NET_F_OUT_NET_HEADER),

which in turns hints the feature is not actually used/available. The
chunk should be:

  	VIRTIO_BIT(VIRTIO_NET_F_GUEST_UDP_TUNNEL_GSO) |
  	VIRTIO_BIT(VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO)  |
	VIRTIO_BIT(VIRTIO_NET_F_OUT_NET_HEADER),

/P


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 net-next  3/3] vhost/net: enable outer nw header offset support
  2025-10-08 11:00 ` [PATCH v2 net-next 3/3] vhost/net: " Kommula Shiva Shankar
  2025-10-09  9:44   ` Paolo Abeni
@ 2025-10-09 10:31   ` Michael S. Tsirkin
  1 sibling, 0 replies; 7+ messages in thread
From: Michael S. Tsirkin @ 2025-10-09 10:31 UTC (permalink / raw)
  To: Kommula Shiva Shankar
  Cc: netdev, jasowang, pabeni, xuanzhuo, virtualization, parav, jerinj,
	ndabilpuram, sburla, schalla

On Wed, Oct 08, 2025 at 04:30:04PM +0530, Kommula Shiva Shankar wrote:
> apprise vhost net about the virtio net header size.
> 
> Signed-off-by: Kommula Shiva Shankar <kshankar@marvell.com>
> ---
>  drivers/vhost/net.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
> index 35ded4330431..8d055405746d 100644
> --- a/drivers/vhost/net.c
> +++ b/drivers/vhost/net.c
> @@ -78,6 +78,7 @@ static const u64 vhost_net_features[VIRTIO_FEATURES_DWORDS] = {
>  	(1ULL << VIRTIO_F_IN_ORDER),
>  	VIRTIO_BIT(VIRTIO_NET_F_GUEST_UDP_TUNNEL_GSO) |
>  	VIRTIO_BIT(VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO),
> +	VIRTIO_BIT(VIRTIO_NET_F_OUT_NET_HEADER),
>  };
>  
>  enum {


How does this even work?
VIRTIO_FEATURES_DWORDS is 2, you can't really
add more elements.

Pls include info on testing done in your next
submission.


> @@ -1655,6 +1656,9 @@ static int vhost_net_set_features(struct vhost_net *n, const u64 *features)
>  		  sizeof(struct virtio_net_hdr_mrg_rxbuf) :
>  		  sizeof(struct virtio_net_hdr);
>  
> +	if (virtio_features_test_bit(features,
> +				     VIRTIO_NET_F_OUT_NET_HEADER))
> +		hdr_len = sizeof(struct virtio_net_hdr_v1_hash_tunnel_out_net_hdr);
>  	if (virtio_features_test_bit(features,
>  				     VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO) ||
>  	    virtio_features_test_bit(features,
> -- 
> 2.48.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-10-09 10:31 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-08 11:00 [PATCH v2 net-next 0/3] virtio_net: Implement VIRTIO_NET_F_OUT_NET_HEADER from virtio spec 1.4 Kommula Shiva Shankar
2025-10-08 11:00 ` [PATCH v2 net-next 1/3] net: implement virtio helper to handle outer nw offset Kommula Shiva Shankar
2025-10-08 11:00 ` [PATCH v2 net-next 2/3] virtio_net: enable outer nw header offset support Kommula Shiva Shankar
2025-10-08 11:00 ` [PATCH v2 net-next 3/3] vhost/net: " Kommula Shiva Shankar
2025-10-09  9:44   ` Paolo Abeni
2025-10-09 10:31   ` Michael S. Tsirkin
2025-10-08 11:26 ` [PATCH v2 net-next 0/3] virtio_net: Implement VIRTIO_NET_F_OUT_NET_HEADER from virtio spec 1.4 Parav Pandit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).