On 10/11/2016 04:36 PM, Maxime Coquelin wrote: > > > On 10/11/2016 04:29 PM, Olivier MATZ wrote: >> >> >> On 10/11/2016 04:04 PM, Maxime Coquelin wrote: >>>> +/* Optionally fill offload information in structure */ >>>> +static int >>>> +virtio_rx_offload(struct rte_mbuf *m, struct virtio_net_hdr *hdr) >>>> +{ >>>> + struct rte_net_hdr_lens hdr_lens; >>>> + uint32_t hdrlen, ptype; >>>> + int l4_supported = 0; >>>> + >>>> + /* nothing to do */ >>>> + if (hdr->flags == 0 && hdr->gso_type == VIRTIO_NET_HDR_GSO_NONE) >>>> + return 0; >>>> + >>>> + 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, off; >>>> + >>>> + csum = rte_raw_cksum_mbuf(m, hdr->csum_start, >>>> + rte_pktmbuf_pkt_len(m) - hdr->csum_start); >>>> + if (csum != 0xffff) >>> Why don't we do the 1-complement if 0xffff? >> >> This was modified after a comment from Xiao. >> >> In checksum arithmetic (ones' complement), there are 2 equivalent ways >> to say the checksum is 0: 0xffff (0-), and 0x0000 (0+). >> Some protocols like UDP use this to differentiate between 0xffff (packet >> checksum is 0) and 0x0000 (packet checksum is not calculated). >> >> Here, we want to avoid to set a checksum to 0, in case it would mean no >> checksum for UDP packets. Instead, it is set to 0xffff, which is also a >> valid checksum for this packet. > > Ha ok, I wasn't aware of this. > Thanks for the explanation! > > Maybe not a big deal, but we could add likely around the test?
Yep, good idea. Thanks! Olivier