[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CACGkMEvUMq7xgOndvWUYU=BZL=ZZD1q_LRy=5YFL7k80cYBRRg@mail.gmail.com>
Date: Wed, 24 Sep 2025 08:51:29 +0800
From: Jason Wang <jasowang@...hat.com>
To: Kommula Shiva Shankar <kshankar@...vell.com>
Cc: netdev@...r.kernel.org, mst@...hat.com, pabeni@...hat.com,
xuanzhuo@...ux.alibaba.com, virtualization@...ts.linux.dev, parav@...dia.com,
jerinj@...vell.com, ndabilpuram@...vell.com, sburla@...vell.com,
schalla@...vell.com
Subject: Re: [PATCH v1 net-next 1/3] net: implement virtio helper to handle
outer nw offset
On Wed, Sep 24, 2025 at 4:23 AM Kommula Shiva Shankar
<kshankar@...vell.com> wrote:
>
> 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@...vell.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..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.
Thanks
Powered by blists - more mailing lists