xref: /dpdk/drivers/crypto/openssl/rte_openssl_pmd_ops.c (revision 8a9867a635c0572e926d87b7207dd064546388de)
1*8a9867a6SSlawomir Mrozowicz /*-
2*8a9867a6SSlawomir Mrozowicz  *   BSD LICENSE
3*8a9867a6SSlawomir Mrozowicz  *
4*8a9867a6SSlawomir Mrozowicz  *   Copyright(c) 2016 Intel Corporation. All rights reserved.
5*8a9867a6SSlawomir Mrozowicz  *
6*8a9867a6SSlawomir Mrozowicz  *   Redistribution and use in source and binary forms, with or without
7*8a9867a6SSlawomir Mrozowicz  *   modification, are permitted provided that the following conditions
8*8a9867a6SSlawomir Mrozowicz  *   are met:
9*8a9867a6SSlawomir Mrozowicz  *
10*8a9867a6SSlawomir Mrozowicz  *     * Redistributions of source code must retain the above copyright
11*8a9867a6SSlawomir Mrozowicz  *       notice, this list of conditions and the following disclaimer.
12*8a9867a6SSlawomir Mrozowicz  *     * Redistributions in binary form must reproduce the above copyright
13*8a9867a6SSlawomir Mrozowicz  *       notice, this list of conditions and the following disclaimer in
14*8a9867a6SSlawomir Mrozowicz  *       the documentation and/or other materials provided with the
15*8a9867a6SSlawomir Mrozowicz  *       distribution.
16*8a9867a6SSlawomir Mrozowicz  *     * Neither the name of Intel Corporation nor the names of its
17*8a9867a6SSlawomir Mrozowicz  *       contributors may be used to endorse or promote products derived
18*8a9867a6SSlawomir Mrozowicz  *       from this software without specific prior written permission.
19*8a9867a6SSlawomir Mrozowicz  *
20*8a9867a6SSlawomir Mrozowicz  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*8a9867a6SSlawomir Mrozowicz  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*8a9867a6SSlawomir Mrozowicz  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23*8a9867a6SSlawomir Mrozowicz  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24*8a9867a6SSlawomir Mrozowicz  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25*8a9867a6SSlawomir Mrozowicz  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26*8a9867a6SSlawomir Mrozowicz  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27*8a9867a6SSlawomir Mrozowicz  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28*8a9867a6SSlawomir Mrozowicz  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*8a9867a6SSlawomir Mrozowicz  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30*8a9867a6SSlawomir Mrozowicz  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*8a9867a6SSlawomir Mrozowicz  */
32*8a9867a6SSlawomir Mrozowicz 
33*8a9867a6SSlawomir Mrozowicz #include <string.h>
34*8a9867a6SSlawomir Mrozowicz 
35*8a9867a6SSlawomir Mrozowicz #include <rte_common.h>
36*8a9867a6SSlawomir Mrozowicz #include <rte_malloc.h>
37*8a9867a6SSlawomir Mrozowicz #include <rte_cryptodev_pmd.h>
38*8a9867a6SSlawomir Mrozowicz 
39*8a9867a6SSlawomir Mrozowicz #include "rte_openssl_pmd_private.h"
40*8a9867a6SSlawomir Mrozowicz 
41*8a9867a6SSlawomir Mrozowicz 
42*8a9867a6SSlawomir Mrozowicz static const struct rte_cryptodev_capabilities openssl_pmd_capabilities[] = {
43*8a9867a6SSlawomir Mrozowicz 	{	/* MD5 HMAC */
44*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
45*8a9867a6SSlawomir Mrozowicz 		{.sym = {
46*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
47*8a9867a6SSlawomir Mrozowicz 			{.auth = {
48*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_MD5_HMAC,
49*8a9867a6SSlawomir Mrozowicz 				.block_size = 64,
50*8a9867a6SSlawomir Mrozowicz 				.key_size = {
51*8a9867a6SSlawomir Mrozowicz 					.min = 64,
52*8a9867a6SSlawomir Mrozowicz 					.max = 64,
53*8a9867a6SSlawomir Mrozowicz 					.increment = 0
54*8a9867a6SSlawomir Mrozowicz 				},
55*8a9867a6SSlawomir Mrozowicz 				.digest_size = {
56*8a9867a6SSlawomir Mrozowicz 					.min = 16,
57*8a9867a6SSlawomir Mrozowicz 					.max = 16,
58*8a9867a6SSlawomir Mrozowicz 					.increment = 0
59*8a9867a6SSlawomir Mrozowicz 				},
60*8a9867a6SSlawomir Mrozowicz 				.aad_size = { 0 }
61*8a9867a6SSlawomir Mrozowicz 			}, }
62*8a9867a6SSlawomir Mrozowicz 		}, }
63*8a9867a6SSlawomir Mrozowicz 	},
64*8a9867a6SSlawomir Mrozowicz 	{	/* MD5 */
65*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
66*8a9867a6SSlawomir Mrozowicz 		{.sym = {
67*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
68*8a9867a6SSlawomir Mrozowicz 			{.auth = {
69*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_MD5,
70*8a9867a6SSlawomir Mrozowicz 				.block_size = 64,
71*8a9867a6SSlawomir Mrozowicz 				.key_size = {
72*8a9867a6SSlawomir Mrozowicz 					.min = 0,
73*8a9867a6SSlawomir Mrozowicz 					.max = 0,
74*8a9867a6SSlawomir Mrozowicz 					.increment = 0
75*8a9867a6SSlawomir Mrozowicz 				},
76*8a9867a6SSlawomir Mrozowicz 				.digest_size = {
77*8a9867a6SSlawomir Mrozowicz 					.min = 16,
78*8a9867a6SSlawomir Mrozowicz 					.max = 16,
79*8a9867a6SSlawomir Mrozowicz 					.increment = 0
80*8a9867a6SSlawomir Mrozowicz 				},
81*8a9867a6SSlawomir Mrozowicz 				.aad_size = { 0 }
82*8a9867a6SSlawomir Mrozowicz 			}, }
83*8a9867a6SSlawomir Mrozowicz 		}, }
84*8a9867a6SSlawomir Mrozowicz 	},
85*8a9867a6SSlawomir Mrozowicz 	{	/* SHA1 HMAC */
86*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
87*8a9867a6SSlawomir Mrozowicz 		{.sym = {
88*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
89*8a9867a6SSlawomir Mrozowicz 			{.auth = {
90*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
91*8a9867a6SSlawomir Mrozowicz 				.block_size = 64,
92*8a9867a6SSlawomir Mrozowicz 				.key_size = {
93*8a9867a6SSlawomir Mrozowicz 					.min = 64,
94*8a9867a6SSlawomir Mrozowicz 					.max = 64,
95*8a9867a6SSlawomir Mrozowicz 					.increment = 0
96*8a9867a6SSlawomir Mrozowicz 				},
97*8a9867a6SSlawomir Mrozowicz 				.digest_size = {
98*8a9867a6SSlawomir Mrozowicz 					.min = 20,
99*8a9867a6SSlawomir Mrozowicz 					.max = 20,
100*8a9867a6SSlawomir Mrozowicz 					.increment = 0
101*8a9867a6SSlawomir Mrozowicz 				},
102*8a9867a6SSlawomir Mrozowicz 				.aad_size = { 0 }
103*8a9867a6SSlawomir Mrozowicz 			}, }
104*8a9867a6SSlawomir Mrozowicz 		}, }
105*8a9867a6SSlawomir Mrozowicz 	},
106*8a9867a6SSlawomir Mrozowicz 	{	/* SHA1 */
107*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
108*8a9867a6SSlawomir Mrozowicz 		{.sym = {
109*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
110*8a9867a6SSlawomir Mrozowicz 			{.auth = {
111*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA1,
112*8a9867a6SSlawomir Mrozowicz 				.block_size = 64,
113*8a9867a6SSlawomir Mrozowicz 				.key_size = {
114*8a9867a6SSlawomir Mrozowicz 					.min = 0,
115*8a9867a6SSlawomir Mrozowicz 					.max = 0,
116*8a9867a6SSlawomir Mrozowicz 					.increment = 0
117*8a9867a6SSlawomir Mrozowicz 				},
118*8a9867a6SSlawomir Mrozowicz 				.digest_size = {
119*8a9867a6SSlawomir Mrozowicz 					.min = 20,
120*8a9867a6SSlawomir Mrozowicz 					.max = 20,
121*8a9867a6SSlawomir Mrozowicz 					.increment = 0
122*8a9867a6SSlawomir Mrozowicz 				},
123*8a9867a6SSlawomir Mrozowicz 				.aad_size = { 0 }
124*8a9867a6SSlawomir Mrozowicz 			}, }
125*8a9867a6SSlawomir Mrozowicz 		}, }
126*8a9867a6SSlawomir Mrozowicz 	},
127*8a9867a6SSlawomir Mrozowicz 	{	/* SHA224 HMAC */
128*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
129*8a9867a6SSlawomir Mrozowicz 		{.sym = {
130*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
131*8a9867a6SSlawomir Mrozowicz 			{.auth = {
132*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
133*8a9867a6SSlawomir Mrozowicz 				.block_size = 64,
134*8a9867a6SSlawomir Mrozowicz 				.key_size = {
135*8a9867a6SSlawomir Mrozowicz 					.min = 64,
136*8a9867a6SSlawomir Mrozowicz 					.max = 64,
137*8a9867a6SSlawomir Mrozowicz 					.increment = 0
138*8a9867a6SSlawomir Mrozowicz 				},
139*8a9867a6SSlawomir Mrozowicz 				.digest_size = {
140*8a9867a6SSlawomir Mrozowicz 					.min = 28,
141*8a9867a6SSlawomir Mrozowicz 					.max = 28,
142*8a9867a6SSlawomir Mrozowicz 					.increment = 0
143*8a9867a6SSlawomir Mrozowicz 				},
144*8a9867a6SSlawomir Mrozowicz 				.aad_size = { 0 }
145*8a9867a6SSlawomir Mrozowicz 			}, }
146*8a9867a6SSlawomir Mrozowicz 		}, }
147*8a9867a6SSlawomir Mrozowicz 	},
148*8a9867a6SSlawomir Mrozowicz 	{	/* SHA224 */
149*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
150*8a9867a6SSlawomir Mrozowicz 		{.sym = {
151*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
152*8a9867a6SSlawomir Mrozowicz 			{.auth = {
153*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA224,
154*8a9867a6SSlawomir Mrozowicz 				.block_size = 64,
155*8a9867a6SSlawomir Mrozowicz 				.key_size = {
156*8a9867a6SSlawomir Mrozowicz 					.min = 0,
157*8a9867a6SSlawomir Mrozowicz 					.max = 0,
158*8a9867a6SSlawomir Mrozowicz 					.increment = 0
159*8a9867a6SSlawomir Mrozowicz 				},
160*8a9867a6SSlawomir Mrozowicz 				.digest_size = {
161*8a9867a6SSlawomir Mrozowicz 					.min = 28,
162*8a9867a6SSlawomir Mrozowicz 					.max = 28,
163*8a9867a6SSlawomir Mrozowicz 					.increment = 0
164*8a9867a6SSlawomir Mrozowicz 				},
165*8a9867a6SSlawomir Mrozowicz 				.aad_size = { 0 }
166*8a9867a6SSlawomir Mrozowicz 			}, }
167*8a9867a6SSlawomir Mrozowicz 		}, }
168*8a9867a6SSlawomir Mrozowicz 	},
169*8a9867a6SSlawomir Mrozowicz 	{	/* SHA256 HMAC */
170*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
171*8a9867a6SSlawomir Mrozowicz 		{.sym = {
172*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
173*8a9867a6SSlawomir Mrozowicz 			{.auth = {
174*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
175*8a9867a6SSlawomir Mrozowicz 				.block_size = 64,
176*8a9867a6SSlawomir Mrozowicz 				.key_size = {
177*8a9867a6SSlawomir Mrozowicz 					.min = 64,
178*8a9867a6SSlawomir Mrozowicz 					.max = 64,
179*8a9867a6SSlawomir Mrozowicz 					.increment = 0
180*8a9867a6SSlawomir Mrozowicz 				},
181*8a9867a6SSlawomir Mrozowicz 				.digest_size = {
182*8a9867a6SSlawomir Mrozowicz 					.min = 32,
183*8a9867a6SSlawomir Mrozowicz 					.max = 32,
184*8a9867a6SSlawomir Mrozowicz 					.increment = 0
185*8a9867a6SSlawomir Mrozowicz 				},
186*8a9867a6SSlawomir Mrozowicz 				.aad_size = { 0 }
187*8a9867a6SSlawomir Mrozowicz 			}, }
188*8a9867a6SSlawomir Mrozowicz 		}, }
189*8a9867a6SSlawomir Mrozowicz 	},
190*8a9867a6SSlawomir Mrozowicz 	{	/* SHA256 */
191*8a9867a6SSlawomir Mrozowicz 			.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
192*8a9867a6SSlawomir Mrozowicz 			{.sym = {
193*8a9867a6SSlawomir Mrozowicz 				.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
194*8a9867a6SSlawomir Mrozowicz 				{.auth = {
195*8a9867a6SSlawomir Mrozowicz 					.algo = RTE_CRYPTO_AUTH_SHA256,
196*8a9867a6SSlawomir Mrozowicz 					.block_size = 64,
197*8a9867a6SSlawomir Mrozowicz 					.key_size = {
198*8a9867a6SSlawomir Mrozowicz 						.min = 0,
199*8a9867a6SSlawomir Mrozowicz 						.max = 0,
200*8a9867a6SSlawomir Mrozowicz 						.increment = 0
201*8a9867a6SSlawomir Mrozowicz 					},
202*8a9867a6SSlawomir Mrozowicz 					.digest_size = {
203*8a9867a6SSlawomir Mrozowicz 						.min = 32,
204*8a9867a6SSlawomir Mrozowicz 						.max = 32,
205*8a9867a6SSlawomir Mrozowicz 						.increment = 0
206*8a9867a6SSlawomir Mrozowicz 					},
207*8a9867a6SSlawomir Mrozowicz 					.aad_size = { 0 }
208*8a9867a6SSlawomir Mrozowicz 				}, }
209*8a9867a6SSlawomir Mrozowicz 			}, }
210*8a9867a6SSlawomir Mrozowicz 		},
211*8a9867a6SSlawomir Mrozowicz 	{	/* SHA384 HMAC */
212*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
213*8a9867a6SSlawomir Mrozowicz 		{.sym = {
214*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
215*8a9867a6SSlawomir Mrozowicz 			{.auth = {
216*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
217*8a9867a6SSlawomir Mrozowicz 				.block_size = 128,
218*8a9867a6SSlawomir Mrozowicz 				.key_size = {
219*8a9867a6SSlawomir Mrozowicz 					.min = 128,
220*8a9867a6SSlawomir Mrozowicz 					.max = 128,
221*8a9867a6SSlawomir Mrozowicz 					.increment = 0
222*8a9867a6SSlawomir Mrozowicz 				},
223*8a9867a6SSlawomir Mrozowicz 				.digest_size = {
224*8a9867a6SSlawomir Mrozowicz 					.min = 48,
225*8a9867a6SSlawomir Mrozowicz 					.max = 48,
226*8a9867a6SSlawomir Mrozowicz 					.increment = 0
227*8a9867a6SSlawomir Mrozowicz 				},
228*8a9867a6SSlawomir Mrozowicz 				.aad_size = { 0 }
229*8a9867a6SSlawomir Mrozowicz 			}, }
230*8a9867a6SSlawomir Mrozowicz 		}, }
231*8a9867a6SSlawomir Mrozowicz 	},
232*8a9867a6SSlawomir Mrozowicz 	{	/* SHA384 */
233*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
234*8a9867a6SSlawomir Mrozowicz 		{.sym = {
235*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
236*8a9867a6SSlawomir Mrozowicz 			{.auth = {
237*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA384,
238*8a9867a6SSlawomir Mrozowicz 				.block_size = 128,
239*8a9867a6SSlawomir Mrozowicz 				.key_size = {
240*8a9867a6SSlawomir Mrozowicz 					.min = 0,
241*8a9867a6SSlawomir Mrozowicz 					.max = 0,
242*8a9867a6SSlawomir Mrozowicz 					.increment = 0
243*8a9867a6SSlawomir Mrozowicz 				},
244*8a9867a6SSlawomir Mrozowicz 				.digest_size = {
245*8a9867a6SSlawomir Mrozowicz 					.min = 48,
246*8a9867a6SSlawomir Mrozowicz 					.max = 48,
247*8a9867a6SSlawomir Mrozowicz 					.increment = 0
248*8a9867a6SSlawomir Mrozowicz 				},
249*8a9867a6SSlawomir Mrozowicz 				.aad_size = { 0 }
250*8a9867a6SSlawomir Mrozowicz 			}, }
251*8a9867a6SSlawomir Mrozowicz 		}, }
252*8a9867a6SSlawomir Mrozowicz 	},
253*8a9867a6SSlawomir Mrozowicz 	{	/* SHA512 HMAC */
254*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
255*8a9867a6SSlawomir Mrozowicz 		{.sym = {
256*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
257*8a9867a6SSlawomir Mrozowicz 			{.auth = {
258*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
259*8a9867a6SSlawomir Mrozowicz 				.block_size = 128,
260*8a9867a6SSlawomir Mrozowicz 				.key_size = {
261*8a9867a6SSlawomir Mrozowicz 					.min = 128,
262*8a9867a6SSlawomir Mrozowicz 					.max = 128,
263*8a9867a6SSlawomir Mrozowicz 					.increment = 0
264*8a9867a6SSlawomir Mrozowicz 				},
265*8a9867a6SSlawomir Mrozowicz 				.digest_size = {
266*8a9867a6SSlawomir Mrozowicz 					.min = 64,
267*8a9867a6SSlawomir Mrozowicz 					.max = 64,
268*8a9867a6SSlawomir Mrozowicz 					.increment = 0
269*8a9867a6SSlawomir Mrozowicz 				},
270*8a9867a6SSlawomir Mrozowicz 				.aad_size = { 0 }
271*8a9867a6SSlawomir Mrozowicz 			}, }
272*8a9867a6SSlawomir Mrozowicz 		}, }
273*8a9867a6SSlawomir Mrozowicz 	},
274*8a9867a6SSlawomir Mrozowicz 	{	/* SHA512  */
275*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
276*8a9867a6SSlawomir Mrozowicz 		{.sym = {
277*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
278*8a9867a6SSlawomir Mrozowicz 			{.auth = {
279*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA512,
280*8a9867a6SSlawomir Mrozowicz 				.block_size = 128,
281*8a9867a6SSlawomir Mrozowicz 				.key_size = {
282*8a9867a6SSlawomir Mrozowicz 					.min = 0,
283*8a9867a6SSlawomir Mrozowicz 					.max = 0,
284*8a9867a6SSlawomir Mrozowicz 					.increment = 0
285*8a9867a6SSlawomir Mrozowicz 				},
286*8a9867a6SSlawomir Mrozowicz 				.digest_size = {
287*8a9867a6SSlawomir Mrozowicz 					.min = 64,
288*8a9867a6SSlawomir Mrozowicz 					.max = 64,
289*8a9867a6SSlawomir Mrozowicz 					.increment = 0
290*8a9867a6SSlawomir Mrozowicz 				},
291*8a9867a6SSlawomir Mrozowicz 				.aad_size = { 0 }
292*8a9867a6SSlawomir Mrozowicz 			}, }
293*8a9867a6SSlawomir Mrozowicz 		}, }
294*8a9867a6SSlawomir Mrozowicz 	},
295*8a9867a6SSlawomir Mrozowicz 	{	/* AES CBC */
296*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
297*8a9867a6SSlawomir Mrozowicz 		{.sym = {
298*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
299*8a9867a6SSlawomir Mrozowicz 			{.cipher = {
300*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_AES_CBC,
301*8a9867a6SSlawomir Mrozowicz 				.block_size = 16,
302*8a9867a6SSlawomir Mrozowicz 				.key_size = {
303*8a9867a6SSlawomir Mrozowicz 					.min = 16,
304*8a9867a6SSlawomir Mrozowicz 					.max = 32,
305*8a9867a6SSlawomir Mrozowicz 					.increment = 8
306*8a9867a6SSlawomir Mrozowicz 				},
307*8a9867a6SSlawomir Mrozowicz 				.iv_size = {
308*8a9867a6SSlawomir Mrozowicz 					.min = 16,
309*8a9867a6SSlawomir Mrozowicz 					.max = 16,
310*8a9867a6SSlawomir Mrozowicz 					.increment = 0
311*8a9867a6SSlawomir Mrozowicz 				}
312*8a9867a6SSlawomir Mrozowicz 			}, }
313*8a9867a6SSlawomir Mrozowicz 		}, }
314*8a9867a6SSlawomir Mrozowicz 	},
315*8a9867a6SSlawomir Mrozowicz 	{	/* AES CTR */
316*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
317*8a9867a6SSlawomir Mrozowicz 		{.sym = {
318*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
319*8a9867a6SSlawomir Mrozowicz 			{.cipher = {
320*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_AES_CTR,
321*8a9867a6SSlawomir Mrozowicz 				.block_size = 16,
322*8a9867a6SSlawomir Mrozowicz 				.key_size = {
323*8a9867a6SSlawomir Mrozowicz 					.min = 16,
324*8a9867a6SSlawomir Mrozowicz 					.max = 32,
325*8a9867a6SSlawomir Mrozowicz 					.increment = 8
326*8a9867a6SSlawomir Mrozowicz 				},
327*8a9867a6SSlawomir Mrozowicz 				.iv_size = {
328*8a9867a6SSlawomir Mrozowicz 					.min = 16,
329*8a9867a6SSlawomir Mrozowicz 					.max = 16,
330*8a9867a6SSlawomir Mrozowicz 					.increment = 0
331*8a9867a6SSlawomir Mrozowicz 				}
332*8a9867a6SSlawomir Mrozowicz 			}, }
333*8a9867a6SSlawomir Mrozowicz 		}, }
334*8a9867a6SSlawomir Mrozowicz 	},
335*8a9867a6SSlawomir Mrozowicz 	{	/* AES GCM (AUTH) */
336*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
337*8a9867a6SSlawomir Mrozowicz 		{.sym = {
338*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
339*8a9867a6SSlawomir Mrozowicz 			{.auth = {
340*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_AES_GCM,
341*8a9867a6SSlawomir Mrozowicz 				.block_size = 16,
342*8a9867a6SSlawomir Mrozowicz 				.key_size = {
343*8a9867a6SSlawomir Mrozowicz 					.min = 16,
344*8a9867a6SSlawomir Mrozowicz 					.max = 32,
345*8a9867a6SSlawomir Mrozowicz 					.increment = 8
346*8a9867a6SSlawomir Mrozowicz 				},
347*8a9867a6SSlawomir Mrozowicz 				.digest_size = {
348*8a9867a6SSlawomir Mrozowicz 					.min = 16,
349*8a9867a6SSlawomir Mrozowicz 					.max = 16,
350*8a9867a6SSlawomir Mrozowicz 					.increment = 0
351*8a9867a6SSlawomir Mrozowicz 				},
352*8a9867a6SSlawomir Mrozowicz 				.aad_size = {
353*8a9867a6SSlawomir Mrozowicz 					.min = 8,
354*8a9867a6SSlawomir Mrozowicz 					.max = 12,
355*8a9867a6SSlawomir Mrozowicz 					.increment = 4
356*8a9867a6SSlawomir Mrozowicz 				}
357*8a9867a6SSlawomir Mrozowicz 			}, }
358*8a9867a6SSlawomir Mrozowicz 		}, }
359*8a9867a6SSlawomir Mrozowicz 	},
360*8a9867a6SSlawomir Mrozowicz 	{	/* AES GCM (CIPHER) */
361*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
362*8a9867a6SSlawomir Mrozowicz 		{.sym = {
363*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
364*8a9867a6SSlawomir Mrozowicz 			{.cipher = {
365*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_AES_GCM,
366*8a9867a6SSlawomir Mrozowicz 				.block_size = 16,
367*8a9867a6SSlawomir Mrozowicz 				.key_size = {
368*8a9867a6SSlawomir Mrozowicz 					.min = 16,
369*8a9867a6SSlawomir Mrozowicz 					.max = 16,
370*8a9867a6SSlawomir Mrozowicz 					.increment = 0
371*8a9867a6SSlawomir Mrozowicz 				},
372*8a9867a6SSlawomir Mrozowicz 				.iv_size = {
373*8a9867a6SSlawomir Mrozowicz 					.min = 12,
374*8a9867a6SSlawomir Mrozowicz 					.max = 16,
375*8a9867a6SSlawomir Mrozowicz 					.increment = 4
376*8a9867a6SSlawomir Mrozowicz 				}
377*8a9867a6SSlawomir Mrozowicz 			}, }
378*8a9867a6SSlawomir Mrozowicz 		}, }
379*8a9867a6SSlawomir Mrozowicz 	},
380*8a9867a6SSlawomir Mrozowicz 	{	/* AES GMAC (AUTH) */
381*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
382*8a9867a6SSlawomir Mrozowicz 		{.sym = {
383*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
384*8a9867a6SSlawomir Mrozowicz 			{.auth = {
385*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_AES_GMAC,
386*8a9867a6SSlawomir Mrozowicz 				.block_size = 16,
387*8a9867a6SSlawomir Mrozowicz 				.key_size = {
388*8a9867a6SSlawomir Mrozowicz 					.min = 16,
389*8a9867a6SSlawomir Mrozowicz 					.max = 32,
390*8a9867a6SSlawomir Mrozowicz 					.increment = 8
391*8a9867a6SSlawomir Mrozowicz 				},
392*8a9867a6SSlawomir Mrozowicz 				.digest_size = {
393*8a9867a6SSlawomir Mrozowicz 					.min = 16,
394*8a9867a6SSlawomir Mrozowicz 					.max = 16,
395*8a9867a6SSlawomir Mrozowicz 					.increment = 0
396*8a9867a6SSlawomir Mrozowicz 				},
397*8a9867a6SSlawomir Mrozowicz 				.aad_size = {
398*8a9867a6SSlawomir Mrozowicz 					.min = 8,
399*8a9867a6SSlawomir Mrozowicz 					.max = 65532,
400*8a9867a6SSlawomir Mrozowicz 					.increment = 4
401*8a9867a6SSlawomir Mrozowicz 				}
402*8a9867a6SSlawomir Mrozowicz 			}, }
403*8a9867a6SSlawomir Mrozowicz 		}, }
404*8a9867a6SSlawomir Mrozowicz 	},
405*8a9867a6SSlawomir Mrozowicz 	{	/* 3DES CBC */
406*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
407*8a9867a6SSlawomir Mrozowicz 		{.sym = {
408*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
409*8a9867a6SSlawomir Mrozowicz 			{.cipher = {
410*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_3DES_CBC,
411*8a9867a6SSlawomir Mrozowicz 				.block_size = 8,
412*8a9867a6SSlawomir Mrozowicz 				.key_size = {
413*8a9867a6SSlawomir Mrozowicz 					.min = 16,
414*8a9867a6SSlawomir Mrozowicz 					.max = 24,
415*8a9867a6SSlawomir Mrozowicz 					.increment = 8
416*8a9867a6SSlawomir Mrozowicz 				},
417*8a9867a6SSlawomir Mrozowicz 				.iv_size = {
418*8a9867a6SSlawomir Mrozowicz 					.min = 8,
419*8a9867a6SSlawomir Mrozowicz 					.max = 8,
420*8a9867a6SSlawomir Mrozowicz 					.increment = 0
421*8a9867a6SSlawomir Mrozowicz 				}
422*8a9867a6SSlawomir Mrozowicz 			}, }
423*8a9867a6SSlawomir Mrozowicz 		}, }
424*8a9867a6SSlawomir Mrozowicz 	},
425*8a9867a6SSlawomir Mrozowicz 	{	/* 3DES CTR */
426*8a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
427*8a9867a6SSlawomir Mrozowicz 		{.sym = {
428*8a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
429*8a9867a6SSlawomir Mrozowicz 			{.cipher = {
430*8a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_3DES_CTR,
431*8a9867a6SSlawomir Mrozowicz 				.block_size = 8,
432*8a9867a6SSlawomir Mrozowicz 				.key_size = {
433*8a9867a6SSlawomir Mrozowicz 					.min = 16,
434*8a9867a6SSlawomir Mrozowicz 					.max = 24,
435*8a9867a6SSlawomir Mrozowicz 					.increment = 8
436*8a9867a6SSlawomir Mrozowicz 				},
437*8a9867a6SSlawomir Mrozowicz 				.iv_size = {
438*8a9867a6SSlawomir Mrozowicz 					.min = 8,
439*8a9867a6SSlawomir Mrozowicz 					.max = 8,
440*8a9867a6SSlawomir Mrozowicz 					.increment = 0
441*8a9867a6SSlawomir Mrozowicz 				}
442*8a9867a6SSlawomir Mrozowicz 			}, }
443*8a9867a6SSlawomir Mrozowicz 		}, }
444*8a9867a6SSlawomir Mrozowicz 	},
445*8a9867a6SSlawomir Mrozowicz 
446*8a9867a6SSlawomir Mrozowicz 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
447*8a9867a6SSlawomir Mrozowicz };
448*8a9867a6SSlawomir Mrozowicz 
449*8a9867a6SSlawomir Mrozowicz 
450*8a9867a6SSlawomir Mrozowicz /** Configure device */
451*8a9867a6SSlawomir Mrozowicz static int
452*8a9867a6SSlawomir Mrozowicz openssl_pmd_config(__rte_unused struct rte_cryptodev *dev)
453*8a9867a6SSlawomir Mrozowicz {
454*8a9867a6SSlawomir Mrozowicz 	return 0;
455*8a9867a6SSlawomir Mrozowicz }
456*8a9867a6SSlawomir Mrozowicz 
457*8a9867a6SSlawomir Mrozowicz /** Start device */
458*8a9867a6SSlawomir Mrozowicz static int
459*8a9867a6SSlawomir Mrozowicz openssl_pmd_start(__rte_unused struct rte_cryptodev *dev)
460*8a9867a6SSlawomir Mrozowicz {
461*8a9867a6SSlawomir Mrozowicz 	return 0;
462*8a9867a6SSlawomir Mrozowicz }
463*8a9867a6SSlawomir Mrozowicz 
464*8a9867a6SSlawomir Mrozowicz /** Stop device */
465*8a9867a6SSlawomir Mrozowicz static void
466*8a9867a6SSlawomir Mrozowicz openssl_pmd_stop(__rte_unused struct rte_cryptodev *dev)
467*8a9867a6SSlawomir Mrozowicz {
468*8a9867a6SSlawomir Mrozowicz }
469*8a9867a6SSlawomir Mrozowicz 
470*8a9867a6SSlawomir Mrozowicz /** Close device */
471*8a9867a6SSlawomir Mrozowicz static int
472*8a9867a6SSlawomir Mrozowicz openssl_pmd_close(__rte_unused struct rte_cryptodev *dev)
473*8a9867a6SSlawomir Mrozowicz {
474*8a9867a6SSlawomir Mrozowicz 	return 0;
475*8a9867a6SSlawomir Mrozowicz }
476*8a9867a6SSlawomir Mrozowicz 
477*8a9867a6SSlawomir Mrozowicz 
478*8a9867a6SSlawomir Mrozowicz /** Get device statistics */
479*8a9867a6SSlawomir Mrozowicz static void
480*8a9867a6SSlawomir Mrozowicz openssl_pmd_stats_get(struct rte_cryptodev *dev,
481*8a9867a6SSlawomir Mrozowicz 		struct rte_cryptodev_stats *stats)
482*8a9867a6SSlawomir Mrozowicz {
483*8a9867a6SSlawomir Mrozowicz 	int qp_id;
484*8a9867a6SSlawomir Mrozowicz 
485*8a9867a6SSlawomir Mrozowicz 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
486*8a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
487*8a9867a6SSlawomir Mrozowicz 
488*8a9867a6SSlawomir Mrozowicz 		stats->enqueued_count += qp->stats.enqueued_count;
489*8a9867a6SSlawomir Mrozowicz 		stats->dequeued_count += qp->stats.dequeued_count;
490*8a9867a6SSlawomir Mrozowicz 
491*8a9867a6SSlawomir Mrozowicz 		stats->enqueue_err_count += qp->stats.enqueue_err_count;
492*8a9867a6SSlawomir Mrozowicz 		stats->dequeue_err_count += qp->stats.dequeue_err_count;
493*8a9867a6SSlawomir Mrozowicz 	}
494*8a9867a6SSlawomir Mrozowicz }
495*8a9867a6SSlawomir Mrozowicz 
496*8a9867a6SSlawomir Mrozowicz /** Reset device statistics */
497*8a9867a6SSlawomir Mrozowicz static void
498*8a9867a6SSlawomir Mrozowicz openssl_pmd_stats_reset(struct rte_cryptodev *dev)
499*8a9867a6SSlawomir Mrozowicz {
500*8a9867a6SSlawomir Mrozowicz 	int qp_id;
501*8a9867a6SSlawomir Mrozowicz 
502*8a9867a6SSlawomir Mrozowicz 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
503*8a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
504*8a9867a6SSlawomir Mrozowicz 
505*8a9867a6SSlawomir Mrozowicz 		memset(&qp->stats, 0, sizeof(qp->stats));
506*8a9867a6SSlawomir Mrozowicz 	}
507*8a9867a6SSlawomir Mrozowicz }
508*8a9867a6SSlawomir Mrozowicz 
509*8a9867a6SSlawomir Mrozowicz 
510*8a9867a6SSlawomir Mrozowicz /** Get device info */
511*8a9867a6SSlawomir Mrozowicz static void
512*8a9867a6SSlawomir Mrozowicz openssl_pmd_info_get(struct rte_cryptodev *dev,
513*8a9867a6SSlawomir Mrozowicz 		struct rte_cryptodev_info *dev_info)
514*8a9867a6SSlawomir Mrozowicz {
515*8a9867a6SSlawomir Mrozowicz 	struct openssl_private *internals = dev->data->dev_private;
516*8a9867a6SSlawomir Mrozowicz 
517*8a9867a6SSlawomir Mrozowicz 	if (dev_info != NULL) {
518*8a9867a6SSlawomir Mrozowicz 		dev_info->dev_type = dev->dev_type;
519*8a9867a6SSlawomir Mrozowicz 		dev_info->feature_flags = dev->feature_flags;
520*8a9867a6SSlawomir Mrozowicz 		dev_info->capabilities = openssl_pmd_capabilities;
521*8a9867a6SSlawomir Mrozowicz 		dev_info->max_nb_queue_pairs = internals->max_nb_qpairs;
522*8a9867a6SSlawomir Mrozowicz 		dev_info->sym.max_nb_sessions = internals->max_nb_sessions;
523*8a9867a6SSlawomir Mrozowicz 	}
524*8a9867a6SSlawomir Mrozowicz }
525*8a9867a6SSlawomir Mrozowicz 
526*8a9867a6SSlawomir Mrozowicz /** Release queue pair */
527*8a9867a6SSlawomir Mrozowicz static int
528*8a9867a6SSlawomir Mrozowicz openssl_pmd_qp_release(struct rte_cryptodev *dev, uint16_t qp_id)
529*8a9867a6SSlawomir Mrozowicz {
530*8a9867a6SSlawomir Mrozowicz 	if (dev->data->queue_pairs[qp_id] != NULL) {
531*8a9867a6SSlawomir Mrozowicz 		rte_free(dev->data->queue_pairs[qp_id]);
532*8a9867a6SSlawomir Mrozowicz 		dev->data->queue_pairs[qp_id] = NULL;
533*8a9867a6SSlawomir Mrozowicz 	}
534*8a9867a6SSlawomir Mrozowicz 	return 0;
535*8a9867a6SSlawomir Mrozowicz }
536*8a9867a6SSlawomir Mrozowicz 
537*8a9867a6SSlawomir Mrozowicz /** set a unique name for the queue pair based on it's name, dev_id and qp_id */
538*8a9867a6SSlawomir Mrozowicz static int
539*8a9867a6SSlawomir Mrozowicz openssl_pmd_qp_set_unique_name(struct rte_cryptodev *dev,
540*8a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp)
541*8a9867a6SSlawomir Mrozowicz {
542*8a9867a6SSlawomir Mrozowicz 	unsigned int n = snprintf(qp->name, sizeof(qp->name),
543*8a9867a6SSlawomir Mrozowicz 			"openssl_pmd_%u_qp_%u",
544*8a9867a6SSlawomir Mrozowicz 			dev->data->dev_id, qp->id);
545*8a9867a6SSlawomir Mrozowicz 
546*8a9867a6SSlawomir Mrozowicz 	if (n > sizeof(qp->name))
547*8a9867a6SSlawomir Mrozowicz 		return -1;
548*8a9867a6SSlawomir Mrozowicz 
549*8a9867a6SSlawomir Mrozowicz 	return 0;
550*8a9867a6SSlawomir Mrozowicz }
551*8a9867a6SSlawomir Mrozowicz 
552*8a9867a6SSlawomir Mrozowicz 
553*8a9867a6SSlawomir Mrozowicz /** Create a ring to place processed operations on */
554*8a9867a6SSlawomir Mrozowicz static struct rte_ring *
555*8a9867a6SSlawomir Mrozowicz openssl_pmd_qp_create_processed_ops_ring(struct openssl_qp *qp,
556*8a9867a6SSlawomir Mrozowicz 		unsigned int ring_size, int socket_id)
557*8a9867a6SSlawomir Mrozowicz {
558*8a9867a6SSlawomir Mrozowicz 	struct rte_ring *r;
559*8a9867a6SSlawomir Mrozowicz 
560*8a9867a6SSlawomir Mrozowicz 	r = rte_ring_lookup(qp->name);
561*8a9867a6SSlawomir Mrozowicz 	if (r) {
562*8a9867a6SSlawomir Mrozowicz 		if (r->prod.size >= ring_size) {
563*8a9867a6SSlawomir Mrozowicz 			OPENSSL_LOG_INFO(
564*8a9867a6SSlawomir Mrozowicz 				"Reusing existing ring %s for processed ops",
565*8a9867a6SSlawomir Mrozowicz 				 qp->name);
566*8a9867a6SSlawomir Mrozowicz 			return r;
567*8a9867a6SSlawomir Mrozowicz 		}
568*8a9867a6SSlawomir Mrozowicz 
569*8a9867a6SSlawomir Mrozowicz 		OPENSSL_LOG_ERR(
570*8a9867a6SSlawomir Mrozowicz 			"Unable to reuse existing ring %s for processed ops",
571*8a9867a6SSlawomir Mrozowicz 			 qp->name);
572*8a9867a6SSlawomir Mrozowicz 		return NULL;
573*8a9867a6SSlawomir Mrozowicz 	}
574*8a9867a6SSlawomir Mrozowicz 
575*8a9867a6SSlawomir Mrozowicz 	return rte_ring_create(qp->name, ring_size, socket_id,
576*8a9867a6SSlawomir Mrozowicz 			RING_F_SP_ENQ | RING_F_SC_DEQ);
577*8a9867a6SSlawomir Mrozowicz }
578*8a9867a6SSlawomir Mrozowicz 
579*8a9867a6SSlawomir Mrozowicz 
580*8a9867a6SSlawomir Mrozowicz /** Setup a queue pair */
581*8a9867a6SSlawomir Mrozowicz static int
582*8a9867a6SSlawomir Mrozowicz openssl_pmd_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,
583*8a9867a6SSlawomir Mrozowicz 		const struct rte_cryptodev_qp_conf *qp_conf,
584*8a9867a6SSlawomir Mrozowicz 		 int socket_id)
585*8a9867a6SSlawomir Mrozowicz {
586*8a9867a6SSlawomir Mrozowicz 	struct openssl_qp *qp = NULL;
587*8a9867a6SSlawomir Mrozowicz 
588*8a9867a6SSlawomir Mrozowicz 	/* Free memory prior to re-allocation if needed. */
589*8a9867a6SSlawomir Mrozowicz 	if (dev->data->queue_pairs[qp_id] != NULL)
590*8a9867a6SSlawomir Mrozowicz 		openssl_pmd_qp_release(dev, qp_id);
591*8a9867a6SSlawomir Mrozowicz 
592*8a9867a6SSlawomir Mrozowicz 	/* Allocate the queue pair data structure. */
593*8a9867a6SSlawomir Mrozowicz 	qp = rte_zmalloc_socket("OPENSSL PMD Queue Pair", sizeof(*qp),
594*8a9867a6SSlawomir Mrozowicz 					RTE_CACHE_LINE_SIZE, socket_id);
595*8a9867a6SSlawomir Mrozowicz 	if (qp == NULL)
596*8a9867a6SSlawomir Mrozowicz 		return -ENOMEM;
597*8a9867a6SSlawomir Mrozowicz 
598*8a9867a6SSlawomir Mrozowicz 	qp->id = qp_id;
599*8a9867a6SSlawomir Mrozowicz 	dev->data->queue_pairs[qp_id] = qp;
600*8a9867a6SSlawomir Mrozowicz 
601*8a9867a6SSlawomir Mrozowicz 	if (openssl_pmd_qp_set_unique_name(dev, qp))
602*8a9867a6SSlawomir Mrozowicz 		goto qp_setup_cleanup;
603*8a9867a6SSlawomir Mrozowicz 
604*8a9867a6SSlawomir Mrozowicz 	qp->processed_ops = openssl_pmd_qp_create_processed_ops_ring(qp,
605*8a9867a6SSlawomir Mrozowicz 			qp_conf->nb_descriptors, socket_id);
606*8a9867a6SSlawomir Mrozowicz 	if (qp->processed_ops == NULL)
607*8a9867a6SSlawomir Mrozowicz 		goto qp_setup_cleanup;
608*8a9867a6SSlawomir Mrozowicz 
609*8a9867a6SSlawomir Mrozowicz 	qp->sess_mp = dev->data->session_pool;
610*8a9867a6SSlawomir Mrozowicz 
611*8a9867a6SSlawomir Mrozowicz 	memset(&qp->stats, 0, sizeof(qp->stats));
612*8a9867a6SSlawomir Mrozowicz 
613*8a9867a6SSlawomir Mrozowicz 	return 0;
614*8a9867a6SSlawomir Mrozowicz 
615*8a9867a6SSlawomir Mrozowicz qp_setup_cleanup:
616*8a9867a6SSlawomir Mrozowicz 	if (qp)
617*8a9867a6SSlawomir Mrozowicz 		rte_free(qp);
618*8a9867a6SSlawomir Mrozowicz 
619*8a9867a6SSlawomir Mrozowicz 	return -1;
620*8a9867a6SSlawomir Mrozowicz }
621*8a9867a6SSlawomir Mrozowicz 
622*8a9867a6SSlawomir Mrozowicz /** Start queue pair */
623*8a9867a6SSlawomir Mrozowicz static int
624*8a9867a6SSlawomir Mrozowicz openssl_pmd_qp_start(__rte_unused struct rte_cryptodev *dev,
625*8a9867a6SSlawomir Mrozowicz 		__rte_unused uint16_t queue_pair_id)
626*8a9867a6SSlawomir Mrozowicz {
627*8a9867a6SSlawomir Mrozowicz 	return -ENOTSUP;
628*8a9867a6SSlawomir Mrozowicz }
629*8a9867a6SSlawomir Mrozowicz 
630*8a9867a6SSlawomir Mrozowicz /** Stop queue pair */
631*8a9867a6SSlawomir Mrozowicz static int
632*8a9867a6SSlawomir Mrozowicz openssl_pmd_qp_stop(__rte_unused struct rte_cryptodev *dev,
633*8a9867a6SSlawomir Mrozowicz 		__rte_unused uint16_t queue_pair_id)
634*8a9867a6SSlawomir Mrozowicz {
635*8a9867a6SSlawomir Mrozowicz 	return -ENOTSUP;
636*8a9867a6SSlawomir Mrozowicz }
637*8a9867a6SSlawomir Mrozowicz 
638*8a9867a6SSlawomir Mrozowicz /** Return the number of allocated queue pairs */
639*8a9867a6SSlawomir Mrozowicz static uint32_t
640*8a9867a6SSlawomir Mrozowicz openssl_pmd_qp_count(struct rte_cryptodev *dev)
641*8a9867a6SSlawomir Mrozowicz {
642*8a9867a6SSlawomir Mrozowicz 	return dev->data->nb_queue_pairs;
643*8a9867a6SSlawomir Mrozowicz }
644*8a9867a6SSlawomir Mrozowicz 
645*8a9867a6SSlawomir Mrozowicz /** Returns the size of the session structure */
646*8a9867a6SSlawomir Mrozowicz static unsigned
647*8a9867a6SSlawomir Mrozowicz openssl_pmd_session_get_size(struct rte_cryptodev *dev __rte_unused)
648*8a9867a6SSlawomir Mrozowicz {
649*8a9867a6SSlawomir Mrozowicz 	return sizeof(struct openssl_session);
650*8a9867a6SSlawomir Mrozowicz }
651*8a9867a6SSlawomir Mrozowicz 
652*8a9867a6SSlawomir Mrozowicz /** Configure the session from a crypto xform chain */
653*8a9867a6SSlawomir Mrozowicz static void *
654*8a9867a6SSlawomir Mrozowicz openssl_pmd_session_configure(struct rte_cryptodev *dev __rte_unused,
655*8a9867a6SSlawomir Mrozowicz 		struct rte_crypto_sym_xform *xform,	void *sess)
656*8a9867a6SSlawomir Mrozowicz {
657*8a9867a6SSlawomir Mrozowicz 	if (unlikely(sess == NULL)) {
658*8a9867a6SSlawomir Mrozowicz 		OPENSSL_LOG_ERR("invalid session struct");
659*8a9867a6SSlawomir Mrozowicz 		return NULL;
660*8a9867a6SSlawomir Mrozowicz 	}
661*8a9867a6SSlawomir Mrozowicz 
662*8a9867a6SSlawomir Mrozowicz 	if (openssl_set_session_parameters(
663*8a9867a6SSlawomir Mrozowicz 			sess, xform) != 0) {
664*8a9867a6SSlawomir Mrozowicz 		OPENSSL_LOG_ERR("failed configure session parameters");
665*8a9867a6SSlawomir Mrozowicz 		return NULL;
666*8a9867a6SSlawomir Mrozowicz 	}
667*8a9867a6SSlawomir Mrozowicz 
668*8a9867a6SSlawomir Mrozowicz 	return sess;
669*8a9867a6SSlawomir Mrozowicz }
670*8a9867a6SSlawomir Mrozowicz 
671*8a9867a6SSlawomir Mrozowicz 
672*8a9867a6SSlawomir Mrozowicz /** Clear the memory of session so it doesn't leave key material behind */
673*8a9867a6SSlawomir Mrozowicz static void
674*8a9867a6SSlawomir Mrozowicz openssl_pmd_session_clear(struct rte_cryptodev *dev __rte_unused, void *sess)
675*8a9867a6SSlawomir Mrozowicz {
676*8a9867a6SSlawomir Mrozowicz 	/*
677*8a9867a6SSlawomir Mrozowicz 	 * Current just resetting the whole data structure, need to investigate
678*8a9867a6SSlawomir Mrozowicz 	 * whether a more selective reset of key would be more performant
679*8a9867a6SSlawomir Mrozowicz 	 */
680*8a9867a6SSlawomir Mrozowicz 	if (sess) {
681*8a9867a6SSlawomir Mrozowicz 		openssl_reset_session(sess);
682*8a9867a6SSlawomir Mrozowicz 		memset(sess, 0, sizeof(struct openssl_session));
683*8a9867a6SSlawomir Mrozowicz 	}
684*8a9867a6SSlawomir Mrozowicz }
685*8a9867a6SSlawomir Mrozowicz 
686*8a9867a6SSlawomir Mrozowicz struct rte_cryptodev_ops openssl_pmd_ops = {
687*8a9867a6SSlawomir Mrozowicz 		.dev_configure		= openssl_pmd_config,
688*8a9867a6SSlawomir Mrozowicz 		.dev_start		= openssl_pmd_start,
689*8a9867a6SSlawomir Mrozowicz 		.dev_stop		= openssl_pmd_stop,
690*8a9867a6SSlawomir Mrozowicz 		.dev_close		= openssl_pmd_close,
691*8a9867a6SSlawomir Mrozowicz 
692*8a9867a6SSlawomir Mrozowicz 		.stats_get		= openssl_pmd_stats_get,
693*8a9867a6SSlawomir Mrozowicz 		.stats_reset		= openssl_pmd_stats_reset,
694*8a9867a6SSlawomir Mrozowicz 
695*8a9867a6SSlawomir Mrozowicz 		.dev_infos_get		= openssl_pmd_info_get,
696*8a9867a6SSlawomir Mrozowicz 
697*8a9867a6SSlawomir Mrozowicz 		.queue_pair_setup	= openssl_pmd_qp_setup,
698*8a9867a6SSlawomir Mrozowicz 		.queue_pair_release	= openssl_pmd_qp_release,
699*8a9867a6SSlawomir Mrozowicz 		.queue_pair_start	= openssl_pmd_qp_start,
700*8a9867a6SSlawomir Mrozowicz 		.queue_pair_stop	= openssl_pmd_qp_stop,
701*8a9867a6SSlawomir Mrozowicz 		.queue_pair_count	= openssl_pmd_qp_count,
702*8a9867a6SSlawomir Mrozowicz 
703*8a9867a6SSlawomir Mrozowicz 		.session_get_size	= openssl_pmd_session_get_size,
704*8a9867a6SSlawomir Mrozowicz 		.session_configure	= openssl_pmd_session_configure,
705*8a9867a6SSlawomir Mrozowicz 		.session_clear		= openssl_pmd_session_clear
706*8a9867a6SSlawomir Mrozowicz };
707*8a9867a6SSlawomir Mrozowicz 
708*8a9867a6SSlawomir Mrozowicz struct rte_cryptodev_ops *rte_openssl_pmd_ops = &openssl_pmd_ops;
709