[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