/* SPDX-License-Identifier: Apache-2.0
 * Copyright (c) 2024 Cisco Systems, Inc.
 */

#ifndef included_vnet_crypto_engine_h
#define included_vnet_crypto_engine_h

#ifndef included_clib_types_h
typedef unsigned int u32;
#endif

typedef struct
{
  vnet_crypto_op_id_t opt;
  vnet_crypto_ops_handler_t *fn;
  vnet_crypto_chained_ops_handler_t *cfn;
} vnet_crypto_engine_op_handlers_t;

struct vnet_crypto_engine_registration;

typedef char *(
  vnet_crypto_engine_init_fn_t) (struct vnet_crypto_engine_registration *);

typedef struct vnet_crypto_engine_registration
{
  char name[32];  /* backend name */
  char desc[128]; /* backend name */
  int prio;
  u32 version;
  u32 per_thread_data_sz;
  u32 num_threads;
  void *per_thread_data;
  vnet_crypto_engine_init_fn_t *init_fn;
  vnet_crypto_key_handler_t *key_handler;
  vnet_crypto_engine_op_handlers_t *op_handlers;
} vnet_crypto_engine_registration_t;

#define VNET_CRYPTO_ENGINE_REGISTRATION()                                     \
  __clib_export vnet_crypto_engine_registration_t __vnet_crypto_engine

#endif
