aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/crypto_native/crypto_native.h
blob: 3d18e8cabd0075b5b47304a47c489578f759cbfd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*
 *------------------------------------------------------------------
 * Copyright (c) 2019 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *------------------------------------------------------------------
 */

#ifndef __crypto_native_h__
#define __crypto_native_h__

typedef void *(crypto_native_key_fn_t) (vnet_crypto_key_t * key);
typedef int (crypto_native_variant_probe_t) ();

typedef struct crypto_native_op_handler
{
  struct crypto_native_op_handler *next;
  vnet_crypto_op_id_t op_id;
  vnet_crypto_ops_handler_t *fn;
  vnet_crypto_chained_ops_handler_t *cfn;
  crypto_native_variant_probe_t *probe;
  int priority;
} crypto_native_op_handler_t;

typedef struct crypto_native_key_handler
{
  struct crypto_native_key_handler *next;
  vnet_crypto_alg_t alg_id;
  crypto_native_key_fn_t *key_fn;
  crypto_native_variant_probe_t *probe;
  int priority;
} crypto_native_key_handler_t;

typedef struct
{
  u32 crypto_engine_index;
  crypto_native_key_fn_t *key_fn[VNET_CRYPTO_N_ALGS];
  void **key_data;
  crypto_native_op_handler_t *op_handlers;
  crypto_native_key_handler_t *key_handlers;
} crypto_native_main_t;

extern crypto_native_main_t crypto_native_main;

#define CRYPTO_NATIVE_OP_HANDLER(x)                                           \
  static crypto_native_op_handler_t __crypto_native_op_handler_##x;           \
  static void __clib_constructor __crypto_native_op_handler_cb_##x (void)     \
  {                                                                           \
    crypto_native_main_t *cm = &crypto_native_main;                           \
    int priority = __crypto_native_op_handler_##x.probe ();                   \
    if (priority >= 0)                                                        \
      {                                                                       \
	__crypto_native_op_handler_##x.priority = priority;                   \
	__crypto_native_op_handler_##x.next = cm->op_handlers;                \
	cm->op_handlers = &__crypto_native_op_handler_##x;                    \
      }                                                                       \
  }                                                                           \
  static crypto_native_op_handler_t __crypto_native_op_handler_##x

#define CRYPTO_NATIVE_KEY_HANDLER(x)                                          \
  static crypto_native_key_handler_t __crypto_native_key_handler_##x;         \
  static void __clib_constructor __crypto_native_key_handler_cb_##x (void)    \
  {                                                                           \
    crypto_native_main_t *cm = &crypto_native_main;                           \
    int priority = __crypto_native_key_handler_##x.probe ();                  \
    if (priority >= 0)                                                        \
      {                                                                       \
	__crypto_native_key_handler_##x.priority = priority;                  \
	__crypto_native_key_handler_##x.next = cm->key_handlers;              \
	cm->key_handlers = &__crypto_native_key_handler_##x;                  \
      }                                                                       \
  }                                                                           \
  static crypto_native_key_handler_t __crypto_native_key_handler_##x
#endif /* __crypto_native_h__ */