xref: /dpdk/drivers/crypto/openssl/rte_openssl_pmd_ops.c (revision 1a4998dc4d9446c58e1813bb05b92b572edb381e)
18a9867a6SSlawomir Mrozowicz /*-
28a9867a6SSlawomir Mrozowicz  *   BSD LICENSE
38a9867a6SSlawomir Mrozowicz  *
4acf86169SPablo de Lara  *   Copyright(c) 2016-2017 Intel Corporation. All rights reserved.
58a9867a6SSlawomir Mrozowicz  *
68a9867a6SSlawomir Mrozowicz  *   Redistribution and use in source and binary forms, with or without
78a9867a6SSlawomir Mrozowicz  *   modification, are permitted provided that the following conditions
88a9867a6SSlawomir Mrozowicz  *   are met:
98a9867a6SSlawomir Mrozowicz  *
108a9867a6SSlawomir Mrozowicz  *     * Redistributions of source code must retain the above copyright
118a9867a6SSlawomir Mrozowicz  *       notice, this list of conditions and the following disclaimer.
128a9867a6SSlawomir Mrozowicz  *     * Redistributions in binary form must reproduce the above copyright
138a9867a6SSlawomir Mrozowicz  *       notice, this list of conditions and the following disclaimer in
148a9867a6SSlawomir Mrozowicz  *       the documentation and/or other materials provided with the
158a9867a6SSlawomir Mrozowicz  *       distribution.
168a9867a6SSlawomir Mrozowicz  *     * Neither the name of Intel Corporation nor the names of its
178a9867a6SSlawomir Mrozowicz  *       contributors may be used to endorse or promote products derived
188a9867a6SSlawomir Mrozowicz  *       from this software without specific prior written permission.
198a9867a6SSlawomir Mrozowicz  *
208a9867a6SSlawomir Mrozowicz  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
218a9867a6SSlawomir Mrozowicz  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
228a9867a6SSlawomir Mrozowicz  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
238a9867a6SSlawomir Mrozowicz  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
248a9867a6SSlawomir Mrozowicz  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
258a9867a6SSlawomir Mrozowicz  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
268a9867a6SSlawomir Mrozowicz  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
278a9867a6SSlawomir Mrozowicz  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
288a9867a6SSlawomir Mrozowicz  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
298a9867a6SSlawomir Mrozowicz  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
308a9867a6SSlawomir Mrozowicz  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
318a9867a6SSlawomir Mrozowicz  */
328a9867a6SSlawomir Mrozowicz 
338a9867a6SSlawomir Mrozowicz #include <string.h>
348a9867a6SSlawomir Mrozowicz 
358a9867a6SSlawomir Mrozowicz #include <rte_common.h>
368a9867a6SSlawomir Mrozowicz #include <rte_malloc.h>
378a9867a6SSlawomir Mrozowicz #include <rte_cryptodev_pmd.h>
388a9867a6SSlawomir Mrozowicz 
398a9867a6SSlawomir Mrozowicz #include "rte_openssl_pmd_private.h"
408a9867a6SSlawomir Mrozowicz 
418a9867a6SSlawomir Mrozowicz 
428a9867a6SSlawomir Mrozowicz static const struct rte_cryptodev_capabilities openssl_pmd_capabilities[] = {
438a9867a6SSlawomir Mrozowicz 	{	/* MD5 HMAC */
448a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
458a9867a6SSlawomir Mrozowicz 		{.sym = {
468a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
478a9867a6SSlawomir Mrozowicz 			{.auth = {
488a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_MD5_HMAC,
498a9867a6SSlawomir Mrozowicz 				.block_size = 64,
508a9867a6SSlawomir Mrozowicz 				.key_size = {
51e5e7bc71SPablo de Lara 					.min = 1,
528a9867a6SSlawomir Mrozowicz 					.max = 64,
53e5e7bc71SPablo de Lara 					.increment = 1
548a9867a6SSlawomir Mrozowicz 				},
558a9867a6SSlawomir Mrozowicz 				.digest_size = {
568a9867a6SSlawomir Mrozowicz 					.min = 16,
578a9867a6SSlawomir Mrozowicz 					.max = 16,
588a9867a6SSlawomir Mrozowicz 					.increment = 0
598a9867a6SSlawomir Mrozowicz 				},
60acf86169SPablo de Lara 				.iv_size = { 0 }
618a9867a6SSlawomir Mrozowicz 			}, }
628a9867a6SSlawomir Mrozowicz 		}, }
638a9867a6SSlawomir Mrozowicz 	},
648a9867a6SSlawomir Mrozowicz 	{	/* MD5 */
658a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
668a9867a6SSlawomir Mrozowicz 		{.sym = {
678a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
688a9867a6SSlawomir Mrozowicz 			{.auth = {
698a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_MD5,
708a9867a6SSlawomir Mrozowicz 				.block_size = 64,
718a9867a6SSlawomir Mrozowicz 				.key_size = {
728a9867a6SSlawomir Mrozowicz 					.min = 0,
738a9867a6SSlawomir Mrozowicz 					.max = 0,
748a9867a6SSlawomir Mrozowicz 					.increment = 0
758a9867a6SSlawomir Mrozowicz 				},
768a9867a6SSlawomir Mrozowicz 				.digest_size = {
778a9867a6SSlawomir Mrozowicz 					.min = 16,
788a9867a6SSlawomir Mrozowicz 					.max = 16,
798a9867a6SSlawomir Mrozowicz 					.increment = 0
808a9867a6SSlawomir Mrozowicz 				},
81acf86169SPablo de Lara 				.iv_size = { 0 }
828a9867a6SSlawomir Mrozowicz 			}, }
838a9867a6SSlawomir Mrozowicz 		}, }
848a9867a6SSlawomir Mrozowicz 	},
858a9867a6SSlawomir Mrozowicz 	{	/* SHA1 HMAC */
868a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
878a9867a6SSlawomir Mrozowicz 		{.sym = {
888a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
898a9867a6SSlawomir Mrozowicz 			{.auth = {
908a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
918a9867a6SSlawomir Mrozowicz 				.block_size = 64,
928a9867a6SSlawomir Mrozowicz 				.key_size = {
93e5e7bc71SPablo de Lara 					.min = 1,
948a9867a6SSlawomir Mrozowicz 					.max = 64,
95e5e7bc71SPablo de Lara 					.increment = 1
968a9867a6SSlawomir Mrozowicz 				},
978a9867a6SSlawomir Mrozowicz 				.digest_size = {
988a9867a6SSlawomir Mrozowicz 					.min = 20,
998a9867a6SSlawomir Mrozowicz 					.max = 20,
1008a9867a6SSlawomir Mrozowicz 					.increment = 0
1018a9867a6SSlawomir Mrozowicz 				},
102acf86169SPablo de Lara 				.iv_size = { 0 }
1038a9867a6SSlawomir Mrozowicz 			}, }
1048a9867a6SSlawomir Mrozowicz 		}, }
1058a9867a6SSlawomir Mrozowicz 	},
1068a9867a6SSlawomir Mrozowicz 	{	/* SHA1 */
1078a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1088a9867a6SSlawomir Mrozowicz 		{.sym = {
1098a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1108a9867a6SSlawomir Mrozowicz 			{.auth = {
1118a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA1,
1128a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1138a9867a6SSlawomir Mrozowicz 				.key_size = {
1148a9867a6SSlawomir Mrozowicz 					.min = 0,
1158a9867a6SSlawomir Mrozowicz 					.max = 0,
1168a9867a6SSlawomir Mrozowicz 					.increment = 0
1178a9867a6SSlawomir Mrozowicz 				},
1188a9867a6SSlawomir Mrozowicz 				.digest_size = {
1198a9867a6SSlawomir Mrozowicz 					.min = 20,
1208a9867a6SSlawomir Mrozowicz 					.max = 20,
1218a9867a6SSlawomir Mrozowicz 					.increment = 0
1228a9867a6SSlawomir Mrozowicz 				},
123acf86169SPablo de Lara 				.iv_size = { 0 }
1248a9867a6SSlawomir Mrozowicz 			}, }
1258a9867a6SSlawomir Mrozowicz 		}, }
1268a9867a6SSlawomir Mrozowicz 	},
1278a9867a6SSlawomir Mrozowicz 	{	/* SHA224 HMAC */
1288a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1298a9867a6SSlawomir Mrozowicz 		{.sym = {
1308a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1318a9867a6SSlawomir Mrozowicz 			{.auth = {
1328a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
1338a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1348a9867a6SSlawomir Mrozowicz 				.key_size = {
135e5e7bc71SPablo de Lara 					.min = 1,
1368a9867a6SSlawomir Mrozowicz 					.max = 64,
137e5e7bc71SPablo de Lara 					.increment = 1
1388a9867a6SSlawomir Mrozowicz 				},
1398a9867a6SSlawomir Mrozowicz 				.digest_size = {
1408a9867a6SSlawomir Mrozowicz 					.min = 28,
1418a9867a6SSlawomir Mrozowicz 					.max = 28,
1428a9867a6SSlawomir Mrozowicz 					.increment = 0
1438a9867a6SSlawomir Mrozowicz 				},
144acf86169SPablo de Lara 				.iv_size = { 0 }
1458a9867a6SSlawomir Mrozowicz 			}, }
1468a9867a6SSlawomir Mrozowicz 		}, }
1478a9867a6SSlawomir Mrozowicz 	},
1488a9867a6SSlawomir Mrozowicz 	{	/* SHA224 */
1498a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1508a9867a6SSlawomir Mrozowicz 		{.sym = {
1518a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1528a9867a6SSlawomir Mrozowicz 			{.auth = {
1538a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA224,
1548a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1558a9867a6SSlawomir Mrozowicz 				.key_size = {
1568a9867a6SSlawomir Mrozowicz 					.min = 0,
1578a9867a6SSlawomir Mrozowicz 					.max = 0,
1588a9867a6SSlawomir Mrozowicz 					.increment = 0
1598a9867a6SSlawomir Mrozowicz 				},
1608a9867a6SSlawomir Mrozowicz 				.digest_size = {
1618a9867a6SSlawomir Mrozowicz 					.min = 28,
1628a9867a6SSlawomir Mrozowicz 					.max = 28,
1638a9867a6SSlawomir Mrozowicz 					.increment = 0
1648a9867a6SSlawomir Mrozowicz 				},
165acf86169SPablo de Lara 				.iv_size = { 0 }
1668a9867a6SSlawomir Mrozowicz 			}, }
1678a9867a6SSlawomir Mrozowicz 		}, }
1688a9867a6SSlawomir Mrozowicz 	},
1698a9867a6SSlawomir Mrozowicz 	{	/* SHA256 HMAC */
1708a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1718a9867a6SSlawomir Mrozowicz 		{.sym = {
1728a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1738a9867a6SSlawomir Mrozowicz 			{.auth = {
1748a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
1758a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1768a9867a6SSlawomir Mrozowicz 				.key_size = {
177e5e7bc71SPablo de Lara 					.min = 1,
1788a9867a6SSlawomir Mrozowicz 					.max = 64,
179e5e7bc71SPablo de Lara 					.increment = 1
1808a9867a6SSlawomir Mrozowicz 				},
1818a9867a6SSlawomir Mrozowicz 				.digest_size = {
1828a9867a6SSlawomir Mrozowicz 					.min = 32,
1838a9867a6SSlawomir Mrozowicz 					.max = 32,
1848a9867a6SSlawomir Mrozowicz 					.increment = 0
1858a9867a6SSlawomir Mrozowicz 				},
186acf86169SPablo de Lara 				.iv_size = { 0 }
1878a9867a6SSlawomir Mrozowicz 			}, }
1888a9867a6SSlawomir Mrozowicz 		}, }
1898a9867a6SSlawomir Mrozowicz 	},
1908a9867a6SSlawomir Mrozowicz 	{	/* SHA256 */
1918a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
1928a9867a6SSlawomir Mrozowicz 		{.sym = {
1938a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
1948a9867a6SSlawomir Mrozowicz 			{.auth = {
1958a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA256,
1968a9867a6SSlawomir Mrozowicz 				.block_size = 64,
1978a9867a6SSlawomir Mrozowicz 				.key_size = {
1988a9867a6SSlawomir Mrozowicz 					.min = 0,
1998a9867a6SSlawomir Mrozowicz 					.max = 0,
2008a9867a6SSlawomir Mrozowicz 					.increment = 0
2018a9867a6SSlawomir Mrozowicz 				},
2028a9867a6SSlawomir Mrozowicz 				.digest_size = {
2038a9867a6SSlawomir Mrozowicz 					.min = 32,
2048a9867a6SSlawomir Mrozowicz 					.max = 32,
2058a9867a6SSlawomir Mrozowicz 					.increment = 0
2068a9867a6SSlawomir Mrozowicz 				},
207acf86169SPablo de Lara 				.iv_size = { 0 }
2088a9867a6SSlawomir Mrozowicz 			}, }
2098a9867a6SSlawomir Mrozowicz 		}, }
2108a9867a6SSlawomir Mrozowicz 	},
2118a9867a6SSlawomir Mrozowicz 	{	/* SHA384 HMAC */
2128a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2138a9867a6SSlawomir Mrozowicz 		{.sym = {
2148a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2158a9867a6SSlawomir Mrozowicz 			{.auth = {
2168a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
2178a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2188a9867a6SSlawomir Mrozowicz 				.key_size = {
219e5e7bc71SPablo de Lara 					.min = 1,
2208a9867a6SSlawomir Mrozowicz 					.max = 128,
221e5e7bc71SPablo de Lara 					.increment = 1
2228a9867a6SSlawomir Mrozowicz 				},
2238a9867a6SSlawomir Mrozowicz 				.digest_size = {
2248a9867a6SSlawomir Mrozowicz 					.min = 48,
2258a9867a6SSlawomir Mrozowicz 					.max = 48,
2268a9867a6SSlawomir Mrozowicz 					.increment = 0
2278a9867a6SSlawomir Mrozowicz 				},
228acf86169SPablo de Lara 				.iv_size = { 0 }
2298a9867a6SSlawomir Mrozowicz 			}, }
2308a9867a6SSlawomir Mrozowicz 		}, }
2318a9867a6SSlawomir Mrozowicz 	},
2328a9867a6SSlawomir Mrozowicz 	{	/* SHA384 */
2338a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2348a9867a6SSlawomir Mrozowicz 		{.sym = {
2358a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2368a9867a6SSlawomir Mrozowicz 			{.auth = {
2378a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA384,
2388a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2398a9867a6SSlawomir Mrozowicz 				.key_size = {
2408a9867a6SSlawomir Mrozowicz 					.min = 0,
2418a9867a6SSlawomir Mrozowicz 					.max = 0,
2428a9867a6SSlawomir Mrozowicz 					.increment = 0
2438a9867a6SSlawomir Mrozowicz 				},
2448a9867a6SSlawomir Mrozowicz 				.digest_size = {
2458a9867a6SSlawomir Mrozowicz 					.min = 48,
2468a9867a6SSlawomir Mrozowicz 					.max = 48,
2478a9867a6SSlawomir Mrozowicz 					.increment = 0
2488a9867a6SSlawomir Mrozowicz 				},
249acf86169SPablo de Lara 				.iv_size = { 0 }
2508a9867a6SSlawomir Mrozowicz 			}, }
2518a9867a6SSlawomir Mrozowicz 		}, }
2528a9867a6SSlawomir Mrozowicz 	},
2538a9867a6SSlawomir Mrozowicz 	{	/* SHA512 HMAC */
2548a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2558a9867a6SSlawomir Mrozowicz 		{.sym = {
2568a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2578a9867a6SSlawomir Mrozowicz 			{.auth = {
2588a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
2598a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2608a9867a6SSlawomir Mrozowicz 				.key_size = {
261e5e7bc71SPablo de Lara 					.min = 1,
2628a9867a6SSlawomir Mrozowicz 					.max = 128,
263e5e7bc71SPablo de Lara 					.increment = 1
2648a9867a6SSlawomir Mrozowicz 				},
2658a9867a6SSlawomir Mrozowicz 				.digest_size = {
2668a9867a6SSlawomir Mrozowicz 					.min = 64,
2678a9867a6SSlawomir Mrozowicz 					.max = 64,
2688a9867a6SSlawomir Mrozowicz 					.increment = 0
2698a9867a6SSlawomir Mrozowicz 				},
270acf86169SPablo de Lara 				.iv_size = { 0 }
2718a9867a6SSlawomir Mrozowicz 			}, }
2728a9867a6SSlawomir Mrozowicz 		}, }
2738a9867a6SSlawomir Mrozowicz 	},
2748a9867a6SSlawomir Mrozowicz 	{	/* SHA512  */
2758a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2768a9867a6SSlawomir Mrozowicz 		{.sym = {
2778a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
2788a9867a6SSlawomir Mrozowicz 			{.auth = {
2798a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_SHA512,
2808a9867a6SSlawomir Mrozowicz 				.block_size = 128,
2818a9867a6SSlawomir Mrozowicz 				.key_size = {
2828a9867a6SSlawomir Mrozowicz 					.min = 0,
2838a9867a6SSlawomir Mrozowicz 					.max = 0,
2848a9867a6SSlawomir Mrozowicz 					.increment = 0
2858a9867a6SSlawomir Mrozowicz 				},
2868a9867a6SSlawomir Mrozowicz 				.digest_size = {
2878a9867a6SSlawomir Mrozowicz 					.min = 64,
2888a9867a6SSlawomir Mrozowicz 					.max = 64,
2898a9867a6SSlawomir Mrozowicz 					.increment = 0
2908a9867a6SSlawomir Mrozowicz 				},
291acf86169SPablo de Lara 				.iv_size = { 0 }
2928a9867a6SSlawomir Mrozowicz 			}, }
2938a9867a6SSlawomir Mrozowicz 		}, }
2948a9867a6SSlawomir Mrozowicz 	},
2958a9867a6SSlawomir Mrozowicz 	{	/* AES CBC */
2968a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
2978a9867a6SSlawomir Mrozowicz 		{.sym = {
2988a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
2998a9867a6SSlawomir Mrozowicz 			{.cipher = {
3008a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_AES_CBC,
3018a9867a6SSlawomir Mrozowicz 				.block_size = 16,
3028a9867a6SSlawomir Mrozowicz 				.key_size = {
3038a9867a6SSlawomir Mrozowicz 					.min = 16,
3048a9867a6SSlawomir Mrozowicz 					.max = 32,
3058a9867a6SSlawomir Mrozowicz 					.increment = 8
3068a9867a6SSlawomir Mrozowicz 				},
3078a9867a6SSlawomir Mrozowicz 				.iv_size = {
3088a9867a6SSlawomir Mrozowicz 					.min = 16,
3098a9867a6SSlawomir Mrozowicz 					.max = 16,
3108a9867a6SSlawomir Mrozowicz 					.increment = 0
3118a9867a6SSlawomir Mrozowicz 				}
3128a9867a6SSlawomir Mrozowicz 			}, }
3138a9867a6SSlawomir Mrozowicz 		}, }
3148a9867a6SSlawomir Mrozowicz 	},
3158a9867a6SSlawomir Mrozowicz 	{	/* AES CTR */
3168a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3178a9867a6SSlawomir Mrozowicz 		{.sym = {
3188a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
3198a9867a6SSlawomir Mrozowicz 			{.cipher = {
3208a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_AES_CTR,
3218a9867a6SSlawomir Mrozowicz 				.block_size = 16,
3228a9867a6SSlawomir Mrozowicz 				.key_size = {
3238a9867a6SSlawomir Mrozowicz 					.min = 16,
3248a9867a6SSlawomir Mrozowicz 					.max = 32,
3258a9867a6SSlawomir Mrozowicz 					.increment = 8
3268a9867a6SSlawomir Mrozowicz 				},
3278a9867a6SSlawomir Mrozowicz 				.iv_size = {
3288a9867a6SSlawomir Mrozowicz 					.min = 16,
3298a9867a6SSlawomir Mrozowicz 					.max = 16,
3308a9867a6SSlawomir Mrozowicz 					.increment = 0
3318a9867a6SSlawomir Mrozowicz 				}
3328a9867a6SSlawomir Mrozowicz 			}, }
3338a9867a6SSlawomir Mrozowicz 		}, }
3348a9867a6SSlawomir Mrozowicz 	},
335b79e4c00SPablo de Lara 	{	/* AES GCM */
3368a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3378a9867a6SSlawomir Mrozowicz 		{.sym = {
338b79e4c00SPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
339b79e4c00SPablo de Lara 			{.aead = {
340b79e4c00SPablo de Lara 				.algo = RTE_CRYPTO_AEAD_AES_GCM,
3418a9867a6SSlawomir Mrozowicz 				.block_size = 16,
3428a9867a6SSlawomir Mrozowicz 				.key_size = {
3438a9867a6SSlawomir Mrozowicz 					.min = 16,
3448a9867a6SSlawomir Mrozowicz 					.max = 32,
3458a9867a6SSlawomir Mrozowicz 					.increment = 8
3468a9867a6SSlawomir Mrozowicz 				},
3478a9867a6SSlawomir Mrozowicz 				.digest_size = {
3488a9867a6SSlawomir Mrozowicz 					.min = 16,
3498a9867a6SSlawomir Mrozowicz 					.max = 16,
3508a9867a6SSlawomir Mrozowicz 					.increment = 0
3518a9867a6SSlawomir Mrozowicz 				},
3528a9867a6SSlawomir Mrozowicz 				.aad_size = {
3530625598aSArek Kusztal 					.min = 0,
3540625598aSArek Kusztal 					.max = 65535,
3550625598aSArek Kusztal 					.increment = 1
356acf86169SPablo de Lara 				},
3578a9867a6SSlawomir Mrozowicz 				.iv_size = {
3588a9867a6SSlawomir Mrozowicz 					.min = 12,
3598a9867a6SSlawomir Mrozowicz 					.max = 16,
3608a9867a6SSlawomir Mrozowicz 					.increment = 4
361b79e4c00SPablo de Lara 				},
3628a9867a6SSlawomir Mrozowicz 			}, }
3638a9867a6SSlawomir Mrozowicz 		}, }
3648a9867a6SSlawomir Mrozowicz 	},
365*1a4998dcSPablo de Lara 	{	/* AES CCM */
366*1a4998dcSPablo de Lara 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
367*1a4998dcSPablo de Lara 		{.sym = {
368*1a4998dcSPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
369*1a4998dcSPablo de Lara 			{.aead = {
370*1a4998dcSPablo de Lara 				.algo = RTE_CRYPTO_AEAD_AES_CCM,
371*1a4998dcSPablo de Lara 				.block_size = 16,
372*1a4998dcSPablo de Lara 				.key_size = {
373*1a4998dcSPablo de Lara 					.min = 16,
374*1a4998dcSPablo de Lara 					.max = 32,
375*1a4998dcSPablo de Lara 					.increment = 8
376*1a4998dcSPablo de Lara 				},
377*1a4998dcSPablo de Lara 				.digest_size = {
378*1a4998dcSPablo de Lara 					.min = 4,
379*1a4998dcSPablo de Lara 					.max = 16,
380*1a4998dcSPablo de Lara 					.increment = 2
381*1a4998dcSPablo de Lara 				},
382*1a4998dcSPablo de Lara 				.aad_size = {
383*1a4998dcSPablo de Lara 					.min = 0,
384*1a4998dcSPablo de Lara 					.max = 65535,
385*1a4998dcSPablo de Lara 					.increment = 1
386*1a4998dcSPablo de Lara 				},
387*1a4998dcSPablo de Lara 				.iv_size = {
388*1a4998dcSPablo de Lara 					.min = 7,
389*1a4998dcSPablo de Lara 					.max = 13,
390*1a4998dcSPablo de Lara 					.increment = 1
391*1a4998dcSPablo de Lara 				},
392*1a4998dcSPablo de Lara 			}, }
393*1a4998dcSPablo de Lara 		}, }
394*1a4998dcSPablo de Lara 	},
3958a9867a6SSlawomir Mrozowicz 	{	/* AES GMAC (AUTH) */
3968a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3978a9867a6SSlawomir Mrozowicz 		{.sym = {
3988a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
3998a9867a6SSlawomir Mrozowicz 			{.auth = {
4008a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_AUTH_AES_GMAC,
4018a9867a6SSlawomir Mrozowicz 				.block_size = 16,
4028a9867a6SSlawomir Mrozowicz 				.key_size = {
4038a9867a6SSlawomir Mrozowicz 					.min = 16,
4048a9867a6SSlawomir Mrozowicz 					.max = 32,
4058a9867a6SSlawomir Mrozowicz 					.increment = 8
4068a9867a6SSlawomir Mrozowicz 				},
4078a9867a6SSlawomir Mrozowicz 				.digest_size = {
4088a9867a6SSlawomir Mrozowicz 					.min = 16,
4098a9867a6SSlawomir Mrozowicz 					.max = 16,
4108a9867a6SSlawomir Mrozowicz 					.increment = 0
4118a9867a6SSlawomir Mrozowicz 				},
412e32e4fa8SPablo de Lara 				.iv_size = {
413e32e4fa8SPablo de Lara 					.min = 12,
414e32e4fa8SPablo de Lara 					.max = 16,
4158a9867a6SSlawomir Mrozowicz 					.increment = 4
416e32e4fa8SPablo de Lara 				}
4178a9867a6SSlawomir Mrozowicz 			}, }
4188a9867a6SSlawomir Mrozowicz 		}, }
4198a9867a6SSlawomir Mrozowicz 	},
4208a9867a6SSlawomir Mrozowicz 	{	/* 3DES CBC */
4218a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
4228a9867a6SSlawomir Mrozowicz 		{.sym = {
4238a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
4248a9867a6SSlawomir Mrozowicz 			{.cipher = {
4258a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_3DES_CBC,
4268a9867a6SSlawomir Mrozowicz 				.block_size = 8,
4278a9867a6SSlawomir Mrozowicz 				.key_size = {
4288a9867a6SSlawomir Mrozowicz 					.min = 16,
4298a9867a6SSlawomir Mrozowicz 					.max = 24,
4308a9867a6SSlawomir Mrozowicz 					.increment = 8
4318a9867a6SSlawomir Mrozowicz 				},
4328a9867a6SSlawomir Mrozowicz 				.iv_size = {
4338a9867a6SSlawomir Mrozowicz 					.min = 8,
4348a9867a6SSlawomir Mrozowicz 					.max = 8,
4358a9867a6SSlawomir Mrozowicz 					.increment = 0
4368a9867a6SSlawomir Mrozowicz 				}
4378a9867a6SSlawomir Mrozowicz 			}, }
4388a9867a6SSlawomir Mrozowicz 		}, }
4398a9867a6SSlawomir Mrozowicz 	},
4408a9867a6SSlawomir Mrozowicz 	{	/* 3DES CTR */
4418a9867a6SSlawomir Mrozowicz 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
4428a9867a6SSlawomir Mrozowicz 		{.sym = {
4438a9867a6SSlawomir Mrozowicz 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
4448a9867a6SSlawomir Mrozowicz 			{.cipher = {
4458a9867a6SSlawomir Mrozowicz 				.algo = RTE_CRYPTO_CIPHER_3DES_CTR,
4468a9867a6SSlawomir Mrozowicz 				.block_size = 8,
4478a9867a6SSlawomir Mrozowicz 				.key_size = {
4488a9867a6SSlawomir Mrozowicz 					.min = 16,
4498a9867a6SSlawomir Mrozowicz 					.max = 24,
4508a9867a6SSlawomir Mrozowicz 					.increment = 8
4518a9867a6SSlawomir Mrozowicz 				},
4528a9867a6SSlawomir Mrozowicz 				.iv_size = {
4538a9867a6SSlawomir Mrozowicz 					.min = 8,
4548a9867a6SSlawomir Mrozowicz 					.max = 8,
4558a9867a6SSlawomir Mrozowicz 					.increment = 0
4568a9867a6SSlawomir Mrozowicz 				}
4578a9867a6SSlawomir Mrozowicz 			}, }
4588a9867a6SSlawomir Mrozowicz 		}, }
4598a9867a6SSlawomir Mrozowicz 	},
460c1734807SPablo de Lara 	{	/* DES CBC */
461c1734807SPablo de Lara 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
462c1734807SPablo de Lara 		{.sym = {
463c1734807SPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
464c1734807SPablo de Lara 			{.cipher = {
465c1734807SPablo de Lara 				.algo = RTE_CRYPTO_CIPHER_DES_CBC,
466c1734807SPablo de Lara 				.block_size = 8,
467c1734807SPablo de Lara 				.key_size = {
468c1734807SPablo de Lara 					.min = 8,
469c1734807SPablo de Lara 					.max = 8,
470c1734807SPablo de Lara 					.increment = 0
471c1734807SPablo de Lara 				},
472c1734807SPablo de Lara 				.iv_size = {
473c1734807SPablo de Lara 					.min = 8,
474c1734807SPablo de Lara 					.max = 8,
475c1734807SPablo de Lara 					.increment = 0
476c1734807SPablo de Lara 				}
477c1734807SPablo de Lara 			}, }
478c1734807SPablo de Lara 		}, }
479c1734807SPablo de Lara 	},
4801dee7bc7SPablo de Lara 	{	/* DES DOCSIS BPI */
4811dee7bc7SPablo de Lara 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
4821dee7bc7SPablo de Lara 		{.sym = {
4831dee7bc7SPablo de Lara 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
4841dee7bc7SPablo de Lara 			{.cipher = {
4851dee7bc7SPablo de Lara 				.algo = RTE_CRYPTO_CIPHER_DES_DOCSISBPI,
4861dee7bc7SPablo de Lara 				.block_size = 8,
4871dee7bc7SPablo de Lara 				.key_size = {
4881dee7bc7SPablo de Lara 					.min = 8,
4891dee7bc7SPablo de Lara 					.max = 8,
4901dee7bc7SPablo de Lara 					.increment = 0
4911dee7bc7SPablo de Lara 				},
4921dee7bc7SPablo de Lara 				.iv_size = {
4931dee7bc7SPablo de Lara 					.min = 8,
4941dee7bc7SPablo de Lara 					.max = 8,
4951dee7bc7SPablo de Lara 					.increment = 0
4961dee7bc7SPablo de Lara 				}
4971dee7bc7SPablo de Lara 			}, }
4981dee7bc7SPablo de Lara 		}, }
4991dee7bc7SPablo de Lara 	},
5008a9867a6SSlawomir Mrozowicz 
5018a9867a6SSlawomir Mrozowicz 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
5028a9867a6SSlawomir Mrozowicz };
5038a9867a6SSlawomir Mrozowicz 
5048a9867a6SSlawomir Mrozowicz 
5058a9867a6SSlawomir Mrozowicz /** Configure device */
5068a9867a6SSlawomir Mrozowicz static int
50760e686c2SFan Zhang openssl_pmd_config(__rte_unused struct rte_cryptodev *dev,
50860e686c2SFan Zhang 		__rte_unused struct rte_cryptodev_config *config)
5098a9867a6SSlawomir Mrozowicz {
5108a9867a6SSlawomir Mrozowicz 	return 0;
5118a9867a6SSlawomir Mrozowicz }
5128a9867a6SSlawomir Mrozowicz 
5138a9867a6SSlawomir Mrozowicz /** Start device */
5148a9867a6SSlawomir Mrozowicz static int
5158a9867a6SSlawomir Mrozowicz openssl_pmd_start(__rte_unused struct rte_cryptodev *dev)
5168a9867a6SSlawomir Mrozowicz {
5178a9867a6SSlawomir Mrozowicz 	return 0;
5188a9867a6SSlawomir Mrozowicz }
5198a9867a6SSlawomir Mrozowicz 
5208a9867a6SSlawomir Mrozowicz /** Stop device */
5218a9867a6SSlawomir Mrozowicz static void
5228a9867a6SSlawomir Mrozowicz openssl_pmd_stop(__rte_unused struct rte_cryptodev *dev)
5238a9867a6SSlawomir Mrozowicz {
5248a9867a6SSlawomir Mrozowicz }
5258a9867a6SSlawomir Mrozowicz 
5268a9867a6SSlawomir Mrozowicz /** Close device */
5278a9867a6SSlawomir Mrozowicz static int
5288a9867a6SSlawomir Mrozowicz openssl_pmd_close(__rte_unused struct rte_cryptodev *dev)
5298a9867a6SSlawomir Mrozowicz {
5308a9867a6SSlawomir Mrozowicz 	return 0;
5318a9867a6SSlawomir Mrozowicz }
5328a9867a6SSlawomir Mrozowicz 
5338a9867a6SSlawomir Mrozowicz 
5348a9867a6SSlawomir Mrozowicz /** Get device statistics */
5358a9867a6SSlawomir Mrozowicz static void
5368a9867a6SSlawomir Mrozowicz openssl_pmd_stats_get(struct rte_cryptodev *dev,
5378a9867a6SSlawomir Mrozowicz 		struct rte_cryptodev_stats *stats)
5388a9867a6SSlawomir Mrozowicz {
5398a9867a6SSlawomir Mrozowicz 	int qp_id;
5408a9867a6SSlawomir Mrozowicz 
5418a9867a6SSlawomir Mrozowicz 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
5428a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
5438a9867a6SSlawomir Mrozowicz 
5448a9867a6SSlawomir Mrozowicz 		stats->enqueued_count += qp->stats.enqueued_count;
5458a9867a6SSlawomir Mrozowicz 		stats->dequeued_count += qp->stats.dequeued_count;
5468a9867a6SSlawomir Mrozowicz 
5478a9867a6SSlawomir Mrozowicz 		stats->enqueue_err_count += qp->stats.enqueue_err_count;
5488a9867a6SSlawomir Mrozowicz 		stats->dequeue_err_count += qp->stats.dequeue_err_count;
5498a9867a6SSlawomir Mrozowicz 	}
5508a9867a6SSlawomir Mrozowicz }
5518a9867a6SSlawomir Mrozowicz 
5528a9867a6SSlawomir Mrozowicz /** Reset device statistics */
5538a9867a6SSlawomir Mrozowicz static void
5548a9867a6SSlawomir Mrozowicz openssl_pmd_stats_reset(struct rte_cryptodev *dev)
5558a9867a6SSlawomir Mrozowicz {
5568a9867a6SSlawomir Mrozowicz 	int qp_id;
5578a9867a6SSlawomir Mrozowicz 
5588a9867a6SSlawomir Mrozowicz 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
5598a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp = dev->data->queue_pairs[qp_id];
5608a9867a6SSlawomir Mrozowicz 
5618a9867a6SSlawomir Mrozowicz 		memset(&qp->stats, 0, sizeof(qp->stats));
5628a9867a6SSlawomir Mrozowicz 	}
5638a9867a6SSlawomir Mrozowicz }
5648a9867a6SSlawomir Mrozowicz 
5658a9867a6SSlawomir Mrozowicz 
5668a9867a6SSlawomir Mrozowicz /** Get device info */
5678a9867a6SSlawomir Mrozowicz static void
5688a9867a6SSlawomir Mrozowicz openssl_pmd_info_get(struct rte_cryptodev *dev,
5698a9867a6SSlawomir Mrozowicz 		struct rte_cryptodev_info *dev_info)
5708a9867a6SSlawomir Mrozowicz {
5718a9867a6SSlawomir Mrozowicz 	struct openssl_private *internals = dev->data->dev_private;
5728a9867a6SSlawomir Mrozowicz 
5738a9867a6SSlawomir Mrozowicz 	if (dev_info != NULL) {
5747a364faeSSlawomir Mrozowicz 		dev_info->driver_id = dev->driver_id;
5758a9867a6SSlawomir Mrozowicz 		dev_info->feature_flags = dev->feature_flags;
5768a9867a6SSlawomir Mrozowicz 		dev_info->capabilities = openssl_pmd_capabilities;
5778a9867a6SSlawomir Mrozowicz 		dev_info->max_nb_queue_pairs = internals->max_nb_qpairs;
5788a9867a6SSlawomir Mrozowicz 		dev_info->sym.max_nb_sessions = internals->max_nb_sessions;
5798a9867a6SSlawomir Mrozowicz 	}
5808a9867a6SSlawomir Mrozowicz }
5818a9867a6SSlawomir Mrozowicz 
5828a9867a6SSlawomir Mrozowicz /** Release queue pair */
5838a9867a6SSlawomir Mrozowicz static int
5848a9867a6SSlawomir Mrozowicz openssl_pmd_qp_release(struct rte_cryptodev *dev, uint16_t qp_id)
5858a9867a6SSlawomir Mrozowicz {
5868a9867a6SSlawomir Mrozowicz 	if (dev->data->queue_pairs[qp_id] != NULL) {
5878a9867a6SSlawomir Mrozowicz 		rte_free(dev->data->queue_pairs[qp_id]);
5888a9867a6SSlawomir Mrozowicz 		dev->data->queue_pairs[qp_id] = NULL;
5898a9867a6SSlawomir Mrozowicz 	}
5908a9867a6SSlawomir Mrozowicz 	return 0;
5918a9867a6SSlawomir Mrozowicz }
5928a9867a6SSlawomir Mrozowicz 
5938a9867a6SSlawomir Mrozowicz /** set a unique name for the queue pair based on it's name, dev_id and qp_id */
5948a9867a6SSlawomir Mrozowicz static int
5958a9867a6SSlawomir Mrozowicz openssl_pmd_qp_set_unique_name(struct rte_cryptodev *dev,
5968a9867a6SSlawomir Mrozowicz 		struct openssl_qp *qp)
5978a9867a6SSlawomir Mrozowicz {
5988a9867a6SSlawomir Mrozowicz 	unsigned int n = snprintf(qp->name, sizeof(qp->name),
5998a9867a6SSlawomir Mrozowicz 			"openssl_pmd_%u_qp_%u",
6008a9867a6SSlawomir Mrozowicz 			dev->data->dev_id, qp->id);
6018a9867a6SSlawomir Mrozowicz 
6028a9867a6SSlawomir Mrozowicz 	if (n > sizeof(qp->name))
6038a9867a6SSlawomir Mrozowicz 		return -1;
6048a9867a6SSlawomir Mrozowicz 
6058a9867a6SSlawomir Mrozowicz 	return 0;
6068a9867a6SSlawomir Mrozowicz }
6078a9867a6SSlawomir Mrozowicz 
6088a9867a6SSlawomir Mrozowicz 
6098a9867a6SSlawomir Mrozowicz /** Create a ring to place processed operations on */
6108a9867a6SSlawomir Mrozowicz static struct rte_ring *
6118a9867a6SSlawomir Mrozowicz openssl_pmd_qp_create_processed_ops_ring(struct openssl_qp *qp,
6128a9867a6SSlawomir Mrozowicz 		unsigned int ring_size, int socket_id)
6138a9867a6SSlawomir Mrozowicz {
6148a9867a6SSlawomir Mrozowicz 	struct rte_ring *r;
6158a9867a6SSlawomir Mrozowicz 
6168a9867a6SSlawomir Mrozowicz 	r = rte_ring_lookup(qp->name);
6178a9867a6SSlawomir Mrozowicz 	if (r) {
618636e7392SBruce Richardson 		if (rte_ring_get_size(r) >= ring_size) {
6198a9867a6SSlawomir Mrozowicz 			OPENSSL_LOG_INFO(
6208a9867a6SSlawomir Mrozowicz 				"Reusing existing ring %s for processed ops",
6218a9867a6SSlawomir Mrozowicz 				 qp->name);
6228a9867a6SSlawomir Mrozowicz 			return r;
6238a9867a6SSlawomir Mrozowicz 		}
6248a9867a6SSlawomir Mrozowicz 
6258a9867a6SSlawomir Mrozowicz 		OPENSSL_LOG_ERR(
6268a9867a6SSlawomir Mrozowicz 			"Unable to reuse existing ring %s for processed ops",
6278a9867a6SSlawomir Mrozowicz 			 qp->name);
6288a9867a6SSlawomir Mrozowicz 		return NULL;
6298a9867a6SSlawomir Mrozowicz 	}
6308a9867a6SSlawomir Mrozowicz 
6318a9867a6SSlawomir Mrozowicz 	return rte_ring_create(qp->name, ring_size, socket_id,
6328a9867a6SSlawomir Mrozowicz 			RING_F_SP_ENQ | RING_F_SC_DEQ);
6338a9867a6SSlawomir Mrozowicz }
6348a9867a6SSlawomir Mrozowicz 
6358a9867a6SSlawomir Mrozowicz 
6368a9867a6SSlawomir Mrozowicz /** Setup a queue pair */
6378a9867a6SSlawomir Mrozowicz static int
6388a9867a6SSlawomir Mrozowicz openssl_pmd_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,
6398a9867a6SSlawomir Mrozowicz 		const struct rte_cryptodev_qp_conf *qp_conf,
640f7db6f82SPablo de Lara 		int socket_id, struct rte_mempool *session_pool)
6418a9867a6SSlawomir Mrozowicz {
6428a9867a6SSlawomir Mrozowicz 	struct openssl_qp *qp = NULL;
6438a9867a6SSlawomir Mrozowicz 
6448a9867a6SSlawomir Mrozowicz 	/* Free memory prior to re-allocation if needed. */
6458a9867a6SSlawomir Mrozowicz 	if (dev->data->queue_pairs[qp_id] != NULL)
6468a9867a6SSlawomir Mrozowicz 		openssl_pmd_qp_release(dev, qp_id);
6478a9867a6SSlawomir Mrozowicz 
6488a9867a6SSlawomir Mrozowicz 	/* Allocate the queue pair data structure. */
6498a9867a6SSlawomir Mrozowicz 	qp = rte_zmalloc_socket("OPENSSL PMD Queue Pair", sizeof(*qp),
6508a9867a6SSlawomir Mrozowicz 					RTE_CACHE_LINE_SIZE, socket_id);
6518a9867a6SSlawomir Mrozowicz 	if (qp == NULL)
6528a9867a6SSlawomir Mrozowicz 		return -ENOMEM;
6538a9867a6SSlawomir Mrozowicz 
6548a9867a6SSlawomir Mrozowicz 	qp->id = qp_id;
6558a9867a6SSlawomir Mrozowicz 	dev->data->queue_pairs[qp_id] = qp;
6568a9867a6SSlawomir Mrozowicz 
6578a9867a6SSlawomir Mrozowicz 	if (openssl_pmd_qp_set_unique_name(dev, qp))
6588a9867a6SSlawomir Mrozowicz 		goto qp_setup_cleanup;
6598a9867a6SSlawomir Mrozowicz 
6608a9867a6SSlawomir Mrozowicz 	qp->processed_ops = openssl_pmd_qp_create_processed_ops_ring(qp,
6618a9867a6SSlawomir Mrozowicz 			qp_conf->nb_descriptors, socket_id);
6628a9867a6SSlawomir Mrozowicz 	if (qp->processed_ops == NULL)
6638a9867a6SSlawomir Mrozowicz 		goto qp_setup_cleanup;
6648a9867a6SSlawomir Mrozowicz 
665f7db6f82SPablo de Lara 	qp->sess_mp = session_pool;
6668a9867a6SSlawomir Mrozowicz 
6678a9867a6SSlawomir Mrozowicz 	memset(&qp->stats, 0, sizeof(qp->stats));
6688a9867a6SSlawomir Mrozowicz 
6698a9867a6SSlawomir Mrozowicz 	return 0;
6708a9867a6SSlawomir Mrozowicz 
6718a9867a6SSlawomir Mrozowicz qp_setup_cleanup:
6728a9867a6SSlawomir Mrozowicz 	if (qp)
6738a9867a6SSlawomir Mrozowicz 		rte_free(qp);
6748a9867a6SSlawomir Mrozowicz 
6758a9867a6SSlawomir Mrozowicz 	return -1;
6768a9867a6SSlawomir Mrozowicz }
6778a9867a6SSlawomir Mrozowicz 
6788a9867a6SSlawomir Mrozowicz /** Start queue pair */
6798a9867a6SSlawomir Mrozowicz static int
6808a9867a6SSlawomir Mrozowicz openssl_pmd_qp_start(__rte_unused struct rte_cryptodev *dev,
6818a9867a6SSlawomir Mrozowicz 		__rte_unused uint16_t queue_pair_id)
6828a9867a6SSlawomir Mrozowicz {
6838a9867a6SSlawomir Mrozowicz 	return -ENOTSUP;
6848a9867a6SSlawomir Mrozowicz }
6858a9867a6SSlawomir Mrozowicz 
6868a9867a6SSlawomir Mrozowicz /** Stop queue pair */
6878a9867a6SSlawomir Mrozowicz static int
6888a9867a6SSlawomir Mrozowicz openssl_pmd_qp_stop(__rte_unused struct rte_cryptodev *dev,
6898a9867a6SSlawomir Mrozowicz 		__rte_unused uint16_t queue_pair_id)
6908a9867a6SSlawomir Mrozowicz {
6918a9867a6SSlawomir Mrozowicz 	return -ENOTSUP;
6928a9867a6SSlawomir Mrozowicz }
6938a9867a6SSlawomir Mrozowicz 
6948a9867a6SSlawomir Mrozowicz /** Return the number of allocated queue pairs */
6958a9867a6SSlawomir Mrozowicz static uint32_t
6968a9867a6SSlawomir Mrozowicz openssl_pmd_qp_count(struct rte_cryptodev *dev)
6978a9867a6SSlawomir Mrozowicz {
6988a9867a6SSlawomir Mrozowicz 	return dev->data->nb_queue_pairs;
6998a9867a6SSlawomir Mrozowicz }
7008a9867a6SSlawomir Mrozowicz 
7018a9867a6SSlawomir Mrozowicz /** Returns the size of the session structure */
7028a9867a6SSlawomir Mrozowicz static unsigned
7038a9867a6SSlawomir Mrozowicz openssl_pmd_session_get_size(struct rte_cryptodev *dev __rte_unused)
7048a9867a6SSlawomir Mrozowicz {
7058a9867a6SSlawomir Mrozowicz 	return sizeof(struct openssl_session);
7068a9867a6SSlawomir Mrozowicz }
7078a9867a6SSlawomir Mrozowicz 
7088a9867a6SSlawomir Mrozowicz /** Configure the session from a crypto xform chain */
709b3bbd9e5SSlawomir Mrozowicz static int
7108a9867a6SSlawomir Mrozowicz openssl_pmd_session_configure(struct rte_cryptodev *dev __rte_unused,
711b3bbd9e5SSlawomir Mrozowicz 		struct rte_crypto_sym_xform *xform,
712b3bbd9e5SSlawomir Mrozowicz 		struct rte_cryptodev_sym_session *sess,
713b3bbd9e5SSlawomir Mrozowicz 		struct rte_mempool *mempool)
7148a9867a6SSlawomir Mrozowicz {
715b3bbd9e5SSlawomir Mrozowicz 	void *sess_private_data;
71627391b53SPablo de Lara 	int ret;
717b3bbd9e5SSlawomir Mrozowicz 
7188a9867a6SSlawomir Mrozowicz 	if (unlikely(sess == NULL)) {
7198a9867a6SSlawomir Mrozowicz 		OPENSSL_LOG_ERR("invalid session struct");
72027391b53SPablo de Lara 		return -EINVAL;
721b3bbd9e5SSlawomir Mrozowicz 	}
722b3bbd9e5SSlawomir Mrozowicz 
723b3bbd9e5SSlawomir Mrozowicz 	if (rte_mempool_get(mempool, &sess_private_data)) {
724b3bbd9e5SSlawomir Mrozowicz 		CDEV_LOG_ERR(
725b3bbd9e5SSlawomir Mrozowicz 			"Couldn't get object from session mempool");
72627391b53SPablo de Lara 		return -ENOMEM;
7278a9867a6SSlawomir Mrozowicz 	}
7288a9867a6SSlawomir Mrozowicz 
72927391b53SPablo de Lara 	ret = openssl_set_session_parameters(sess_private_data, xform);
73027391b53SPablo de Lara 	if (ret != 0) {
7318a9867a6SSlawomir Mrozowicz 		OPENSSL_LOG_ERR("failed configure session parameters");
732b3bbd9e5SSlawomir Mrozowicz 
733b3bbd9e5SSlawomir Mrozowicz 		/* Return session to mempool */
734b3bbd9e5SSlawomir Mrozowicz 		rte_mempool_put(mempool, sess_private_data);
73527391b53SPablo de Lara 		return ret;
7368a9867a6SSlawomir Mrozowicz 	}
7378a9867a6SSlawomir Mrozowicz 
738b3bbd9e5SSlawomir Mrozowicz 	set_session_private_data(sess, dev->driver_id,
739b3bbd9e5SSlawomir Mrozowicz 			sess_private_data);
740b3bbd9e5SSlawomir Mrozowicz 
741b3bbd9e5SSlawomir Mrozowicz 	return 0;
7428a9867a6SSlawomir Mrozowicz }
7438a9867a6SSlawomir Mrozowicz 
7448a9867a6SSlawomir Mrozowicz 
7458a9867a6SSlawomir Mrozowicz /** Clear the memory of session so it doesn't leave key material behind */
7468a9867a6SSlawomir Mrozowicz static void
747b3bbd9e5SSlawomir Mrozowicz openssl_pmd_session_clear(struct rte_cryptodev *dev,
748b3bbd9e5SSlawomir Mrozowicz 		struct rte_cryptodev_sym_session *sess)
7498a9867a6SSlawomir Mrozowicz {
750b3bbd9e5SSlawomir Mrozowicz 	uint8_t index = dev->driver_id;
751b3bbd9e5SSlawomir Mrozowicz 	void *sess_priv = get_session_private_data(sess, index);
752b3bbd9e5SSlawomir Mrozowicz 
753b3bbd9e5SSlawomir Mrozowicz 	/* Zero out the whole structure */
754b3bbd9e5SSlawomir Mrozowicz 	if (sess_priv) {
755b3bbd9e5SSlawomir Mrozowicz 		openssl_reset_session(sess_priv);
756b3bbd9e5SSlawomir Mrozowicz 		memset(sess_priv, 0, sizeof(struct openssl_session));
757b3bbd9e5SSlawomir Mrozowicz 		struct rte_mempool *sess_mp = rte_mempool_from_obj(sess_priv);
758b3bbd9e5SSlawomir Mrozowicz 		set_session_private_data(sess, index, NULL);
759b3bbd9e5SSlawomir Mrozowicz 		rte_mempool_put(sess_mp, sess_priv);
7608a9867a6SSlawomir Mrozowicz 	}
7618a9867a6SSlawomir Mrozowicz }
7628a9867a6SSlawomir Mrozowicz 
7638a9867a6SSlawomir Mrozowicz struct rte_cryptodev_ops openssl_pmd_ops = {
7648a9867a6SSlawomir Mrozowicz 		.dev_configure		= openssl_pmd_config,
7658a9867a6SSlawomir Mrozowicz 		.dev_start		= openssl_pmd_start,
7668a9867a6SSlawomir Mrozowicz 		.dev_stop		= openssl_pmd_stop,
7678a9867a6SSlawomir Mrozowicz 		.dev_close		= openssl_pmd_close,
7688a9867a6SSlawomir Mrozowicz 
7698a9867a6SSlawomir Mrozowicz 		.stats_get		= openssl_pmd_stats_get,
7708a9867a6SSlawomir Mrozowicz 		.stats_reset		= openssl_pmd_stats_reset,
7718a9867a6SSlawomir Mrozowicz 
7728a9867a6SSlawomir Mrozowicz 		.dev_infos_get		= openssl_pmd_info_get,
7738a9867a6SSlawomir Mrozowicz 
7748a9867a6SSlawomir Mrozowicz 		.queue_pair_setup	= openssl_pmd_qp_setup,
7758a9867a6SSlawomir Mrozowicz 		.queue_pair_release	= openssl_pmd_qp_release,
7768a9867a6SSlawomir Mrozowicz 		.queue_pair_start	= openssl_pmd_qp_start,
7778a9867a6SSlawomir Mrozowicz 		.queue_pair_stop	= openssl_pmd_qp_stop,
7788a9867a6SSlawomir Mrozowicz 		.queue_pair_count	= openssl_pmd_qp_count,
7798a9867a6SSlawomir Mrozowicz 
7808a9867a6SSlawomir Mrozowicz 		.session_get_size	= openssl_pmd_session_get_size,
7818a9867a6SSlawomir Mrozowicz 		.session_configure	= openssl_pmd_session_configure,
7828a9867a6SSlawomir Mrozowicz 		.session_clear		= openssl_pmd_session_clear
7838a9867a6SSlawomir Mrozowicz };
7848a9867a6SSlawomir Mrozowicz 
7858a9867a6SSlawomir Mrozowicz struct rte_cryptodev_ops *rte_openssl_pmd_ops = &openssl_pmd_ops;
786