get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 135729,
    "url": "http://patches.dpdk.org/api/patches/135729/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20240104162227.2186147-1-venkatx.sivaramakrishnan@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": "<20240104162227.2186147-1-venkatx.sivaramakrishnan@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240104162227.2186147-1-venkatx.sivaramakrishnan@intel.com",
    "date": "2024-01-04T16:22:27",
    "name": "[v4,2/2] net/tap: fix buffer overflow for ptypes list",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "324dc096b275a60744126a78a0b95ac8787cf907",
    "submitter": {
        "id": 3155,
        "url": "http://patches.dpdk.org/api/people/3155/?format=api",
        "name": "Sivaramakrishnan Venkat",
        "email": "venkatx.sivaramakrishnan@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20240104162227.2186147-1-venkatx.sivaramakrishnan@intel.com/mbox/",
    "series": [
        {
            "id": 30721,
            "url": "http://patches.dpdk.org/api/series/30721/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=30721",
            "date": "2024-01-04T16:22:27",
            "name": null,
            "version": 4,
            "mbox": "http://patches.dpdk.org/series/30721/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/135729/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/135729/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 9E72E43818;\n\tThu,  4 Jan 2024 17:27:21 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 26C8D402DF;\n\tThu,  4 Jan 2024 17:27:21 +0100 (CET)",
            "from mgamail.intel.com (mgamail.intel.com [192.198.163.7])\n by mails.dpdk.org (Postfix) with ESMTP id 4E2274029A;\n Thu,  4 Jan 2024 17:27:18 +0100 (CET)",
            "from orsmga003.jf.intel.com ([10.7.209.27])\n by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 04 Jan 2024 08:22:43 -0800",
            "from silpixa00400902.ir.intel.com ([10.243.23.146])\n by orsmga003.jf.intel.com with ESMTP; 04 Jan 2024 08:22: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=1704385639; x=1735921639;\n h=from:to:cc:subject:date:message-id:mime-version:\n content-transfer-encoding;\n bh=zDCnVdtDd3vd/5UQjMqwjvSRO8BdJ47KQyCK6zvLAvI=;\n b=QSAn5g0qcN5OnkSJMgOdu4xZYs8tKs97LvFG3cb6iL6PeBc4tgITvPL4\n JqjxeiMxXN0wLQOitpPNZA+DD4c0J+Iu0hTUzPV+8MenZMtKKuJ4QX4Uv\n 1yOSXsHx6hN1dVii81cf1ywDW2Nw/jsITqCD0LletWnDuX88f/b59V7jg\n H8o0XoiEdRC1hIt2wQmLeC6Zk9udtCLNAuO6MIeqPpK3AMjrczS23LrnP\n M6A0lM5Z+3YT5tJmgHLdQwHLGmjK+r/9+nobK7nPwmc3Ebo+oa9whTmT6\n TiulIQQEQ6WLvvVu8VtARcWKQFL8V8vuWf8HGfJ0lWi34XDyRKchkD2lL g==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6600,9927,10943\"; a=\"18815031\"",
            "E=Sophos;i=\"6.04,331,1695711600\"; d=\"scan'208\";a=\"18815031\"",
            "E=McAfee;i=\"6600,9927,10943\"; a=\"730214772\"",
            "E=Sophos;i=\"6.04,331,1695711600\"; d=\"scan'208\";a=\"730214772\""
        ],
        "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, stable@dpdk.org, gakhil@marvell.com,\n Sivaramakrishnan Venkat <venkatx.sivaramakrishnan@intel.com>,\n ferruh.yigit@intel.com",
        "Subject": "[PATCH v4] [PATCH 2/2] net/tap: fix buffer overflow for ptypes list",
        "Date": "Thu,  4 Jan 2024 16:22:27 +0000",
        "Message-Id": "<20240104162227.2186147-1-venkatx.sivaramakrishnan@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "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": "Incorrect ptypes list causes buffer overflow for Address Sanitizer\nrun. Previously, the last element in the ptypes lists to be\n\"RTE_PTYPE_UNKNOWN\" for rte_eth_dev_get_supported_ptypes(), but this was\nnot clearly documented and many PMDs did not follow this implementation.\nInstead, the dev_supported_ptypes_get() function pointer now returns the\nnumber of elements to eliminate the need for \"RTE_PTYPE_UNKNOWN\"\nas the last item.\n\nFixes: 47909357a069 (\"ethdev: make device operations struct private\")\nCc: ferruh.yigit@intel.com\nCc: stable@dpdk.org\n\nV4:\nThe first patch is for drivers for backporting.\nThe second patch is for driver API update.\n\nSigned-off-by: Sivaramakrishnan Venkat <venkatx.sivaramakrishnan@intel.com>\n---\n drivers/net/atlantic/atl_ethdev.c      | 13 ++++++++-----\n drivers/net/axgbe/axgbe_ethdev.c       | 13 ++++++++-----\n drivers/net/bnxt/bnxt_ethdev.c         |  7 ++++---\n drivers/net/cnxk/cnxk_ethdev.h         |  3 ++-\n drivers/net/cnxk/cnxk_lookup.c         |  7 ++++---\n drivers/net/cpfl/cpfl_ethdev.c         |  7 ++++---\n drivers/net/cxgbe/cxgbe_ethdev.c       | 10 ++++++----\n drivers/net/cxgbe/cxgbe_pfvf.h         |  3 ++-\n drivers/net/dpaa/dpaa_ethdev.c         | 11 +++++++----\n drivers/net/dpaa2/dpaa2_ethdev.c       | 10 ++++++----\n drivers/net/e1000/igb_ethdev.c         | 13 ++++++++-----\n drivers/net/enetc/enetc_ethdev.c       |  7 ++++---\n drivers/net/enic/enic_ethdev.c         | 17 ++++++++++-------\n drivers/net/failsafe/failsafe_ops.c    |  5 +++--\n drivers/net/fm10k/fm10k_ethdev.c       | 15 +++++++++------\n drivers/net/hns3/hns3_rxtx.c           | 16 +++++++++-------\n drivers/net/hns3/hns3_rxtx.h           |  3 ++-\n drivers/net/i40e/i40e_rxtx.c           | 11 +++++++----\n drivers/net/i40e/i40e_rxtx.h           |  3 ++-\n drivers/net/iavf/iavf_ethdev.c         | 10 ++++++----\n drivers/net/ice/ice_dcf_ethdev.c       |  7 ++++---\n drivers/net/ice/ice_rxtx.c             | 23 ++++++++++++++---------\n drivers/net/ice/ice_rxtx.h             |  3 ++-\n drivers/net/idpf/idpf_ethdev.c         |  7 ++++---\n drivers/net/igc/igc_ethdev.c           | 10 ++++++----\n drivers/net/ionic/ionic_rxtx.c         |  7 ++++---\n drivers/net/ionic/ionic_rxtx.h         |  3 ++-\n drivers/net/ixgbe/ixgbe_ethdev.c       | 18 ++++++++++++------\n drivers/net/mana/mana.c                |  7 ++++---\n drivers/net/mlx4/mlx4.h                |  3 ++-\n drivers/net/mlx4/mlx4_ethdev.c         | 17 ++++++++++-------\n drivers/net/mlx5/mlx5.h                |  3 ++-\n drivers/net/mlx5/mlx5_ethdev.c         | 11 +++++++----\n drivers/net/mvneta/mvneta_ethdev.c     |  7 ++++---\n drivers/net/mvpp2/mrvl_ethdev.c        |  7 ++++---\n drivers/net/netvsc/hn_var.h            |  3 ++-\n drivers/net/netvsc/hn_vf.c             |  5 +++--\n drivers/net/nfp/nfp_net_common.c       | 15 ++++++++++-----\n drivers/net/nfp/nfp_net_common.h       |  3 ++-\n drivers/net/ngbe/ngbe_ethdev.c         |  9 ++++++---\n drivers/net/ngbe/ngbe_ethdev.h         |  3 ++-\n drivers/net/ngbe/ngbe_ptypes.c         |  3 ++-\n drivers/net/ngbe/ngbe_ptypes.h         |  2 +-\n drivers/net/octeontx/octeontx_ethdev.c | 11 +++++++----\n drivers/net/pfe/pfe_ethdev.c           | 11 +++++++----\n drivers/net/qede/qede_ethdev.c         | 11 +++++++----\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         |  7 ++++---\n drivers/net/sfc/sfc_ef10_rx.c          | 11 ++++++-----\n drivers/net/sfc/sfc_ethdev.c           |  5 +++--\n drivers/net/sfc/sfc_rx.c               |  7 ++++---\n drivers/net/tap/rte_eth_tap.c          |  7 ++++---\n drivers/net/thunderx/nicvf_ethdev.c    | 10 +++++-----\n drivers/net/txgbe/txgbe_ethdev.c       |  9 ++++++---\n drivers/net/txgbe/txgbe_ethdev.h       |  3 ++-\n drivers/net/txgbe/txgbe_ptypes.c       |  6 +++---\n drivers/net/txgbe/txgbe_ptypes.h       |  2 +-\n drivers/net/vmxnet3/vmxnet3_ethdev.c   | 14 +++++++++-----\n lib/ethdev/ethdev_driver.h             |  3 ++-\n lib/ethdev/rte_ethdev.c                | 10 ++++++----\n 61 files changed, 299 insertions(+), 193 deletions(-)",
    "diff": "diff --git a/drivers/net/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_ethdev.c\nindex 3a028f4290..bc087738e4 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+\tsize_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,8 @@ 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,\n+\tsize_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -1143,12 +1145,13 @@ atl_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_SCTP,\n-\t\tRTE_PTYPE_L4_ICMP,\n-\t\tRTE_PTYPE_UNKNOWN\n+\t\tRTE_PTYPE_L4_ICMP\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..958af22597 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+\tsize_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,8 @@ 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,\n+\tsize_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -1480,12 +1482,13 @@ axgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_NONFRAG,\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\tRTE_PTYPE_INNER_L4_UDP\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..6189227a72 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 size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER_VLAN,\n@@ -3448,13 +3449,13 @@ bnxt_dev_supported_ptypes_get_op(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN,\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\tRTE_PTYPE_INNER_L4_UDP\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..390c01c212 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 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..664d648c5e 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+\tsize_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..225d16dbf3 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     size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -283,10 +284,10 @@ cpfl_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_L4_ICMP,\n-\t\tRTE_PTYPE_UNKNOWN\n+\t\tRTE_PTYPE_L4_ICMP\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..9b3106f899 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\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\tRTE_PTYPE_L3_IPV6\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..e0958c4805 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 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..1e89c24979 100644\n--- a/drivers/net/dpaa/dpaa_ethdev.c\n+++ b/drivers/net/dpaa/dpaa_ethdev.c\n@@ -348,7 +348,8 @@ 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,\n+\t\t\t\tsize_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -363,14 +364,16 @@ dpaa_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_TUNNEL_ESP,\n-\t\tRTE_PTYPE_UNKNOWN\n+\t\tRTE_PTYPE_TUNNEL_ESP\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+\t*no_of_elements = 0;\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c\nindex 8e610b6bba..e8b3290fca 100644\n--- a/drivers/net/dpaa2/dpaa2_ethdev.c\n+++ b/drivers/net/dpaa2/dpaa2_ethdev.c\n@@ -1081,7 +1081,8 @@ 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,\n+\t\t\t size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\t/*todo -= add more types */\n@@ -1093,14 +1094,15 @@ dpaa2_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_L4_ICMP,\n-\t\tRTE_PTYPE_UNKNOWN\n+\t\tRTE_PTYPE_L4_ICMP\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..7b38f439b8 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      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,8 @@ 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,\n+\t\t       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@@ -2273,13 +2275,14 @@ eth_igb_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L3_IPV6,\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\tRTE_PTYPE_INNER_L4_UDP\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..30be0c1668 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    size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -94,10 +95,10 @@ enetc_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L4_TCP,\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\tRTE_PTYPE_L4_ICMP\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..6b036977db 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+\tsize_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -521,8 +522,7 @@ static const uint32_t *enicpmd_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_L4_NONFRAG,\n-\t\tRTE_PTYPE_UNKNOWN\n+\t\tRTE_PTYPE_L4_NONFRAG\n \t};\n \tstatic const uint32_t ptypes_overlay[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -540,18 +540,21 @@ static const uint32_t *enicpmd_dev_supported_ptypes_get(struct rte_eth_dev *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_INNER_L4_NONFRAG,\n-\t\tRTE_PTYPE_UNKNOWN\n+\t\tRTE_PTYPE_INNER_L4_NONFRAG\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+\t*no_of_elements = 0;\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c\nindex 35649b6244..15d3344abd 100644\n--- a/drivers/net/failsafe/failsafe_ops.c\n+++ b/drivers/net/failsafe/failsafe_ops.c\n@@ -1282,7 +1282,8 @@ 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,\n+\t\t  size_t *no_of_elements)\n {\n \tstruct sub_device *sdev;\n \tstruct rte_eth_dev *edev;\n@@ -1308,7 +1309,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..e03be9bac5 100644\n--- a/drivers/net/fm10k/fm10k_ethdev.c\n+++ b/drivers/net/fm10k/fm10k_ethdev.c\n@@ -1446,7 +1446,8 @@ 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,\n+\tsize_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@@ -1458,10 +1459,10 @@ fm10k_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\t\tRTE_PTYPE_L3_IPV6,\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\tRTE_PTYPE_L4_UDP\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@@ -1476,10 +1477,10 @@ fm10k_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\t\tRTE_PTYPE_TUNNEL_GENEVE,\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\tRTE_PTYPE_TUNNEL_GRE\n \t\t};\n \n+\t\t*no_of_elements = RTE_DIM(ptypes_vec);\n \t\treturn ptypes_vec;\n \t}\n \n@@ -1487,8 +1488,10 @@ 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+\tsize_t *no_of_elements)\n {\n+\t*no_of_elements = 0;\n \treturn NULL;\n }\n #endif\ndiff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c\nindex 09b7e90c70..7557690a8c 100644\n--- a/drivers/net/hns3/hns3_rxtx.c\n+++ b/drivers/net/hns3/hns3_rxtx.c\n@@ -1971,7 +1971,8 @@ 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,\n+\t\t    size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -1997,8 +1998,7 @@ hns3_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_SCTP,\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\tRTE_PTYPE_TUNNEL_NVGRE\n \t};\n \tstatic const uint32_t adv_layout_ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -2025,8 +2025,7 @@ hns3_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_UDP,\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\tRTE_PTYPE_INNER_L4_ICMP\n \t};\n \tstruct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n \n@@ -2034,10 +2033,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..74c76b4714 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   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..d438bf06c8 100644\n--- a/drivers/net/i40e/i40e_rxtx.c\n+++ b/drivers/net/i40e/i40e_rxtx.c\n@@ -1823,7 +1823,8 @@ 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,\n+\t\t\t\tsize_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\t/* refers to i40e_rxd_pkt_type_mapping() */\n@@ -1850,8 +1851,7 @@ i40e_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_NONFRAG,\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\tRTE_PTYPE_INNER_L4_UDP\n \t};\n \n \tif (dev->rx_pkt_burst == i40e_recv_pkts ||\n@@ -1866,8 +1866,11 @@ 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+\t*no_of_elements = 0;\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h\nindex b191f23e1f..f1204140da 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    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..0957f24a32 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     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    size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -1227,9 +1229,9 @@ iavf_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L4_NONFRAG,\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\tRTE_PTYPE_L4_UDP\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..829198e688 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\tsize_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -1874,9 +1875,9 @@ ice_dcf_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L4_NONFRAG,\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\tRTE_PTYPE_L4_UDP\n \t};\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..10c7658baf 100644\n--- a/drivers/net/ice/ice_rxtx.c\n+++ b/drivers/net/ice/ice_rxtx.c\n@@ -2200,7 +2200,8 @@ 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,\n+\t\t\tsize_t *no_of_elements)\n {\n \tstruct ice_adapter *ad =\n \t\tICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);\n@@ -2230,8 +2231,7 @@ ice_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_NONFRAG,\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\tRTE_PTYPE_INNER_L4_UDP\n \t};\n \n \tstatic const uint32_t ptypes_comms[] = {\n@@ -2261,19 +2261,22 @@ ice_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_UDP,\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\tRTE_PTYPE_L2_ETHER_PPPOE\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 ||\n-\t    dev->rx_pkt_burst == ice_recv_scattered_pkts)\n+\t    dev->rx_pkt_burst == ice_recv_scattered_pkts) {\n \t\treturn ptypes;\n+\t}\n \n #ifdef RTE_ARCH_X86\n \tif (dev->rx_pkt_burst == ice_recv_pkts_vec ||\n@@ -2287,10 +2290,12 @@ ice_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t    dev->rx_pkt_burst == ice_recv_pkts_vec_avx2 ||\n \t    dev->rx_pkt_burst == ice_recv_pkts_vec_avx2_offload ||\n \t    dev->rx_pkt_burst == ice_recv_scattered_pkts_vec_avx2 ||\n-\t    dev->rx_pkt_burst == ice_recv_scattered_pkts_vec_avx2_offload)\n+\t    dev->rx_pkt_burst == ice_recv_scattered_pkts_vec_avx2_offload) {\n \t\treturn ptypes;\n+\t}\n #endif\n \n+\t*no_of_elements = 0;\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/ice/ice_rxtx.h b/drivers/net/ice/ice_rxtx.h\nindex bd2c4abec9..20e5628439 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..75c741ecc4 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     size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -242,10 +243,10 @@ idpf_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_L4_ICMP,\n-\t\tRTE_PTYPE_UNKNOWN\n+\t\tRTE_PTYPE_L4_ICMP\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..e1c638699f 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\tsize_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\tsize_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\t/* refers to rx_desc_pkt_info_to_pkt_type() */\n@@ -1666,10 +1668,10 @@ eth_igc_supported_ptypes_get(__rte_unused struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L3_IPV6,\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\tRTE_PTYPE_INNER_L4_UDP\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..b760d9540e 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+\tsize_t *no_of_elements)\n {\n \t/* See ionic_ptype_table[] */\n \tstatic const uint32_t ptypes[] = {\n@@ -630,10 +631,10 @@ ionic_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L3_IPV4,\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\tRTE_PTYPE_L4_UDP\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..6a63c8d54c 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+\tsize_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..000e132e2c 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\tsize_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,8 @@ 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,\n+\t\t     size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\t/* For non-vec functions,\n@@ -3998,21 +4000,25 @@ ixgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L3_IPV6,\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\tRTE_PTYPE_INNER_L4_UDP\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 = (sizeof(ptypes) / sizeof(uint32_t));\n \t\treturn ptypes;\n+\t}\n #endif\n+\t*no_of_elements = 0;\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/mana/mana.c b/drivers/net/mana/mana.c\nindex 781ed76139..a50d21d6c2 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@@ -395,10 +396,10 @@ mana_supported_ptypes(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L3_IPV6_EXT_UNKNOWN,\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\tRTE_PTYPE_L4_UDP\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..8e0bca5765 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       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..e2ff894bd3 100644\n--- a/drivers/net/mlx4/mlx4_ethdev.c\n+++ b/drivers/net/mlx4/mlx4_ethdev.c\n@@ -934,7 +934,8 @@ 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,\n+\t\t      size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\t/* refers to rxq_cq_to_pkt_type() */\n@@ -943,8 +944,7 @@ mlx4_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_L3_IPV6_EXT_UNKNOWN,\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\tRTE_PTYPE_L4_UDP\n \t};\n \tstatic const uint32_t ptypes_l2tun[] = {\n \t\t/* refers to rxq_cq_to_pkt_type() */\n@@ -955,17 +955,20 @@ mlx4_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_INNER_L3_IPV4_EXT_UNKNOWN,\n-\t\tRTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN,\n-\t\tRTE_PTYPE_UNKNOWN\n+\t\tRTE_PTYPE_INNER_L3_IPV6_EXT_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+\t*no_of_elements = 0;\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex 263ebead7f..90afcc2bb5 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 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..eea346d6d5 100644\n--- a/drivers/net/mlx5/mlx5_ethdev.c\n+++ b/drivers/net/mlx5/mlx5_ethdev.c\n@@ -579,7 +579,8 @@ 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,\n+\t\t\t  size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\t/* refers to rxq_cq_to_pkt_type() */\n@@ -595,15 +596,17 @@ mlx5_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_NONFRAG,\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\tRTE_PTYPE_INNER_L4_UDP\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+\t*no_of_elements = 0;\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/mvneta/mvneta_ethdev.c b/drivers/net/mvneta/mvneta_ethdev.c\nindex 212c300c14..48db3fae57 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   size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -198,10 +199,10 @@ mvneta_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L3_IPV4,\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\tRTE_PTYPE_L4_UDP\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..e7748c910e 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   size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -1777,10 +1778,10 @@ mrvl_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L3_IPV6_EXT,\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\tRTE_PTYPE_L4_UDP\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..c884369a07 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       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..3be1ca6c95 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   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,7 @@ 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, 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..dbebcb6443 100644\n--- a/drivers/net/nfp/nfp_net_common.c\n+++ b/drivers/net/nfp/nfp_net_common.c\n@@ -1266,7 +1266,8 @@ 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,\n+\t\tsize_t *no_of_elements)\n {\n \tstruct nfp_net_hw *net_hw;\n \tstatic const uint32_t ptypes[] = {\n@@ -1298,17 +1299,21 @@ nfp_net_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_INNER_L4_FRAG,\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\tRTE_PTYPE_INNER_L4_SCTP\n \t};\n \n-\tif (dev->rx_pkt_burst != nfp_net_recv_pkts)\n+\tif (dev->rx_pkt_burst != nfp_net_recv_pkts) {\n+\t\t*no_of_elements = 0;\n \t\treturn NULL;\n+\t}\n \n \tnet_hw = dev->data->dev_private;\n-\tif ((net_hw->super.cap_ext & NFP_NET_CFG_CTRL_PKT_TYPE) == 0)\n+\tif ((net_hw->super.cap_ext & NFP_NET_CFG_CTRL_PKT_TYPE) == 0) {\n+\t\t*no_of_elements = 0;\n \t\treturn NULL;\n+\t}\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..7be9fb6ad9 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\tsize_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..1da3629c50 100644\n--- a/drivers/net/ngbe/ngbe_ethdev.c\n+++ b/drivers/net/ngbe/ngbe_ethdev.c\n@@ -1864,14 +1864,17 @@ 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,\n+\t\tsize_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    dev->rx_pkt_burst == ngbe_recv_pkts_bulk_alloc) {\n+\t\treturn ngbe_get_supported_ptypes(no_of_elements);\n+\t}\n \n+\t*no_of_elements = 0;\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/ngbe/ngbe_ethdev.h b/drivers/net/ngbe/ngbe_ethdev.h\nindex 3cde7c8750..9de0cba408 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      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..b590ca1a88 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@@ -114,6 +114,7 @@ u32 *ngbe_get_supported_ptypes(void)\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..a398ce3033 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\tsize_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L3_IPV4,\n@@ -1476,13 +1477,15 @@ octeontx_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_L3_IPV6_EXT,\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\tRTE_PTYPE_L4_FRAG\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+\t}\n \n+\t*no_of_elements = 0;\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/pfe/pfe_ethdev.c b/drivers/net/pfe/pfe_ethdev.c\nindex 0073dd7405..c2825813be 100644\n--- a/drivers/net/pfe/pfe_ethdev.c\n+++ b/drivers/net/pfe/pfe_ethdev.c\n@@ -509,7 +509,8 @@ 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,\n+\t\t   size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\t/*todo -= add more types */\n@@ -520,13 +521,15 @@ pfe_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_L3_IPV6_EXT,\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\tRTE_PTYPE_L4_SCTP\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+\t*no_of_elements = 0;\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c\nindex 22cd470646..bb51236d13 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@@ -2074,15 +2075,17 @@ qede_dev_supported_ptypes_get(struct rte_eth_dev *eth_dev)\n \t\tRTE_PTYPE_INNER_L3_IPV6,\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\tRTE_PTYPE_INNER_L4_FRAG\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+\t*no_of_elements = 0;\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/sfc/sfc_dp_rx.h b/drivers/net/sfc/sfc_dp_rx.h\nindex 9f9bf28988..852d567091 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+\tuint32_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..793d0070b3 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  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..c07930dd98 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\tsize_t *no_of_elements)\n {\n \tstatic const uint32_t ef100_native_ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -683,10 +684,10 @@ sfc_ef100_supported_ptypes_get(__rte_unused uint32_t tunnel_encaps)\n \t\tRTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN,\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\tRTE_PTYPE_INNER_L4_FRAG\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..576268a1a7 100644\n--- a/drivers/net/sfc/sfc_ef10_rx.c\n+++ b/drivers/net/sfc/sfc_ef10_rx.c\n@@ -471,7 +471,8 @@ 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,\n+\t\t\t  size_t *no_of_elements)\n {\n \tstatic const uint32_t ef10_native_ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -482,8 +483,7 @@ sfc_ef10_supported_ptypes_get(uint32_t tunnel_encaps)\n \t\tRTE_PTYPE_L3_IPV6_EXT_UNKNOWN,\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\tRTE_PTYPE_L4_UDP\n \t};\n \tstatic const uint32_t ef10_overlay_ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n@@ -504,8 +504,7 @@ sfc_ef10_supported_ptypes_get(uint32_t tunnel_encaps)\n \t\tRTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN,\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\tRTE_PTYPE_INNER_L4_UDP\n \t};\n \n \t/*\n@@ -517,6 +516,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 +524,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..890ed04934 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,\n+\t\t     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, no_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..dfd4b2cbe9 100644\n--- a/drivers/net/sfc/sfc_rx.c\n+++ b/drivers/net/sfc/sfc_rx.c\n@@ -194,17 +194,18 @@ 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\tsize_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_L2_ETHER,\n \t\tRTE_PTYPE_L3_IPV4_EXT_UNKNOWN,\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\tRTE_PTYPE_L4_UDP\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..975fd293a3 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     size_t *no_of_elements)\n {\n \tstatic const uint32_t ptypes[] = {\n \t\tRTE_PTYPE_INNER_L2_ETHER,\n@@ -1802,10 +1803,10 @@ tap_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)\n \t\tRTE_PTYPE_L4_FRAG,\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\tRTE_PTYPE_L4_SCTP\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..75ff2e2542 100644\n--- a/drivers/net/thunderx/nicvf_ethdev.c\n+++ b/drivers/net/thunderx/nicvf_ethdev.c\n@@ -379,7 +379,8 @@ 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,\n+\t\t\t size_t *no_of_elements)\n {\n \tsize_t copied;\n \tstatic uint32_t ptypes[32];\n@@ -391,15 +392,13 @@ nicvf_dev_supported_ptypes_get(struct rte_eth_dev *dev)\n \t\tRTE_PTYPE_L3_IPV6_EXT,\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\tRTE_PTYPE_L4_FRAG\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\tRTE_PTYPE_TUNNEL_NVGRE\n \t};\n \tstatic const uint32_t ptypes_end = RTE_PTYPE_UNKNOWN;\n \n@@ -414,6 +413,7 @@ nicvf_dev_supported_ptypes_get(struct rte_eth_dev *dev)\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 = RTE_DIM(ptypes);\n \treturn ptypes;\n }\n \ndiff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c\nindex 6bc231a130..f1c285fd92 100644\n--- a/drivers/net/txgbe/txgbe_ethdev.c\n+++ b/drivers/net/txgbe/txgbe_ethdev.c\n@@ -2727,14 +2727,17 @@ 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,\n+\t\t\t    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    dev->rx_pkt_burst == txgbe_recv_pkts_bulk_alloc) {\n+\t\treturn txgbe_get_supported_ptypes(no_of_elements);\n+\t}\n \n+\t*no_of_elements = 0;\n \treturn NULL;\n }\n \ndiff --git a/drivers/net/txgbe/txgbe_ethdev.h b/drivers/net/txgbe/txgbe_ethdev.h\nindex 7feb45d0cf..830ce9d750 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      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..1974d94c22 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@@ -204,10 +204,10 @@ u32 *txgbe_get_supported_ptypes(void)\n \t\tRTE_PTYPE_INNER_L3_IPV6,\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\tRTE_PTYPE_INNER_L4_UDP\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..34a6fd6abe 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,19 @@ 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   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\tRTE_PTYPE_L3_IPV4\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+\t*no_of_elements = 0;\n \treturn NULL;\n }\n \ndiff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h\nindex b482cd12bb..9b03d27e62 100644\n--- a/lib/ethdev/ethdev_driver.h\n+++ b/lib/ethdev/ethdev_driver.h\n@@ -448,7 +448,8 @@ 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+typedef const uint32_t *(*eth_dev_supported_ptypes_get_t)(struct rte_eth_dev *dev,\n+\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 c5e75a91c8..3a7da813aa 100644\n--- a/lib/ethdev/rte_ethdev.c\n+++ b/lib/ethdev/rte_ethdev.c\n@@ -3857,6 +3857,7 @@ rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t ptype_mask,\n \tint i, 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 +3871,12 @@ 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, &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; all_ptypes[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@@ -3907,6 +3908,7 @@ rte_eth_dev_set_ptypes(uint16_t port_id, uint32_t ptype_mask,\n \tuint32_t unused_mask;\n \tunsigned int i, 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 +3947,7 @@ 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, &no_of_elements);\n \tif (all_ptypes == NULL) {\n \t\tret = 0;\n \t\tgoto ptype_unknown;\n@@ -3956,7 +3958,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(all_ptypes[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",
    "prefixes": [
        "v4",
        "2/2"
    ]
}