get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 91665,
    "url": "https://patches.dpdk.org/api/patches/91665/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1618594406-155741-2-git-send-email-bingz@nvidia.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<1618594406-155741-2-git-send-email-bingz@nvidia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1618594406-155741-2-git-send-email-bingz@nvidia.com",
    "date": "2021-04-16T17:33:26",
    "name": "[v4,1/1] ethdev: introduce indirect action APIs",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "b9b128537fa34eee5bd481113e1a55efbbd06182",
    "submitter": {
        "id": 1976,
        "url": "https://patches.dpdk.org/api/people/1976/?format=api",
        "name": "Bing Zhao",
        "email": "bingz@nvidia.com"
    },
    "delegate": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1618594406-155741-2-git-send-email-bingz@nvidia.com/mbox/",
    "series": [
        {
            "id": 16451,
            "url": "https://patches.dpdk.org/api/series/16451/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=16451",
            "date": "2021-04-16T17:33:25",
            "name": "Change shared action API to action handle API",
            "version": 4,
            "mbox": "https://patches.dpdk.org/series/16451/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/91665/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/91665/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 80C2BA0C41;\n\tFri, 16 Apr 2021 19:33:41 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 6F3CB161BA8;\n\tFri, 16 Apr 2021 19:33:41 +0200 (CEST)",
            "from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129])\n by mails.dpdk.org (Postfix) with ESMTP id 1D823161BA7\n for <dev@dpdk.org>; Fri, 16 Apr 2021 19:33:40 +0200 (CEST)",
            "from Internal Mail-Server by MTLPINE1 (envelope-from\n bingz@nvidia.com) with SMTP; 16 Apr 2021 20:33:36 +0300",
            "from nvidia.com (mtbc-r640-01.mtbc.labs.mlnx [10.75.70.6])\n by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 13GHXTgN001994;\n Fri, 16 Apr 2021 20:33:33 +0300"
        ],
        "From": "Bing Zhao <bingz@nvidia.com>",
        "To": "orika@nvidia.com, thomas@monjalon.net, ferruh.yigit@intel.com,\n andrew.rybchenko@oktetlabs.ru, matan@nvidia.com, viacheslavo@nvidia.com",
        "Cc": "dev@dpdk.org, ajit.khaparde@broadcom.com, getelson@nvidia.com,\n andreyv@nvidia.com",
        "Date": "Sat, 17 Apr 2021 01:33:26 +0800",
        "Message-Id": "<1618594406-155741-2-git-send-email-bingz@nvidia.com>",
        "X-Mailer": "git-send-email 2.5.5",
        "In-Reply-To": "<1618594406-155741-1-git-send-email-bingz@nvidia.com>",
        "References": "<1617940481-125528-1-git-send-email-bingz@nvidia.com>\n <1618594406-155741-1-git-send-email-bingz@nvidia.com>",
        "Subject": "[dpdk-dev] [PATCH v4 1/1] ethdev: introduce indirect action APIs",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Right now, rte_flow_shared_action_* APIs are used for some shared\nactions, like RSS, count. The shared action should be created before\nusing it inside a flow. These shared actions sometimes are not\nreally shared but just some indirect actions decoupled from a flow.\n\nThe new functions rte_flow_action_handle_* are added to replace\nthe current shared functions rte_flow_shared_action_*.\n\nThere are two types of flow actions:\n1. the direct (normal) actions that could be created and stored\n   within a flow rule. Such action is tied to its flow rule and\n   cannot be reused.\n2. the indirect action, in the past, named shared_action. It is\n   created from a direct actioni, like count or rss, and then used\n   in the flow rules with an object handle. The PMD will take care\n   of the retrieve from indirect action to the direct action\n   when it is referenced.\n\nThe indirect action is accessed (update / query) w/o any flow rule,\njust via the action object handle. For example, when querying or\nresetting a counter, it could be done out of any flow using this\ncounter, but only the handle of the counter action object is\nrequired.\nThe indirect action object could be shared by different flows or\nused by a single flow, depending on the direct action type and\nthe real-life requirements.\nThe handle of an indirect action object is opaque and defined in\neach driver and possibly different per direct action type.\n\nThe old name \"shared\" is improper in a sense and should be replaced.\n\nSince the APIs are changed from \"rte_flow_shared_action*\" to the new\n\"rte_flow_action_handle*\", the testpmd application code and command\nline interfaces also need to be updated to do the adaption.\nThe testpmd application user guide is also updated. All the \"shared\naction\" related parts are replaced with \"indirect action\" to have a\ncorrect explanation.\n\nThe parameter of \"update\" interface is also changed. A general\npointer will replace the rte_flow_action struct pointer due to the\nfacts:\n1. Some action may not support fields updating. In the example of a\n   counter, the only \"update\" supported should be the reset. So\n   passing a rte_flow_action struct pointer is meaningless and\n   there is even no such corresponding action struct. What's more,\n   if more than one operations should be supported, for some other\n   action, such pointer parameter may not meet the need.\n2. Some action may need conditional or partial update, the current\n   parameter will not provide the ability to indicate which part(s)\n   to update.\n   For different types of indirect action objects, the pointer could\n   either be the same of rte_flow_action* struct - in order not to\n   break the current driver implementation, or some wrapper\n   structures with bits as masks to indicate which part to be\n   updated, depending on real needs of the corresponding direct\n   action. For different direct actions, the structures of indirect\n   action objects updating will be different.\n\nAll the underlayer PMD callbacks will be moved to these new APIs.\n\nThe RTE_FLOW_ACTION_TYPE_SHARED is kept for now in order not to\nbreak the ABI. All the implementations are changed by using\nRTE_FLOW_ACTION_TYPE_INDIRECT.\n\nSince the APIs are changed from \"rte_flow_shared_action*\" to the new\n\"rte_flow_action_handle*\" and the \"update\" interface's 3rd input\nparameter is changed to generic pointer, the mlx5 PMD that uses these\nAPIs needs to do the adaption to the new APIs as well.\n\nSigned-off-by: Bing Zhao <bingz@nvidia.com>\nAcked-by: Andrey Vesnovaty <andreyv@nvidia.com>\nAcked-by: Ori Kam <orika@nvidia.com>\nAcked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>\n---\n app/test-pmd/cmdline.c                      |  24 +-\n app/test-pmd/cmdline_flow.c                 | 252 ++++++++++----------\n app/test-pmd/config.c                       | 160 ++++++-------\n app/test-pmd/testpmd.h                      |  28 +--\n doc/guides/prog_guide/rte_flow.rst          |  29 +--\n doc/guides/rel_notes/release_21_05.rst      |   3 +\n doc/guides/testpmd_app_ug/testpmd_funcs.rst | 102 ++++----\n drivers/net/mlx5/mlx5.c                     |   2 +-\n drivers/net/mlx5/mlx5_defs.h                |   4 +-\n drivers/net/mlx5/mlx5_flow.c                | 238 +++++++++---------\n drivers/net/mlx5/mlx5_flow.h                |  24 +-\n drivers/net/mlx5/mlx5_flow_dv.c             |  85 +++----\n lib/librte_ethdev/rte_flow.c                |  56 ++---\n lib/librte_ethdev/rte_flow.h                | 118 +++++----\n lib/librte_ethdev/rte_flow_driver.h         |  26 +-\n lib/librte_ethdev/version.map               |   8 +-\n 16 files changed, 593 insertions(+), 566 deletions(-)",
    "diff": "diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c\nindex 5bf1497f2b..4d9e038ce8 100644\n--- a/app/test-pmd/cmdline.c\n+++ b/app/test-pmd/cmdline.c\n@@ -1002,23 +1002,23 @@ static void cmd_help_long_parsed(void *parsed_result,\n \t\t\t\"    List and destroy aged flows\"\n \t\t\t\" flow rules\\n\\n\"\n \n-\t\t\t\"flow shared_action {port_id} create\"\n-\t\t\t\" [action_id {shared_action_id}]\"\n+\t\t\t\"flow indirect_action {port_id} create\"\n+\t\t\t\" [action_id {indirect_action_id}]\"\n \t\t\t\" [ingress] [egress]\"\n \t\t\t\" action {action} / end\\n\"\n-\t\t\t\"    Create shared action.\\n\\n\"\n+\t\t\t\"    Create indirect action.\\n\\n\"\n \n-\t\t\t\"flow shared_action {port_id} update\"\n-\t\t\t\" {shared_action_id} action {action} / end\\n\"\n-\t\t\t\"    Update shared action.\\n\\n\"\n+\t\t\t\"flow indirect_action {port_id} update\"\n+\t\t\t\" {indirect_action_id} action {action} / end\\n\"\n+\t\t\t\"    Update indirect action.\\n\\n\"\n \n-\t\t\t\"flow shared_action {port_id} destroy\"\n-\t\t\t\" action_id {shared_action_id} [...]\\n\"\n-\t\t\t\"    Destroy specific shared actions.\\n\\n\"\n+\t\t\t\"flow indirect_action {port_id} destroy\"\n+\t\t\t\" action_id {indirect_action_id} [...]\\n\"\n+\t\t\t\"    Destroy specific indirect actions.\\n\\n\"\n \n-\t\t\t\"flow shared_action {port_id} query\"\n-\t\t\t\" {shared_action_id}\\n\"\n-\t\t\t\"    Query an existing shared action.\\n\\n\"\n+\t\t\t\"flow indirect_action {port_id} query\"\n+\t\t\t\" {indirect_action_id}\\n\"\n+\t\t\t\"    Query an existing indirect action.\\n\\n\"\n \n \t\t\t\"set vxlan ip-version (ipv4|ipv6) vni (vni) udp-src\"\n \t\t\t\" (udp-src) udp-dst (udp-dst) ip-src (ip-src) ip-dst\"\ndiff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c\nindex 0127d9e7d6..c5381c638b 100644\n--- a/app/test-pmd/cmdline_flow.c\n+++ b/app/test-pmd/cmdline_flow.c\n@@ -54,7 +54,7 @@ enum index {\n \tPORT_ID,\n \tGROUP_ID,\n \tPRIORITY_LEVEL,\n-\tSHARED_ACTION_ID,\n+\tINDIRECT_ACTION_ID,\n \n \t/* Top-level command. */\n \tSET,\n@@ -68,7 +68,7 @@ enum index {\n \t/* Top-level command. */\n \tFLOW,\n \t/* Sub-level commands. */\n-\tSHARED_ACTION,\n+\tINDIRECT_ACTION,\n \tVALIDATE,\n \tCREATE,\n \tDESTROY,\n@@ -112,21 +112,21 @@ enum index {\n \tDUMP_ALL,\n \tDUMP_ONE,\n \n-\t/* Shared action arguments */\n-\tSHARED_ACTION_CREATE,\n-\tSHARED_ACTION_UPDATE,\n-\tSHARED_ACTION_DESTROY,\n-\tSHARED_ACTION_QUERY,\n+\t/* Indirect action arguments */\n+\tINDIRECT_ACTION_CREATE,\n+\tINDIRECT_ACTION_UPDATE,\n+\tINDIRECT_ACTION_DESTROY,\n+\tINDIRECT_ACTION_QUERY,\n \n-\t/* Shared action create arguments */\n-\tSHARED_ACTION_CREATE_ID,\n-\tSHARED_ACTION_INGRESS,\n-\tSHARED_ACTION_EGRESS,\n-\tSHARED_ACTION_TRANSFER,\n-\tSHARED_ACTION_SPEC,\n+\t/* Indirect action create arguments */\n+\tINDIRECT_ACTION_CREATE_ID,\n+\tINDIRECT_ACTION_INGRESS,\n+\tINDIRECT_ACTION_EGRESS,\n+\tINDIRECT_ACTION_TRANSFER,\n+\tINDIRECT_ACTION_SPEC,\n \n-\t/* Shared action destroy arguments */\n-\tSHARED_ACTION_DESTROY_ID,\n+\t/* Indirect action destroy arguments */\n+\tINDIRECT_ACTION_DESTROY_ID,\n \n \t/* Validate/create pattern. */\n \tPATTERN,\n@@ -416,8 +416,8 @@ enum index {\n \tACTION_SAMPLE_RATIO,\n \tACTION_SAMPLE_INDEX,\n \tACTION_SAMPLE_INDEX_VALUE,\n-\tACTION_SHARED,\n-\tSHARED_ACTION_ID2PTR,\n+\tACTION_INDIRECT,\n+\tINDIRECT_ACTION_ID2PTR,\n \tACTION_MODIFY_FIELD,\n \tACTION_MODIFY_FIELD_OP,\n \tACTION_MODIFY_FIELD_OP_VALUE,\n@@ -778,10 +778,10 @@ struct buffer {\n \t\tstruct {\n \t\t\tuint32_t *action_id;\n \t\t\tuint32_t action_id_n;\n-\t\t} sa_destroy; /**< Shared action destroy arguments. */\n+\t\t} ia_destroy; /**< Indirect action destroy arguments. */\n \t\tstruct {\n \t\t\tuint32_t action_id;\n-\t\t} sa; /* Shared action query arguments */\n+\t\t} ia; /* Indirect action query arguments */\n \t\tstruct {\n \t\t\tstruct rte_flow_attr attr;\n \t\t\tstruct tunnel_ops tunnel_ops;\n@@ -841,12 +841,12 @@ struct parse_action_priv {\n \t\t.size = s, \\\n \t})\n \n-static const enum index next_sa_create_attr[] = {\n-\tSHARED_ACTION_CREATE_ID,\n-\tSHARED_ACTION_INGRESS,\n-\tSHARED_ACTION_EGRESS,\n-\tSHARED_ACTION_TRANSFER,\n-\tSHARED_ACTION_SPEC,\n+static const enum index next_ia_create_attr[] = {\n+\tINDIRECT_ACTION_CREATE_ID,\n+\tINDIRECT_ACTION_INGRESS,\n+\tINDIRECT_ACTION_EGRESS,\n+\tINDIRECT_ACTION_TRANSFER,\n+\tINDIRECT_ACTION_SPEC,\n \tZERO,\n };\n \n@@ -856,11 +856,11 @@ static const enum index next_dump_subcmd[] = {\n \tZERO,\n };\n \n-static const enum index next_sa_subcmd[] = {\n-\tSHARED_ACTION_CREATE,\n-\tSHARED_ACTION_UPDATE,\n-\tSHARED_ACTION_DESTROY,\n-\tSHARED_ACTION_QUERY,\n+static const enum index next_ia_subcmd[] = {\n+\tINDIRECT_ACTION_CREATE,\n+\tINDIRECT_ACTION_UPDATE,\n+\tINDIRECT_ACTION_DESTROY,\n+\tINDIRECT_ACTION_QUERY,\n \tZERO,\n };\n \n@@ -900,8 +900,8 @@ static const enum index next_aged_attr[] = {\n \tZERO,\n };\n \n-static const enum index next_sa_destroy_attr[] = {\n-\tSHARED_ACTION_DESTROY_ID,\n+static const enum index next_ia_destroy_attr[] = {\n+\tINDIRECT_ACTION_DESTROY_ID,\n \tEND,\n \tZERO,\n };\n@@ -1380,7 +1380,7 @@ static const enum index next_action[] = {\n \tACTION_SET_IPV6_DSCP,\n \tACTION_AGE,\n \tACTION_SAMPLE,\n-\tACTION_SHARED,\n+\tACTION_INDIRECT,\n \tACTION_MODIFY_FIELD,\n \tZERO,\n };\n@@ -1797,13 +1797,13 @@ static int parse_ipv6_addr(struct context *, const struct token *,\n static int parse_port(struct context *, const struct token *,\n \t\t      const char *, unsigned int,\n \t\t      void *, unsigned int);\n-static int parse_sa(struct context *, const struct token *,\n+static int parse_ia(struct context *, const struct token *,\n \t\t    const char *, unsigned int,\n \t\t    void *, unsigned int);\n-static int parse_sa_destroy(struct context *ctx, const struct token *token,\n+static int parse_ia_destroy(struct context *ctx, const struct token *token,\n \t\t\t    const char *str, unsigned int len,\n \t\t\t    void *buf, unsigned int size);\n-static int parse_sa_id2ptr(struct context *ctx, const struct token *token,\n+static int parse_ia_id2ptr(struct context *ctx, const struct token *token,\n \t\t\t   const char *str, unsigned int len, void *buf,\n \t\t\t   unsigned int size);\n static int comp_none(struct context *, const struct token *,\n@@ -1950,10 +1950,10 @@ static const struct token token_list[] = {\n \t\t.call = parse_int,\n \t\t.comp = comp_none,\n \t},\n-\t[SHARED_ACTION_ID] = {\n-\t\t.name = \"{shared_action_id}\",\n-\t\t.type = \"SHARED_ACTION_ID\",\n-\t\t.help = \"shared action id\",\n+\t[INDIRECT_ACTION_ID] = {\n+\t\t.name = \"{indirect_action_id}\",\n+\t\t.type = \"INDIRECT_ACTION_ID\",\n+\t\t.help = \"indirect action id\",\n \t\t.call = parse_int,\n \t\t.comp = comp_none,\n \t},\n@@ -1963,7 +1963,7 @@ static const struct token token_list[] = {\n \t\t.type = \"{command} {port_id} [{arg} [...]]\",\n \t\t.help = \"manage ingress/egress flow rules\",\n \t\t.next = NEXT(NEXT_ENTRY\n-\t\t\t     (SHARED_ACTION,\n+\t\t\t     (INDIRECT_ACTION,\n \t\t\t      VALIDATE,\n \t\t\t      CREATE,\n \t\t\t      DESTROY,\n@@ -1977,42 +1977,42 @@ static const struct token token_list[] = {\n \t\t.call = parse_init,\n \t},\n \t/* Top-level command. */\n-\t[SHARED_ACTION] = {\n-\t\t.name = \"shared_action\",\n+\t[INDIRECT_ACTION] = {\n+\t\t.name = \"indirect_action\",\n \t\t.type = \"{command} {port_id} [{arg} [...]]\",\n-\t\t.help = \"manage shared actions\",\n-\t\t.next = NEXT(next_sa_subcmd, NEXT_ENTRY(PORT_ID)),\n+\t\t.help = \"manage indirect actions\",\n+\t\t.next = NEXT(next_ia_subcmd, NEXT_ENTRY(PORT_ID)),\n \t\t.args = ARGS(ARGS_ENTRY(struct buffer, port)),\n-\t\t.call = parse_sa,\n+\t\t.call = parse_ia,\n \t},\n \t/* Sub-level commands. */\n-\t[SHARED_ACTION_CREATE] = {\n+\t[INDIRECT_ACTION_CREATE] = {\n \t\t.name = \"create\",\n-\t\t.help = \"create shared action\",\n-\t\t.next = NEXT(next_sa_create_attr),\n-\t\t.call = parse_sa,\n+\t\t.help = \"create indirect action\",\n+\t\t.next = NEXT(next_ia_create_attr),\n+\t\t.call = parse_ia,\n \t},\n-\t[SHARED_ACTION_UPDATE] = {\n+\t[INDIRECT_ACTION_UPDATE] = {\n \t\t.name = \"update\",\n-\t\t.help = \"update shared action\",\n-\t\t.next = NEXT(NEXT_ENTRY(SHARED_ACTION_SPEC),\n-\t\t\t     NEXT_ENTRY(SHARED_ACTION_ID)),\n+\t\t.help = \"update indirect action\",\n+\t\t.next = NEXT(NEXT_ENTRY(INDIRECT_ACTION_SPEC),\n+\t\t\t     NEXT_ENTRY(INDIRECT_ACTION_ID)),\n \t\t.args = ARGS(ARGS_ENTRY(struct buffer, args.vc.attr.group)),\n-\t\t.call = parse_sa,\n+\t\t.call = parse_ia,\n \t},\n-\t[SHARED_ACTION_DESTROY] = {\n+\t[INDIRECT_ACTION_DESTROY] = {\n \t\t.name = \"destroy\",\n-\t\t.help = \"destroy shared action\",\n-\t\t.next = NEXT(NEXT_ENTRY(SHARED_ACTION_DESTROY_ID)),\n+\t\t.help = \"destroy indirect action\",\n+\t\t.next = NEXT(NEXT_ENTRY(INDIRECT_ACTION_DESTROY_ID)),\n \t\t.args = ARGS(ARGS_ENTRY(struct buffer, port)),\n-\t\t.call = parse_sa_destroy,\n+\t\t.call = parse_ia_destroy,\n \t},\n-\t[SHARED_ACTION_QUERY] = {\n+\t[INDIRECT_ACTION_QUERY] = {\n \t\t.name = \"query\",\n-\t\t.help = \"query shared action\",\n-\t\t.next = NEXT(NEXT_ENTRY(END), NEXT_ENTRY(SHARED_ACTION_ID)),\n-\t\t.args = ARGS(ARGS_ENTRY(struct buffer, args.sa.action_id)),\n-\t\t.call = parse_sa,\n+\t\t.help = \"query indirect action\",\n+\t\t.next = NEXT(NEXT_ENTRY(END), NEXT_ENTRY(INDIRECT_ACTION_ID)),\n+\t\t.args = ARGS(ARGS_ENTRY(struct buffer, args.ia.action_id)),\n+\t\t.call = parse_ia,\n \t},\n \t[VALIDATE] = {\n \t\t.name = \"validate\",\n@@ -4498,61 +4498,61 @@ static const struct token token_list[] = {\n \t\t.call = parse_vc_action_sample_index,\n \t\t.comp = comp_set_sample_index,\n \t},\n-\t/* Shared action destroy arguments. */\n-\t[SHARED_ACTION_DESTROY_ID] = {\n+\t/* Indirect action destroy arguments. */\n+\t[INDIRECT_ACTION_DESTROY_ID] = {\n \t\t.name = \"action_id\",\n-\t\t.help = \"specify a shared action id to destroy\",\n-\t\t.next = NEXT(next_sa_destroy_attr,\n-\t\t\t     NEXT_ENTRY(SHARED_ACTION_ID)),\n+\t\t.help = \"specify a indirect action id to destroy\",\n+\t\t.next = NEXT(next_ia_destroy_attr,\n+\t\t\t     NEXT_ENTRY(INDIRECT_ACTION_ID)),\n \t\t.args = ARGS(ARGS_ENTRY_PTR(struct buffer,\n-\t\t\t\t\t    args.sa_destroy.action_id)),\n-\t\t.call = parse_sa_destroy,\n+\t\t\t\t\t    args.ia_destroy.action_id)),\n+\t\t.call = parse_ia_destroy,\n \t},\n-\t/* Shared action create arguments. */\n-\t[SHARED_ACTION_CREATE_ID] = {\n+\t/* Indirect action create arguments. */\n+\t[INDIRECT_ACTION_CREATE_ID] = {\n \t\t.name = \"action_id\",\n-\t\t.help = \"specify a shared action id to create\",\n-\t\t.next = NEXT(next_sa_create_attr,\n-\t\t\t     NEXT_ENTRY(SHARED_ACTION_ID)),\n+\t\t.help = \"specify a indirect action id to create\",\n+\t\t.next = NEXT(next_ia_create_attr,\n+\t\t\t     NEXT_ENTRY(INDIRECT_ACTION_ID)),\n \t\t.args = ARGS(ARGS_ENTRY(struct buffer, args.vc.attr.group)),\n \t},\n-\t[ACTION_SHARED] = {\n-\t\t.name = \"shared\",\n-\t\t.help = \"apply shared action by id\",\n-\t\t.priv = PRIV_ACTION(SHARED, 0),\n-\t\t.next = NEXT(NEXT_ENTRY(SHARED_ACTION_ID2PTR)),\n+\t[ACTION_INDIRECT] = {\n+\t\t.name = \"indirect\",\n+\t\t.help = \"apply indirect action by id\",\n+\t\t.priv = PRIV_ACTION(INDIRECT, 0),\n+\t\t.next = NEXT(NEXT_ENTRY(INDIRECT_ACTION_ID2PTR)),\n \t\t.args = ARGS(ARGS_ENTRY_ARB(0, sizeof(uint32_t))),\n \t\t.call = parse_vc,\n \t},\n-\t[SHARED_ACTION_ID2PTR] = {\n+\t[INDIRECT_ACTION_ID2PTR] = {\n \t\t.name = \"{action_id}\",\n-\t\t.type = \"SHARED_ACTION_ID\",\n-\t\t.help = \"shared action id\",\n+\t\t.type = \"INDIRECT_ACTION_ID\",\n+\t\t.help = \"indirect action id\",\n \t\t.next = NEXT(NEXT_ENTRY(ACTION_NEXT)),\n-\t\t.call = parse_sa_id2ptr,\n+\t\t.call = parse_ia_id2ptr,\n \t\t.comp = comp_none,\n \t},\n-\t[SHARED_ACTION_INGRESS] = {\n+\t[INDIRECT_ACTION_INGRESS] = {\n \t\t.name = \"ingress\",\n \t\t.help = \"affect rule to ingress\",\n-\t\t.next = NEXT(next_sa_create_attr),\n-\t\t.call = parse_sa,\n+\t\t.next = NEXT(next_ia_create_attr),\n+\t\t.call = parse_ia,\n \t},\n-\t[SHARED_ACTION_EGRESS] = {\n+\t[INDIRECT_ACTION_EGRESS] = {\n \t\t.name = \"egress\",\n \t\t.help = \"affect rule to egress\",\n-\t\t.next = NEXT(next_sa_create_attr),\n-\t\t.call = parse_sa,\n+\t\t.next = NEXT(next_ia_create_attr),\n+\t\t.call = parse_ia,\n \t},\n-\t[SHARED_ACTION_TRANSFER] = {\n+\t[INDIRECT_ACTION_TRANSFER] = {\n \t\t.name = \"transfer\",\n \t\t.help = \"affect rule to transfer\",\n-\t\t.next = NEXT(next_sa_create_attr),\n-\t\t.call = parse_sa,\n+\t\t.next = NEXT(next_ia_create_attr),\n+\t\t.call = parse_ia,\n \t},\n-\t[SHARED_ACTION_SPEC] = {\n+\t[INDIRECT_ACTION_SPEC] = {\n \t\t.name = \"action\",\n-\t\t.help = \"specify action to share\",\n+\t\t.help = \"specify action to create indirect handle\",\n \t\t.next = NEXT(next_action),\n \t},\n };\n@@ -4739,9 +4739,9 @@ parse_init(struct context *ctx, const struct token *token,\n \treturn len;\n }\n \n-/** Parse tokens for shared action commands. */\n+/** Parse tokens for indirect action commands. */\n static int\n-parse_sa(struct context *ctx, const struct token *token,\n+parse_ia(struct context *ctx, const struct token *token,\n \t const char *str, unsigned int len,\n \t void *buf, unsigned int size)\n {\n@@ -4754,7 +4754,7 @@ parse_sa(struct context *ctx, const struct token *token,\n \tif (!out)\n \t\treturn len;\n \tif (!out->command) {\n-\t\tif (ctx->curr != SHARED_ACTION)\n+\t\tif (ctx->curr != INDIRECT_ACTION)\n \t\t\treturn -1;\n \t\tif (sizeof(*out) > size)\n \t\t\treturn -1;\n@@ -4766,26 +4766,26 @@ parse_sa(struct context *ctx, const struct token *token,\n \t\treturn len;\n \t}\n \tswitch (ctx->curr) {\n-\tcase SHARED_ACTION_CREATE:\n-\tcase SHARED_ACTION_UPDATE:\n+\tcase INDIRECT_ACTION_CREATE:\n+\tcase INDIRECT_ACTION_UPDATE:\n \t\tout->args.vc.actions =\n \t\t\t(void *)RTE_ALIGN_CEIL((uintptr_t)(out + 1),\n \t\t\t\t\t       sizeof(double));\n \t\tout->args.vc.attr.group = UINT32_MAX;\n \t\t/* fallthrough */\n-\tcase SHARED_ACTION_QUERY:\n+\tcase INDIRECT_ACTION_QUERY:\n \t\tout->command = ctx->curr;\n \t\tctx->objdata = 0;\n \t\tctx->object = out;\n \t\tctx->objmask = NULL;\n \t\treturn len;\n-\tcase SHARED_ACTION_EGRESS:\n+\tcase INDIRECT_ACTION_EGRESS:\n \t\tout->args.vc.attr.egress = 1;\n \t\treturn len;\n-\tcase SHARED_ACTION_INGRESS:\n+\tcase INDIRECT_ACTION_INGRESS:\n \t\tout->args.vc.attr.ingress = 1;\n \t\treturn len;\n-\tcase SHARED_ACTION_TRANSFER:\n+\tcase INDIRECT_ACTION_TRANSFER:\n \t\tout->args.vc.attr.transfer = 1;\n \t\treturn len;\n \tdefault:\n@@ -4794,9 +4794,9 @@ parse_sa(struct context *ctx, const struct token *token,\n }\n \n \n-/** Parse tokens for shared action destroy command. */\n+/** Parse tokens for indirect action destroy command. */\n static int\n-parse_sa_destroy(struct context *ctx, const struct token *token,\n+parse_ia_destroy(struct context *ctx, const struct token *token,\n \t\t const char *str, unsigned int len,\n \t\t void *buf, unsigned int size)\n {\n@@ -4809,8 +4809,8 @@ parse_sa_destroy(struct context *ctx, const struct token *token,\n \t/* Nothing else to do if there is no buffer. */\n \tif (!out)\n \t\treturn len;\n-\tif (!out->command || out->command == SHARED_ACTION) {\n-\t\tif (ctx->curr != SHARED_ACTION_DESTROY)\n+\tif (!out->command || out->command == INDIRECT_ACTION) {\n+\t\tif (ctx->curr != INDIRECT_ACTION_DESTROY)\n \t\t\treturn -1;\n \t\tif (sizeof(*out) > size)\n \t\t\treturn -1;\n@@ -4818,13 +4818,13 @@ parse_sa_destroy(struct context *ctx, const struct token *token,\n \t\tctx->objdata = 0;\n \t\tctx->object = out;\n \t\tctx->objmask = NULL;\n-\t\tout->args.sa_destroy.action_id =\n+\t\tout->args.ia_destroy.action_id =\n \t\t\t(void *)RTE_ALIGN_CEIL((uintptr_t)(out + 1),\n \t\t\t\t\t       sizeof(double));\n \t\treturn len;\n \t}\n-\taction_id = out->args.sa_destroy.action_id\n-\t\t    + out->args.sa_destroy.action_id_n++;\n+\taction_id = out->args.ia_destroy.action_id\n+\t\t    + out->args.ia_destroy.action_id_n++;\n \tif ((uint8_t *)action_id > (uint8_t *)out + size)\n \t\treturn -1;\n \tctx->objdata = 0;\n@@ -7102,7 +7102,7 @@ parse_port(struct context *ctx, const struct token *token,\n }\n \n static int\n-parse_sa_id2ptr(struct context *ctx, const struct token *token,\n+parse_ia_id2ptr(struct context *ctx, const struct token *token,\n \t\tconst char *str, unsigned int len,\n \t\tvoid *buf, unsigned int size)\n {\n@@ -7119,9 +7119,9 @@ parse_sa_id2ptr(struct context *ctx, const struct token *token,\n \tctx->object = action;\n \tif (ret != (int)len)\n \t\treturn ret;\n-\t/* set shared action */\n+\t/* set indirect action */\n \tif (action) {\n-\t\taction->conf = port_shared_action_get_by_id(ctx->port, id);\n+\t\taction->conf = port_action_handle_get_by_id(ctx->port, id);\n \t\tret = (action->conf) ? ret : -1;\n \t}\n \treturn ret;\n@@ -7659,27 +7659,27 @@ static void\n cmd_flow_parsed(const struct buffer *in)\n {\n \tswitch (in->command) {\n-\tcase SHARED_ACTION_CREATE:\n-\t\tport_shared_action_create(\n+\tcase INDIRECT_ACTION_CREATE:\n+\t\tport_action_handle_create(\n \t\t\t\tin->port, in->args.vc.attr.group,\n-\t\t\t\t&((const struct rte_flow_shared_action_conf) {\n+\t\t\t\t&((const struct rte_flow_indir_action_conf) {\n \t\t\t\t\t.ingress = in->args.vc.attr.ingress,\n \t\t\t\t\t.egress = in->args.vc.attr.egress,\n \t\t\t\t\t.transfer = in->args.vc.attr.transfer,\n \t\t\t\t}),\n \t\t\t\tin->args.vc.actions);\n \t\tbreak;\n-\tcase SHARED_ACTION_DESTROY:\n-\t\tport_shared_action_destroy(in->port,\n-\t\t\t\t\t   in->args.sa_destroy.action_id_n,\n-\t\t\t\t\t   in->args.sa_destroy.action_id);\n+\tcase INDIRECT_ACTION_DESTROY:\n+\t\tport_action_handle_destroy(in->port,\n+\t\t\t\t\t   in->args.ia_destroy.action_id_n,\n+\t\t\t\t\t   in->args.ia_destroy.action_id);\n \t\tbreak;\n-\tcase SHARED_ACTION_UPDATE:\n-\t\tport_shared_action_update(in->port, in->args.vc.attr.group,\n+\tcase INDIRECT_ACTION_UPDATE:\n+\t\tport_action_handle_update(in->port, in->args.vc.attr.group,\n \t\t\t\t\t  in->args.vc.actions);\n \t\tbreak;\n-\tcase SHARED_ACTION_QUERY:\n-\t\tport_shared_action_query(in->port, in->args.sa.action_id);\n+\tcase INDIRECT_ACTION_QUERY:\n+\t\tport_action_handle_query(in->port, in->args.ia.action_id);\n \t\tbreak;\n \tcase VALIDATE:\n \t\tport_flow_validate(in->port, &in->args.vc.attr,\ndiff --git a/app/test-pmd/config.c b/app/test-pmd/config.c\nindex 40b2b29725..c219ef25f7 100644\n--- a/app/test-pmd/config.c\n+++ b/app/test-pmd/config.c\n@@ -1392,38 +1392,38 @@ rss_config_display(struct rte_flow_action_rss *rss_conf)\n \t}\n }\n \n-static struct port_shared_action *\n+static struct port_indirect_action *\n action_get_by_id(portid_t port_id, uint32_t id)\n {\n \tstruct rte_port *port;\n-\tstruct port_shared_action **ppsa;\n-\tstruct port_shared_action *psa = NULL;\n+\tstruct port_indirect_action **ppia;\n+\tstruct port_indirect_action *pia = NULL;\n \n \tif (port_id_is_invalid(port_id, ENABLED_WARN) ||\n \t    port_id == (portid_t)RTE_PORT_ALL)\n \t\treturn NULL;\n \tport = &ports[port_id];\n-\tppsa = &port->actions_list;\n-\twhile (*ppsa) {\n-\t\tif ((*ppsa)->id == id) {\n-\t\t\tpsa = *ppsa;\n+\tppia = &port->actions_list;\n+\twhile (*ppia) {\n+\t\tif ((*ppia)->id == id) {\n+\t\t\tpia = *ppia;\n \t\t\tbreak;\n \t\t}\n-\t\tppsa = &(*ppsa)->next;\n+\t\tppia = &(*ppia)->next;\n \t}\n-\tif (!psa)\n-\t\tprintf(\"Failed to find shared action #%u on port %u\\n\",\n+\tif (!pia)\n+\t\tprintf(\"Failed to find indirect action #%u on port %u\\n\",\n \t\t       id, port_id);\n-\treturn psa;\n+\treturn pia;\n }\n \n static int\n action_alloc(portid_t port_id, uint32_t id,\n-\t     struct port_shared_action **action)\n+\t     struct port_indirect_action **action)\n {\n \tstruct rte_port *port;\n-\tstruct port_shared_action **ppsa;\n-\tstruct port_shared_action *psa = NULL;\n+\tstruct port_indirect_action **ppia;\n+\tstruct port_indirect_action *pia = NULL;\n \n \t*action = NULL;\n \tif (port_id_is_invalid(port_id, ENABLED_WARN) ||\n@@ -1434,7 +1434,7 @@ action_alloc(portid_t port_id, uint32_t id,\n \t\t/* taking first available ID */\n \t\tif (port->actions_list) {\n \t\t\tif (port->actions_list->id == UINT32_MAX - 1) {\n-\t\t\t\tprintf(\"Highest shared action ID is already\"\n+\t\t\t\tprintf(\"Highest indirect action ID is already\"\n \t\t\t\t\" assigned, delete it first\\n\");\n \t\t\t\treturn -ENOMEM;\n \t\t\t}\n@@ -1443,70 +1443,70 @@ action_alloc(portid_t port_id, uint32_t id,\n \t\t\tid = 0;\n \t\t}\n \t}\n-\tpsa = calloc(1, sizeof(*psa));\n-\tif (!psa) {\n-\t\tprintf(\"Allocation of port %u shared action failed\\n\",\n+\tpia = calloc(1, sizeof(*pia));\n+\tif (!pia) {\n+\t\tprintf(\"Allocation of port %u indirect action failed\\n\",\n \t\t       port_id);\n \t\treturn -ENOMEM;\n \t}\n-\tppsa = &port->actions_list;\n-\twhile (*ppsa && (*ppsa)->id > id)\n-\t\tppsa = &(*ppsa)->next;\n-\tif (*ppsa && (*ppsa)->id == id) {\n-\t\tprintf(\"Shared action #%u is already assigned,\"\n+\tppia = &port->actions_list;\n+\twhile (*ppia && (*ppia)->id > id)\n+\t\tppia = &(*ppia)->next;\n+\tif (*ppia && (*ppia)->id == id) {\n+\t\tprintf(\"Indirect action #%u is already assigned,\"\n \t\t\t\" delete it first\\n\", id);\n-\t\tfree(psa);\n+\t\tfree(pia);\n \t\treturn -EINVAL;\n \t}\n-\tpsa->next = *ppsa;\n-\tpsa->id = id;\n-\t*ppsa = psa;\n-\t*action = psa;\n+\tpia->next = *ppia;\n+\tpia->id = id;\n+\t*ppia = pia;\n+\t*action = pia;\n \treturn 0;\n }\n \n-/** Create shared action */\n+/** Create indirect action */\n int\n-port_shared_action_create(portid_t port_id, uint32_t id,\n-\t\t\t  const struct rte_flow_shared_action_conf *conf,\n+port_action_handle_create(portid_t port_id, uint32_t id,\n+\t\t\t  const struct rte_flow_indir_action_conf *conf,\n \t\t\t  const struct rte_flow_action *action)\n {\n-\tstruct port_shared_action *psa;\n+\tstruct port_indirect_action *pia;\n \tint ret;\n \tstruct rte_flow_error error;\n \n-\tret = action_alloc(port_id, id, &psa);\n+\tret = action_alloc(port_id, id, &pia);\n \tif (ret)\n \t\treturn ret;\n \tif (action->type == RTE_FLOW_ACTION_TYPE_AGE) {\n \t\tstruct rte_flow_action_age *age =\n \t\t\t(struct rte_flow_action_age *)(uintptr_t)(action->conf);\n \n-\t\tpsa->age_type = ACTION_AGE_CONTEXT_TYPE_SHARED_ACTION;\n-\t\tage->context = &psa->age_type;\n+\t\tpia->age_type = ACTION_AGE_CONTEXT_TYPE_INDIRECT_ACTION;\n+\t\tage->context = &pia->age_type;\n \t}\n \t/* Poisoning to make sure PMDs update it in case of error. */\n \tmemset(&error, 0x22, sizeof(error));\n-\tpsa->action = rte_flow_shared_action_create(port_id, conf, action,\n+\tpia->handle = rte_flow_action_handle_create(port_id, conf, action,\n \t\t\t\t\t\t    &error);\n-\tif (!psa->action) {\n-\t\tuint32_t destroy_id = psa->id;\n-\t\tport_shared_action_destroy(port_id, 1, &destroy_id);\n+\tif (!pia->handle) {\n+\t\tuint32_t destroy_id = pia->id;\n+\t\tport_action_handle_destroy(port_id, 1, &destroy_id);\n \t\treturn port_flow_complain(&error);\n \t}\n-\tpsa->type = action->type;\n-\tprintf(\"Shared action #%u created\\n\", psa->id);\n+\tpia->type = action->type;\n+\tprintf(\"Indirect action #%u created\\n\", pia->id);\n \treturn 0;\n }\n \n-/** Destroy shared action */\n+/** Destroy indirect action */\n int\n-port_shared_action_destroy(portid_t port_id,\n+port_action_handle_destroy(portid_t port_id,\n \t\t\t   uint32_t n,\n \t\t\t   const uint32_t *actions)\n {\n \tstruct rte_port *port;\n-\tstruct port_shared_action **tmp;\n+\tstruct port_indirect_action **tmp;\n \tuint32_t c = 0;\n \tint ret = 0;\n \n@@ -1520,9 +1520,9 @@ port_shared_action_destroy(portid_t port_id,\n \n \t\tfor (i = 0; i != n; ++i) {\n \t\t\tstruct rte_flow_error error;\n-\t\t\tstruct port_shared_action *psa = *tmp;\n+\t\t\tstruct port_indirect_action *pia = *tmp;\n \n-\t\t\tif (actions[i] != psa->id)\n+\t\t\tif (actions[i] != pia->id)\n \t\t\t\tcontinue;\n \t\t\t/*\n \t\t\t * Poisoning to make sure PMDs update it in case\n@@ -1530,14 +1530,14 @@ port_shared_action_destroy(portid_t port_id,\n \t\t\t */\n \t\t\tmemset(&error, 0x33, sizeof(error));\n \n-\t\t\tif (psa->action && rte_flow_shared_action_destroy(\n-\t\t\t\t\tport_id, psa->action, &error)) {\n+\t\t\tif (pia->handle && rte_flow_action_handle_destroy(\n+\t\t\t\t\tport_id, pia->handle, &error)) {\n \t\t\t\tret = port_flow_complain(&error);\n \t\t\t\tcontinue;\n \t\t\t}\n-\t\t\t*tmp = psa->next;\n-\t\t\tprintf(\"Shared action #%u destroyed\\n\", psa->id);\n-\t\t\tfree(psa);\n+\t\t\t*tmp = pia->next;\n+\t\t\tprintf(\"Indirect action #%u destroyed\\n\", pia->id);\n+\t\t\tfree(pia);\n \t\t\tbreak;\n \t\t}\n \t\tif (i == n)\n@@ -1548,60 +1548,60 @@ port_shared_action_destroy(portid_t port_id,\n }\n \n \n-/** Get shared action by port + id */\n-struct rte_flow_shared_action *\n-port_shared_action_get_by_id(portid_t port_id, uint32_t id)\n+/** Get indirect action by port + id */\n+struct rte_flow_action_handle *\n+port_action_handle_get_by_id(portid_t port_id, uint32_t id)\n {\n \n-\tstruct port_shared_action *psa = action_get_by_id(port_id, id);\n+\tstruct port_indirect_action *pia = action_get_by_id(port_id, id);\n \n-\treturn (psa) ? psa->action : NULL;\n+\treturn (pia) ? pia->handle : NULL;\n }\n \n-/** Update shared action */\n+/** Update indirect action */\n int\n-port_shared_action_update(portid_t port_id, uint32_t id,\n+port_action_handle_update(portid_t port_id, uint32_t id,\n \t\t\t  const struct rte_flow_action *action)\n {\n \tstruct rte_flow_error error;\n-\tstruct rte_flow_shared_action *shared_action;\n+\tstruct rte_flow_action_handle *action_handle;\n \n-\tshared_action = port_shared_action_get_by_id(port_id, id);\n-\tif (!shared_action)\n+\taction_handle = port_action_handle_get_by_id(port_id, id);\n+\tif (!action_handle)\n \t\treturn -EINVAL;\n-\tif (rte_flow_shared_action_update(port_id, shared_action, action,\n+\tif (rte_flow_action_handle_update(port_id, action_handle, action,\n \t\t\t\t\t  &error)) {\n \t\treturn port_flow_complain(&error);\n \t}\n-\tprintf(\"Shared action #%u updated\\n\", id);\n+\tprintf(\"Indirect action #%u updated\\n\", id);\n \treturn 0;\n }\n \n int\n-port_shared_action_query(portid_t port_id, uint32_t id)\n+port_action_handle_query(portid_t port_id, uint32_t id)\n {\n \tstruct rte_flow_error error;\n-\tstruct port_shared_action *psa;\n+\tstruct port_indirect_action *pia;\n \tuint64_t default_data;\n \tvoid *data = NULL;\n \tint ret = 0;\n \n-\tpsa = action_get_by_id(port_id, id);\n-\tif (!psa)\n+\tpia = action_get_by_id(port_id, id);\n+\tif (!pia)\n \t\treturn -EINVAL;\n-\tswitch (psa->type) {\n+\tswitch (pia->type) {\n \tcase RTE_FLOW_ACTION_TYPE_RSS:\n \tcase RTE_FLOW_ACTION_TYPE_AGE:\n \t\tdata = &default_data;\n \t\tbreak;\n \tdefault:\n-\t\tprintf(\"Shared action %u (type: %d) on port %u doesn't support\"\n-\t\t       \" query\\n\", id, psa->type, port_id);\n+\t\tprintf(\"Indirect action %u (type: %d) on port %u doesn't\"\n+\t\t       \" support query\\n\", id, pia->type, port_id);\n \t\treturn -1;\n \t}\n-\tif (rte_flow_shared_action_query(port_id, psa->action, data, &error))\n+\tif (rte_flow_action_handle_query(port_id, pia->handle, data, &error))\n \t\tret = port_flow_complain(&error);\n-\tswitch (psa->type) {\n+\tswitch (pia->type) {\n \tcase RTE_FLOW_ACTION_TYPE_RSS:\n \t\tif (!ret)\n \t\t\tprintf(\"Shared RSS action:\\n\\trefs:%u\\n\",\n@@ -1623,8 +1623,8 @@ port_shared_action_query(portid_t port_id, uint32_t id)\n \t\tdata = NULL;\n \t\tbreak;\n \tdefault:\n-\t\tprintf(\"Shared action %u (type: %d) on port %u doesn't support\"\n-\t\t       \" query\\n\", id, psa->type, port_id);\n+\t\tprintf(\"Indirect action %u (type: %d) on port %u doesn't\"\n+\t\t       \" support query\\n\", id, pia->type, port_id);\n \t\tret = -1;\n \t}\n \treturn ret;\n@@ -2066,7 +2066,7 @@ port_flow_aged(portid_t port_id, uint8_t destroy)\n \tenum age_action_context_type *type;\n \tunion {\n \t\tstruct port_flow *pf;\n-\t\tstruct port_shared_action *psa;\n+\t\tstruct port_indirect_action *pia;\n \t} ctx;\n \n \tif (port_id_is_invalid(port_id, ENABLED_WARN) ||\n@@ -2116,11 +2116,11 @@ port_flow_aged(portid_t port_id, uint8_t destroy)\n \t\t\t\t\t\t\t  &ctx.pf->id))\n \t\t\t\ttotal++;\n \t\t\tbreak;\n-\t\tcase ACTION_AGE_CONTEXT_TYPE_SHARED_ACTION:\n-\t\t\tctx.psa = container_of(type, struct port_shared_action,\n-\t\t\t\t\t       age_type);\n-\t\t\tprintf(\"%-20s\\t%\" PRIu32 \"\\n\", \"Shared action\",\n-\t\t\t       ctx.psa->id);\n+\t\tcase ACTION_AGE_CONTEXT_TYPE_INDIRECT_ACTION:\n+\t\t\tctx.pia = container_of(type,\n+\t\t\t\t\tstruct port_indirect_action, age_type);\n+\t\t\tprintf(\"%-20s\\t%\" PRIu32 \"\\n\", \"Indirect action\",\n+\t\t\t       ctx.pia->id);\n \t\t\tbreak;\n \t\tdefault:\n \t\t\tprintf(\"Error: invalid context type %u\\n\", port_id);\ndiff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h\nindex 36d8535d0c..c314b30f2e 100644\n--- a/app/test-pmd/testpmd.h\n+++ b/app/test-pmd/testpmd.h\n@@ -151,7 +151,7 @@ struct fwd_stream {\n  */\n enum age_action_context_type {\n \tACTION_AGE_CONTEXT_TYPE_FLOW,\n-\tACTION_AGE_CONTEXT_TYPE_SHARED_ACTION,\n+\tACTION_AGE_CONTEXT_TYPE_INDIRECT_ACTION,\n };\n \n /** Descriptor for a single flow. */\n@@ -165,12 +165,12 @@ struct port_flow {\n \tuint8_t data[]; /**< Storage for flow rule description */\n };\n \n-/* Descriptor for shared action */\n-struct port_shared_action {\n-\tstruct port_shared_action *next; /**< Next flow in list. */\n-\tuint32_t id; /**< Shared action ID. */\n+/* Descriptor for indirect action */\n+struct port_indirect_action {\n+\tstruct port_indirect_action *next; /**< Next flow in list. */\n+\tuint32_t id; /**< Indirect action ID. */\n \tenum rte_flow_action_type type; /**< Action type. */\n-\tstruct rte_flow_shared_action *action;\t/**< Shared action handle. */\n+\tstruct rte_flow_action_handle *handle;\t/**< Indirect action handle. */\n \tenum age_action_context_type age_type; /**< Age action context type. */\n };\n \n@@ -222,8 +222,8 @@ struct rte_port {\n \tuint32_t                mc_addr_nb; /**< nb. of addr. in mc_addr_pool */\n \tuint8_t                 slave_flag; /**< bonding slave port */\n \tstruct port_flow        *flow_list; /**< Associated flows. */\n-\tstruct port_shared_action *actions_list;\n-\t/**< Associated shared actions. */\n+\tstruct port_indirect_action *actions_list;\n+\t/**< Associated indirect actions. */\n \tLIST_HEAD(, port_flow_tunnel) flow_tunnel_list;\n \tconst struct rte_eth_rxtx_callback *rx_dump_cb[RTE_MAX_QUEUES_PER_PORT+1];\n \tconst struct rte_eth_rxtx_callback *tx_dump_cb[RTE_MAX_QUEUES_PER_PORT+1];\n@@ -801,14 +801,14 @@ void port_reg_bit_field_set(portid_t port_id, uint32_t reg_off,\n \t\t\t    uint8_t bit1_pos, uint8_t bit2_pos, uint32_t value);\n void port_reg_display(portid_t port_id, uint32_t reg_off);\n void port_reg_set(portid_t port_id, uint32_t reg_off, uint32_t value);\n-int port_shared_action_create(portid_t port_id, uint32_t id,\n-\t\t\t      const struct rte_flow_shared_action_conf *conf,\n+int port_action_handle_create(portid_t port_id, uint32_t id,\n+\t\t\t      const struct rte_flow_indir_action_conf *conf,\n \t\t\t      const struct rte_flow_action *action);\n-int port_shared_action_destroy(portid_t port_id,\n+int port_action_handle_destroy(portid_t port_id,\n \t\t\t       uint32_t n, const uint32_t *action);\n-struct rte_flow_shared_action *port_shared_action_get_by_id(portid_t port_id,\n+struct rte_flow_action_handle *port_action_handle_get_by_id(portid_t port_id,\n \t\t\t\t\t\t\t    uint32_t id);\n-int port_shared_action_update(portid_t port_id, uint32_t id,\n+int port_action_handle_update(portid_t port_id, uint32_t id,\n \t\t\t      const struct rte_flow_action *action);\n int port_flow_validate(portid_t port_id,\n \t\t       const struct rte_flow_attr *attr,\n@@ -820,7 +820,7 @@ int port_flow_create(portid_t port_id,\n \t\t     const struct rte_flow_item *pattern,\n \t\t     const struct rte_flow_action *actions,\n \t\t     const struct tunnel_ops *tunnel_ops);\n-int port_shared_action_query(portid_t port_id, uint32_t id);\n+int port_action_handle_query(portid_t port_id, uint32_t id);\n void update_age_action_context(const struct rte_flow_action *actions,\n \t\t     struct port_flow *pf);\n int port_flow_destroy(portid_t port_id, uint32_t n, const uint32_t *rule);\ndiff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst\nindex e1b93ecedf..4b54588995 100644\n--- a/doc/guides/prog_guide/rte_flow.rst\n+++ b/doc/guides/prog_guide/rte_flow.rst\n@@ -1719,7 +1719,7 @@ that counter.\n For ports within the same switch domain then the counter id namespace extends\n to all ports within that switch domain.\n \n-The shared flag is DEPRECATED and ``SHARED`` ``COUNT`` action should be used\n+The shared flag is DEPRECATED and ``INDIRECT`` ``COUNT`` action should be used\n to make shared counters.\n \n .. _table_rte_flow_action_count:\n@@ -2742,25 +2742,26 @@ packets, and must have a fate action.\n    | ``actions``  | sub-action list for sampling    |\n    +--------------+---------------------------------+\n \n-Action: ``SHARED``\n-^^^^^^^^^^^^^^^^^^\n+Action: ``INDIRECT``\n+^^^^^^^^^^^^^^^^^^^^\n \n-Flow utilize shared action by handle as returned from\n-``rte_flow_shared_action_create()``.\n+Flow utilize indirect action by handle as returned from\n+``rte_flow_action_handle_create()``.\n \n-The behaviour of the shared action defined by ``action`` argument of type\n-``struct rte_flow_action`` passed to ``rte_flow_shared_action_create()``.\n+The behaviour of the indirect action defined by ``action`` argument of type\n+``struct rte_flow_action`` passed to ``rte_flow_action_handle_create()``.\n \n-Multiple flows can use the same shared action.\n-The shared action can be in-place updated by ``rte_flow_shared_action_update()``\n-without destroying flow and creating flow again.\n+The indirect action can be used by a single flow or shared among multiple flows.\n+The indirect action can be in-place updated by ``rte_flow_action_handle_update()``\n+without destroying flow and creating flow again. The fields that could be\n+updated depend on the type of the ``action`` and different for every type.\n \n-The shared action specified data (e.g. counter) can be queried by\n-``rte_flow_shared_action_query()``.\n+The indirect action specified data (e.g. counter) can be queried by\n+``rte_flow_action_handle_query()``.\n \n-.. _table_rte_flow_shared_action:\n+.. _table_rte_flow_action_handle:\n \n-.. table:: SHARED\n+.. table:: INDIRECT\n \n    +---------------+\n    | Field         |\ndiff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst\nindex 82ee71152f..e6f99350af 100644\n--- a/doc/guides/rel_notes/release_21_05.rst\n+++ b/doc/guides/rel_notes/release_21_05.rst\n@@ -234,6 +234,9 @@ API Changes\n * pci: The value ``PCI_ANY_ID`` is marked as deprecated\n   and can be replaced with ``RTE_PCI_ANY_ID``.\n \n+* ethdev: The experimental shared action APIs in ``rte_flow.h`` has been\n+  replaced from ``rte_flow_shared_action_*`` to indirect action APIs named\n+  ``rte_flow_action_handle_*``.\n \n ABI Changes\n -----------\ndiff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst\nindex e3bfed566d..3397a61074 100644\n--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst\n+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst\n@@ -4057,10 +4057,10 @@ This section lists supported actions and their attributes, if any.\n \n   - ``dscp_value {unsigned}``: The new DSCP value to be set\n \n-- ``shared``: Use shared action created via\n-  ``flow shared_action {port_id} create``\n+- ``indirect``: Use indirect action created via\n+  ``flow indirect_action {port_id} create``\n \n-  - ``shared_action_id {unsigned}``: Shared action ID to use\n+  - ``indirect_action_id {unsigned}``: Indirect action ID to use\n \n Destroying flow rules\n ~~~~~~~~~~~~~~~~~~~~~\n@@ -4351,113 +4351,113 @@ If attach ``destroy`` parameter, the command will destroy all the list aged flow\n    testpmd> flow aged 0\n    Port 0 total aged flows: 0\n \n-Creating shared actions\n-~~~~~~~~~~~~~~~~~~~~~~~\n-``flow shared_action {port_id} create`` creates shared action with optional\n-shared action ID. It is bound to ``rte_flow_shared_action_create()``::\n+Creating indirect actions\n+~~~~~~~~~~~~~~~~~~~~~~~~~\n+``flow indirect_action {port_id} create`` creates indirect action with optional\n+indirect action ID. It is bound to ``rte_flow_action_handle_create()``::\n \n-   flow shared_action {port_id} create [action_id {shared_action_id}]\n+   flow indirect_action {port_id} create [action_id {indirect_action_id}]\n       [ingress] [egress] [transfer] action {action} / end\n \n If successful, it will show::\n \n-   Shared action #[...] created\n+   Indirect action #[...] created\n \n-Otherwise, it will complain either that shared action already exists or that\n+Otherwise, it will complain either that indirect action already exists or that\n some error occurred::\n \n-   Shared action #[...] is already assigned, delete it first\n+   Indirect action #[...] is already assigned, delete it first\n \n ::\n \n    Caught error type [...] ([...]): [...]\n \n-Create shared rss action with id 100 to queues 1 and 2 on port 0::\n+Create indirect rss action with id 100 to queues 1 and 2 on port 0::\n \n-   testpmd> flow shared_action 0 create action_id 100 \\\n+   testpmd> flow indirect_action 0 create action_id 100 \\\n       ingress action rss queues 1 2 end / end\n \n-Create shared rss action with id assigned by testpmd to queues 1 and 2 on\n+Create indirect rss action with id assigned by testpmd to queues 1 and 2 on\n port 0::\n \n-\ttestpmd> flow shared_action 0 create action_id \\\n+\ttestpmd> flow indirect_action 0 create action_id \\\n \t\tingress action rss queues 0 1 end / end\n \n-Updating shared actions\n-~~~~~~~~~~~~~~~~~~~~~~~\n-``flow shared_action {port_id} update`` updates configuration of the shared\n-action from its shared action ID (as returned by\n-``flow shared_action {port_id} create``). It is bound to\n-``rte_flow_shared_action_update()``::\n+Updating indirect actions\n+~~~~~~~~~~~~~~~~~~~~~~~~~\n+``flow indirect_action {port_id} update`` updates configuration of the indirect\n+action from its indirect action ID (as returned by\n+``flow indirect_action {port_id} create``). It is bound to\n+``rte_flow_action_handle_update()``::\n \n-   flow shared_action {port_id} update {shared_action_id}\n+   flow indirect_action {port_id} update {indirect_action_id}\n       action {action} / end\n \n If successful, it will show::\n \n-   Shared action #[...] updated\n+   Indirect action #[...] updated\n \n-Otherwise, it will complain either that shared action not found or that some\n+Otherwise, it will complain either that indirect action not found or that some\n error occurred::\n \n-   Failed to find shared action #[...] on port [...]\n+   Failed to find indirect action #[...] on port [...]\n \n ::\n \n    Caught error type [...] ([...]): [...]\n \n-Update shared rss action having id 100 on port 0 with rss to queues 0 and 3\n+Update indirect rss action having id 100 on port 0 with rss to queues 0 and 3\n (in create example above rss queues were 1 and 2)::\n \n-   testpmd> flow shared_action 0 update 100 action rss queues 0 3 end / end\n+   testpmd> flow indirect_action 0 update 100 action rss queues 0 3 end / end\n \n-Destroying shared actions\n-~~~~~~~~~~~~~~~~~~~~~~~~~\n-``flow shared_action {port_id} update`` destroys one or more shared actions\n-from their shared action IDs (as returned by\n-``flow shared_action {port_id} create``). It is bound to\n-``rte_flow_shared_action_destroy()``::\n+Destroying indirect actions\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+``flow indirect_action {port_id} destroy`` destroys one or more indirect actions\n+from their indirect action IDs (as returned by\n+``flow indirect_action {port_id} create``). It is bound to\n+``rte_flow_action_handle_destroy()``::\n \n-   flow shared_action {port_id} destroy action_id {shared_action_id} [...]\n+   flow indirect_action {port_id} destroy action_id {indirect_action_id} [...]\n \n If successful, it will show::\n \n-   Shared action #[...] destroyed\n+   Indirect action #[...] destroyed\n \n-It does not report anything for shared action IDs that do not exist.\n-The usual error message is shown when a shared action cannot be destroyed::\n+It does not report anything for indirect action IDs that do not exist.\n+The usual error message is shown when a indirect action cannot be destroyed::\n \n    Caught error type [...] ([...]): [...]\n \n-Destroy shared actions having id 100 & 101::\n+Destroy indirect actions having id 100 & 101::\n \n-   testpmd> flow shared_action 0 destroy action_id 100 action_id 101\n+   testpmd> flow indirect_action 0 destroy action_id 100 action_id 101\n \n-Query shared actions\n-~~~~~~~~~~~~~~~~~~~~\n-``flow shared_action {port_id} query`` queries the shared action from its\n-shared action ID (as returned by ``flow shared_action {port_id} create``).\n-It is bound to ``rte_flow_shared_action_query()``::\n+Query indirect actions\n+~~~~~~~~~~~~~~~~~~~~~~\n+``flow indirect_action {port_id} query`` queries the indirect action from its\n+indirect action ID (as returned by ``flow indirect_action {port_id} create``).\n+It is bound to ``rte_flow_action_handle_query()``::\n \n-  flow shared_action {port_id} query {shared_action_id}\n+  flow indirect_action {port_id} query {indirect_action_id}\n \n-Currently only rss shared action supported. If successful, it will show::\n+Currently only rss indirect action supported. If successful, it will show::\n \n-   Shared RSS action:\n+   Indirect RSS action:\n       refs:[...]\n \n-Otherwise, it will complain either that shared action not found or that some\n+Otherwise, it will complain either that indirect action not found or that some\n error occurred::\n \n-   Failed to find shared action #[...] on port [...]\n+   Failed to find indirect action #[...] on port [...]\n \n ::\n \n    Caught error type [...] ([...]): [...]\n \n-Query shared action having id 100::\n+Query indirect action having id 100::\n \n-   testpmd> flow shared_action 0 query 100\n+   testpmd> flow indirect_action 0 query 100\n \n Sample QinQ flow rules\n ~~~~~~~~~~~~~~~~~~~~~~\ndiff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c\nindex 02cc2c781e..3bf224c559 100644\n--- a/drivers/net/mlx5/mlx5.c\n+++ b/drivers/net/mlx5/mlx5.c\n@@ -1341,7 +1341,7 @@ mlx5_dev_close(struct rte_eth_dev *dev)\n \t * then this will return directly without any action.\n \t */\n \tmlx5_flow_list_flush(dev, &priv->flows, true);\n-\tmlx5_shared_action_flush(dev);\n+\tmlx5_action_handle_flush(dev);\n \tmlx5_flow_meter_flush(dev, NULL);\n \t/* Prevent crashes when queues are still in use. */\n \tdev->rx_pkt_burst = removed_rx_burst;\ndiff --git a/drivers/net/mlx5/mlx5_defs.h b/drivers/net/mlx5/mlx5_defs.h\nindex 8f2807dcd9..6e9c4b9cdd 100644\n--- a/drivers/net/mlx5/mlx5_defs.h\n+++ b/drivers/net/mlx5/mlx5_defs.h\n@@ -192,8 +192,8 @@\n #define MLX5_HAIRPIN_QUEUE_STRIDE 6\n #define MLX5_HAIRPIN_JUMBO_LOG_SIZE (14 + 2)\n \n-/* Maximum number of shared actions supported by rte_flow */\n-#define MLX5_MAX_SHARED_ACTIONS 2\n+/* Maximum number of indirect actions supported by rte_flow */\n+#define MLX5_MAX_INDIRECT_ACTIONS 2\n \n /*\n  * Linux definition of static_assert is found in /usr/include/assert.h.\ndiff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c\nindex 84463074a5..68e1ffda9c 100644\n--- a/drivers/net/mlx5/mlx5_flow.c\n+++ b/drivers/net/mlx5/mlx5_flow.c\n@@ -568,23 +568,23 @@ static const struct mlx5_flow_expand_node mlx5_support_expansion[] = {\n \t},\n };\n \n-static struct rte_flow_shared_action *\n-mlx5_shared_action_create(struct rte_eth_dev *dev,\n-\t\t\t  const struct rte_flow_shared_action_conf *conf,\n+static struct rte_flow_action_handle *\n+mlx5_action_handle_create(struct rte_eth_dev *dev,\n+\t\t\t  const struct rte_flow_indir_action_conf *conf,\n \t\t\t  const struct rte_flow_action *action,\n \t\t\t  struct rte_flow_error *error);\n-static int mlx5_shared_action_destroy\n+static int mlx5_action_handle_destroy\n \t\t\t\t(struct rte_eth_dev *dev,\n-\t\t\t\t struct rte_flow_shared_action *shared_action,\n+\t\t\t\t struct rte_flow_action_handle *handle,\n \t\t\t\t struct rte_flow_error *error);\n-static int mlx5_shared_action_update\n+static int mlx5_action_handle_update\n \t\t\t\t(struct rte_eth_dev *dev,\n-\t\t\t\t struct rte_flow_shared_action *shared_action,\n-\t\t\t\t const struct rte_flow_action *action,\n+\t\t\t\t struct rte_flow_action_handle *handle,\n+\t\t\t\t const void *update,\n \t\t\t\t struct rte_flow_error *error);\n-static int mlx5_shared_action_query\n+static int mlx5_action_handle_query\n \t\t\t\t(struct rte_eth_dev *dev,\n-\t\t\t\t const struct rte_flow_shared_action *action,\n+\t\t\t\t const struct rte_flow_action_handle *handle,\n \t\t\t\t void *data,\n \t\t\t\t struct rte_flow_error *error);\n static int\n@@ -623,10 +623,10 @@ static const struct rte_flow_ops mlx5_flow_ops = {\n \t.query = mlx5_flow_query,\n \t.dev_dump = mlx5_flow_dev_dump,\n \t.get_aged_flows = mlx5_flow_get_aged_flows,\n-\t.shared_action_create = mlx5_shared_action_create,\n-\t.shared_action_destroy = mlx5_shared_action_destroy,\n-\t.shared_action_update = mlx5_shared_action_update,\n-\t.shared_action_query = mlx5_shared_action_query,\n+\t.action_handle_create = mlx5_action_handle_create,\n+\t.action_handle_destroy = mlx5_action_handle_destroy,\n+\t.action_handle_update = mlx5_action_handle_update,\n+\t.action_handle_query = mlx5_action_handle_query,\n \t.tunnel_decap_set = mlx5_flow_tunnel_decap_set,\n \t.tunnel_match = mlx5_flow_tunnel_match,\n \t.tunnel_action_decap_release = mlx5_flow_tunnel_action_release,\n@@ -3402,31 +3402,31 @@ flow_aso_age_get_by_idx(struct rte_eth_dev *dev, uint32_t age_idx)\n \treturn &pool->actions[offset - 1];\n }\n \n-/* maps shared action to translated non shared in some actions array */\n-struct mlx5_translated_shared_action {\n-\tstruct rte_flow_shared_action *action; /**< Shared action */\n-\tint index; /**< Index in related array of rte_flow_action */\n+/* maps indirect action to translated direct in some actions array */\n+struct mlx5_translated_action_handle {\n+\tstruct rte_flow_action_handle *action; /**< Indirect action handle. */\n+\tint index; /**< Index in related array of rte_flow_action. */\n };\n \n /**\n- * Translates actions of type RTE_FLOW_ACTION_TYPE_SHARED to related\n- * non shared action if translation possible.\n- * This functionality used to run same execution path for both shared & non\n- * shared actions on flow create. All necessary preparations for shared\n- * action handling should be preformed on *shared* actions list returned\n+ * Translates actions of type RTE_FLOW_ACTION_TYPE_INDIRECT to related\n+ * direct action if translation possible.\n+ * This functionality used to run same execution path for both direct and\n+ * indirect actions on flow create. All necessary preparations for indirect\n+ * action handling should be performed on *handle* actions list returned\n  * from this call.\n  *\n  * @param[in] dev\n  *   Pointer to Ethernet device.\n  * @param[in] actions\n  *   List of actions to translate.\n- * @param[out] shared\n- *   List to store translated shared actions.\n- * @param[in, out] shared_n\n- *   Size of *shared* array. On return should be updated with number of shared\n- *   actions retrieved from the *actions* list.\n+ * @param[out] handle\n+ *   List to store translated indirect action object handles.\n+ * @param[in, out] indir_n\n+ *   Size of *handle* array. On return should be updated with number of\n+ *   indirect actions retrieved from the *actions* list.\n  * @param[out] translated_actions\n- *   List of actions where all shared actions were translated to non shared\n+ *   List of actions where all indirect actions were translated to direct\n  *   if possible. NULL if no translation took place.\n  * @param[out] error\n  *   Pointer to the error structure.\n@@ -3435,10 +3435,10 @@ struct mlx5_translated_shared_action {\n  *   0 on success, a negative errno value otherwise and rte_errno is set.\n  */\n static int\n-flow_shared_actions_translate(struct rte_eth_dev *dev,\n+flow_action_handles_translate(struct rte_eth_dev *dev,\n \t\t\t      const struct rte_flow_action actions[],\n-\t\t\t      struct mlx5_translated_shared_action *shared,\n-\t\t\t      int *shared_n,\n+\t\t\t      struct mlx5_translated_action_handle *handle,\n+\t\t\t      int *indir_n,\n \t\t\t      struct rte_flow_action **translated_actions,\n \t\t\t      struct rte_flow_error *error)\n {\n@@ -3447,23 +3447,23 @@ flow_shared_actions_translate(struct rte_eth_dev *dev,\n \tsize_t actions_size;\n \tint n;\n \tint copied_n = 0;\n-\tstruct mlx5_translated_shared_action *shared_end = NULL;\n+\tstruct mlx5_translated_action_handle *handle_end = NULL;\n \n \tfor (n = 0; actions[n].type != RTE_FLOW_ACTION_TYPE_END; n++) {\n-\t\tif (actions[n].type != RTE_FLOW_ACTION_TYPE_SHARED)\n+\t\tif (actions[n].type != RTE_FLOW_ACTION_TYPE_INDIRECT)\n \t\t\tcontinue;\n-\t\tif (copied_n == *shared_n) {\n+\t\tif (copied_n == *indir_n) {\n \t\t\treturn rte_flow_error_set\n \t\t\t\t(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION_NUM,\n \t\t\t\t NULL, \"too many shared actions\");\n \t\t}\n-\t\trte_memcpy(&shared[copied_n].action, &actions[n].conf,\n+\t\trte_memcpy(&handle[copied_n].action, &actions[n].conf,\n \t\t\t   sizeof(actions[n].conf));\n-\t\tshared[copied_n].index = n;\n+\t\thandle[copied_n].index = n;\n \t\tcopied_n++;\n \t}\n \tn++;\n-\t*shared_n = copied_n;\n+\t*indir_n = copied_n;\n \tif (!copied_n)\n \t\treturn 0;\n \tactions_size = sizeof(struct rte_flow_action) * n;\n@@ -3473,28 +3473,28 @@ flow_shared_actions_translate(struct rte_eth_dev *dev,\n \t\treturn -ENOMEM;\n \t}\n \tmemcpy(translated, actions, actions_size);\n-\tfor (shared_end = shared + copied_n; shared < shared_end; shared++) {\n+\tfor (handle_end = handle + copied_n; handle < handle_end; handle++) {\n \t\tstruct mlx5_shared_action_rss *shared_rss;\n-\t\tuint32_t act_idx = (uint32_t)(uintptr_t)shared->action;\n-\t\tuint32_t type = act_idx >> MLX5_SHARED_ACTION_TYPE_OFFSET;\n-\t\tuint32_t idx = act_idx & ((1u << MLX5_SHARED_ACTION_TYPE_OFFSET)\n-\t\t\t\t\t\t\t\t\t   - 1);\n+\t\tuint32_t act_idx = (uint32_t)(uintptr_t)handle->action;\n+\t\tuint32_t type = act_idx >> MLX5_INDIRECT_ACTION_TYPE_OFFSET;\n+\t\tuint32_t idx = act_idx &\n+\t\t\t       ((1u << MLX5_INDIRECT_ACTION_TYPE_OFFSET) - 1);\n \n \t\tswitch (type) {\n-\t\tcase MLX5_SHARED_ACTION_TYPE_RSS:\n+\t\tcase MLX5_INDIRECT_ACTION_TYPE_RSS:\n \t\t\tshared_rss = mlx5_ipool_get\n \t\t\t  (priv->sh->ipool[MLX5_IPOOL_RSS_SHARED_ACTIONS], idx);\n-\t\t\ttranslated[shared->index].type =\n+\t\t\ttranslated[handle->index].type =\n \t\t\t\tRTE_FLOW_ACTION_TYPE_RSS;\n-\t\t\ttranslated[shared->index].conf =\n+\t\t\ttranslated[handle->index].conf =\n \t\t\t\t&shared_rss->origin;\n \t\t\tbreak;\n-\t\tcase MLX5_SHARED_ACTION_TYPE_AGE:\n+\t\tcase MLX5_INDIRECT_ACTION_TYPE_AGE:\n \t\t\tif (priv->sh->flow_hit_aso_en) {\n-\t\t\t\ttranslated[shared->index].type =\n+\t\t\t\ttranslated[handle->index].type =\n \t\t\t\t\t(enum rte_flow_action_type)\n \t\t\t\t\tMLX5_RTE_FLOW_ACTION_TYPE_AGE;\n-\t\t\t\ttranslated[shared->index].conf =\n+\t\t\t\ttranslated[handle->index].conf =\n \t\t\t\t\t\t\t (void *)(uintptr_t)idx;\n \t\t\t\tbreak;\n \t\t\t}\n@@ -3503,7 +3503,7 @@ flow_shared_actions_translate(struct rte_eth_dev *dev,\n \t\t\tmlx5_free(translated);\n \t\t\treturn rte_flow_error_set\n \t\t\t\t(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION,\n-\t\t\t\t NULL, \"invalid shared action type\");\n+\t\t\t\t NULL, \"invalid indirect action type\");\n \t\t}\n \t}\n \t*translated_actions = translated;\n@@ -3525,21 +3525,21 @@ flow_shared_actions_translate(struct rte_eth_dev *dev,\n  */\n static uint32_t\n flow_get_shared_rss_action(struct rte_eth_dev *dev,\n-\t\t\t   struct mlx5_translated_shared_action *shared,\n+\t\t\t   struct mlx5_translated_action_handle *handle,\n \t\t\t   int shared_n)\n {\n-\tstruct mlx5_translated_shared_action *shared_end;\n+\tstruct mlx5_translated_action_handle *handle_end;\n \tstruct mlx5_priv *priv = dev->data->dev_private;\n \tstruct mlx5_shared_action_rss *shared_rss;\n \n \n-\tfor (shared_end = shared + shared_n; shared < shared_end; shared++) {\n-\t\tuint32_t act_idx = (uint32_t)(uintptr_t)shared->action;\n-\t\tuint32_t type = act_idx >> MLX5_SHARED_ACTION_TYPE_OFFSET;\n+\tfor (handle_end = handle + shared_n; handle < handle_end; handle++) {\n+\t\tuint32_t act_idx = (uint32_t)(uintptr_t)handle->action;\n+\t\tuint32_t type = act_idx >> MLX5_INDIRECT_ACTION_TYPE_OFFSET;\n \t\tuint32_t idx = act_idx &\n-\t\t\t\t   ((1u << MLX5_SHARED_ACTION_TYPE_OFFSET) - 1);\n+\t\t\t       ((1u << MLX5_INDIRECT_ACTION_TYPE_OFFSET) - 1);\n \t\tswitch (type) {\n-\t\tcase MLX5_SHARED_ACTION_TYPE_RSS:\n+\t\tcase MLX5_INDIRECT_ACTION_TYPE_RSS:\n \t\t\tshared_rss = mlx5_ipool_get\n \t\t\t\t(priv->sh->ipool[MLX5_IPOOL_RSS_SHARED_ACTIONS],\n \t\t\t\t\t\t\t\t\t   idx);\n@@ -5549,9 +5549,9 @@ flow_list_create(struct rte_eth_dev *dev, uint32_t *list,\n \tstruct rte_flow *flow = NULL;\n \tstruct mlx5_flow *dev_flow;\n \tconst struct rte_flow_action_rss *rss = NULL;\n-\tstruct mlx5_translated_shared_action\n-\t\tshared_actions[MLX5_MAX_SHARED_ACTIONS];\n-\tint shared_actions_n = MLX5_MAX_SHARED_ACTIONS;\n+\tstruct mlx5_translated_action_handle\n+\t\tindir_actions[MLX5_MAX_INDIRECT_ACTIONS];\n+\tint indir_actions_n = MLX5_MAX_INDIRECT_ACTIONS;\n \tunion {\n \t\tstruct mlx5_flow_expand_rss buf;\n \t\tuint8_t buffer[2048];\n@@ -5591,9 +5591,9 @@ flow_list_create(struct rte_eth_dev *dev, uint32_t *list,\n \n \tMLX5_ASSERT(wks);\n \trss_desc = &wks->rss_desc;\n-\tret = flow_shared_actions_translate(dev, original_actions,\n-\t\t\t\t\t    shared_actions,\n-\t\t\t\t\t    &shared_actions_n,\n+\tret = flow_action_handles_translate(dev, original_actions,\n+\t\t\t\t\t    indir_actions,\n+\t\t\t\t\t    &indir_actions_n,\n \t\t\t\t\t    &translated_actions, error);\n \tif (ret < 0) {\n \t\tMLX5_ASSERT(translated_actions == NULL);\n@@ -5654,8 +5654,8 @@ flow_list_create(struct rte_eth_dev *dev, uint32_t *list,\n \t\tbuf->entries = 1;\n \t\tbuf->entry[0].pattern = (void *)(uintptr_t)items;\n \t}\n-\trss_desc->shared_rss = flow_get_shared_rss_action(dev, shared_actions,\n-\t\t\t\t\t\t      shared_actions_n);\n+\trss_desc->shared_rss = flow_get_shared_rss_action(dev, indir_actions,\n+\t\t\t\t\t\t      indir_actions_n);\n \tfor (i = 0; i < buf->entries; ++i) {\n \t\t/* Initialize flow split data. */\n \t\tflow_split_info.prefix_layers = 0;\n@@ -5834,14 +5834,14 @@ mlx5_flow_validate(struct rte_eth_dev *dev,\n \t\t   struct rte_flow_error *error)\n {\n \tint hairpin_flow;\n-\tstruct mlx5_translated_shared_action\n-\t\tshared_actions[MLX5_MAX_SHARED_ACTIONS];\n-\tint shared_actions_n = MLX5_MAX_SHARED_ACTIONS;\n+\tstruct mlx5_translated_action_handle\n+\t\tindir_actions[MLX5_MAX_INDIRECT_ACTIONS];\n+\tint indir_actions_n = MLX5_MAX_INDIRECT_ACTIONS;\n \tconst struct rte_flow_action *actions;\n \tstruct rte_flow_action *translated_actions = NULL;\n-\tint ret = flow_shared_actions_translate(dev, original_actions,\n-\t\t\t\t\t\tshared_actions,\n-\t\t\t\t\t\t&shared_actions_n,\n+\tint ret = flow_action_handles_translate(dev, original_actions,\n+\t\t\t\t\t\tindir_actions,\n+\t\t\t\t\t\t&indir_actions_n,\n \t\t\t\t\t\t&translated_actions, error);\n \n \tif (ret)\n@@ -7214,12 +7214,12 @@ mlx5_flow_get_aged_flows(struct rte_eth_dev *dev, void **contexts,\n /* Wrapper for driver action_validate op callback */\n static int\n flow_drv_action_validate(struct rte_eth_dev *dev,\n-\t\t\t const struct rte_flow_shared_action_conf *conf,\n+\t\t\t const struct rte_flow_indir_action_conf *conf,\n \t\t\t const struct rte_flow_action *action,\n \t\t\t const struct mlx5_flow_driver_ops *fops,\n \t\t\t struct rte_flow_error *error)\n {\n-\tstatic const char err_msg[] = \"shared action validation unsupported\";\n+\tstatic const char err_msg[] = \"indirect action validation unsupported\";\n \n \tif (!fops->action_validate) {\n \t\tDRV_LOG(ERR, \"port %u %s.\", dev->data->port_id, err_msg);\n@@ -7235,8 +7235,8 @@ flow_drv_action_validate(struct rte_eth_dev *dev,\n  *\n  * @param dev\n  *   Pointer to Ethernet device structure.\n- * @param[in] action\n- *   Handle for the shared action to be destroyed.\n+ * @param[in] handle\n+ *   Handle for the indirect action object to be destroyed.\n  * @param[out] error\n  *   Perform verbose error reporting if not NULL. PMDs initialize this\n  *   structure in case of error only.\n@@ -7247,11 +7247,11 @@ flow_drv_action_validate(struct rte_eth_dev *dev,\n  * @note: wrapper for driver action_create op callback.\n  */\n static int\n-mlx5_shared_action_destroy(struct rte_eth_dev *dev,\n-\t\t\t   struct rte_flow_shared_action *action,\n+mlx5_action_handle_destroy(struct rte_eth_dev *dev,\n+\t\t\t   struct rte_flow_action_handle *handle,\n \t\t\t   struct rte_flow_error *error)\n {\n-\tstatic const char err_msg[] = \"shared action destruction unsupported\";\n+\tstatic const char err_msg[] = \"indirect action destruction unsupported\";\n \tstruct rte_flow_attr attr = { .transfer = 0 };\n \tconst struct mlx5_flow_driver_ops *fops =\n \t\t\tflow_get_drv_ops(flow_get_drv_type(dev, &attr));\n@@ -7262,18 +7262,18 @@ mlx5_shared_action_destroy(struct rte_eth_dev *dev,\n \t\t\t\t   NULL, err_msg);\n \t\treturn -rte_errno;\n \t}\n-\treturn fops->action_destroy(dev, action, error);\n+\treturn fops->action_destroy(dev, handle, error);\n }\n \n /* Wrapper for driver action_destroy op callback */\n static int\n flow_drv_action_update(struct rte_eth_dev *dev,\n-\t\t       struct rte_flow_shared_action *action,\n-\t\t       const void *action_conf,\n+\t\t       struct rte_flow_action_handle *handle,\n+\t\t       const void *update,\n \t\t       const struct mlx5_flow_driver_ops *fops,\n \t\t       struct rte_flow_error *error)\n {\n-\tstatic const char err_msg[] = \"shared action update unsupported\";\n+\tstatic const char err_msg[] = \"indirect action update unsupported\";\n \n \tif (!fops->action_update) {\n \t\tDRV_LOG(ERR, \"port %u %s.\", dev->data->port_id, err_msg);\n@@ -7281,18 +7281,18 @@ flow_drv_action_update(struct rte_eth_dev *dev,\n \t\t\t\t   NULL, err_msg);\n \t\treturn -rte_errno;\n \t}\n-\treturn fops->action_update(dev, action, action_conf, error);\n+\treturn fops->action_update(dev, handle, update, error);\n }\n \n /* Wrapper for driver action_destroy op callback */\n static int\n flow_drv_action_query(struct rte_eth_dev *dev,\n-\t\t      const struct rte_flow_shared_action *action,\n+\t\t      const struct rte_flow_action_handle *handle,\n \t\t      void *data,\n \t\t      const struct mlx5_flow_driver_ops *fops,\n \t\t      struct rte_flow_error *error)\n {\n-\tstatic const char err_msg[] = \"shared action query unsupported\";\n+\tstatic const char err_msg[] = \"indirect action query unsupported\";\n \n \tif (!fops->action_query) {\n \t\tDRV_LOG(ERR, \"port %u %s.\", dev->data->port_id, err_msg);\n@@ -7300,29 +7300,31 @@ flow_drv_action_query(struct rte_eth_dev *dev,\n \t\t\t\t   NULL, err_msg);\n \t\treturn -rte_errno;\n \t}\n-\treturn fops->action_query(dev, action, data, error);\n+\treturn fops->action_query(dev, handle, data, error);\n }\n \n /**\n- * Create shared action for reuse in multiple flow rules.\n+ * Create indirect action for reuse in multiple flow rules.\n  *\n  * @param dev\n  *   Pointer to Ethernet device structure.\n+ * @param conf\n+ *   Pointer to indirect action object configuration.\n  * @param[in] action\n- *   Action configuration for shared action creation.\n+ *   Action configuration for indirect action object creation.\n  * @param[out] error\n  *   Perform verbose error reporting if not NULL. PMDs initialize this\n  *   structure in case of error only.\n  * @return\n  *   A valid handle in case of success, NULL otherwise and rte_errno is set.\n  */\n-static struct rte_flow_shared_action *\n-mlx5_shared_action_create(struct rte_eth_dev *dev,\n-\t\t\t  const struct rte_flow_shared_action_conf *conf,\n+static struct rte_flow_action_handle *\n+mlx5_action_handle_create(struct rte_eth_dev *dev,\n+\t\t\t  const struct rte_flow_indir_action_conf *conf,\n \t\t\t  const struct rte_flow_action *action,\n \t\t\t  struct rte_flow_error *error)\n {\n-\tstatic const char err_msg[] = \"shared action creation unsupported\";\n+\tstatic const char err_msg[] = \"indirect action creation unsupported\";\n \tstruct rte_flow_attr attr = { .transfer = 0 };\n \tconst struct mlx5_flow_driver_ops *fops =\n \t\t\tflow_get_drv_ops(flow_get_drv_type(dev, &attr));\n@@ -7339,19 +7341,20 @@ mlx5_shared_action_create(struct rte_eth_dev *dev,\n }\n \n /**\n- * Updates inplace the shared action configuration pointed by *action* handle\n- * with the configuration provided as *action* argument.\n- * The update of the shared action configuration effects all flow rules reusing\n- * the action via handle.\n+ * Updates inplace the indirect action configuration pointed by *handle*\n+ * with the configuration provided as *update* argument.\n+ * The update of the indirect action configuration effects all flow rules\n+ * reusing the action via handle.\n  *\n  * @param dev\n  *   Pointer to Ethernet device structure.\n- * @param[in] shared_action\n- *   Handle for the shared action to be updated.\n- * @param[in] action\n+ * @param[in] handle\n+ *   Handle for the indirect action to be updated.\n+ * @param[in] update\n  *   Action specification used to modify the action pointed by handle.\n- *   *action* should be of same type with the action pointed by the *action*\n- *   handle argument, otherwise considered as invalid.\n+ *   *update* could be of same type with the action pointed by the *handle*\n+ *   handle argument, or some other structures like a wrapper, depending on\n+ *   the indirect action type.\n  * @param[out] error\n  *   Perform verbose error reporting if not NULL. PMDs initialize this\n  *   structure in case of error only.\n@@ -7360,9 +7363,9 @@ mlx5_shared_action_create(struct rte_eth_dev *dev,\n  *   0 on success, a negative errno value otherwise and rte_errno is set.\n  */\n static int\n-mlx5_shared_action_update(struct rte_eth_dev *dev,\n-\t\tstruct rte_flow_shared_action *shared_action,\n-\t\tconst struct rte_flow_action *action,\n+mlx5_action_handle_update(struct rte_eth_dev *dev,\n+\t\tstruct rte_flow_action_handle *handle,\n+\t\tconst void *update,\n \t\tstruct rte_flow_error *error)\n {\n \tstruct rte_flow_attr attr = { .transfer = 0 };\n@@ -7370,26 +7373,27 @@ mlx5_shared_action_update(struct rte_eth_dev *dev,\n \t\t\tflow_get_drv_ops(flow_get_drv_type(dev, &attr));\n \tint ret;\n \n-\tret = flow_drv_action_validate(dev, NULL, action, fops, error);\n+\tret = flow_drv_action_validate(dev, NULL,\n+\t\t\t(const struct rte_flow_action *)update, fops, error);\n \tif (ret)\n \t\treturn ret;\n-\treturn flow_drv_action_update(dev, shared_action, action->conf, fops,\n+\treturn flow_drv_action_update(dev, handle, update, fops,\n \t\t\t\t      error);\n }\n \n /**\n- * Query the shared action by handle.\n+ * Query the indirect action by handle.\n  *\n  * This function allows retrieving action-specific data such as counters.\n  * Data is gathered by special action which may be present/referenced in\n  * more than one flow rule definition.\n  *\n- * \\see RTE_FLOW_ACTION_TYPE_COUNT\n+ * see @RTE_FLOW_ACTION_TYPE_COUNT\n  *\n  * @param dev\n  *   Pointer to Ethernet device structure.\n- * @param[in] action\n- *   Handle for the shared action to query.\n+ * @param[in] handle\n+ *   Handle for the indirect action to query.\n  * @param[in, out] data\n  *   Pointer to storage for the associated query data type.\n  * @param[out] error\n@@ -7400,8 +7404,8 @@ mlx5_shared_action_update(struct rte_eth_dev *dev,\n  *   0 on success, a negative errno value otherwise and rte_errno is set.\n  */\n static int\n-mlx5_shared_action_query(struct rte_eth_dev *dev,\n-\t\t\t const struct rte_flow_shared_action *action,\n+mlx5_action_handle_query(struct rte_eth_dev *dev,\n+\t\t\t const struct rte_flow_action_handle *handle,\n \t\t\t void *data,\n \t\t\t struct rte_flow_error *error)\n {\n@@ -7409,11 +7413,11 @@ mlx5_shared_action_query(struct rte_eth_dev *dev,\n \tconst struct mlx5_flow_driver_ops *fops =\n \t\t\tflow_get_drv_ops(flow_get_drv_type(dev, &attr));\n \n-\treturn flow_drv_action_query(dev, action, data, fops, error);\n+\treturn flow_drv_action_query(dev, handle, data, fops, error);\n }\n \n /**\n- * Destroy all shared actions.\n+ * Destroy all indirect actions (shared RSS).\n  *\n  * @param dev\n  *   Pointer to Ethernet device.\n@@ -7422,7 +7426,7 @@ mlx5_shared_action_query(struct rte_eth_dev *dev,\n  *   0 on success, a negative errno value otherwise and rte_errno is set.\n  */\n int\n-mlx5_shared_action_flush(struct rte_eth_dev *dev)\n+mlx5_action_handle_flush(struct rte_eth_dev *dev)\n {\n \tstruct rte_flow_error error;\n \tstruct mlx5_priv *priv = dev->data->dev_private;\n@@ -7432,8 +7436,8 @@ mlx5_shared_action_flush(struct rte_eth_dev *dev)\n \n \tILIST_FOREACH(priv->sh->ipool[MLX5_IPOOL_RSS_SHARED_ACTIONS],\n \t\t      priv->rss_shared_actions, idx, shared_rss, next) {\n-\t\tret |= mlx5_shared_action_destroy(dev,\n-\t\t       (struct rte_flow_shared_action *)(uintptr_t)idx, &error);\n+\t\tret |= mlx5_action_handle_destroy(dev,\n+\t\t       (struct rte_flow_action_handle *)(uintptr_t)idx, &error);\n \t}\n \treturn ret;\n }\ndiff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h\nindex ec673c29ab..56674eb0d2 100644\n--- a/drivers/net/mlx5/mlx5_flow.h\n+++ b/drivers/net/mlx5/mlx5_flow.h\n@@ -39,11 +39,11 @@ enum mlx5_rte_flow_action_type {\n \tMLX5_RTE_FLOW_ACTION_TYPE_AGE,\n };\n \n-#define MLX5_SHARED_ACTION_TYPE_OFFSET 30\n+#define MLX5_INDIRECT_ACTION_TYPE_OFFSET 30\n \n enum {\n-\tMLX5_SHARED_ACTION_TYPE_RSS,\n-\tMLX5_SHARED_ACTION_TYPE_AGE,\n+\tMLX5_INDIRECT_ACTION_TYPE_RSS,\n+\tMLX5_INDIRECT_ACTION_TYPE_AGE,\n };\n \n /* Matches on selected register. */\n@@ -1152,7 +1152,7 @@ struct mlx5_shared_action_rss {\n \trte_spinlock_t action_rss_sl; /**< Shared RSS action spinlock. */\n };\n \n-struct rte_flow_shared_action {\n+struct rte_flow_action_handle {\n \tuint32_t id;\n };\n \n@@ -1233,26 +1233,26 @@ typedef int (*mlx5_flow_get_aged_flows_t)\n \t\t\t\t\t struct rte_flow_error *error);\n typedef int (*mlx5_flow_action_validate_t)\n \t\t\t\t(struct rte_eth_dev *dev,\n-\t\t\t\t const struct rte_flow_shared_action_conf *conf,\n+\t\t\t\t const struct rte_flow_indir_action_conf *conf,\n \t\t\t\t const struct rte_flow_action *action,\n \t\t\t\t struct rte_flow_error *error);\n-typedef struct rte_flow_shared_action *(*mlx5_flow_action_create_t)\n+typedef struct rte_flow_action_handle *(*mlx5_flow_action_create_t)\n \t\t\t\t(struct rte_eth_dev *dev,\n-\t\t\t\t const struct rte_flow_shared_action_conf *conf,\n+\t\t\t\t const struct rte_flow_indir_action_conf *conf,\n \t\t\t\t const struct rte_flow_action *action,\n \t\t\t\t struct rte_flow_error *error);\n typedef int (*mlx5_flow_action_destroy_t)\n \t\t\t\t(struct rte_eth_dev *dev,\n-\t\t\t\t struct rte_flow_shared_action *action,\n+\t\t\t\t struct rte_flow_action_handle *action,\n \t\t\t\t struct rte_flow_error *error);\n typedef int (*mlx5_flow_action_update_t)\n \t\t\t(struct rte_eth_dev *dev,\n-\t\t\t struct rte_flow_shared_action *action,\n-\t\t\t const void *action_conf,\n+\t\t\t struct rte_flow_action_handle *action,\n+\t\t\t const void *update,\n \t\t\t struct rte_flow_error *error);\n typedef int (*mlx5_flow_action_query_t)\n \t\t\t(struct rte_eth_dev *dev,\n-\t\t\t const struct rte_flow_shared_action *action,\n+\t\t\t const struct rte_flow_action_handle *action,\n \t\t\t void *data,\n \t\t\t struct rte_flow_error *error);\n typedef int (*mlx5_flow_sync_domain_t)\n@@ -1483,7 +1483,7 @@ int mlx5_flow_destroy_policer_rules(struct rte_eth_dev *dev,\n int mlx5_flow_meter_flush(struct rte_eth_dev *dev,\n \t\t\t  struct rte_mtr_error *error);\n int mlx5_flow_dv_discover_counter_offset_support(struct rte_eth_dev *dev);\n-int mlx5_shared_action_flush(struct rte_eth_dev *dev);\n+int mlx5_action_handle_flush(struct rte_eth_dev *dev);\n void mlx5_release_tunnel_hub(struct mlx5_dev_ctx_shared *sh, uint16_t port_id);\n int mlx5_alloc_tunnel_hub(struct mlx5_dev_ctx_shared *sh);\n \ndiff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c\nindex e65cc13bd6..d02e97b3f4 100644\n--- a/drivers/net/mlx5/mlx5_flow_dv.c\n+++ b/drivers/net/mlx5/mlx5_flow_dv.c\n@@ -12870,7 +12870,7 @@ __flow_dv_action_rss_setup(struct rte_eth_dev *dev,\n  */\n static uint32_t\n __flow_dv_action_rss_create(struct rte_eth_dev *dev,\n-\t\t\t    const struct rte_flow_shared_action_conf *conf,\n+\t\t\t    const struct rte_flow_indir_action_conf *conf,\n \t\t\t    const struct rte_flow_action_rss *rss,\n \t\t\t    struct rte_flow_error *error)\n {\n@@ -12893,7 +12893,7 @@ __flow_dv_action_rss_create(struct rte_eth_dev *dev,\n \t\t\t\t   \"cannot allocate resource memory\");\n \t\tgoto error_rss_init;\n \t}\n-\tif (idx > (1u << MLX5_SHARED_ACTION_TYPE_OFFSET)) {\n+\tif (idx > (1u << MLX5_INDIRECT_ACTION_TYPE_OFFSET)) {\n \t\trte_flow_error_set(error, E2BIG,\n \t\t\t\t   RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,\n \t\t\t\t   \"rss action number out of range\");\n@@ -13006,7 +13006,7 @@ __flow_dv_action_rss_release(struct rte_eth_dev *dev, uint32_t idx,\n }\n \n /**\n- * Create shared action, lock free,\n+ * Create indirect action, lock free,\n  * (mutex should be acquired by caller).\n  * Dispatcher for action type specific call.\n  *\n@@ -13015,7 +13015,7 @@ __flow_dv_action_rss_release(struct rte_eth_dev *dev, uint32_t idx,\n  * @param[in] conf\n  *   Shared action configuration.\n  * @param[in] action\n- *   Action specification used to create shared action.\n+ *   Action specification used to create indirect action.\n  * @param[out] error\n  *   Perform verbose error reporting if not NULL. Initialized in case of\n  *   error only.\n@@ -13024,9 +13024,9 @@ __flow_dv_action_rss_release(struct rte_eth_dev *dev, uint32_t idx,\n  *   A valid shared action handle in case of success, NULL otherwise and\n  *   rte_errno is set.\n  */\n-static struct rte_flow_shared_action *\n+static struct rte_flow_action_handle *\n flow_dv_action_create(struct rte_eth_dev *dev,\n-\t\t      const struct rte_flow_shared_action_conf *conf,\n+\t\t      const struct rte_flow_indir_action_conf *conf,\n \t\t      const struct rte_flow_action *action,\n \t\t      struct rte_flow_error *err)\n {\n@@ -13036,13 +13036,13 @@ flow_dv_action_create(struct rte_eth_dev *dev,\n \tswitch (action->type) {\n \tcase RTE_FLOW_ACTION_TYPE_RSS:\n \t\tret = __flow_dv_action_rss_create(dev, conf, action->conf, err);\n-\t\tidx = (MLX5_SHARED_ACTION_TYPE_RSS <<\n-\t\t       MLX5_SHARED_ACTION_TYPE_OFFSET) | ret;\n+\t\tidx = (MLX5_INDIRECT_ACTION_TYPE_RSS <<\n+\t\t       MLX5_INDIRECT_ACTION_TYPE_OFFSET) | ret;\n \t\tbreak;\n \tcase RTE_FLOW_ACTION_TYPE_AGE:\n \t\tret = flow_dv_translate_create_aso_age(dev, action->conf, err);\n-\t\tidx = (MLX5_SHARED_ACTION_TYPE_AGE <<\n-\t\t       MLX5_SHARED_ACTION_TYPE_OFFSET) | ret;\n+\t\tidx = (MLX5_INDIRECT_ACTION_TYPE_AGE <<\n+\t\t       MLX5_INDIRECT_ACTION_TYPE_OFFSET) | ret;\n \t\tif (ret) {\n \t\t\tstruct mlx5_aso_age_action *aso_age =\n \t\t\t\t\t      flow_aso_age_get_by_idx(dev, ret);\n@@ -13057,19 +13057,19 @@ flow_dv_action_create(struct rte_eth_dev *dev,\n \t\t\t\t   NULL, \"action type not supported\");\n \t\tbreak;\n \t}\n-\treturn ret ? (struct rte_flow_shared_action *)(uintptr_t)idx : NULL;\n+\treturn ret ? (struct rte_flow_action_handle *)(uintptr_t)idx : NULL;\n }\n \n /**\n- * Destroy the shared action.\n+ * Destroy the indirect action.\n  * Release action related resources on the NIC and the memory.\n  * Lock free, (mutex should be acquired by caller).\n  * Dispatcher for action type specific call.\n  *\n  * @param[in] dev\n  *   Pointer to the Ethernet device structure.\n- * @param[in] action\n- *   The shared action object to be removed.\n+ * @param[in] handle\n+ *   The indirect action object handle to be removed.\n  * @param[out] error\n  *   Perform verbose error reporting if not NULL. Initialized in case of\n  *   error only.\n@@ -13079,25 +13079,25 @@ flow_dv_action_create(struct rte_eth_dev *dev,\n  */\n static int\n flow_dv_action_destroy(struct rte_eth_dev *dev,\n-\t\t       struct rte_flow_shared_action *action,\n+\t\t       struct rte_flow_action_handle *handle,\n \t\t       struct rte_flow_error *error)\n {\n-\tuint32_t act_idx = (uint32_t)(uintptr_t)action;\n-\tuint32_t type = act_idx >> MLX5_SHARED_ACTION_TYPE_OFFSET;\n-\tuint32_t idx = act_idx & ((1u << MLX5_SHARED_ACTION_TYPE_OFFSET) - 1);\n+\tuint32_t act_idx = (uint32_t)(uintptr_t)handle;\n+\tuint32_t type = act_idx >> MLX5_INDIRECT_ACTION_TYPE_OFFSET;\n+\tuint32_t idx = act_idx & ((1u << MLX5_INDIRECT_ACTION_TYPE_OFFSET) - 1);\n \tint ret;\n \n \tswitch (type) {\n-\tcase MLX5_SHARED_ACTION_TYPE_RSS:\n+\tcase MLX5_INDIRECT_ACTION_TYPE_RSS:\n \t\treturn __flow_dv_action_rss_release(dev, idx, error);\n-\tcase MLX5_SHARED_ACTION_TYPE_AGE:\n+\tcase MLX5_INDIRECT_ACTION_TYPE_AGE:\n \t\tret = flow_dv_aso_age_release(dev, idx);\n \t\tif (ret)\n \t\t\t/*\n \t\t\t * In this case, the last flow has a reference will\n \t\t\t * actually release the age action.\n \t\t\t */\n-\t\t\tDRV_LOG(DEBUG, \"Shared age action %\" PRIu32 \" was\"\n+\t\t\tDRV_LOG(DEBUG, \"Indirect age action %\" PRIu32 \" was\"\n \t\t\t\t\" released with references %d.\", idx, ret);\n \t\treturn 0;\n \tdefault:\n@@ -13180,12 +13180,13 @@ __flow_dv_action_rss_update(struct rte_eth_dev *dev, uint32_t idx,\n  *\n  * @param[in] dev\n  *   Pointer to the Ethernet device structure.\n- * @param[in] action\n- *   The shared action object to be updated.\n- * @param[in] action_conf\n- *   Action specification used to modify *action*.\n- *   *action_conf* should be of type correlating with type of the *action*,\n- *   otherwise considered as invalid.\n+ * @param[in] handle\n+ *   The indirect action object handle to be updated.\n+ * @param[in] update\n+ *   Action specification used to modify the action pointed by *handle*.\n+ *   *update* could be of same type with the action pointed by the *handle*\n+ *   handle argument, or some other structures like a wrapper, depending on\n+ *   the indirect action type.\n  * @param[out] error\n  *   Perform verbose error reporting if not NULL. Initialized in case of\n  *   error only.\n@@ -13195,16 +13196,18 @@ __flow_dv_action_rss_update(struct rte_eth_dev *dev, uint32_t idx,\n  */\n static int\n flow_dv_action_update(struct rte_eth_dev *dev,\n-\t\t\tstruct rte_flow_shared_action *action,\n-\t\t\tconst void *action_conf,\n+\t\t\tstruct rte_flow_action_handle *handle,\n+\t\t\tconst void *update,\n \t\t\tstruct rte_flow_error *err)\n {\n-\tuint32_t act_idx = (uint32_t)(uintptr_t)action;\n-\tuint32_t type = act_idx >> MLX5_SHARED_ACTION_TYPE_OFFSET;\n-\tuint32_t idx = act_idx & ((1u << MLX5_SHARED_ACTION_TYPE_OFFSET) - 1);\n+\tuint32_t act_idx = (uint32_t)(uintptr_t)handle;\n+\tuint32_t type = act_idx >> MLX5_INDIRECT_ACTION_TYPE_OFFSET;\n+\tuint32_t idx = act_idx & ((1u << MLX5_INDIRECT_ACTION_TYPE_OFFSET) - 1);\n+\tconst void *action_conf;\n \n \tswitch (type) {\n-\tcase MLX5_SHARED_ACTION_TYPE_RSS:\n+\tcase MLX5_INDIRECT_ACTION_TYPE_RSS:\n+\t\taction_conf = ((const struct rte_flow_action *)update)->conf;\n \t\treturn __flow_dv_action_rss_update(dev, idx, action_conf, err);\n \tdefault:\n \t\treturn rte_flow_error_set(err, ENOTSUP,\n@@ -13216,17 +13219,17 @@ flow_dv_action_update(struct rte_eth_dev *dev,\n \n static int\n flow_dv_action_query(struct rte_eth_dev *dev,\n-\t\t     const struct rte_flow_shared_action *action, void *data,\n+\t\t     const struct rte_flow_action_handle *handle, void *data,\n \t\t     struct rte_flow_error *error)\n {\n \tstruct mlx5_age_param *age_param;\n \tstruct rte_flow_query_age *resp;\n-\tuint32_t act_idx = (uint32_t)(uintptr_t)action;\n-\tuint32_t type = act_idx >> MLX5_SHARED_ACTION_TYPE_OFFSET;\n-\tuint32_t idx = act_idx & ((1u << MLX5_SHARED_ACTION_TYPE_OFFSET) - 1);\n+\tuint32_t act_idx = (uint32_t)(uintptr_t)handle;\n+\tuint32_t type = act_idx >> MLX5_INDIRECT_ACTION_TYPE_OFFSET;\n+\tuint32_t idx = act_idx & ((1u << MLX5_INDIRECT_ACTION_TYPE_OFFSET) - 1);\n \n \tswitch (type) {\n-\tcase MLX5_SHARED_ACTION_TYPE_AGE:\n+\tcase MLX5_INDIRECT_ACTION_TYPE_AGE:\n \t\tage_param = &flow_aso_age_get_by_idx(dev, idx)->age_params;\n \t\tresp = data;\n \t\tresp->aged = __atomic_load_n(&age_param->state,\n@@ -14002,7 +14005,7 @@ flow_dv_counter_allocate(struct rte_eth_dev *dev)\n }\n \n /**\n- * Validate shared action.\n+ * Validate indirect action.\n  * Dispatcher for action type specific validation.\n  *\n  * @param[in] dev\n@@ -14010,7 +14013,7 @@ flow_dv_counter_allocate(struct rte_eth_dev *dev)\n  * @param[in] conf\n  *   Shared action configuration.\n  * @param[in] action\n- *   The shared action object to validate.\n+ *   The indirect action object to validate.\n  * @param[out] error\n  *   Perform verbose error reporting if not NULL. Initialized in case of\n  *   error only.\n@@ -14020,7 +14023,7 @@ flow_dv_counter_allocate(struct rte_eth_dev *dev)\n  */\n static int\n flow_dv_action_validate(struct rte_eth_dev *dev,\n-\t\t\tconst struct rte_flow_shared_action_conf *conf,\n+\t\t\tconst struct rte_flow_indir_action_conf *conf,\n \t\t\tconst struct rte_flow_action *action,\n \t\t\tstruct rte_flow_error *err)\n {\ndiff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c\nindex 7241f00353..0d2610b7c4 100644\n--- a/lib/librte_ethdev/rte_flow.c\n+++ b/lib/librte_ethdev/rte_flow.c\n@@ -180,12 +180,12 @@ static const struct rte_flow_desc_data rte_flow_desc_action[] = {\n \tMK_FLOW_ACTION(MODIFY_FIELD,\n \t\t       sizeof(struct rte_flow_action_modify_field)),\n \t/**\n-\t * Shared action represented as handle of type\n-\t * (struct rte_flow_shared action *) stored in conf field (see\n+\t * Indirect action represented as handle of type\n+\t * (struct rte_flow_action_handle *) stored in conf field (see\n \t * struct rte_flow_action); no need for additional structure to * store\n-\t * shared action handle.\n+\t * indirect action handle.\n \t */\n-\tMK_FLOW_ACTION(SHARED, 0),\n+\tMK_FLOW_ACTION(INDIRECT, 0),\n };\n \n int\n@@ -1068,53 +1068,53 @@ rte_flow_get_aged_flows(uint16_t port_id, void **contexts,\n \t\t\t\t  NULL, rte_strerror(ENOTSUP));\n }\n \n-struct rte_flow_shared_action *\n-rte_flow_shared_action_create(uint16_t port_id,\n-\t\t\t      const struct rte_flow_shared_action_conf *conf,\n+struct rte_flow_action_handle *\n+rte_flow_action_handle_create(uint16_t port_id,\n+\t\t\t      const struct rte_flow_indir_action_conf *conf,\n \t\t\t      const struct rte_flow_action *action,\n \t\t\t      struct rte_flow_error *error)\n {\n-\tstruct rte_flow_shared_action *shared_action;\n+\tstruct rte_flow_action_handle *handle;\n \tconst struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);\n \n \tif (unlikely(!ops))\n \t\treturn NULL;\n-\tif (unlikely(!ops->shared_action_create)) {\n+\tif (unlikely(!ops->action_handle_create)) {\n \t\trte_flow_error_set(error, ENOSYS,\n \t\t\t\t   RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,\n \t\t\t\t   rte_strerror(ENOSYS));\n \t\treturn NULL;\n \t}\n-\tshared_action = ops->shared_action_create(&rte_eth_devices[port_id],\n-\t\t\t\t\t\t  conf, action, error);\n-\tif (shared_action == NULL)\n+\thandle = ops->action_handle_create(&rte_eth_devices[port_id],\n+\t\t\t\t\t   conf, action, error);\n+\tif (handle == NULL)\n \t\tflow_err(port_id, -rte_errno, error);\n-\treturn shared_action;\n+\treturn handle;\n }\n \n int\n-rte_flow_shared_action_destroy(uint16_t port_id,\n-\t\t\t      struct rte_flow_shared_action *action,\n-\t\t\t      struct rte_flow_error *error)\n+rte_flow_action_handle_destroy(uint16_t port_id,\n+\t\t\t       struct rte_flow_action_handle *handle,\n+\t\t\t       struct rte_flow_error *error)\n {\n \tint ret;\n \tconst struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);\n \n \tif (unlikely(!ops))\n \t\treturn -rte_errno;\n-\tif (unlikely(!ops->shared_action_destroy))\n+\tif (unlikely(!ops->action_handle_destroy))\n \t\treturn rte_flow_error_set(error, ENOSYS,\n \t\t\t\t\t  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n \t\t\t\t\t  NULL, rte_strerror(ENOSYS));\n-\tret = ops->shared_action_destroy(&rte_eth_devices[port_id], action,\n-\t\t\t\t\t error);\n+\tret = ops->action_handle_destroy(&rte_eth_devices[port_id],\n+\t\t\t\t\t handle, error);\n \treturn flow_err(port_id, ret, error);\n }\n \n int\n-rte_flow_shared_action_update(uint16_t port_id,\n-\t\t\t      struct rte_flow_shared_action *action,\n-\t\t\t      const struct rte_flow_action *update,\n+rte_flow_action_handle_update(uint16_t port_id,\n+\t\t\t      struct rte_flow_action_handle *handle,\n+\t\t\t      const void *update,\n \t\t\t      struct rte_flow_error *error)\n {\n \tint ret;\n@@ -1122,18 +1122,18 @@ rte_flow_shared_action_update(uint16_t port_id,\n \n \tif (unlikely(!ops))\n \t\treturn -rte_errno;\n-\tif (unlikely(!ops->shared_action_update))\n+\tif (unlikely(!ops->action_handle_update))\n \t\treturn rte_flow_error_set(error, ENOSYS,\n \t\t\t\t\t  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n \t\t\t\t\t  NULL, rte_strerror(ENOSYS));\n-\tret = ops->shared_action_update(&rte_eth_devices[port_id], action,\n+\tret = ops->action_handle_update(&rte_eth_devices[port_id], handle,\n \t\t\t\t\tupdate, error);\n \treturn flow_err(port_id, ret, error);\n }\n \n int\n-rte_flow_shared_action_query(uint16_t port_id,\n-\t\t\t     const struct rte_flow_shared_action *action,\n+rte_flow_action_handle_query(uint16_t port_id,\n+\t\t\t     const struct rte_flow_action_handle *handle,\n \t\t\t     void *data,\n \t\t\t     struct rte_flow_error *error)\n {\n@@ -1142,11 +1142,11 @@ rte_flow_shared_action_query(uint16_t port_id,\n \n \tif (unlikely(!ops))\n \t\treturn -rte_errno;\n-\tif (unlikely(!ops->shared_action_query))\n+\tif (unlikely(!ops->action_handle_query))\n \t\treturn rte_flow_error_set(error, ENOSYS,\n \t\t\t\t\t  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n \t\t\t\t\t  NULL, rte_strerror(ENOSYS));\n-\tret = ops->shared_action_query(&rte_eth_devices[port_id], action,\n+\tret = ops->action_handle_query(&rte_eth_devices[port_id], handle,\n \t\t\t\t       data, error);\n \treturn flow_err(port_id, ret, error);\n }\ndiff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h\nindex 203c4cde9a..324d00abdc 100644\n--- a/lib/librte_ethdev/rte_flow.h\n+++ b/lib/librte_ethdev/rte_flow.h\n@@ -1821,7 +1821,7 @@ enum rte_flow_action_type {\n \t * Enables counters for this flow rule.\n \t *\n \t * These counters can be retrieved and reset through rte_flow_query() or\n-\t * rte_flow_shared_action_query() if the action provided via handle,\n+\t * rte_flow_action_handle_query() if the action provided via handle,\n \t * see struct rte_flow_query_count.\n \t *\n \t * See struct rte_flow_action_count.\n@@ -2267,6 +2267,16 @@ enum rte_flow_action_type {\n \t * See struct rte_flow_action_modify_field.\n \t */\n \tRTE_FLOW_ACTION_TYPE_MODIFY_FIELD,\n+\n+\t/**\n+\t * Describe indirect action that could be used by a single flow rule\n+\t * or multiple flow rules.\n+\t *\n+\t * Allow flow rule(s) reference the same action by the indirect action\n+\t * handle (see struct rte_flow_action_handle), rules could be on the\n+\t * same port or across different ports.\n+\t */\n+\tRTE_FLOW_ACTION_TYPE_INDIRECT,\n };\n \n /**\n@@ -2357,7 +2367,7 @@ struct rte_flow_query_age {\n  * ``struct rte_flow_query_count``.\n  *\n  * @deprecated Shared attribute is deprecated, use generic\n- * RTE_FLOW_ACTION_TYPE_SHARED action.\n+ * RTE_FLOW_ACTION_TYPE_INDIRECT action.\n  *\n  * The shared flag indicates whether the counter is unique to the flow rule the\n  * action is specified with, or whether it is a shared counter.\n@@ -2847,17 +2857,23 @@ struct rte_flow_action_set_dscp {\n };\n \n /**\n- * RTE_FLOW_ACTION_TYPE_SHARED\n+ * @warning\n+ * @b EXPERIMENTAL: this structure may change without prior notice\n+ *\n+ * RTE_FLOW_ACTION_TYPE_INDIRECT\n  *\n- * Opaque type returned after successfully creating a shared action.\n+ * Opaque type returned after successfully creating an indirect action object.\n+ * The definition of the object handle will be different per driver or\n+ * per immediate action type.\n  *\n- * This handle can be used to manage and query the related action:\n- * - share it across multiple flow rules\n- * - update action configuration\n- * - query action data\n- * - destroy action\n+ * This handle can be used to manage and query the related immediate action:\n+ * - referenced in single flow rule or across multiple flow rules\n+ *   over multiple ports\n+ * - update action object configuration\n+ * - query action object data\n+ * - destroy action object\n  */\n-struct rte_flow_shared_action;\n+struct rte_flow_action_handle;\n \n /**\n  * Field IDs for MODIFY_FIELD action.\n@@ -3631,25 +3647,22 @@ rte_flow_get_aged_flows(uint16_t port_id, void **contexts,\n \t\t\tuint32_t nb_contexts, struct rte_flow_error *error);\n \n /**\n- * Specify shared action configuration\n+ * Specify indirect action object configuration\n  */\n-struct rte_flow_shared_action_conf {\n+struct rte_flow_indir_action_conf {\n \t/**\n-\t * Flow direction for shared action configuration.\n+\t * Flow direction for the indirect action configuration.\n \t *\n-\t * Shared action should be valid at least for one flow direction,\n+\t * Action should be valid at least for one flow direction,\n \t * otherwise it is invalid for both ingress and egress rules.\n \t */\n \tuint32_t ingress:1;\n \t/**< Action valid for rules applied to ingress traffic. */\n \tuint32_t egress:1;\n \t/**< Action valid for rules applied to egress traffic. */\n-\n \t/**\n \t * When set to 1, indicates that the action is valid for\n \t * transfer traffic; otherwise, for non-transfer traffic.\n-\t *\n-\t * See struct rte_flow_attr.\n \t */\n \tuint32_t transfer:1;\n };\n@@ -3658,16 +3671,17 @@ struct rte_flow_shared_action_conf {\n  * @warning\n  * @b EXPERIMENTAL: this API may change without prior notice.\n  *\n- * Create shared action for reuse in multiple flow rules.\n- * The created shared action has single state and configuration\n- * across all flow rules using it.\n+ * Create an indirect action object that can be used by flow create, and\n+ * could also be shared by different flows.\n+ * The created object handle has single state and configuration\n+ * across all the flow rules using it.\n  *\n  * @param[in] port_id\n  *    The port identifier of the Ethernet device.\n  * @param[in] conf\n- *   Shared action configuration.\n+ *   Action configuration for the indirect action object creation.\n  * @param[in] action\n- *   Action configuration for shared action creation.\n+ *   Specific configuration of the indirect action object.\n  * @param[out] error\n  *   Perform verbose error reporting if not NULL. PMDs initialize this\n  *   structure in case of error only.\n@@ -3681,9 +3695,9 @@ struct rte_flow_shared_action_conf {\n  *   - (ENOTSUP) if *action* valid but unsupported.\n  */\n __rte_experimental\n-struct rte_flow_shared_action *\n-rte_flow_shared_action_create(uint16_t port_id,\n-\t\t\t      const struct rte_flow_shared_action_conf *conf,\n+struct rte_flow_action_handle *\n+rte_flow_action_handle_create(uint16_t port_id,\n+\t\t\t      const struct rte_flow_indir_action_conf *conf,\n \t\t\t      const struct rte_flow_action *action,\n \t\t\t      struct rte_flow_error *error);\n \n@@ -3691,12 +3705,12 @@ rte_flow_shared_action_create(uint16_t port_id,\n  * @warning\n  * @b EXPERIMENTAL: this API may change without prior notice.\n  *\n- * Destroy the shared action by handle.\n+ * Destroy indirect action by handle.\n  *\n  * @param[in] port_id\n  *    The port identifier of the Ethernet device.\n- * @param[in] action\n- *   Handle for the shared action to be destroyed.\n+ * @param[in] handle\n+ *   Handle for the indirect action object to be destroyed.\n  * @param[out] error\n  *   Perform verbose error reporting if not NULL. PMDs initialize this\n  *   structure in case of error only.\n@@ -3711,27 +3725,30 @@ rte_flow_shared_action_create(uint16_t port_id,\n  */\n __rte_experimental\n int\n-rte_flow_shared_action_destroy(uint16_t port_id,\n-\t\t\t       struct rte_flow_shared_action *action,\n+rte_flow_action_handle_destroy(uint16_t port_id,\n+\t\t\t       struct rte_flow_action_handle *handle,\n \t\t\t       struct rte_flow_error *error);\n \n /**\n  * @warning\n  * @b EXPERIMENTAL: this API may change without prior notice.\n  *\n- * Update in-place the shared action configuration pointed by *action* handle\n- * with the configuration provided as *update* argument.\n- * The update of the shared action configuration effects all flow rules reusing\n- * the action via handle.\n+ * Update in-place the action configuration and / or state pointed\n+ * by action *handle* with the configuration provided as *update* argument.\n+ * The update of the action configuration effects all flow rules reusing\n+ * the action via *handle*.\n+ * The update general pointer provides the ability of partial updating.\n  *\n  * @param[in] port_id\n  *    The port identifier of the Ethernet device.\n- * @param[in] action\n- *   Handle for the shared action to be updated.\n+ * @param[in] handle\n+ *   Handle for the indirect action object to be updated.\n  * @param[in] update\n- *   Action specification used to modify the action pointed by handle.\n- *   *update* should be of same type with the action pointed by the *action*\n- *   handle argument, otherwise considered as invalid.\n+ *   Update profile specification used to modify the action pointed by handle.\n+ *   *update* could be with the same type of the immediate action corresponding\n+ *   to the *handle* argument when creating, or a wrapper structure includes\n+ *   action configuration to be updated and bit fields to indicate the member\n+ *   of fields inside the action to update.\n  * @param[out] error\n  *   Perform verbose error reporting if not NULL. PMDs initialize this\n  *   structure in case of error only.\n@@ -3742,32 +3759,32 @@ rte_flow_shared_action_destroy(uint16_t port_id,\n  *   - (-EIO) if underlying device is removed.\n  *   - (-EINVAL) if *update* invalid.\n  *   - (-ENOTSUP) if *update* valid but unsupported.\n- *   - (-ENOENT) if action pointed by *ctx* was not found.\n+ *   - (-ENOENT) if indirect action object pointed by *handle* was not found.\n  *   rte_errno is also set.\n  */\n __rte_experimental\n int\n-rte_flow_shared_action_update(uint16_t port_id,\n-\t\t\t      struct rte_flow_shared_action *action,\n-\t\t\t      const struct rte_flow_action *update,\n+rte_flow_action_handle_update(uint16_t port_id,\n+\t\t\t      struct rte_flow_action_handle *handle,\n+\t\t\t      const void *update,\n \t\t\t      struct rte_flow_error *error);\n \n /**\n  * @warning\n  * @b EXPERIMENTAL: this API may change without prior notice.\n  *\n- * Query the shared action by handle.\n+ * Query the direct action by corresponding indirect action object handle.\n  *\n  * Retrieve action-specific data such as counters.\n  * Data is gathered by special action which may be present/referenced in\n  * more than one flow rule definition.\n  *\n- * \\see RTE_FLOW_ACTION_TYPE_COUNT\n+ * @see RTE_FLOW_ACTION_TYPE_COUNT\n  *\n  * @param port_id\n  *   Port identifier of Ethernet device.\n- * @param[in] action\n- *   Handle for the shared action to query.\n+ * @param[in] handle\n+ *   Handle for the action object to query.\n  * @param[in, out] data\n  *   Pointer to storage for the associated query data type.\n  * @param[out] error\n@@ -3779,10 +3796,9 @@ rte_flow_shared_action_update(uint16_t port_id,\n  */\n __rte_experimental\n int\n-rte_flow_shared_action_query(uint16_t port_id,\n-\t\t\t     const struct rte_flow_shared_action *action,\n-\t\t\t     void *data,\n-\t\t\t     struct rte_flow_error *error);\n+rte_flow_action_handle_query(uint16_t port_id,\n+\t\t\t     const struct rte_flow_action_handle *handle,\n+\t\t\t     void *data, struct rte_flow_error *error);\n \n /* Tunnel has a type and the key information. */\n struct rte_flow_tunnel {\ndiff --git a/lib/librte_ethdev/rte_flow_driver.h b/lib/librte_ethdev/rte_flow_driver.h\nindex 6ae1f8c264..46f62c2ec2 100644\n--- a/lib/librte_ethdev/rte_flow_driver.h\n+++ b/lib/librte_ethdev/rte_flow_driver.h\n@@ -84,27 +84,27 @@ struct rte_flow_ops {\n \t\t void **context,\n \t\t uint32_t nb_contexts,\n \t\t struct rte_flow_error *err);\n-\t/** See rte_flow_shared_action_create() */\n-\tstruct rte_flow_shared_action *(*shared_action_create)\n+\t/** See rte_flow_action_handle_create() */\n+\tstruct rte_flow_action_handle *(*action_handle_create)\n \t\t(struct rte_eth_dev *dev,\n-\t\t const struct rte_flow_shared_action_conf *conf,\n+\t\t const struct rte_flow_indir_action_conf *conf,\n \t\t const struct rte_flow_action *action,\n \t\t struct rte_flow_error *error);\n-\t/** See rte_flow_shared_action_destroy() */\n-\tint (*shared_action_destroy)\n+\t/** See rte_flow_action_handle_destroy() */\n+\tint (*action_handle_destroy)\n \t\t(struct rte_eth_dev *dev,\n-\t\t struct rte_flow_shared_action *shared_action,\n+\t\t struct rte_flow_action_handle *handle,\n \t\t struct rte_flow_error *error);\n-\t/** See rte_flow_shared_action_update() */\n-\tint (*shared_action_update)\n+\t/** See rte_flow_action_handle_update() */\n+\tint (*action_handle_update)\n \t\t(struct rte_eth_dev *dev,\n-\t\t struct rte_flow_shared_action *shared_action,\n-\t\t const struct rte_flow_action *update,\n+\t\t struct rte_flow_action_handle *handle,\n+\t\t const void *update,\n \t\t struct rte_flow_error *error);\n-\t/** See rte_flow_shared_action_query() */\n-\tint (*shared_action_query)\n+\t/** See rte_flow_action_handle_query() */\n+\tint (*action_handle_query)\n \t\t(struct rte_eth_dev *dev,\n-\t\t const struct rte_flow_shared_action *shared_action,\n+\t\t const struct rte_flow_action_handle *handle,\n \t\t void *data,\n \t\t struct rte_flow_error *error);\n \t/** See rte_flow_tunnel_decap_set() */\ndiff --git a/lib/librte_ethdev/version.map b/lib/librte_ethdev/version.map\nindex 93ad388e96..4eb561a89a 100644\n--- a/lib/librte_ethdev/version.map\n+++ b/lib/librte_ethdev/version.map\n@@ -231,10 +231,6 @@ EXPERIMENTAL {\n \trte_eth_fec_get_capability;\n \trte_eth_fec_get;\n \trte_eth_fec_set;\n-\trte_flow_shared_action_create;\n-\trte_flow_shared_action_destroy;\n-\trte_flow_shared_action_query;\n-\trte_flow_shared_action_update;\n \trte_flow_tunnel_decap_set;\n \trte_flow_tunnel_match;\n \trte_flow_get_restore_info;\n@@ -246,6 +242,10 @@ EXPERIMENTAL {\n \n \t# added in 21.05\n \trte_eth_representor_info_get;\n+\trte_flow_action_handle_create;\n+\trte_flow_action_handle_destroy;\n+\trte_flow_action_handle_update;\n+\trte_flow_action_handle_query;\n };\n \n INTERNAL {\n",
    "prefixes": [
        "v4",
        "1/1"
    ]
}