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 ¶ms.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