Hi David, On Thu, Apr 01, 2021 at 11:52:43AM +0200, David Marchand wrote: > The vhost library current configures Tx offloading (PKT_TX_*) on any > packet received from a guest virtio device which asks for some offloading. > > This is problematic, as Tx offloading is something that the application > must ask for: the application needs to configure devices > to support every used offloads (ip, tcp checksumming, tso..), and the > various l2/l3/l4 lengths must be set following any processing that > happened in the application itself. > > On the other hand, the received packets are not marked wrt current > packet l3/l4 checksumming info. > > Copy virtio rx processing to fix those offload flags. > > The vhost example needs a reworking as it was built with the assumption > that mbuf TSO configuration is set up by the vhost library. > This is not done in this patch for now so TSO activation is forcibly > refused. > > Fixes: 859b480d5afd ("vhost: add guest offload setting") > > Signed-off-by: David Marchand <david.march...@redhat.com> > ---
Reviewed-by: Olivier Matz <olivier.m...@6wind.com> LGTM, just one little comment below. <...> > + m->ol_flags |= PKT_RX_IP_CKSUM_UNKNOWN; > + > + ptype = rte_net_get_ptype(m, &hdr_lens, RTE_PTYPE_ALL_MASK); > + m->packet_type = ptype; > + if ((ptype & RTE_PTYPE_L4_MASK) == RTE_PTYPE_L4_TCP || > + (ptype & RTE_PTYPE_L4_MASK) == RTE_PTYPE_L4_UDP || > + (ptype & RTE_PTYPE_L4_MASK) == RTE_PTYPE_L4_SCTP) > + l4_supported = 1; > + > + if (hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) { > + hdrlen = hdr_lens.l2_len + hdr_lens.l3_len + hdr_lens.l4_len; > + if (hdr->csum_start <= hdrlen && l4_supported) { > + m->ol_flags |= PKT_RX_L4_CKSUM_NONE; > + } else { > + /* Unknown proto or tunnel, do sw cksum. We can assume > + * the cksum field is in the first segment since the > + * buffers we provided to the host are large enough. > + * In case of SCTP, this will be wrong since it's a CRC > + * but there's nothing we can do. > + */ > + uint16_t csum = 0, off; > + > + if (rte_raw_cksum_mbuf(m, hdr->csum_start, > + rte_pktmbuf_pkt_len(m) - hdr->csum_start, > + &csum) < 0) > + return -EINVAL; > + if (likely(csum != 0xffff)) > + csum = ~csum; I was trying to remember the reason for this last test (which is also present in net/virtio). If this is a UDP checksum (on top of an unrecognized tunnel), it's indeed needed to do that, because we don't want to set the checksum to 0 in the packet (which means "no checksum" for UDPv4, or is fordidden for UDPv6). If this is something else than UDP, it shouldn't hurt to have a 0xffff in the packet instead of 0. Maybe it deserves a comment here, like: /* avoid 0 checksum for UDP, shouldn't hurt for other protocols */ What do you think?