virtio: checksum error reported for ip6 traffic with GSO enable 99/29399/2
authorSteven Luong <sluong@cisco.com>
Mon, 12 Oct 2020 17:43:28 +0000 (10:43 -0700)
committerDamjan Marion <dmarion@me.com>
Thu, 22 Oct 2020 21:30:24 +0000 (21:30 +0000)
When GSO is enabled, vhost clears the checksum field prior to transmitting
the packet. Some newer kernel version does not like that and complains
about checksum error. This was seen with ip6 traffic.

Type: fix

Signed-off-by: Steven Luong <sluong@cisco.com>
Change-Id: I7c6f2a6148f4a30107bfa8b078f5990e64300cf1

src/vnet/devices/virtio/vhost_user_input.c
src/vnet/devices/virtio/vhost_user_output.c

index 8d0ee4a..001ef07 100644 (file)
@@ -292,15 +292,11 @@ vhost_user_handle_rx_offload (vlib_buffer_t * b0, u8 * b0_data,
       tcp_header_t *tcp = (tcp_header_t *)
        (b0_data + vnet_buffer (b0)->l4_hdr_offset);
       l4_hdr_sz = tcp_header_bytes (tcp);
-      tcp->checksum = 0;
       b0->flags |= VNET_BUFFER_F_OFFLOAD_TCP_CKSUM;
     }
   else if (l4_proto == IP_PROTOCOL_UDP)
     {
-      udp_header_t *udp =
-       (udp_header_t *) (b0_data + vnet_buffer (b0)->l4_hdr_offset);
-      l4_hdr_sz = sizeof (*udp);
-      udp->checksum = 0;
+      l4_hdr_sz = sizeof (udp_header_t);
       b0->flags |= VNET_BUFFER_F_OFFLOAD_UDP_CKSUM;
     }
 
index 8ac9d0b..1f3813d 100644 (file)
@@ -256,18 +256,12 @@ vhost_user_handle_tx_offload (vhost_user_intf_t * vui, vlib_buffer_t * b,
       hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM;
       hdr->csum_start = gho.l4_hdr_offset;
       hdr->csum_offset = offsetof (udp_header_t, checksum);
-      udp_header_t *udp =
-       (udp_header_t *) (vlib_buffer_get_current (b) + gho.l4_hdr_offset);
-      udp->checksum = 0;
     }
   else if (b->flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM)
     {
       hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM;
       hdr->csum_start = gho.l4_hdr_offset;
       hdr->csum_offset = offsetof (tcp_header_t, checksum);
-      tcp_header_t *tcp =
-       (tcp_header_t *) (vlib_buffer_get_current (b) + gho.l4_hdr_offset);
-      tcp->checksum = 0;
     }
 
   /* GSO offload */