* [PATCH] app/flow-perf: add represented-port and port-representor flow actions
@ 2026-07-01 15:04 Hadi Sandid
2026-07-02 8:56 ` [PATCH v2] app/flow-perf: add represented-port/port-representor actions Hadi Sandid
0 siblings, 1 reply; 2+ messages in thread
From: Hadi Sandid @ 2026-07-01 15:04 UTC (permalink / raw)
To: wisamm; +Cc: dev, Hadi Sandid
Add 'represented-port' and 'port-representor' action support,
and update documentation.
Signed-off-by: Hadi Sandid <hadisandid@gmail.com>
---
.mailmap | 1 +
app/test-flow-perf/actions_gen.c | 36 ++++++++++++++++++++++++++++++++
app/test-flow-perf/main.c | 21 +++++++++++++++++--
doc/guides/tools/flow-perf.rst | 20 ++++++++++++++++++
4 files changed, 76 insertions(+), 2 deletions(-)
diff --git a/.mailmap b/.mailmap
index c5bc728fae..c51b14fbda 100644
--- a/.mailmap
+++ b/.mailmap
@@ -557,6 +557,7 @@ Guruprasad Rao <guruprasadx.rao@intel.com>
Guy Kaneti <guyk@marvell.com>
Guy Tzalik <gtzalik@amazon.com>
H. Peter Anvin <hpa@linux.intel.com>
+Hadi Sandid <hadisandid@gmail.com>
Haggai Eran <haggaie@nvidia.com>
Haifei Luo <haifeil@nvidia.com>
Haifeng Gao <gaohaifeng.gao@huawei.com>
diff --git a/app/test-flow-perf/actions_gen.c b/app/test-flow-perf/actions_gen.c
index 9d102e3af4..4a17349f92 100644
--- a/app/test-flow-perf/actions_gen.c
+++ b/app/test-flow-perf/actions_gen.c
@@ -187,6 +187,34 @@ add_port_id(struct rte_flow_action *actions,
actions[actions_counter].conf = &port_id;
}
+static void
+add_represented_port(struct rte_flow_action *actions,
+ uint8_t actions_counter,
+ struct additional_para para)
+{
+ static struct rte_flow_action_ethdev represented_port = {
+ .port_id = PORT_ID_DST,
+ };
+
+ represented_port.port_id = para.dst_port;
+ actions[actions_counter].type = RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT;
+ actions[actions_counter].conf = &represented_port;
+}
+
+static void
+add_port_representor(struct rte_flow_action *actions,
+ uint8_t actions_counter,
+ struct additional_para para)
+{
+ static struct rte_flow_action_ethdev port_representor = {
+ .port_id = PORT_ID_DST,
+ };
+
+ port_representor.port_id = para.dst_port;
+ actions[actions_counter].type = RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR;
+ actions[actions_counter].conf = &port_representor;
+}
+
static void
add_drop(struct rte_flow_action *actions,
uint8_t actions_counter,
@@ -1102,6 +1130,14 @@ fill_actions(struct rte_flow_action *actions, uint64_t *flow_actions,
.mask = FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_PORT_ID),
.funct = add_port_id
},
+ {
+ .mask = FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT),
+ .funct = add_represented_port,
+ },
+ {
+ .mask = FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR),
+ .funct = add_port_representor,
+ },
{
.mask = FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_DROP),
.funct = add_drop,
diff --git a/app/test-flow-perf/main.c b/app/test-flow-perf/main.c
index 6636d1517f..8147d41d4b 100644
--- a/app/test-flow-perf/main.c
+++ b/app/test-flow-perf/main.c
@@ -267,6 +267,18 @@ static const struct option_dict {
.map = &flow_actions[0],
.map_idx = &actions_idx
},
+ {
+ .str = "represented-port",
+ .mask = FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT),
+ .map = &flow_actions[0],
+ .map_idx = &actions_idx
+ },
+ {
+ .str = "port-representor",
+ .mask = FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR),
+ .map = &flow_actions[0],
+ .map_idx = &actions_idx
+ },
{
.str = "rss",
.mask = FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_RSS),
@@ -542,6 +554,8 @@ usage(char *progname)
printf("To set flow actions:\n");
printf(" --port-id: add port-id action in flow actions\n");
+ printf(" --represented-port: add represented-port action in flow actions\n");
+ printf(" --port-representor: add port-representor action in flow actions\n");
printf(" --rss: add rss action in flow actions\n");
printf(" --queue: add queue action in flow actions\n");
printf(" --jump: add jump action in flow actions\n");
@@ -699,6 +713,8 @@ args_parse(int argc, char **argv)
{ "icmpv6", 0, 0, 0 },
/* Actions */
{ "port-id", 2, 0, 0 },
+ { "represented-port", 2, 0, 0 },
+ { "port-representor", 2, 0, 0 },
{ "rss", 0, 0, 0 },
{ "queue", 0, 0, 0 },
{ "jump", 0, 0, 0 },
@@ -913,8 +929,9 @@ args_parse(int argc, char **argv)
rte_exit(EXIT_FAILURE, "Invalid hairpin config mask\n");
hairpin_conf_mask = hp_conf;
}
- if (strcmp(lgopts[opt_idx].name,
- "port-id") == 0) {
+ if (strcmp(lgopts[opt_idx].name, "port-id") == 0 ||
+ strcmp(lgopts[opt_idx].name, "represented-port") == 0 ||
+ strcmp(lgopts[opt_idx].name, "port-representor") == 0) {
uint16_t port_idx = 0;
token = strtok(optarg, ",");
diff --git a/doc/guides/tools/flow-perf.rst b/doc/guides/tools/flow-perf.rst
index 657f06fec7..7f97a9940d 100644
--- a/doc/guides/tools/flow-perf.rst
+++ b/doc/guides/tools/flow-perf.rst
@@ -248,6 +248,26 @@ Actions:
specify the destination port, the number of values should be
the same with number of set bits in portmask.
+* ``--represented-port``
+ Add represented port redirection action to all flows actions.
+ Port redirection destination is defined in config.h under
+ PORT_ID_DST, default value = 1.
+
+ It can also have an optional parameter like
+ --represented-port=N[,M] to specify the destination port. The
+ number of values should be the same as the number of set bits in
+ portmask.
+
+* ``--port-representor``
+ Add port representor redirection action to all flows actions.
+ Port redirection destination is defined in config.h under
+ PORT_ID_DST, default value = 1.
+
+ It can also have an optional parameter like
+ --port-representor=N[,M] to specify the destination port. The
+ number of values should be the same as the number of set bits in
+ portmask.
+
* ``--rss``
Add RSS action to all flows actions,
The queues in RSS action will be all queues configured
--
2.43.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [PATCH v2] app/flow-perf: add represented-port/port-representor actions
2026-07-01 15:04 [PATCH] app/flow-perf: add represented-port and port-representor flow actions Hadi Sandid
@ 2026-07-02 8:56 ` Hadi Sandid
0 siblings, 0 replies; 2+ messages in thread
From: Hadi Sandid @ 2026-07-02 8:56 UTC (permalink / raw)
To: wisamm; +Cc: dev, Hadi Sandid
Add 'represented-port' and 'port-representor' action support,
and update documentation.
Signed-off-by: Hadi Sandid <hadisandid@gmail.com>
---
v2:
- use per-lcore port-action configurations during concurrent flow creation
- clarify port redirection actions and destination option handling
.mailmap | 1 +
app/test-flow-perf/actions_gen.c | 46 ++++++++++++++++++++++++++++----
app/test-flow-perf/main.c | 31 ++++++++++++++++-----
doc/guides/tools/flow-perf.rst | 42 ++++++++++++++++++++++++-----
4 files changed, 102 insertions(+), 18 deletions(-)
diff --git a/.mailmap b/.mailmap
index c5bc728fae..c51b14fbda 100644
--- a/.mailmap
+++ b/.mailmap
@@ -557,6 +557,7 @@ Guruprasad Rao <guruprasadx.rao@intel.com>
Guy Kaneti <guyk@marvell.com>
Guy Tzalik <gtzalik@amazon.com>
H. Peter Anvin <hpa@linux.intel.com>
+Hadi Sandid <hadisandid@gmail.com>
Haggai Eran <haggaie@nvidia.com>
Haifei Luo <haifeil@nvidia.com>
Haifeng Gao <gaohaifeng.gao@huawei.com>
diff --git a/app/test-flow-perf/actions_gen.c b/app/test-flow-perf/actions_gen.c
index 9d102e3af4..2a1fca9d7a 100644
--- a/app/test-flow-perf/actions_gen.c
+++ b/app/test-flow-perf/actions_gen.c
@@ -178,13 +178,41 @@ add_port_id(struct rte_flow_action *actions,
uint8_t actions_counter,
struct additional_para para)
{
- static struct rte_flow_action_port_id port_id = {
- .id = PORT_ID_DST,
- };
+ static alignas(RTE_CACHE_LINE_SIZE)
+ struct rte_flow_action_port_id port_ids[RTE_MAX_LCORE];
+ uint8_t ti = para.core_idx;
- port_id.id = para.dst_port;
+ port_ids[ti].id = para.dst_port;
actions[actions_counter].type = RTE_FLOW_ACTION_TYPE_PORT_ID;
- actions[actions_counter].conf = &port_id;
+ actions[actions_counter].conf = &port_ids[ti];
+}
+
+static void
+add_represented_port(struct rte_flow_action *actions,
+ uint8_t actions_counter,
+ struct additional_para para)
+{
+ static alignas(RTE_CACHE_LINE_SIZE)
+ struct rte_flow_action_ethdev represented_ports[RTE_MAX_LCORE];
+ uint8_t ti = para.core_idx;
+
+ represented_ports[ti].port_id = para.dst_port;
+ actions[actions_counter].type = RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT;
+ actions[actions_counter].conf = &represented_ports[ti];
+}
+
+static void
+add_port_representor(struct rte_flow_action *actions,
+ uint8_t actions_counter,
+ struct additional_para para)
+{
+ static alignas(RTE_CACHE_LINE_SIZE)
+ struct rte_flow_action_ethdev port_representors[RTE_MAX_LCORE];
+ uint8_t ti = para.core_idx;
+
+ port_representors[ti].port_id = para.dst_port;
+ actions[actions_counter].type = RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR;
+ actions[actions_counter].conf = &port_representors[ti];
}
static void
@@ -1102,6 +1130,14 @@ fill_actions(struct rte_flow_action *actions, uint64_t *flow_actions,
.mask = FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_PORT_ID),
.funct = add_port_id
},
+ {
+ .mask = FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT),
+ .funct = add_represented_port,
+ },
+ {
+ .mask = FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR),
+ .funct = add_port_representor,
+ },
{
.mask = FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_DROP),
.funct = add_drop,
diff --git a/app/test-flow-perf/main.c b/app/test-flow-perf/main.c
index 6636d1517f..646caccfda 100644
--- a/app/test-flow-perf/main.c
+++ b/app/test-flow-perf/main.c
@@ -267,6 +267,18 @@ static const struct option_dict {
.map = &flow_actions[0],
.map_idx = &actions_idx
},
+ {
+ .str = "represented-port",
+ .mask = FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT),
+ .map = &flow_actions[0],
+ .map_idx = &actions_idx
+ },
+ {
+ .str = "port-representor",
+ .mask = FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR),
+ .map = &flow_actions[0],
+ .map_idx = &actions_idx
+ },
{
.str = "rss",
.mask = FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_RSS),
@@ -542,6 +554,8 @@ usage(char *progname)
printf("To set flow actions:\n");
printf(" --port-id: add port-id action in flow actions\n");
+ printf(" --represented-port: add represented-port action in flow actions\n");
+ printf(" --port-representor: add port-representor action in flow actions\n");
printf(" --rss: add rss action in flow actions\n");
printf(" --queue: add queue action in flow actions\n");
printf(" --jump: add jump action in flow actions\n");
@@ -699,6 +713,8 @@ args_parse(int argc, char **argv)
{ "icmpv6", 0, 0, 0 },
/* Actions */
{ "port-id", 2, 0, 0 },
+ { "represented-port", 2, 0, 0 },
+ { "port-representor", 2, 0, 0 },
{ "rss", 0, 0, 0 },
{ "queue", 0, 0, 0 },
{ "jump", 0, 0, 0 },
@@ -913,14 +929,17 @@ args_parse(int argc, char **argv)
rte_exit(EXIT_FAILURE, "Invalid hairpin config mask\n");
hairpin_conf_mask = hp_conf;
}
- if (strcmp(lgopts[opt_idx].name,
- "port-id") == 0) {
+ if (strcmp(lgopts[opt_idx].name, "port-id") == 0 ||
+ strcmp(lgopts[opt_idx].name, "represented-port") == 0 ||
+ strcmp(lgopts[opt_idx].name, "port-representor") == 0) {
uint16_t port_idx = 0;
- token = strtok(optarg, ",");
- while (token != NULL) {
- dst_ports[port_idx++] = atoi(token);
- token = strtok(NULL, ",");
+ if (optarg != NULL) {
+ token = strtok(optarg, ",");
+ while (token != NULL) {
+ dst_ports[port_idx++] = atoi(token);
+ token = strtok(NULL, ",");
+ }
}
}
if (strcmp(lgopts[opt_idx].name, "rxq") == 0) {
diff --git a/doc/guides/tools/flow-perf.rst b/doc/guides/tools/flow-perf.rst
index 657f06fec7..aecbb846e3 100644
--- a/doc/guides/tools/flow-perf.rst
+++ b/doc/guides/tools/flow-perf.rst
@@ -240,13 +240,41 @@ Items:
Actions:
* ``--port-id``
- Add port redirection action to all flows actions.
- Port redirection destination is defined in user_parameters.h
- under PORT_ID_DST, default value = 1.
-
- It can also has optional parameter like --port-id=N[,M] to
- specify the destination port, the number of values should be
- the same with number of set bits in portmask.
+ Add an action that redirects matching traffic to a DPDK port ID.
+ As this action is deprecated; prefer ``--represented-port`` or
+ ``--port-representor`` for embedded-switch flows when supported by
+ the PMD.
+ Port redirection destination is defined in config.h under
+ PORT_ID_DST, default value = 1.
+
+ Without an argument, ``PORT_ID_DST`` is used for each source port.
+ With ``--port-id=N[,M]``, the values override the destination for
+ enabled source ports in ``--portmask`` order; provide one value for
+ each set bit in the port mask.
+
+* ``--represented-port``
+ At the embedded-switch level, add an action that redirects matching
+ traffic to the entity represented by the specified ethdev. Use this
+ action when the destination is the represented entity.
+ Port redirection destination is defined in config.h under
+ PORT_ID_DST, default value = 1.
+
+ Without an argument, ``PORT_ID_DST`` is used for each source port.
+ With ``--represented-port=N[,M]``, the values override the destination
+ for enabled source ports in ``--portmask`` order; provide one value
+ for each set bit in the port mask.
+
+* ``--port-representor``
+ At the embedded-switch level, add an action that redirects matching
+ traffic to the specified ethdev. Use this action when the destination
+ is the ethdev rather than the entity it represents.
+ Port redirection destination is defined in config.h under
+ PORT_ID_DST, default value = 1.
+
+ Without an argument, ``PORT_ID_DST`` is used for each source port.
+ With ``--port-representor=N[,M]``, the values override the destination
+ for enabled source ports in ``--portmask`` order; provide one value
+ for each set bit in the port mask.
* ``--rss``
Add RSS action to all flows actions,
--
2.43.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-07-02 8:57 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-01 15:04 [PATCH] app/flow-perf: add represented-port and port-representor flow actions Hadi Sandid
2026-07-02 8:56 ` [PATCH v2] app/flow-perf: add represented-port/port-representor actions Hadi Sandid
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.