> -----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

Reply via email to