diff options
author | Mohsin Kazmi <sykazmi@cisco.com> | 2019-12-26 20:42:18 +0100 |
---|---|---|
committer | Andrew Yourtchenko <ayourtch@gmail.com> | 2020-01-08 17:09:45 +0000 |
commit | affc5f6d3d3c17eb8ae1cf7b04a1a1e638516ca4 (patch) | |
tree | f0a0558789c98da04a531caeea302d12e8d3098f /src/vnet/devices/virtio | |
parent | ba0061feba13a11fc1c1af551bc4c26eccbd2f2c (diff) |
virtio: fix ip4 checksum offload
Type: fix
Change-Id: I08747ac308e5c1768a3a6aa5f83a016dc0274a1c
Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
Diffstat (limited to 'src/vnet/devices/virtio')
-rw-r--r-- | src/vnet/devices/virtio/vhost_user_output.c | 16 |
1 files 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 <vnet/devices/virtio/vhost_user.h> #include <vnet/devices/virtio/vhost_user_inline.h> +#include <vnet/gso/gso.h> /* * 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); } |