Hi Olivier,
On 10/03/2016 11:00 AM, Olivier Matz wrote: > 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 | 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 <rte_string_fns.h> > #include <rte_errno.h> > #include <rte_byteorder.h> > +#include <rte_net.h> > > #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; Maybe we could first check whether offload features were negotiated? Doing this, we could return before accessing the header and so avoid a cache miss. Maxime