> +++ b/app/test/test_cryptodev_asym.c
> @@ -581,7 +581,7 @@ static inline void print_asym_capa(
>                       rte_cryptodev_asym_get_xform_string(capa->xform_type));
>       printf("operation supported -");
> 
> -     for (i = 0; i < RTE_CRYPTO_ASYM_OP_LIST_END; i++) {
> +     for (i = 0; i < rte_crypto_asym_op_list_end(); i++) {

> +++ b/lib/cryptodev/rte_crypto_asym.h
> +static inline int
> +rte_crypto_asym_xform_type_list_end(void)
> +{
> +     return RTE_CRYPTO_ASYM_XFORM_SM2 + 1;
> +}
> +
>  /**
>   * Asymmetric crypto operation type variants
> + * Note: Update rte_crypto_asym_op_list_end for every new type added.
>   */
>  enum rte_crypto_asym_op_type {
>       RTE_CRYPTO_ASYM_OP_ENCRYPT,
> @@ -135,9 +141,14 @@ enum rte_crypto_asym_op_type {
>       /**< Signature Generation operation */
>       RTE_CRYPTO_ASYM_OP_VERIFY,
>       /**< Signature Verification operation */
> -     RTE_CRYPTO_ASYM_OP_LIST_END
>  };
>
> +static inline int
> +rte_crypto_asym_op_list_end(void)
> +{
> +     return RTE_CRYPTO_ASYM_OP_VERIFY + 1;
> +}

I like the concept of replacing an "last enum value" with a "last enum 
function" for API/ABI compatibility purposes.

Here's an idea...

We can introduce a generic design pattern where we keep the _LIST_END enum 
value at the end, somehow marking it private (and not part of the API/ABI), and 
move the _list_end() function inside the C file, so it uses the _LIST_END enum 
value that the library was built with. E.g. like this:


In the header file:

enum rte_crypto_asym_op_type {
        RTE_CRYPTO_ASYM_OP_VERIFY,
        /**< Signature Verification operation */
#if RTE_BUILDING_INTERNAL
        __RTE_CRYPTO_ASYM_OP_LIST_END /* internal */
#endif
}

int rte_crypto_asym_op_list_end(void);


And in the associated library code file, when including rte_crypto_asym.h:

#define RTE_BUILDING_INTERNAL
#include <cryptodev/rte_crypto_asym.h>

int
rte_crypto_asym_op_list_end(void)
{
        return __RTE_CRYPTO_ASYM_OP_LIST_END;
}

Reply via email to