xref: /dpdk/app/test/test_event_crypto_adapter.c (revision 68a03efeed657e6e05f281479b33b51102797e15)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2018 Intel Corporation.
3  * All rights reserved.
4  */
5 
6 #include <string.h>
7 #include <rte_common.h>
8 #include <rte_mempool.h>
9 #include <rte_mbuf.h>
10 #include <rte_cryptodev.h>
11 #include <rte_eventdev.h>
12 #include <rte_bus_vdev.h>
13 #include <rte_service.h>
14 #include <rte_event_crypto_adapter.h>
15 #include "test.h"
16 
17 #define PKT_TRACE                  0
18 #define NUM                        1
19 #define DEFAULT_NUM_XFORMS        (2)
20 #define NUM_MBUFS                 (8191)
21 #define MBUF_CACHE_SIZE           (256)
22 #define MAXIMUM_IV_LENGTH         (16)
23 #define DEFAULT_NUM_OPS_INFLIGHT  (128)
24 #define MAX_NB_SESSIONS            4
25 #define TEST_APP_PORT_ID           0
26 #define TEST_APP_EV_QUEUE_ID       0
27 #define TEST_APP_EV_PRIORITY       0
28 #define TEST_APP_EV_FLOWID         0xAABB
29 #define TEST_CRYPTO_EV_QUEUE_ID    1
30 #define TEST_ADAPTER_ID            0
31 #define TEST_CDEV_ID               0
32 #define TEST_CDEV_QP_ID            0
33 #define PACKET_LENGTH              64
34 #define NB_TEST_PORTS              1
35 #define NB_TEST_QUEUES             2
36 #define NUM_CORES                  1
37 #define CRYPTODEV_NAME_NULL_PMD    crypto_null
38 
39 #define MBUF_SIZE              (sizeof(struct rte_mbuf) + \
40 				RTE_PKTMBUF_HEADROOM + PACKET_LENGTH)
41 #define IV_OFFSET              (sizeof(struct rte_crypto_op) + \
42 				sizeof(struct rte_crypto_sym_op) + \
43 				DEFAULT_NUM_XFORMS * \
44 				sizeof(struct rte_crypto_sym_xform))
45 
46 /* Handle log statements in same manner as test macros */
47 #define LOG_DBG(...)    RTE_LOG(DEBUG, EAL, __VA_ARGS__)
48 
49 static const uint8_t text_64B[] = {
50 	0x05, 0x15, 0x77, 0x32, 0xc9, 0x66, 0x91, 0x50,
51 	0x93, 0x9f, 0xbb, 0x4e, 0x2e, 0x5a, 0x02, 0xd0,
52 	0x2d, 0x9d, 0x31, 0x5d, 0xc8, 0x9e, 0x86, 0x36,
53 	0x54, 0x5c, 0x50, 0xe8, 0x75, 0x54, 0x74, 0x5e,
54 	0xd5, 0xa2, 0x84, 0x21, 0x2d, 0xc5, 0xf8, 0x1c,
55 	0x55, 0x1a, 0xba, 0x91, 0xce, 0xb5, 0xa3, 0x1e,
56 	0x31, 0xbf, 0xe9, 0xa1, 0x97, 0x5c, 0x2b, 0xd6,
57 	0x57, 0xa5, 0x9f, 0xab, 0xbd, 0xb0, 0x9b, 0x9c
58 };
59 
60 struct event_crypto_adapter_test_params {
61 	struct rte_mempool *mbuf_pool;
62 	struct rte_mempool *op_mpool;
63 	struct rte_mempool *session_mpool;
64 	struct rte_mempool *session_priv_mpool;
65 	struct rte_cryptodev_config *config;
66 	uint8_t crypto_event_port_id;
67 };
68 
69 struct rte_event response_info = {
70 	.queue_id = TEST_APP_EV_QUEUE_ID,
71 	.sched_type = RTE_SCHED_TYPE_ATOMIC,
72 	.flow_id = TEST_APP_EV_FLOWID,
73 	.priority = TEST_APP_EV_PRIORITY
74 };
75 
76 struct rte_event_crypto_request request_info = {
77 	.cdev_id = TEST_CDEV_ID,
78 	.queue_pair_id = TEST_CDEV_QP_ID
79 };
80 
81 static struct event_crypto_adapter_test_params params;
82 static uint8_t crypto_adapter_setup_done;
83 static uint32_t slcore_id;
84 static int evdev;
85 
86 static struct rte_mbuf *
87 alloc_fill_mbuf(struct rte_mempool *mpool, const uint8_t *data,
88 		size_t len, uint8_t blocksize)
89 {
90 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
91 	size_t t_len = len - (blocksize ? (len % blocksize) : 0);
92 
93 	if (m) {
94 		char *dst = rte_pktmbuf_append(m, t_len);
95 
96 		if (!dst) {
97 			rte_pktmbuf_free(m);
98 			return NULL;
99 		}
100 
101 		rte_memcpy(dst, (const void *)data, t_len);
102 	}
103 	return m;
104 }
105 
106 static int
107 send_recv_ev(struct rte_event *ev)
108 {
109 	struct rte_crypto_op *op;
110 	struct rte_event recv_ev;
111 	int ret;
112 
113 	ret = rte_event_enqueue_burst(evdev, TEST_APP_PORT_ID, ev, NUM);
114 	TEST_ASSERT_EQUAL(ret, NUM,
115 			  "Failed to send event to crypto adapter\n");
116 
117 	while (rte_event_dequeue_burst(evdev,
118 			TEST_APP_PORT_ID, &recv_ev, NUM, 0) == 0)
119 		rte_pause();
120 
121 	op = recv_ev.event_ptr;
122 #if PKT_TRACE
123 	struct rte_mbuf *m = op->sym->m_src;
124 	rte_pktmbuf_dump(stdout, m, rte_pktmbuf_pkt_len(m));
125 #endif
126 	rte_pktmbuf_free(op->sym->m_src);
127 	rte_crypto_op_free(op);
128 
129 	return TEST_SUCCESS;
130 }
131 
132 static int
133 test_crypto_adapter_stats(void)
134 {
135 	struct rte_event_crypto_adapter_stats stats;
136 
137 	rte_event_crypto_adapter_stats_get(TEST_ADAPTER_ID, &stats);
138 	printf(" +------------------------------------------------------+\n");
139 	printf(" + Crypto adapter stats for instance %u:\n", TEST_ADAPTER_ID);
140 	printf(" + Event port poll count          %" PRIx64 "\n",
141 		stats.event_poll_count);
142 	printf(" + Event dequeue count            %" PRIx64 "\n",
143 		stats.event_deq_count);
144 	printf(" + Cryptodev enqueue count        %" PRIx64 "\n",
145 		stats.crypto_enq_count);
146 	printf(" + Cryptodev enqueue failed count %" PRIx64 "\n",
147 		stats.crypto_enq_fail);
148 	printf(" + Cryptodev dequeue count        %" PRIx64 "\n",
149 		stats.crypto_deq_count);
150 	printf(" + Event enqueue count            %" PRIx64 "\n",
151 		stats.event_enq_count);
152 	printf(" + Event enqueue retry count      %" PRIx64 "\n",
153 		stats.event_enq_retry_count);
154 	printf(" + Event enqueue fail count       %" PRIx64 "\n",
155 		stats.event_enq_fail_count);
156 	printf(" +------------------------------------------------------+\n");
157 
158 	rte_event_crypto_adapter_stats_reset(TEST_ADAPTER_ID);
159 	return TEST_SUCCESS;
160 }
161 
162 static int
163 test_op_forward_mode(uint8_t session_less)
164 {
165 	struct rte_crypto_sym_xform cipher_xform;
166 	struct rte_cryptodev_sym_session *sess;
167 	union rte_event_crypto_metadata m_data;
168 	struct rte_crypto_sym_op *sym_op;
169 	struct rte_crypto_op *op;
170 	struct rte_mbuf *m;
171 	struct rte_event ev;
172 	uint32_t cap;
173 	int ret;
174 
175 	memset(&m_data, 0, sizeof(m_data));
176 
177 	m = alloc_fill_mbuf(params.mbuf_pool, text_64B, PACKET_LENGTH, 0);
178 	TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf!\n");
179 #if PKT_TRACE
180 	rte_pktmbuf_dump(stdout, m, rte_pktmbuf_pkt_len(m));
181 #endif
182 	/* Setup Cipher Parameters */
183 	cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
184 	cipher_xform.next = NULL;
185 	cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
186 	cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
187 
188 	op = rte_crypto_op_alloc(params.op_mpool,
189 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
190 	TEST_ASSERT_NOT_NULL(op,
191 		"Failed to allocate symmetric crypto operation struct\n");
192 
193 	sym_op = op->sym;
194 
195 	if (!session_less) {
196 		sess = rte_cryptodev_sym_session_create(
197 				params.session_mpool);
198 		TEST_ASSERT_NOT_NULL(sess, "Session creation failed\n");
199 
200 		/* Create Crypto session*/
201 		ret = rte_cryptodev_sym_session_init(TEST_CDEV_ID, sess,
202 				&cipher_xform, params.session_priv_mpool);
203 		TEST_ASSERT_SUCCESS(ret, "Failed to init session\n");
204 
205 		ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID,
206 							&cap);
207 		TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
208 
209 		if (cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_SESSION_PRIVATE_DATA) {
210 			/* Fill in private user data information */
211 			rte_memcpy(&m_data.response_info, &response_info,
212 				sizeof(response_info));
213 			rte_memcpy(&m_data.request_info, &request_info,
214 				sizeof(request_info));
215 			rte_cryptodev_sym_session_set_user_data(sess,
216 						&m_data, sizeof(m_data));
217 		}
218 
219 		rte_crypto_op_attach_sym_session(op, sess);
220 	} else {
221 		struct rte_crypto_sym_xform *first_xform;
222 
223 		rte_crypto_op_sym_xforms_alloc(op, NUM);
224 		op->sess_type = RTE_CRYPTO_OP_SESSIONLESS;
225 		first_xform = &cipher_xform;
226 		sym_op->xform = first_xform;
227 		uint32_t len = IV_OFFSET + MAXIMUM_IV_LENGTH +
228 				(sizeof(struct rte_crypto_sym_xform) * 2);
229 		op->private_data_offset = len;
230 		/* Fill in private data information */
231 		rte_memcpy(&m_data.response_info, &response_info,
232 			   sizeof(response_info));
233 		rte_memcpy(&m_data.request_info, &request_info,
234 			   sizeof(request_info));
235 		rte_memcpy((uint8_t *)op + len, &m_data, sizeof(m_data));
236 	}
237 
238 	sym_op->m_src = m;
239 	sym_op->cipher.data.offset = 0;
240 	sym_op->cipher.data.length = PACKET_LENGTH;
241 
242 	/* Fill in event info and update event_ptr with rte_crypto_op */
243 	memset(&ev, 0, sizeof(ev));
244 	ev.queue_id = TEST_CRYPTO_EV_QUEUE_ID;
245 	ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
246 	ev.flow_id = 0xAABB;
247 	ev.event_ptr = op;
248 
249 	ret = send_recv_ev(&ev);
250 	TEST_ASSERT_SUCCESS(ret, "Failed to send/receive event to "
251 				"crypto adapter\n");
252 
253 	test_crypto_adapter_stats();
254 
255 	return TEST_SUCCESS;
256 }
257 
258 static int
259 map_adapter_service_core(void)
260 {
261 	uint32_t adapter_service_id;
262 	int ret;
263 
264 	if (rte_event_crypto_adapter_service_id_get(TEST_ADAPTER_ID,
265 						&adapter_service_id) == 0) {
266 		uint32_t core_list[NUM_CORES];
267 
268 		ret = rte_service_lcore_list(core_list, NUM_CORES);
269 		TEST_ASSERT(ret >= 0, "Failed to get service core list!");
270 
271 		if (core_list[0] != slcore_id) {
272 			TEST_ASSERT_SUCCESS(rte_service_lcore_add(slcore_id),
273 						"Failed to add service core");
274 			TEST_ASSERT_SUCCESS(rte_service_lcore_start(slcore_id),
275 						"Failed to start service core");
276 		}
277 
278 		TEST_ASSERT_SUCCESS(rte_service_map_lcore_set(
279 					adapter_service_id, slcore_id, 1),
280 					"Failed to map adapter service");
281 	}
282 
283 	return TEST_SUCCESS;
284 }
285 
286 static int
287 test_sessionless_with_op_forward_mode(void)
288 {
289 	uint32_t cap;
290 	int ret;
291 
292 	ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID, &cap);
293 	TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
294 
295 	if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD) &&
296 	    !(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
297 		map_adapter_service_core();
298 	else {
299 		if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD))
300 			return TEST_SKIPPED;
301 	}
302 
303 	TEST_ASSERT_SUCCESS(rte_event_crypto_adapter_start(TEST_ADAPTER_ID),
304 				"Failed to start event crypto adapter");
305 
306 	ret = test_op_forward_mode(1);
307 	TEST_ASSERT_SUCCESS(ret, "Sessionless - FORWARD mode test failed\n");
308 	return TEST_SUCCESS;
309 }
310 
311 static int
312 test_session_with_op_forward_mode(void)
313 {
314 	uint32_t cap;
315 	int ret;
316 
317 	ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID, &cap);
318 	TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
319 
320 	if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD) &&
321 	    !(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
322 		map_adapter_service_core();
323 	else {
324 		if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD))
325 			return TEST_SKIPPED;
326 	}
327 
328 	TEST_ASSERT_SUCCESS(rte_event_crypto_adapter_start(TEST_ADAPTER_ID
329 				), "Failed to start event crypto adapter");
330 
331 	ret = test_op_forward_mode(0);
332 	TEST_ASSERT_SUCCESS(ret, "Session based - FORWARD mode test failed\n");
333 	return TEST_SUCCESS;
334 }
335 
336 static int
337 send_op_recv_ev(struct rte_crypto_op *op)
338 {
339 	struct rte_crypto_op *recv_op;
340 	struct rte_event ev;
341 	int ret;
342 
343 	ret = rte_cryptodev_enqueue_burst(TEST_CDEV_ID, TEST_CDEV_QP_ID,
344 					  &op, NUM);
345 	TEST_ASSERT_EQUAL(ret, NUM, "Failed to enqueue to cryptodev\n");
346 	memset(&ev, 0, sizeof(ev));
347 
348 	while (rte_event_dequeue_burst(evdev,
349 		TEST_APP_PORT_ID, &ev, NUM, 0) == 0)
350 		rte_pause();
351 
352 	recv_op = ev.event_ptr;
353 #if PKT_TRACE
354 	struct rte_mbuf *m = recv_op->sym->m_src;
355 	rte_pktmbuf_dump(stdout, m, rte_pktmbuf_pkt_len(m));
356 #endif
357 	rte_pktmbuf_free(recv_op->sym->m_src);
358 	rte_crypto_op_free(recv_op);
359 
360 	return TEST_SUCCESS;
361 }
362 
363 static int
364 test_op_new_mode(uint8_t session_less)
365 {
366 	struct rte_crypto_sym_xform cipher_xform;
367 	struct rte_cryptodev_sym_session *sess;
368 	union rte_event_crypto_metadata m_data;
369 	struct rte_crypto_sym_op *sym_op;
370 	struct rte_crypto_op *op;
371 	struct rte_mbuf *m;
372 	uint32_t cap;
373 	int ret;
374 
375 	memset(&m_data, 0, sizeof(m_data));
376 
377 	m = alloc_fill_mbuf(params.mbuf_pool, text_64B, PACKET_LENGTH, 0);
378 	TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf!\n");
379 #if PKT_TRACE
380 	rte_pktmbuf_dump(stdout, m, rte_pktmbuf_pkt_len(m));
381 #endif
382 	/* Setup Cipher Parameters */
383 	cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
384 	cipher_xform.next = NULL;
385 	cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
386 	cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
387 
388 	op = rte_crypto_op_alloc(params.op_mpool,
389 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
390 	TEST_ASSERT_NOT_NULL(op, "Failed to allocate crypto_op!\n");
391 
392 	sym_op = op->sym;
393 
394 	if (!session_less) {
395 		sess = rte_cryptodev_sym_session_create(
396 				params.session_mpool);
397 		TEST_ASSERT_NOT_NULL(sess, "Session creation failed\n");
398 
399 		ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID,
400 							&cap);
401 		TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
402 
403 		if (cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_SESSION_PRIVATE_DATA) {
404 			/* Fill in private user data information */
405 			rte_memcpy(&m_data.response_info, &response_info,
406 				   sizeof(m_data));
407 			rte_cryptodev_sym_session_set_user_data(sess,
408 						&m_data, sizeof(m_data));
409 		}
410 		ret = rte_cryptodev_sym_session_init(TEST_CDEV_ID, sess,
411 				&cipher_xform, params.session_priv_mpool);
412 		TEST_ASSERT_SUCCESS(ret, "Failed to init session\n");
413 
414 		rte_crypto_op_attach_sym_session(op, sess);
415 	} else {
416 		struct rte_crypto_sym_xform *first_xform;
417 
418 		rte_crypto_op_sym_xforms_alloc(op, NUM);
419 		op->sess_type = RTE_CRYPTO_OP_SESSIONLESS;
420 		first_xform = &cipher_xform;
421 		sym_op->xform = first_xform;
422 		uint32_t len = IV_OFFSET + MAXIMUM_IV_LENGTH +
423 				(sizeof(struct rte_crypto_sym_xform) * 2);
424 		op->private_data_offset = len;
425 		/* Fill in private data information */
426 		rte_memcpy(&m_data.response_info, &response_info,
427 			   sizeof(m_data));
428 		rte_memcpy((uint8_t *)op + len, &m_data, sizeof(m_data));
429 	}
430 
431 	sym_op->m_src = m;
432 	sym_op->cipher.data.offset = 0;
433 	sym_op->cipher.data.length = PACKET_LENGTH;
434 
435 	ret = send_op_recv_ev(op);
436 	TEST_ASSERT_SUCCESS(ret, "Failed to enqueue op to cryptodev\n");
437 
438 	test_crypto_adapter_stats();
439 
440 	return TEST_SUCCESS;
441 }
442 
443 static int
444 test_sessionless_with_op_new_mode(void)
445 {
446 	uint32_t cap;
447 	int ret;
448 
449 	ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID, &cap);
450 	TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
451 
452 	if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD) &&
453 	    !(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
454 		map_adapter_service_core();
455 	else {
456 		if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
457 			return TEST_SKIPPED;
458 	}
459 
460 	/* start the event crypto adapter */
461 	TEST_ASSERT_SUCCESS(rte_event_crypto_adapter_start(TEST_ADAPTER_ID),
462 				"Failed to start event crypto adapter");
463 
464 	ret = test_op_new_mode(1);
465 	TEST_ASSERT_SUCCESS(ret, "Sessionless - NEW mode test failed\n");
466 	return TEST_SUCCESS;
467 }
468 
469 static int
470 test_session_with_op_new_mode(void)
471 {
472 	uint32_t cap;
473 	int ret;
474 
475 	ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID, &cap);
476 	TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
477 
478 	if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD) &&
479 	    !(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
480 		map_adapter_service_core();
481 	else {
482 		if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
483 			return TEST_SKIPPED;
484 	}
485 
486 	TEST_ASSERT_SUCCESS(rte_event_crypto_adapter_start(TEST_ADAPTER_ID),
487 				"Failed to start event crypto adapter");
488 
489 	ret = test_op_new_mode(0);
490 	TEST_ASSERT_SUCCESS(ret, "Session based - NEW mode test failed\n");
491 	return TEST_SUCCESS;
492 }
493 
494 static int
495 configure_cryptodev(void)
496 {
497 	struct rte_cryptodev_qp_conf qp_conf;
498 	struct rte_cryptodev_config conf;
499 	struct rte_cryptodev_info info;
500 	unsigned int session_size;
501 	uint8_t nb_devs;
502 	int ret;
503 
504 	params.mbuf_pool = rte_pktmbuf_pool_create(
505 			"CRYPTO_ADAPTER_MBUFPOOL",
506 			NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
507 			rte_socket_id());
508 	if (params.mbuf_pool == NULL) {
509 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
510 		return TEST_FAILED;
511 	}
512 
513 	params.op_mpool = rte_crypto_op_pool_create(
514 			"EVENT_CRYPTO_SYM_OP_POOL",
515 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
516 			NUM_MBUFS, MBUF_CACHE_SIZE,
517 			DEFAULT_NUM_XFORMS *
518 			sizeof(struct rte_crypto_sym_xform) +
519 			MAXIMUM_IV_LENGTH,
520 			rte_socket_id());
521 	if (params.op_mpool == NULL) {
522 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
523 		return TEST_FAILED;
524 	}
525 
526 	/* Create a NULL crypto device */
527 	nb_devs = rte_cryptodev_device_count_by_driver(
528 			rte_cryptodev_driver_id_get(
529 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)));
530 	if (!nb_devs) {
531 		ret = rte_vdev_init(
532 			RTE_STR(CRYPTODEV_NAME_NULL_PMD), NULL);
533 
534 		TEST_ASSERT(ret == 0, "Failed to create pmd:%s instance\n",
535 			    RTE_STR(CRYPTODEV_NAME_NULL_PMD));
536 	}
537 
538 	nb_devs = rte_cryptodev_count();
539 	if (!nb_devs) {
540 		RTE_LOG(ERR, USER1, "No crypto devices found!\n");
541 		return TEST_FAILED;
542 	}
543 
544 	/*
545 	 * Create mempool with maximum number of sessions * 2,
546 	 * to include the session headers & private data
547 	 */
548 	session_size = rte_cryptodev_sym_get_private_session_size(TEST_CDEV_ID);
549 	session_size += sizeof(union rte_event_crypto_metadata);
550 
551 	params.session_mpool = rte_cryptodev_sym_session_pool_create(
552 			"CRYPTO_ADAPTER_SESSION_MP",
553 			MAX_NB_SESSIONS, 0, 0,
554 			sizeof(union rte_event_crypto_metadata),
555 			SOCKET_ID_ANY);
556 	TEST_ASSERT_NOT_NULL(params.session_mpool,
557 			"session mempool allocation failed\n");
558 
559 	params.session_priv_mpool = rte_mempool_create(
560 				"CRYPTO_AD_SESS_MP_PRIV",
561 				MAX_NB_SESSIONS,
562 				session_size,
563 				0, 0, NULL, NULL, NULL,
564 				NULL, SOCKET_ID_ANY,
565 				0);
566 	TEST_ASSERT_NOT_NULL(params.session_priv_mpool,
567 			"session mempool allocation failed\n");
568 
569 	rte_cryptodev_info_get(TEST_CDEV_ID, &info);
570 	conf.nb_queue_pairs = info.max_nb_queue_pairs;
571 	conf.socket_id = SOCKET_ID_ANY;
572 	conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
573 
574 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(TEST_CDEV_ID, &conf),
575 			"Failed to configure cryptodev %u with %u qps\n",
576 			TEST_CDEV_ID, conf.nb_queue_pairs);
577 
578 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
579 	qp_conf.mp_session = params.session_mpool;
580 	qp_conf.mp_session_private = params.session_priv_mpool;
581 
582 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
583 			TEST_CDEV_ID, TEST_CDEV_QP_ID, &qp_conf,
584 			rte_cryptodev_socket_id(TEST_CDEV_ID)),
585 			"Failed to setup queue pair %u on cryptodev %u\n",
586 			TEST_CDEV_QP_ID, TEST_CDEV_ID);
587 
588 	return TEST_SUCCESS;
589 }
590 
591 static inline void
592 evdev_set_conf_values(struct rte_event_dev_config *dev_conf,
593 			struct rte_event_dev_info *info)
594 {
595 	memset(dev_conf, 0, sizeof(struct rte_event_dev_config));
596 	dev_conf->dequeue_timeout_ns = info->min_dequeue_timeout_ns;
597 	dev_conf->nb_event_ports = NB_TEST_PORTS;
598 	dev_conf->nb_event_queues = NB_TEST_QUEUES;
599 	dev_conf->nb_event_queue_flows = info->max_event_queue_flows;
600 	dev_conf->nb_event_port_dequeue_depth =
601 			info->max_event_port_dequeue_depth;
602 	dev_conf->nb_event_port_enqueue_depth =
603 			info->max_event_port_enqueue_depth;
604 	dev_conf->nb_event_port_enqueue_depth =
605 			info->max_event_port_enqueue_depth;
606 	dev_conf->nb_events_limit =
607 			info->max_num_events;
608 }
609 
610 static int
611 configure_eventdev(void)
612 {
613 	struct rte_event_queue_conf queue_conf;
614 	struct rte_event_dev_config devconf;
615 	struct rte_event_dev_info info;
616 	uint32_t queue_count;
617 	uint32_t port_count;
618 	int ret;
619 	uint8_t qid;
620 
621 	if (!rte_event_dev_count()) {
622 		/* If there is no hardware eventdev, or no software vdev was
623 		 * specified on the command line, create an instance of
624 		 * event_sw.
625 		 */
626 		LOG_DBG("Failed to find a valid event device... "
627 			"testing with event_sw device\n");
628 		TEST_ASSERT_SUCCESS(rte_vdev_init("event_sw0", NULL),
629 					"Error creating eventdev");
630 		evdev = rte_event_dev_get_dev_id("event_sw0");
631 	}
632 
633 	ret = rte_event_dev_info_get(evdev, &info);
634 	TEST_ASSERT_SUCCESS(ret, "Failed to get event dev info\n");
635 
636 	evdev_set_conf_values(&devconf, &info);
637 
638 	ret = rte_event_dev_configure(evdev, &devconf);
639 	TEST_ASSERT_SUCCESS(ret, "Failed to configure eventdev\n");
640 
641 	/* Set up event queue */
642 	ret = rte_event_dev_attr_get(evdev, RTE_EVENT_DEV_ATTR_QUEUE_COUNT,
643 					&queue_count);
644 	TEST_ASSERT_SUCCESS(ret, "Queue count get failed\n");
645 	TEST_ASSERT_EQUAL(queue_count, 2, "Unexpected queue count\n");
646 
647 	qid = TEST_APP_EV_QUEUE_ID;
648 	ret = rte_event_queue_setup(evdev, qid, NULL);
649 	TEST_ASSERT_SUCCESS(ret, "Failed to setup queue=%d\n", qid);
650 
651 	queue_conf.nb_atomic_flows = info.max_event_queue_flows;
652 	queue_conf.nb_atomic_order_sequences = 32;
653 	queue_conf.schedule_type = RTE_SCHED_TYPE_ATOMIC;
654 	queue_conf.priority = RTE_EVENT_DEV_PRIORITY_HIGHEST;
655 	queue_conf.event_queue_cfg = RTE_EVENT_QUEUE_CFG_SINGLE_LINK;
656 
657 	qid = TEST_CRYPTO_EV_QUEUE_ID;
658 	ret = rte_event_queue_setup(evdev, qid, &queue_conf);
659 	TEST_ASSERT_SUCCESS(ret, "Failed to setup queue=%u\n", qid);
660 
661 	/* Set up event port */
662 	ret = rte_event_dev_attr_get(evdev, RTE_EVENT_DEV_ATTR_PORT_COUNT,
663 					&port_count);
664 	TEST_ASSERT_SUCCESS(ret, "Port count get failed\n");
665 	TEST_ASSERT_EQUAL(port_count, 1, "Unexpected port count\n");
666 
667 	ret = rte_event_port_setup(evdev, TEST_APP_PORT_ID, NULL);
668 	TEST_ASSERT_SUCCESS(ret, "Failed to setup port=%d\n",
669 			    TEST_APP_PORT_ID);
670 
671 	qid = TEST_APP_EV_QUEUE_ID;
672 	ret = rte_event_port_link(evdev, TEST_APP_PORT_ID, &qid, NULL, 1);
673 	TEST_ASSERT(ret >= 0, "Failed to link queue port=%d\n",
674 		    TEST_APP_PORT_ID);
675 
676 	return TEST_SUCCESS;
677 }
678 
679 static void
680 test_crypto_adapter_free(void)
681 {
682 	rte_event_crypto_adapter_free(TEST_ADAPTER_ID);
683 }
684 
685 static int
686 test_crypto_adapter_create(void)
687 {
688 	struct rte_event_port_conf conf = {
689 		.dequeue_depth = 8,
690 		.enqueue_depth = 8,
691 		.new_event_threshold = 1200,
692 	};
693 	int ret;
694 
695 	/* Create adapter with default port creation callback */
696 	ret = rte_event_crypto_adapter_create(TEST_ADAPTER_ID,
697 					      evdev,
698 					      &conf, 0);
699 	TEST_ASSERT_SUCCESS(ret, "Failed to create event crypto adapter\n");
700 
701 	return TEST_SUCCESS;
702 }
703 
704 static int
705 test_crypto_adapter_qp_add_del(void)
706 {
707 	uint32_t cap;
708 	int ret;
709 
710 	ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID, &cap);
711 	TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
712 
713 	if (cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_QP_EV_BIND) {
714 		ret = rte_event_crypto_adapter_queue_pair_add(TEST_ADAPTER_ID,
715 				TEST_CDEV_ID, TEST_CDEV_QP_ID, &response_info);
716 	} else
717 		ret = rte_event_crypto_adapter_queue_pair_add(TEST_ADAPTER_ID,
718 					TEST_CDEV_ID, TEST_CDEV_QP_ID, NULL);
719 
720 	TEST_ASSERT_SUCCESS(ret, "Failed to create add queue pair\n");
721 
722 	ret = rte_event_crypto_adapter_queue_pair_del(TEST_ADAPTER_ID,
723 					TEST_CDEV_ID, TEST_CDEV_QP_ID);
724 	TEST_ASSERT_SUCCESS(ret, "Failed to delete add queue pair\n");
725 
726 	return TEST_SUCCESS;
727 }
728 
729 static int
730 configure_event_crypto_adapter(enum rte_event_crypto_adapter_mode mode)
731 {
732 	struct rte_event_port_conf conf = {
733 		.dequeue_depth = 8,
734 		.enqueue_depth = 8,
735 		.new_event_threshold = 1200,
736 	};
737 
738 	uint32_t cap;
739 	int ret;
740 
741 	ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID, &cap);
742 	TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
743 
744 	/* Skip mode and capability mismatch check for SW eventdev */
745 	if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW) &&
746 	    !(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD) &&
747 	    !(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_QP_EV_BIND))
748 		goto adapter_create;
749 
750 	if ((mode == RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD) &&
751 	    !(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD))
752 		return -ENOTSUP;
753 
754 	if ((mode == RTE_EVENT_CRYPTO_ADAPTER_OP_NEW) &&
755 	    !(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
756 		return -ENOTSUP;
757 
758 adapter_create:
759 	/* Create adapter with default port creation callback */
760 	ret = rte_event_crypto_adapter_create(TEST_ADAPTER_ID,
761 					      evdev,
762 					      &conf, mode);
763 	TEST_ASSERT_SUCCESS(ret, "Failed to create event crypto adapter\n");
764 
765 	if (cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_QP_EV_BIND) {
766 		ret = rte_event_crypto_adapter_queue_pair_add(TEST_ADAPTER_ID,
767 				TEST_CDEV_ID, TEST_CDEV_QP_ID, &response_info);
768 	} else
769 		ret = rte_event_crypto_adapter_queue_pair_add(TEST_ADAPTER_ID,
770 				TEST_CDEV_ID, TEST_CDEV_QP_ID, NULL);
771 
772 	TEST_ASSERT_SUCCESS(ret, "Failed to add queue pair\n");
773 
774 	ret = rte_event_crypto_adapter_event_port_get(TEST_ADAPTER_ID,
775 				&params.crypto_event_port_id);
776 	TEST_ASSERT_SUCCESS(ret, "Failed to get event port\n");
777 
778 	return TEST_SUCCESS;
779 }
780 
781 static void
782 test_crypto_adapter_stop(void)
783 {
784 	uint32_t evdev_service_id, adapter_service_id;
785 
786 	/* retrieve service ids & stop services */
787 	if (rte_event_crypto_adapter_service_id_get(TEST_ADAPTER_ID,
788 						&adapter_service_id) == 0) {
789 		rte_service_runstate_set(adapter_service_id, 0);
790 		rte_service_lcore_stop(slcore_id);
791 		rte_service_lcore_del(slcore_id);
792 		rte_event_crypto_adapter_stop(TEST_ADAPTER_ID);
793 	}
794 
795 	if (rte_event_dev_service_id_get(evdev, &evdev_service_id) == 0) {
796 		rte_service_runstate_set(evdev_service_id, 0);
797 		rte_service_lcore_stop(slcore_id);
798 		rte_service_lcore_del(slcore_id);
799 		rte_event_dev_stop(evdev);
800 	}
801 }
802 
803 static int
804 test_crypto_adapter_conf(enum rte_event_crypto_adapter_mode mode)
805 {
806 	uint32_t evdev_service_id;
807 	uint8_t qid;
808 	int ret;
809 
810 	if (!crypto_adapter_setup_done) {
811 		ret = configure_event_crypto_adapter(mode);
812 		if (!ret) {
813 			qid = TEST_CRYPTO_EV_QUEUE_ID;
814 			ret = rte_event_port_link(evdev,
815 				params.crypto_event_port_id, &qid, NULL, 1);
816 			TEST_ASSERT(ret >= 0, "Failed to link queue %d "
817 					"port=%u\n", qid,
818 					params.crypto_event_port_id);
819 		} else {
820 			return ret;
821 		}
822 		crypto_adapter_setup_done = 1;
823 	}
824 
825 	/* retrieve service ids */
826 	if (rte_event_dev_service_id_get(evdev, &evdev_service_id) == 0) {
827 		/* add a service core and start it */
828 		TEST_ASSERT_SUCCESS(rte_service_lcore_add(slcore_id),
829 					"Failed to add service core");
830 		TEST_ASSERT_SUCCESS(rte_service_lcore_start(slcore_id),
831 					"Failed to start service core");
832 
833 		/* map services to it */
834 		TEST_ASSERT_SUCCESS(rte_service_map_lcore_set(evdev_service_id,
835 				slcore_id, 1), "Failed to map evdev service");
836 
837 		/* set services to running */
838 		TEST_ASSERT_SUCCESS(rte_service_runstate_set(evdev_service_id,
839 					1), "Failed to start evdev service");
840 	}
841 
842 	/* start the eventdev */
843 	TEST_ASSERT_SUCCESS(rte_event_dev_start(evdev),
844 				"Failed to start event device");
845 
846 	return TEST_SUCCESS;
847 }
848 
849 static int
850 test_crypto_adapter_conf_op_forward_mode(void)
851 {
852 	enum rte_event_crypto_adapter_mode mode;
853 
854 	mode = RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD;
855 
856 	return test_crypto_adapter_conf(mode);
857 }
858 
859 static int
860 test_crypto_adapter_conf_op_new_mode(void)
861 {
862 	enum rte_event_crypto_adapter_mode mode;
863 
864 	mode = RTE_EVENT_CRYPTO_ADAPTER_OP_NEW;
865 
866 	return test_crypto_adapter_conf(mode);
867 }
868 
869 
870 static int
871 testsuite_setup(void)
872 {
873 	int ret;
874 
875 	slcore_id = rte_get_next_lcore(-1, 1, 0);
876 	TEST_ASSERT_NOT_EQUAL(slcore_id, RTE_MAX_LCORE, "At least 2 lcores "
877 			"are required to run this autotest\n");
878 
879 	/* Setup and start event device. */
880 	ret = configure_eventdev();
881 	TEST_ASSERT_SUCCESS(ret, "Failed to setup eventdev\n");
882 
883 	/* Setup and start crypto device. */
884 	ret = configure_cryptodev();
885 	TEST_ASSERT_SUCCESS(ret, "cryptodev initialization failed\n");
886 
887 	return TEST_SUCCESS;
888 }
889 
890 static void
891 crypto_adapter_teardown(void)
892 {
893 	int ret;
894 
895 	ret = rte_event_crypto_adapter_stop(TEST_ADAPTER_ID);
896 	if (ret < 0)
897 		RTE_LOG(ERR, USER1, "Failed to stop adapter!");
898 
899 	ret = rte_event_crypto_adapter_queue_pair_del(TEST_ADAPTER_ID,
900 					TEST_CDEV_ID, TEST_CDEV_QP_ID);
901 	if (ret < 0)
902 		RTE_LOG(ERR, USER1, "Failed to delete queue pair!");
903 
904 	ret = rte_event_crypto_adapter_free(TEST_ADAPTER_ID);
905 	if (ret < 0)
906 		RTE_LOG(ERR, USER1, "Failed to free adapter!");
907 
908 	crypto_adapter_setup_done = 0;
909 }
910 
911 static void
912 crypto_teardown(void)
913 {
914 	/* Free mbuf mempool */
915 	if (params.mbuf_pool != NULL) {
916 		RTE_LOG(DEBUG, USER1, "CRYPTO_ADAPTER_MBUFPOOL count %u\n",
917 		rte_mempool_avail_count(params.mbuf_pool));
918 		rte_mempool_free(params.mbuf_pool);
919 		params.mbuf_pool = NULL;
920 	}
921 
922 	/* Free session mempool */
923 	if (params.session_mpool != NULL) {
924 		RTE_LOG(DEBUG, USER1, "CRYPTO_ADAPTER_SESSION_MP count %u\n",
925 		rte_mempool_avail_count(params.session_mpool));
926 		rte_mempool_free(params.session_mpool);
927 		params.session_mpool = NULL;
928 	}
929 	if (params.session_priv_mpool != NULL) {
930 		rte_mempool_avail_count(params.session_priv_mpool);
931 		rte_mempool_free(params.session_priv_mpool);
932 		params.session_priv_mpool = NULL;
933 	}
934 
935 	/* Free ops mempool */
936 	if (params.op_mpool != NULL) {
937 		RTE_LOG(DEBUG, USER1, "EVENT_CRYPTO_SYM_OP_POOL count %u\n",
938 		rte_mempool_avail_count(params.op_mpool));
939 		rte_mempool_free(params.op_mpool);
940 		params.op_mpool = NULL;
941 	}
942 }
943 
944 static void
945 eventdev_teardown(void)
946 {
947 	rte_event_dev_stop(evdev);
948 }
949 
950 static void
951 testsuite_teardown(void)
952 {
953 	crypto_adapter_teardown();
954 	crypto_teardown();
955 	eventdev_teardown();
956 }
957 
958 static struct unit_test_suite functional_testsuite = {
959 	.suite_name = "Event crypto adapter test suite",
960 	.setup = testsuite_setup,
961 	.teardown = testsuite_teardown,
962 	.unit_test_cases = {
963 
964 		TEST_CASE_ST(NULL, test_crypto_adapter_free,
965 				test_crypto_adapter_create),
966 
967 		TEST_CASE_ST(test_crypto_adapter_create,
968 				test_crypto_adapter_free,
969 				test_crypto_adapter_qp_add_del),
970 
971 		TEST_CASE_ST(test_crypto_adapter_create,
972 				test_crypto_adapter_free,
973 				test_crypto_adapter_stats),
974 
975 		TEST_CASE_ST(test_crypto_adapter_conf_op_forward_mode,
976 				test_crypto_adapter_stop,
977 				test_session_with_op_forward_mode),
978 
979 		TEST_CASE_ST(test_crypto_adapter_conf_op_forward_mode,
980 				test_crypto_adapter_stop,
981 				test_sessionless_with_op_forward_mode),
982 
983 		TEST_CASE_ST(test_crypto_adapter_conf_op_new_mode,
984 				test_crypto_adapter_stop,
985 				test_session_with_op_new_mode),
986 
987 		TEST_CASE_ST(test_crypto_adapter_conf_op_new_mode,
988 				test_crypto_adapter_stop,
989 				test_sessionless_with_op_new_mode),
990 
991 		TEST_CASES_END() /**< NULL terminate unit test array */
992 	}
993 };
994 
995 static int
996 test_event_crypto_adapter(void)
997 {
998 	return unit_test_suite_runner(&functional_testsuite);
999 }
1000 
1001 REGISTER_TEST_COMMAND(event_crypto_adapter_autotest,
1002 		test_event_crypto_adapter);
1003