Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/132355/?format=api
http://patches.dpdk.org/api/patches/132355/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/patch/20231006110714.338910-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": "<20231006110714.338910-1-qi.z.zhang@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20231006110714.338910-1-qi.z.zhang@intel.com", "date": "2023-10-06T11:07:14", "name": "[v3] app/testpmd: enable cli for programmable action", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "0f368d14d4554630e1754cd8ffa9b8351e056b53", "submitter": { "id": 504, "url": "http://patches.dpdk.org/api/people/504/?format=api", "name": "Qi Zhang", "email": "qi.z.zhang@intel.com" }, "delegate": { "id": 319, "url": "http://patches.dpdk.org/api/users/319/?format=api", "username": "fyigit", "first_name": "Ferruh", "last_name": "Yigit", "email": "ferruh.yigit@amd.com" }, "mbox": "http://patches.dpdk.org/project/dpdk/patch/20231006110714.338910-1-qi.z.zhang@intel.com/mbox/", "series": [ { "id": 29749, "url": "http://patches.dpdk.org/api/series/29749/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=29749", "date": "2023-10-06T11:07:14", "name": "[v3] app/testpmd: enable cli for programmable action", "version": 3, "mbox": "http://patches.dpdk.org/series/29749/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/132355/comments/", "check": "fail", "checks": "http://patches.dpdk.org/api/patches/132355/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 3BEBB426C9;\n\tFri, 6 Oct 2023 04:47:01 +0200 (CEST)", "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id CE6CF402AF;\n\tFri, 6 Oct 2023 04:47:00 +0200 (CEST)", "from mgamail.intel.com (mgamail.intel.com [192.55.52.115])\n by mails.dpdk.org (Postfix) with ESMTP id E0A27402A8\n for <dev@dpdk.org>; Fri, 6 Oct 2023 04:46:59 +0200 (CEST)", "from fmsmga007.fm.intel.com ([10.253.24.52])\n by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 05 Oct 2023 19:46:58 -0700", "from dpdk-qzhan15-test02.sh.intel.com ([10.67.115.37])\n by fmsmga007.fm.intel.com with ESMTP; 05 Oct 2023 19:46:56 -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=1696560420; x=1728096420;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=gAJNGget5+QaGTu37CUvBVAi+1QWtfV+eW3IZDJB75Q=;\n b=IyYA8xnqf7xWmUQ58JpN4HyD/uPWDH+i6tZR2QqrsO48Q3fx0NkDCkzD\n kMQIjhqxGK3X0l+nQOWHFp/3KcCbVql9hlIYraUDWFf4oG/3u8WLqjs6g\n zoyblr/g78nAfY+cOgmxB9+QNRumCDBTzZHfMsLR1eyOHn5qfATJ2oo3a\n XrQ/K4y37JbLkMjnly2+Ra+wc6SUh+YhcnQUaPvu7rSjkof4RW4E9ouFm\n wLrnt+i79PlBHnU9bV4L4A7dAB/4p7Z9d3H11uEcMfJnDA2QU59niuSP2\n nZIizJTCb97k/Nnm09pF/i3Mwm5VpNTDrVWFsKGGF+h8mZGqA/BxKKzq8 g==;", "X-IronPort-AV": [ "E=McAfee;i=\"6600,9927,10854\"; a=\"383560624\"", "E=Sophos;i=\"6.03,203,1694761200\"; d=\"scan'208\";a=\"383560624\"", "E=McAfee;i=\"6600,9927,10854\"; a=\"755706612\"", "E=Sophos;i=\"6.03,203,1694761200\"; d=\"scan'208\";a=\"755706612\"" ], "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 v3] app/testpmd: enable cli for programmable action", "Date": "Fri, 6 Oct 2023 07:07:14 -0400", "Message-Id": "<20231006110714.338910-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\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..7b40b988ae 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 32\n+#define ACTION_PROG_ARG_NUM_MAX 16\n+#define ACTION_PROG_ARG_VALUE_SIZE_MAX 32\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": [ "v3" ] }{ "id": 132355, "url": "