From affc5f6d3d3c17eb8ae1cf7b04a1a1e638516ca4 Mon Sep 17 00:00:00 2001 From: Mohsin Kazmi Date: Thu, 26 Dec 2019 20:42:18 +0100 Subject: virtio: fix ip4 checksum offload Type: fix Change-Id: I08747ac308e5c1768a3a6aa5f83a016dc0274a1c Signed-off-by: Mohsin Kazmi --- src/vnet/devices/virtio/vhost_user_output.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/vnet/devices/virtio/vhost_user_output.c b/src/vnet/devices/virtio/vhost_user_output.c index 5bd60d4e96e..a47583d64fa 100644 --- a/src/vnet/devices/virtio/vhost_user_output.c +++ b/src/vnet/devices/virtio/vhost_user_output.c @@ -44,6 +44,7 @@ #include #include +#include /* * On the transmit side, we keep processing the buffers from vlib in the while * loop and prepare the copy order to be executed later. However, the static @@ -235,17 +236,28 @@ static_always_inline void vhost_user_handle_tx_offload (vhost_user_intf_t * vui, vlib_buffer_t * b, virtio_net_hdr_t * hdr) { + gso_header_offset_t gho = + vnet_gso_header_offset_parser (b, b->flags & VNET_BUFFER_F_IS_IP6); + if (b->flags & VNET_BUFFER_F_OFFLOAD_IP_CKSUM) + { + ip4_header_t *ip4; + + ip4 = + (ip4_header_t *) (vlib_buffer_get_current (b) + gho.l3_hdr_offset); + ip4->checksum = ip4_header_checksum (ip4); + } + /* checksum offload */ if (b->flags & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM) { hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM; - hdr->csum_start = vnet_buffer (b)->l4_hdr_offset; + hdr->csum_start = gho.l4_hdr_offset; hdr->csum_offset = offsetof (udp_header_t, checksum); } else if (b->flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM) { hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM; - hdr->csum_start = vnet_buffer (b)->l4_hdr_offset; + hdr->csum_start = gho.l4_hdr_offset; hdr->csum_offset = offsetof (tcp_header_t, checksum); } -- cgit 1.2.3-korg