Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/132308/?format=api
http://patches.dpdk.org/api/patches/132308/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/patch/20231005100246.242970-1-qi.z.zhang@intel.com/", "project": { "id": 1, "url": "http://patches.dpdk.org/api/projects/1/?format=api", "name": "DPDK", "link_name": "dpdk", "list_id": "dev.dpdk.org", "list_email": "dev@dpdk.org", "web_url": "http://core.dpdk.org", "scm_url": "git://dpdk.org/dpdk", "webscm_url": "http://git.dpdk.org/dpdk", "list_archive_url": "https://inbox.dpdk.org/dev", "list_archive_url_format": "https://inbox.dpdk.org/dev/{}", "commit_url_format": "" }, "msgid": "<20231005100246.242970-1-qi.z.zhang@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20231005100246.242970-1-qi.z.zhang@intel.com", "date": "2023-10-05T10:02:46", "name": "[1/2] app/testpmd: enable cli for programmable action", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "bcda434df1b5226fd3a5bf4bac4aa9cd69871ad8", "submitter": { "id": 504, "url": "http://patches.dpdk.org/api/people/504/?format=api", "name": "Qi Zhang", "email": "qi.z.zhang@intel.com" }, "delegate": null, "mbox": "http://patches.dpdk.org/project/dpdk/patch/20231005100246.242970-1-qi.z.zhang@intel.com/mbox/", "series": [ { "id": 29738, "url": "http://patches.dpdk.org/api/series/29738/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=29738", "date": "2023-10-05T10:02:46", "name": "[1/2] app/testpmd: enable cli for programmable action", "version": 1, "mbox": "http://patches.dpdk.org/series/29738/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/132308/comments/", "check": "success", "checks": "http://patches.dpdk.org/api/patches/132308/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 B2A37426BA;\n\tThu, 5 Oct 2023 03:50:33 +0200 (CEST)", "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 387C14028A;\n\tThu, 5 Oct 2023 03:50:33 +0200 (CEST)", "from mgamail.intel.com (mgamail.intel.com [134.134.136.126])\n by mails.dpdk.org (Postfix) with ESMTP id 79B4440283\n for <dev@dpdk.org>; Thu, 5 Oct 2023 03:50:31 +0200 (CEST)", "from orsmga002.jf.intel.com ([10.7.209.21])\n by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 04 Oct 2023 18:42:32 -0700", "from dpdk-qzhan15-test02.sh.intel.com ([10.67.115.37])\n by orsmga002.jf.intel.com with ESMTP; 04 Oct 2023 18:42:29 -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=1696470631; x=1728006631;\n h=from:to:cc:subject:date:message-id:mime-version:\n content-transfer-encoding;\n bh=kSLf6Cmrc5r/ydzx/db+N++tGYCaAWQQ0Mq3cKDM+2o=;\n b=VkEUO8mSpoutyWH0SKoBgWKQ0inkknmhhqXKT19tVz2wL+C/lUbKI9xh\n rMvX02bJPDNY0/IW819jVRjEOlwwMrY5NVx158BvkyzAMNwBmO1dAZIkq\n iW7/Xd42wv852HOzCCYxvrdtEuZSDMpAU458xE2Axfhq7Npvf3Z4jDpN6\n eybIg3XZSBVDtUluK6w5fguTnoICNKSaBWLkPtte3qOa0q/OlzumVapOk\n 1YbwxQuxgDvQ4Y8j5TEq0Vw02plD+a0sphK1AYHGcPu8+CUbim7k0FAQk\n efb7dd97EgF2GEr4+7PJhfM+oqkC1ceOSQ+IbXJZdkaU0aYRtqHB/gks/ A==;", "X-IronPort-AV": [ "E=McAfee;i=\"6600,9927,10853\"; a=\"368432988\"", "E=Sophos;i=\"6.03,201,1694761200\"; d=\"scan'208\";a=\"368432988\"", "E=McAfee;i=\"6600,9927,10853\"; a=\"751591497\"", "E=Sophos;i=\"6.03,201,1694761200\"; d=\"scan'208\";a=\"751591497\"" ], "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 1/2] app/testpmd: enable cli for programmable action", "Date": "Thu, 5 Oct 2023 06:02:46 -0400", "Message-Id": "<20231005100246.242970-1-qi.z.zhang@intel.com>", "X-Mailer": "git-send-email 2.31.1", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-BeenThere": "dev@dpdk.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "DPDK patches and discussions <dev.dpdk.org>", "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>", "List-Archive": "<http://mails.dpdk.org/archives/dev/>", "List-Post": "<mailto:dev@dpdk.org>", "List-Help": "<mailto:dev-request@dpdk.org?subject=help>", "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>", "Errors-To": "dev-bounces@dpdk.org" }, "content": "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 app/test-pmd/cmdline_flow.c | 223 ++++++++++++++++++++++++++++++++++++\n 1 file changed, 223 insertions(+)", "diff": "diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c\nindex 21828c144c..028cff0150 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,19 @@ struct action_rss_data {\n \tuint16_t queue[ACTION_RSS_QUEUE_NUM];\n };\n \n+#define ACTION_PROG_NAME_SIZE_MAX 32\n+#define ACTION_PROG_ARG_NUM_MAX 8\n+#define ACTION_PROG_ARG_VALUE_SIZE_MAX 16\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+\tchar name[ACTION_PROG_NAME_SIZE_MAX];\n+\tstruct rte_flow_action_prog_argument args[ACTION_PROG_ARG_NUM_MAX];\n+\tchar arg_names[ACTION_PROG_ARG_NUM_MAX][ACTION_PROG_NAME_SIZE_MAX];\n+\tuint8_t value[ACTION_PROG_ARG_NUM_MAX][ACTION_PROG_ARG_VALUE_SIZE_MAX];\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 +2189,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 +2531,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 +2814,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 +7558,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, 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 +11757,147 @@ 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+\t/* Nothing else to do if there is no buffer. */\n+\tif (!out)\n+\t\treturn ret;\n+\tif (!out->args.vc.actions_n)\n+\t\treturn -1;\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->name,\n+\t\t\t.args = action_prog_data->args,\n+\t\t},\n+\t};\n+\tfor (i = 0; i < ACTION_PROG_ARG_NUM_MAX; ++i)\n+\t\taction_prog_data->args[i].name = action_prog_data->arg_names[i];\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, arg_names) +\n+\t\t\t\t i * ACTION_PROG_NAME_SIZE_MAX,\n+\t\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, args) +\n+\t\t\t\t i * sizeof(struct rte_flow_action_prog_argument) +\n+\t\t\t\t offsetof(struct rte_flow_action_prog_argument, value),\n+\t\t\t\t sizeof(action_prog_data->args[i].value));\n+\n+\targ_size = ARGS_ENTRY_ARB(offsetof(struct action_prog_data, args) +\n+\t\t\t\t\t i * sizeof(struct rte_flow_action_prog_argument) +\n+\t\t\t\t\t offsetof(struct rte_flow_action_prog_argument, size),\n+\t\t\t\t\t sizeof(action_prog_data->args[i].size));\n+\n+\targ_data = ARGS_ENTRY_ARB(offsetof(struct action_prog_data, value) +\n+\t\t\t\t\t i * ACTION_PROG_ARG_VALUE_SIZE_MAX,\n+\t\t\t\t\t ACTION_PROG_ARG_VALUE_SIZE_MAX);\n+\n+\tif (push_args(ctx, arg_addr))\n+\t\treturn -1;\n+\tif (push_args(ctx, arg_size)) {\n+\t\tpop_args(ctx);\n+\t\treturn -1;\n+\t}\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+\taction_prog_data->conf.args_num++;\n+\treturn len;\n+}\n+\n /** No completion. */\n static int\n comp_none(struct context *ctx, const struct token *token,\n", "prefixes": [ "1/2" ] }{ "id": 132308, "url": "