Thread (9 messages) 9 messages, 3 authors, 2025-10-03

Re: [PATCH v1 net-next 1/3] net: implement virtio helper to handle outer nw offset

From: Jason Wang <hidden>
Date: 2025-09-24 01:12:10
Also in: virtualization

On Wed, Sep 24, 2025 at 8:51 AM Jason Wang [off-list ref] wrote:
On Wed, Sep 24, 2025 at 4:23 AM Kommula Shiva Shankar
[off-list ref] wrote:
quoted
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 <redacted>
---
 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..e6153e9106d3 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 = __virtio16_to_cpu(little_endian, 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))
+               vhdr->outer_nh_offset = __cpu_to_virtio16(little_endian,
+                                                         out_net_hdr_off);
I'd expect this to work for IPV6 as well.
Or why it only works for IP/IPV6.
Thanks
Thanks
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help