[PATCH v1 1/1] app/testpmd: allow appending to flow dump file

Anatoly Burakov anatoly.burakov at intel.com
Thu Apr 30 11:38:46 CEST 2026


When dumping flows into a file, allow appending to file rather than erasing
it and creating a new one.

Also, to disambiguate between "mode" in terms of appending, and "mode" in
terms of one vs. all flows, rename `mode` variable.

Signed-off-by: Anatoly Burakov <anatoly.burakov at intel.com>
---
 app/test-pmd/cmdline_flow.c | 45 ++++++++++++++++++++++++++++++++-----
 app/test-pmd/config.c       |  4 ++--
 app/test-pmd/testpmd.h      |  2 +-
 3 files changed, 42 insertions(+), 9 deletions(-)

diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index ebc036b14b..67f200f2e3 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -267,7 +267,10 @@ enum index {
 	DUMP_ALL,
 	DUMP_ONE,
 	DUMP_IS_USER_ID,
+	DUMP_FILE_PATH,
 
+	DUMP_WRITE,
+	DUMP_APPEND,
 	/* Configure arguments */
 	CONFIG_QUEUES_NUMBER,
 	CONFIG_QUEUES_SIZE,
@@ -1263,8 +1266,9 @@ struct buffer {
 		} destroy; /**< Destroy arguments. */
 		struct {
 			char file[128];
-			bool mode;
+			bool dump_all;
 			uint64_t rule;
+			bool append_to_file;
 			bool is_user_id;
 		} dump; /**< Dump arguments. */
 		struct {
@@ -1550,8 +1554,7 @@ static const enum index next_destroy_attr[] = {
 };
 
 static const enum index next_dump_attr[] = {
-	COMMON_FILE_PATH,
-	END,
+	DUMP_FILE_PATH,
 	ZERO,
 };
 
@@ -4296,6 +4299,27 @@ static const struct token token_list[] = {
 		.next = NEXT(next_dump_subcmd),
 		.call = parse_dump,
 	},
+	[DUMP_FILE_PATH] = {
+		.name = "{file path}",
+		.type = "STRING",
+		.help = "file path",
+		.next = NEXT(NEXT_ENTRY(DUMP_WRITE, DUMP_APPEND, END)),
+		.args = ARGS(ARGS_ENTRY(struct buffer, args.dump.file)),
+		.call = parse_string0,
+		.comp = comp_none,
+	},
+	[DUMP_WRITE] = {
+		.name = "write",
+		.help = "open file in write mode (default)",
+		.next = NEXT(NEXT_ENTRY(END)),
+		.call = parse_dump,
+	},
+	[DUMP_APPEND] = {
+		.name = "append",
+		.help = "open file in append mode",
+		.next = NEXT(NEXT_ENTRY(END)),
+		.call = parse_dump,
+	},
 	/* Query arguments. */
 	[QUERY_ACTION] = {
 		.name = "{action}",
@@ -10733,7 +10757,9 @@ parse_dump(struct context *ctx, const struct token *token,
 	switch (ctx->curr) {
 	case DUMP_ALL:
 	case DUMP_ONE:
-		out->args.dump.mode = (ctx->curr == DUMP_ALL) ? true : false;
+		out->args.dump.dump_all = (ctx->curr == DUMP_ALL) ? true : false;
+		/* don't append to file by default */
+		out->args.dump.append_to_file = false;
 		out->command = ctx->curr;
 		ctx->objdata = 0;
 		ctx->object = out;
@@ -10742,6 +10768,12 @@ parse_dump(struct context *ctx, const struct token *token,
 	case DUMP_IS_USER_ID:
 		out->args.dump.is_user_id = true;
 		return len;
+	case DUMP_WRITE:
+		out->args.dump.append_to_file = false;
+		return len;
+	case DUMP_APPEND:
+		out->args.dump.append_to_file = true;
+		return len;
 	default:
 		return -1;
 	}
@@ -13579,9 +13611,10 @@ cmd_flow_parsed(const struct buffer *in)
 		break;
 	case DUMP_ONE:
 	case DUMP_ALL:
-		port_flow_dump(in->port, in->args.dump.mode,
+		port_flow_dump(in->port, in->args.dump.dump_all,
 				in->args.dump.rule, in->args.dump.file,
-				in->args.dump.is_user_id);
+				in->args.dump.is_user_id,
+				in->args.dump.append_to_file);
 		break;
 	case QUERY:
 		port_flow_query(in->port, in->args.query.rule,
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 32c885de0b..c950793aaf 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -4162,7 +4162,7 @@ port_flow_flush(portid_t port_id)
 /** Dump flow rules. */
 int
 port_flow_dump(portid_t port_id, bool dump_all, uint64_t rule_id,
-		const char *file_name, bool is_user_id)
+		const char *file_name, bool is_user_id, bool append_to_file)
 {
 	int ret = 0;
 	FILE *file = stdout;
@@ -4198,7 +4198,7 @@ port_flow_dump(portid_t port_id, bool dump_all, uint64_t rule_id,
 	}
 
 	if (file_name && strlen(file_name)) {
-		file = fopen(file_name, "w");
+		file = fopen(file_name, append_to_file ? "a" : "w");
 		if (!file) {
 			fprintf(stderr, "Failed to create file %s: %s\n",
 				file_name, strerror(errno));
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 9b60ebd7fc..1a54535470 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -1085,7 +1085,7 @@ int port_flow_update(portid_t port_id, uint32_t rule,
 int port_flow_flush(portid_t port_id);
 int port_flow_dump(portid_t port_id, bool dump_all,
 			uint64_t rule, const char *file_name,
-			bool is_user_id);
+			bool is_user_id, bool file_mode);
 int port_flow_query(portid_t port_id, uint64_t rule,
 		    const struct rte_flow_action *action, bool is_user_id);
 void port_flow_list(portid_t port_id, uint32_t n, const uint32_t *group);
-- 
2.47.3



More information about the dev mailing list