Print this page
16884 viona TSO should better handle csum offloads

*** 34,43 **** --- 34,44 ---- * 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,394 **** /* * 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 && ftype == ETHERTYPE_IP) { uint16_t *cksump; uint32_t cksum; ipaddr_t src = ipha->ipha_src; ipaddr_t dst = ipha->ipha_dst; --- 383,395 ---- /* * We ignore hdr_len because the spec says it can't be * trusted. Besides, our own stack will determine the header * boundary. */ ! 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,418 **** --- 410,420 ---- 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