get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 136287,
    "url": "http://patchwork.dpdk.org/api/patches/136287/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20240201155021.2388269-2-venkatx.sivaramakrishnan@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20240201155021.2388269-2-venkatx.sivaramakrishnan@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240201155021.2388269-2-venkatx.sivaramakrishnan@intel.com",
    "date": "2024-02-01T15:50:21",
    "name": "[v7,2/2] drivers/net: return number of types in get supported types",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "ef767e01c1b91e226117aa0d67475bed76b5129f",
    "submitter": {
        "id": 3155,
        "url": "http://patchwork.dpdk.org/api/people/3155/?format=api",
        "name": "Sivaramakrishnan Venkat",
        "email": "venkatx.sivaramakrishnan@intel.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patchwork.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20240201155021.2388269-2-venkatx.sivaramakrishnan@intel.com/mbox/",
    "series": [
        {
            "id": 30970,
            "url": "http://patchwork.dpdk.org/api/series/30970/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=30970",
            "date": "2024-02-01T15:50:20",
            "name": "[v7,1/2] drivers/net: fix buffer overflow for ptypes list",
            "version": 7,
            "mbox": "http://patchwork.dpdk.org/series/30970/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/136287/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/136287/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 56AFE43A3C;\n\tThu,  1 Feb 2024 16:50:43 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 3FCCB42E6A;\n\tThu,  1 Feb 2024 16:50:43 +0100 (CET)",
            "from mgamail.intel.com (mgamail.intel.com [198.175.65.15])\n by mails.dpdk.org (Postfix) with ESMTP id BC72842E62\n for <dev@dpdk.org>; Thu,  1 Feb 2024 16:50:41 +0100 (CET)",
            "from fmviesa003.fm.intel.com ([10.60.135.143])\n by orvoesa107.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 01 Feb 2024 07:50:40 -0800",
            "from silpixa00400902.ir.intel.com ([10.243.23.146])\n by fmviesa003.fm.intel.com with ESMTP; 01 Feb 2024 07:50:29 -0800"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1706802642; x=1738338642;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=cznjAeTC8TriDwvf7UJCJemvHbb2E3hMNYMjgTfyNOE=;\n b=IfmkZBHQUafUwbeu+B69m0n3dqr22qddR6q2ianDJBTM+rqju7ZTg6AK\n +utCOz2wSYDAbLbj32kFfTf/jOCwyjBd6L5slFrkLguESOd25HX7+HsH8\n Nrr/kgAdt0bgd7LZMChZU2qn1NVJIDRrtdn//QvGyZ3pBxZoy6cBcho9Q\n yKcrz4cN10vIM5umxMyUu3tuvX8miMxs3+QcuYCqMlbggGZ2oiKq3YwuE\n seb03JFNRbW3/9PWyp6/oav43owfU2C4dw/WAKEIcwQwjrIBzTG5bbMqD\n PKTL89HoueCMbXYUQVHRe+RD8EPXYrKBU81ttbpResNm7UfCsMrd9Tydt A==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6600,9927,10969\"; a=\"3790800\"",
            "E=Sophos;i=\"6.05,234,1701158400\";\n   d=\"scan'208\";a=\"3790800\"",
            "E=Sophos;i=\"6.05,234,1701158400\";\n   d=\"scan'208\";a=\"4439549\""
        ],
        "X-ExtLoop1": "1",
        "From": "Sivaramakrishnan Venkat <venkatx.sivaramakrishnan@intel.com>",
        "To": "Igor Russkikh <irusskikh@marvell.com>,\n Selwin Sebastian <selwin.sebastian@amd.com>,\n Ajit Khaparde <ajit.khaparde@broadcom.com>,\n Somnath Kotur <somnath.kotur@broadcom.com>,\n Nithin Dabilpuram <ndabilpuram@marvell.com>,\n Kiran Kumar K <kirankumark@marvell.com>,\n Sunil Kumar Kori <skori@marvell.com>, Satha Rao <skoteshwar@marvell.com>,\n Yuying Zhang <yuying.zhang@intel.com>, Beilei Xing <beilei.xing@intel.com>,\n Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>,\n Hemant Agrawal <hemant.agrawal@nxp.com>,\n Sachin Saxena <sachin.saxena@nxp.com>, Simei Su <simei.su@intel.com>,\n Wenjun Wu <wenjun1.wu@intel.com>, Gagandeep Singh <g.singh@nxp.com>,\n John Daley <johndale@cisco.com>, Hyong Youb Kim <hyonkim@cisco.com>,\n Gaetan Rivet <grive@u256.net>, Qi Zhang <qi.z.zhang@intel.com>,\n Xiao Wang <xiao.w.wang@intel.com>, Jie Hai <haijie1@huawei.com>,\n Yisen Zhuang <yisen.zhuang@huawei.com>,\n Jingjing Wu <jingjing.wu@intel.com>, Qiming Yang <qiming.yang@intel.com>,\n Junfeng Guo <junfeng.guo@intel.com>, Andrew Boyer <andrew.boyer@amd.com>,\n Long Li <longli@microsoft.com>, Matan Azrad <matan@nvidia.com>,\n Viacheslav Ovsiienko <viacheslavo@nvidia.com>,\n Dariusz Sosnowski <dsosnowski@nvidia.com>, Ori Kam <orika@nvidia.com>,\n Suanming Mou <suanmingm@nvidia.com>, Zyta Szpak <zr@semihalf.com>,\n Liron Himi <lironh@marvell.com>, Chaoyong He <chaoyong.he@corigine.com>,\n Jiawen Wu <jiawenwu@trustnetic.com>, Harman Kalra <hkalra@marvell.com>,\n Devendra Singh Rawat <dsinghrawat@marvell.com>,\n Alok Prasad <palok@marvell.com>,\n Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>,\n Jerin Jacob <jerinj@marvell.com>, Maciej Czekaj <mczekaj@marvell.com>,\n Jian Wang <jianwang@trustnetic.com>, Jochen Behrens <jbehrens@vmware.com>,\n Thomas Monjalon <thomas@monjalon.net>, Ferruh Yigit <ferruh.yigit@amd.com>",
        "Cc": "dev@dpdk.org, ciara.power@intel.com,\n Sivaramakrishnan Venkat <venkatx.sivaramakrishnan@intel.com>",
        "Subject": "[PATCH v7 2/2] drivers/net: return number of types in get supported\n types",
        "Date": "Thu,  1 Feb 2024 15:50:21 +0000",
        "Message-Id": "<20240201155021.2388269-2-venkatx.sivaramakrishnan@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20240201155021.2388269-1-venkatx.sivaramakrishnan@intel.com>",
        "References": "<20231212143722.1803259-1-venkatx.sivaramakrishnan@intel.com>\n <20240201155021.2388269-1-venkatx.sivaramakrishnan@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "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"
    },
    "content": "Missing \"RTE_PTYPE_UNKNOWN\" ptype causes buffer overflow.\nEnhance code such that the dev_supported_ptypes_get()\nfunction pointer now returns  the number of elements to\neliminate the need for \"RTE_PTYPE_UNKNOWN\" as the last item.\n\nSigned-off-by: Sivaramakrishnan Venkat <venkatx.sivaramakrishnan@intel.com>\n\n---\n v7:\n    - tidied formatting of code.\n    - updated the code to keep the terminating char ',' for missed ptypes array.\n    - nicvf_dev_supported_ptypes_get() updated to get the correct the no of elements.\n v6:\n    - missed drivers reworked for the removal of RTE_PTYPE_UNKNOWN in list.\n    - added code back in that incorrectly removed in v5 for set_ptypes function last element.\n v5:\n    - modified commit message.\n    - tidied formatting of code.\n    - added doxygen comment.\n v4:\n    - split into two patches, one for backporting and another one for\n      upstream rework.\n v3:\n    - reworked the function to return number of elements and remove the\n      need for RTE_PTYPE_UNKNOWN in list.\n v2:\n    - extended fix for multiple drivers.\n---\n drivers/net/atlantic/atl_ethdev.c      | 10 ++++++----\n drivers/net/axgbe/axgbe_ethdev.c       | 10 ++++++----\n drivers/net/bnxt/bnxt_ethdev.c         |  5 +++--\n drivers/net/cnxk/cnxk_ethdev.h         |  3 ++-\n drivers/net/cnxk/cnxk_lookup.c         |  7 ++++---\n drivers/net/cpfl/cpfl_ethdev.c         |  5 +++--\n drivers/net/cxgbe/cxgbe_ethdev.c       |  8 +++++---\n drivers/net/cxgbe/cxgbe_pfvf.h         |  3 ++-\n drivers/net/dpaa/dpaa_ethdev.c         |  7 ++++---\n drivers/net/dpaa2/dpaa2_ethdev.c       |  7 ++++---\n drivers/net/e1000/igb_ethdev.c         | 10 ++++++----\n drivers/net/enetc/enetc_ethdev.c       |  5 +++--\n drivers/net/enic/enic_ethdev.c         | 12 +++++++-----\n drivers/net/failsafe/failsafe_ops.c    |  4 ++--\n drivers/net/fm10k/fm10k_ethdev.c       |  9 +++++----\n drivers/net/hns3/hns3_rxtx.c           | 11 ++++++-----\n drivers/net/hns3/hns3_rxtx.h           |  3 ++-\n drivers/net/i40e/i40e_rxtx.c           |  7 ++++---\n drivers/net/i40e/i40e_rxtx.h           |  3 ++-\n drivers/net/iavf/iavf_ethdev.c         |  8 +++++---\n drivers/net/ice/ice_dcf_ethdev.c       |  5 +++--\n drivers/net/ice/ice_ethdev.c           |  8 +++++---\n drivers/net/ice/ice_rxtx.c             | 11 ++++++-----\n drivers/net/ice/ice_rxtx.h             |  3 ++-\n drivers/net/idpf/idpf_ethdev.c         |  5 +++--\n drivers/net/igc/igc_ethdev.c           |  8 +++++---\n drivers/net/ionic/ionic_rxtx.c         |  5 +++--\n drivers/net/ionic/ionic_rxtx.h         |  3 ++-\n drivers/net/ixgbe/ixgbe_ethdev.c       | 14 ++++++++-----\n drivers/net/mana/mana.c                |  5 +++--\n drivers/net/mlx4/mlx4.h                |  3 ++-\n drivers/net/mlx4/mlx4_ethdev.c         | 11 ++++++-----\n drivers/net/mlx5/mlx5.h                |  3 ++-\n drivers/net/mlx5/mlx5_ethdev.c         |  7 ++++---\n drivers/net/mvneta/mvneta_ethdev.c     |  5 +++--\n drivers/net/mvpp2/mrvl_ethdev.c        |  5 +++--\n drivers/net/netvsc/hn_var.h            |  3 ++-\n drivers/net/netvsc/hn_vf.c             |  6 ++++--\n drivers/net/nfp/nfp_net_common.c       |  4 ++--\n drivers/net/nfp/nfp_net_common.h       |  3 ++-\n drivers/net/ngbe/ngbe_ethdev.c         |  4 ++--\n drivers/net/ngbe/ngbe_ethdev.h         |  3 ++-\n drivers/net/ngbe/ngbe_ptypes.c         |  4 ++--\n drivers/net/ngbe/ngbe_ptypes.h         |  2 +-\n drivers/net/octeontx/octeontx_ethdev.c |  9 +++++----\n drivers/net/pfe/pfe_ethdev.c           |  7 ++++---\n drivers/net/qede/qede_ethdev.c         |  8 +++++---\n drivers/net/sfc/sfc_dp_rx.h            |  2 +-\n drivers/net/sfc/sfc_ef10.h             |  3 ++-\n drivers/net/sfc/sfc_ef100_rx.c         |  5 +++--\n drivers/net/sfc/sfc_ef10_rx.c          |  6 +++---\n drivers/net/sfc/sfc_ethdev.c           |  5 +++--\n drivers/net/sfc/sfc_rx.c               |  5 +++--\n drivers/net/tap/rte_eth_tap.c          |  5 +++--\n drivers/net/thunderx/nicvf_ethdev.c    |  7 ++-----\n drivers/net/txgbe/txgbe_ethdev.c       |  4 ++--\n drivers/net/txgbe/txgbe_ethdev.h       |  3 ++-\n drivers/net/txgbe/txgbe_ptypes.c       |  4 ++--\n drivers/net/txgbe/txgbe_ptypes.h       |  2 +-\n drivers/net/vmxnet3/vmxnet3_ethdev.c   | 11 +++++++----\n lib/ethdev/ethdev_driver.h             | 21 +++++++++++++++++---\n lib/ethdev/rte_ethdev.c                | 27 +++++++++++++++++---------\n 62 files changed, 243 insertions(+), 158 deletions(-)",
    "diff": "diff --git a/drivers/net/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_ethdev.c\nindex 3a028f4290..9cde935834 100644\n--- a/drivers/net/atlantic/atl_ethdev.c\n+++ b/drivers/net/atlantic/atl_ethdev.c\n@@ -43,7 +43,8 @@ static int atl_dev_stats_reset(struct rte_eth_dev *dev);\n static int atl_fw_version_get(struct rte_eth_dev *dev, char *fw_version,\n \t\t\t      size_t fw_size);\n \n-static const uint32_t *atl_dev_supported_ptypes_get(struct rte_eth_dev *dev);\n+static const uint32_t *atl_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t\t    size_t *no_of_elements);\n \n static int atl_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);\n \n@@ -1132,7 +1133,7 @@ atl_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n }\n \n static const uint32_t *\n-atl_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+atl_dev_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -1144,11 +1145,12 @@ atl_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_L4_UDP,\n \t\tRTE_PTYPE_L4_SCTP,\n \t\tRTE_PTYPE_L4_ICMP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n-\tif (dev->rx_pkt_burst == atl_recv_pkts)\n+\tif (dev->rx_pkt_burst == atl_recv_pkts) {\n+\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\treturn ptypes;\n+\t}\n \n \treturn NULL;\n }\ndiff --git a/drivers/net/axgbe/axgbe_ethdev.c b/drivers/net/axgbe/axgbe_ethdev.c\nindex f174d46143..f5aa41870a 100644\n--- a/drivers/net/axgbe/axgbe_ethdev.c\n+++ b/drivers/net/axgbe/axgbe_ethdev.c\n@@ -93,7 +93,8 @@ static void axgbe_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,\n \tstruct rte_eth_rxq_info *qinfo);\n static void axgbe_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,\n \tstruct rte_eth_txq_info *qinfo);\n-const uint32_t *axgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev);\n+const uint32_t *axgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t       size_t *no_of_elements);\n static int axgb_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);\n \n static int\n@@ -1454,7 +1455,7 @@ axgbe_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,\n \tqinfo->conf.tx_free_thresh = txq->free_thresh;\n }\n const uint32_t *\n-axgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+axgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -1481,11 +1482,12 @@ axgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_SCTP,\n \t\tRTE_PTYPE_INNER_L4_TCP,\n \t\tRTE_PTYPE_INNER_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n-\tif (dev->rx_pkt_burst == axgbe_recv_pkts)\n+\tif (dev->rx_pkt_burst == axgbe_recv_pkts) {\n+\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\treturn ptypes;\n+\t}\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c\nindex acf7e6e46e..9bcf57f003 100644\n--- a/drivers/net/bnxt/bnxt_ethdev.c\n+++ b/drivers/net/bnxt/bnxt_ethdev.c\n@@ -3435,7 +3435,8 @@ bnxt_flow_ops_get_op(struct rte_eth_dev *dev,\n }\n \n static const uint32_t *\n-bnxt_dev_supported_ptypes_get_op(struct rte_eth_dev *dev)\n+bnxt_dev_supported_ptypes_get_op(struct rte_eth_dev *dev,\n+\t\t\t\t size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER_VLAN,\n@@ -3449,12 +3450,12 @@ bnxt_dev_supported_ptypes_get_op(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_ICMP,\n \t\tRTE_PTYPE_INNER_L4_TCP,\n \t\tRTE_PTYPE_INNER_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n \tif (!dev->rx_pkt_burst)\n \t\treturn NULL;\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h\nindex 4d3ebf123b..37b6395b93 100644\n--- a/drivers/net/cnxk/cnxk_ethdev.h\n+++ b/drivers/net/cnxk/cnxk_ethdev.h\n@@ -613,7 +613,8 @@ int cnxk_nix_tx_descriptor_status(void *txq, uint16_t offset);\n uint32_t cnxk_nix_rx_queue_count(void *rxq);\n \n /* Lookup configuration */\n-const uint32_t *cnxk_nix_supported_ptypes_get(struct rte_eth_dev *eth_dev);\n+const uint32_t *cnxk_nix_supported_ptypes_get(struct rte_eth_dev *eth_dev,\n+\t\t\t\t\t      size_t *no_of_elements);\n void *cnxk_nix_fastpath_lookup_mem_get(void);\n \n /* Devargs */\ndiff --git a/drivers/net/cnxk/cnxk_lookup.c b/drivers/net/cnxk/cnxk_lookup.c\nindex c0a7129a9c..1e8cc396b4 100644\n--- a/drivers/net/cnxk/cnxk_lookup.c\n+++ b/drivers/net/cnxk/cnxk_lookup.c\n@@ -9,7 +9,8 @@\n \n #define LOOKUP_ARRAY_SZ (PTYPE_ARRAY_SZ + ERR_ARRAY_SZ + SA_BASE_TBL_SZ + MEMPOOL_TBL_SZ)\n const uint32_t *\n-cnxk_nix_supported_ptypes_get(struct rte_eth_dev *eth_dev)\n+cnxk_nix_supported_ptypes_get(struct rte_eth_dev *eth_dev,\n+\t\t\t      size_t *no_of_elements)\n {\n \tRTE_SET_USED(eth_dev);\n \n@@ -47,10 +48,10 @@ cnxk_nix_supported_ptypes_get(struct rte_eth_dev *eth_dev)\n \t\tRTE_PTYPE_INNER_L4_TCP,\t      /* LH */\n \t\tRTE_PTYPE_INNER_L4_UDP,\t      /* LH */\n \t\tRTE_PTYPE_INNER_L4_SCTP,      /* LH */\n-\t\tRTE_PTYPE_INNER_L4_ICMP,      /* LH */\n-\t\tRTE_PTYPE_UNKNOWN,\n+\t\tRTE_PTYPE_INNER_L4_ICMP,       /* LH */\n \t};\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/cpfl/cpfl_ethdev.c b/drivers/net/cpfl/cpfl_ethdev.c\nindex 7697aea0ce..ef19aa1b6a 100644\n--- a/drivers/net/cpfl/cpfl_ethdev.c\n+++ b/drivers/net/cpfl/cpfl_ethdev.c\n@@ -273,7 +273,8 @@ cpfl_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)\n }\n \n static const uint32_t *\n-cpfl_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n+cpfl_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused,\n+\t\t\t      size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -284,9 +285,9 @@ cpfl_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L4_TCP,\n \t\tRTE_PTYPE_L4_SCTP,\n \t\tRTE_PTYPE_L4_ICMP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c\nindex 8cc3d9f257..a27b9b266e 100644\n--- a/drivers/net/cxgbe/cxgbe_ethdev.c\n+++ b/drivers/net/cxgbe/cxgbe_ethdev.c\n@@ -1149,16 +1149,18 @@ static int cxgbe_flow_ctrl_set(struct rte_eth_dev *eth_dev,\n }\n \n const uint32_t *\n-cxgbe_dev_supported_ptypes_get(struct rte_eth_dev *eth_dev)\n+cxgbe_dev_supported_ptypes_get(struct rte_eth_dev *eth_dev,\n+\t\t\t       size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L3_IPV4,\n \t\tRTE_PTYPE_L3_IPV6,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n-\tif (eth_dev->rx_pkt_burst == cxgbe_recv_pkts)\n+\tif (eth_dev->rx_pkt_burst == cxgbe_recv_pkts) {\n+\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\treturn ptypes;\n+\t}\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/cxgbe/cxgbe_pfvf.h b/drivers/net/cxgbe/cxgbe_pfvf.h\nindex 21035dd319..11e95b5836 100644\n--- a/drivers/net/cxgbe/cxgbe_pfvf.h\n+++ b/drivers/net/cxgbe/cxgbe_pfvf.h\n@@ -51,7 +51,8 @@ uint16_t cxgbe_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,\n \t\t\t uint16_t nb_pkts);\n uint16_t cxgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,\n \t\t\t uint16_t nb_pkts);\n-const uint32_t *cxgbe_dev_supported_ptypes_get(struct rte_eth_dev *eth_dev);\n+const uint32_t *cxgbe_dev_supported_ptypes_get(struct rte_eth_dev *eth_dev,\n+\t\t\t\t\t       size_t *no_of_elements);\n int cxgbe_dev_xstats_get_by_id(struct rte_eth_dev *dev,\n \t\t\t       const uint64_t *ids, uint64_t *values,\n \t\t\t       unsigned int n);\ndiff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c\nindex 779bdc5860..cd4aa4518c 100644\n--- a/drivers/net/dpaa/dpaa_ethdev.c\n+++ b/drivers/net/dpaa/dpaa_ethdev.c\n@@ -348,7 +348,7 @@ dpaa_eth_dev_configure(struct rte_eth_dev *dev)\n }\n \n static const uint32_t *\n-dpaa_supported_ptypes_get(struct rte_eth_dev *dev)\n+dpaa_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -364,13 +364,14 @@ dpaa_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_L4_UDP,\n \t\tRTE_PTYPE_L4_SCTP,\n \t\tRTE_PTYPE_TUNNEL_ESP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n \tPMD_INIT_FUNC_TRACE();\n \n-\tif (dev->rx_pkt_burst == dpaa_eth_queue_rx)\n+\tif (dev->rx_pkt_burst == dpaa_eth_queue_rx) {\n+\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\treturn ptypes;\n+\t}\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c\nindex 8e610b6bba..0fcefe2b42 100644\n--- a/drivers/net/dpaa2/dpaa2_ethdev.c\n+++ b/drivers/net/dpaa2/dpaa2_ethdev.c\n@@ -1081,7 +1081,7 @@ dpaa2_dev_rx_queue_count(void *rx_queue)\n }\n \n static const uint32_t *\n-dpaa2_supported_ptypes_get(struct rte_eth_dev *dev)\n+dpaa2_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\t/*todo -= add more types */\n@@ -1094,13 +1094,14 @@ dpaa2_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_L4_UDP,\n \t\tRTE_PTYPE_L4_SCTP,\n \t\tRTE_PTYPE_L4_ICMP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n \tif (dev->rx_pkt_burst == dpaa2_dev_prefetch_rx ||\n \t\tdev->rx_pkt_burst == dpaa2_dev_rx ||\n-\t\tdev->rx_pkt_burst == dpaa2_dev_loopback_rx)\n+\t\tdev->rx_pkt_burst == dpaa2_dev_loopback_rx) {\n+\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\treturn ptypes;\n+\t}\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c\nindex 8858f975f8..88ef756d6f 100644\n--- a/drivers/net/e1000/igb_ethdev.c\n+++ b/drivers/net/e1000/igb_ethdev.c\n@@ -104,7 +104,8 @@ static int eth_igb_fw_version_get(struct rte_eth_dev *dev,\n \t\t\t\t   char *fw_version, size_t fw_size);\n static int eth_igb_infos_get(struct rte_eth_dev *dev,\n \t\t\t      struct rte_eth_dev_info *dev_info);\n-static const uint32_t *eth_igb_supported_ptypes_get(struct rte_eth_dev *dev);\n+static const uint32_t *eth_igb_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t\t    size_t *no_of_elements);\n static int eth_igbvf_infos_get(struct rte_eth_dev *dev,\n \t\t\t\tstruct rte_eth_dev_info *dev_info);\n static int  eth_igb_flow_ctrl_get(struct rte_eth_dev *dev,\n@@ -2257,7 +2258,7 @@ eth_igb_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n }\n \n static const uint32_t *\n-eth_igb_supported_ptypes_get(struct rte_eth_dev *dev)\n+eth_igb_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\t/* refers to igb_rxd_pkt_info_to_pkt_type() */\n@@ -2274,12 +2275,13 @@ eth_igb_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L3_IPV6_EXT,\n \t\tRTE_PTYPE_INNER_L4_TCP,\n \t\tRTE_PTYPE_INNER_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n \tif (dev->rx_pkt_burst == eth_igb_recv_pkts ||\n-\t    dev->rx_pkt_burst == eth_igb_recv_scattered_pkts)\n+\t    dev->rx_pkt_burst == eth_igb_recv_scattered_pkts) {\n+\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\treturn ptypes;\n+\t}\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c\nindex c9352f0746..d02ee206f1 100644\n--- a/drivers/net/enetc/enetc_ethdev.c\n+++ b/drivers/net/enetc/enetc_ethdev.c\n@@ -85,7 +85,8 @@ enetc_dev_stop(struct rte_eth_dev *dev)\n }\n \n static const uint32_t *\n-enetc_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n+enetc_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused,\n+\t\t\t   size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -95,9 +96,9 @@ enetc_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L4_UDP,\n \t\tRTE_PTYPE_L4_SCTP,\n \t\tRTE_PTYPE_L4_ICMP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c\nindex b04b6c9aa1..59ef12584d 100644\n--- a/drivers/net/enic/enic_ethdev.c\n+++ b/drivers/net/enic/enic_ethdev.c\n@@ -511,7 +511,8 @@ static int enicpmd_dev_info_get(struct rte_eth_dev *eth_dev,\n \treturn 0;\n }\n \n-static const uint32_t *enicpmd_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+static const uint32_t *enicpmd_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t\t\tsize_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -522,7 +523,6 @@ static const uint32_t *enicpmd_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_L4_UDP,\n \t\tRTE_PTYPE_L4_FRAG,\n \t\tRTE_PTYPE_L4_NONFRAG,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \tstatic const uint32_t ptypes_overlay[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -541,16 +541,18 @@ static const uint32_t *enicpmd_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_UDP,\n \t\tRTE_PTYPE_INNER_L4_FRAG,\n \t\tRTE_PTYPE_INNER_L4_NONFRAG,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n \tif (dev->rx_pkt_burst != rte_eth_pkt_burst_dummy &&\n \t    dev->rx_pkt_burst != NULL) {\n \t\tstruct enic *enic = pmd_priv(dev);\n-\t\tif (enic->overlay_offload)\n+\t\tif (enic->overlay_offload) {\n+\t\t\t*no_of_elements = RTE_DIM(ptypes_overlay);\n \t\t\treturn ptypes_overlay;\n-\t\telse\n+\t\t} else {\n+\t\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\t\treturn ptypes;\n+\t\t}\n \t}\n \treturn NULL;\n }\ndiff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c\nindex 35649b6244..9c013e0419 100644\n--- a/drivers/net/failsafe/failsafe_ops.c\n+++ b/drivers/net/failsafe/failsafe_ops.c\n@@ -1282,7 +1282,7 @@ fs_dev_infos_get(struct rte_eth_dev *dev,\n }\n \n static const uint32_t *\n-fs_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+fs_dev_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tstruct sub_device *sdev;\n \tstruct rte_eth_dev *edev;\n@@ -1308,7 +1308,7 @@ fs_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t * We just return the ptypes of the device of highest\n \t * priority, usually the PREFERRED device.\n \t */\n-\tret = SUBOPS(sdev, dev_supported_ptypes_get)(edev);\n+\tret = SUBOPS(sdev, dev_supported_ptypes_get)(edev, no_of_elements);\n unlock:\n \tfs_unlock(dev, 0);\n \treturn ret;\ndiff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c\nindex 4d3c4c10cf..fa0d16277e 100644\n--- a/drivers/net/fm10k/fm10k_ethdev.c\n+++ b/drivers/net/fm10k/fm10k_ethdev.c\n@@ -1446,7 +1446,7 @@ fm10k_dev_infos_get(struct rte_eth_dev *dev,\n \n #ifdef RTE_LIBRTE_FM10K_RX_OLFLAGS_ENABLE\n static const uint32_t *\n-fm10k_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+fm10k_dev_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tif (dev->rx_pkt_burst == fm10k_recv_pkts ||\n \t    dev->rx_pkt_burst == fm10k_recv_scattered_pkts) {\n@@ -1459,9 +1459,9 @@ fm10k_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\t\tRTE_PTYPE_L3_IPV6_EXT,\n \t\t\tRTE_PTYPE_L4_TCP,\n \t\t\tRTE_PTYPE_L4_UDP,\n-\t\t\tRTE_PTYPE_UNKNOWN\n \t\t};\n \n+\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\treturn ptypes;\n \t} else if (dev->rx_pkt_burst == fm10k_recv_pkts_vec ||\n \t\t   dev->rx_pkt_burst == fm10k_recv_scattered_pkts_vec) {\n@@ -1477,9 +1477,9 @@ fm10k_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\t\tRTE_PTYPE_TUNNEL_NVGRE,\n \t\t\tRTE_PTYPE_TUNNEL_VXLAN,\n \t\t\tRTE_PTYPE_TUNNEL_GRE,\n-\t\t\tRTE_PTYPE_UNKNOWN\n \t\t};\n \n+\t\t*no_of_elements = RTE_DIM(ptypes_vec);\n \t\treturn ptypes_vec;\n \t}\n \n@@ -1487,7 +1487,8 @@ fm10k_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n }\n #else\n static const uint32_t *\n-fm10k_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n+fm10k_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused,\n+\t\t\t       size_t *no_of_elements)\n {\n \treturn NULL;\n }\ndiff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c\nindex 09b7e90c70..1c92279dfb 100644\n--- a/drivers/net/hns3/hns3_rxtx.c\n+++ b/drivers/net/hns3/hns3_rxtx.c\n@@ -1971,7 +1971,7 @@ hns3_rx_scattered_calc(struct rte_eth_dev *dev)\n }\n \n const uint32_t *\n-hns3_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+hns3_dev_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -1998,7 +1998,6 @@ hns3_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_ICMP,\n \t\tRTE_PTYPE_TUNNEL_GRENAT,\n \t\tRTE_PTYPE_TUNNEL_NVGRE,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \tstatic const uint32_t adv_layout_ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -2026,7 +2025,6 @@ hns3_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_TCP,\n \t\tRTE_PTYPE_INNER_L4_SCTP,\n \t\tRTE_PTYPE_INNER_L4_ICMP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \tstruct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n \n@@ -2034,10 +2032,13 @@ hns3_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t    dev->rx_pkt_burst == hns3_recv_scattered_pkts ||\n \t    dev->rx_pkt_burst == hns3_recv_pkts_vec ||\n \t    dev->rx_pkt_burst == hns3_recv_pkts_vec_sve) {\n-\t\tif (hns3_dev_get_support(hw, RXD_ADV_LAYOUT))\n+\t\tif (hns3_dev_get_support(hw, RXD_ADV_LAYOUT)) {\n+\t\t\t*no_of_elements = RTE_DIM(adv_layout_ptypes);\n \t\t\treturn adv_layout_ptypes;\n-\t\telse\n+\t\t} else {\n+\t\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\t\treturn ptypes;\n+\t\t}\n \t}\n \n \treturn NULL;\ndiff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h\nindex b6a6513307..c1c8bd29d8 100644\n--- a/drivers/net/hns3/hns3_rxtx.h\n+++ b/drivers/net/hns3/hns3_rxtx.h\n@@ -776,7 +776,8 @@ uint16_t hns3_xmit_pkts_vec_sve(void *tx_queue, struct rte_mbuf **tx_pkts,\n int hns3_tx_burst_mode_get(struct rte_eth_dev *dev,\n \t\t\t   __rte_unused uint16_t queue_id,\n \t\t\t   struct rte_eth_burst_mode *mode);\n-const uint32_t *hns3_dev_supported_ptypes_get(struct rte_eth_dev *dev);\n+const uint32_t *hns3_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t      size_t *no_of_elements);\n void hns3_init_rx_ptype_tble(struct rte_eth_dev *dev);\n void hns3_set_rxtx_function(struct rte_eth_dev *eth_dev);\n uint32_t hns3_get_tqp_intr_reg_offset(uint16_t tqp_intr_id);\ndiff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c\nindex 9aa5facb53..a0bc30d45b 100644\n--- a/drivers/net/i40e/i40e_rxtx.c\n+++ b/drivers/net/i40e/i40e_rxtx.c\n@@ -1823,7 +1823,7 @@ i40e_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id)\n }\n \n const uint32_t *\n-i40e_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+i40e_dev_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\t/* refers to i40e_rxd_pkt_type_mapping() */\n@@ -1851,7 +1851,6 @@ i40e_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_SCTP,\n \t\tRTE_PTYPE_INNER_L4_TCP,\n \t\tRTE_PTYPE_INNER_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n \tif (dev->rx_pkt_burst == i40e_recv_pkts ||\n@@ -1866,8 +1865,10 @@ i40e_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t    dev->rx_pkt_burst == i40e_recv_pkts_vec_avx512 ||\n #endif\n \t    dev->rx_pkt_burst == i40e_recv_scattered_pkts_vec_avx2 ||\n-\t    dev->rx_pkt_burst == i40e_recv_pkts_vec_avx2)\n+\t    dev->rx_pkt_burst == i40e_recv_pkts_vec_avx2) {\n+\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\treturn ptypes;\n+\t}\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h\nindex b191f23e1f..6189ed0cd5 100644\n--- a/drivers/net/i40e/i40e_rxtx.h\n+++ b/drivers/net/i40e/i40e_rxtx.h\n@@ -190,7 +190,8 @@ int i40e_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id);\n int i40e_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id);\n int i40e_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id);\n int i40e_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id);\n-const uint32_t *i40e_dev_supported_ptypes_get(struct rte_eth_dev *dev);\n+const uint32_t *i40e_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t      size_t *no_of_elements);\n int i40e_dev_rx_queue_setup(struct rte_eth_dev *dev,\n \t\t\t    uint16_t queue_idx,\n \t\t\t    uint16_t nb_desc,\ndiff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c\nindex d1edb0dd5c..8bbfbafccb 100644\n--- a/drivers/net/iavf/iavf_ethdev.c\n+++ b/drivers/net/iavf/iavf_ethdev.c\n@@ -97,7 +97,8 @@ static int iavf_dev_close(struct rte_eth_dev *dev);\n static int iavf_dev_reset(struct rte_eth_dev *dev);\n static int iavf_dev_info_get(struct rte_eth_dev *dev,\n \t\t\t     struct rte_eth_dev_info *dev_info);\n-static const uint32_t *iavf_dev_supported_ptypes_get(struct rte_eth_dev *dev);\n+static const uint32_t *iavf_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t\t     size_t *no_of_elements);\n static int iavf_dev_stats_get(struct rte_eth_dev *dev,\n \t\t\t     struct rte_eth_stats *stats);\n static int iavf_dev_stats_reset(struct rte_eth_dev *dev);\n@@ -1217,7 +1218,8 @@ iavf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n }\n \n static const uint32_t *\n-iavf_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n+iavf_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused,\n+\t\t\t      size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -1228,8 +1230,8 @@ iavf_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L4_SCTP,\n \t\tRTE_PTYPE_L4_TCP,\n \t\tRTE_PTYPE_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c\nindex 5d845bba31..71eceb4f72 100644\n--- a/drivers/net/ice/ice_dcf_ethdev.c\n+++ b/drivers/net/ice/ice_dcf_ethdev.c\n@@ -1864,7 +1864,8 @@ ice_dcf_dev_reset(struct rte_eth_dev *dev)\n }\n \n static const uint32_t *\n-ice_dcf_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n+ice_dcf_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused,\n+\t\t\t\t size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -1875,8 +1876,8 @@ ice_dcf_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L4_SCTP,\n \t\tRTE_PTYPE_L4_TCP,\n \t\tRTE_PTYPE_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c\nindex 3ccba4db80..5e1339687f 100644\n--- a/drivers/net/ice/ice_ethdev.c\n+++ b/drivers/net/ice/ice_ethdev.c\n@@ -178,7 +178,8 @@ static int ice_timesync_read_time(struct rte_eth_dev *dev,\n static int ice_timesync_write_time(struct rte_eth_dev *dev,\n \t\t\t\t   const struct timespec *timestamp);\n static int ice_timesync_disable(struct rte_eth_dev *dev);\n-static const uint32_t *ice_buffer_split_supported_hdr_ptypes_get(struct rte_eth_dev *dev);\n+static const uint32_t *ice_buffer_split_supported_hdr_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t\tsize_t *no_of_elements);\n \n static const struct rte_pci_id pci_id_ice_map[] = {\n \t{ RTE_PCI_DEVICE(ICE_INTEL_VENDOR_ID, ICE_DEV_ID_E823L_BACKPLANE) },\n@@ -6468,7 +6469,8 @@ ice_timesync_disable(struct rte_eth_dev *dev)\n }\n \n static const uint32_t *\n-ice_buffer_split_supported_hdr_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n+ice_buffer_split_supported_hdr_ptypes_get(struct rte_eth_dev *dev __rte_unused,\n+\t\t\t\t\t  size_t *no_of_elements)\n {\n \t/* Buffer split protocol header capability. */\n \tstatic const uint32_t ptypes[] = {\n@@ -6507,9 +6509,9 @@ ice_buffer_split_supported_hdr_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |\n \t\tRTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN | RTE_PTYPE_INNER_L4_SCTP,\n \n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/ice/ice_rxtx.c b/drivers/net/ice/ice_rxtx.c\nindex 73e47ae92d..75648deb93 100644\n--- a/drivers/net/ice/ice_rxtx.c\n+++ b/drivers/net/ice/ice_rxtx.c\n@@ -2200,7 +2200,7 @@ ice_recv_scattered_pkts(void *rx_queue,\n }\n \n const uint32_t *\n-ice_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+ice_dev_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tstruct ice_adapter *ad =\n \t\tICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);\n@@ -2231,7 +2231,6 @@ ice_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_SCTP,\n \t\tRTE_PTYPE_INNER_L4_TCP,\n \t\tRTE_PTYPE_INNER_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n \tstatic const uint32_t ptypes_comms[] = {\n@@ -2262,13 +2261,15 @@ ice_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_TUNNEL_GTPC,\n \t\tRTE_PTYPE_TUNNEL_GTPU,\n \t\tRTE_PTYPE_L2_ETHER_PPPOE,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n-\tif (ad->active_pkg_type == ICE_PKG_TYPE_COMMS)\n+\tif (ad->active_pkg_type == ICE_PKG_TYPE_COMMS) {\n+\t\t*no_of_elements = RTE_DIM(ptypes_comms);\n \t\tptypes = ptypes_comms;\n-\telse\n+\t} else {\n+\t\t*no_of_elements = RTE_DIM(ptypes_os);\n \t\tptypes = ptypes_os;\n+\t}\n \n \tif (dev->rx_pkt_burst == ice_recv_pkts ||\n \t    dev->rx_pkt_burst == ice_recv_pkts_bulk_alloc ||\ndiff --git a/drivers/net/ice/ice_rxtx.h b/drivers/net/ice/ice_rxtx.h\nindex bd2c4abec9..52e52cff34 100644\n--- a/drivers/net/ice/ice_rxtx.h\n+++ b/drivers/net/ice/ice_rxtx.h\n@@ -271,7 +271,8 @@ int ice_tx_burst_mode_get(struct rte_eth_dev *dev, uint16_t queue_id,\n int ice_rx_descriptor_status(void *rx_queue, uint16_t offset);\n int ice_tx_descriptor_status(void *tx_queue, uint16_t offset);\n void ice_set_default_ptype_table(struct rte_eth_dev *dev);\n-const uint32_t *ice_dev_supported_ptypes_get(struct rte_eth_dev *dev);\n+const uint32_t *ice_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t     size_t *no_of_elements);\n void ice_select_rxd_to_pkt_fields_handler(struct ice_rx_queue *rxq,\n \t\t\t\t\t  uint32_t rxdid);\n \ndiff --git a/drivers/net/idpf/idpf_ethdev.c b/drivers/net/idpf/idpf_ethdev.c\nindex 6ae2ac2681..86151c9ec9 100644\n--- a/drivers/net/idpf/idpf_ethdev.c\n+++ b/drivers/net/idpf/idpf_ethdev.c\n@@ -232,7 +232,8 @@ idpf_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)\n }\n \n static const uint32_t *\n-idpf_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n+idpf_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused,\n+\t\t\t      size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -243,9 +244,9 @@ idpf_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L4_TCP,\n \t\tRTE_PTYPE_L4_SCTP,\n \t\tRTE_PTYPE_L4_ICMP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/igc/igc_ethdev.c b/drivers/net/igc/igc_ethdev.c\nindex 58c4f80927..08e9e16ae5 100644\n--- a/drivers/net/igc/igc_ethdev.c\n+++ b/drivers/net/igc/igc_ethdev.c\n@@ -207,7 +207,8 @@ static int eth_igc_infos_get(struct rte_eth_dev *dev,\n \t\t\tstruct rte_eth_dev_info *dev_info);\n static int eth_igc_led_on(struct rte_eth_dev *dev);\n static int eth_igc_led_off(struct rte_eth_dev *dev);\n-static const uint32_t *eth_igc_supported_ptypes_get(struct rte_eth_dev *dev);\n+static const uint32_t *eth_igc_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t\t    size_t *no_of_elements);\n static int eth_igc_rar_set(struct rte_eth_dev *dev,\n \t\tstruct rte_ether_addr *mac_addr, uint32_t index, uint32_t pool);\n static void eth_igc_rar_clear(struct rte_eth_dev *dev, uint32_t index);\n@@ -1650,7 +1651,8 @@ eth_igc_led_off(struct rte_eth_dev *dev)\n }\n \n static const uint32_t *\n-eth_igc_supported_ptypes_get(__rte_unused struct rte_eth_dev *dev)\n+eth_igc_supported_ptypes_get(__rte_unused struct rte_eth_dev *dev,\n+\t\t\t     size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\t/* refers to rx_desc_pkt_info_to_pkt_type() */\n@@ -1667,9 +1669,9 @@ eth_igc_supported_ptypes_get(__rte_unused struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L3_IPV6_EXT,\n \t\tRTE_PTYPE_INNER_L4_TCP,\n \t\tRTE_PTYPE_INNER_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/ionic/ionic_rxtx.c b/drivers/net/ionic/ionic_rxtx.c\nindex b9e73b4871..79bfa0fbc7 100644\n--- a/drivers/net/ionic/ionic_rxtx.c\n+++ b/drivers/net/ionic/ionic_rxtx.c\n@@ -619,7 +619,8 @@ const uint32_t ionic_ptype_table[IONIC_RXQ_COMP_PKT_TYPE_MASK]\n };\n \n const uint32_t *\n-ionic_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n+ionic_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused,\n+\t\t\t       size_t *no_of_elements)\n {\n \t/* See ionic_ptype_table[] */\n \tstatic const uint32_t ptypes[] = {\n@@ -631,9 +632,9 @@ ionic_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L3_IPV6,\n \t\tRTE_PTYPE_L4_TCP,\n \t\tRTE_PTYPE_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/ionic/ionic_rxtx.h b/drivers/net/ionic/ionic_rxtx.h\nindex 8537141597..59e6a4afb1 100644\n--- a/drivers/net/ionic/ionic_rxtx.h\n+++ b/drivers/net/ionic/ionic_rxtx.h\n@@ -54,7 +54,8 @@ void ionic_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,\n int ionic_dev_rx_descriptor_status(void *rx_queue, uint16_t offset);\n int ionic_dev_tx_descriptor_status(void *tx_queue, uint16_t offset);\n \n-const uint32_t *ionic_dev_supported_ptypes_get(struct rte_eth_dev *dev);\n+const uint32_t *ionic_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t       size_t *no_of_elements);\n \n int ionic_tx_tso(struct ionic_tx_qcq *txq, struct rte_mbuf *txm);\n \ndiff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c\nindex d6cf00317e..87e926b73b 100644\n--- a/drivers/net/ixgbe/ixgbe_ethdev.c\n+++ b/drivers/net/ixgbe/ixgbe_ethdev.c\n@@ -191,7 +191,8 @@ static int ixgbe_fw_version_get(struct rte_eth_dev *dev, char *fw_version,\n \t\t\t\t size_t fw_size);\n static int ixgbe_dev_info_get(struct rte_eth_dev *dev,\n \t\t\t      struct rte_eth_dev_info *dev_info);\n-static const uint32_t *ixgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev);\n+static const uint32_t *ixgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t\t      size_t *no_of_elements);\n static int ixgbevf_dev_info_get(struct rte_eth_dev *dev,\n \t\t\t\tstruct rte_eth_dev_info *dev_info);\n static int ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);\n@@ -3978,7 +3979,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n }\n \n static const uint32_t *\n-ixgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+ixgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\t/* For non-vec functions,\n@@ -3999,19 +4000,22 @@ ixgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L3_IPV6_EXT,\n \t\tRTE_PTYPE_INNER_L4_TCP,\n \t\tRTE_PTYPE_INNER_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n \tif (dev->rx_pkt_burst == ixgbe_recv_pkts ||\n \t    dev->rx_pkt_burst == ixgbe_recv_pkts_lro_single_alloc ||\n \t    dev->rx_pkt_burst == ixgbe_recv_pkts_lro_bulk_alloc ||\n-\t    dev->rx_pkt_burst == ixgbe_recv_pkts_bulk_alloc)\n+\t    dev->rx_pkt_burst == ixgbe_recv_pkts_bulk_alloc) {\n+\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\treturn ptypes;\n+\t}\n \n #if defined(RTE_ARCH_X86) || defined(__ARM_NEON)\n \tif (dev->rx_pkt_burst == ixgbe_recv_pkts_vec ||\n-\t    dev->rx_pkt_burst == ixgbe_recv_scattered_pkts_vec)\n+\t    dev->rx_pkt_burst == ixgbe_recv_scattered_pkts_vec) {\n+\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\treturn ptypes;\n+\t}\n #endif\n \treturn NULL;\n }\ndiff --git a/drivers/net/mana/mana.c b/drivers/net/mana/mana.c\nindex 781ed76139..c982df4074 100644\n--- a/drivers/net/mana/mana.c\n+++ b/drivers/net/mana/mana.c\n@@ -387,7 +387,8 @@ mana_dev_rx_queue_info(struct rte_eth_dev *dev, uint16_t queue_id,\n }\n \n static const uint32_t *\n-mana_supported_ptypes(struct rte_eth_dev *dev __rte_unused)\n+mana_supported_ptypes(struct rte_eth_dev *dev __rte_unused,\n+\t\t      size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -396,9 +397,9 @@ mana_supported_ptypes(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L4_FRAG,\n \t\tRTE_PTYPE_L4_TCP,\n \t\tRTE_PTYPE_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h\nindex d90570add6..c992a1c5ea 100644\n--- a/drivers/net/mlx4/mlx4.h\n+++ b/drivers/net/mlx4/mlx4.h\n@@ -229,7 +229,8 @@ int mlx4_flow_ctrl_get(struct rte_eth_dev *dev,\n \t\t       struct rte_eth_fc_conf *fc_conf);\n int mlx4_flow_ctrl_set(struct rte_eth_dev *dev,\n \t\t       struct rte_eth_fc_conf *fc_conf);\n-const uint32_t *mlx4_dev_supported_ptypes_get(struct rte_eth_dev *dev);\n+const uint32_t *mlx4_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t      size_t *no_of_elements);\n int mlx4_is_removed(struct rte_eth_dev *dev);\n \n /* mlx4_intr.c */\ndiff --git a/drivers/net/mlx4/mlx4_ethdev.c b/drivers/net/mlx4/mlx4_ethdev.c\nindex bb1dd33e7c..f11c6b4373 100644\n--- a/drivers/net/mlx4/mlx4_ethdev.c\n+++ b/drivers/net/mlx4/mlx4_ethdev.c\n@@ -934,7 +934,7 @@ mlx4_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)\n  *   NULL otherwise.\n  */\n const uint32_t *\n-mlx4_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+mlx4_dev_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\t/* refers to rxq_cq_to_pkt_type() */\n@@ -944,7 +944,6 @@ mlx4_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_L4_FRAG,\n \t\tRTE_PTYPE_L4_TCP,\n \t\tRTE_PTYPE_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \tstatic const uint32_t ptypes_l2tun[] = {\n \t\t/* refers to rxq_cq_to_pkt_type() */\n@@ -956,15 +955,17 @@ mlx4_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_L4_UDP,\n \t\tRTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN,\n \t\tRTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \tstruct mlx4_priv *priv = dev->data->dev_private;\n \n \tif (dev->rx_pkt_burst == mlx4_rx_burst) {\n-\t\tif (priv->hw_csum_l2tun)\n+\t\tif (priv->hw_csum_l2tun) {\n+\t\t\t*no_of_elements = RTE_DIM(ptypes_l2tun);\n \t\t\treturn ptypes_l2tun;\n-\t\telse\n+\t\t} else {\n+\t\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\t\treturn ptypes;\n+\t\t}\n \t}\n \treturn NULL;\n }\ndiff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex 263ebead7f..18709498bb 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -2090,7 +2090,8 @@ uint16_t mlx5_representor_id_encode(const struct mlx5_switch_info *info,\n \t\t\t\t    enum rte_eth_representor_type hpf_type);\n int mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info);\n int mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size);\n-const uint32_t *mlx5_dev_supported_ptypes_get(struct rte_eth_dev *dev);\n+const uint32_t *mlx5_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t      size_t *no_of_elements);\n int mlx5_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu);\n int mlx5_hairpin_cap_get(struct rte_eth_dev *dev,\n \t\t\t struct rte_eth_hairpin_cap *cap);\ndiff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c\nindex ab30e2c215..fb6d9d28ba 100644\n--- a/drivers/net/mlx5/mlx5_ethdev.c\n+++ b/drivers/net/mlx5/mlx5_ethdev.c\n@@ -579,7 +579,7 @@ mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size)\n  *   A pointer to the supported Packet types array.\n  */\n const uint32_t *\n-mlx5_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+mlx5_dev_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\t/* refers to rxq_cq_to_pkt_type() */\n@@ -596,14 +596,15 @@ mlx5_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_FRAG,\n \t\tRTE_PTYPE_INNER_L4_TCP,\n \t\tRTE_PTYPE_INNER_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n \tif (dev->rx_pkt_burst == mlx5_rx_burst ||\n \t    dev->rx_pkt_burst == mlx5_rx_burst_mprq ||\n \t    dev->rx_pkt_burst == mlx5_rx_burst_vec ||\n-\t    dev->rx_pkt_burst == mlx5_rx_burst_mprq_vec)\n+\t    dev->rx_pkt_burst == mlx5_rx_burst_mprq_vec) {\n+\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\treturn ptypes;\n+\t}\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/mvneta/mvneta_ethdev.c b/drivers/net/mvneta/mvneta_ethdev.c\nindex 212c300c14..3841c1ebe9 100644\n--- a/drivers/net/mvneta/mvneta_ethdev.c\n+++ b/drivers/net/mvneta/mvneta_ethdev.c\n@@ -190,7 +190,8 @@ mvneta_dev_infos_get(struct rte_eth_dev *dev __rte_unused,\n  *   Const pointer to the table with supported packet types.\n  */\n static const uint32_t *\n-mvneta_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n+mvneta_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused,\n+\t\t\t\tsize_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -199,9 +200,9 @@ mvneta_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L3_IPV6,\n \t\tRTE_PTYPE_L4_TCP,\n \t\tRTE_PTYPE_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/mvpp2/mrvl_ethdev.c b/drivers/net/mvpp2/mrvl_ethdev.c\nindex 4cc64c7cad..b45728ec9f 100644\n--- a/drivers/net/mvpp2/mrvl_ethdev.c\n+++ b/drivers/net/mvpp2/mrvl_ethdev.c\n@@ -1764,7 +1764,8 @@ mrvl_dev_infos_get(struct rte_eth_dev *dev,\n  *   Const pointer to the table with supported packet types.\n  */\n static const uint32_t *\n-mrvl_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n+mrvl_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused,\n+\t\t\t      size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -1778,9 +1779,9 @@ mrvl_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L2_ETHER_ARP,\n \t\tRTE_PTYPE_L4_TCP,\n \t\tRTE_PTYPE_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h\nindex e37946804d..ba86129ff6 100644\n--- a/drivers/net/netvsc/hn_var.h\n+++ b/drivers/net/netvsc/hn_var.h\n@@ -246,7 +246,8 @@ int\thn_vf_info_get(struct hn_data *hv,\n int\thn_vf_add(struct rte_eth_dev *dev, struct hn_data *hv);\n int\thn_vf_configure_locked(struct rte_eth_dev *dev,\n \t\t\t       const struct rte_eth_conf *dev_conf);\n-const uint32_t *hn_vf_supported_ptypes(struct rte_eth_dev *dev);\n+const uint32_t *hn_vf_supported_ptypes(struct rte_eth_dev *dev,\n+\t\t\t\t       size_t *no_of_elements);\n int\thn_vf_start(struct rte_eth_dev *dev);\n int\thn_vf_close(struct rte_eth_dev *dev);\n int\thn_vf_stop(struct rte_eth_dev *dev);\ndiff --git a/drivers/net/netvsc/hn_vf.c b/drivers/net/netvsc/hn_vf.c\nindex 90cb6f6923..6b3d0eb0c8 100644\n--- a/drivers/net/netvsc/hn_vf.c\n+++ b/drivers/net/netvsc/hn_vf.c\n@@ -466,7 +466,8 @@ int hn_vf_configure_locked(struct rte_eth_dev *dev,\n \treturn ret;\n }\n \n-const uint32_t *hn_vf_supported_ptypes(struct rte_eth_dev *dev)\n+const uint32_t *hn_vf_supported_ptypes(struct rte_eth_dev *dev,\n+\t\t\t\t       size_t *no_of_elements)\n {\n \tstruct hn_data *hv = dev->data->dev_private;\n \tstruct rte_eth_dev *vf_dev;\n@@ -475,7 +476,8 @@ const uint32_t *hn_vf_supported_ptypes(struct rte_eth_dev *dev)\n \trte_rwlock_read_lock(&hv->vf_lock);\n \tvf_dev = hn_get_vf_dev(hv);\n \tif (vf_dev && vf_dev->dev_ops->dev_supported_ptypes_get)\n-\t\tptypes = (*vf_dev->dev_ops->dev_supported_ptypes_get)(vf_dev);\n+\t\tptypes = (*vf_dev->dev_ops->dev_supported_ptypes_get)(vf_dev,\n+\t\t\t\t\t\t\t      no_of_elements);\n \trte_rwlock_read_unlock(&hv->vf_lock);\n \n \treturn ptypes;\ndiff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c\nindex 46d0e07850..b8c9c9f9d3 100644\n--- a/drivers/net/nfp/nfp_net_common.c\n+++ b/drivers/net/nfp/nfp_net_common.c\n@@ -1266,7 +1266,7 @@ nfp_net_common_init(struct rte_pci_device *pci_dev,\n }\n \n const uint32_t *\n-nfp_net_supported_ptypes_get(struct rte_eth_dev *dev)\n+nfp_net_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tstruct nfp_net_hw *net_hw;\n \tstatic const uint32_t ptypes[] = {\n@@ -1299,7 +1299,6 @@ nfp_net_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_NONFRAG,\n \t\tRTE_PTYPE_INNER_L4_ICMP,\n \t\tRTE_PTYPE_INNER_L4_SCTP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n \tif (dev->rx_pkt_burst != nfp_net_recv_pkts)\n@@ -1309,6 +1308,7 @@ nfp_net_supported_ptypes_get(struct rte_eth_dev *dev)\n \tif ((net_hw->super.cap_ext & NFP_NET_CFG_CTRL_PKT_TYPE) == 0)\n \t\treturn NULL;\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h\nindex 30fea7ae02..bb724b8666 100644\n--- a/drivers/net/nfp/nfp_net_common.h\n+++ b/drivers/net/nfp/nfp_net_common.h\n@@ -229,7 +229,8 @@ int nfp_net_xstats_get_by_id(struct rte_eth_dev *dev,\n int nfp_net_xstats_reset(struct rte_eth_dev *dev);\n int nfp_net_infos_get(struct rte_eth_dev *dev,\n \t\tstruct rte_eth_dev_info *dev_info);\n-const uint32_t *nfp_net_supported_ptypes_get(struct rte_eth_dev *dev);\n+const uint32_t *nfp_net_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t     size_t *no_of_elements);\n int nfp_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id);\n int nfp_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id);\n void nfp_net_params_setup(struct nfp_net_hw *hw);\ndiff --git a/drivers/net/ngbe/ngbe_ethdev.c b/drivers/net/ngbe/ngbe_ethdev.c\nindex 478da014b2..4cd07a0030 100644\n--- a/drivers/net/ngbe/ngbe_ethdev.c\n+++ b/drivers/net/ngbe/ngbe_ethdev.c\n@@ -1864,13 +1864,13 @@ ngbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n }\n \n const uint32_t *\n-ngbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+ngbe_dev_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tif (dev->rx_pkt_burst == ngbe_recv_pkts ||\n \t    dev->rx_pkt_burst == ngbe_recv_pkts_sc_single_alloc ||\n \t    dev->rx_pkt_burst == ngbe_recv_pkts_sc_bulk_alloc ||\n \t    dev->rx_pkt_burst == ngbe_recv_pkts_bulk_alloc)\n-\t\treturn ngbe_get_supported_ptypes();\n+\t\treturn ngbe_get_supported_ptypes(no_of_elements);\n \n \treturn NULL;\n }\ndiff --git a/drivers/net/ngbe/ngbe_ethdev.h b/drivers/net/ngbe/ngbe_ethdev.h\nindex 3cde7c8750..70ed1920dd 100644\n--- a/drivers/net/ngbe/ngbe_ethdev.h\n+++ b/drivers/net/ngbe/ngbe_ethdev.h\n@@ -328,7 +328,8 @@ struct rte_ngbe_xstats_name_off {\n \tunsigned int offset;\n };\n \n-const uint32_t *ngbe_dev_supported_ptypes_get(struct rte_eth_dev *dev);\n+const uint32_t *ngbe_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t      size_t *no_of_elements);\n int ngbe_dev_set_mc_addr_list(struct rte_eth_dev *dev,\n \t\t\t\t      struct rte_ether_addr *mc_addr_set,\n \t\t\t\t      uint32_t nb_mc_addr);\ndiff --git a/drivers/net/ngbe/ngbe_ptypes.c b/drivers/net/ngbe/ngbe_ptypes.c\nindex 33f20e9247..d8239824da 100644\n--- a/drivers/net/ngbe/ngbe_ptypes.c\n+++ b/drivers/net/ngbe/ngbe_ptypes.c\n@@ -92,7 +92,7 @@ static u32 ngbe_ptype_lookup[NGBE_PTID_MAX] __rte_cache_aligned = {\n \tTPTE(0xCD, ETHER, IPV6, NONE, IP, NONE, IPV6, SCTP),\n };\n \n-u32 *ngbe_get_supported_ptypes(void)\n+u32 *ngbe_get_supported_ptypes(size_t *no_of_elements)\n {\n \tstatic u32 ptypes[] = {\n \t\t/* For non-vec functions,\n@@ -111,9 +111,9 @@ u32 *ngbe_get_supported_ptypes(void)\n \t\tRTE_PTYPE_INNER_L3_IPV6_EXT,\n \t\tRTE_PTYPE_INNER_L4_TCP,\n \t\tRTE_PTYPE_INNER_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/ngbe/ngbe_ptypes.h b/drivers/net/ngbe/ngbe_ptypes.h\nindex 16635e3390..e4238d50f8 100644\n--- a/drivers/net/ngbe/ngbe_ptypes.h\n+++ b/drivers/net/ngbe/ngbe_ptypes.h\n@@ -110,7 +110,7 @@ struct rte_ngbe_ptype {\n #define RTE_PTYPE_L2_ETHER_EAPOL            RTE_PTYPE_L2_ETHER\n #define RTE_PTYPE_L2_ETHER_FILTER           RTE_PTYPE_L2_ETHER\n \n-u32 *ngbe_get_supported_ptypes(void);\n+u32 *ngbe_get_supported_ptypes(size_t *no_of_elements);\n u32 ngbe_decode_ptype(u8 ptid);\n u8 ngbe_encode_ptype(u32 ptype);\n \ndiff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c\nindex 2a8378a33e..bec54fdf5b 100644\n--- a/drivers/net/octeontx/octeontx_ethdev.c\n+++ b/drivers/net/octeontx/octeontx_ethdev.c\n@@ -1467,7 +1467,8 @@ octeontx_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid)\n }\n \n static const uint32_t *\n-octeontx_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+octeontx_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t  size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L3_IPV4,\n@@ -1477,12 +1478,12 @@ octeontx_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_L4_TCP,\n \t\tRTE_PTYPE_L4_UDP,\n \t\tRTE_PTYPE_L4_FRAG,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n-\tif (dev->rx_pkt_burst == octeontx_recv_pkts)\n+\tif (dev->rx_pkt_burst == octeontx_recv_pkts) {\n+\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\treturn ptypes;\n-\n+\t}\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/pfe/pfe_ethdev.c b/drivers/net/pfe/pfe_ethdev.c\nindex 0073dd7405..eccaaa2448 100644\n--- a/drivers/net/pfe/pfe_ethdev.c\n+++ b/drivers/net/pfe/pfe_ethdev.c\n@@ -509,7 +509,7 @@ pfe_tx_queue_setup(struct rte_eth_dev *dev,\n }\n \n static const uint32_t *\n-pfe_supported_ptypes_get(struct rte_eth_dev *dev)\n+pfe_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\t/*todo -= add more types */\n@@ -521,12 +521,13 @@ pfe_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_L4_TCP,\n \t\tRTE_PTYPE_L4_UDP,\n \t\tRTE_PTYPE_L4_SCTP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n \tif (dev->rx_pkt_burst == pfe_recv_pkts ||\n-\t\t\tdev->rx_pkt_burst == pfe_recv_pkts_on_intr)\n+\t\t\tdev->rx_pkt_burst == pfe_recv_pkts_on_intr) {\n+\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\treturn ptypes;\n+\t}\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c\nindex 22cd470646..254548d406 100644\n--- a/drivers/net/qede/qede_ethdev.c\n+++ b/drivers/net/qede/qede_ethdev.c\n@@ -2054,7 +2054,8 @@ static int qede_flow_ctrl_get(struct rte_eth_dev *eth_dev,\n }\n \n static const uint32_t *\n-qede_dev_supported_ptypes_get(struct rte_eth_dev *eth_dev)\n+qede_dev_supported_ptypes_get(struct rte_eth_dev *eth_dev,\n+\t\t\t      size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -2075,13 +2076,14 @@ qede_dev_supported_ptypes_get(struct rte_eth_dev *eth_dev)\n \t\tRTE_PTYPE_INNER_L4_TCP,\n \t\tRTE_PTYPE_INNER_L4_UDP,\n \t\tRTE_PTYPE_INNER_L4_FRAG,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n \tif (eth_dev->rx_pkt_burst == qede_recv_pkts ||\n \t    eth_dev->rx_pkt_burst == qede_recv_pkts_regular ||\n-\t    eth_dev->rx_pkt_burst == qede_recv_pkts_cmt)\n+\t    eth_dev->rx_pkt_burst == qede_recv_pkts_cmt) {\n+\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\treturn ptypes;\n+\t}\n \n \treturn NULL;\n }\ndiff --git a/drivers/net/sfc/sfc_dp_rx.h b/drivers/net/sfc/sfc_dp_rx.h\nindex 9f9bf28988..981d26c535 100644\n--- a/drivers/net/sfc/sfc_dp_rx.h\n+++ b/drivers/net/sfc/sfc_dp_rx.h\n@@ -199,7 +199,7 @@ typedef void (sfc_dp_rx_qpurge_t)(struct sfc_dp_rxq *dp_rxq);\n \n /** Get packet types recognized/classified */\n typedef const uint32_t * (sfc_dp_rx_supported_ptypes_get_t)(\n-\t\t\t\tuint32_t tunnel_encaps);\n+\t\t\t  uint32_t tunnel_encaps, size_t *no_of_elements);\n \n /** Get number of pending Rx descriptors */\n typedef unsigned int (sfc_dp_rx_qdesc_npending_t)(struct sfc_dp_rxq *dp_rxq);\ndiff --git a/drivers/net/sfc/sfc_ef10.h b/drivers/net/sfc/sfc_ef10.h\nindex e9bb72e28b..145a7aab88 100644\n--- a/drivers/net/sfc/sfc_ef10.h\n+++ b/drivers/net/sfc/sfc_ef10.h\n@@ -134,7 +134,8 @@ sfc_ef10_ev_qprime(volatile void *qprime, unsigned int read_ptr,\n }\n \n \n-const uint32_t * sfc_ef10_supported_ptypes_get(uint32_t tunnel_encaps);\n+const uint32_t *sfc_ef10_supported_ptypes_get(uint32_t tunnel_encaps,\n+\t\t\t\t\t      size_t *no_of_elements);\n \n \n #ifdef __cplusplus\ndiff --git a/drivers/net/sfc/sfc_ef100_rx.c b/drivers/net/sfc/sfc_ef100_rx.c\nindex 2677003da3..e283879e6b 100644\n--- a/drivers/net/sfc/sfc_ef100_rx.c\n+++ b/drivers/net/sfc/sfc_ef100_rx.c\n@@ -665,7 +665,8 @@ sfc_ef100_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)\n }\n \n static const uint32_t *\n-sfc_ef100_supported_ptypes_get(__rte_unused uint32_t tunnel_encaps)\n+sfc_ef100_supported_ptypes_get(__rte_unused uint32_t tunnel_encaps,\n+\t\t\t       size_t *no_of_elements)\n {\n \tstatic const uint32_t ef100_native_ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -684,9 +685,9 @@ sfc_ef100_supported_ptypes_get(__rte_unused uint32_t tunnel_encaps)\n \t\tRTE_PTYPE_INNER_L4_TCP,\n \t\tRTE_PTYPE_INNER_L4_UDP,\n \t\tRTE_PTYPE_INNER_L4_FRAG,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n+\t*no_of_elements = RTE_DIM(ef100_native_ptypes);\n \treturn ef100_native_ptypes;\n }\n \ndiff --git a/drivers/net/sfc/sfc_ef10_rx.c b/drivers/net/sfc/sfc_ef10_rx.c\nindex 30a320d079..60442930b3 100644\n--- a/drivers/net/sfc/sfc_ef10_rx.c\n+++ b/drivers/net/sfc/sfc_ef10_rx.c\n@@ -471,7 +471,7 @@ sfc_ef10_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)\n }\n \n const uint32_t *\n-sfc_ef10_supported_ptypes_get(uint32_t tunnel_encaps)\n+sfc_ef10_supported_ptypes_get(uint32_t tunnel_encaps, size_t *no_of_elements)\n {\n \tstatic const uint32_t ef10_native_ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -483,7 +483,6 @@ sfc_ef10_supported_ptypes_get(uint32_t tunnel_encaps)\n \t\tRTE_PTYPE_L4_FRAG,\n \t\tRTE_PTYPE_L4_TCP,\n \t\tRTE_PTYPE_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \tstatic const uint32_t ef10_overlay_ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -505,7 +504,6 @@ sfc_ef10_supported_ptypes_get(uint32_t tunnel_encaps)\n \t\tRTE_PTYPE_INNER_L4_FRAG,\n \t\tRTE_PTYPE_INNER_L4_TCP,\n \t\tRTE_PTYPE_INNER_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n \t/*\n@@ -517,6 +515,7 @@ sfc_ef10_supported_ptypes_get(uint32_t tunnel_encaps)\n \tcase (1u << EFX_TUNNEL_PROTOCOL_VXLAN |\n \t      1u << EFX_TUNNEL_PROTOCOL_GENEVE |\n \t      1u << EFX_TUNNEL_PROTOCOL_NVGRE):\n+\t\t*no_of_elements = RTE_DIM(ef10_overlay_ptypes);\n \t\treturn ef10_overlay_ptypes;\n \tdefault:\n \t\tSFC_GENERIC_LOG(ERR,\n@@ -524,6 +523,7 @@ sfc_ef10_supported_ptypes_get(uint32_t tunnel_encaps)\n \t\t\ttunnel_encaps);\n \t\t/* FALLTHROUGH */\n \tcase 0:\n+\t\t*no_of_elements = RTE_DIM(ef10_native_ptypes);\n \t\treturn ef10_native_ptypes;\n \t}\n }\ndiff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c\nindex 6d57b2ba26..fe33137905 100644\n--- a/drivers/net/sfc/sfc_ethdev.c\n+++ b/drivers/net/sfc/sfc_ethdev.c\n@@ -194,11 +194,12 @@ sfc_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n }\n \n static const uint32_t *\n-sfc_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+sfc_dev_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tconst struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(dev);\n \n-\treturn sap->dp_rx->supported_ptypes_get(sap->shared->tunnel_encaps);\n+\treturn sap->dp_rx->supported_ptypes_get(sap->shared->tunnel_encaps,\n+\t\t\t\t\t\tno_of_elements);\n }\n \n static int\ndiff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c\nindex 1dde2c1110..a193229265 100644\n--- a/drivers/net/sfc/sfc_rx.c\n+++ b/drivers/net/sfc/sfc_rx.c\n@@ -194,7 +194,8 @@ sfc_efx_rx_desc_flags_to_packet_type(const unsigned int desc_flags)\n }\n \n static const uint32_t *\n-sfc_efx_supported_ptypes_get(__rte_unused uint32_t tunnel_encaps)\n+sfc_efx_supported_ptypes_get(__rte_unused uint32_t tunnel_encaps,\n+\t\t\t     size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -202,9 +203,9 @@ sfc_efx_supported_ptypes_get(__rte_unused uint32_t tunnel_encaps)\n \t\tRTE_PTYPE_L3_IPV6_EXT_UNKNOWN,\n \t\tRTE_PTYPE_L4_TCP,\n \t\tRTE_PTYPE_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c\nindex 3fa03cdbee..69d9da695b 100644\n--- a/drivers/net/tap/rte_eth_tap.c\n+++ b/drivers/net/tap/rte_eth_tap.c\n@@ -1778,7 +1778,8 @@ tap_intr_handle_set(struct rte_eth_dev *dev, int set)\n }\n \n static const uint32_t*\n-tap_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n+tap_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused,\n+\t\t\t     size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_INNER_L2_ETHER,\n@@ -1803,9 +1804,9 @@ tap_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L4_UDP,\n \t\tRTE_PTYPE_L4_TCP,\n \t\tRTE_PTYPE_L4_SCTP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c\nindex 5a0c3dc4a6..b720bf2c70 100644\n--- a/drivers/net/thunderx/nicvf_ethdev.c\n+++ b/drivers/net/thunderx/nicvf_ethdev.c\n@@ -379,7 +379,7 @@ nicvf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)\n }\n \n static const uint32_t *\n-nicvf_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+nicvf_dev_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tsize_t copied;\n \tstatic uint32_t ptypes[32];\n@@ -392,16 +392,13 @@ nicvf_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_L4_TCP,\n \t\tRTE_PTYPE_L4_UDP,\n \t\tRTE_PTYPE_L4_FRAG,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \tstatic const uint32_t ptypes_tunnel[] = {\n \t\tRTE_PTYPE_TUNNEL_GRE,\n \t\tRTE_PTYPE_TUNNEL_GENEVE,\n \t\tRTE_PTYPE_TUNNEL_VXLAN,\n \t\tRTE_PTYPE_TUNNEL_NVGRE,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n-\tstatic const uint32_t ptypes_end = RTE_PTYPE_UNKNOWN;\n \n \tcopied = sizeof(ptypes_common);\n \tmemcpy(ptypes, ptypes_common, copied);\n@@ -411,9 +408,9 @@ nicvf_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tcopied += sizeof(ptypes_tunnel);\n \t}\n \n-\tmemcpy((char *)ptypes + copied, &ptypes_end, sizeof(ptypes_end));\n \n \t/* All Ptypes are supported in all Rx functions. */\n+\t*no_of_elements = copied / sizeof(uint32_t);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c\nindex 6bc231a130..b75e8898e2 100644\n--- a/drivers/net/txgbe/txgbe_ethdev.c\n+++ b/drivers/net/txgbe/txgbe_ethdev.c\n@@ -2727,13 +2727,13 @@ txgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n }\n \n const uint32_t *\n-txgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+txgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)\n {\n \tif (dev->rx_pkt_burst == txgbe_recv_pkts ||\n \t    dev->rx_pkt_burst == txgbe_recv_pkts_lro_single_alloc ||\n \t    dev->rx_pkt_burst == txgbe_recv_pkts_lro_bulk_alloc ||\n \t    dev->rx_pkt_burst == txgbe_recv_pkts_bulk_alloc)\n-\t\treturn txgbe_get_supported_ptypes();\n+\t\treturn txgbe_get_supported_ptypes(no_of_elements);\n \n \treturn NULL;\n }\ndiff --git a/drivers/net/txgbe/txgbe_ethdev.h b/drivers/net/txgbe/txgbe_ethdev.h\nindex 7feb45d0cf..7e8067ca05 100644\n--- a/drivers/net/txgbe/txgbe_ethdev.h\n+++ b/drivers/net/txgbe/txgbe_ethdev.h\n@@ -704,7 +704,8 @@ struct rte_txgbe_xstats_name_off {\n \tunsigned int offset;\n };\n \n-const uint32_t *txgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev);\n+const uint32_t *txgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t\t       size_t *no_of_elements);\n int txgbe_dev_set_mc_addr_list(struct rte_eth_dev *dev,\n \t\t\t\t      struct rte_ether_addr *mc_addr_set,\n \t\t\t\t      uint32_t nb_mc_addr);\ndiff --git a/drivers/net/txgbe/txgbe_ptypes.c b/drivers/net/txgbe/txgbe_ptypes.c\nindex c444d5d3f1..c07977ba07 100644\n--- a/drivers/net/txgbe/txgbe_ptypes.c\n+++ b/drivers/net/txgbe/txgbe_ptypes.c\n@@ -186,7 +186,7 @@ static u32 txgbe_ptype_lookup[TXGBE_PTID_MAX] __rte_cache_aligned = {\n \tTPTE(0xFD, ETHER, IPV6, NONE, GRENAT, ETHER_VLAN, IPV6, SCTP),\n };\n \n-u32 *txgbe_get_supported_ptypes(void)\n+u32 *txgbe_get_supported_ptypes(size_t *no_of_elements)\n {\n \tstatic u32 ptypes[] = {\n \t\t/* For non-vec functions,\n@@ -205,9 +205,9 @@ u32 *txgbe_get_supported_ptypes(void)\n \t\tRTE_PTYPE_INNER_L3_IPV6_EXT,\n \t\tRTE_PTYPE_INNER_L4_TCP,\n \t\tRTE_PTYPE_INNER_L4_UDP,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n+\t*no_of_elements = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/txgbe/txgbe_ptypes.h b/drivers/net/txgbe/txgbe_ptypes.h\nindex 6fa8147f05..eb81882d53 100644\n--- a/drivers/net/txgbe/txgbe_ptypes.h\n+++ b/drivers/net/txgbe/txgbe_ptypes.h\n@@ -185,7 +185,7 @@ struct rte_txgbe_ptype {\n #define RTE_PTYPE_L2_ETHER_EAPOL            RTE_PTYPE_L2_ETHER\n #define RTE_PTYPE_L2_ETHER_FILTER           RTE_PTYPE_L2_ETHER\n \n-u32 *txgbe_get_supported_ptypes(void);\n+u32 *txgbe_get_supported_ptypes(size_t *no_of_elements);\n u32 txgbe_decode_ptype(u8 ptid);\n u8 txgbe_encode_ptype(u32 ptype);\n \ndiff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c\nindex e49191718a..188a824e29 100644\n--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c\n+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c\n@@ -88,7 +88,8 @@ static int vmxnet3_dev_info_get(struct rte_eth_dev *dev,\n static int vmxnet3_hw_ver_get(struct rte_eth_dev *dev,\n \t\t\t      char *fw_version, size_t fw_size);\n static const uint32_t *\n-vmxnet3_dev_supported_ptypes_get(struct rte_eth_dev *dev);\n+vmxnet3_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t size_t *no_of_elements);\n static int vmxnet3_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);\n static int vmxnet3_dev_vlan_filter_set(struct rte_eth_dev *dev,\n \t\t\t\t       uint16_t vid, int on);\n@@ -1615,16 +1616,18 @@ vmxnet3_hw_ver_get(struct rte_eth_dev *dev,\n }\n \n static const uint32_t *\n-vmxnet3_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n+vmxnet3_dev_supported_ptypes_get(struct rte_eth_dev *dev,\n+\t\t\t\t size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L3_IPV4_EXT,\n \t\tRTE_PTYPE_L3_IPV4,\n-\t\tRTE_PTYPE_UNKNOWN\n \t};\n \n-\tif (dev->rx_pkt_burst == vmxnet3_recv_pkts)\n+\tif (dev->rx_pkt_burst == vmxnet3_recv_pkts) {\n+\t\t*no_of_elements = RTE_DIM(ptypes);\n \t\treturn ptypes;\n+\t}\n \treturn NULL;\n }\n \ndiff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h\nindex b482cd12bb..6bd6f72278 100644\n--- a/lib/ethdev/ethdev_driver.h\n+++ b/lib/ethdev/ethdev_driver.h\n@@ -447,8 +447,22 @@ typedef int (*eth_queue_stats_mapping_set_t)(struct rte_eth_dev *dev,\n typedef int (*eth_dev_infos_get_t)(struct rte_eth_dev *dev,\n \t\t\t\t   struct rte_eth_dev_info *dev_info);\n \n-/** @internal Get supported ptypes of an Ethernet device. */\n-typedef const uint32_t *(*eth_dev_supported_ptypes_get_t)(struct rte_eth_dev *dev);\n+/**\n+ * @internal\n+ * Function used to get supported ptypes of an Ethernet device.\n+ *\n+ * @param dev\n+ *   ethdev handle of port.\n+ *\n+ * @param no_of_elements\n+ *   number of ptypes elements. Must be initialized to 0.\n+ *\n+ * @retval\n+ *   Success, array of ptypes elements and valid no_of_elements > 0.\n+ *   Failures, NULL.\n+ */\n+typedef const uint32_t *(*eth_dev_supported_ptypes_get_t)(struct rte_eth_dev *dev,\n+\t\t\t\t\t\t\t  size_t *no_of_elements);\n \n /**\n  * @internal\n@@ -1079,7 +1093,8 @@ typedef int (*eth_ip_reassembly_conf_set_t)(struct rte_eth_dev *dev,\n  * @return\n  *   An array pointer to store supported protocol headers.\n  */\n-typedef const uint32_t *(*eth_buffer_split_supported_hdr_ptypes_get_t)(struct rte_eth_dev *dev);\n+typedef const uint32_t *(*eth_buffer_split_supported_hdr_ptypes_get_t)(struct rte_eth_dev *dev,\n+\t\t\t\t\t\t\t\t       size_t *no_of_elements);\n \n /**\n  * @internal\ndiff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c\nindex 3858983fcc..50403d7564 100644\n--- a/lib/ethdev/rte_ethdev.c\n+++ b/lib/ethdev/rte_ethdev.c\n@@ -3854,9 +3854,11 @@ int\n rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t ptype_mask,\n \t\t\t\t uint32_t *ptypes, int num)\n {\n-\tint i, j;\n+\tsize_t i;\n+\tint j;\n \tstruct rte_eth_dev *dev;\n \tconst uint32_t *all_ptypes;\n+\tsize_t no_of_elements = 0;\n \n \tRTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);\n \tdev = &rte_eth_devices[port_id];\n@@ -3870,12 +3872,13 @@ rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t ptype_mask,\n \n \tif (*dev->dev_ops->dev_supported_ptypes_get == NULL)\n \t\treturn 0;\n-\tall_ptypes = (*dev->dev_ops->dev_supported_ptypes_get)(dev);\n+\tall_ptypes = (*dev->dev_ops->dev_supported_ptypes_get)(dev,\n+\t\t\t\t\t\t\t       &no_of_elements);\n \n \tif (!all_ptypes)\n \t\treturn 0;\n \n-\tfor (i = 0, j = 0; all_ptypes[i] != RTE_PTYPE_UNKNOWN; ++i)\n+\tfor (i = 0, j = 0; i < no_of_elements; ++i)\n \t\tif (all_ptypes[i] & ptype_mask) {\n \t\t\tif (j < num) {\n \t\t\t\tptypes[j] = all_ptypes[i];\n@@ -3905,8 +3908,10 @@ rte_eth_dev_set_ptypes(uint16_t port_id, uint32_t ptype_mask,\n \tconst uint32_t *all_ptypes;\n \tstruct rte_eth_dev *dev;\n \tuint32_t unused_mask;\n-\tunsigned int i, j;\n+\tsize_t i;\n+\tunsigned int j;\n \tint ret;\n+\tsize_t no_of_elements = 0;\n \n \tRTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);\n \tdev = &rte_eth_devices[port_id];\n@@ -3945,7 +3950,8 @@ rte_eth_dev_set_ptypes(uint16_t port_id, uint32_t ptype_mask,\n \t\tgoto ptype_unknown;\n \t}\n \n-\tall_ptypes = (*dev->dev_ops->dev_supported_ptypes_get)(dev);\n+\tall_ptypes = (*dev->dev_ops->dev_supported_ptypes_get)(dev,\n+\t\t\t\t\t\t\t       &no_of_elements);\n \tif (all_ptypes == NULL) {\n \t\tret = 0;\n \t\tgoto ptype_unknown;\n@@ -3956,7 +3962,7 @@ rte_eth_dev_set_ptypes(uint16_t port_id, uint32_t ptype_mask,\n \t * set_ptypes array is insufficient fill it partially.\n \t */\n \tfor (i = 0, j = 0; set_ptypes != NULL &&\n-\t\t\t\t(all_ptypes[i] != RTE_PTYPE_UNKNOWN); ++i) {\n+\t\t\t\t(i < no_of_elements); ++i) {\n \t\tif (ptype_mask & all_ptypes[i]) {\n \t\t\tif (j < num - 1) {\n \t\t\t\tset_ptypes[j] = all_ptypes[i];\n@@ -6882,9 +6888,11 @@ rte_eth_tx_descriptor_dump(uint16_t port_id, uint16_t queue_id,\n int\n rte_eth_buffer_split_get_supported_hdr_ptypes(uint16_t port_id, uint32_t *ptypes, int num)\n {\n-\tint i, j;\n+\tsize_t i;\n+\tint j;\n \tstruct rte_eth_dev *dev;\n \tconst uint32_t *all_types;\n+\tsize_t no_of_elements = 0;\n \n \tRTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);\n \tdev = &rte_eth_devices[port_id];\n@@ -6898,12 +6906,13 @@ rte_eth_buffer_split_get_supported_hdr_ptypes(uint16_t port_id, uint32_t *ptypes\n \n \tif (*dev->dev_ops->buffer_split_supported_hdr_ptypes_get == NULL)\n \t\treturn -ENOTSUP;\n-\tall_types = (*dev->dev_ops->buffer_split_supported_hdr_ptypes_get)(dev);\n+\tall_types = (*dev->dev_ops->buffer_split_supported_hdr_ptypes_get)(dev,\n+\t\t\t\t\t\t\t      &no_of_elements);\n \n \tif (all_types == NULL)\n \t\treturn 0;\n \n-\tfor (i = 0, j = 0; all_types[i] != RTE_PTYPE_UNKNOWN; ++i) {\n+\tfor (i = 0, j = 0; i < no_of_elements; ++i) {\n \t\tif (j < num) {\n \t\t\tptypes[j] = all_types[i];\n \n",
    "prefixes": [
        "v7",
        "2/2"
    ]
}