From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 56B0C6A95 for ; Tue, 11 Oct 2016 16:04:14 +0200 (CEST) Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B2DA58E008; Tue, 11 Oct 2016 14:04:13 +0000 (UTC) Received: from [10.36.6.57] (vpn1-6-57.ams2.redhat.com [10.36.6.57]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u9BE475l031786 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 11 Oct 2016 10:04:09 -0400 To: Olivier Matz , dev@dpdk.org, yuanhan.liu@linux.intel.com References: <1469088510-7552-1-git-send-email-olivier.matz@6wind.com> <1475485223-30566-1-git-send-email-olivier.matz@6wind.com> <1475485223-30566-10-git-send-email-olivier.matz@6wind.com> Cc: konstantin.ananyev@intel.com, sugesh.chandran@intel.com, bruce.richardson@intel.com, jianfeng.tan@intel.com, helin.zhang@intel.com, adrien.mazarguil@6wind.com, stephen@networkplumber.org, dprovan@bivio.net, xiao.w.wang@intel.com From: Maxime Coquelin Message-ID: <9a1ef865-7bff-33cd-5d6e-01ff9e4b1b5a@redhat.com> Date: Tue, 11 Oct 2016 16:04:07 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <1475485223-30566-10-git-send-email-olivier.matz@6wind.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 11 Oct 2016 14:04:13 +0000 (UTC) Subject: Re: [dpdk-dev] [PATCH v2 09/12] virtio: add Rx checksum offload support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 11 Oct 2016 14:04:14 -0000 On 10/03/2016 11:00 AM, Olivier Matz wrote: > Signed-off-by: Olivier Matz > --- > drivers/net/virtio/virtio_ethdev.c | 14 ++++---- > drivers/net/virtio/virtio_ethdev.h | 2 +- > drivers/net/virtio/virtio_rxtx.c | 69 ++++++++++++++++++++++++++++++++++++++ > drivers/net/virtio/virtqueue.h | 1 + > 4 files changed, 78 insertions(+), 8 deletions(-) > > diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c > index fa56032..43cb096 100644 > --- a/drivers/net/virtio/virtio_ethdev.c > +++ b/drivers/net/virtio/virtio_ethdev.c > @@ -1262,7 +1262,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) > eth_dev->data->dev_flags = dev_flags; > > /* reset device and negotiate default features */ > - ret = virtio_init_device(eth_dev, VIRTIO_PMD_GUEST_FEATURES); > + ret = virtio_init_device(eth_dev, VIRTIO_PMD_DEFAULT_GUEST_FEATURES); > if (ret < 0) > return ret; > > @@ -1351,13 +1351,10 @@ virtio_dev_configure(struct rte_eth_dev *dev) > int ret; > > PMD_INIT_LOG(DEBUG, "configure"); > + req_features = VIRTIO_PMD_DEFAULT_GUEST_FEATURES; > + if (rxmode->hw_ip_checksum) > + req_features |= (1ULL << VIRTIO_NET_F_GUEST_CSUM); > > - if (rxmode->hw_ip_checksum) { > - PMD_DRV_LOG(ERR, "HW IP checksum not supported"); > - return -EINVAL; > - } > - > - req_features = VIRTIO_PMD_GUEST_FEATURES; > /* if request features changed, reinit the device */ > if (req_features != hw->req_guest_features) { > ret = virtio_init_device(dev, req_features); > @@ -1578,6 +1575,9 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) > dev_info->default_txconf = (struct rte_eth_txconf) { > .txq_flags = ETH_TXQ_FLAGS_NOOFFLOADS > }; > + dev_info->rx_offload_capa = > + DEV_RX_OFFLOAD_TCP_CKSUM | > + DEV_RX_OFFLOAD_UDP_CKSUM; > } > > /* > diff --git a/drivers/net/virtio/virtio_ethdev.h b/drivers/net/virtio/virtio_ethdev.h > index 5d5e788..2fc9218 100644 > --- a/drivers/net/virtio/virtio_ethdev.h > +++ b/drivers/net/virtio/virtio_ethdev.h > @@ -54,7 +54,7 @@ > #define VIRTIO_MAX_RX_PKTLEN 9728 > > /* Features desired/implemented by this driver. */ > -#define VIRTIO_PMD_GUEST_FEATURES \ > +#define VIRTIO_PMD_DEFAULT_GUEST_FEATURES \ > (1u << VIRTIO_NET_F_MAC | \ > 1u << VIRTIO_NET_F_STATUS | \ > 1u << VIRTIO_NET_F_MQ | \ > diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c > index 724517e..eda678a 100644 > --- a/drivers/net/virtio/virtio_rxtx.c > +++ b/drivers/net/virtio/virtio_rxtx.c > @@ -50,6 +50,7 @@ > #include > #include > #include > +#include > > #include "virtio_logs.h" > #include "virtio_ethdev.h" > @@ -627,6 +628,56 @@ virtio_update_packet_stats(struct virtnet_stats *stats, struct rte_mbuf *mbuf) > } > } > > +/* 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? > + csum = ~csum; > + off = hdr->csum_offset + hdr->csum_start; > + if (rte_pktmbuf_data_len(m) >= off + 1) > + *rte_pktmbuf_mtod_offset(m, uint16_t *, > + off) = csum; > + } > + } else if (hdr->flags & VIRTIO_NET_HDR_F_DATA_VALID && l4_supported) { > + m->ol_flags |= PKT_RX_L4_CKSUM_GOOD; > + } > + > + return 0; > +} > +