[dpdk-dev] [PATCH 15/39] examples/ipsec-secgw: convert to new ethdev offloads API

Radu Nicolau radu.nicolau at intel.com
Mon Dec 11 12:47:51 CET 2017


Hi,

Comment inline


On 11/23/2017 12:19 PM, Shahaf Shuler wrote:
> Ethdev offloads API has changed since:
>
> commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API")
> commit cba7f53b717d ("ethdev: introduce Tx queue offloads API")
>
> This commit support the new API.
>
> Signed-off-by: Shahaf Shuler <shahafs at mellanox.com>
> ---
>   examples/ipsec-secgw/ipsec-secgw.c | 27 +++++++++++++++++++++++++--
>   1 file changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/examples/ipsec-secgw/ipsec-secgw.c b/examples/ipsec-secgw/ipsec-secgw.c
> index c98454a90..6e538a1ab 100644
> --- a/examples/ipsec-secgw/ipsec-secgw.c
> +++ b/examples/ipsec-secgw/ipsec-secgw.c
> @@ -217,6 +217,8 @@ static struct rte_eth_conf port_conf = {
>   	},
>   	.txmode = {
>   		.mq_mode = ETH_MQ_TX_NONE,
> +		.offloads = (DEV_TX_OFFLOAD_IPV4_CKSUM |
> +			     DEV_TX_OFFLOAD_MULTI_SEGS),
>   	},
>   };
>   
> @@ -1394,6 +1396,22 @@ port_init(uint16_t portid)
>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SECURITY)
>   		port_conf.txmode.offloads |= DEV_TX_OFFLOAD_SECURITY;
>   
> +	if ((dev_info.rx_offload_capa & port_conf.rxmode.offloads) !=
> +	    port_conf.rxmode.offloads) {
> +		printf("Some Rx offloads are not supported "
> +		       "by port %d: requested 0x%lx supported 0x%lx\n",
> +		       portid, port_conf.rxmode.offloads,
> +		       dev_info.rx_offload_capa);
> +		port_conf.rxmode.offloads &= dev_info.rx_offload_capa;
> +	}
> +	if ((dev_info.tx_offload_capa & port_conf.txmode.offloads) !=
> +	     port_conf.txmode.offloads) {
> +		printf("Some Tx offloads are not supported "
> +		       "by port %d: requested 0x%lx supported 0x%lx\n",
> +		       portid, port_conf.txmode.offloads,
> +		       dev_info.tx_offload_capa);
> +		port_conf.txmode.offloads &= dev_info.tx_offload_capa;
> +	}
I don't think that clearing the offload flags that are not advertised in 
the capabilities is a good approach, although it may be the right one. 
 From what I can see there are more PMDs that don't fully populate the 
offload capabilities, but actually check for them in the configure/start 
function. One of them is ixgbe, which needs CRC strip enabled when IPSec 
is enabled, and will fail to start otherwise. So although it supports 
CRC strip it does not set the flag in the capabilities, but checks it in 
the start function.
I would propose to just print a warning if a requested offload is not 
set in the capabilities, but let the pmd start fail if it is not really 
supported.

>   	ret = rte_eth_dev_configure(portid, nb_rx_queue, nb_tx_queue,
>   			&port_conf);
>   	if (ret < 0)
> @@ -1420,7 +1438,8 @@ port_init(uint16_t portid)
>   		printf("Setup txq=%u,%d,%d\n", lcore_id, tx_queueid, socket_id);
>   
>   		txconf = &dev_info.default_txconf;
> -		txconf->txq_flags = 0;
> +		txconf->txq_flags = ETH_TXQ_FLAGS_IGNORE;
> +		txconf->offloads = port_conf.txmode.offloads;
>   
>   		ret = rte_eth_tx_queue_setup(portid, tx_queueid, nb_txd,
>   				socket_id, txconf);
> @@ -1434,6 +1453,8 @@ port_init(uint16_t portid)
>   
>   		/* init RX queues */
>   		for (queue = 0; queue < qconf->nb_rx_queue; ++queue) {
> +			struct rte_eth_rxconf rxq_conf;
> +
>   			if (portid != qconf->rx_queue_list[queue].port_id)
>   				continue;
>   
> @@ -1442,8 +1463,10 @@ port_init(uint16_t portid)
>   			printf("Setup rxq=%d,%d,%d\n", portid, rx_queueid,
>   					socket_id);
>   
> +			rxq_conf = dev_info.default_rxconf;
> +			rxq_conf.offloads = port_conf.rxmode.offloads;
>   			ret = rte_eth_rx_queue_setup(portid, rx_queueid,
> -					nb_rxd,	socket_id, NULL,
> +					nb_rxd,	socket_id, &rxq_conf,
>   					socket_ctx[socket_id].mbuf_pool);
>   			if (ret < 0)
>   				rte_exit(EXIT_FAILURE,



More information about the dev mailing list