ethdev: add group jump action
[dpdk.git] / app / test-pmd / cmdline.c
index bf213d1..9615670 100644 (file)
@@ -846,6 +846,11 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "port config mtu X value\n"
                        "    Set the MTU of port X to a given value\n\n"
 
+                       "port config (port_id) (rxq|txq) (queue_id) ring_size (value)\n"
+                       "    Set a rx/tx queue's ring size configuration, the new"
+                       " value will take effect after command that (re-)start the port"
+                       " or command that setup the specific queue\n\n"
+
                        "port (port_id) (rxq|txq) (queue_id) (start|stop)\n"
                        "    Start/stop a rx/tx queue of port X. Only take effect"
                        " when port X is started\n\n"
@@ -876,6 +881,9 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "port config (port_id) pctype (pctype_id) hash_inset|"
                        "fdir_inset|fdir_flx_inset clear all"
                        "    Clear RSS|FDIR|FDIR_FLX input set completely for some pctype\n\n"
+
+                       "port config (port_id) udp_tunnel_port add|rm vxlan|geneve (udp_port)\n\n"
+                       "    Add/remove UDP tunnel port for tunneling offload\n\n"
                );
        }
 
@@ -2002,6 +2010,8 @@ cmd_config_rss_parsed(void *parsed_result,
        struct cmd_config_rss *res = parsed_result;
        struct rte_eth_rss_conf rss_conf = { .rss_key_len = 0, };
        struct rte_eth_dev_info dev_info = { .flow_type_rss_offloads = 0, };
+       int use_default = 0;
+       int all_updated = 1;
        int diag;
        uint16_t i;
 
@@ -2027,8 +2037,10 @@ cmd_config_rss_parsed(void *parsed_result,
                rss_conf.rss_hf = ETH_RSS_GENEVE;
        else if (!strcmp(res->value, "nvgre"))
                rss_conf.rss_hf = ETH_RSS_NVGRE;
-       else if (!strcmp(res->value, "none") || !strcmp(res->value, "default"))
+       else if (!strcmp(res->value, "none"))
                rss_conf.rss_hf = 0;
+       else if (!strcmp(res->value, "default"))
+               use_default = 1;
        else if (isdigit(res->value[0]) && atoi(res->value) > 0 &&
                                                atoi(res->value) < 64)
                rss_conf.rss_hf = 1ULL << atoi(res->value);
@@ -2038,18 +2050,21 @@ cmd_config_rss_parsed(void *parsed_result,
        }
        rss_conf.rss_key = NULL;
        /* Update global configuration for RSS types. */
-       rss_hf = rss_conf.rss_hf;
        RTE_ETH_FOREACH_DEV(i) {
-               if (!strcmp(res->value, "default")) {
+               if (use_default) {
                        rte_eth_dev_info_get(i, &dev_info);
                        rss_conf.rss_hf = dev_info.flow_type_rss_offloads;
                }
                diag = rte_eth_dev_rss_hash_update(i, &rss_conf);
-               if (diag < 0)
+               if (diag < 0) {
+                       all_updated = 0;
                        printf("Configuration of RSS hash at ethernet port %d "
                                "failed with error (%d): %s.\n",
                                i, -diag, strerror(-diag));
+               }
        }
+       if (all_updated && !use_default)
+               rss_hf = rss_conf.rss_hf;
 }
 
 cmdline_parse_token_string_t cmd_config_rss_port =
@@ -2196,6 +2211,102 @@ cmdline_parse_inst_t cmd_config_rss_hash_key = {
        },
 };
 
+/* *** configure port rxq/txq ring size *** */
+struct cmd_config_rxtx_ring_size {
+       cmdline_fixed_string_t port;
+       cmdline_fixed_string_t config;
+       portid_t portid;
+       cmdline_fixed_string_t rxtxq;
+       uint16_t qid;
+       cmdline_fixed_string_t rsize;
+       uint16_t size;
+};
+
+static void
+cmd_config_rxtx_ring_size_parsed(void *parsed_result,
+                                __attribute__((unused)) struct cmdline *cl,
+                                __attribute__((unused)) void *data)
+{
+       struct cmd_config_rxtx_ring_size *res = parsed_result;
+       struct rte_port *port;
+       uint8_t isrx;
+
+       if (port_id_is_invalid(res->portid, ENABLED_WARN))
+               return;
+
+       if (res->portid == (portid_t)RTE_PORT_ALL) {
+               printf("Invalid port id\n");
+               return;
+       }
+
+       port = &ports[res->portid];
+
+       if (!strcmp(res->rxtxq, "rxq"))
+               isrx = 1;
+       else if (!strcmp(res->rxtxq, "txq"))
+               isrx = 0;
+       else {
+               printf("Unknown parameter\n");
+               return;
+       }
+
+       if (isrx && rx_queue_id_is_invalid(res->qid))
+               return;
+       else if (!isrx && tx_queue_id_is_invalid(res->qid))
+               return;
+
+       if (isrx && res->size != 0 && res->size <= rx_free_thresh) {
+               printf("Invalid rx ring_size, must > rx_free_thresh: %d\n",
+                      rx_free_thresh);
+               return;
+       }
+
+       if (isrx)
+               port->nb_rx_desc[res->qid] = res->size;
+       else
+               port->nb_tx_desc[res->qid] = res->size;
+
+       cmd_reconfig_device_queue(res->portid, 0, 1);
+}
+
+cmdline_parse_token_string_t cmd_config_rxtx_ring_size_port =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_ring_size,
+                                port, "port");
+cmdline_parse_token_string_t cmd_config_rxtx_ring_size_config =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_ring_size,
+                                config, "config");
+cmdline_parse_token_num_t cmd_config_rxtx_ring_size_portid =
+       TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_ring_size,
+                                portid, UINT16);
+cmdline_parse_token_string_t cmd_config_rxtx_ring_size_rxtxq =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_ring_size,
+                                rxtxq, "rxq#txq");
+cmdline_parse_token_num_t cmd_config_rxtx_ring_size_qid =
+       TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_ring_size,
+                             qid, UINT16);
+cmdline_parse_token_string_t cmd_config_rxtx_ring_size_rsize =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_ring_size,
+                                rsize, "ring_size");
+cmdline_parse_token_num_t cmd_config_rxtx_ring_size_size =
+       TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_ring_size,
+                             size, UINT16);
+
+cmdline_parse_inst_t cmd_config_rxtx_ring_size = {
+       .f = cmd_config_rxtx_ring_size_parsed,
+       .data = NULL,
+       .help_str = "port config <port_id> rxq|txq <queue_id> ring_size <value>",
+       .tokens = {
+               (void *)&cmd_config_rxtx_ring_size_port,
+               (void *)&cmd_config_rxtx_ring_size_config,
+               (void *)&cmd_config_rxtx_ring_size_portid,
+               (void *)&cmd_config_rxtx_ring_size_rxtxq,
+               (void *)&cmd_config_rxtx_ring_size_qid,
+               (void *)&cmd_config_rxtx_ring_size_rsize,
+               (void *)&cmd_config_rxtx_ring_size_size,
+               NULL,
+       },
+};
+
 /* *** configure port rxq/txq start/stop *** */
 struct cmd_config_rxtx_queue {
        cmdline_fixed_string_t port;
@@ -2365,9 +2476,9 @@ cmd_setup_rxtx_queue_parsed(
                }
                ret = rte_eth_rx_queue_setup(res->portid,
                                             res->qid,
-                                            nb_rxd,
+                                            port->nb_rx_desc[res->qid],
                                             socket_id,
-                                            &port->rx_conf,
+                                            &port->rx_conf[res->qid],
                                             mp);
                if (ret)
                        printf("Failed to setup RX queue\n");
@@ -2378,9 +2489,9 @@ cmd_setup_rxtx_queue_parsed(
 
                ret = rte_eth_tx_queue_setup(res->portid,
                                             res->qid,
-                                            nb_txd,
+                                            port->nb_tx_desc[res->qid],
                                             socket_id,
-                                            &port->tx_conf);
+                                            &port->tx_conf[res->qid]);
                if (ret)
                        printf("Failed to setup TX queue\n");
        }
@@ -8542,6 +8653,89 @@ cmdline_parse_inst_t cmd_tunnel_udp_config = {
        },
 };
 
+struct cmd_config_tunnel_udp_port {
+       cmdline_fixed_string_t port;
+       cmdline_fixed_string_t config;
+       portid_t port_id;
+       cmdline_fixed_string_t udp_tunnel_port;
+       cmdline_fixed_string_t action;
+       cmdline_fixed_string_t tunnel_type;
+       uint16_t udp_port;
+};
+
+static void
+cmd_cfg_tunnel_udp_port_parsed(void *parsed_result,
+                              __attribute__((unused)) struct cmdline *cl,
+                              __attribute__((unused)) void *data)
+{
+       struct cmd_config_tunnel_udp_port *res = parsed_result;
+       struct rte_eth_udp_tunnel tunnel_udp;
+       int ret = 0;
+
+       if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+               return;
+
+       tunnel_udp.udp_port = res->udp_port;
+
+       if (!strcmp(res->tunnel_type, "vxlan")) {
+               tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN;
+       } else if (!strcmp(res->tunnel_type, "geneve")) {
+               tunnel_udp.prot_type = RTE_TUNNEL_TYPE_GENEVE;
+       } else {
+               printf("Invalid tunnel type\n");
+               return;
+       }
+
+       if (!strcmp(res->action, "add"))
+               ret = rte_eth_dev_udp_tunnel_port_add(res->port_id,
+                                                     &tunnel_udp);
+       else
+               ret = rte_eth_dev_udp_tunnel_port_delete(res->port_id,
+                                                        &tunnel_udp);
+
+       if (ret < 0)
+               printf("udp tunneling port add error: (%s)\n", strerror(-ret));
+}
+
+cmdline_parse_token_string_t cmd_config_tunnel_udp_port_port =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, port,
+                                "port");
+cmdline_parse_token_string_t cmd_config_tunnel_udp_port_config =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, config,
+                                "config");
+cmdline_parse_token_num_t cmd_config_tunnel_udp_port_port_id =
+       TOKEN_NUM_INITIALIZER(struct cmd_config_tunnel_udp_port, port_id,
+                             UINT16);
+cmdline_parse_token_string_t cmd_config_tunnel_udp_port_tunnel_port =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port,
+                                udp_tunnel_port,
+                                "udp_tunnel_port");
+cmdline_parse_token_string_t cmd_config_tunnel_udp_port_action =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, action,
+                                "add#rm");
+cmdline_parse_token_string_t cmd_config_tunnel_udp_port_tunnel_type =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, tunnel_type,
+                                "vxlan#geneve");
+cmdline_parse_token_num_t cmd_config_tunnel_udp_port_value =
+       TOKEN_NUM_INITIALIZER(struct cmd_config_tunnel_udp_port, udp_port,
+                             UINT16);
+
+cmdline_parse_inst_t cmd_cfg_tunnel_udp_port = {
+       .f = cmd_cfg_tunnel_udp_port_parsed,
+       .data = NULL,
+       .help_str = "port config <port_id> udp_tunnel_port add|rm vxlan|geneve <udp_port>",
+       .tokens = {
+               (void *)&cmd_config_tunnel_udp_port_port,
+               (void *)&cmd_config_tunnel_udp_port_config,
+               (void *)&cmd_config_tunnel_udp_port_port_id,
+               (void *)&cmd_config_tunnel_udp_port_tunnel_port,
+               (void *)&cmd_config_tunnel_udp_port_action,
+               (void *)&cmd_config_tunnel_udp_port_tunnel_type,
+               (void *)&cmd_config_tunnel_udp_port_value,
+               NULL,
+       },
+};
+
 /* *** GLOBAL CONFIG *** */
 struct cmd_global_config_result {
        cmdline_fixed_string_t cmd;
@@ -16361,6 +16555,7 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_config_max_pkt_len,
        (cmdline_parse_inst_t *)&cmd_config_rx_mode_flag,
        (cmdline_parse_inst_t *)&cmd_config_rss,
+       (cmdline_parse_inst_t *)&cmd_config_rxtx_ring_size,
        (cmdline_parse_inst_t *)&cmd_config_rxtx_queue,
        (cmdline_parse_inst_t *)&cmd_setup_rxtx_queue,
        (cmdline_parse_inst_t *)&cmd_config_rss_reta,
@@ -16499,6 +16694,7 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_del_port_tm_node,
        (cmdline_parse_inst_t *)&cmd_set_port_tm_node_parent,
        (cmdline_parse_inst_t *)&cmd_port_tm_hierarchy_commit,
+       (cmdline_parse_inst_t *)&cmd_cfg_tunnel_udp_port,
        NULL,
 };