ethdev: remove name from extended statistic fetch
[dpdk.git] / lib / librte_ether / rte_ethdev.c
index a31018e..63320cc 100644 (file)
@@ -369,8 +369,7 @@ rte_eth_dev_is_valid_port(uint8_t port_id)
 int
 rte_eth_dev_socket_id(uint8_t port_id)
 {
-       if (!rte_eth_dev_is_valid_port(port_id))
-               return -1;
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
        return rte_eth_devices[port_id].data->numa_node;
 }
 
@@ -383,8 +382,7 @@ rte_eth_dev_count(void)
 static enum rte_eth_dev_type
 rte_eth_dev_get_device_type(uint8_t port_id)
 {
-       if (!rte_eth_dev_is_valid_port(port_id))
-               return RTE_ETH_DEV_UNKNOWN;
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, RTE_ETH_DEV_UNKNOWN);
        return rte_eth_devices[port_id].dev_type;
 }
 
@@ -479,10 +477,7 @@ rte_eth_dev_is_detachable(uint8_t port_id)
 {
        uint32_t dev_flags;
 
-       if (!rte_eth_dev_is_valid_port(port_id)) {
-               RTE_PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
-               return -EINVAL;
-       }
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
 
        switch (rte_eth_devices[port_id].data->kdrv) {
        case RTE_KDRV_IGB_UIO:
@@ -1507,9 +1502,88 @@ rte_eth_stats_reset(uint8_t port_id)
        dev->data->rx_mbuf_alloc_failed = 0;
 }
 
+static int
+get_xstats_count(uint8_t port_id)
+{
+       struct rte_eth_dev *dev;
+       int count;
+
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
+       dev = &rte_eth_devices[port_id];
+       if (dev->dev_ops->xstats_get_names != NULL) {
+               count = (*dev->dev_ops->xstats_get_names)(dev, NULL, 0);
+               if (count < 0)
+                       return count;
+       } else
+               count = 0;
+       count += RTE_NB_STATS;
+       count += dev->data->nb_rx_queues * RTE_NB_RXQ_STATS;
+       count += dev->data->nb_tx_queues * RTE_NB_TXQ_STATS;
+       return count;
+}
+
+int
+rte_eth_xstats_get_names(uint8_t port_id,
+       struct rte_eth_xstat_name *xstats_names,
+       unsigned size)
+{
+       struct rte_eth_dev *dev;
+       int cnt_used_entries;
+       int cnt_expected_entries;
+       uint32_t idx, id_queue;
+
+       cnt_expected_entries = get_xstats_count(port_id);
+       if (xstats_names == NULL || cnt_expected_entries < 0 ||
+                       (int)size < cnt_expected_entries)
+               return cnt_expected_entries;
+
+       /* port_id checked in get_xstats_count() */
+       dev = &rte_eth_devices[port_id];
+       if (dev->dev_ops->xstats_get_names != NULL) {
+               cnt_used_entries = (*dev->dev_ops->xstats_get_names)(
+                       dev, xstats_names, size);
+               if (cnt_used_entries < 0)
+                       return cnt_used_entries;
+       } else
+               /* Driver itself does not support extended stats, but
+                * still have basic stats.
+                */
+               cnt_used_entries = 0;
+
+       for (idx = 0; idx < RTE_NB_STATS; idx++) {
+               xstats_names[cnt_used_entries].id = cnt_used_entries;
+               snprintf(xstats_names[cnt_used_entries].name,
+                       sizeof(xstats_names[0].name),
+                       "%s", rte_stats_strings[idx].name);
+               cnt_used_entries++;
+       }
+       for (id_queue = 0; id_queue < dev->data->nb_rx_queues; id_queue++) {
+               for (idx = 0; idx < RTE_NB_RXQ_STATS; idx++) {
+                       xstats_names[cnt_used_entries].id = cnt_used_entries;
+                       snprintf(xstats_names[cnt_used_entries].name,
+                               sizeof(xstats_names[0].name),
+                               "rx_q%u%s",
+                               id_queue, rte_rxq_stats_strings[idx].name);
+                       cnt_used_entries++;
+               }
+
+       }
+       for (id_queue = 0; id_queue < dev->data->nb_tx_queues; id_queue++) {
+               for (idx = 0; idx < RTE_NB_TXQ_STATS; idx++) {
+                       xstats_names[cnt_used_entries].id = cnt_used_entries;
+                       snprintf(xstats_names[cnt_used_entries].name,
+                               sizeof(xstats_names[0].name),
+                               "tx_q%u%s",
+                               id_queue, rte_txq_stats_strings[idx].name);
+                       cnt_used_entries++;
+               }
+       }
+       return cnt_used_entries;
+}
+
 /* retrieve ethdev extended statistics */
 int
-rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstats *xstats,
+rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
        unsigned n)
 {
        struct rte_eth_stats eth_stats;
@@ -1551,8 +1625,7 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstats *xstats,
                stats_ptr = RTE_PTR_ADD(&eth_stats,
                                        rte_stats_strings[i].offset);
                val = *stats_ptr;
-               snprintf(xstats[count].name, sizeof(xstats[count].name),
-                       "%s", rte_stats_strings[i].name);
+               xstats[count].id = count + xcount;
                xstats[count++].value = val;
        }
 
@@ -1563,9 +1636,7 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstats *xstats,
                                        rte_rxq_stats_strings[i].offset +
                                        q * sizeof(uint64_t));
                        val = *stats_ptr;
-                       snprintf(xstats[count].name, sizeof(xstats[count].name),
-                               "rx_q%u_%s", q,
-                               rte_rxq_stats_strings[i].name);
+                       xstats[count].id = count + xcount;
                        xstats[count++].value = val;
                }
        }
@@ -1577,9 +1648,7 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstats *xstats,
                                        rte_txq_stats_strings[i].offset +
                                        q * sizeof(uint64_t));
                        val = *stats_ptr;
-                       snprintf(xstats[count].name, sizeof(xstats[count].name),
-                               "tx_q%u_%s", q,
-                               rte_txq_stats_strings[i].name);
+                       xstats[count].id = count + xcount;
                        xstats[count++].value = val;
                }
        }
@@ -1994,10 +2063,7 @@ rte_eth_dev_rss_reta_query(uint8_t port_id,
        struct rte_eth_dev *dev;
        int ret;
 
-       if (port_id >= nb_ports) {
-               RTE_PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
-               return -ENODEV;
-       }
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 
        /* Check mask bits */
        ret = rte_eth_check_reta_mask(reta_conf, reta_size);
@@ -2641,10 +2707,7 @@ rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data)
        uint16_t qid;
        int rc;
 
-       if (!rte_eth_dev_is_valid_port(port_id)) {
-               RTE_PMD_DEBUG_TRACE("Invalid port_id=%u\n", port_id);
-               return -ENODEV;
-       }
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 
        dev = &rte_eth_devices[port_id];
        intr_handle = &dev->pci_dev->intr_handle;
@@ -2699,10 +2762,7 @@ rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
        struct rte_intr_handle *intr_handle;
        int rc;
 
-       if (!rte_eth_dev_is_valid_port(port_id)) {
-               RTE_PMD_DEBUG_TRACE("Invalid port_id=%u\n", port_id);
-               return -ENODEV;
-       }
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 
        dev = &rte_eth_devices[port_id];
        if (queue_id >= dev->data->nb_rx_queues) {
@@ -2734,10 +2794,7 @@ rte_eth_dev_rx_intr_enable(uint8_t port_id,
 {
        struct rte_eth_dev *dev;
 
-       if (!rte_eth_dev_is_valid_port(port_id)) {
-               RTE_PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
-               return -ENODEV;
-       }
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 
        dev = &rte_eth_devices[port_id];
 
@@ -2751,10 +2808,7 @@ rte_eth_dev_rx_intr_disable(uint8_t port_id,
 {
        struct rte_eth_dev *dev;
 
-       if (!rte_eth_dev_is_valid_port(port_id)) {
-               RTE_PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
-               return -ENODEV;
-       }
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 
        dev = &rte_eth_devices[port_id];
 
@@ -3001,10 +3055,10 @@ rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
        return -ENOTSUP;
 #endif
        /* Check input parameters. */
-       if (!rte_eth_dev_is_valid_port(port_id) || user_cb == NULL ||
-                   queue_id >= rte_eth_devices[port_id].data->nb_rx_queues) {
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
+       if (user_cb == NULL ||
+                       queue_id >= rte_eth_devices[port_id].data->nb_rx_queues)
                return -EINVAL;
-       }
 
        struct rte_eth_dev *dev = &rte_eth_devices[port_id];
        struct rte_eth_rxtx_callback *cb = dev->post_rx_burst_cbs[queue_id];
@@ -3040,10 +3094,10 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
        return -ENOTSUP;
 #endif
        /* Check input parameters. */
-       if (!rte_eth_dev_is_valid_port(port_id) || user_cb == NULL ||
-                   queue_id >= rte_eth_devices[port_id].data->nb_tx_queues) {
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
+       if (user_cb == NULL ||
+                       queue_id >= rte_eth_devices[port_id].data->nb_tx_queues)
                return -EINVAL;
-       }
 
        struct rte_eth_dev *dev = &rte_eth_devices[port_id];
        struct rte_eth_rxtx_callback *cb = dev->pre_tx_burst_cbs[queue_id];
@@ -3284,10 +3338,7 @@ rte_eth_dev_get_dcb_info(uint8_t port_id,
 {
        struct rte_eth_dev *dev;
 
-       if (!rte_eth_dev_is_valid_port(port_id)) {
-               RTE_PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
-               return -ENODEV;
-       }
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
 
        dev = &rte_eth_devices[port_id];
        memset(dcb_info, 0, sizeof(struct rte_eth_dcb_info));