[dpdk-dev] [PATCH v2 09/12] virtio: add Rx checksum offload support

Maxime Coquelin maxime.coquelin at redhat.com
Tue Oct 11 16:36:10 CEST 2016



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?

Maxime
>
> Regards,
> Olivier


More information about the dev mailing list