app/flow-perf: add destination ports parameter
Checks
Commit Message
Add destination ports(dst-ports) parameter for port-id action,
the parameter is only valid for port-id action. The parameter is not
Must, and the value is 1 by default as before if not provided.
For example:
$ dpdk-test-flow-perf -w 08:00.0,representor=[0,1] -- --transfer \
> --ingress --transfer --ether --portmask=0x2 --vxlan-encap \
> --port-id --dst-ports=0
This command means the rule created on representor 0 with port 0
as destination, since the portmask is 0x2 and dst-ports is 0:
$ dpdk-test-flow-perf -w 08:00.0,representor=[0,1] \
> -w 08:00.1,representor=[0,1]-- --transfer --ingress --transfer \
> --ether --portmask=0x12 --vxlan-encap --port-id --dst-ports=0,3
This command means the rules created on both representor 0 of PF 0
and PF 1, the destination port for the first represontor is PF 0,
and the destination port for the other one it PF 1.
Signed-off-by: Sean Zhang <xiazhang@nvidia.com>
---
app/test-flow-perf/actions_gen.c | 7 +++--
app/test-flow-perf/actions_gen.h | 2 +-
app/test-flow-perf/flow_gen.c | 3 +-
app/test-flow-perf/flow_gen.h | 1 +
app/test-flow-perf/main.c | 48 ++++++++++++++++++++++++++++----
doc/guides/tools/flow-perf.rst | 6 ++++
6 files changed, 58 insertions(+), 9 deletions(-)
Comments
Hi,
> -----Original Message-----
> From: Sean Zhang (Networking SW) <xiazhang@nvidia.com>
> Sent: Tuesday, October 12, 2021 6:43 AM
> To: NBU-Contact-Thomas Monjalon <thomas@monjalon.net>; Wisam
> Monther <wisamm@nvidia.com>
> Cc: dev@dpdk.org; Raslan Darawsheh <rasland@nvidia.com>
> Subject: [PATCH] app/flow-perf: add destination ports parameter
>
> Add destination ports(dst-ports) parameter for port-id action, the parameter
> is only valid for port-id action. The parameter is not Must, and the value is 1
> by default as before if not provided.
>
> For example:
>
> $ dpdk-test-flow-perf -w 08:00.0,representor=[0,1] -- --transfer \
> > --ingress --transfer --ether --portmask=0x2 --vxlan-encap \ --port-id
> > --dst-ports=0
>
> This command means the rule created on representor 0 with port 0 as
> destination, since the portmask is 0x2 and dst-ports is 0:
>
> $ dpdk-test-flow-perf -w 08:00.0,representor=[0,1] \
> > -w 08:00.1,representor=[0,1]-- --transfer --ingress --transfer \
> > --ether --portmask=0x12 --vxlan-encap --port-id --dst-ports=0,3
>
> This command means the rules created on both representor 0 of PF 0 and PF
> 1, the destination port for the first represontor is PF 0, and the destination
> port for the other one it PF 1.
>
> Signed-off-by: Sean Zhang <xiazhang@nvidia.com>
Reviewed-by: Wisam Jaddo <wisamm@nvidia.com>
BRs,
Wisam Jaddo
Hi,
> -----Original Message-----
> From: Sean Zhang (Networking SW) <xiazhang@nvidia.com>
> Sent: Tuesday, October 12, 2021 6:43 AM
> To: NBU-Contact-Thomas Monjalon <thomas@monjalon.net>; Wisam
> Monther <wisamm@nvidia.com>
> Cc: dev@dpdk.org; Raslan Darawsheh <rasland@nvidia.com>
> Subject: [PATCH] app/flow-perf: add destination ports parameter
>
> Add destination ports(dst-ports) parameter for port-id action, the parameter
> is only valid for port-id action. The parameter is not Must, and the value is 1
> by default as before if not provided.
>
> For example:
>
> $ dpdk-test-flow-perf -w 08:00.0,representor=[0,1] -- --transfer \
> > --ingress --transfer --ether --portmask=0x2 --vxlan-encap \ --port-id
> > --dst-ports=0
>
> This command means the rule created on representor 0 with port 0 as
> destination, since the portmask is 0x2 and dst-ports is 0:
>
> $ dpdk-test-flow-perf -w 08:00.0,representor=[0,1] \
> > -w 08:00.1,representor=[0,1]-- --transfer --ingress --transfer \
> > --ether --portmask=0x12 --vxlan-encap --port-id --dst-ports=0,3
>
> This command means the rules created on both representor 0 of PF 0 and PF
> 1, the destination port for the first represontor is PF 0, and the destination
> port for the other one it PF 1.
>
> Signed-off-by: Sean Zhang <xiazhang@nvidia.com>
Do you think it's applicable to use the same option?
I mean, usage:
--port-id: means default.
--port-id=N,M: use the parsing ports?
BRs,
Wisam Jaddo
Hi Wisam,
> -----Original Message-----
> From: Wisam Monther <wisamm@nvidia.com>
> Sent: Tuesday, October 12, 2021 3:53 PM
> To: Sean Zhang (Networking SW) <xiazhang@nvidia.com>; NBU-Contact-
> Thomas Monjalon <thomas@monjalon.net>
> Cc: dev@dpdk.org; Raslan Darawsheh <rasland@nvidia.com>
> Subject: RE: [PATCH] app/flow-perf: add destination ports parameter
>
> Hi,
>
> > -----Original Message-----
> > From: Sean Zhang (Networking SW) <xiazhang@nvidia.com>
> > Sent: Tuesday, October 12, 2021 6:43 AM
> > To: NBU-Contact-Thomas Monjalon <thomas@monjalon.net>; Wisam
> Monther
> > <wisamm@nvidia.com>
> > Cc: dev@dpdk.org; Raslan Darawsheh <rasland@nvidia.com>
> > Subject: [PATCH] app/flow-perf: add destination ports parameter
> >
> > Add destination ports(dst-ports) parameter for port-id action, the
> > parameter is only valid for port-id action. The parameter is not Must,
> > and the value is 1 by default as before if not provided.
> >
> > For example:
> >
> > $ dpdk-test-flow-perf -w 08:00.0,representor=[0,1] -- --transfer \
> > > --ingress --transfer --ether --portmask=0x2 --vxlan-encap \
> > > --port-id
> > > --dst-ports=0
> >
> > This command means the rule created on representor 0 with port 0 as
> > destination, since the portmask is 0x2 and dst-ports is 0:
> >
> > $ dpdk-test-flow-perf -w 08:00.0,representor=[0,1] \
> > > -w 08:00.1,representor=[0,1]-- --transfer --ingress --transfer \
> > > --ether --portmask=0x12 --vxlan-encap --port-id --dst-ports=0,3
> >
> > This command means the rules created on both representor 0 of PF 0 and
> > PF 1, the destination port for the first represontor is PF 0, and the
> > destination port for the other one it PF 1.
> >
> > Signed-off-by: Sean Zhang <xiazhang@nvidia.com>
>
> Do you think it's applicable to use the same option?
> I mean, usage:
> --port-id: means default.
> --port-id=N,M: use the parsing ports?
Yes, since the argument can be optional, your suggestion is applicable. So do you suggest to change to --port-id=N,M?
>
> BRs,
> Wisam Jaddo
> -----Original Message-----
> From: Sean Zhang (Networking SW) <xiazhang@nvidia.com>
> Sent: Tuesday, October 12, 2021 11:14 AM
> To: Wisam Monther <wisamm@nvidia.com>; NBU-Contact-Thomas
> Monjalon <thomas@monjalon.net>
> Cc: dev@dpdk.org; Raslan Darawsheh <rasland@nvidia.com>
> Subject: RE: [PATCH] app/flow-perf: add destination ports parameter
>
> Hi Wisam,
>
> > -----Original Message-----
> > From: Wisam Monther <wisamm@nvidia.com>
> > Sent: Tuesday, October 12, 2021 3:53 PM
> > To: Sean Zhang (Networking SW) <xiazhang@nvidia.com>; NBU-Contact-
> > Thomas Monjalon <thomas@monjalon.net>
> > Cc: dev@dpdk.org; Raslan Darawsheh <rasland@nvidia.com>
> > Subject: RE: [PATCH] app/flow-perf: add destination ports parameter
> >
> > Hi,
> >
> > > -----Original Message-----
> > > From: Sean Zhang (Networking SW) <xiazhang@nvidia.com>
> > > Sent: Tuesday, October 12, 2021 6:43 AM
> > > To: NBU-Contact-Thomas Monjalon <thomas@monjalon.net>; Wisam
> > Monther
> > > <wisamm@nvidia.com>
> > > Cc: dev@dpdk.org; Raslan Darawsheh <rasland@nvidia.com>
> > > Subject: [PATCH] app/flow-perf: add destination ports parameter
> > >
> > > Add destination ports(dst-ports) parameter for port-id action, the
> > > parameter is only valid for port-id action. The parameter is not
> > > Must, and the value is 1 by default as before if not provided.
> > >
> > > For example:
> > >
> > > $ dpdk-test-flow-perf -w 08:00.0,representor=[0,1] -- --transfer \
> > > > --ingress --transfer --ether --portmask=0x2 --vxlan-encap \
> > > > --port-id
> > > > --dst-ports=0
> > >
> > > This command means the rule created on representor 0 with port 0 as
> > > destination, since the portmask is 0x2 and dst-ports is 0:
> > >
> > > $ dpdk-test-flow-perf -w 08:00.0,representor=[0,1] \
> > > > -w 08:00.1,representor=[0,1]-- --transfer --ingress --transfer \
> > > > --ether --portmask=0x12 --vxlan-encap --port-id --dst-ports=0,3
> > >
> > > This command means the rules created on both representor 0 of PF 0
> > > and PF 1, the destination port for the first represontor is PF 0,
> > > and the destination port for the other one it PF 1.
> > >
> > > Signed-off-by: Sean Zhang <xiazhang@nvidia.com>
> >
> > Do you think it's applicable to use the same option?
> > I mean, usage:
> > --port-id: means default.
> > --port-id=N,M: use the parsing ports?
>
> Yes, since the argument can be optional, your suggestion is applicable. So do
> you suggest to change to --port-id=N,M?
Yes after 2end look, it make more sense to remove the dependency of two options for same action.
>
> >
> > BRs,
> > Wisam Jaddo
> -----Original Message-----
> From: Wisam Monther <wisamm@nvidia.com>
> Sent: Tuesday, October 12, 2021 4:16 PM
> To: Sean Zhang (Networking SW) <xiazhang@nvidia.com>; NBU-Contact-
> Thomas Monjalon <thomas@monjalon.net>
> Cc: dev@dpdk.org; Raslan Darawsheh <rasland@nvidia.com>
> Subject: RE: [PATCH] app/flow-perf: add destination ports parameter
>
>
>
> > -----Original Message-----
> > From: Sean Zhang (Networking SW) <xiazhang@nvidia.com>
> > Sent: Tuesday, October 12, 2021 11:14 AM
> > To: Wisam Monther <wisamm@nvidia.com>; NBU-Contact-Thomas
> Monjalon
> > <thomas@monjalon.net>
> > Cc: dev@dpdk.org; Raslan Darawsheh <rasland@nvidia.com>
> > Subject: RE: [PATCH] app/flow-perf: add destination ports parameter
> >
> > Hi Wisam,
> >
> > > -----Original Message-----
> > > From: Wisam Monther <wisamm@nvidia.com>
> > > Sent: Tuesday, October 12, 2021 3:53 PM
> > > To: Sean Zhang (Networking SW) <xiazhang@nvidia.com>; NBU-Contact-
> > > Thomas Monjalon <thomas@monjalon.net>
> > > Cc: dev@dpdk.org; Raslan Darawsheh <rasland@nvidia.com>
> > > Subject: RE: [PATCH] app/flow-perf: add destination ports parameter
> > >
> > > Hi,
> > >
> > > > -----Original Message-----
> > > > From: Sean Zhang (Networking SW) <xiazhang@nvidia.com>
> > > > Sent: Tuesday, October 12, 2021 6:43 AM
> > > > To: NBU-Contact-Thomas Monjalon <thomas@monjalon.net>; Wisam
> > > Monther
> > > > <wisamm@nvidia.com>
> > > > Cc: dev@dpdk.org; Raslan Darawsheh <rasland@nvidia.com>
> > > > Subject: [PATCH] app/flow-perf: add destination ports parameter
> > > >
> > > > Add destination ports(dst-ports) parameter for port-id action, the
> > > > parameter is only valid for port-id action. The parameter is not
> > > > Must, and the value is 1 by default as before if not provided.
> > > >
> > > > For example:
> > > >
> > > > $ dpdk-test-flow-perf -w 08:00.0,representor=[0,1] -- --transfer \
> > > > > --ingress --transfer --ether --portmask=0x2 --vxlan-encap \
> > > > > --port-id
> > > > > --dst-ports=0
> > > >
> > > > This command means the rule created on representor 0 with port 0
> > > > as destination, since the portmask is 0x2 and dst-ports is 0:
> > > >
> > > > $ dpdk-test-flow-perf -w 08:00.0,representor=[0,1] \
> > > > > -w 08:00.1,representor=[0,1]-- --transfer --ingress --transfer \
> > > > > --ether --portmask=0x12 --vxlan-encap --port-id --dst-ports=0,3
> > > >
> > > > This command means the rules created on both representor 0 of PF 0
> > > > and PF 1, the destination port for the first represontor is PF 0,
> > > > and the destination port for the other one it PF 1.
> > > >
> > > > Signed-off-by: Sean Zhang <xiazhang@nvidia.com>
> > >
> > > Do you think it's applicable to use the same option?
> > > I mean, usage:
> > > --port-id: means default.
> > > --port-id=N,M: use the parsing ports?
> >
> > Yes, since the argument can be optional, your suggestion is
> > applicable. So do you suggest to change to --port-id=N,M?
>
> Yes after 2end look, it make more sense to remove the dependency of two
> options for same action.
OK, I will update the patch.
Thanks,
Sean
>
> >
> > >
> > > BRs,
> > > Wisam Jaddo
@@ -29,6 +29,7 @@ struct additional_para {
uint32_t counter;
uint64_t encap_data;
uint64_t decap_data;
+ uint16_t dst_port;
uint8_t core_idx;
bool unique_data;
};
@@ -171,12 +172,13 @@ add_set_tag(struct rte_flow_action *actions,
static void
add_port_id(struct rte_flow_action *actions,
uint8_t actions_counter,
- __rte_unused struct additional_para para)
+ struct additional_para para)
{
static struct rte_flow_action_port_id port_id = {
.id = PORT_ID_DST,
};
+ port_id.id = para.dst_port;
actions[actions_counter].type = RTE_FLOW_ACTION_TYPE_PORT_ID;
actions[actions_counter].conf = &port_id;
}
@@ -909,7 +911,7 @@ void
fill_actions(struct rte_flow_action *actions, uint64_t *flow_actions,
uint32_t counter, uint16_t next_table, uint16_t hairpinq,
uint64_t encap_data, uint64_t decap_data, uint8_t core_idx,
- bool unique_data)
+ bool unique_data, uint16_t dst_port)
{
struct additional_para additional_para_data;
uint8_t actions_counter = 0;
@@ -933,6 +935,7 @@ fill_actions(struct rte_flow_action *actions, uint64_t *flow_actions,
.decap_data = decap_data,
.core_idx = core_idx,
.unique_data = unique_data,
+ .dst_port = dst_port,
};
if (hairpinq != 0) {
@@ -20,6 +20,6 @@
void fill_actions(struct rte_flow_action *actions, uint64_t *flow_actions,
uint32_t counter, uint16_t next_table, uint16_t hairpinq,
uint64_t encap_data, uint64_t decap_data, uint8_t core_idx,
- bool unique_data);
+ bool unique_data, uint16_t dst_port);
#endif /* FLOW_PERF_ACTION_GEN */
@@ -45,6 +45,7 @@ generate_flow(uint16_t port_id,
uint16_t hairpinq,
uint64_t encap_data,
uint64_t decap_data,
+ uint16_t dst_port,
uint8_t core_idx,
bool unique_data,
struct rte_flow_error *error)
@@ -63,7 +64,7 @@ generate_flow(uint16_t port_id,
fill_actions(actions, flow_actions,
outer_ip_src, next_table, hairpinq,
encap_data, decap_data, core_idx,
- unique_data);
+ unique_data, dst_port);
fill_items(items, flow_items, outer_ip_src, core_idx);
@@ -34,6 +34,7 @@ generate_flow(uint16_t port_id,
uint16_t hairpinq,
uint64_t encap_data,
uint64_t decap_data,
+ uint16_t dst_port,
uint8_t core_idx,
bool unique_data,
struct rte_flow_error *error);
@@ -56,6 +56,7 @@ static uint64_t flow_attrs[MAX_ATTRS_NUM];
static uint8_t items_idx, actions_idx, attrs_idx;
static uint64_t ports_mask;
+static uint16_t dst_ports[RTE_MAX_ETHPORTS];
static volatile bool force_quit;
static bool dump_iterations;
static bool delete_flag;
@@ -163,6 +164,7 @@ usage(char *progname)
printf("To set flow actions:\n");
printf(" --port-id: add port-id action in flow actions\n");
+ printf(" --dst-ports=N,M: add destination ports in port-id action\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");
@@ -219,6 +221,21 @@ usage(char *progname)
printf(" --vxlan-decap: add vxlan_decap action to flow actions\n");
}
+static inline int
+has_port_id(void)
+{
+ int i;
+
+ for (i = 0; i < MAX_ACTIONS_NUM; ++i) {
+ if (flow_actions[i] == 0)
+ break;
+ if (flow_actions[i]
+ & FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_PORT_ID))
+ return 1;
+ }
+ return 0;
+}
+
static void
args_parse(int argc, char **argv)
{
@@ -572,6 +589,7 @@ args_parse(int argc, char **argv)
{ "enable-fwd", 0, 0, 0 },
{ "unique-data", 0, 0, 0 },
{ "portmask", 1, 0, 0 },
+ { "dst-ports", 1, 0, 0 },
{ "cores", 1, 0, 0 },
/* Attributes */
{ "ingress", 0, 0, 0 },
@@ -633,6 +651,9 @@ args_parse(int argc, char **argv)
RTE_ETH_FOREACH_DEV(i)
ports_mask |= 1 << i;
+ for (i = 0; i < RTE_MAX_ETHPORTS; i++)
+ dst_ports[i] = PORT_ID_DST;
+
hairpin_queues_num = 0;
argvopt = argv;
@@ -787,6 +808,22 @@ args_parse(int argc, char **argv)
rte_exit(EXIT_FAILURE, "Invalid fwd port mask\n");
ports_mask = pm;
}
+ if (strcmp(lgopts[opt_idx].name,
+ "dst-ports") == 0) {
+ uint16_t port_idx = 0;
+ char *token;
+
+ if (!has_port_id())
+ rte_exit(EXIT_FAILURE,
+ "Error: need add port-id action first\n"
+ "dst-ports only can be used for port-id action\n");
+
+ token = strtok(optarg, ",");
+ while (token != NULL) {
+ dst_ports[port_idx++] = atoi(token);
+ token = strtok(NULL, ",");
+ }
+ }
if (strcmp(lgopts[opt_idx].name, "cores") == 0) {
n = atoi(optarg);
if ((int) rte_lcore_count() <= n) {
@@ -1128,7 +1165,7 @@ destroy_flows(int port_id, uint8_t core_id, struct rte_flow **flows_list)
}
static struct rte_flow **
-insert_flows(int port_id, uint8_t core_id)
+insert_flows(int port_id, uint8_t core_id, uint16_t dst_port_id)
{
struct rte_flow **flows_list;
struct rte_flow_error error;
@@ -1173,8 +1210,8 @@ insert_flows(int port_id, uint8_t core_id)
* group 0 eth / end actions jump group <flow_group>
*/
flow = generate_flow(port_id, 0, flow_attrs,
- global_items, global_actions,
- flow_group, 0, 0, 0, 0, core_id, unique_data, &error);
+ global_items, global_actions, flow_group, 0, 0, 0, 0,
+ dst_port_id, core_id, unique_data, &error);
if (flow == NULL) {
print_flow_error(error);
@@ -1189,7 +1226,7 @@ insert_flows(int port_id, uint8_t core_id)
flow_attrs, flow_items, flow_actions,
JUMP_ACTION_TABLE, counter,
hairpin_queues_num,
- encap_data, decap_data,
+ encap_data, decap_data, dst_port_id,
core_id, unique_data, &error);
if (!counter) {
@@ -1250,6 +1287,7 @@ static void
flows_handler(uint8_t core_id)
{
struct rte_flow **flows_list;
+ uint16_t port_idx = 0;
uint16_t nr_ports;
int port_id;
@@ -1269,7 +1307,7 @@ flows_handler(uint8_t core_id)
mc_pool.last_alloc[core_id] = (int64_t)dump_socket_mem(stdout);
if (has_meter())
meters_handler(port_id, core_id, METER_CREATE);
- flows_list = insert_flows(port_id, core_id);
+ flows_list = insert_flows(port_id, core_id, dst_ports[port_idx++]);
if (flows_list == NULL)
rte_exit(EXIT_FAILURE, "Error: Insertion Failed!\n");
mc_pool.current_alloc[core_id] = (int64_t)dump_socket_mem(stdout);
@@ -96,6 +96,12 @@ The command line options are:
* ``--portmask=N``
hexadecimal bitmask of ports to be used.
+* ``--dst-ports=N,M``
+ Destination ports for ports with port-id action, the number of values
+ must be the same with number of set bits in portmask, and the parameter
+ is only valid for port-id action. The parameter is not MUST, the value
+ is by default 1 as before if not provided.
+
* ``--cores=N``
Set the number of needed cores to insert/delete rte_flow rules.
Default cores count is 1.