[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250923202258.2738717-3-kshankar@marvell.com>
Date: Wed, 24 Sep 2025 01:52:57 +0530
From: Kommula Shiva Shankar <kshankar@...vell.com>
To: <netdev@...r.kernel.org>, <mst@...hat.com>, <jasowang@...hat.com>,
<pabeni@...hat.com>, <xuanzhuo@...ux.alibaba.com>
CC: <virtualization@...ts.linux.dev>, <parav@...dia.com>, <jerinj@...vell.com>,
<ndabilpuram@...vell.com>, <sburla@...vell.com>, <schalla@...vell.com>
Subject: [PATCH v1 net-next 2/3] virtio_net: enable outer nw header offset support.
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@...vell.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
Powered by blists - more mailing lists