Currently, Rx/Tx offloads are displayed in numeric format,
which is not easy to understand. This patch fixes it.

Signed-off-by: Jie Hai <haij...@huawei.com>
---
 lib/ethdev/rte_ethdev_telemetry.c | 64 ++++++++++++++++++++++++++-----
 1 file changed, 55 insertions(+), 9 deletions(-)

diff --git a/lib/ethdev/rte_ethdev_telemetry.c 
b/lib/ethdev/rte_ethdev_telemetry.c
index 6ba7adf7d08f..3b6060a7356a 100644
--- a/lib/ethdev/rte_ethdev_telemetry.c
+++ b/lib/ethdev/rte_ethdev_telemetry.c
@@ -248,11 +248,38 @@ eth_dev_handle_port_link_status(const char *cmd 
__rte_unused,
        return 0;
 }
 
+static void
+eth_dev_parse_rx_offloads(uint64_t offload, struct rte_tel_data *d)
+{
+       uint64_t i;
+
+       rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+       for (i = 0; i < CHAR_BIT * sizeof(offload); i++) {
+               if ((offload & RTE_BIT64(i)) != 0)
+                       rte_tel_data_add_array_string(d,
+                               rte_eth_dev_rx_offload_name(offload & 
RTE_BIT64(i)));
+       }
+}
+
+static void
+eth_dev_parse_tx_offloads(uint64_t offload, struct rte_tel_data *d)
+{
+       uint64_t i;
+
+       rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+       for (i = 0; i < CHAR_BIT * sizeof(offload); i++) {
+               if ((offload & RTE_BIT64(i)) != 0)
+                       rte_tel_data_add_array_string(d,
+                               rte_eth_dev_tx_offload_name(offload & 
RTE_BIT64(i)));
+       }
+}
+
 static int
 eth_dev_handle_port_info(const char *cmd __rte_unused,
                const char *params,
                struct rte_tel_data *d)
 {
+       struct rte_tel_data *rx_offload, *tx_offload;
        struct rte_tel_data *rxq_state, *txq_state;
        char mac_addr[RTE_ETHER_ADDR_FMT_SIZE];
        struct rte_eth_dev *eth_dev;
@@ -268,14 +295,20 @@ eth_dev_handle_port_info(const char *cmd __rte_unused,
        eth_dev = &rte_eth_devices[port_id];
 
        rxq_state = rte_tel_data_alloc();
-       if (!rxq_state)
+       if (rxq_state == NULL)
                return -ENOMEM;
 
        txq_state = rte_tel_data_alloc();
-       if (!txq_state) {
-               rte_tel_data_free(rxq_state);
-               return -ENOMEM;
-       }
+       if (txq_state == NULL)
+               goto free_rxq_state;
+
+       rx_offload = rte_tel_data_alloc();
+       if (rx_offload == NULL)
+               goto free_txq_state;
+
+       tx_offload = rte_tel_data_alloc();
+       if (tx_offload == NULL)
+               goto free_rx_offload;
 
        rte_tel_data_start_dict(d);
        rte_tel_data_add_dict_string(d, "name", eth_dev->data->name);
@@ -317,14 +350,27 @@ eth_dev_handle_port_info(const char *cmd __rte_unused,
        rte_tel_data_add_dict_int(d, "numa_node", eth_dev->data->numa_node);
        rte_tel_data_add_dict_uint_hex(d, "dev_flags",
                        eth_dev->data->dev_flags, 0);
-       rte_tel_data_add_dict_uint_hex(d, "rx_offloads",
-                       eth_dev->data->dev_conf.rxmode.offloads, 0);
-       rte_tel_data_add_dict_uint_hex(d, "tx_offloads",
-                       eth_dev->data->dev_conf.txmode.offloads, 0);
+
+       eth_dev_parse_rx_offloads(eth_dev->data->dev_conf.rxmode.offloads,
+                       rx_offload);
+       rte_tel_data_add_dict_container(d, "rx_offloads", rx_offload, 0);
+       eth_dev_parse_tx_offloads(eth_dev->data->dev_conf.txmode.offloads,
+                       tx_offload);
+       rte_tel_data_add_dict_container(d, "tx_offloads", tx_offload, 0);
+
        rte_tel_data_add_dict_uint_hex(d, "ethdev_rss_hf",
                        eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf, 0);
 
        return 0;
+
+free_rx_offload:
+       rte_tel_data_free(rx_offload);
+free_txq_state:
+       rte_tel_data_free(txq_state);
+free_rxq_state:
+       rte_tel_data_free(rxq_state);
+
+       return -ENOMEM;
 }
 
 static int
-- 
2.33.0

Reply via email to