Hi Dmitry,

Have you got the CRYPTO_set_id_callback building issue? implicit
declaration, because of failing define the macro OPENSSL_USE_DEPRECATED .
Looks like the function is deprecated by #ifdef in openssl/crypto.h.

# ifdef OPENSSL_USE_DEPRECATED
DECLARE_DEPRECATED(void CRYPTO_set_id_callback(unsigned long (*func)
(void)));
/*
 * mkdef.pl cannot handle this next one so not inside DECLARE_DEPRECATED,
 * but still inside OPENSSL_USE_DEPRECATED
 */
unsigned long (*CRYPTO_get_id_callback(void)) (void);
DECLARE_DEPRECATED(unsigned long CRYPTO_thread_id(void));
# endif

Thanks,
Forrest

On 8 February 2017 at 02:06, Dmitry Eremin-Solenikov <
dmitry.ereminsoleni...@linaro.org> wrote:

> In preparation to update crypto code for OpenSSL 1.1.0 move locks out of
> global data.
>
> Signed-off-by: Dmitry Eremin-Solenikov <dmitry.ereminsoleni...@linaro.org>
> ---
>  platform/linux-generic/odp_crypto.c | 67 ++++++++++++++++++++++++++----
> -------
>  1 file changed, 47 insertions(+), 20 deletions(-)
>
> diff --git a/platform/linux-generic/odp_crypto.c
> b/platform/linux-generic/odp_crypto.c
> index b53b0fc1..d83b8e09 100644
> --- a/platform/linux-generic/odp_crypto.c
> +++ b/platform/linux-generic/odp_crypto.c
> @@ -64,7 +64,6 @@ typedef struct odp_crypto_global_s odp_crypto_global_t;
>
>  struct odp_crypto_global_s {
>         odp_spinlock_t                lock;
> -       odp_ticketlock_t **openssl_lock;
>         odp_crypto_generic_session_t *free;
>         odp_crypto_generic_session_t  sessions[0];
>  };
> @@ -954,16 +953,53 @@ static unsigned long openssl_thread_id(void)
>         return (unsigned long)odp_thread_id();
>  }
>
> +odp_ticketlock_t *openssl_locks;
> +
>  static void openssl_lock(int mode, int n,
>                          const char *file ODP_UNUSED,
>                          int line ODP_UNUSED)
>  {
>         if (mode & CRYPTO_LOCK)
> -               odp_ticketlock_lock((odp_ticketlock_t *)
> -                                   &global->openssl_lock[n]);
> +               odp_ticketlock_lock(&openssl_locks[n]);
>         else
> -               odp_ticketlock_unlock((odp_ticketlock_t *)
> -                                     &global->openssl_lock[n]);
> +               odp_ticketlock_unlock(&openssl_locks[n]);
> +}
> +
> +static void openssl_init_locks(void)
> +{
> +       int nlocks;
> +       size_t mem_size;
> +       odp_shm_t shm;
> +       int idx;
> +
> +       nlocks = CRYPTO_num_locks();
> +       if (nlocks <= 0)
> +               return;
> +
> +       mem_size = nlocks * sizeof(odp_ticketlock_t);
> +
> +       /* Allocate our globally shared memory */
> +       shm = odp_shm_reserve("crypto_openssl_locks", mem_size,
> +                             ODP_CACHE_LINE_SIZE, 0);
> +
> +       openssl_locks = odp_shm_addr(shm);
> +
> +       /* Clear it out */
> +       memset(openssl_locks, 0, mem_size);
> +
> +       for (idx = 0; idx < nlocks; idx++)
> +               odp_ticketlock_init(&openssl_locks[idx]);
> +
> +       CRYPTO_set_id_callback(openssl_thread_id);
> +       CRYPTO_set_locking_callback(openssl_lock);
> +}
> +
> +static int openssl_term_locks(void)
> +{
> +       CRYPTO_set_locking_callback(NULL);
> +       CRYPTO_set_id_callback(NULL);
> +
> +       return odp_shm_free(odp_shm_lookup("crypto_openssl_locks"));
>  }
>
>  int
> @@ -972,12 +1008,10 @@ odp_crypto_init_global(void)
>         size_t mem_size;
>         odp_shm_t shm;
>         int idx;
> -       int nlocks = CRYPTO_num_locks();
>
>         /* Calculate the memory size we need */
>         mem_size  = sizeof(*global);
>         mem_size += (MAX_SESSIONS * sizeof(odp_crypto_generic_session_t));
> -       mem_size += nlocks * sizeof(odp_ticketlock_t);
>
>         /* Allocate our globally shared memory */
>         shm = odp_shm_reserve("crypto_pool", mem_size,
> @@ -995,17 +1029,7 @@ odp_crypto_init_global(void)
>         }
>         odp_spinlock_init(&global->lock);
>
> -       if (nlocks > 0) {
> -               global->openssl_lock =
> -                       (odp_ticketlock_t **)&global->sessions[MAX_
> SESSIONS];
> -
> -               for (idx = 0; idx < nlocks; idx++)
> -                       odp_ticketlock_init((odp_ticketlock_t *)
> -                                           &global->openssl_lock[idx]);
> -
> -               CRYPTO_set_id_callback(openssl_thread_id);
> -               CRYPTO_set_locking_callback(openssl_lock);
> -       }
> +       openssl_init_locks();
>
>         return 0;
>  }
> @@ -1024,8 +1048,11 @@ int odp_crypto_term_global(void)
>                 rc = -1;
>         }
>
> -       CRYPTO_set_locking_callback(NULL);
> -       CRYPTO_set_id_callback(NULL);
> +       ret = openssl_term_locks();
> +       if (ret < 0) {
> +               ODP_ERR("shm free failed for crypto_openssl_locks\n");
> +               rc = -1;
> +       }
>
>         ret = odp_shm_free(odp_shm_lookup("crypto_pool"));
>         if (ret < 0) {
> --
> 2.11.0
>
>

Reply via email to