Hi, As you did in the previous patch, you can use less parentheses for this line:
+ if (((port_offloads ^ offloads) & port_supp_offloads)) Otherwise ok. Best regards, Pascal On 04/01/2018 20:18, Moti Haimovsky wrote: > Ethdev Rx offloads API has changed since: > commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API") > This commit support the new Rx offloads API. > > Signed-off-by: Moti Haimovsky <mo...@mellanox.com> > --- > V3: > * Fixed coding style warnings > > V2: > * Fixed coding style warnings > --- > drivers/net/tap/rte_eth_tap.c | 66 > +++++++++++++++++++++++++++++++++++++------ > 1 file changed, 58 insertions(+), 8 deletions(-) > > diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c > index 1a84adb..f08c37c 100644 > --- a/drivers/net/tap/rte_eth_tap.c > +++ b/drivers/net/tap/rte_eth_tap.c > @@ -286,6 +286,43 @@ enum ioctl_mode { > } > } > > +static uint64_t > +tap_rx_offload_get_port_capa(void) > +{ > + /* > + * In order to support legacy apps, > + * report capabilities also as port capabilities. > + */ > + return DEV_RX_OFFLOAD_SCATTER | > + DEV_RX_OFFLOAD_IPV4_CKSUM | > + DEV_RX_OFFLOAD_UDP_CKSUM | > + DEV_RX_OFFLOAD_TCP_CKSUM; > +} > + > +static uint64_t > +tap_rx_offload_get_queue_capa(void) > +{ > + return DEV_RX_OFFLOAD_SCATTER | > + DEV_RX_OFFLOAD_IPV4_CKSUM | > + DEV_RX_OFFLOAD_UDP_CKSUM | > + DEV_RX_OFFLOAD_TCP_CKSUM; > +} > + > +static bool > +tap_rxq_are_offloads_valid(struct rte_eth_dev *dev, uint64_t offloads) > +{ > + uint64_t port_offloads = dev->data->dev_conf.rxmode.offloads; > + uint64_t queue_supp_offloads = tap_rx_offload_get_queue_capa(); > + uint64_t port_supp_offloads = tap_rx_offload_get_port_capa(); > + > + if ((offloads & (queue_supp_offloads | port_supp_offloads)) != > + offloads) > + return false; > + if (((port_offloads ^ offloads) & port_supp_offloads)) > + return false; > + return true; > +} > + > /* Callback to handle the rx burst of packets to the correct interface and > * file descriptor(s) in a multi-queue setup. > */ > @@ -310,8 +347,9 @@ enum ioctl_mode { > int len; > > len = readv(rxq->fd, *rxq->iovecs, > - 1 + (rxq->rxmode->enable_scatter ? > - rxq->nb_rx_desc : 1)); > + 1 + > + (rxq->rxmode->offloads & DEV_RX_OFFLOAD_SCATTER ? > + rxq->nb_rx_desc : 1)); > if (len < (int)sizeof(struct tun_pi)) > break; > > @@ -366,7 +404,7 @@ enum ioctl_mode { > seg->next = NULL; > mbuf->packet_type = rte_net_get_ptype(mbuf, NULL, > RTE_PTYPE_ALL_MASK); > - if (rxq->rxmode->hw_ip_checksum) > + if (rxq->rxmode->offloads & DEV_RX_OFFLOAD_CHECKSUM) > tap_verify_csum(mbuf); > > /* account for the receive frame */ > @@ -727,12 +765,12 @@ enum ioctl_mode { > dev_info->min_rx_bufsize = 0; > dev_info->pci_dev = NULL; > dev_info->speed_capa = tap_dev_speed_capa(); > - dev_info->rx_offload_capa = (DEV_RX_OFFLOAD_IPV4_CKSUM | > - DEV_RX_OFFLOAD_UDP_CKSUM | > - DEV_RX_OFFLOAD_TCP_CKSUM); > + dev_info->rx_queue_offload_capa = tap_rx_offload_get_queue_capa(); > + dev_info->rx_offload_capa = tap_rx_offload_get_port_capa() | > + dev_info->rx_queue_offload_capa; > dev_info->tx_queue_offload_capa = tap_tx_offload_get_queue_capa(); > - dev_info->tx_offload_capa = dev_info->tx_queue_offload_capa | > - tap_tx_offload_get_port_capa(); > + dev_info->tx_offload_capa = tap_tx_offload_get_port_capa() | > + dev_info->tx_queue_offload_capa; > } > > static int > @@ -1048,6 +1086,18 @@ enum ioctl_mode { > return -1; > } > > + /* Verify application offloads are valid for our port and queue. */ > + if (!tap_rxq_are_offloads_valid(dev, rx_conf->offloads)) { > + rte_errno = ENOTSUP; > + RTE_LOG(ERR, PMD, > + "%p: Rx queue offloads 0x%lx don't match port " > + "offloads 0x%lx or supported offloads 0x%lx\n", > + (void *)dev, rx_conf->offloads, > + dev->data->dev_conf.rxmode.offloads, > + (tap_rx_offload_get_port_capa() | > + tap_rx_offload_get_queue_capa())); > + return -rte_errno; > + } > rxq->mp = mp; > rxq->trigger_seen = 1; /* force initial burst */ > rxq->in_port = dev->data->port_id;