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 'config' command takes a 32 bit value and stores it per port: port config <port_id> tx_metadata <value> testpmd will add to any Tx packet sent from this port the metadata value, and set ol_flags accordingly. A matching 'show' command is added to read the configured value: port config <port_id> tx_metadata <value> [1] "ethdev: support metadata as flow rule criteria" [2] "app/testpmd: support metadata as flow rule criteria" Signed-off-by: Dekel Peled <dek...@mellanox.com> --- app/test-pmd/cmdline.c | 104 ++++++++++++++++++++++++++++ app/test-pmd/testpmd.c | 1 + app/test-pmd/testpmd.h | 2 + app/test-pmd/txonly.c | 9 +++ doc/guides/testpmd_app_ug/testpmd_funcs.rst | 7 ++ 5 files changed, 123 insertions(+) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 28bbd80..fe8d3e0 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -18323,6 +18323,108 @@ struct cmd_config_per_queue_tx_offload_result { } }; +/* *** configure tx_metadata for specific port *** */ +struct cmd_config_tx_metadata_specific_result { + cmdline_fixed_string_t port; + cmdline_fixed_string_t keyword; + uint16_t port_id; + cmdline_fixed_string_t item; + uint32_t value; +}; + +static void +cmd_config_tx_metadata_specific_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_config_tx_metadata_specific_result *res = parsed_result; + + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) + return; + ports[res->port_id].tx_metadata = res->value; +} + +cmdline_parse_token_string_t cmd_config_tx_metadata_specific_port = + TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result, + port, "port"); +cmdline_parse_token_string_t cmd_config_tx_metadata_specific_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result, + keyword, "config"); +cmdline_parse_token_num_t cmd_config_tx_metadata_specific_id = + TOKEN_NUM_INITIALIZER(struct cmd_config_tx_metadata_specific_result, + port_id, UINT16); +cmdline_parse_token_string_t cmd_config_tx_metadata_specific_item = + TOKEN_STRING_INITIALIZER(struct cmd_config_tx_metadata_specific_result, + item, "tx_metadata"); +cmdline_parse_token_num_t cmd_config_tx_metadata_specific_value = + TOKEN_NUM_INITIALIZER(struct cmd_config_tx_metadata_specific_result, + value, UINT32); + +cmdline_parse_inst_t cmd_config_tx_metadata_specific = { + .f = cmd_config_tx_metadata_specific_parsed, + .data = NULL, + .help_str = "port config <port_id> tx_metadata <value>", + .tokens = { + (void *)&cmd_config_tx_metadata_specific_port, + (void *)&cmd_config_tx_metadata_specific_keyword, + (void *)&cmd_config_tx_metadata_specific_id, + (void *)&cmd_config_tx_metadata_specific_item, + (void *)&cmd_config_tx_metadata_specific_value, + NULL, + }, +}; + +/* *** display tx_metadata per port configuration *** */ +struct cmd_show_tx_metadata_result { + cmdline_fixed_string_t cmd_show; + cmdline_fixed_string_t cmd_port; + cmdline_fixed_string_t cmd_keyword; + portid_t cmd_pid; +}; + +static void +cmd_show_tx_metadata_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_show_tx_metadata_result *res = parsed_result; + + if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { + printf("invalid port id %u\n", res->cmd_pid); + return; + } + if (!strcmp(res->cmd_keyword, "tx_metadata")) { + printf("Port %u tx_metadata: %u\n", res->cmd_pid, + ports[res->cmd_pid].tx_metadata); + } +} + +cmdline_parse_token_string_t cmd_show_tx_metadata_show = + TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result, + cmd_show, "show"); +cmdline_parse_token_string_t cmd_show_tx_metadata_port = + TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result, + cmd_port, "port"); +cmdline_parse_token_num_t cmd_show_tx_metadata_pid = + TOKEN_NUM_INITIALIZER(struct cmd_show_tx_metadata_result, + cmd_pid, UINT16); +cmdline_parse_token_string_t cmd_show_tx_metadata_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_show_tx_metadata_result, + cmd_keyword, "tx_metadata"); + +cmdline_parse_inst_t cmd_show_tx_metadata = { + .f = cmd_show_tx_metadata_parsed, + .data = NULL, + .help_str = "show port <port_id> tx_metadata", + .tokens = { + (void *)&cmd_show_tx_metadata_show, + (void *)&cmd_show_tx_metadata_port, + (void *)&cmd_show_tx_metadata_pid, + (void *)&cmd_show_tx_metadata_keyword, + NULL, + }, +}; + /* ******************************************************************************** */ /* list of instructions */ @@ -18604,6 +18706,8 @@ 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_config_tx_metadata_specific, + (cmdline_parse_inst_t *)&cmd_show_tx_metadata, NULL, }; diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 75e960a..c7ae676 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -1089,6 +1089,7 @@ struct extmem_param { /* set flag to initialize port/queue */ port->need_reconfig = 1; port->need_reconfig_queues = 1; + port->tx_metadata = 0; } /* diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index 0738105..9d30397 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -194,6 +194,8 @@ struct rte_port { #ifdef SOFTNIC struct softnic_port softport; /**< softnic params */ #endif + /**< metadata value to add in Tx packets (debug only). */ + uint32_t tx_metadata; }; /** diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c index 1f08b6e..fae84ca 100644 --- a/app/test-pmd/txonly.c +++ b/app/test-pmd/txonly.c @@ -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].tx_metadata) { + pkt->tx_metadata = ports[fs->tx_port].tx_metadata; + pkt->ol_flags |= PKT_TX_METADATA; + } } nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_pkt); /* diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst index c97f26b..a2f86bb 100644 --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst @@ -857,6 +857,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 ~~~~~~~~ -- 1.8.3.1