diff options
author | Steven Luong <sluong@cisco.com> | 2020-01-30 15:18:45 -0800 |
---|---|---|
committer | Andrew Yourtchenko <ayourtch@gmail.com> | 2020-08-12 15:59:46 +0000 |
commit | 80fab46b81778dc1083101e9382da2c56b62fa0d (patch) | |
tree | 2ed3963426f0f79bcffcb2a9c8f55eb811024e68 /src/vnet/devices | |
parent | b9536214058a3b736ef3e739fb070961104e8f07 (diff) |
virtio: vhost gso is broken in some topology
Recent modification added a call to vnet_gso_header_offset_parser in the
beginning of vhost_user_handle_tx_offload. The former routine may set tcp or
udp->checksum to 0. While it is appropriate to set it to 0 for the GSO packet,
it is broken and causes checksum error if the aformentiooned routine is called
by a non-GSO packet. The fix is to not call vhost_user_handle_tx_offload
if the buffer does not indicate checksum offload is needed.
Type: fix
Signed-off-by: Steven Luong <sluong@cisco.com>
Change-Id: I6e699d7a40b7887ff149cd8f77e8f0fa9374ef19
(cherry picked from commit 564e1672917e205d7ae79525bb937df18f8d764b)
Diffstat (limited to 'src/vnet/devices')
-rw-r--r-- | src/vnet/devices/virtio/vhost_user_output.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/vnet/devices/virtio/vhost_user_output.c b/src/vnet/devices/virtio/vhost_user_output.c index 9b9f763b92f..4f72d00161e 100644 --- a/src/vnet/devices/virtio/vhost_user_output.c +++ b/src/vnet/devices/virtio/vhost_user_output.c @@ -295,6 +295,7 @@ VNET_DEVICE_CLASS_TX_FN (vhost_user_device_class) (vlib_main_t * vm, u8 retry = 8; u16 copy_len; u16 tx_headers_len; + u32 or_flags; if (PREDICT_FALSE (!vui->admin_up)) { @@ -388,8 +389,13 @@ retry: hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_NONE; hdr->num_buffers = 1; //This is local, no need to check - /* Guest supports csum offload? */ - if (vui->features & (1ULL << FEAT_VIRTIO_NET_F_GUEST_CSUM)) + or_flags = (b0->flags & VNET_BUFFER_F_OFFLOAD_IP_CKSUM) || + (b0->flags & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM) || + (b0->flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM); + + /* Guest supports csum offload and buffer requires checksum offload? */ + if (or_flags + && (vui->features & (1ULL << FEAT_VIRTIO_NET_F_GUEST_CSUM))) vhost_user_handle_tx_offload (vui, b0, &hdr->hdr); // Prepare a copy order executed later for the header |