[dpdk-dev,v3,1/2] app/testpmd: add custom topology command
Checks
Commit Message
Set custom topology for forwading packets by making the
given two ports as pair, in custom topology the active
ports will be the defiend in custum-topo only.
This command will be useful in testing, when special
topology is needed.
usage:
testpmd> set custom-topo (port_id_1) (port_id_2)
Signed-off-by: Wisam Jaddo <wisamm@mellanox.com>
---
app/test-pmd/cmdline.c | 49 +++++++++++++++++++++++++++++
app/test-pmd/config.c | 41 ++++++++++++++++++++++++
app/test-pmd/parameters.c | 6 ++--
app/test-pmd/testpmd.h | 8 ++++-
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 8 +++++
5 files changed, 109 insertions(+), 3 deletions(-)
Comments
Hi Wisam,
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Wisam Jaddo
> Sent: Wednesday, May 9, 2018 1:47 PM
> To: Wu, Jingjing <jingjing.wu@intel.com>; Lu, Wenzhuo
> <wenzhuo.lu@intel.com>; thomas@monjalon.net
> Cc: rasland@mellanox.com; dev@dpdk.org; shahafs@mellanox.com;
> wisamm@mellanox.com
> Subject: [dpdk-dev] [PATCH v3 1/2] app/testpmd: add custom topology
> command
>
> Set custom topology for forwading packets by making the given two ports as
> pair, in custom topology the active ports will be the defiend in custum-topo
> only.
>
> This command will be useful in testing, when special topology is needed.
>
> usage:
> testpmd> set custom-topo (port_id_1) (port_id_2)
>
> Signed-off-by: Wisam Jaddo <wisamm@mellanox.com>
> ---
> app/test-pmd/cmdline.c | 49
> +++++++++++++++++++++++++++++
> app/test-pmd/config.c | 41 ++++++++++++++++++++++++
> app/test-pmd/parameters.c | 6 ++--
> app/test-pmd/testpmd.h | 8 ++++-
> doc/guides/testpmd_app_ug/testpmd_funcs.rst | 8 +++++
> 5 files changed, 109 insertions(+), 3 deletions(-)
>
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
> 9615670..9d48048 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -466,6 +466,9 @@ static void cmd_help_long_parsed(void
> *parsed_result,
> "set eth-peer (port_id) (peer_addr)\n"
> " set the peer address for certain port.\n\n"
>
> + "set custom-topo (port_id_1) (port_id_2)\n"
> + " set custom topo.\n\n"
> +
> "set port (port_id) uta (mac_address|all) (on|off)\n"
> " Add/Remove a or all unicast hash filter(s)"
> "from port X.\n\n"
> @@ -7649,6 +7652,51 @@ cmdline_parse_inst_t cmd_set_fwd_eth_peer = {
> },
> };
>
> +/* *** SET CUSTOM TOPO FOR CERTAIN PORT *** */ struct
> +cmd_custom_topo_result {
> + cmdline_fixed_string_t set;
> + cmdline_fixed_string_t custom_topo;
> + portid_t port_id_1;
> + portid_t port_id_2;
> +};
> +
> +static void cmd_set_custom_topo_parsed(void *parsed_result,
> + __attribute__((unused)) struct cmdline *cl,
> + __attribute__((unused)) void *data) {
> + struct cmd_custom_topo_result *res = parsed_result;
> +
> + if (test_done == 0) {
> + printf("Please stop forwarding first\n");
> + return;
> + }
> + if (!strcmp(res->custom_topo, "custom-topo")) {
> + set_custom_topo(res->port_id_1, res->port_id_2);
> + fwd_config_setup();
> + }
> +}
> +cmdline_parse_token_string_t cmd_set_custom_topo_set =
> + TOKEN_STRING_INITIALIZER(struct cmd_custom_topo_result, set,
> "set");
> +cmdline_parse_token_string_t cmd_set_custom_topo_custom_topo =
> + TOKEN_STRING_INITIALIZER(struct cmd_custom_topo_result,
> custom_topo,
> +"custom-topo"); cmdline_parse_token_num_t
> cmd_set_custom_topo_port_id_1 =
> + TOKEN_NUM_INITIALIZER(struct cmd_custom_topo_result,
> port_id_1,
> +UINT16); cmdline_parse_token_num_t cmd_set_custom_topo_port_id_2
> =
> + TOKEN_NUM_INITIALIZER(struct cmd_custom_topo_result,
> port_id_2,
> +UINT16);
> +
> +cmdline_parse_inst_t cmd_set_custom_topo = {
> + .f = cmd_set_custom_topo_parsed,
> + .data = NULL,
> + .help_str = "set custom-topo (port_id_1) (port_id_2)",
> + .tokens = {
> + (void *)&cmd_set_custom_topo_set,
> + (void *)&cmd_set_custom_topo_custom_topo,
> + (void *)&cmd_set_custom_topo_port_id_1,
> + (void *)&cmd_set_custom_topo_port_id_2,
> + NULL,
> + },
> +};
> +
> /* *** CONFIGURE QUEUE STATS COUNTER MAPPINGS *** */ struct
> cmd_set_qmap_result {
> cmdline_fixed_string_t set;
> @@ -16540,6 +16588,7 @@ cmdline_parse_ctx_t main_ctx[] = {
> (cmdline_parse_inst_t *)&cmd_stop,
> (cmdline_parse_inst_t *)&cmd_mac_addr,
> (cmdline_parse_inst_t *)&cmd_set_fwd_eth_peer,
> + (cmdline_parse_inst_t *)&cmd_set_custom_topo,
> (cmdline_parse_inst_t *)&cmd_set_qmap,
> (cmdline_parse_inst_t *)&cmd_set_xstats_hide_zero,
> (cmdline_parse_inst_t *)&cmd_operate_port, diff --git a/app/test-
> pmd/config.c b/app/test-pmd/config.c index 16fc481..23799ad 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -2069,6 +2069,8 @@ fwd_topology_tx_port_get(portid_t rxp)
> return (rxp + 1) % cur_fwd_config.nb_fwd_ports;
> case PORT_TOPOLOGY_LOOP:
> return rxp;
> + case PORT_TOPOLOGY_CUSTOM:
> + return fwd_streams[rxp]->tx_port;
> }
> }
>
> @@ -2378,6 +2380,45 @@ set_fwd_eth_peer(portid_t port_id, char
> *peer_addr)
> new_peer_addr[c];
> }
>
> +static void
> +print_ports_range(void)
> +{
> + portid_t pid;
> + printf("Valid port range is [");
> + RTE_ETH_FOREACH_DEV(pid)
> + printf(", %d", pid);
> + printf("]\n");
> +}
> +
> +void
> +set_custom_topo(portid_t port_id_1, portid_t port_id_2) {
> + unsigned int portlist[RTE_MAX_ETHPORTS];
> + unsigned int i;
> + unsigned int nb_pt = 0;
> + if (port_topology != PORT_TOPOLOGY_CUSTOM) {
> + printf("Please set the forward topology to custom first.\n");
> + return;
> + }
> + if (port_id_is_invalid(port_id_1, ENABLED_WARN)) {
> + print_ports_range();
> + return;
> + }
> + if (port_id_is_invalid(port_id_2, ENABLED_WARN)) {
> + print_ports_range();
> + return;
> + }
> + fwd_streams[port_id_1]->tx_port = port_id_2;
> + fwd_streams[port_id_2]->tx_port = port_id_1;
> + fwd_ports[port_id_1] = port_id_1;
> + fwd_ports[port_id_2] = port_id_2;
> +
> + for (i = 0; i < RTE_MAX_ETHPORTS; i++)
> + if (fwd_ports[i] == i)
> + portlist[nb_pt++] = i;
> + set_fwd_ports_list(portlist, nb_pt);
> +}
> +
> int
> set_fwd_lcores_list(unsigned int *lcorelist, unsigned int nb_lc) { diff --git
> a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index
> aea8af8..0db411d 100644
> --- a/app/test-pmd/parameters.c
> +++ b/app/test-pmd/parameters.c
> @@ -139,8 +139,8 @@ usage(char* progname)
> printf(" --enable-hw-vlan-extend: enable hardware vlan
> extend.\n");
> printf(" --enable-drop-en: enable per queue packet drop.\n");
> printf(" --disable-rss: disable rss.\n");
> - printf(" --port-topology=N: set port topology (N: paired (default) or "
> - "chained).\n");
> + printf(" --port-topology=N: set port topology (N: paired (default)"
> + "(loop), (custom) or (chained).\n");
> printf(" --forward-mode=N: set forwarding mode (N: %s).\n",
> list_pkt_forwarding_modes());
> printf(" --rss-ip: set RSS functions to IPv4/IPv6 only .\n"); @@ -920,6
> +920,8 @@ launch_args_parse(int argc, char** argv)
> port_topology =
> PORT_TOPOLOGY_CHAINED;
> else if (!strcmp(optarg, "loop"))
> port_topology =
> PORT_TOPOLOGY_LOOP;
> + else if (!strcmp(optarg, "custom"))
> + port_topology =
> PORT_TOPOLOGY_CUSTOM;
> else
> rte_exit(EXIT_FAILURE, "port-
> topology %s invalid -"
> " must be: paired, chained or
> loop\n", diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
> index 1af87b8..3250683 100644
> --- a/app/test-pmd/testpmd.h
> +++ b/app/test-pmd/testpmd.h
> @@ -67,6 +67,7 @@ enum {
> PORT_TOPOLOGY_PAIRED,
> PORT_TOPOLOGY_CHAINED,
> PORT_TOPOLOGY_LOOP,
> + PORT_TOPOLOGY_CUSTOM,
> };
>
> #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
> @@ -363,6 +364,11 @@ extern uint8_t txring_numa[RTE_MAX_ETHPORTS];
> extern uint8_t socket_num;
>
> /*
> + * Store the custom topo.
> + */
> +portid_t fwd_ports[RTE_MAX_ETHPORTS];
> +
> +/*
> * Configuration of logical cores:
> * nb_fwd_lcores <= nb_cfg_lcores <= nb_lcores
> */
> @@ -598,7 +604,7 @@ void reconfig(portid_t new_port_id, unsigned
> socket_id); int init_fwd_streams(void);
>
> void set_fwd_eth_peer(portid_t port_id, char *peer_addr);
> -
> +void set_custom_topo(portid_t port_id_1, portid_t port_id_2);
> void port_mtu_set(portid_t port_id, uint16_t mtu); void
> port_reg_bit_display(portid_t port_id, uint32_t reg_off, uint8_t bit_pos);
> void port_reg_bit_set(portid_t port_id, uint32_t reg_off, uint8_t bit_pos,
> diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> index 013a405..5edf210 100644
> --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> @@ -1090,6 +1090,14 @@ Set the forwarding peer address for certain port::
>
> This is equivalent to the ``--eth-peer`` command-line option.
>
> +set custom-topo
> +~~~~~~~~~~~~~~
> +
> +Set custom topology for forwading packets by making the given two ports
> as pair.
> +In custom topology the active ports will be the defiend in custum-topo
> only::
> +
> + testpmd> set custom-topo (port_id_1) (port_id_2)
> +
> set port-uta
> ~~~~~~~~~~~~
>
> --
> 2.7.4
Hi Wisam,
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Wisam Jaddo
> Sent: Wednesday, May 9, 2018 1:47 PM
> To: Wu, Jingjing <jingjing.wu@intel.com>; Lu, Wenzhuo
> <wenzhuo.lu@intel.com>; thomas@monjalon.net
> Cc: rasland@mellanox.com; dev@dpdk.org; shahafs@mellanox.com;
> wisamm@mellanox.com
> Subject: [dpdk-dev] [PATCH v3 1/2] app/testpmd: add custom topology
> command
>
> Set custom topology for forwading packets by making the given two ports as
> pair, in custom topology the active ports will be the defiend in custum-topo
> only.
>
> This command will be useful in testing, when special topology is needed.
>
> usage:
> testpmd> set custom-topo (port_id_1) (port_id_2)
>
> Signed-off-by: Wisam Jaddo <wisamm@mellanox.com>
> ---
<snip>
This patch fails to apply to dpdk 18.08-rc0 and needs to be rebased.
checkpatch.pl is reporting 4 warnings which should be fixed.
Regards,
Bernard.
@@ -466,6 +466,9 @@ static void cmd_help_long_parsed(void *parsed_result,
"set eth-peer (port_id) (peer_addr)\n"
" set the peer address for certain port.\n\n"
+ "set custom-topo (port_id_1) (port_id_2)\n"
+ " set custom topo.\n\n"
+
"set port (port_id) uta (mac_address|all) (on|off)\n"
" Add/Remove a or all unicast hash filter(s)"
"from port X.\n\n"
@@ -7649,6 +7652,51 @@ cmdline_parse_inst_t cmd_set_fwd_eth_peer = {
},
};
+/* *** SET CUSTOM TOPO FOR CERTAIN PORT *** */
+struct cmd_custom_topo_result {
+ cmdline_fixed_string_t set;
+ cmdline_fixed_string_t custom_topo;
+ portid_t port_id_1;
+ portid_t port_id_2;
+};
+
+static void cmd_set_custom_topo_parsed(void *parsed_result,
+ __attribute__((unused)) struct cmdline *cl,
+ __attribute__((unused)) void *data)
+{
+ struct cmd_custom_topo_result *res = parsed_result;
+
+ if (test_done == 0) {
+ printf("Please stop forwarding first\n");
+ return;
+ }
+ if (!strcmp(res->custom_topo, "custom-topo")) {
+ set_custom_topo(res->port_id_1, res->port_id_2);
+ fwd_config_setup();
+ }
+}
+cmdline_parse_token_string_t cmd_set_custom_topo_set =
+ TOKEN_STRING_INITIALIZER(struct cmd_custom_topo_result, set, "set");
+cmdline_parse_token_string_t cmd_set_custom_topo_custom_topo =
+ TOKEN_STRING_INITIALIZER(struct cmd_custom_topo_result, custom_topo, "custom-topo");
+cmdline_parse_token_num_t cmd_set_custom_topo_port_id_1 =
+ TOKEN_NUM_INITIALIZER(struct cmd_custom_topo_result, port_id_1, UINT16);
+cmdline_parse_token_num_t cmd_set_custom_topo_port_id_2 =
+ TOKEN_NUM_INITIALIZER(struct cmd_custom_topo_result, port_id_2, UINT16);
+
+cmdline_parse_inst_t cmd_set_custom_topo = {
+ .f = cmd_set_custom_topo_parsed,
+ .data = NULL,
+ .help_str = "set custom-topo (port_id_1) (port_id_2)",
+ .tokens = {
+ (void *)&cmd_set_custom_topo_set,
+ (void *)&cmd_set_custom_topo_custom_topo,
+ (void *)&cmd_set_custom_topo_port_id_1,
+ (void *)&cmd_set_custom_topo_port_id_2,
+ NULL,
+ },
+};
+
/* *** CONFIGURE QUEUE STATS COUNTER MAPPINGS *** */
struct cmd_set_qmap_result {
cmdline_fixed_string_t set;
@@ -16540,6 +16588,7 @@ cmdline_parse_ctx_t main_ctx[] = {
(cmdline_parse_inst_t *)&cmd_stop,
(cmdline_parse_inst_t *)&cmd_mac_addr,
(cmdline_parse_inst_t *)&cmd_set_fwd_eth_peer,
+ (cmdline_parse_inst_t *)&cmd_set_custom_topo,
(cmdline_parse_inst_t *)&cmd_set_qmap,
(cmdline_parse_inst_t *)&cmd_set_xstats_hide_zero,
(cmdline_parse_inst_t *)&cmd_operate_port,
@@ -2069,6 +2069,8 @@ fwd_topology_tx_port_get(portid_t rxp)
return (rxp + 1) % cur_fwd_config.nb_fwd_ports;
case PORT_TOPOLOGY_LOOP:
return rxp;
+ case PORT_TOPOLOGY_CUSTOM:
+ return fwd_streams[rxp]->tx_port;
}
}
@@ -2378,6 +2380,45 @@ set_fwd_eth_peer(portid_t port_id, char *peer_addr)
new_peer_addr[c];
}
+static void
+print_ports_range(void)
+{
+ portid_t pid;
+ printf("Valid port range is [");
+ RTE_ETH_FOREACH_DEV(pid)
+ printf(", %d", pid);
+ printf("]\n");
+}
+
+void
+set_custom_topo(portid_t port_id_1, portid_t port_id_2)
+{
+ unsigned int portlist[RTE_MAX_ETHPORTS];
+ unsigned int i;
+ unsigned int nb_pt = 0;
+ if (port_topology != PORT_TOPOLOGY_CUSTOM) {
+ printf("Please set the forward topology to custom first.\n");
+ return;
+ }
+ if (port_id_is_invalid(port_id_1, ENABLED_WARN)) {
+ print_ports_range();
+ return;
+ }
+ if (port_id_is_invalid(port_id_2, ENABLED_WARN)) {
+ print_ports_range();
+ return;
+ }
+ fwd_streams[port_id_1]->tx_port = port_id_2;
+ fwd_streams[port_id_2]->tx_port = port_id_1;
+ fwd_ports[port_id_1] = port_id_1;
+ fwd_ports[port_id_2] = port_id_2;
+
+ for (i = 0; i < RTE_MAX_ETHPORTS; i++)
+ if (fwd_ports[i] == i)
+ portlist[nb_pt++] = i;
+ set_fwd_ports_list(portlist, nb_pt);
+}
+
int
set_fwd_lcores_list(unsigned int *lcorelist, unsigned int nb_lc)
{
@@ -139,8 +139,8 @@ usage(char* progname)
printf(" --enable-hw-vlan-extend: enable hardware vlan extend.\n");
printf(" --enable-drop-en: enable per queue packet drop.\n");
printf(" --disable-rss: disable rss.\n");
- printf(" --port-topology=N: set port topology (N: paired (default) or "
- "chained).\n");
+ printf(" --port-topology=N: set port topology (N: paired (default)"
+ "(loop), (custom) or (chained).\n");
printf(" --forward-mode=N: set forwarding mode (N: %s).\n",
list_pkt_forwarding_modes());
printf(" --rss-ip: set RSS functions to IPv4/IPv6 only .\n");
@@ -920,6 +920,8 @@ launch_args_parse(int argc, char** argv)
port_topology = PORT_TOPOLOGY_CHAINED;
else if (!strcmp(optarg, "loop"))
port_topology = PORT_TOPOLOGY_LOOP;
+ else if (!strcmp(optarg, "custom"))
+ port_topology = PORT_TOPOLOGY_CUSTOM;
else
rte_exit(EXIT_FAILURE, "port-topology %s invalid -"
" must be: paired, chained or loop\n",
@@ -67,6 +67,7 @@ enum {
PORT_TOPOLOGY_PAIRED,
PORT_TOPOLOGY_CHAINED,
PORT_TOPOLOGY_LOOP,
+ PORT_TOPOLOGY_CUSTOM,
};
#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
@@ -363,6 +364,11 @@ extern uint8_t txring_numa[RTE_MAX_ETHPORTS];
extern uint8_t socket_num;
/*
+ * Store the custom topo.
+ */
+portid_t fwd_ports[RTE_MAX_ETHPORTS];
+
+/*
* Configuration of logical cores:
* nb_fwd_lcores <= nb_cfg_lcores <= nb_lcores
*/
@@ -598,7 +604,7 @@ void reconfig(portid_t new_port_id, unsigned socket_id);
int init_fwd_streams(void);
void set_fwd_eth_peer(portid_t port_id, char *peer_addr);
-
+void set_custom_topo(portid_t port_id_1, portid_t port_id_2);
void port_mtu_set(portid_t port_id, uint16_t mtu);
void port_reg_bit_display(portid_t port_id, uint32_t reg_off, uint8_t bit_pos);
void port_reg_bit_set(portid_t port_id, uint32_t reg_off, uint8_t bit_pos,
@@ -1090,6 +1090,14 @@ Set the forwarding peer address for certain port::
This is equivalent to the ``--eth-peer`` command-line option.
+set custom-topo
+~~~~~~~~~~~~~~
+
+Set custom topology for forwading packets by making the given two ports as pair.
+In custom topology the active ports will be the defiend in custum-topo only::
+
+ testpmd> set custom-topo (port_id_1) (port_id_2)
+
set port-uta
~~~~~~~~~~~~