[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