get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 82165,
    "url": "http://patchwork.dpdk.org/api/patches/82165/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20201026065525.632361-1-haiyue.wang@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": "<20201026065525.632361-1-haiyue.wang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20201026065525.632361-1-haiyue.wang@intel.com",
    "date": "2020-10-26T06:55:24",
    "name": "[v3] net/ice: refactor the protocol extraction design",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "5d1371e0e9726e599f00009ec312b53bed91a009",
    "submitter": {
        "id": 1044,
        "url": "http://patchwork.dpdk.org/api/people/1044/?format=api",
        "name": "Wang, Haiyue",
        "email": "haiyue.wang@intel.com"
    },
    "delegate": {
        "id": 1540,
        "url": "http://patchwork.dpdk.org/api/users/1540/?format=api",
        "username": "qzhan15",
        "first_name": "Qi",
        "last_name": "Zhang",
        "email": "qi.z.zhang@intel.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20201026065525.632361-1-haiyue.wang@intel.com/mbox/",
    "series": [
        {
            "id": 13313,
            "url": "http://patchwork.dpdk.org/api/series/13313/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=13313",
            "date": "2020-10-26T06:55:24",
            "name": "[v3] net/ice: refactor the protocol extraction design",
            "version": 3,
            "mbox": "http://patchwork.dpdk.org/series/13313/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/82165/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/82165/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 5539EA04B5;\n\tMon, 26 Oct 2020 08:08:36 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id A04E11E2B;\n\tMon, 26 Oct 2020 08:08:34 +0100 (CET)",
            "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n by dpdk.org (Postfix) with ESMTP id 72901100C\n for <dev@dpdk.org>; Mon, 26 Oct 2020 08:08:31 +0100 (CET)",
            "from fmsmga004.fm.intel.com ([10.253.24.48])\n by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 26 Oct 2020 00:08:29 -0700",
            "from npg-dpdk-haiyue-3.sh.intel.com ([10.67.118.151])\n by fmsmga004.fm.intel.com with ESMTP; 26 Oct 2020 00:08:27 -0700"
        ],
        "IronPort-SDR": [
            "\n MvLb1lh26mcHEUz+IWN4aaKTuFwyF1v6WQPN7ssdz0Nk9X0ynGM6nTTMU3n9bWOAj76o2fOEFd\n 9I+CjO4fi8yQ==",
            "\n pYMsbZeOxgT2zKpaHkX6rJKgxqnZ2e30XySCacocPQr8hdaxZfxCSjRwZBqTdkDK8GChX/FjFA\n ssI7v/x/m18A=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6000,8403,9785\"; a=\"232076457\"",
            "E=Sophos;i=\"5.77,417,1596524400\"; d=\"scan'208\";a=\"232076457\"",
            "E=Sophos;i=\"5.77,417,1596524400\"; d=\"scan'208\";a=\"350011973\""
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "From": "Haiyue Wang <haiyue.wang@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "ferruh.yigit@intel.com, jia.guo@intel.com, qi.z.zhang@intel.com,\n zhaoyan.chen@intel.com, Haiyue Wang <haiyue.wang@intel.com>,\n Qiming Yang <qiming.yang@intel.com>, Ray Kinsella <mdr@ashroe.eu>,\n Neil Horman <nhorman@tuxdriver.com>",
        "Date": "Mon, 26 Oct 2020 14:55:24 +0800",
        "Message-Id": "<20201026065525.632361-1-haiyue.wang@intel.com>",
        "X-Mailer": "git-send-email 2.29.0",
        "In-Reply-To": "<20201025071352.221953-1-haiyue.wang@intel.com>",
        "References": "<20201025071352.221953-1-haiyue.wang@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v3] net/ice: refactor the protocol extraction\n\tdesign",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Change the protocol extraction dynamic mbuf usage from register API to\nlookup API, so the application can decide to read the metadata or not\nat the run time, in other words, PMD will check this at Rx queue start\ntime.\n\nThis design makes the API simple now: it just needs to export the name\nstring, not the whole dynamic mbuf data objects.\n\nSigned-off-by: Haiyue Wang <haiyue.wang@intel.com>\n---\nv3: Fix 'regiser' typo in commit message.\n\nv2: update the commit message, doc; and add the error handling for\n    dynamic mbuf lookup. Also keep the metadata format defination.\n---\n doc/guides/nics/ice.rst       |  16 ++--\n drivers/net/ice/ice_ethdev.c  | 117 +++++------------------\n drivers/net/ice/ice_ethdev.h  |   1 +\n drivers/net/ice/ice_rxtx.c    |  62 ++++++++----\n drivers/net/ice/ice_rxtx.h    |   1 +\n drivers/net/ice/rte_pmd_ice.h | 171 +++++++---------------------------\n drivers/net/ice/version.map   |  13 ---\n 7 files changed, 106 insertions(+), 275 deletions(-)",
    "diff": "diff --git a/doc/guides/nics/ice.rst b/doc/guides/nics/ice.rst\nindex a2aea12333..9878b665b3 100644\n--- a/doc/guides/nics/ice.rst\n+++ b/doc/guides/nics/ice.rst\n@@ -156,19 +156,17 @@ Runtime Config Options\n    +----------------------------+----------------------------+\n    |           IPHDR2           |           IPHDR1           |\n    +============================+============================+\n-   |       IPv6 HDR Offset      |       IPv4 HDR Offset      |\n+   |         Reserved           |       IP Header Offset     |\n    +----------------------------+----------------------------+\n \n-  IPHDR1 - Outer/Single IPv4 Header offset.\n+  IPHDR1 - Outer/Single IPv4/IPv6 Header offset.\n \n-  IPHDR2 - Outer/Single IPv6 Header offset.\n+  IPHDR2 - Reserved.\n \n-  Use ``rte_net_ice_dynf_proto_xtr_metadata_get`` to access the protocol\n-  extraction metadata, and use ``RTE_PKT_RX_DYNF_PROTO_XTR_*`` to get the\n-  metadata type of ``struct rte_mbuf::ol_flags``.\n-\n-  The ``rte_net_ice_dump_proto_xtr_metadata`` routine shows how to\n-  access the protocol extraction result in ``struct rte_mbuf``.\n+  The dynamic mbuf field for metadata uses \"rte_pmd_dynfield_proto_xtr_metadata\"\n+  name with 4 byte size. And the related dynamic mbuf flag uses the name format\n+  \"rte_pmd_dynflag_proto_xtr_*\" which ends with the protocol extraction devargs\n+  name such as \"ip_offset\".\n \n Driver compilation and testing\n ------------------------------\ndiff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c\nindex 51b99c6506..9e7d71ae4d 100644\n--- a/drivers/net/ice/ice_ethdev.c\n+++ b/drivers/net/ice/ice_ethdev.c\n@@ -32,42 +32,6 @@ static const char * const ice_valid_args[] = {\n \tNULL\n };\n \n-static const struct rte_mbuf_dynfield ice_proto_xtr_metadata_param = {\n-\t.name = \"ice_dynfield_proto_xtr_metadata\",\n-\t.size = sizeof(uint32_t),\n-\t.align = __alignof__(uint32_t),\n-\t.flags = 0,\n-};\n-\n-struct proto_xtr_ol_flag {\n-\tconst struct rte_mbuf_dynflag param;\n-\tuint64_t *ol_flag;\n-\tbool required;\n-};\n-\n-static bool ice_proto_xtr_hw_support[PROTO_XTR_MAX];\n-\n-static struct proto_xtr_ol_flag ice_proto_xtr_ol_flag_params[] = {\n-\t[PROTO_XTR_VLAN] = {\n-\t\t.param = { .name = \"ice_dynflag_proto_xtr_vlan\" },\n-\t\t.ol_flag = &rte_net_ice_dynflag_proto_xtr_vlan_mask },\n-\t[PROTO_XTR_IPV4] = {\n-\t\t.param = { .name = \"ice_dynflag_proto_xtr_ipv4\" },\n-\t\t.ol_flag = &rte_net_ice_dynflag_proto_xtr_ipv4_mask },\n-\t[PROTO_XTR_IPV6] = {\n-\t\t.param = { .name = \"ice_dynflag_proto_xtr_ipv6\" },\n-\t\t.ol_flag = &rte_net_ice_dynflag_proto_xtr_ipv6_mask },\n-\t[PROTO_XTR_IPV6_FLOW] = {\n-\t\t.param = { .name = \"ice_dynflag_proto_xtr_ipv6_flow\" },\n-\t\t.ol_flag = &rte_net_ice_dynflag_proto_xtr_ipv6_flow_mask },\n-\t[PROTO_XTR_TCP] = {\n-\t\t.param = { .name = \"ice_dynflag_proto_xtr_tcp\" },\n-\t\t.ol_flag = &rte_net_ice_dynflag_proto_xtr_tcp_mask },\n-\t[PROTO_XTR_IP_OFFSET] = {\n-\t\t.param = { .name = \"ice_dynflag_proto_xtr_ip_offset\" },\n-\t\t.ol_flag = &rte_net_ice_dynflag_proto_xtr_ip_offset_mask },\n-};\n-\n #define ICE_DFLT_OUTER_TAG_TYPE ICE_AQ_VSI_OUTER_TAG_VLAN_9100\n \n #define ICE_OS_DEFAULT_PKG_NAME\t\t\"ICE OS Default Package\"\n@@ -542,7 +506,7 @@ handle_proto_xtr_arg(__rte_unused const char *key, const char *value,\n }\n \n static void\n-ice_check_proto_xtr_support(struct ice_hw *hw)\n+ice_check_proto_xtr_support(struct ice_pf *pf, struct ice_hw *hw)\n {\n #define FLX_REG(val, fld, idx) \\\n \t(((val) & GLFLXP_RXDID_FLX_WRD_##idx##_##fld##_M) >> \\\n@@ -587,7 +551,7 @@ ice_check_proto_xtr_support(struct ice_hw *hw)\n \n \t\t\tif (FLX_REG(v, PROT_MDID, 4) == xtr_sets[i].protid_0 &&\n \t\t\t    FLX_REG(v, RXDID_OPCODE, 4) == xtr_sets[i].opcode)\n-\t\t\t\tice_proto_xtr_hw_support[i] = true;\n+\t\t\t\tpf->hw_proto_xtr_ena[i] = 1;\n \t\t}\n \n \t\tif (xtr_sets[i].protid_1 != ICE_PROT_ID_INVAL) {\n@@ -595,7 +559,7 @@ ice_check_proto_xtr_support(struct ice_hw *hw)\n \n \t\t\tif (FLX_REG(v, PROT_MDID, 5) == xtr_sets[i].protid_1 &&\n \t\t\t    FLX_REG(v, RXDID_OPCODE, 5) == xtr_sets[i].opcode)\n-\t\t\t\tice_proto_xtr_hw_support[i] = true;\n+\t\t\t\tpf->hw_proto_xtr_ena[i] = 1;\n \t\t}\n \t}\n }\n@@ -1429,9 +1393,8 @@ ice_init_proto_xtr(struct rte_eth_dev *dev)\n \t\t\tICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);\n \tstruct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);\n \tstruct ice_hw *hw = ICE_PF_TO_HW(pf);\n-\tconst struct proto_xtr_ol_flag *ol_flag;\n-\tbool proto_xtr_enable = false;\n-\tint offset;\n+\tuint8_t err_msgs[PROTO_XTR_MAX];\n+\tuint8_t proto_xtr_type;\n \tuint16_t i;\n \n \tpf->proto_xtr = rte_zmalloc(NULL, pf->lan_nb_qps, 0);\n@@ -1440,65 +1403,27 @@ ice_init_proto_xtr(struct rte_eth_dev *dev)\n \t\treturn;\n \t}\n \n-\tfor (i = 0; i < pf->lan_nb_qps; i++) {\n-\t\tpf->proto_xtr[i] = ad->devargs.proto_xtr[i] != PROTO_XTR_NONE ?\n-\t\t\t\t   ad->devargs.proto_xtr[i] :\n-\t\t\t\t   ad->devargs.proto_xtr_dflt;\n-\n-\t\tif (pf->proto_xtr[i] != PROTO_XTR_NONE) {\n-\t\t\tuint8_t type = pf->proto_xtr[i];\n-\n-\t\t\tice_proto_xtr_ol_flag_params[type].required = true;\n-\t\t\tproto_xtr_enable = true;\n-\t\t}\n-\t}\n-\n-\tif (likely(!proto_xtr_enable))\n-\t\treturn;\n-\n-\tice_check_proto_xtr_support(hw);\n-\n-\toffset = rte_mbuf_dynfield_register(&ice_proto_xtr_metadata_param);\n-\tif (unlikely(offset == -1)) {\n-\t\tPMD_DRV_LOG(ERR,\n-\t\t\t    \"Protocol extraction metadata is disabled in mbuf with error %d\",\n-\t\t\t    -rte_errno);\n-\t\treturn;\n-\t}\n-\n-\tPMD_DRV_LOG(DEBUG,\n-\t\t    \"Protocol extraction metadata offset in mbuf is : %d\",\n-\t\t    offset);\n-\trte_net_ice_dynfield_proto_xtr_metadata_offs = offset;\n-\n-\tfor (i = 0; i < RTE_DIM(ice_proto_xtr_ol_flag_params); i++) {\n-\t\tol_flag = &ice_proto_xtr_ol_flag_params[i];\n-\n-\t\tif (!ol_flag->required)\n-\t\t\tcontinue;\n+\tice_check_proto_xtr_support(pf, hw);\n \n-\t\tif (!ice_proto_xtr_hw_support[i]) {\n-\t\t\tPMD_DRV_LOG(ERR,\n-\t\t\t\t    \"Protocol extraction type %u is not supported in hardware\",\n-\t\t\t\t    i);\n-\t\t\trte_net_ice_dynfield_proto_xtr_metadata_offs = -1;\n-\t\t\tbreak;\n-\t\t}\n+\tmemset(err_msgs, 0, sizeof(err_msgs));\n \n-\t\toffset = rte_mbuf_dynflag_register(&ol_flag->param);\n-\t\tif (unlikely(offset == -1)) {\n-\t\t\tPMD_DRV_LOG(ERR,\n-\t\t\t\t    \"Protocol extraction offload '%s' failed to register with error %d\",\n-\t\t\t\t    ol_flag->param.name, -rte_errno);\n+\tfor (i = 0; i < pf->lan_nb_qps; i++) {\n+\t\tproto_xtr_type = ad->devargs.proto_xtr[i] != PROTO_XTR_NONE ?\n+\t\t\t\t ad->devargs.proto_xtr[i] :\n+\t\t\t\t ad->devargs.proto_xtr_dflt;\n+\n+\t\tif (proto_xtr_type != PROTO_XTR_NONE &&\n+\t\t    !pf->hw_proto_xtr_ena[proto_xtr_type]) {\n+\t\t\tif (!err_msgs[proto_xtr_type]) {\n+\t\t\t\tPMD_DRV_LOG(ERR, \"protocol extraction type %u is not supported in hardware\\n\",\n+\t\t\t\t\t    proto_xtr_type);\n+\t\t\t\terr_msgs[proto_xtr_type] = 1;\n+\t\t\t}\n \n-\t\t\trte_net_ice_dynfield_proto_xtr_metadata_offs = -1;\n-\t\t\tbreak;\n+\t\t\tproto_xtr_type = PROTO_XTR_NONE;\n \t\t}\n \n-\t\tPMD_DRV_LOG(DEBUG,\n-\t\t\t    \"Protocol extraction offload '%s' offset in mbuf is : %d\",\n-\t\t\t    ol_flag->param.name, offset);\n-\t\t*ol_flag->ol_flag = 1ULL << offset;\n+\t\tpf->proto_xtr[i] = proto_xtr_type;\n \t}\n }\n \ndiff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h\nindex 05218af05e..a675eac209 100644\n--- a/drivers/net/ice/ice_ethdev.h\n+++ b/drivers/net/ice/ice_ethdev.h\n@@ -457,6 +457,7 @@ struct ice_pf {\n \tuint64_t old_rx_bytes;\n \tuint64_t old_tx_bytes;\n \tuint64_t supported_rxdid; /* bitmap for supported RXDID */\n+\tuint8_t hw_proto_xtr_ena[PROTO_XTR_MAX];\n };\n \n #define ICE_MAX_QUEUE_NUM  2048\ndiff --git a/drivers/net/ice/ice_rxtx.c b/drivers/net/ice/ice_rxtx.c\nindex f6291894cd..4063aabfeb 100644\n--- a/drivers/net/ice/ice_rxtx.c\n+++ b/drivers/net/ice/ice_rxtx.c\n@@ -15,16 +15,8 @@\n \t\tPKT_TX_TCP_SEG |\t\t \\\n \t\tPKT_TX_OUTER_IP_CKSUM)\n \n-/* Offset of mbuf dynamic field for protocol extraction data */\n-int rte_net_ice_dynfield_proto_xtr_metadata_offs = -1;\n-\n-/* Mask of mbuf dynamic flags for protocol extraction type */\n-uint64_t rte_net_ice_dynflag_proto_xtr_vlan_mask;\n-uint64_t rte_net_ice_dynflag_proto_xtr_ipv4_mask;\n-uint64_t rte_net_ice_dynflag_proto_xtr_ipv6_mask;\n-uint64_t rte_net_ice_dynflag_proto_xtr_ipv6_flow_mask;\n-uint64_t rte_net_ice_dynflag_proto_xtr_tcp_mask;\n-uint64_t rte_net_ice_dynflag_proto_xtr_ip_offset_mask;\n+#define ICE_DYNF_PROTO_XTR_METADATA(m) \\\n+\tRTE_MBUF_DYNFIELD((m), rxq->xtr_metadata_off, uint32_t *)\n \n static inline uint8_t\n ice_proto_xtr_type_to_rxdid(uint8_t xtr_type)\n@@ -104,7 +96,7 @@ ice_rxd_to_pkt_fields_by_comms_aux_v1(struct ice_rx_queue *rxq,\n \t\tif (metadata) {\n \t\t\tmb->ol_flags |= rxq->xtr_ol_flag;\n \n-\t\t\t*RTE_NET_ICE_DYNF_PROTO_XTR_METADATA(mb) = metadata;\n+\t\t\t*ICE_DYNF_PROTO_XTR_METADATA(mb) = metadata;\n \t\t}\n \t}\n #endif\n@@ -142,7 +134,7 @@ ice_rxd_to_pkt_fields_by_comms_aux_v2(struct ice_rx_queue *rxq,\n \t\tif (metadata) {\n \t\t\tmb->ol_flags |= rxq->xtr_ol_flag;\n \n-\t\t\t*RTE_NET_ICE_DYNF_PROTO_XTR_METADATA(mb) = metadata;\n+\t\t\t*ICE_DYNF_PROTO_XTR_METADATA(mb) = metadata;\n \t\t}\n \t}\n #endif\n@@ -151,34 +143,38 @@ ice_rxd_to_pkt_fields_by_comms_aux_v2(struct ice_rx_queue *rxq,\n static void\n ice_select_rxd_to_pkt_fields_handler(struct ice_rx_queue *rxq, uint32_t rxdid)\n {\n+\tstruct rte_mbuf_dynfield metadata_param;\n+\tconst char *flag_name = NULL;\n+\tint flag_off, metadata_off;\n+\n \tswitch (rxdid) {\n \tcase ICE_RXDID_COMMS_AUX_VLAN:\n-\t\trxq->xtr_ol_flag = rte_net_ice_dynflag_proto_xtr_vlan_mask;\n+\t\tflag_name = RTE_PMD_DYNFLAG_PROTO_XTR_VLAN_NAME;\n \t\trxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_aux_v1;\n \t\tbreak;\n \n \tcase ICE_RXDID_COMMS_AUX_IPV4:\n-\t\trxq->xtr_ol_flag = rte_net_ice_dynflag_proto_xtr_ipv4_mask;\n+\t\tflag_name = RTE_PMD_DYNFLAG_PROTO_XTR_IPV4_NAME;\n \t\trxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_aux_v1;\n \t\tbreak;\n \n \tcase ICE_RXDID_COMMS_AUX_IPV6:\n-\t\trxq->xtr_ol_flag = rte_net_ice_dynflag_proto_xtr_ipv6_mask;\n+\t\tflag_name = RTE_PMD_DYNFLAG_PROTO_XTR_IPV6_NAME;\n \t\trxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_aux_v1;\n \t\tbreak;\n \n \tcase ICE_RXDID_COMMS_AUX_IPV6_FLOW:\n-\t\trxq->xtr_ol_flag = rte_net_ice_dynflag_proto_xtr_ipv6_flow_mask;\n+\t\tflag_name = RTE_PMD_DYNFLAG_PROTO_XTR_IPV6_FLOW_NAME;\n \t\trxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_aux_v1;\n \t\tbreak;\n \n \tcase ICE_RXDID_COMMS_AUX_TCP:\n-\t\trxq->xtr_ol_flag = rte_net_ice_dynflag_proto_xtr_tcp_mask;\n+\t\tflag_name = RTE_PMD_DYNFLAG_PROTO_XTR_TCP_NAME;\n \t\trxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_aux_v1;\n \t\tbreak;\n \n \tcase ICE_RXDID_COMMS_AUX_IP_OFFSET:\n-\t\trxq->xtr_ol_flag = rte_net_ice_dynflag_proto_xtr_ip_offset_mask;\n+\t\tflag_name = RTE_PMD_DYNFLAG_PROTO_XTR_IP_OFFSET_NAME;\n \t\trxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_aux_v2;\n \t\tbreak;\n \n@@ -192,8 +188,34 @@ ice_select_rxd_to_pkt_fields_handler(struct ice_rx_queue *rxq, uint32_t rxdid)\n \t\tbreak;\n \t}\n \n-\tif (!rte_net_ice_dynf_proto_xtr_metadata_avail())\n-\t\trxq->xtr_ol_flag = 0;\n+\tif (!flag_name)\n+\t\treturn;\n+\n+\tflag_off = rte_mbuf_dynflag_lookup(flag_name, NULL);\n+\tif (flag_off == -1) {\n+\t\tPMD_DRV_LOG(WARNING, \"failed to lookup the dynamic flag '%s' for Rx queue %u : %d\",\n+\t\t\t    flag_name, rxq->queue_id, -rte_errno);\n+\t\treturn;\n+\t}\n+\n+\tmetadata_off = rte_mbuf_dynfield_lookup\n+\t\t\t\t(RTE_PMD_DYNFIELD_PROTO_XTR_METADATA_NAME,\n+\t\t\t\t &metadata_param);\n+\tif (metadata_off == -1) {\n+\t\tPMD_DRV_LOG(WARNING, \"failed to lookup the dynamic field '%s' for Rx queue %u : %d\",\n+\t\t\t    RTE_PMD_DYNFIELD_PROTO_XTR_METADATA_NAME,\n+\t\t\t    rxq->queue_id, -rte_errno);\n+\t\treturn;\n+\t}\n+\tif (metadata_param.size != sizeof(uint32_t)) {\n+\t\tPMD_DRV_LOG(WARNING, \"the dynamic field '%s' data size is not matched for Rx queue %u\",\n+\t\t\t    RTE_PMD_DYNFIELD_PROTO_XTR_METADATA_NAME,\n+\t\t\t    rxq->queue_id);\n+\t\treturn;\n+\t}\n+\n+\trxq->xtr_metadata_off = metadata_off;\n+\trxq->xtr_ol_flag = 1ULL << flag_off;\n }\n \n static enum ice_status\ndiff --git a/drivers/net/ice/ice_rxtx.h b/drivers/net/ice/ice_rxtx.h\nindex 23409d479a..53d0a609f3 100644\n--- a/drivers/net/ice/ice_rxtx.h\n+++ b/drivers/net/ice/ice_rxtx.h\n@@ -85,6 +85,7 @@ struct ice_rx_queue {\n \tbool q_set; /* indicate if rx queue has been configured */\n \tbool rx_deferred_start; /* don't start this queue in dev start */\n \tuint8_t proto_xtr; /* Protocol extraction from flexible descriptor */\n+\tint xtr_metadata_off; /* Protocol extraction offload metadata offset */\n \tuint64_t xtr_ol_flag; /* Protocol extraction offload flag */\n \tice_rxd_to_pkt_fields_t rxd_to_pkt_fields; /* handle FlexiMD by RXDID */\n \tice_rx_release_mbufs_t rx_rel_mbufs;\ndiff --git a/drivers/net/ice/rte_pmd_ice.h b/drivers/net/ice/rte_pmd_ice.h\nindex 9a436a140b..f7304add40 100644\n--- a/drivers/net/ice/rte_pmd_ice.h\n+++ b/drivers/net/ice/rte_pmd_ice.h\n@@ -14,18 +14,19 @@\n  *\n  */\n \n-#include <stdio.h>\n-#include <rte_mbuf.h>\n-#include <rte_mbuf_dyn.h>\n+#include <stdint.h>\n \n #ifdef __cplusplus\n extern \"C\" {\n #endif\n \n+#ifndef __INTEL_RX_FLEX_DESC_METADATA__\n+#define __INTEL_RX_FLEX_DESC_METADATA__\n+\n /**\n  * The supported network protocol extraction metadata format.\n  */\n-union rte_net_ice_proto_xtr_metadata {\n+union rte_pmd_proto_xtr_metadata {\n \tuint32_t metadata;\n \n \tstruct {\n@@ -82,160 +83,56 @@ union rte_net_ice_proto_xtr_metadata {\n \tuint32_t ip_ofs;\n };\n \n-/* Offset of mbuf dynamic field for protocol extraction data */\n-extern int rte_net_ice_dynfield_proto_xtr_metadata_offs;\n-\n-/* Mask of mbuf dynamic flags for protocol extraction type */\n-extern uint64_t rte_net_ice_dynflag_proto_xtr_vlan_mask;\n-extern uint64_t rte_net_ice_dynflag_proto_xtr_ipv4_mask;\n-extern uint64_t rte_net_ice_dynflag_proto_xtr_ipv6_mask;\n-extern uint64_t rte_net_ice_dynflag_proto_xtr_ipv6_flow_mask;\n-extern uint64_t rte_net_ice_dynflag_proto_xtr_tcp_mask;\n-extern uint64_t rte_net_ice_dynflag_proto_xtr_ip_offset_mask;\n-\n-/**\n- * The mbuf dynamic field pointer for protocol extraction metadata.\n- */\n-#define RTE_NET_ICE_DYNF_PROTO_XTR_METADATA(m) \\\n-\tRTE_MBUF_DYNFIELD((m), \\\n-\t\t\t  rte_net_ice_dynfield_proto_xtr_metadata_offs, \\\n-\t\t\t  uint32_t *)\n-\n /**\n- * The mbuf dynamic flag for VLAN protocol extraction metadata, it is valid\n- * when dev_args 'proto_xtr' has 'vlan' specified.\n- */\n-#define RTE_PKT_RX_DYNF_PROTO_XTR_VLAN \\\n-\t(rte_net_ice_dynflag_proto_xtr_vlan_mask)\n-\n-/**\n- * The mbuf dynamic flag for IPv4 protocol extraction metadata, it is valid\n- * when dev_args 'proto_xtr' has 'ipv4' specified.\n+ * The mbuf dynamic field metadata for protocol extraction from hardware:\n+ *\n+ *  a). Extract one word from the defined location of the specified\n+ *      protocol in the packet.\n+ *  b). Report the offset to the selected protocol type.\n+ *\n+ *  And the metadata can hold two of the above defined fields (in word), these\n+ *  words are in host endian order.\n  */\n-#define RTE_PKT_RX_DYNF_PROTO_XTR_IPV4 \\\n-\t(rte_net_ice_dynflag_proto_xtr_ipv4_mask)\n+#define RTE_PMD_DYNFIELD_PROTO_XTR_METADATA_NAME \\\n+\t\"rte_pmd_dynfield_proto_xtr_metadata\"\n \n /**\n- * The mbuf dynamic flag for IPv6 protocol extraction metadata, it is valid\n- * when dev_args 'proto_xtr' has 'ipv6' specified.\n+ * The mbuf dynamic flag for VLAN protocol extraction metadata type.\n  */\n-#define RTE_PKT_RX_DYNF_PROTO_XTR_IPV6 \\\n-\t(rte_net_ice_dynflag_proto_xtr_ipv6_mask)\n+#define RTE_PMD_DYNFLAG_PROTO_XTR_VLAN_NAME \\\n+\t\"rte_pmd_dynflag_proto_xtr_vlan\"\n \n /**\n- * The mbuf dynamic flag for IPv6 with flow protocol extraction metadata, it is\n- * valid when dev_args 'proto_xtr' has 'ipv6_flow' specified.\n+ * The mbuf dynamic flag for IPv4 protocol extraction metadata type.\n  */\n-#define RTE_PKT_RX_DYNF_PROTO_XTR_IPV6_FLOW \\\n-\t(rte_net_ice_dynflag_proto_xtr_ipv6_flow_mask)\n+#define RTE_PMD_DYNFLAG_PROTO_XTR_IPV4_NAME \\\n+\t\"rte_pmd_dynflag_proto_xtr_ipv4\"\n \n /**\n- * The mbuf dynamic flag for TCP protocol extraction metadata, it is valid\n- * when dev_args 'proto_xtr' has 'tcp' specified.\n+ * The mbuf dynamic flag for IPv6 protocol extraction metadata type.\n  */\n-#define RTE_PKT_RX_DYNF_PROTO_XTR_TCP \\\n-\t(rte_net_ice_dynflag_proto_xtr_tcp_mask)\n+#define RTE_PMD_DYNFLAG_PROTO_XTR_IPV6_NAME \\\n+\t\"rte_pmd_dynflag_proto_xtr_ipv6\"\n \n /**\n- * The mbuf dynamic flag for IP_OFFSET extraction metadata, it is valid\n- * when dev_args 'proto_xtr' has 'ip_offset' specified.\n+ * The mbuf dynamic flag for IPv6 with flow protocol extraction metadata type.\n  */\n-#define RTE_PKT_RX_DYNF_PROTO_XTR_IP_OFFSET \\\n-\t(rte_net_ice_dynflag_proto_xtr_ip_offset_mask)\n+#define RTE_PMD_DYNFLAG_PROTO_XTR_IPV6_FLOW_NAME \\\n+\t\"rte_pmd_dynflag_proto_xtr_ipv6_flow\"\n \n /**\n- * Check if mbuf dynamic field for protocol extraction metadata is registered.\n- *\n- * @return\n- *   True if registered, false otherwise.\n+ * The mbuf dynamic flag for TCP protocol extraction metadata type.\n  */\n-__rte_experimental\n-static __rte_always_inline int\n-rte_net_ice_dynf_proto_xtr_metadata_avail(void)\n-{\n-\treturn rte_net_ice_dynfield_proto_xtr_metadata_offs != -1;\n-}\n+#define RTE_PMD_DYNFLAG_PROTO_XTR_TCP_NAME \\\n+\t\"rte_pmd_dynflag_proto_xtr_tcp\"\n \n /**\n- * Get the mbuf dynamic field for protocol extraction metadata.\n- *\n- * @param m\n- *    The pointer to the mbuf.\n- * @return\n- *   The saved protocol extraction metadata.\n+ * The mbuf dynamic flag for IPv4 or IPv6 header offset report metadata type.\n  */\n-__rte_experimental\n-static __rte_always_inline uint32_t\n-rte_net_ice_dynf_proto_xtr_metadata_get(struct rte_mbuf *m)\n-{\n-\treturn *RTE_NET_ICE_DYNF_PROTO_XTR_METADATA(m);\n-}\n+#define RTE_PMD_DYNFLAG_PROTO_XTR_IP_OFFSET_NAME \\\n+\t\"rte_pmd_dynflag_proto_xtr_ip_offset\"\n \n-/**\n- * Dump the mbuf dynamic field for protocol extraction metadata.\n- *\n- * @param m\n- *    The pointer to the mbuf.\n- */\n-__rte_experimental\n-static inline void\n-rte_net_ice_dump_proto_xtr_metadata(struct rte_mbuf *m)\n-{\n-\tunion rte_net_ice_proto_xtr_metadata data;\n-\n-\tif (!rte_net_ice_dynf_proto_xtr_metadata_avail())\n-\t\treturn;\n-\n-\tdata.metadata = rte_net_ice_dynf_proto_xtr_metadata_get(m);\n-\n-\tif (m->ol_flags & RTE_PKT_RX_DYNF_PROTO_XTR_VLAN)\n-\t\tprintf(\" - Protocol Extraction:[0x%04x:0x%04x],vlan,stag=%u:%u:%u,ctag=%u:%u:%u\",\n-\t\t       data.raw.data0, data.raw.data1,\n-\t\t       data.vlan.stag_pcp,\n-\t\t       data.vlan.stag_dei,\n-\t\t       data.vlan.stag_vid,\n-\t\t       data.vlan.ctag_pcp,\n-\t\t       data.vlan.ctag_dei,\n-\t\t       data.vlan.ctag_vid);\n-\telse if (m->ol_flags & RTE_PKT_RX_DYNF_PROTO_XTR_IPV4)\n-\t\tprintf(\" - Protocol Extraction:[0x%04x:0x%04x],ipv4,ver=%u,hdrlen=%u,tos=%u,ttl=%u,proto=%u\",\n-\t\t       data.raw.data0, data.raw.data1,\n-\t\t       data.ipv4.version,\n-\t\t       data.ipv4.ihl,\n-\t\t       data.ipv4.tos,\n-\t\t       data.ipv4.ttl,\n-\t\t       data.ipv4.protocol);\n-\telse if (m->ol_flags & RTE_PKT_RX_DYNF_PROTO_XTR_IPV6)\n-\t\tprintf(\" - Protocol Extraction:[0x%04x:0x%04x],ipv6,ver=%u,tc=%u,flow_hi4=0x%x,nexthdr=%u,hoplimit=%u\",\n-\t\t       data.raw.data0, data.raw.data1,\n-\t\t       data.ipv6.version,\n-\t\t       data.ipv6.tc,\n-\t\t       data.ipv6.flowhi4,\n-\t\t       data.ipv6.nexthdr,\n-\t\t       data.ipv6.hoplimit);\n-\telse if (m->ol_flags & RTE_PKT_RX_DYNF_PROTO_XTR_IPV6_FLOW)\n-\t\tprintf(\" - Protocol Extraction:[0x%04x:0x%04x],ipv6_flow,ver=%u,tc=%u,flow=0x%x%04x\",\n-\t\t       data.raw.data0, data.raw.data1,\n-\t\t       data.ipv6_flow.version,\n-\t\t       data.ipv6_flow.tc,\n-\t\t       data.ipv6_flow.flowhi4,\n-\t\t       data.ipv6_flow.flowlo16);\n-\telse if (m->ol_flags & RTE_PKT_RX_DYNF_PROTO_XTR_TCP)\n-\t\tprintf(\" - Protocol Extraction:[0x%04x:0x%04x],tcp,doff=%u,flags=%s%s%s%s%s%s%s%s\",\n-\t\t       data.raw.data0, data.raw.data1,\n-\t\t       data.tcp.doff,\n-\t\t       data.tcp.cwr ? \"C\" : \"\",\n-\t\t       data.tcp.ece ? \"E\" : \"\",\n-\t\t       data.tcp.urg ? \"U\" : \"\",\n-\t\t       data.tcp.ack ? \"A\" : \"\",\n-\t\t       data.tcp.psh ? \"P\" : \"\",\n-\t\t       data.tcp.rst ? \"R\" : \"\",\n-\t\t       data.tcp.syn ? \"S\" : \"\",\n-\t\t       data.tcp.fin ? \"F\" : \"\");\n-\telse if (m->ol_flags & RTE_PKT_RX_DYNF_PROTO_XTR_IP_OFFSET)\n-\t\tprintf(\" - Protocol Offset:ip_offset=%u\",\n-\t\t       data.ip_ofs);\n-}\n+#endif /* __INTEL_RX_FLEX_DESC_METADATA__ */\n \n #ifdef __cplusplus\n }\ndiff --git a/drivers/net/ice/version.map b/drivers/net/ice/version.map\nindex 632a296a0c..4a76d1d52d 100644\n--- a/drivers/net/ice/version.map\n+++ b/drivers/net/ice/version.map\n@@ -1,16 +1,3 @@\n DPDK_21 {\n \tlocal: *;\n };\n-\n-EXPERIMENTAL {\n-\tglobal:\n-\n-\t# added in 19.11\n-\trte_net_ice_dynfield_proto_xtr_metadata_offs;\n-\trte_net_ice_dynflag_proto_xtr_vlan_mask;\n-\trte_net_ice_dynflag_proto_xtr_ipv4_mask;\n-\trte_net_ice_dynflag_proto_xtr_ipv6_mask;\n-\trte_net_ice_dynflag_proto_xtr_ipv6_flow_mask;\n-\trte_net_ice_dynflag_proto_xtr_tcp_mask;\n-\trte_net_ice_dynflag_proto_xtr_ip_offset_mask;\n-};\n",
    "prefixes": [
        "v3"
    ]
}