From: Ferruh Yigit Date: Mon, 18 Oct 2021 13:48:50 +0000 (+0100) Subject: ethdev: move MTU set check to library X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=f7e04f57ad61c8c343502f108c141c359d3d3db6;p=dpdk.git ethdev: move MTU set check to library Move requested MTU value check to the API to prevent the duplicated code. Signed-off-by: Ferruh Yigit Reviewed-by: Andrew Rybchenko Reviewed-by: Rosen Xu Acked-by: Somnath Kotur Acked-by: Konstantin Ananyev --- diff --git a/drivers/net/axgbe/axgbe_ethdev.c b/drivers/net/axgbe/axgbe_ethdev.c index 2dc5fa245b..d302329525 100644 --- a/drivers/net/axgbe/axgbe_ethdev.c +++ b/drivers/net/axgbe/axgbe_ethdev.c @@ -1478,25 +1478,18 @@ axgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev) static int axgb_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) { - struct rte_eth_dev_info dev_info; struct axgbe_port *pdata = dev->data->dev_private; - uint32_t frame_size = mtu + RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN; - unsigned int val = 0; - axgbe_dev_info_get(dev, &dev_info); - /* check that mtu is within the allowed range */ - if (mtu < RTE_ETHER_MIN_MTU || frame_size > dev_info.max_rx_pktlen) - return -EINVAL; + unsigned int val; + /* mtu setting is forbidden if port is start */ if (dev->data->dev_started) { PMD_DRV_LOG(ERR, "port %d must be stopped before configuration", dev->data->port_id); return -EBUSY; } - if (mtu > RTE_ETHER_MTU) - val = 1; - else - val = 0; + val = mtu > RTE_ETHER_MTU ? 1 : 0; AXGMAC_IOWRITE_BITS(pdata, MAC_RCR, JE, val); + return 0; } diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 6a66ed824a..f3cd756447 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -3029,7 +3029,7 @@ int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu) uint32_t overhead = BNXT_MAX_PKT_LEN - BNXT_MAX_MTU; struct bnxt *bp = eth_dev->data->dev_private; uint32_t new_pkt_size; - uint32_t rc = 0; + uint32_t rc; uint32_t i; rc = is_bnxt_in_error(bp); diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c index cdecf6b512..32a0100910 100644 --- a/drivers/net/cxgbe/cxgbe_ethdev.c +++ b/drivers/net/cxgbe/cxgbe_ethdev.c @@ -301,21 +301,10 @@ int cxgbe_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) { struct port_info *pi = eth_dev->data->dev_private; struct adapter *adapter = pi->adapter; - struct rte_eth_dev_info dev_info; - int err; uint16_t new_mtu = mtu + RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN; - err = cxgbe_dev_info_get(eth_dev, &dev_info); - if (err != 0) - return err; - - /* Must accommodate at least RTE_ETHER_MIN_MTU */ - if (mtu < RTE_ETHER_MIN_MTU || new_mtu > dev_info.max_rx_pktlen) - return -EINVAL; - - err = t4_set_rxmode(adapter, adapter->mbox, pi->viid, new_mtu, -1, -1, + return t4_set_rxmode(adapter, adapter->mbox, pi->viid, new_mtu, -1, -1, -1, -1, true); - return err; } /* diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c index f24ec55bee..c117115066 100644 --- a/drivers/net/dpaa/dpaa_ethdev.c +++ b/drivers/net/dpaa/dpaa_ethdev.c @@ -167,8 +167,6 @@ dpaa_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) PMD_INIT_FUNC_TRACE(); - if (mtu < RTE_ETHER_MIN_MTU || frame_size > DPAA_MAX_RX_PKT_LEN) - return -EINVAL; /* * Refuse mtu that requires the support of scattered packets * when this feature has not been enabled before. diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c index 02e1647d1f..3d1df34aa8 100644 --- a/drivers/net/dpaa2/dpaa2_ethdev.c +++ b/drivers/net/dpaa2/dpaa2_ethdev.c @@ -1461,10 +1461,6 @@ dpaa2_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) return -EINVAL; } - /* check that mtu is within the allowed range */ - if (mtu < RTE_ETHER_MIN_MTU || frame_size > DPAA2_MAX_RX_PKT_LEN) - return -EINVAL; - /* Set the Max Rx frame length as 'mtu' + * Maximum Ethernet header length */ diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c index de4267bf59..e8d55ddf33 100644 --- a/drivers/net/e1000/em_ethdev.c +++ b/drivers/net/e1000/em_ethdev.c @@ -1786,22 +1786,12 @@ eth_em_default_mac_addr_set(struct rte_eth_dev *dev, static int eth_em_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) { - struct rte_eth_dev_info dev_info; struct e1000_hw *hw; uint32_t frame_size; uint32_t rctl; - int ret; - - ret = eth_em_infos_get(dev, &dev_info); - if (ret != 0) - return ret; frame_size = mtu + E1000_ETH_OVERHEAD; - /* check that mtu is within the allowed range */ - if (mtu < RTE_ETHER_MIN_MTU || frame_size > dev_info.max_rx_pktlen) - return -EINVAL; - /* * If device is started, refuse mtu that requires the support of * scattered packets when this feature has not been enabled before. diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c index 72bdd1087c..dbe811a1ad 100644 --- a/drivers/net/e1000/igb_ethdev.c +++ b/drivers/net/e1000/igb_ethdev.c @@ -4359,9 +4359,7 @@ eth_igb_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) { uint32_t rctl; struct e1000_hw *hw; - struct rte_eth_dev_info dev_info; uint32_t frame_size = mtu + E1000_ETH_OVERHEAD; - int ret; hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); @@ -4370,15 +4368,6 @@ eth_igb_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) if (hw->mac.type == e1000_82571) return -ENOTSUP; #endif - ret = eth_igb_infos_get(dev, &dev_info); - if (ret != 0) - return ret; - - /* check that mtu is within the allowed range */ - if (mtu < RTE_ETHER_MIN_MTU || - frame_size > dev_info.max_rx_pktlen) - return -EINVAL; - /* * If device is started, refuse mtu that requires the support of * scattered packets when this feature has not been enabled before. diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c index 52c89aa038..ca83fbd0a3 100644 --- a/drivers/net/enetc/enetc_ethdev.c +++ b/drivers/net/enetc/enetc_ethdev.c @@ -666,10 +666,6 @@ enetc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) struct enetc_hw *enetc_hw = &hw->hw; uint32_t frame_size = mtu + RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN; - /* check that mtu is within the allowed range */ - if (mtu < ENETC_MAC_MINFRM_SIZE || frame_size > ENETC_MAC_MAXFRM_SIZE) - return -EINVAL; - /* * Refuse mtu that requires the support of scattered packets * when this feature has not been enabled before. diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c index 5d6700c183..9a974dff58 100644 --- a/drivers/net/hinic/hinic_pmd_ethdev.c +++ b/drivers/net/hinic/hinic_pmd_ethdev.c @@ -1534,17 +1534,11 @@ static void hinic_deinit_mac_addr(struct rte_eth_dev *eth_dev) static int hinic_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu) { struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev); - int ret = 0; + int ret; PMD_DRV_LOG(INFO, "Set port mtu, port_id: %d, mtu: %d, max_pkt_len: %d", dev->data->port_id, mtu, HINIC_MTU_TO_PKTLEN(mtu)); - if (mtu < HINIC_MIN_MTU_SIZE || mtu > HINIC_MAX_MTU_SIZE) { - PMD_DRV_LOG(ERR, "Invalid mtu: %d, must between %d and %d", - mtu, HINIC_MIN_MTU_SIZE, HINIC_MAX_MTU_SIZE); - return -EINVAL; - } - ret = hinic_set_port_mtu(nic_dev->hwdev, mtu); if (ret) { PMD_DRV_LOG(ERR, "Set port mtu failed, ret: %d", ret); diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 208e60ed8c..cf3f20e79f 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -11419,25 +11419,16 @@ static int i40e_set_default_mac_addr(struct rte_eth_dev *dev, } static int -i40e_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) +i40e_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu __rte_unused) { - struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private); - struct rte_eth_dev_data *dev_data = pf->dev_data; - uint32_t frame_size = mtu + I40E_ETH_OVERHEAD; - int ret = 0; - - /* check if mtu is within the allowed range */ - if (mtu < RTE_ETHER_MIN_MTU || frame_size > I40E_FRAME_SIZE_MAX) - return -EINVAL; - /* mtu setting is forbidden if port is start */ - if (dev_data->dev_started) { + if (dev->data->dev_started != 0) { PMD_DRV_LOG(ERR, "port %d must be stopped before configuration", - dev_data->port_id); + dev->data->port_id); return -EBUSY; } - return ret; + return 0; } /* Restore ethertype filter */ diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index 1df4cf17ab..6543371878 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -1459,21 +1459,15 @@ iavf_dev_rss_hash_conf_get(struct rte_eth_dev *dev, } static int -iavf_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) +iavf_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu __rte_unused) { - uint32_t frame_size = mtu + IAVF_ETH_OVERHEAD; - int ret = 0; - - if (mtu < RTE_ETHER_MIN_MTU || frame_size > IAVF_FRAME_SIZE_MAX) - return -EINVAL; - /* mtu setting is forbidden if port is start */ if (dev->data->dev_started) { PMD_DRV_LOG(ERR, "port must be stopped before configuration"); return -EBUSY; } - return ret; + return 0; } static int diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c index 4929fc7d3a..3a1bcc4e3e 100644 --- a/drivers/net/ice/ice_ethdev.c +++ b/drivers/net/ice/ice_ethdev.c @@ -3974,21 +3974,13 @@ ice_dev_set_link_down(struct rte_eth_dev *dev) } static int -ice_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) +ice_mtu_set(struct rte_eth_dev *dev, uint16_t mtu __rte_unused) { - struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private); - struct rte_eth_dev_data *dev_data = pf->dev_data; - uint32_t frame_size = mtu + ICE_ETH_OVERHEAD; - - /* check if mtu is within the allowed range */ - if (mtu < RTE_ETHER_MIN_MTU || frame_size > ICE_FRAME_SIZE_MAX) - return -EINVAL; - /* mtu setting is forbidden if port is start */ - if (dev_data->dev_started) { + if (dev->data->dev_started != 0) { PMD_DRV_LOG(ERR, "port %d must be stopped before configuration", - dev_data->port_id); + dev->data->port_id); return -EBUSY; } diff --git a/drivers/net/igc/igc_ethdev.c b/drivers/net/igc/igc_ethdev.c index c36f0c879e..2a1ed90b64 100644 --- a/drivers/net/igc/igc_ethdev.c +++ b/drivers/net/igc/igc_ethdev.c @@ -1575,11 +1575,6 @@ eth_igc_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) if (IGC_READ_REG(hw, IGC_CTRL_EXT) & IGC_CTRL_EXT_EXT_VLAN) frame_size += VLAN_TAG_SIZE; - /* check that mtu is within the allowed range */ - if (mtu < RTE_ETHER_MIN_MTU || - frame_size > MAX_RX_JUMBO_FRAME_SIZE) - return -EINVAL; - /* * If device is started, refuse mtu that requires the support of * scattered packets when this feature has not been enabled before. diff --git a/drivers/net/ipn3ke/ipn3ke_representor.c b/drivers/net/ipn3ke/ipn3ke_representor.c index 6bf139c85d..0438c3f08c 100644 --- a/drivers/net/ipn3ke/ipn3ke_representor.c +++ b/drivers/net/ipn3ke/ipn3ke_representor.c @@ -2768,12 +2768,6 @@ ipn3ke_rpst_mtu_set(struct rte_eth_dev *ethdev, uint16_t mtu) int ret = 0; struct ipn3ke_rpst *rpst = IPN3KE_DEV_PRIVATE_TO_RPST(ethdev); struct rte_eth_dev_data *dev_data = ethdev->data; - uint32_t frame_size = mtu + IPN3KE_ETH_OVERHEAD; - - /* check if mtu is within the allowed range */ - if (mtu < RTE_ETHER_MIN_MTU || - frame_size > IPN3KE_MAC_FRAME_SIZE_MAX) - return -EINVAL; /* mtu setting is forbidden if port is start */ /* make sure NIC port is stopped */ diff --git a/drivers/net/liquidio/lio_ethdev.c b/drivers/net/liquidio/lio_ethdev.c index 5e3b2aa7a3..0fc3f0ab66 100644 --- a/drivers/net/liquidio/lio_ethdev.c +++ b/drivers/net/liquidio/lio_ethdev.c @@ -434,7 +434,6 @@ static int lio_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) { struct lio_device *lio_dev = LIO_DEV(eth_dev); - uint16_t pf_mtu = lio_dev->linfo.link.s.mtu; struct lio_dev_ctrl_cmd ctrl_cmd; struct lio_ctrl_pkt ctrl_pkt; @@ -446,15 +445,6 @@ lio_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) return -EINVAL; } - /* check if VF MTU is within allowed range. - * New value should not exceed PF MTU. - */ - if (mtu < RTE_ETHER_MIN_MTU || mtu > pf_mtu) { - lio_dev_err(lio_dev, "VF MTU should be >= %d and <= %d\n", - RTE_ETHER_MIN_MTU, pf_mtu); - return -EINVAL; - } - /* flush added to prevent cmd failure * incase the queue is full */ diff --git a/drivers/net/nfp/nfp_common.c b/drivers/net/nfp/nfp_common.c index d7bd5883b1..dc90687219 100644 --- a/drivers/net/nfp/nfp_common.c +++ b/drivers/net/nfp/nfp_common.c @@ -951,10 +951,6 @@ nfp_net_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private); - /* check that mtu is within the allowed range */ - if (mtu < RTE_ETHER_MIN_MTU || (uint32_t)mtu > hw->max_mtu) - return -EINVAL; - /* mtu setting is forbidden if port is started */ if (dev->data->dev_started) { PMD_DRV_LOG(ERR, "port %d must be stopped before configuration", diff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c index c5dbcc45d8..f578123ed0 100644 --- a/drivers/net/octeontx/octeontx_ethdev.c +++ b/drivers/net/octeontx/octeontx_ethdev.c @@ -524,10 +524,6 @@ octeontx_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) struct rte_eth_dev_data *data = eth_dev->data; int rc = 0; - /* Check if MTU is within the allowed range */ - if (frame_size < OCCTX_MIN_FRS || frame_size > OCCTX_MAX_FRS) - return -EINVAL; - buffsz = data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM; /* Refuse MTU that requires the support of scattered packets diff --git a/drivers/net/octeontx2/otx2_ethdev_ops.c b/drivers/net/octeontx2/otx2_ethdev_ops.c index fa6d4030b8..22a8af5cba 100644 --- a/drivers/net/octeontx2/otx2_ethdev_ops.c +++ b/drivers/net/octeontx2/otx2_ethdev_ops.c @@ -20,10 +20,6 @@ otx2_nix_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) if (dev->configured && otx2_ethdev_is_ptp_en(dev)) frame_size += NIX_TIMESYNC_RX_OFFSET; - /* Check if MTU is within the allowed range */ - if (frame_size < NIX_MIN_FRS || frame_size > NIX_MAX_FRS) - return -EINVAL; - buffsz = data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM; /* Refuse MTU that requires the support of scattered packets diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c index 7b12794405..663cb1460f 100644 --- a/drivers/net/qede/qede_ethdev.c +++ b/drivers/net/qede/qede_ethdev.c @@ -2307,7 +2307,6 @@ static int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu) { struct qede_dev *qdev = QEDE_INIT_QDEV(dev); struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); - struct rte_eth_dev_info dev_info = {0}; struct qede_fastpath *fp; uint32_t frame_size; uint16_t bufsz; @@ -2315,19 +2314,8 @@ static int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu) int i, rc; PMD_INIT_FUNC_TRACE(edev); - rc = qede_dev_info_get(dev, &dev_info); - if (rc != 0) { - DP_ERR(edev, "Error during getting ethernet device info\n"); - return rc; - } frame_size = mtu + QEDE_MAX_ETHER_HDR_LEN; - if (mtu < RTE_ETHER_MIN_MTU || frame_size > dev_info.max_rx_pktlen) { - DP_ERR(edev, "MTU %u out of range, %u is maximum allowable\n", - mtu, dev_info.max_rx_pktlen - RTE_ETHER_HDR_LEN - - QEDE_ETH_OVERHEAD); - return -EINVAL; - } if (!dev->data->scattered_rx && frame_size > dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM) { DP_INFO(edev, "MTU greater than minimum RX buffer size of %u\n", diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c index 0624efcbb8..8ce9a99dc0 100644 --- a/drivers/net/thunderx/nicvf_ethdev.c +++ b/drivers/net/thunderx/nicvf_ethdev.c @@ -154,12 +154,6 @@ nicvf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu) PMD_INIT_FUNC_TRACE(); - if (frame_size > NIC_HW_MAX_FRS) - return -EINVAL; - - if (frame_size < NIC_HW_MIN_FRS) - return -EINVAL; - buffsz = dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM; /* diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c index cc1d4a6238..7b46ffb686 100644 --- a/drivers/net/txgbe/txgbe_ethdev.c +++ b/drivers/net/txgbe/txgbe_ethdev.c @@ -3459,18 +3459,8 @@ static int txgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) { struct txgbe_hw *hw = TXGBE_DEV_HW(dev); - struct rte_eth_dev_info dev_info; uint32_t frame_size = mtu + RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN; struct rte_eth_dev_data *dev_data = dev->data; - int ret; - - ret = txgbe_dev_info_get(dev, &dev_info); - if (ret != 0) - return ret; - - /* check that mtu is within the allowed range */ - if (mtu < RTE_ETHER_MIN_MTU || frame_size > dev_info.max_rx_pktlen) - return -EINVAL; /* If device is started, refuse mtu that requires the support of * scattered packets when this feature has not been enabled before. diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index 850208b640..4e32b6d964 100644 --- a/lib/ethdev/rte_ethdev.c +++ b/lib/ethdev/rte_ethdev.c @@ -3660,6 +3660,9 @@ rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu) * which relies on dev->dev_ops->dev_infos_get. */ if (*dev->dev_ops->dev_infos_get != NULL) { + uint16_t overhead_len; + uint32_t frame_size; + ret = rte_eth_dev_info_get(port_id, &dev_info); if (ret != 0) return ret; @@ -3667,6 +3670,12 @@ rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu) if (mtu < dev_info.min_mtu || mtu > dev_info.max_mtu) return -EINVAL; + overhead_len = eth_dev_get_overhead_len(dev_info.max_rx_pktlen, + dev_info.max_mtu); + frame_size = mtu + overhead_len; + if (mtu < RTE_ETHER_MIN_MTU || frame_size > dev_info.max_rx_pktlen) + return -EINVAL; + if ((dev_info.rx_offload_capa & DEV_RX_OFFLOAD_JUMBO_FRAME) != 0) is_jumbo_frame_capable = 1; }