> +#define CRYPTO_CAPS_SZ \ > + (RTE_ALIGN_CEIL(sizeof(struct rte_cryptodev_capabilities), \ > + sizeof(uint64_t)) / \ > + sizeof(uint64_t)) > + > +static int > +crypto_caps_array(struct rte_tel_data *d, > + const struct rte_cryptodev_capabilities *capabilities) > +{ > + const struct rte_cryptodev_capabilities *dev_caps; > + union caps_u { > + struct rte_cryptodev_capabilities dev_caps; > + uint64_t val[CRYPTO_CAPS_SZ]; > + } caps; > + unsigned int i = 0, j, n = 0; > + > + rte_tel_data_start_array(d, RTE_TEL_U64_VAL); > + > + while ((dev_caps = &capabilities[i++])->op != > + RTE_CRYPTO_OP_TYPE_UNDEFINED) { > + memset(&caps, 0, sizeof(caps)); > + rte_memcpy(&caps.dev_caps, dev_caps, > sizeof(capabilities[0])); > + for (j = 0; j < CRYPTO_CAPS_SZ; j++) > + rte_tel_data_add_array_u64(d, caps.val[j]); > + ++n; > + } > + > + return n; > +}
We do not need 2 iterators i and n. both are for same purpose. Also, union is not required for caps. static int crypto_caps_array(struct rte_tel_data *d, const struct rte_cryptodev_capabilities *capabilities) { const struct rte_cryptodev_capabilities *dev_caps; uint64_t caps_val[CRYPTO_CAPS_SZ]; unsigned int j, n = 0; rte_tel_data_start_array(d, RTE_TEL_U64_VAL); while ((dev_caps = &capabilities[n++])->op != RTE_CRYPTO_OP_TYPE_UNDEFINED) { memset(&caps_val, 0, CRYPTO_CAPS_SZ * sizeof(uint64_t)); rte_memcpy(caps_val, dev_caps, sizeof(capabilities[0])); for (j = 0; j < CRYPTO_CAPS_SZ; j++) rte_tel_data_add_array_u64(d, caps_val[j]); } return n; } > + > +static int > +cryptodev_handle_dev_caps(const char *cmd __rte_unused, const char > *params, > + struct rte_tel_data *d) > +{ > + struct rte_cryptodev_info dev_info; > + struct rte_tel_data *crypto_caps; > + int crypto_caps_n; > + char *end_param; > + int dev_id; > + > + if (!params || strlen(params) == 0 || !isdigit(*params)) > + return -EINVAL; > + > + dev_id = strtoul(params, &end_param, 0); > + if (*end_param != '\0') > + CDEV_LOG_ERR("Extra parameters passed to command, > ignoring"); > + if (!rte_cryptodev_is_valid_dev(dev_id)) > + return -EINVAL; > + > + rte_tel_data_start_dict(d); > + crypto_caps = rte_tel_data_alloc(); > + if (!crypto_caps) > + return -ENOMEM; > + > + rte_cryptodev_info_get(dev_id, &dev_info); > + crypto_caps_n = crypto_caps_array(crypto_caps, > dev_info.capabilities); > + rte_tel_data_add_dict_container(d, "crypto_caps", crypto_caps, 0); > + rte_tel_data_add_dict_int(d, "crypto_caps_n", crypto_caps_n); > + > + return 0; > +} > + > RTE_INIT(cryptodev_init_telemetry) > { > rte_telemetry_register_cmd("/cryptodev/info", > cryptodev_handle_dev_info, > @@ -2517,4 +2579,7 @@ RTE_INIT(cryptodev_init_telemetry) > rte_telemetry_register_cmd("/cryptodev/stats", > cryptodev_handle_dev_stats, > "Returns the stats for a cryptodev. Parameters: int > dev_id"); > + rte_telemetry_register_cmd("/cryptodev/caps", > + cryptodev_handle_dev_caps, > + "Returns the capabilities for a cryptodev. Parameters: > int dev_id"); > } > -- > 2.25.1