vlib: improvement to automatic core pinning
[vpp.git] / src / plugins / crypto_native / main.c
1 /*
2  *------------------------------------------------------------------
3  * Copyright (c) 2019 Cisco and/or its affiliates.
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *------------------------------------------------------------------
16  */
17
18 #include <vlib/vlib.h>
19 #include <vnet/plugin/plugin.h>
20 #include <vnet/crypto/crypto.h>
21 #include <crypto_native/crypto_native.h>
22
23 crypto_native_main_t crypto_native_main;
24
25 static void
26 crypto_native_key_handler (vlib_main_t * vm, vnet_crypto_key_op_t kop,
27                            vnet_crypto_key_index_t idx)
28 {
29   vnet_crypto_key_t *key = vnet_crypto_get_key (idx);
30   crypto_native_main_t *cm = &crypto_native_main;
31
32   /** TODO: add linked alg support **/
33   if (key->type == VNET_CRYPTO_KEY_TYPE_LINK)
34     return;
35
36   if (cm->key_fn[key->alg] == 0)
37     return;
38
39   if (kop == VNET_CRYPTO_KEY_OP_DEL)
40     {
41       if (idx >= vec_len (cm->key_data))
42         return;
43
44       if (cm->key_data[idx] == 0)
45         return;
46
47       clib_mem_free_s (cm->key_data[idx]);
48       cm->key_data[idx] = 0;
49       return;
50     }
51
52   vec_validate_aligned (cm->key_data, idx, CLIB_CACHE_LINE_BYTES);
53
54   if (kop == VNET_CRYPTO_KEY_OP_MODIFY && cm->key_data[idx])
55     {
56       clib_mem_free_s (cm->key_data[idx]);
57     }
58
59   cm->key_data[idx] = cm->key_fn[key->alg] (key);
60 }
61
62 clib_error_t *
63 crypto_native_init (vlib_main_t * vm)
64 {
65   crypto_native_main_t *cm = &crypto_native_main;
66
67   if (cm->op_handlers == 0)
68     return 0;
69
70   cm->crypto_engine_index =
71     vnet_crypto_register_engine (vm, "native", 100,
72                                  "Native ISA Optimized Crypto");
73
74   crypto_native_op_handler_t *oh = cm->op_handlers;
75   crypto_native_key_handler_t *kh = cm->key_handlers;
76   crypto_native_op_handler_t **best_by_op_id = 0;
77   crypto_native_key_handler_t **best_by_alg_id = 0;
78
79   while (oh)
80     {
81       vec_validate (best_by_op_id, oh->op_id);
82
83       if (best_by_op_id[oh->op_id] == 0 ||
84           best_by_op_id[oh->op_id]->priority < oh->priority)
85         best_by_op_id[oh->op_id] = oh;
86
87       oh = oh->next;
88     }
89
90   while (kh)
91     {
92       vec_validate (best_by_alg_id, kh->alg_id);
93
94       if (best_by_alg_id[kh->alg_id] == 0 ||
95           best_by_alg_id[kh->alg_id]->priority < kh->priority)
96         best_by_alg_id[kh->alg_id] = kh;
97
98       kh = kh->next;
99     }
100
101   vec_foreach_pointer (oh, best_by_op_id)
102     if (oh)
103       vnet_crypto_register_ops_handlers (vm, cm->crypto_engine_index,
104                                          oh->op_id, oh->fn, oh->cfn);
105
106   vec_foreach_pointer (kh, best_by_alg_id)
107     if (kh)
108       cm->key_fn[kh->alg_id] = kh->key_fn;
109
110   vec_free (best_by_op_id);
111   vec_free (best_by_alg_id);
112
113   vnet_crypto_register_key_handler (vm, cm->crypto_engine_index,
114                                     crypto_native_key_handler);
115   return 0;
116 }
117
118 VLIB_INIT_FUNCTION (crypto_native_init) =
119 {
120   .runs_after = VLIB_INITS ("vnet_crypto_init"),
121 };
122
123 #include <vpp/app/version.h>
124
125 VLIB_PLUGIN_REGISTER () = {
126   .version = VPP_BUILD_VER,
127   .description = "Native Crypto Engine",
128 };