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