app/testpmd: support mbuf dynamic flag
[dpdk.git] / app / test-pmd / cmdline.c
index 9f3e0b2..dab22bc 100644 (file)
@@ -40,6 +40,7 @@
 #include <rte_devargs.h>
 #include <rte_flow.h>
 #include <rte_gro.h>
+#include <rte_mbuf_dyn.h>
 
 #include <cmdline_rdline.h>
 #include <cmdline_parse.h>
@@ -241,6 +242,9 @@ static void cmd_help_long_parsed(void *parsed_result,
 
                        "show port (port_id) rxq|txq (queue_id) desc (desc_id) status"
                        "       Show status of rx|tx descriptor.\n\n"
+
+                       "show port (port_id) macs|mcast_macs"
+                       "       Display list of mac addresses added to port.\n\n"
                );
        }
 
@@ -898,6 +902,11 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "port config (port_id) tx_metadata (value)\n"
                        "    Set Tx metadata value per port. Testpmd will add this value"
                        " to any Tx packet sent from this port\n\n"
+
+                       "port config (port_id) dynf (name) set|clear\n"
+                       "    Register a dynf and Set/clear this flag on Tx. "
+                       "Testpmd will set this value to any Tx packet "
+                       "sent from this port\n\n"
                );
        }
 
@@ -18834,6 +18843,85 @@ cmdline_parse_inst_t cmd_config_tx_metadata_specific = {
        },
 };
 
+/* *** set dynf *** */
+struct cmd_config_tx_dynf_specific_result {
+       cmdline_fixed_string_t port;
+       cmdline_fixed_string_t keyword;
+       uint16_t port_id;
+       cmdline_fixed_string_t item;
+       cmdline_fixed_string_t name;
+       cmdline_fixed_string_t value;
+};
+
+static void
+cmd_config_dynf_specific_parsed(void *parsed_result,
+                               __attribute__((unused)) struct cmdline *cl,
+                               __attribute__((unused)) void *data)
+{
+       struct cmd_config_tx_dynf_specific_result *res = parsed_result;
+       struct rte_mbuf_dynflag desc_flag;
+       int flag;
+       uint64_t old_port_flags;
+
+       if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+               return;
+       flag = rte_mbuf_dynflag_lookup(res->name, NULL);
+       if (flag <= 0) {
+               strcpy(desc_flag.name, res->name);
+               desc_flag.flags = 0;
+               flag = rte_mbuf_dynflag_register(&desc_flag);
+               if (flag < 0) {
+                       printf("Can't register flag\n");
+                       return;
+               }
+               strcpy(dynf_names[flag], res->name);
+       }
+       old_port_flags = ports[res->port_id].mbuf_dynf;
+       if (!strcmp(res->value, "set")) {
+               ports[res->port_id].mbuf_dynf |= 1UL << flag;
+               if (old_port_flags == 0)
+                       add_tx_dynf_callback(res->port_id);
+       } else {
+               ports[res->port_id].mbuf_dynf &= ~(1UL << flag);
+               if (ports[res->port_id].mbuf_dynf == 0)
+                       remove_tx_dynf_callback(res->port_id);
+       }
+}
+
+cmdline_parse_token_string_t cmd_config_tx_dynf_specific_port =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result,
+                       keyword, "port");
+cmdline_parse_token_string_t cmd_config_tx_dynf_specific_keyword =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result,
+                       keyword, "config");
+cmdline_parse_token_num_t cmd_config_tx_dynf_specific_port_id =
+       TOKEN_NUM_INITIALIZER(struct cmd_config_tx_dynf_specific_result,
+                       port_id, UINT16);
+cmdline_parse_token_string_t cmd_config_tx_dynf_specific_item =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result,
+                       item, "dynf");
+cmdline_parse_token_string_t cmd_config_tx_dynf_specific_name =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result,
+                       name, NULL);
+cmdline_parse_token_string_t cmd_config_tx_dynf_specific_value =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_tx_dynf_specific_result,
+                       value, "set#clear");
+
+cmdline_parse_inst_t cmd_config_tx_dynf_specific = {
+       .f = cmd_config_dynf_specific_parsed,
+       .data = NULL,
+       .help_str = "port config <port id> dynf <name> set|clear",
+       .tokens = {
+               (void *)&cmd_config_tx_dynf_specific_port,
+               (void *)&cmd_config_tx_dynf_specific_keyword,
+               (void *)&cmd_config_tx_dynf_specific_port_id,
+               (void *)&cmd_config_tx_dynf_specific_item,
+               (void *)&cmd_config_tx_dynf_specific_name,
+               (void *)&cmd_config_tx_dynf_specific_value,
+               NULL,
+       },
+};
+
 /* *** display tx_metadata per port configuration *** */
 struct cmd_show_tx_metadata_result {
        cmdline_fixed_string_t cmd_show;
@@ -19171,6 +19259,56 @@ cmdline_parse_inst_t cmd_set_port_ptypes = {
        },
 };
 
+/* *** display mac addresses added to a port *** */
+struct cmd_showport_macs_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_showport_macs_parsed(void *parsed_result,
+               __attribute__((unused)) struct cmdline *cl,
+               __attribute__((unused)) void *data)
+{
+       struct cmd_showport_macs_result *res = parsed_result;
+
+       if (port_id_is_invalid(res->cmd_pid, ENABLED_WARN))
+               return;
+
+       if (!strcmp(res->cmd_keyword, "macs"))
+               show_macs(res->cmd_pid);
+       else if (!strcmp(res->cmd_keyword, "mcast_macs"))
+               show_mcast_macs(res->cmd_pid);
+}
+
+cmdline_parse_token_string_t cmd_showport_macs_show =
+       TOKEN_STRING_INITIALIZER(struct cmd_showport_macs_result,
+                       cmd_show, "show");
+cmdline_parse_token_string_t cmd_showport_macs_port =
+       TOKEN_STRING_INITIALIZER(struct cmd_showport_macs_result,
+                       cmd_port, "port");
+cmdline_parse_token_num_t cmd_showport_macs_pid =
+       TOKEN_NUM_INITIALIZER(struct cmd_showport_macs_result,
+                       cmd_pid, UINT16);
+cmdline_parse_token_string_t cmd_showport_macs_keyword =
+       TOKEN_STRING_INITIALIZER(struct cmd_showport_macs_result,
+                       cmd_keyword, "macs#mcast_macs");
+
+cmdline_parse_inst_t cmd_showport_macs = {
+       .f = cmd_showport_macs_parsed,
+       .data = NULL,
+       .help_str = "show port <port_id> macs|mcast_macs",
+       .tokens = {
+               (void *)&cmd_showport_macs_show,
+               (void *)&cmd_showport_macs_port,
+               (void *)&cmd_showport_macs_pid,
+               (void *)&cmd_showport_macs_keyword,
+               NULL,
+       },
+};
+
 /* ******************************************************************************** */
 
 /* list of instructions */
@@ -19289,6 +19427,7 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_setup_rxtx_queue,
        (cmdline_parse_inst_t *)&cmd_config_rss_reta,
        (cmdline_parse_inst_t *)&cmd_showport_reta,
+       (cmdline_parse_inst_t *)&cmd_showport_macs,
        (cmdline_parse_inst_t *)&cmd_config_burst,
        (cmdline_parse_inst_t *)&cmd_config_thresh,
        (cmdline_parse_inst_t *)&cmd_config_threshold,
@@ -19466,6 +19605,7 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_set_raw,
        (cmdline_parse_inst_t *)&cmd_show_set_raw,
        (cmdline_parse_inst_t *)&cmd_show_set_raw_all,
+       (cmdline_parse_inst_t *)&cmd_config_tx_dynf_specific,
        NULL,
 };