get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 132370,
    "url": "https://patches.dpdk.org/api/patches/132370/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20231007104730.441719-1-qi.z.zhang@intel.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": "<20231007104730.441719-1-qi.z.zhang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231007104730.441719-1-qi.z.zhang@intel.com",
    "date": "2023-10-07T10:47:30",
    "name": "[v4] app/testpmd: enable cli for programmable action",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "b43841d57582665a67c3d05a3f9454ae65e0bc7d",
    "submitter": {
        "id": 504,
        "url": "https://patches.dpdk.org/api/people/504/?format=api",
        "name": "Qi Zhang",
        "email": "qi.z.zhang@intel.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/20231007104730.441719-1-qi.z.zhang@intel.com/mbox/",
    "series": [
        {
            "id": 29757,
            "url": "https://patches.dpdk.org/api/series/29757/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=29757",
            "date": "2023-10-07T10:47:30",
            "name": "[v4] app/testpmd: enable cli for programmable action",
            "version": 4,
            "mbox": "https://patches.dpdk.org/series/29757/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/132370/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/132370/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 9704F426D6;\n\tSat,  7 Oct 2023 04:27:37 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 6C605402BF;\n\tSat,  7 Oct 2023 04:27:37 +0200 (CEST)",
            "from mgamail.intel.com (mgamail.intel.com [192.55.52.43])\n by mails.dpdk.org (Postfix) with ESMTP id B4BCC402A7\n for <dev@dpdk.org>; Sat,  7 Oct 2023 04:27:34 +0200 (CEST)",
            "from orsmga002.jf.intel.com ([10.7.209.21])\n by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 06 Oct 2023 19:27:14 -0700",
            "from dpdk-qzhan15-test02.sh.intel.com ([10.67.115.37])\n by orsmga002.jf.intel.com with ESMTP; 06 Oct 2023 19:27:10 -0700"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1696645655; x=1728181655;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=r1CxDF4QLU0eOArrl0mxLb4fLNdNK0Z1R051NeKAVY8=;\n b=m0ks4kNd69qpiQKhfMKT+g5T3+2jedLCKka35DBPywrDkvWedeBaXpw1\n HprP3pmqwpdbFGXHEDS3PAWY108htuxMe69D1AuL9xyvi8dmcoI+vaLJT\n Q4hj26JNOiquhr+9Prbx0oLNCZk/0eNKNMRHp75yjbAygAOPhOJSGnKQi\n /cspmLu31kso08gqjtZ1jlUTnymmzK513lofKMvsAbyC11VrhBe3bPqSg\n NTqbhK2n70s/9zNhisyL1/Z5KKKi7QHo67KnFI1q1bsZUO3ozY7EVlgTx\n xZN+nxUVKgxo6+YzssDCW8CL4OLYdbXeTGUElpVg8P2crUqzfherivOaz Q==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6600,9927,10855\"; a=\"470147564\"",
            "E=Sophos;i=\"6.03,204,1694761200\"; d=\"scan'208\";a=\"470147564\"",
            "E=McAfee;i=\"6600,9927,10855\"; a=\"752381200\"",
            "E=Sophos;i=\"6.03,204,1694761200\"; d=\"scan'208\";a=\"752381200\""
        ],
        "X-ExtLoop1": "1",
        "From": "Qi Zhang <qi.z.zhang@intel.com>",
        "To": "aman.deep.singh@intel.com,\n\tyuying.zhang@intel.com",
        "Cc": "dev@dpdk.org, cristian.dumitrescu@intel.com, orika@nvidia.com,\n ferruh.yigit@amd.com, Qi Zhang <qi.z.zhang@intel.com>",
        "Subject": "[PATCH v4] app/testpmd: enable cli for programmable action",
        "Date": "Sat,  7 Oct 2023 06:47:30 -0400",
        "Message-Id": "<20231007104730.441719-1-qi.z.zhang@intel.com>",
        "X-Mailer": "git-send-email 2.31.1",
        "In-Reply-To": "<20231005100246.242970-1-qi.z.zhang@intel.com>",
        "References": "<20231005100246.242970-1-qi.z.zhang@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Parsing command line for rte_flow_action_prog.\n\nSyntax:\n\n\"prog name <name> [arguments <arg_name_0> <arg_value_0> \\\n <arg_name_1> <arg_value1> ... end]\"\n\nUse parse_string0 to parse name string.\nUse parse_hex to parse hex string.\nUse struct action_prog_data to store parsed result.\n\nExample:\n\nAction with 2 arguments:\n\n\"prog name action0 arguments field0 03FF field1 55AA end\"\n\nAction without argument:\n\n\"prog name action1\"\n\nSigned-off-by: Qi Zhang <qi.z.zhang@intel.com>\n---\n\nv4:\n- be more generous on the max size of name and value.\n\nv3:\n- refine struct action_prog_data\n- enlarge the max size\n\nv2:\n- fix title\n- minor coding style refine.\n\n app/test-pmd/cmdline_flow.c | 232 ++++++++++++++++++++++++++++++++++++\n 1 file changed, 232 insertions(+)",
    "diff": "diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c\nindex 21828c144c..ae5556e704 100644\n--- a/app/test-pmd/cmdline_flow.c\n+++ b/app/test-pmd/cmdline_flow.c\n@@ -719,6 +719,13 @@ enum index {\n \tACTION_IPV6_EXT_PUSH,\n \tACTION_IPV6_EXT_PUSH_INDEX,\n \tACTION_IPV6_EXT_PUSH_INDEX_VALUE,\n+\tACTION_PROG,\n+\tACTION_PROG_NAME,\n+\tACTION_PROG_NAME_STRING,\n+\tACTION_PROG_ARGUMENTS,\n+\tACTION_PROG_ARG_NAME,\n+\tACTION_PROG_ARG_VALUE,\n+\tACTION_PROG_ARG_END,\n };\n \n /** Maximum size for pattern in struct rte_flow_item_raw. */\n@@ -749,6 +756,23 @@ struct action_rss_data {\n \tuint16_t queue[ACTION_RSS_QUEUE_NUM];\n };\n \n+#define ACTION_PROG_NAME_SIZE_MAX 256\n+#define ACTION_PROG_ARG_NUM_MAX 16\n+#define ACTION_PROG_ARG_VALUE_SIZE_MAX 64\n+\n+/** Storage for struct rte_flow_action_prog including external data. */\n+struct action_prog_data {\n+\tstruct rte_flow_action_prog conf;\n+\tstruct {\n+\t\tchar name[ACTION_PROG_NAME_SIZE_MAX];\n+\t\tstruct rte_flow_action_prog_argument args[ACTION_PROG_ARG_NUM_MAX];\n+\t\tstruct {\n+\t\t\tchar names[ACTION_PROG_NAME_SIZE_MAX];\n+\t\t\tuint8_t value[ACTION_PROG_ARG_VALUE_SIZE_MAX];\n+\t\t} arg_data[ACTION_PROG_ARG_NUM_MAX];\n+\t} data;\n+};\n+\n /** Maximum data size in struct rte_flow_action_raw_encap. */\n #define ACTION_RAW_ENCAP_MAX_DATA 512\n #define RAW_ENCAP_CONFS_MAX_NUM 8\n@@ -2169,6 +2193,7 @@ static const enum index next_action[] = {\n \tACTION_QUOTA_QU,\n \tACTION_IPV6_EXT_REMOVE,\n \tACTION_IPV6_EXT_PUSH,\n+\tACTION_PROG,\n \tZERO,\n };\n \n@@ -2510,6 +2535,13 @@ static const enum index action_represented_port[] = {\n \tZERO,\n };\n \n+static const enum index action_prog[] = {\n+\tACTION_PROG_NAME,\n+\tACTION_PROG_ARGUMENTS,\n+\tACTION_NEXT,\n+\tZERO,\n+};\n+\n static int parse_set_raw_encap_decap(struct context *, const struct token *,\n \t\t\t\t     const char *, unsigned int,\n \t\t\t\t     void *, unsigned int);\n@@ -2786,6 +2818,18 @@ static int\n parse_qu_mode_name(struct context *ctx, const struct token *token,\n \t\t   const char *str, unsigned int len, void *buf,\n \t\t   unsigned int size);\n+static int\n+parse_vc_action_prog(struct context *, const struct token *,\n+\t\t     const char *, unsigned int, void *,\n+\t\t     unsigned int);\n+static int\n+parse_vc_action_prog_arg_name(struct context *, const struct token *,\n+\t\t\t      const char *, unsigned int, void *,\n+\t\t\t      unsigned int);\n+static int\n+parse_vc_action_prog_arg_value(struct context *, const struct token *,\n+\t\t\t       const char *, unsigned int, void *,\n+\t\t\t       unsigned int);\n static int comp_none(struct context *, const struct token *,\n \t\t     unsigned int, char *, unsigned int);\n static int comp_boolean(struct context *, const struct token *,\n@@ -7518,6 +7562,48 @@ static const struct token token_list[] = {\n \t\t.args = ARGS(ARGS_ENTRY(struct rte_flow_item_tx_queue,\n \t\t\t\t\ttx_queue)),\n \t},\n+\t[ACTION_PROG] = {\n+\t\t.name = \"prog\",\n+\t\t.help = \"match a programmable action\",\n+\t\t.priv = PRIV_ACTION(PROG, sizeof(struct action_prog_data)),\n+\t\t.next = NEXT(action_prog),\n+\t\t.call = parse_vc_action_prog,\n+\t},\n+\t[ACTION_PROG_NAME] = {\n+\t\t.name = \"name\",\n+\t\t.help = \"programble action name\",\n+\t\t.next = NEXT(action_prog, NEXT_ENTRY(ACTION_PROG_NAME_STRING)),\n+\t\t.args = ARGS(ARGS_ENTRY(struct action_prog_data, data.name)),\n+\t},\n+\t[ACTION_PROG_NAME_STRING] = {\n+\t\t.name = \"{string}\",\n+\t\t.type = \"STRING\",\n+\t\t.help = \"programmable action name string\",\n+\t\t.call = parse_string0,\n+\t},\n+\t[ACTION_PROG_ARGUMENTS] = {\n+\t\t.name = \"arguments\",\n+\t\t.help = \"programmable action name\",\n+\t\t.next = NEXT(action_prog, NEXT_ENTRY(ACTION_PROG_ARG_NAME)),\n+\t\t.call = parse_vc_conf,\n+\t},\n+\t[ACTION_PROG_ARG_NAME] = {\n+\t\t.name = \"{string}\",\n+\t\t.help = \"programmable action argument name\",\n+\t\t.next = NEXT(NEXT_ENTRY(ACTION_PROG_ARG_VALUE)),\n+\t\t.call = parse_vc_action_prog_arg_name,\n+\t},\n+\t[ACTION_PROG_ARG_VALUE] = {\n+\t\t.name = \"{hex}\",\n+\t\t.help = \"programmable action argument value\",\n+\t\t.next = NEXT(NEXT_ENTRY(ACTION_PROG_ARG_END, ACTION_PROG_ARG_NAME)),\n+\t\t.call = parse_vc_action_prog_arg_value,\n+\t},\n+\t[ACTION_PROG_ARG_END] = {\n+\t\t.name = \"end\",\n+\t\t.help = \"end of the programmable action arguments\",\n+\t},\n+\n };\n \n /** Remove and return last entry from argument stack. */\n@@ -11675,6 +11761,152 @@ parse_qu_mode_name(struct context *ctx, const struct token *token,\n \t\t\t\t   (uint32_t *)&out->args.ia.qu_mode);\n }\n \n+/** Parse prog action. */\n+static int\n+parse_vc_action_prog(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+\tstruct buffer *out = buf;\n+\tstruct rte_flow_action *action;\n+\tstruct action_prog_data *action_prog_data;\n+\tuint16_t i;\n+\tint ret;\n+\n+\tret = parse_vc(ctx, token, str, len, buf, size);\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n+\tif (!out)\n+\t\treturn ret;\n+\n+\tif (!out->args.vc.actions_n)\n+\t\treturn -1;\n+\n+\taction = &out->args.vc.actions[out->args.vc.actions_n - 1];\n+\tctx->object = out->args.vc.data;\n+\taction_prog_data = ctx->object;\n+\t*action_prog_data = (struct action_prog_data) {\n+\t\t.conf = (struct rte_flow_action_prog) {\n+\t\t\t.args_num = 0,\n+\t\t\t.name = action_prog_data->data.name,\n+\t\t\t.args = action_prog_data->data.args,\n+\t\t},\n+\t};\n+\n+\tfor (i = 0; i < ACTION_PROG_ARG_NUM_MAX; ++i)\n+\t\taction_prog_data->data.args[i].name = action_prog_data->data.arg_data[i].names;\n+\taction->conf = &action_prog_data->conf;\n+\n+\treturn ret;\n+}\n+\n+static int\n+parse_vc_action_prog_arg_name(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+{\n+\tstruct action_prog_data *action_prog_data;\n+\tstruct buffer *out = buf;\n+\tconst struct arg *arg;\n+\tuint32_t i;\n+\tint ret;\n+\n+\t(void)token;\n+\t(void)buf;\n+\t(void)size;\n+\tif (ctx->curr != ACTION_PROG_ARG_NAME)\n+\t\treturn -1;\n+\n+\tif (!out)\n+\t\treturn len;\n+\n+\taction_prog_data = (void *)out->args.vc.data;\n+\ti = action_prog_data->conf.args_num;\n+\n+\tif (i >= ACTION_PROG_ARG_NUM_MAX)\n+\t\treturn -1;\n+\n+\targ = ARGS_ENTRY_ARB(offsetof(struct action_prog_data,\n+\t\t\t\t      data.arg_data[i].names),\n+\t\t\t     ACTION_PROG_NAME_SIZE_MAX);\n+\n+\tif (push_args(ctx, arg))\n+\t\treturn -1;\n+\n+\tret = parse_string0(ctx, token, str, len, NULL, 0);\n+\tif (ret < 0) {\n+\t\tpop_args(ctx);\n+\t\treturn -1;\n+\t}\n+\n+\treturn len;\n+}\n+\n+static int\n+parse_vc_action_prog_arg_value(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+{\n+\tstruct action_prog_data *action_prog_data;\n+\tconst struct arg *arg_addr;\n+\tconst struct arg *arg_size;\n+\tconst struct arg *arg_data;\n+\tstruct buffer *out = buf;\n+\tuint32_t i;\n+\tint ret;\n+\n+\t(void)token;\n+\t(void)buf;\n+\t(void)size;\n+\tif (ctx->curr != ACTION_PROG_ARG_VALUE)\n+\t\treturn -1;\n+\n+\tif (!out)\n+\t\treturn len;\n+\n+\taction_prog_data = (void *)out->args.vc.data;\n+\ti = action_prog_data->conf.args_num;\n+\n+\targ_addr  = ARGS_ENTRY_ARB(offsetof(struct action_prog_data,\n+\t\t\t\t\t    data.args[i].value),\n+\t\t\t\t   sizeof(action_prog_data->data.args[i].value));\n+\n+\targ_size = ARGS_ENTRY_ARB(offsetof(struct action_prog_data,\n+\t\t\t\t\t   data.args[i].size),\n+\t\t\t\t   sizeof(action_prog_data->data.args[i].size));\n+\n+\targ_data = ARGS_ENTRY_ARB(offsetof(struct action_prog_data,\n+\t\t\t\t\t   data.arg_data[i].value),\n+\t\t\t\t  ACTION_PROG_ARG_VALUE_SIZE_MAX);\n+\n+\tif (push_args(ctx, arg_addr))\n+\t\treturn -1;\n+\n+\tif (push_args(ctx, arg_size)) {\n+\t\tpop_args(ctx);\n+\t\treturn -1;\n+\t}\n+\n+\tif (push_args(ctx, arg_data)) {\n+\t\tpop_args(ctx);\n+\t\tpop_args(ctx);\n+\t\treturn -1;\n+\t}\n+\n+\tret = parse_hex(ctx, token, str, len, NULL, 0);\n+\tif (ret < 0) {\n+\t\tpop_args(ctx);\n+\t\tpop_args(ctx);\n+\t\tpop_args(ctx);\n+\t\treturn -1;\n+\t}\n+\n+\taction_prog_data->conf.args_num++;\n+\n+\treturn len;\n+}\n+\n /** No completion. */\n static int\n comp_none(struct context *ctx, const struct token *token,\n",
    "prefixes": [
        "v4"
    ]
}