[dpdk-dev] [PATCH v5 4/5] net/i40e: fix max mtu size packets with vlan tag cannot be received by default

Ananyev, Konstantin konstantin.ananyev at intel.com
Wed Oct 14 12:30:32 CEST 2020


> 
> when application presets the max rx packet length and expected mtu at
> the same time, driver need identify if the preset max frame size can
> hold mtu data and Ether overhead completely.
> 
> if not, adjust the max frame size via mtu_set ops within dev_configure.
> 
> Fixes: ff8282f4bbcd ("net/i40e: consider QinQ when setting MTU")
> 
> Signed-off-by: SteveX Yang <stevex.yang at intel.com>
> ---
>  drivers/net/i40e/i40e_ethdev.c    | 11 +++++++++++
>  drivers/net/i40e/i40e_ethdev_vf.c | 13 ++++++++++++-
>  2 files changed, 23 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
> index 943cfe71d..272cfc7ca 100644
> --- a/drivers/net/i40e/i40e_ethdev.c
> +++ b/drivers/net/i40e/i40e_ethdev.c
> @@ -1911,6 +1911,7 @@ i40e_dev_configure(struct rte_eth_dev *dev)
>  	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
>  	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>  	enum rte_eth_rx_mq_mode mq_mode = dev->data->dev_conf.rxmode.mq_mode;
> +	uint32_t frame_size = dev->data->mtu + I40E_ETH_OVERHEAD;
>  	int i, ret;
> 
>  	ret = i40e_dev_sync_phy_type(hw);
> @@ -1925,6 +1926,16 @@ i40e_dev_configure(struct rte_eth_dev *dev)
>  	ad->tx_simple_allowed = true;
>  	ad->tx_vec_allowed = true;
> 
> +	/**
> +	 * Reset the max frame size via mtu_set ops if preset max frame

Typo, should be 'present', I think.
Acked-by: Konstantin Ananyev <konstantin.ananyev at intel.com>

> +	 * cannot hold MTU data and Ether overhead.
> +	 */
> +	if (frame_size > dev->data->dev_conf.rxmode.max_rx_pkt_len) {
> +		ret = i40e_dev_mtu_set(dev, dev->data->mtu);
> +		if (ret != 0)
> +			return ret;
> +	}
> +
>  	if (dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG)
>  		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
> 
> diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
> index 4d6510d1f..686f3c627 100644
> --- a/drivers/net/i40e/i40e_ethdev_vf.c
> +++ b/drivers/net/i40e/i40e_ethdev_vf.c
> @@ -1664,6 +1664,8 @@ i40evf_dev_configure(struct rte_eth_dev *dev)
>  		I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
>  	uint16_t num_queue_pairs = RTE_MAX(dev->data->nb_rx_queues,
>  				dev->data->nb_tx_queues);
> +	uint32_t frame_size = dev->data->mtu + I40E_ETH_OVERHEAD;
> +	int ret;
> 
>  	/* Initialize to TRUE. If any of Rx queues doesn't meet the bulk
>  	 * allocation or vector Rx preconditions we will reset it.
> @@ -1676,9 +1678,18 @@ i40evf_dev_configure(struct rte_eth_dev *dev)
>  	dev->data->dev_conf.intr_conf.lsc =
>  		!!(dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC);
> 
> +	/**
> +	 * Reset the max frame size via mtu_set ops if preset max frame
> +	 * cannot hold MTU data and Ether overhead.
> +	 */
> +	if (frame_size > dev->data->dev_conf.rxmode.max_rx_pkt_len) {
> +		ret = i40evf_dev_mtu_set(dev, dev->data->mtu);
> +		if (ret != 0)
> +			return ret;
> +	}
> +
>  	if (num_queue_pairs > vf->vsi_res->num_queue_pairs) {
>  		struct i40e_hw *hw;
> -		int ret;
> 
>  		if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
>  			PMD_DRV_LOG(ERR,
> --
> 2.17.1



More information about the dev mailing list