[v3,3/3] app/testpmd: add debug command Tx metadata set
Checks
Commit Message
As described in [1],[2] this series adds option to set metadata value as
match pattern when creating a new flow rule.
This patch introduces code for debug porpuse only.
The new debug command takes a 32 bit value and stores it per port.
testpmd will add to any Tx packet sent from this port the metadata
value, and set ol_flags accordingly.
[1] "ethdev: support metadata as flow rule criteria"
[2] "app/testpmd: support metadata as flow rule criteria"
Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
app/test-pmd/cmdline.c | 46 +++++++++++++++++++++++++++++
app/test-pmd/config.c | 6 ++++
app/test-pmd/testpmd.c | 1 +
app/test-pmd/testpmd.h | 4 +++
app/test-pmd/txonly.c | 9 ++++++
doc/guides/testpmd_app_ug/testpmd_funcs.rst | 7 +++++
6 files changed, 73 insertions(+)
Comments
On 9/27/2018 2:57 PM, Dekel Peled wrote:
> As described in [1],[2] this series adds option to set metadata value as
> match pattern when creating a new flow rule.
>
> This patch introduces code for debug porpuse only.
> The new debug command takes a 32 bit value and stores it per port.
> testpmd will add to any Tx packet sent from this port the metadata
> value, and set ol_flags accordingly.
>
> [1] "ethdev: support metadata as flow rule criteria"
> [2] "app/testpmd: support metadata as flow rule criteria"
>
> Signed-off-by: Dekel Peled <dekelp@mellanox.com>
<...>
> @@ -851,6 +851,13 @@ Disable hardware insertion of a VLAN header in packets sent on a port::
>
> testpmd> tx_vlan reset (port_id)
>
> +tx_metadata set
> +~~~~~~~~~~~~~~~
> +
> +Set metadata value to insert in packets sent to PMD::
> +
> + testpmd> tx_metadata set (port_id) (value)
I have commented to previous version, but same applies here, please check:
https://mails.dpdk.org/archives/dev/2018-October/114553.html
@@ -17602,6 +17602,51 @@ struct cmd_config_per_queue_tx_offload_result {
}
};
+/* *** ENABLE METADATA INSERTION IN TX PACKETS SENT TO PMD *** */
+struct cmd_tx_metadata_set_result {
+ cmdline_fixed_string_t tx_metadata;
+ cmdline_fixed_string_t set;
+ portid_t port_id;
+ uint32_t metadata;
+};
+
+static void
+cmd_tx_metadata_set_parsed(void *parsed_result,
+ __attribute__((unused)) struct cmdline *cl,
+ __attribute__((unused)) void *data)
+{
+ struct cmd_tx_metadata_set_result *res = parsed_result;
+
+ tx_metadata_set(res->port_id, res->metadata);
+}
+
+cmdline_parse_token_string_t cmd_tx_metadata_set_tx_metadata =
+ TOKEN_STRING_INITIALIZER(struct cmd_tx_metadata_set_result,
+ tx_metadata, "tx_metadata");
+cmdline_parse_token_string_t cmd_tx_metadata_set_set =
+ TOKEN_STRING_INITIALIZER(struct cmd_tx_metadata_set_result,
+ set, "set");
+cmdline_parse_token_num_t cmd_tx_metadata_set_portid =
+ TOKEN_NUM_INITIALIZER(struct cmd_tx_metadata_set_result,
+ port_id, UINT16);
+cmdline_parse_token_num_t cmd_tx_metadata_set_metadata =
+ TOKEN_NUM_INITIALIZER(struct cmd_tx_metadata_set_result,
+ metadata, UINT32);
+
+cmdline_parse_inst_t cmd_tx_metadata_set = {
+ .f = cmd_tx_metadata_set_parsed,
+ .data = NULL,
+ .help_str = "tx_metadata set <port_id> <metadata>: "
+ "Enable metadata insertion in packets sent to PMD",
+ .tokens = {
+ (void *)&cmd_tx_metadata_set_tx_metadata,
+ (void *)&cmd_tx_metadata_set_set,
+ (void *)&cmd_tx_metadata_set_portid,
+ (void *)&cmd_tx_metadata_set_metadata,
+ NULL,
+ },
+};
+
/* ******************************************************************************** */
/* list of instructions */
@@ -17867,6 +17912,7 @@ struct cmd_config_per_queue_tx_offload_result {
(cmdline_parse_inst_t *)&cmd_operate_bpf_ld_parse,
(cmdline_parse_inst_t *)&cmd_operate_bpf_unld_parse,
#endif
+ (cmdline_parse_inst_t *)&cmd_tx_metadata_set,
NULL,
};
@@ -3845,3 +3845,9 @@ struct igb_ring_desc_16_bytes {
printf("\n\n");
}
+
+void
+tx_metadata_set(portid_t port_id, uint32_t metadata)
+{
+ ports[port_id].metadata = metadata;
+}
@@ -771,6 +771,7 @@ static void eth_dev_event_callback(char *device_name,
/* set flag to initialize port/queue */
port->need_reconfig = 1;
port->need_reconfig_queues = 1;
+ port->metadata = 0;
}
/*
@@ -183,6 +183,8 @@ struct rte_port {
#ifdef SOFTNIC
struct softnic_port softport; /**< softnic params */
#endif
+ /* metadata value to add in tx packets (debug only) */
+ uint32_t metadata;
};
/**
@@ -743,6 +745,8 @@ enum print_warning {
queueid_t get_allowed_max_nb_txq(portid_t *pid);
int check_nb_txq(queueid_t txq);
+void tx_metadata_set(portid_t port_id, uint32_t metadata);
+
/*
* Work-around of a compilation error with ICC on invocations of the
* rte_be_to_cpu_16() function.
@@ -253,6 +253,15 @@
pkt->l2_len = sizeof(struct ether_hdr);
pkt->l3_len = sizeof(struct ipv4_hdr);
pkts_burst[nb_pkt] = pkt;
+
+ /*
+ * If user configured metadata value add it to packet
+ * and set ol_flags accordingly
+ */
+ if (ports[fs->tx_port].metadata) {
+ pkt->hash.fdir.hi = ports[fs->tx_port].metadata;
+ pkt->ol_flags |= PKT_TX_METADATA;
+ }
}
nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_pkt);
/*
@@ -851,6 +851,13 @@ Disable hardware insertion of a VLAN header in packets sent on a port::
testpmd> tx_vlan reset (port_id)
+tx_metadata set
+~~~~~~~~~~~~~~~
+
+Set metadata value to insert in packets sent to PMD::
+
+ testpmd> tx_metadata set (port_id) (value)
+
csum set
~~~~~~~~