get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/102047/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 102047,
    "url": "http://patches.dpdk.org/api/patches/102047/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20211018134854.1258938-5-ferruh.yigit@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20211018134854.1258938-5-ferruh.yigit@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20211018134854.1258938-5-ferruh.yigit@intel.com",
    "date": "2021-10-18T13:48:52",
    "name": "[v7,5/6] ethdev: unify MTU checks",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "d089e19d3be1f633a1e9f8c0406b8a58c3fc4c69",
    "submitter": {
        "id": 324,
        "url": "http://patches.dpdk.org/api/people/324/?format=api",
        "name": "Ferruh Yigit",
        "email": "ferruh.yigit@intel.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20211018134854.1258938-5-ferruh.yigit@intel.com/mbox/",
    "series": [
        {
            "id": 19744,
            "url": "http://patches.dpdk.org/api/series/19744/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=19744",
            "date": "2021-10-18T13:48:48",
            "name": "[v7,1/6] ethdev: fix max Rx packet length",
            "version": 7,
            "mbox": "http://patches.dpdk.org/series/19744/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/102047/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/102047/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 26D02A0C43;\n\tMon, 18 Oct 2021 15:54:18 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 0EC9D40DF5;\n\tMon, 18 Oct 2021 15:54:18 +0200 (CEST)",
            "from mga02.intel.com (mga02.intel.com [134.134.136.20])\n by mails.dpdk.org (Postfix) with ESMTP id 8065240141\n for <dev@dpdk.org>; Mon, 18 Oct 2021 15:54:15 +0200 (CEST)",
            "from orsmga007.jf.intel.com ([10.7.209.58])\n by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 18 Oct 2021 06:54:14 -0700",
            "from silpixa00399752.ir.intel.com (HELO\n silpixa00399752.ger.corp.intel.com) ([10.237.222.27])\n by orsmga007.jf.intel.com with ESMTP; 18 Oct 2021 06:54:12 -0700"
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6200,9189,10140\"; a=\"215418055\"",
            "E=Sophos;i=\"5.85,382,1624345200\"; d=\"scan'208\";a=\"215418055\"",
            "E=Sophos;i=\"5.85,382,1624345200\"; d=\"scan'208\";a=\"482743701\""
        ],
        "X-ExtLoop1": "1",
        "From": "Ferruh Yigit <ferruh.yigit@intel.com>",
        "To": "Thomas Monjalon <thomas@monjalon.net>,\n Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>",
        "Cc": "Ferruh Yigit <ferruh.yigit@intel.com>, dev@dpdk.org,\n Huisong Li <lihuisong@huawei.com>,\n Konstantin Ananyev <konstantin.ananyev@intel.com>",
        "Date": "Mon, 18 Oct 2021 14:48:52 +0100",
        "Message-Id": "<20211018134854.1258938-5-ferruh.yigit@intel.com>",
        "X-Mailer": "git-send-email 2.31.1",
        "In-Reply-To": "<20211018134854.1258938-1-ferruh.yigit@intel.com>",
        "References": "<20211001143624.3744505-1-ferruh.yigit@intel.com>\n <20211018134854.1258938-1-ferruh.yigit@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v7 5/6] ethdev: unify MTU checks",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Both 'rte_eth_dev_configure()' & 'rte_eth_dev_set_mtu()' sets MTU but\nhave slightly different checks. Like one checks min MTU against\nRTE_ETHER_MIN_MTU and other RTE_ETHER_MIN_LEN.\n\nChecks moved into common function to unify the checks. Also this has\nbenefit to have common error logs.\n\nDefault 'dev_info->min_mtu' (the one set by ethdev if driver doesn't\nprovide one), changed to ('RTE_ETHER_MIN_LEN' - overhead). Previously it\nwas 'RTE_ETHER_MIN_MTU' which is min MTU for IPv4 packets. Since the\nintention is to provide min MTU corresponding minimum frame size, new\ndefault value suits better.\n\nSuggested-by: Huisong Li <lihuisong@huawei.com>\nSigned-off-by: Ferruh Yigit <ferruh.yigit@intel.com>\nAcked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>\nAcked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>\n---\n lib/ethdev/rte_ethdev.c | 91 +++++++++++++++++++++++++----------------\n lib/ethdev/rte_ethdev.h |  2 +-\n 2 files changed, 57 insertions(+), 36 deletions(-)",
    "diff": "diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c\nindex 982c1bbc8679..3b8ef9ef22e7 100644\n--- a/lib/ethdev/rte_ethdev.c\n+++ b/lib/ethdev/rte_ethdev.c\n@@ -1327,6 +1327,47 @@ eth_dev_get_overhead_len(uint32_t max_rx_pktlen, uint16_t max_mtu)\n \treturn overhead_len;\n }\n \n+/* rte_eth_dev_info_get() should be called prior to this function */\n+static int\n+eth_dev_validate_mtu(uint16_t port_id, struct rte_eth_dev_info *dev_info,\n+\t\tuint16_t mtu)\n+{\n+\tuint32_t overhead_len;\n+\tuint32_t frame_size;\n+\n+\tif (mtu < dev_info->min_mtu) {\n+\t\tRTE_ETHDEV_LOG(ERR,\n+\t\t\t\"MTU (%u) < device min MTU (%u) for port_id %u\\n\",\n+\t\t\tmtu, dev_info->min_mtu, port_id);\n+\t\treturn -EINVAL;\n+\t}\n+\tif (mtu > dev_info->max_mtu) {\n+\t\tRTE_ETHDEV_LOG(ERR,\n+\t\t\t\"MTU (%u) > device max MTU (%u) for port_id %u\\n\",\n+\t\t\tmtu, dev_info->max_mtu, port_id);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\toverhead_len = eth_dev_get_overhead_len(dev_info->max_rx_pktlen,\n+\t\t\tdev_info->max_mtu);\n+\tframe_size = mtu + overhead_len;\n+\tif (frame_size < RTE_ETHER_MIN_LEN) {\n+\t\tRTE_ETHDEV_LOG(ERR,\n+\t\t\t\"Frame size (%u) < min frame size (%u) for port_id %u\\n\",\n+\t\t\tframe_size, RTE_ETHER_MIN_LEN, port_id);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (frame_size > dev_info->max_rx_pktlen) {\n+\t\tRTE_ETHDEV_LOG(ERR,\n+\t\t\t\"Frame size (%u) > device max frame size (%u) for port_id %u\\n\",\n+\t\t\tframe_size, dev_info->max_rx_pktlen, port_id);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\treturn 0;\n+}\n+\n int\n rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,\n \t\t      const struct rte_eth_conf *dev_conf)\n@@ -1334,8 +1375,6 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,\n \tstruct rte_eth_dev *dev;\n \tstruct rte_eth_dev_info dev_info;\n \tstruct rte_eth_conf orig_conf;\n-\tuint32_t max_rx_pktlen;\n-\tuint32_t overhead_len;\n \tint diag;\n \tint ret;\n \tuint16_t old_mtu;\n@@ -1384,10 +1423,6 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,\n \tif (ret != 0)\n \t\tgoto rollback;\n \n-\t/* Get the real Ethernet overhead length */\n-\toverhead_len = eth_dev_get_overhead_len(dev_info.max_rx_pktlen,\n-\t\t\tdev_info.max_mtu);\n-\n \t/* If number of queues specified by application for both Rx and Tx is\n \t * zero, use driver preferred values. This cannot be done individually\n \t * as it is valid for either Tx or Rx (but not both) to be zero.\n@@ -1454,26 +1489,13 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,\n \t\tgoto rollback;\n \t}\n \n-\t/*\n-\t * Check that the maximum RX packet length is supported by the\n-\t * configured device.\n-\t */\n \tif (dev_conf->rxmode.mtu == 0)\n \t\tdev->data->dev_conf.rxmode.mtu = RTE_ETHER_MTU;\n-\tmax_rx_pktlen = dev->data->dev_conf.rxmode.mtu + overhead_len;\n-\tif (max_rx_pktlen > dev_info.max_rx_pktlen) {\n-\t\tRTE_ETHDEV_LOG(ERR,\n-\t\t\t\"Ethdev port_id=%u max_rx_pktlen %u > max valid value %u\\n\",\n-\t\t\tport_id, max_rx_pktlen, dev_info.max_rx_pktlen);\n-\t\tret = -EINVAL;\n-\t\tgoto rollback;\n-\t} else if (max_rx_pktlen < RTE_ETHER_MIN_LEN) {\n-\t\tRTE_ETHDEV_LOG(ERR,\n-\t\t\t\"Ethdev port_id=%u max_rx_pktlen %u < min valid value %u\\n\",\n-\t\t\tport_id, max_rx_pktlen, RTE_ETHER_MIN_LEN);\n-\t\tret = -EINVAL;\n+\n+\tret = eth_dev_validate_mtu(port_id, &dev_info,\n+\t\t\tdev->data->dev_conf.rxmode.mtu);\n+\tif (ret != 0)\n \t\tgoto rollback;\n-\t}\n \n \tdev->data->mtu = dev->data->dev_conf.rxmode.mtu;\n \n@@ -1482,6 +1504,12 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,\n \t * size is supported by the configured device.\n \t */\n \tif (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO) {\n+\t\tuint32_t max_rx_pktlen;\n+\t\tuint32_t overhead_len;\n+\n+\t\toverhead_len = eth_dev_get_overhead_len(dev_info.max_rx_pktlen,\n+\t\t\t\tdev_info.max_mtu);\n+\t\tmax_rx_pktlen = dev->data->dev_conf.rxmode.mtu + overhead_len;\n \t\tif (dev_conf->rxmode.max_lro_pkt_size == 0)\n \t\t\tdev->data->dev_conf.rxmode.max_lro_pkt_size = max_rx_pktlen;\n \t\tret = eth_dev_check_lro_pkt_size(port_id,\n@@ -3400,7 +3428,8 @@ rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info)\n \tdev_info->rx_desc_lim = lim;\n \tdev_info->tx_desc_lim = lim;\n \tdev_info->device = dev->device;\n-\tdev_info->min_mtu = RTE_ETHER_MIN_MTU;\n+\tdev_info->min_mtu = RTE_ETHER_MIN_LEN - RTE_ETHER_HDR_LEN -\n+\t\tRTE_ETHER_CRC_LEN;\n \tdev_info->max_mtu = UINT16_MAX;\n \n \tRTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_infos_get, -ENOTSUP);\n@@ -3651,21 +3680,13 @@ rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu)\n \t * which relies on dev->dev_ops->dev_infos_get.\n \t */\n \tif (*dev->dev_ops->dev_infos_get != NULL) {\n-\t\tuint16_t overhead_len;\n-\t\tuint32_t frame_size;\n-\n \t\tret = rte_eth_dev_info_get(port_id, &dev_info);\n \t\tif (ret != 0)\n \t\t\treturn ret;\n \n-\t\tif (mtu < dev_info.min_mtu || mtu > dev_info.max_mtu)\n-\t\t\treturn -EINVAL;\n-\n-\t\toverhead_len = eth_dev_get_overhead_len(dev_info.max_rx_pktlen,\n-\t\t\t\tdev_info.max_mtu);\n-\t\tframe_size = mtu + overhead_len;\n-\t\tif (mtu < RTE_ETHER_MIN_MTU || frame_size > dev_info.max_rx_pktlen)\n-\t\t\treturn -EINVAL;\n+\t\tret = eth_dev_validate_mtu(port_id, &dev_info, mtu);\n+\t\tif (ret != 0)\n+\t\t\treturn ret;\n \t}\n \n \tret = (*dev->dev_ops->mtu_set)(dev, mtu);\ndiff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h\nindex 16c2c16831cb..69766eaae2d4 100644\n--- a/lib/ethdev/rte_ethdev.h\n+++ b/lib/ethdev/rte_ethdev.h\n@@ -3050,7 +3050,7 @@ int rte_eth_macaddrs_get(uint16_t port_id, struct rte_ether_addr *ma,\n  *  };\n  *\n  * device = dev->device\n- * min_mtu = RTE_ETHER_MIN_MTU\n+ * min_mtu = RTE_ETHER_MIN_LEN - RTE_ETHER_HDR_LEN - RTE_ETHER_CRC_LEN\n  * max_mtu = UINT16_MAX\n  *\n  * The following fields will be populated if support for dev_infos_get()\n",
    "prefixes": [
        "v7",
        "5/6"
    ]
}