Print this page
16884 viona TSO should better handle csum offloads
@@ -34,10 +34,11 @@
* http://www.illumos.org/license/CDDL.
*
* Copyright 2015 Pluribus Networks Inc.
* Copyright 2019 Joyent, Inc.
* Copyright 2024 Oxide Computer Company
+ * Copyright 2024 MNX Cloud, Inc.
*/
#include <sys/types.h>
#include <sys/smt.h>
@@ -382,13 +383,13 @@
/*
* We ignore hdr_len because the spec says it can't be
* trusted. Besides, our own stack will determine the header
* boundary.
*/
- if ((link->l_cap_csum & HCKSUM_INET_PARTIAL) != 0 &&
- (hdr->vrh_gso_type & VIRTIO_NET_HDR_GSO_TCPV4) != 0 &&
+ if ((hdr->vrh_gso_type & VIRTIO_NET_HDR_GSO_TCPV4) != 0 &&
ftype == ETHERTYPE_IP) {
+ if ((link->l_cap_csum & HCKSUM_INET_PARTIAL) != 0) {
uint16_t *cksump;
uint32_t cksum;
ipaddr_t src = ipha->ipha_src;
ipaddr_t dst = ipha->ipha_dst;
@@ -409,10 +410,11 @@
cksum = IP_TCP_CSUM_COMP;
cksum += (dst >> 16) + (dst & 0xFFFF) +
(src >> 16) + (src & 0xFFFF);
cksum = (cksum & 0xFFFF) + (cksum >> 16);
*(cksump) = (cksum & 0xFFFF) + (cksum >> 16);
+ }
/*
* Since viona is a "legacy device", the data stored
* by the driver will be in the guest's native endian
* format (see sections 2.4.3 and 5.1.6.1 of the