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

Wang, Xiao W xiao.w.wang at intel.com
Wed Jul 27 11:52:42 CEST 2016



> -----Original Message-----
> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Olivier Matz
> Sent: Thursday, July 21, 2016 4:08 PM
> To: dev at dpdk.org; yuanhan.liu at linux.intel.com; Ananyev, Konstantin
> <konstantin.ananyev at intel.com>
> Cc: Chandran, Sugesh <sugesh.chandran at intel.com>; Richardson, Bruce
> <bruce.richardson at intel.com>; Tan, Jianfeng <jianfeng.tan at intel.com>; Zhang,
> Helin <helin.zhang at intel.com>; adrien.mazarguil at 6wind.com
> Subject: [dpdk-dev] [PATCH 09/12] virtio: add Rx checksum offload support
> 
> Signed-off-by: Olivier Matz <olivier.matz at 6wind.com>
> ---
>  drivers/net/virtio/virtio_ethdev.c | 14 ++++----
> drivers/net/virtio/virtio_ethdev.h |  2 +-
>  drivers/net/virtio/virtio_rxtx.c   | 66
> ++++++++++++++++++++++++++++++++++++++
>  drivers/net/virtio/virtqueue.h     |  1 +
>  4 files changed, 75 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
> index 02eae94..c0f1f21 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);
> 

....

> diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c
> index 9aba044..a18798f 100644
> --- a/drivers/net/virtio/virtio_rxtx.c
> +++ b/drivers/net/virtio/virtio_rxtx.c
> @@ -613,6 +613,54 @@ 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_mbuf_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_pktmbuf_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_pktmbuf_cksum(m, hdr->csum_start,
> +				rte_pktmbuf_pkt_len(m) - hdr->csum_start);

1. When translate raw_cksum to the final cksum, it should be like "(cksum == 0xffff) ? cksum : ~cksum".
2. How about making this function inline as it's called in fast path?

Best Regards,
Xiao


More information about the dev mailing list