> +#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

Reply via email to