Skip to content

Commit 564e167

Browse files
sluong99Dave Barach
authored andcommitted
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 <[email protected]> Change-Id: I6e699d7a40b7887ff149cd8f77e8f0fa9374ef19
1 parent 174959c commit 564e167

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

src/vnet/devices/virtio/vhost_user_output.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ VNET_DEVICE_CLASS_TX_FN (vhost_user_device_class) (vlib_main_t * vm,
307307
u8 retry = 8;
308308
u16 copy_len;
309309
u16 tx_headers_len;
310+
u32 or_flags;
310311

311312
if (PREDICT_FALSE (!vui->admin_up))
312313
{
@@ -400,8 +401,13 @@ VNET_DEVICE_CLASS_TX_FN (vhost_user_device_class) (vlib_main_t * vm,
400401
hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_NONE;
401402
hdr->num_buffers = 1; //This is local, no need to check
402403

403-
/* Guest supports csum offload? */
404-
if (vui->features & (1ULL << FEAT_VIRTIO_NET_F_GUEST_CSUM))
404+
or_flags = (b0->flags & VNET_BUFFER_F_OFFLOAD_IP_CKSUM) ||
405+
(b0->flags & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM) ||
406+
(b0->flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM);
407+
408+
/* Guest supports csum offload and buffer requires checksum offload? */
409+
if (or_flags
410+
&& (vui->features & (1ULL << FEAT_VIRTIO_NET_F_GUEST_CSUM)))
405411
vhost_user_handle_tx_offload (vui, b0, &hdr->hdr);
406412

407413
// Prepare a copy order executed later for the header

0 commit comments

Comments
 (0)