vhost: introduce wrappers for some vDPA ops
[dpdk.git] / lib / librte_ethdev / rte_ethdev.c
index 0854ef8..8e10a6f 100644 (file)
@@ -38,7 +38,9 @@
 #include <rte_kvargs.h>
 #include <rte_class.h>
 #include <rte_ether.h>
+#include <rte_telemetry.h>
 
+#include "rte_ethdev_trace.h"
 #include "rte_ethdev.h"
 #include "rte_ethdev_driver.h"
 #include "ethdev_profile.h"
@@ -1098,6 +1100,8 @@ rte_eth_speed_bitflag(uint32_t speed, int duplex)
                return ETH_LINK_SPEED_56G;
        case ETH_SPEED_NUM_100G:
                return ETH_LINK_SPEED_100G;
+       case ETH_SPEED_NUM_200G:
+               return ETH_LINK_SPEED_200G;
        default:
                return 0;
        }
@@ -1470,6 +1474,7 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
                goto reset_queues;
        }
 
+       rte_ethdev_trace_configure(port_id, nb_rx_q, nb_tx_q, dev_conf, 0);
        return 0;
 reset_queues:
        rte_eth_dev_rx_queue_config(dev, 0);
@@ -1477,6 +1482,7 @@ reset_queues:
 rollback:
        memcpy(&dev->data->dev_conf, &orig_conf, sizeof(dev->data->dev_conf));
 
+       rte_ethdev_trace_configure(port_id, nb_rx_q, nb_tx_q, dev_conf, ret);
        return ret;
 }
 
@@ -1647,6 +1653,8 @@ rte_eth_dev_start(uint16_t port_id)
                RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->link_update, -ENOTSUP);
                (*dev->dev_ops->link_update)(dev, 0);
        }
+
+       rte_ethdev_trace_start(port_id);
        return 0;
 }
 
@@ -1669,6 +1677,7 @@ rte_eth_dev_stop(uint16_t port_id)
 
        dev->data->dev_started = 0;
        (*dev->dev_ops->dev_stop)(dev);
+       rte_ethdev_trace_stop(port_id);
 }
 
 int
@@ -1709,6 +1718,7 @@ rte_eth_dev_close(uint16_t port_id)
        dev->data->dev_started = 0;
        (*dev->dev_ops->dev_close)(dev);
 
+       rte_ethdev_trace_close(port_id);
        /* check behaviour flag - temporary for PMD migration */
        if ((dev->data->dev_flags & RTE_ETH_DEV_CLOSE_REMOVE) != 0) {
                /* new behaviour: send event + reset state + free all data */
@@ -1918,6 +1928,8 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
                        dev->data->min_rx_buf_size = mbp_buf_size;
        }
 
+       rte_ethdev_trace_rxq_setup(port_id, rx_queue_id, nb_rx_desc, mp,
+               rx_conf, ret);
        return eth_err(port_id, ret);
 }
 
@@ -2088,6 +2100,7 @@ rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
                return -EINVAL;
        }
 
+       rte_ethdev_trace_txq_setup(port_id, tx_queue_id, nb_tx_desc, tx_conf);
        return eth_err(port_id, (*dev->dev_ops->tx_queue_setup)(dev,
                       tx_queue_id, nb_tx_desc, socket_id, &local_conf));
 }
@@ -5189,9 +5202,109 @@ parse_cleanup:
        return result;
 }
 
+static int
+handle_port_list(const char *cmd __rte_unused,
+               const char *params __rte_unused,
+               struct rte_tel_data *d)
+{
+       int port_id;
+
+       rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
+       RTE_ETH_FOREACH_DEV(port_id)
+               rte_tel_data_add_array_int(d, port_id);
+       return 0;
+}
+
+static int
+handle_port_xstats(const char *cmd __rte_unused,
+               const char *params,
+               struct rte_tel_data *d)
+{
+       struct rte_eth_xstat *eth_xstats;
+       struct rte_eth_xstat_name *xstat_names;
+       int port_id, num_xstats;
+       int i, ret;
+
+       if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+               return -1;
+
+       port_id = atoi(params);
+       if (!rte_eth_dev_is_valid_port(port_id))
+               return -1;
+
+       num_xstats = rte_eth_xstats_get(port_id, NULL, 0);
+       if (num_xstats < 0)
+               return -1;
+
+       /* use one malloc for both names and stats */
+       eth_xstats = malloc((sizeof(struct rte_eth_xstat) +
+                       sizeof(struct rte_eth_xstat_name)) * num_xstats);
+       if (eth_xstats == NULL)
+               return -1;
+       xstat_names = (void *)&eth_xstats[num_xstats];
+
+       ret = rte_eth_xstats_get_names(port_id, xstat_names, num_xstats);
+       if (ret < 0 || ret > num_xstats) {
+               free(eth_xstats);
+               return -1;
+       }
+
+       ret = rte_eth_xstats_get(port_id, eth_xstats, num_xstats);
+       if (ret < 0 || ret > num_xstats) {
+               free(eth_xstats);
+               return -1;
+       }
+
+       rte_tel_data_start_dict(d);
+       for (i = 0; i < num_xstats; i++)
+               rte_tel_data_add_dict_u64(d, xstat_names[i].name,
+                               eth_xstats[i].value);
+       return 0;
+}
+
+static int
+handle_port_link_status(const char *cmd __rte_unused,
+               const char *params,
+               struct rte_tel_data *d)
+{
+       static const char *status_str = "status";
+       int ret, port_id;
+       struct rte_eth_link link;
+
+       if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+               return -1;
+
+       port_id = atoi(params);
+       if (!rte_eth_dev_is_valid_port(port_id))
+               return -1;
+
+       ret = rte_eth_link_get(port_id, &link);
+       if (ret < 0)
+               return -1;
+
+       rte_tel_data_start_dict(d);
+       if (!link.link_status) {
+               rte_tel_data_add_dict_string(d, status_str, "DOWN");
+               return 0;
+       }
+       rte_tel_data_add_dict_string(d, status_str, "UP");
+       rte_tel_data_add_dict_u64(d, "speed", link.link_speed);
+       rte_tel_data_add_dict_string(d, "duplex",
+                       (link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
+                               "full-duplex" : "half-duplex");
+       return 0;
+}
+
 RTE_INIT(ethdev_init_log)
 {
        rte_eth_dev_logtype = rte_log_register("lib.ethdev");
        if (rte_eth_dev_logtype >= 0)
                rte_log_set_level(rte_eth_dev_logtype, RTE_LOG_INFO);
+       rte_telemetry_register_cmd("/ethdev/list", handle_port_list,
+                       "Returns list of available ethdev ports. Takes no parameters");
+       rte_telemetry_register_cmd("/ethdev/xstats", handle_port_xstats,
+                       "Returns the extended stats for a port. Parameters: int port_id");
+       rte_telemetry_register_cmd("/ethdev/link_status",
+                       handle_port_link_status,
+                       "Returns the link status for a port. Parameters: int port_id");
 }