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