1a9de470cSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 2a9de470cSBruce Richardson * Copyright(c) 2018 Intel Corporation 3a9de470cSBruce Richardson */ 4a9de470cSBruce Richardson 5a9de470cSBruce Richardson #include <time.h> 6a9de470cSBruce Richardson 7a9de470cSBruce Richardson #include <rte_common.h> 8a9de470cSBruce Richardson #include <rte_hexdump.h> 9a9de470cSBruce Richardson #include <rte_mbuf.h> 10a9de470cSBruce Richardson #include <rte_malloc.h> 11a9de470cSBruce Richardson #include <rte_memcpy.h> 122cb4a0d4SBernard Iremonger #include <rte_cycles.h> 13a9de470cSBruce Richardson #include <rte_bus_vdev.h> 14a9de470cSBruce Richardson #include <rte_ip.h> 15a9de470cSBruce Richardson 16a9de470cSBruce Richardson #include <rte_crypto.h> 17a9de470cSBruce Richardson #include <rte_cryptodev.h> 18a9de470cSBruce Richardson #include <rte_cryptodev_pmd.h> 19a9de470cSBruce Richardson #include <rte_lcore.h> 20a9de470cSBruce Richardson #include <rte_ipsec.h> 21a9de470cSBruce Richardson #include <rte_random.h> 22a9de470cSBruce Richardson #include <rte_esp.h> 23a9de470cSBruce Richardson #include <rte_security_driver.h> 24a9de470cSBruce Richardson 25a9de470cSBruce Richardson #include "test.h" 26a9de470cSBruce Richardson #include "test_cryptodev.h" 27a9de470cSBruce Richardson 28a9de470cSBruce Richardson #define VDEV_ARGS_SIZE 100 29a9de470cSBruce Richardson #define MAX_NB_SESSIONS 100 30a9de470cSBruce Richardson #define MAX_NB_SAS 2 31a9de470cSBruce Richardson #define REPLAY_WIN_0 0 32a9de470cSBruce Richardson #define REPLAY_WIN_32 32 33a9de470cSBruce Richardson #define REPLAY_WIN_64 64 34a9de470cSBruce Richardson #define REPLAY_WIN_128 128 35a9de470cSBruce Richardson #define REPLAY_WIN_256 256 36a9de470cSBruce Richardson #define DATA_64_BYTES 64 37a9de470cSBruce Richardson #define DATA_80_BYTES 80 38a9de470cSBruce Richardson #define DATA_100_BYTES 100 39a9de470cSBruce Richardson #define ESN_ENABLED 1 40a9de470cSBruce Richardson #define ESN_DISABLED 0 41a9de470cSBruce Richardson #define INBOUND_SPI 7 42a9de470cSBruce Richardson #define OUTBOUND_SPI 17 43a9de470cSBruce Richardson #define BURST_SIZE 32 44a9de470cSBruce Richardson #define REORDER_PKTS 1 452cb4a0d4SBernard Iremonger #define DEQUEUE_COUNT 1000 46a9de470cSBruce Richardson 47a9de470cSBruce Richardson struct user_params { 48a9de470cSBruce Richardson enum rte_crypto_sym_xform_type auth; 49a9de470cSBruce Richardson enum rte_crypto_sym_xform_type cipher; 50a9de470cSBruce Richardson enum rte_crypto_sym_xform_type aead; 51a9de470cSBruce Richardson 52a9de470cSBruce Richardson char auth_algo[128]; 53a9de470cSBruce Richardson char cipher_algo[128]; 54a9de470cSBruce Richardson char aead_algo[128]; 55a9de470cSBruce Richardson }; 56a9de470cSBruce Richardson 57a9de470cSBruce Richardson struct ipsec_testsuite_params { 58a9de470cSBruce Richardson struct rte_mempool *mbuf_pool; 59a9de470cSBruce Richardson struct rte_mempool *cop_mpool; 60a9de470cSBruce Richardson struct rte_cryptodev_config conf; 61a9de470cSBruce Richardson struct rte_cryptodev_qp_conf qp_conf; 62a9de470cSBruce Richardson 63a9de470cSBruce Richardson uint8_t valid_dev; 64a9de470cSBruce Richardson uint8_t valid_dev_found; 65a9de470cSBruce Richardson }; 66a9de470cSBruce Richardson 67a9de470cSBruce Richardson struct ipsec_unitest_params { 68a9de470cSBruce Richardson struct rte_crypto_sym_xform cipher_xform; 69a9de470cSBruce Richardson struct rte_crypto_sym_xform auth_xform; 70a9de470cSBruce Richardson struct rte_crypto_sym_xform aead_xform; 71a9de470cSBruce Richardson struct rte_crypto_sym_xform *crypto_xforms; 72a9de470cSBruce Richardson 73a9de470cSBruce Richardson struct rte_security_ipsec_xform ipsec_xform; 74a9de470cSBruce Richardson 75a9de470cSBruce Richardson struct rte_ipsec_sa_prm sa_prm; 76a9de470cSBruce Richardson struct rte_ipsec_session ss[MAX_NB_SAS]; 77a9de470cSBruce Richardson 78a9de470cSBruce Richardson struct rte_crypto_op *cop[BURST_SIZE]; 79a9de470cSBruce Richardson 80a9de470cSBruce Richardson struct rte_mbuf *obuf[BURST_SIZE], *ibuf[BURST_SIZE], 81a9de470cSBruce Richardson *testbuf[BURST_SIZE]; 82a9de470cSBruce Richardson 83a9de470cSBruce Richardson uint16_t pkt_index; 84a9de470cSBruce Richardson }; 85a9de470cSBruce Richardson 86a9de470cSBruce Richardson struct ipsec_test_cfg { 87a9de470cSBruce Richardson uint32_t replay_win_sz; 88a9de470cSBruce Richardson uint32_t esn; 89a9de470cSBruce Richardson uint64_t flags; 90a9de470cSBruce Richardson size_t pkt_sz; 91a9de470cSBruce Richardson uint16_t num_pkts; 92a9de470cSBruce Richardson uint32_t reorder_pkts; 93a9de470cSBruce Richardson }; 94a9de470cSBruce Richardson 95a9de470cSBruce Richardson static const struct ipsec_test_cfg test_cfg[] = { 96a9de470cSBruce Richardson 97a9de470cSBruce Richardson {REPLAY_WIN_0, ESN_DISABLED, 0, DATA_64_BYTES, 1, 0}, 98a9de470cSBruce Richardson {REPLAY_WIN_0, ESN_DISABLED, 0, DATA_80_BYTES, BURST_SIZE, 99a9de470cSBruce Richardson REORDER_PKTS}, 100a9de470cSBruce Richardson {REPLAY_WIN_32, ESN_ENABLED, 0, DATA_100_BYTES, 1, 0}, 101a9de470cSBruce Richardson {REPLAY_WIN_32, ESN_ENABLED, 0, DATA_100_BYTES, BURST_SIZE, 102a9de470cSBruce Richardson REORDER_PKTS}, 103a9de470cSBruce Richardson {REPLAY_WIN_64, ESN_ENABLED, 0, DATA_64_BYTES, 1, 0}, 104a9de470cSBruce Richardson {REPLAY_WIN_128, ESN_ENABLED, RTE_IPSEC_SAFLAG_SQN_ATOM, 105a9de470cSBruce Richardson DATA_80_BYTES, 1, 0}, 106a9de470cSBruce Richardson {REPLAY_WIN_256, ESN_DISABLED, 0, DATA_100_BYTES, 1, 0}, 107a9de470cSBruce Richardson }; 108a9de470cSBruce Richardson 109a9de470cSBruce Richardson static const int num_cfg = RTE_DIM(test_cfg); 110a9de470cSBruce Richardson static struct ipsec_testsuite_params testsuite_params = { NULL }; 111a9de470cSBruce Richardson static struct ipsec_unitest_params unittest_params; 112a9de470cSBruce Richardson static struct user_params uparams; 113a9de470cSBruce Richardson 114a9de470cSBruce Richardson struct supported_cipher_algo { 115a9de470cSBruce Richardson const char *keyword; 116a9de470cSBruce Richardson enum rte_crypto_cipher_algorithm algo; 117a9de470cSBruce Richardson uint16_t iv_len; 118a9de470cSBruce Richardson uint16_t block_size; 119a9de470cSBruce Richardson uint16_t key_len; 120a9de470cSBruce Richardson }; 121a9de470cSBruce Richardson 122a9de470cSBruce Richardson struct supported_auth_algo { 123a9de470cSBruce Richardson const char *keyword; 124a9de470cSBruce Richardson enum rte_crypto_auth_algorithm algo; 125a9de470cSBruce Richardson uint16_t digest_len; 126a9de470cSBruce Richardson uint16_t key_len; 127a9de470cSBruce Richardson uint8_t key_not_req; 128a9de470cSBruce Richardson }; 129a9de470cSBruce Richardson 130a9de470cSBruce Richardson const struct supported_cipher_algo cipher_algos[] = { 131a9de470cSBruce Richardson { 132a9de470cSBruce Richardson .keyword = "null", 133a9de470cSBruce Richardson .algo = RTE_CRYPTO_CIPHER_NULL, 134a9de470cSBruce Richardson .iv_len = 0, 135a9de470cSBruce Richardson .block_size = 4, 136a9de470cSBruce Richardson .key_len = 0 137a9de470cSBruce Richardson }, 138a9de470cSBruce Richardson }; 139a9de470cSBruce Richardson 140a9de470cSBruce Richardson const struct supported_auth_algo auth_algos[] = { 141a9de470cSBruce Richardson { 142a9de470cSBruce Richardson .keyword = "null", 143a9de470cSBruce Richardson .algo = RTE_CRYPTO_AUTH_NULL, 144a9de470cSBruce Richardson .digest_len = 0, 145a9de470cSBruce Richardson .key_len = 0, 146a9de470cSBruce Richardson .key_not_req = 1 147a9de470cSBruce Richardson }, 148a9de470cSBruce Richardson }; 149a9de470cSBruce Richardson 150a9de470cSBruce Richardson static int 151a9de470cSBruce Richardson dummy_sec_create(void *device, struct rte_security_session_conf *conf, 152a9de470cSBruce Richardson struct rte_security_session *sess, struct rte_mempool *mp) 153a9de470cSBruce Richardson { 154a9de470cSBruce Richardson RTE_SET_USED(device); 155a9de470cSBruce Richardson RTE_SET_USED(conf); 156a9de470cSBruce Richardson RTE_SET_USED(mp); 157a9de470cSBruce Richardson 158a9de470cSBruce Richardson sess->sess_private_data = NULL; 159a9de470cSBruce Richardson return 0; 160a9de470cSBruce Richardson } 161a9de470cSBruce Richardson 162a9de470cSBruce Richardson static int 163a9de470cSBruce Richardson dummy_sec_destroy(void *device, struct rte_security_session *sess) 164a9de470cSBruce Richardson { 165a9de470cSBruce Richardson RTE_SET_USED(device); 166a9de470cSBruce Richardson RTE_SET_USED(sess); 167a9de470cSBruce Richardson return 0; 168a9de470cSBruce Richardson } 169a9de470cSBruce Richardson 170a9de470cSBruce Richardson static const struct rte_security_ops dummy_sec_ops = { 171a9de470cSBruce Richardson .session_create = dummy_sec_create, 172a9de470cSBruce Richardson .session_destroy = dummy_sec_destroy, 173a9de470cSBruce Richardson }; 174a9de470cSBruce Richardson 175a9de470cSBruce Richardson static struct rte_security_ctx dummy_sec_ctx = { 176a9de470cSBruce Richardson .ops = &dummy_sec_ops, 177a9de470cSBruce Richardson }; 178a9de470cSBruce Richardson 179a9de470cSBruce Richardson static const struct supported_cipher_algo * 180a9de470cSBruce Richardson find_match_cipher_algo(const char *cipher_keyword) 181a9de470cSBruce Richardson { 182a9de470cSBruce Richardson size_t i; 183a9de470cSBruce Richardson 184a9de470cSBruce Richardson for (i = 0; i < RTE_DIM(cipher_algos); i++) { 185a9de470cSBruce Richardson const struct supported_cipher_algo *algo = 186a9de470cSBruce Richardson &cipher_algos[i]; 187a9de470cSBruce Richardson 188a9de470cSBruce Richardson if (strcmp(cipher_keyword, algo->keyword) == 0) 189a9de470cSBruce Richardson return algo; 190a9de470cSBruce Richardson } 191a9de470cSBruce Richardson 192a9de470cSBruce Richardson return NULL; 193a9de470cSBruce Richardson } 194a9de470cSBruce Richardson 195a9de470cSBruce Richardson static const struct supported_auth_algo * 196a9de470cSBruce Richardson find_match_auth_algo(const char *auth_keyword) 197a9de470cSBruce Richardson { 198a9de470cSBruce Richardson size_t i; 199a9de470cSBruce Richardson 200a9de470cSBruce Richardson for (i = 0; i < RTE_DIM(auth_algos); i++) { 201a9de470cSBruce Richardson const struct supported_auth_algo *algo = 202a9de470cSBruce Richardson &auth_algos[i]; 203a9de470cSBruce Richardson 204a9de470cSBruce Richardson if (strcmp(auth_keyword, algo->keyword) == 0) 205a9de470cSBruce Richardson return algo; 206a9de470cSBruce Richardson } 207a9de470cSBruce Richardson 208a9de470cSBruce Richardson return NULL; 209a9de470cSBruce Richardson } 210a9de470cSBruce Richardson 211a9de470cSBruce Richardson static void 212a9de470cSBruce Richardson fill_crypto_xform(struct ipsec_unitest_params *ut_params, 213a9de470cSBruce Richardson const struct supported_auth_algo *auth_algo, 214a9de470cSBruce Richardson const struct supported_cipher_algo *cipher_algo) 215a9de470cSBruce Richardson { 216a9de470cSBruce Richardson ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 217a9de470cSBruce Richardson ut_params->cipher_xform.cipher.algo = cipher_algo->algo; 21863774c02SBernard Iremonger ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 21963774c02SBernard Iremonger ut_params->auth_xform.auth.algo = auth_algo->algo; 220a9de470cSBruce Richardson 221a9de470cSBruce Richardson if (ut_params->ipsec_xform.direction == 222a9de470cSBruce Richardson RTE_SECURITY_IPSEC_SA_DIR_INGRESS) { 22363774c02SBernard Iremonger ut_params->cipher_xform.cipher.op = 22463774c02SBernard Iremonger RTE_CRYPTO_CIPHER_OP_DECRYPT; 22563774c02SBernard Iremonger ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 226a9de470cSBruce Richardson ut_params->cipher_xform.next = NULL; 22763774c02SBernard Iremonger ut_params->auth_xform.next = &ut_params->cipher_xform; 22863774c02SBernard Iremonger ut_params->crypto_xforms = &ut_params->auth_xform; 229a9de470cSBruce Richardson } else { 23063774c02SBernard Iremonger ut_params->cipher_xform.cipher.op = 23163774c02SBernard Iremonger RTE_CRYPTO_CIPHER_OP_ENCRYPT; 23263774c02SBernard Iremonger ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 233a9de470cSBruce Richardson ut_params->auth_xform.next = NULL; 23463774c02SBernard Iremonger ut_params->cipher_xform.next = &ut_params->auth_xform; 23563774c02SBernard Iremonger ut_params->crypto_xforms = &ut_params->cipher_xform; 236a9de470cSBruce Richardson } 237a9de470cSBruce Richardson } 238a9de470cSBruce Richardson 239a9de470cSBruce Richardson static int 240a9de470cSBruce Richardson check_cryptodev_capablity(const struct ipsec_unitest_params *ut, 241a9de470cSBruce Richardson uint8_t dev_id) 242a9de470cSBruce Richardson { 243a9de470cSBruce Richardson struct rte_cryptodev_sym_capability_idx cap_idx; 244a9de470cSBruce Richardson const struct rte_cryptodev_symmetric_capability *cap; 245a9de470cSBruce Richardson int rc = -1; 246a9de470cSBruce Richardson 247a9de470cSBruce Richardson cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 248a9de470cSBruce Richardson cap_idx.algo.auth = ut->auth_xform.auth.algo; 249a9de470cSBruce Richardson cap = rte_cryptodev_sym_capability_get(dev_id, &cap_idx); 250a9de470cSBruce Richardson 251a9de470cSBruce Richardson if (cap != NULL) { 252a9de470cSBruce Richardson rc = rte_cryptodev_sym_capability_check_auth(cap, 253a9de470cSBruce Richardson ut->auth_xform.auth.key.length, 254a9de470cSBruce Richardson ut->auth_xform.auth.digest_length, 0); 255a9de470cSBruce Richardson if (rc == 0) { 256a9de470cSBruce Richardson cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 257a9de470cSBruce Richardson cap_idx.algo.cipher = ut->cipher_xform.cipher.algo; 258a9de470cSBruce Richardson cap = rte_cryptodev_sym_capability_get( 259a9de470cSBruce Richardson dev_id, &cap_idx); 260a9de470cSBruce Richardson if (cap != NULL) 261a9de470cSBruce Richardson rc = rte_cryptodev_sym_capability_check_cipher( 262a9de470cSBruce Richardson cap, 263a9de470cSBruce Richardson ut->cipher_xform.cipher.key.length, 264a9de470cSBruce Richardson ut->cipher_xform.cipher.iv.length); 265a9de470cSBruce Richardson } 266a9de470cSBruce Richardson } 267a9de470cSBruce Richardson 268a9de470cSBruce Richardson return rc; 269a9de470cSBruce Richardson } 270a9de470cSBruce Richardson 271a9de470cSBruce Richardson static int 272a9de470cSBruce Richardson testsuite_setup(void) 273a9de470cSBruce Richardson { 274a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 275a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 276a9de470cSBruce Richardson const struct supported_auth_algo *auth_algo; 277a9de470cSBruce Richardson const struct supported_cipher_algo *cipher_algo; 278a9de470cSBruce Richardson struct rte_cryptodev_info info; 279a9de470cSBruce Richardson uint32_t i, nb_devs, dev_id; 280a9de470cSBruce Richardson size_t sess_sz; 281a9de470cSBruce Richardson int rc; 282a9de470cSBruce Richardson 283a9de470cSBruce Richardson memset(ts_params, 0, sizeof(*ts_params)); 28463774c02SBernard Iremonger memset(ut_params, 0, sizeof(*ut_params)); 28563774c02SBernard Iremonger memset(&uparams, 0, sizeof(struct user_params)); 286a9de470cSBruce Richardson 287a9de470cSBruce Richardson uparams.auth = RTE_CRYPTO_SYM_XFORM_AUTH; 288a9de470cSBruce Richardson uparams.cipher = RTE_CRYPTO_SYM_XFORM_CIPHER; 28963774c02SBernard Iremonger uparams.aead = RTE_CRYPTO_SYM_XFORM_NOT_SPECIFIED; 290a9de470cSBruce Richardson strcpy(uparams.auth_algo, "null"); 291a9de470cSBruce Richardson strcpy(uparams.cipher_algo, "null"); 292a9de470cSBruce Richardson 293a9de470cSBruce Richardson auth_algo = find_match_auth_algo(uparams.auth_algo); 294a9de470cSBruce Richardson cipher_algo = find_match_cipher_algo(uparams.cipher_algo); 295a9de470cSBruce Richardson fill_crypto_xform(ut_params, auth_algo, cipher_algo); 296a9de470cSBruce Richardson 297a9de470cSBruce Richardson nb_devs = rte_cryptodev_count(); 298a9de470cSBruce Richardson if (nb_devs < 1) { 299a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "No crypto devices found?\n"); 300a9de470cSBruce Richardson return TEST_FAILED; 301a9de470cSBruce Richardson } 302a9de470cSBruce Richardson 303a9de470cSBruce Richardson /* Find first valid crypto device */ 304a9de470cSBruce Richardson for (i = 0; i < nb_devs; i++) { 305a9de470cSBruce Richardson rc = check_cryptodev_capablity(ut_params, i); 306a9de470cSBruce Richardson if (rc == 0) { 307a9de470cSBruce Richardson ts_params->valid_dev = i; 308a9de470cSBruce Richardson ts_params->valid_dev_found = 1; 309a9de470cSBruce Richardson break; 310a9de470cSBruce Richardson } 311a9de470cSBruce Richardson } 312a9de470cSBruce Richardson 313a9de470cSBruce Richardson if (ts_params->valid_dev_found == 0) 314a9de470cSBruce Richardson return TEST_FAILED; 315a9de470cSBruce Richardson 316a9de470cSBruce Richardson ts_params->mbuf_pool = rte_pktmbuf_pool_create( 317a9de470cSBruce Richardson "CRYPTO_MBUFPOOL", 318a9de470cSBruce Richardson NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE, 319a9de470cSBruce Richardson rte_socket_id()); 320a9de470cSBruce Richardson if (ts_params->mbuf_pool == NULL) { 321a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n"); 322a9de470cSBruce Richardson return TEST_FAILED; 323a9de470cSBruce Richardson } 324a9de470cSBruce Richardson 325a9de470cSBruce Richardson ts_params->cop_mpool = rte_crypto_op_pool_create( 326a9de470cSBruce Richardson "MBUF_CRYPTO_SYM_OP_POOL", 327a9de470cSBruce Richardson RTE_CRYPTO_OP_TYPE_SYMMETRIC, 328a9de470cSBruce Richardson NUM_MBUFS, MBUF_CACHE_SIZE, 329a9de470cSBruce Richardson DEFAULT_NUM_XFORMS * 330a9de470cSBruce Richardson sizeof(struct rte_crypto_sym_xform) + 331a9de470cSBruce Richardson MAXIMUM_IV_LENGTH, 332a9de470cSBruce Richardson rte_socket_id()); 333a9de470cSBruce Richardson if (ts_params->cop_mpool == NULL) { 334a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n"); 335a9de470cSBruce Richardson return TEST_FAILED; 336a9de470cSBruce Richardson } 337a9de470cSBruce Richardson 338a9de470cSBruce Richardson /* Set up all the qps on the first of the valid devices found */ 339a9de470cSBruce Richardson dev_id = ts_params->valid_dev; 340a9de470cSBruce Richardson 341a9de470cSBruce Richardson rte_cryptodev_info_get(dev_id, &info); 342a9de470cSBruce Richardson 343a9de470cSBruce Richardson ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs; 344a9de470cSBruce Richardson ts_params->conf.socket_id = SOCKET_ID_ANY; 345a9de470cSBruce Richardson 346a9de470cSBruce Richardson sess_sz = rte_cryptodev_sym_get_private_session_size(dev_id); 347a9de470cSBruce Richardson sess_sz = RTE_MAX(sess_sz, sizeof(struct rte_security_session)); 348a9de470cSBruce Richardson 349a9de470cSBruce Richardson /* 350a9de470cSBruce Richardson * Create mempools for sessions 351a9de470cSBruce Richardson */ 352a9de470cSBruce Richardson if (info.sym.max_nb_sessions != 0 && 353a9de470cSBruce Richardson info.sym.max_nb_sessions < MAX_NB_SESSIONS) { 354a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "Device does not support " 355a9de470cSBruce Richardson "at least %u sessions\n", 356a9de470cSBruce Richardson MAX_NB_SESSIONS); 357a9de470cSBruce Richardson return TEST_FAILED; 358a9de470cSBruce Richardson } 359a9de470cSBruce Richardson 360a9de470cSBruce Richardson ts_params->qp_conf.mp_session_private = rte_mempool_create( 361a9de470cSBruce Richardson "test_priv_sess_mp", 362a9de470cSBruce Richardson MAX_NB_SESSIONS, 363a9de470cSBruce Richardson sess_sz, 364a9de470cSBruce Richardson 0, 0, NULL, NULL, NULL, 365a9de470cSBruce Richardson NULL, SOCKET_ID_ANY, 366a9de470cSBruce Richardson 0); 367a9de470cSBruce Richardson 368a9de470cSBruce Richardson TEST_ASSERT_NOT_NULL(ts_params->qp_conf.mp_session_private, 369a9de470cSBruce Richardson "private session mempool allocation failed"); 370a9de470cSBruce Richardson 371a9de470cSBruce Richardson ts_params->qp_conf.mp_session = 372a9de470cSBruce Richardson rte_cryptodev_sym_session_pool_create("test_sess_mp", 373a9de470cSBruce Richardson MAX_NB_SESSIONS, 0, 0, 0, SOCKET_ID_ANY); 374a9de470cSBruce Richardson 375a9de470cSBruce Richardson TEST_ASSERT_NOT_NULL(ts_params->qp_conf.mp_session, 376a9de470cSBruce Richardson "session mempool allocation failed"); 377a9de470cSBruce Richardson 378a9de470cSBruce Richardson TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, 379a9de470cSBruce Richardson &ts_params->conf), 380a9de470cSBruce Richardson "Failed to configure cryptodev %u with %u qps", 381a9de470cSBruce Richardson dev_id, ts_params->conf.nb_queue_pairs); 382a9de470cSBruce Richardson 383a9de470cSBruce Richardson ts_params->qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; 384a9de470cSBruce Richardson 385a9de470cSBruce Richardson TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 386a9de470cSBruce Richardson dev_id, 0, &ts_params->qp_conf, 387a9de470cSBruce Richardson rte_cryptodev_socket_id(dev_id)), 388a9de470cSBruce Richardson "Failed to setup queue pair %u on cryptodev %u", 389a9de470cSBruce Richardson 0, dev_id); 390a9de470cSBruce Richardson 391a9de470cSBruce Richardson return TEST_SUCCESS; 392a9de470cSBruce Richardson } 393a9de470cSBruce Richardson 394a9de470cSBruce Richardson static void 395a9de470cSBruce Richardson testsuite_teardown(void) 396a9de470cSBruce Richardson { 397a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 398a9de470cSBruce Richardson 399a9de470cSBruce Richardson if (ts_params->mbuf_pool != NULL) { 400a9de470cSBruce Richardson RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 401a9de470cSBruce Richardson rte_mempool_avail_count(ts_params->mbuf_pool)); 402a9de470cSBruce Richardson rte_mempool_free(ts_params->mbuf_pool); 403a9de470cSBruce Richardson ts_params->mbuf_pool = NULL; 404a9de470cSBruce Richardson } 405a9de470cSBruce Richardson 406a9de470cSBruce Richardson if (ts_params->cop_mpool != NULL) { 407a9de470cSBruce Richardson RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n", 408a9de470cSBruce Richardson rte_mempool_avail_count(ts_params->cop_mpool)); 409a9de470cSBruce Richardson rte_mempool_free(ts_params->cop_mpool); 410a9de470cSBruce Richardson ts_params->cop_mpool = NULL; 411a9de470cSBruce Richardson } 412a9de470cSBruce Richardson 413a9de470cSBruce Richardson /* Free session mempools */ 414a9de470cSBruce Richardson if (ts_params->qp_conf.mp_session != NULL) { 415a9de470cSBruce Richardson rte_mempool_free(ts_params->qp_conf.mp_session); 416a9de470cSBruce Richardson ts_params->qp_conf.mp_session = NULL; 417a9de470cSBruce Richardson } 418a9de470cSBruce Richardson 419a9de470cSBruce Richardson if (ts_params->qp_conf.mp_session_private != NULL) { 420a9de470cSBruce Richardson rte_mempool_free(ts_params->qp_conf.mp_session_private); 421a9de470cSBruce Richardson ts_params->qp_conf.mp_session_private = NULL; 422a9de470cSBruce Richardson } 423a9de470cSBruce Richardson } 424a9de470cSBruce Richardson 425a9de470cSBruce Richardson static int 426a9de470cSBruce Richardson ut_setup(void) 427a9de470cSBruce Richardson { 428a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 429a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 430a9de470cSBruce Richardson 431a9de470cSBruce Richardson /* Clear unit test parameters before running test */ 432a9de470cSBruce Richardson memset(ut_params, 0, sizeof(*ut_params)); 433a9de470cSBruce Richardson 434a9de470cSBruce Richardson /* Reconfigure device to default parameters */ 435a9de470cSBruce Richardson ts_params->conf.socket_id = SOCKET_ID_ANY; 436a9de470cSBruce Richardson 437a9de470cSBruce Richardson /* Start the device */ 438a9de470cSBruce Richardson TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_dev), 439a9de470cSBruce Richardson "Failed to start cryptodev %u", 440a9de470cSBruce Richardson ts_params->valid_dev); 441a9de470cSBruce Richardson 442a9de470cSBruce Richardson return TEST_SUCCESS; 443a9de470cSBruce Richardson } 444a9de470cSBruce Richardson 445a9de470cSBruce Richardson static void 446a9de470cSBruce Richardson ut_teardown(void) 447a9de470cSBruce Richardson { 448a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 449a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 450a9de470cSBruce Richardson int i; 451a9de470cSBruce Richardson 452a9de470cSBruce Richardson for (i = 0; i < BURST_SIZE; i++) { 453a9de470cSBruce Richardson /* free crypto operation structure */ 454a9de470cSBruce Richardson if (ut_params->cop[i]) 455a9de470cSBruce Richardson rte_crypto_op_free(ut_params->cop[i]); 456a9de470cSBruce Richardson 457a9de470cSBruce Richardson /* 458a9de470cSBruce Richardson * free mbuf - both obuf and ibuf are usually the same, 459a9de470cSBruce Richardson * so check if they point at the same address is necessary, 460a9de470cSBruce Richardson * to avoid freeing the mbuf twice. 461a9de470cSBruce Richardson */ 462a9de470cSBruce Richardson if (ut_params->obuf[i]) { 463a9de470cSBruce Richardson rte_pktmbuf_free(ut_params->obuf[i]); 464a9de470cSBruce Richardson if (ut_params->ibuf[i] == ut_params->obuf[i]) 465a9de470cSBruce Richardson ut_params->ibuf[i] = 0; 466a9de470cSBruce Richardson ut_params->obuf[i] = 0; 467a9de470cSBruce Richardson } 468a9de470cSBruce Richardson if (ut_params->ibuf[i]) { 469a9de470cSBruce Richardson rte_pktmbuf_free(ut_params->ibuf[i]); 470a9de470cSBruce Richardson ut_params->ibuf[i] = 0; 471a9de470cSBruce Richardson } 472a9de470cSBruce Richardson 473a9de470cSBruce Richardson if (ut_params->testbuf[i]) { 474a9de470cSBruce Richardson rte_pktmbuf_free(ut_params->testbuf[i]); 475a9de470cSBruce Richardson ut_params->testbuf[i] = 0; 476a9de470cSBruce Richardson } 477a9de470cSBruce Richardson } 478a9de470cSBruce Richardson 479a9de470cSBruce Richardson if (ts_params->mbuf_pool != NULL) 480a9de470cSBruce Richardson RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 481a9de470cSBruce Richardson rte_mempool_avail_count(ts_params->mbuf_pool)); 482a9de470cSBruce Richardson 483a9de470cSBruce Richardson /* Stop the device */ 484a9de470cSBruce Richardson rte_cryptodev_stop(ts_params->valid_dev); 485a9de470cSBruce Richardson } 486a9de470cSBruce Richardson 487a9de470cSBruce Richardson #define IPSEC_MAX_PAD_SIZE UINT8_MAX 488a9de470cSBruce Richardson 489a9de470cSBruce Richardson static const uint8_t esp_pad_bytes[IPSEC_MAX_PAD_SIZE] = { 490a9de470cSBruce Richardson 1, 2, 3, 4, 5, 6, 7, 8, 491a9de470cSBruce Richardson 9, 10, 11, 12, 13, 14, 15, 16, 492a9de470cSBruce Richardson 17, 18, 19, 20, 21, 22, 23, 24, 493a9de470cSBruce Richardson 25, 26, 27, 28, 29, 30, 31, 32, 494a9de470cSBruce Richardson 33, 34, 35, 36, 37, 38, 39, 40, 495a9de470cSBruce Richardson 41, 42, 43, 44, 45, 46, 47, 48, 496a9de470cSBruce Richardson 49, 50, 51, 52, 53, 54, 55, 56, 497a9de470cSBruce Richardson 57, 58, 59, 60, 61, 62, 63, 64, 498a9de470cSBruce Richardson 65, 66, 67, 68, 69, 70, 71, 72, 499a9de470cSBruce Richardson 73, 74, 75, 76, 77, 78, 79, 80, 500a9de470cSBruce Richardson 81, 82, 83, 84, 85, 86, 87, 88, 501a9de470cSBruce Richardson 89, 90, 91, 92, 93, 94, 95, 96, 502a9de470cSBruce Richardson 97, 98, 99, 100, 101, 102, 103, 104, 503a9de470cSBruce Richardson 105, 106, 107, 108, 109, 110, 111, 112, 504a9de470cSBruce Richardson 113, 114, 115, 116, 117, 118, 119, 120, 505a9de470cSBruce Richardson 121, 122, 123, 124, 125, 126, 127, 128, 506a9de470cSBruce Richardson 129, 130, 131, 132, 133, 134, 135, 136, 507a9de470cSBruce Richardson 137, 138, 139, 140, 141, 142, 143, 144, 508a9de470cSBruce Richardson 145, 146, 147, 148, 149, 150, 151, 152, 509a9de470cSBruce Richardson 153, 154, 155, 156, 157, 158, 159, 160, 510a9de470cSBruce Richardson 161, 162, 163, 164, 165, 166, 167, 168, 511a9de470cSBruce Richardson 169, 170, 171, 172, 173, 174, 175, 176, 512a9de470cSBruce Richardson 177, 178, 179, 180, 181, 182, 183, 184, 513a9de470cSBruce Richardson 185, 186, 187, 188, 189, 190, 191, 192, 514a9de470cSBruce Richardson 193, 194, 195, 196, 197, 198, 199, 200, 515a9de470cSBruce Richardson 201, 202, 203, 204, 205, 206, 207, 208, 516a9de470cSBruce Richardson 209, 210, 211, 212, 213, 214, 215, 216, 517a9de470cSBruce Richardson 217, 218, 219, 220, 221, 222, 223, 224, 518a9de470cSBruce Richardson 225, 226, 227, 228, 229, 230, 231, 232, 519a9de470cSBruce Richardson 233, 234, 235, 236, 237, 238, 239, 240, 520a9de470cSBruce Richardson 241, 242, 243, 244, 245, 246, 247, 248, 521a9de470cSBruce Richardson 249, 250, 251, 252, 253, 254, 255, 522a9de470cSBruce Richardson }; 523a9de470cSBruce Richardson 524a9de470cSBruce Richardson /* ***** data for tests ***** */ 525a9de470cSBruce Richardson 526a9de470cSBruce Richardson const char null_plain_data[] = 527a9de470cSBruce Richardson "Network Security People Have A Strange Sense Of Humor unlike Other " 528a9de470cSBruce Richardson "People who have a normal sense of humour"; 529a9de470cSBruce Richardson 530a9de470cSBruce Richardson const char null_encrypted_data[] = 531a9de470cSBruce Richardson "Network Security People Have A Strange Sense Of Humor unlike Other " 532a9de470cSBruce Richardson "People who have a normal sense of humour"; 533a9de470cSBruce Richardson 534a9de470cSBruce Richardson struct ipv4_hdr ipv4_outer = { 535a9de470cSBruce Richardson .version_ihl = IPVERSION << 4 | 536a9de470cSBruce Richardson sizeof(ipv4_outer) / IPV4_IHL_MULTIPLIER, 537a9de470cSBruce Richardson .time_to_live = IPDEFTTL, 538a9de470cSBruce Richardson .next_proto_id = IPPROTO_ESP, 539a9de470cSBruce Richardson .src_addr = IPv4(192, 168, 1, 100), 540a9de470cSBruce Richardson .dst_addr = IPv4(192, 168, 2, 100), 541a9de470cSBruce Richardson }; 542a9de470cSBruce Richardson 543a9de470cSBruce Richardson static struct rte_mbuf * 544a9de470cSBruce Richardson setup_test_string(struct rte_mempool *mpool, 545a9de470cSBruce Richardson const char *string, size_t len, uint8_t blocksize) 546a9de470cSBruce Richardson { 547a9de470cSBruce Richardson struct rte_mbuf *m = rte_pktmbuf_alloc(mpool); 548a9de470cSBruce Richardson size_t t_len = len - (blocksize ? (len % blocksize) : 0); 549a9de470cSBruce Richardson 550a9de470cSBruce Richardson if (m) { 551a9de470cSBruce Richardson memset(m->buf_addr, 0, m->buf_len); 552a9de470cSBruce Richardson char *dst = rte_pktmbuf_append(m, t_len); 553a9de470cSBruce Richardson 554a9de470cSBruce Richardson if (!dst) { 555a9de470cSBruce Richardson rte_pktmbuf_free(m); 556a9de470cSBruce Richardson return NULL; 557a9de470cSBruce Richardson } 558a9de470cSBruce Richardson if (string != NULL) 559a9de470cSBruce Richardson rte_memcpy(dst, string, t_len); 560a9de470cSBruce Richardson else 561a9de470cSBruce Richardson memset(dst, 0, t_len); 562a9de470cSBruce Richardson } 563a9de470cSBruce Richardson 564a9de470cSBruce Richardson return m; 565a9de470cSBruce Richardson } 566a9de470cSBruce Richardson 567a9de470cSBruce Richardson static struct rte_mbuf * 568a9de470cSBruce Richardson setup_test_string_tunneled(struct rte_mempool *mpool, const char *string, 569a9de470cSBruce Richardson size_t len, uint32_t spi, uint32_t seq) 570a9de470cSBruce Richardson { 571a9de470cSBruce Richardson struct rte_mbuf *m = rte_pktmbuf_alloc(mpool); 572*5ef25467SOlivier Matz uint32_t hdrlen = sizeof(struct ipv4_hdr) + sizeof(struct rte_esp_hdr); 573a9de470cSBruce Richardson uint32_t taillen = sizeof(struct esp_tail); 574a9de470cSBruce Richardson uint32_t t_len = len + hdrlen + taillen; 575a9de470cSBruce Richardson uint32_t padlen; 576a9de470cSBruce Richardson 577*5ef25467SOlivier Matz struct rte_esp_hdr esph = { 578a9de470cSBruce Richardson .spi = rte_cpu_to_be_32(spi), 579a9de470cSBruce Richardson .seq = rte_cpu_to_be_32(seq) 580a9de470cSBruce Richardson }; 581a9de470cSBruce Richardson 582a9de470cSBruce Richardson padlen = RTE_ALIGN(t_len, 4) - t_len; 583a9de470cSBruce Richardson t_len += padlen; 584a9de470cSBruce Richardson 585a9de470cSBruce Richardson struct esp_tail espt = { 586a9de470cSBruce Richardson .pad_len = padlen, 587a9de470cSBruce Richardson .next_proto = IPPROTO_IPIP, 588a9de470cSBruce Richardson }; 589a9de470cSBruce Richardson 590a9de470cSBruce Richardson if (m == NULL) 591a9de470cSBruce Richardson return NULL; 592a9de470cSBruce Richardson 593a9de470cSBruce Richardson memset(m->buf_addr, 0, m->buf_len); 594a9de470cSBruce Richardson char *dst = rte_pktmbuf_append(m, t_len); 595a9de470cSBruce Richardson 596a9de470cSBruce Richardson if (!dst) { 597a9de470cSBruce Richardson rte_pktmbuf_free(m); 598a9de470cSBruce Richardson return NULL; 599a9de470cSBruce Richardson } 600a9de470cSBruce Richardson /* copy outer IP and ESP header */ 601a9de470cSBruce Richardson ipv4_outer.total_length = rte_cpu_to_be_16(t_len); 602a9de470cSBruce Richardson ipv4_outer.packet_id = rte_cpu_to_be_16(seq); 603a9de470cSBruce Richardson rte_memcpy(dst, &ipv4_outer, sizeof(ipv4_outer)); 604a9de470cSBruce Richardson dst += sizeof(ipv4_outer); 605a9de470cSBruce Richardson m->l3_len = sizeof(ipv4_outer); 606a9de470cSBruce Richardson rte_memcpy(dst, &esph, sizeof(esph)); 607a9de470cSBruce Richardson dst += sizeof(esph); 608a9de470cSBruce Richardson 609a9de470cSBruce Richardson if (string != NULL) { 610a9de470cSBruce Richardson /* copy payload */ 611a9de470cSBruce Richardson rte_memcpy(dst, string, len); 612a9de470cSBruce Richardson dst += len; 613a9de470cSBruce Richardson /* copy pad bytes */ 614a9de470cSBruce Richardson rte_memcpy(dst, esp_pad_bytes, padlen); 615a9de470cSBruce Richardson dst += padlen; 616a9de470cSBruce Richardson /* copy ESP tail header */ 617a9de470cSBruce Richardson rte_memcpy(dst, &espt, sizeof(espt)); 618a9de470cSBruce Richardson } else 619a9de470cSBruce Richardson memset(dst, 0, t_len); 620a9de470cSBruce Richardson 621a9de470cSBruce Richardson return m; 622a9de470cSBruce Richardson } 623a9de470cSBruce Richardson 624a9de470cSBruce Richardson static int 625a9de470cSBruce Richardson create_dummy_sec_session(struct ipsec_unitest_params *ut, 626a9de470cSBruce Richardson struct rte_cryptodev_qp_conf *qp, uint32_t j) 627a9de470cSBruce Richardson { 628a9de470cSBruce Richardson static struct rte_security_session_conf conf; 629a9de470cSBruce Richardson 630a9de470cSBruce Richardson ut->ss[j].security.ses = rte_security_session_create(&dummy_sec_ctx, 631a9de470cSBruce Richardson &conf, qp->mp_session_private); 632a9de470cSBruce Richardson 633a9de470cSBruce Richardson if (ut->ss[j].security.ses == NULL) 634a9de470cSBruce Richardson return -ENOMEM; 635a9de470cSBruce Richardson 636a9de470cSBruce Richardson ut->ss[j].security.ctx = &dummy_sec_ctx; 637a9de470cSBruce Richardson ut->ss[j].security.ol_flags = 0; 638a9de470cSBruce Richardson return 0; 639a9de470cSBruce Richardson } 640a9de470cSBruce Richardson 641a9de470cSBruce Richardson static int 642a9de470cSBruce Richardson create_crypto_session(struct ipsec_unitest_params *ut, 643a9de470cSBruce Richardson struct rte_cryptodev_qp_conf *qp, uint8_t dev_id, uint32_t j) 644a9de470cSBruce Richardson { 645a9de470cSBruce Richardson int32_t rc; 646a9de470cSBruce Richardson struct rte_cryptodev_sym_session *s; 647a9de470cSBruce Richardson 648a9de470cSBruce Richardson s = rte_cryptodev_sym_session_create(qp->mp_session); 649a9de470cSBruce Richardson if (s == NULL) 650a9de470cSBruce Richardson return -ENOMEM; 651a9de470cSBruce Richardson 652a9de470cSBruce Richardson /* initiliaze SA crypto session for device */ 653a9de470cSBruce Richardson rc = rte_cryptodev_sym_session_init(dev_id, s, 654a9de470cSBruce Richardson ut->crypto_xforms, qp->mp_session_private); 655a9de470cSBruce Richardson if (rc == 0) { 656a9de470cSBruce Richardson ut->ss[j].crypto.ses = s; 657a9de470cSBruce Richardson return 0; 658a9de470cSBruce Richardson } else { 659a9de470cSBruce Richardson /* failure, do cleanup */ 660a9de470cSBruce Richardson rte_cryptodev_sym_session_clear(dev_id, s); 661a9de470cSBruce Richardson rte_cryptodev_sym_session_free(s); 662a9de470cSBruce Richardson return rc; 663a9de470cSBruce Richardson } 664a9de470cSBruce Richardson } 665a9de470cSBruce Richardson 666a9de470cSBruce Richardson static int 667a9de470cSBruce Richardson create_session(struct ipsec_unitest_params *ut, 668a9de470cSBruce Richardson struct rte_cryptodev_qp_conf *qp, uint8_t crypto_dev, uint32_t j) 669a9de470cSBruce Richardson { 670a9de470cSBruce Richardson if (ut->ss[j].type == RTE_SECURITY_ACTION_TYPE_NONE) 671a9de470cSBruce Richardson return create_crypto_session(ut, qp, crypto_dev, j); 672a9de470cSBruce Richardson else 673a9de470cSBruce Richardson return create_dummy_sec_session(ut, qp, j); 674a9de470cSBruce Richardson } 675a9de470cSBruce Richardson 676a9de470cSBruce Richardson static int 677a9de470cSBruce Richardson fill_ipsec_param(uint32_t replay_win_sz, uint64_t flags) 678a9de470cSBruce Richardson { 679a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 680a9de470cSBruce Richardson struct rte_ipsec_sa_prm *prm = &ut_params->sa_prm; 681a9de470cSBruce Richardson const struct supported_auth_algo *auth_algo; 682a9de470cSBruce Richardson const struct supported_cipher_algo *cipher_algo; 683a9de470cSBruce Richardson 684a9de470cSBruce Richardson memset(prm, 0, sizeof(*prm)); 685a9de470cSBruce Richardson 686a9de470cSBruce Richardson prm->userdata = 1; 687a9de470cSBruce Richardson prm->flags = flags; 688a9de470cSBruce Richardson prm->replay_win_sz = replay_win_sz; 689a9de470cSBruce Richardson 690a9de470cSBruce Richardson /* setup ipsec xform */ 691a9de470cSBruce Richardson prm->ipsec_xform = ut_params->ipsec_xform; 692a9de470cSBruce Richardson prm->ipsec_xform.salt = (uint32_t)rte_rand(); 693a9de470cSBruce Richardson 694a9de470cSBruce Richardson /* setup tunnel related fields */ 695a9de470cSBruce Richardson prm->tun.hdr_len = sizeof(ipv4_outer); 696a9de470cSBruce Richardson prm->tun.next_proto = IPPROTO_IPIP; 697a9de470cSBruce Richardson prm->tun.hdr = &ipv4_outer; 698a9de470cSBruce Richardson 699a9de470cSBruce Richardson /* setup crypto section */ 700a9de470cSBruce Richardson if (uparams.aead != 0) { 701a9de470cSBruce Richardson /* TODO: will need to fill out with other test cases */ 702a9de470cSBruce Richardson } else { 703a9de470cSBruce Richardson if (uparams.auth == 0 && uparams.cipher == 0) 704a9de470cSBruce Richardson return TEST_FAILED; 705a9de470cSBruce Richardson 706a9de470cSBruce Richardson auth_algo = find_match_auth_algo(uparams.auth_algo); 707a9de470cSBruce Richardson cipher_algo = find_match_cipher_algo(uparams.cipher_algo); 708a9de470cSBruce Richardson 709a9de470cSBruce Richardson fill_crypto_xform(ut_params, auth_algo, cipher_algo); 710a9de470cSBruce Richardson } 711a9de470cSBruce Richardson 712a9de470cSBruce Richardson prm->crypto_xform = ut_params->crypto_xforms; 713a9de470cSBruce Richardson return TEST_SUCCESS; 714a9de470cSBruce Richardson } 715a9de470cSBruce Richardson 716a9de470cSBruce Richardson static int 717a9de470cSBruce Richardson create_sa(enum rte_security_session_action_type action_type, 718a9de470cSBruce Richardson uint32_t replay_win_sz, uint64_t flags, uint32_t j) 719a9de470cSBruce Richardson { 720a9de470cSBruce Richardson struct ipsec_testsuite_params *ts = &testsuite_params; 721a9de470cSBruce Richardson struct ipsec_unitest_params *ut = &unittest_params; 722a9de470cSBruce Richardson size_t sz; 723a9de470cSBruce Richardson int rc; 724a9de470cSBruce Richardson 725a9de470cSBruce Richardson memset(&ut->ss[j], 0, sizeof(ut->ss[j])); 726a9de470cSBruce Richardson 727a9de470cSBruce Richardson rc = fill_ipsec_param(replay_win_sz, flags); 728a9de470cSBruce Richardson if (rc != 0) 729a9de470cSBruce Richardson return TEST_FAILED; 730a9de470cSBruce Richardson 731a9de470cSBruce Richardson /* create rte_ipsec_sa*/ 732a9de470cSBruce Richardson sz = rte_ipsec_sa_size(&ut->sa_prm); 733a9de470cSBruce Richardson TEST_ASSERT(sz > 0, "rte_ipsec_sa_size() failed\n"); 734a9de470cSBruce Richardson 735a9de470cSBruce Richardson ut->ss[j].sa = rte_zmalloc(NULL, sz, RTE_CACHE_LINE_SIZE); 736a9de470cSBruce Richardson TEST_ASSERT_NOT_NULL(ut->ss[j].sa, 737a9de470cSBruce Richardson "failed to allocate memory for rte_ipsec_sa\n"); 738a9de470cSBruce Richardson 739a9de470cSBruce Richardson ut->ss[j].type = action_type; 740a9de470cSBruce Richardson rc = create_session(ut, &ts->qp_conf, ts->valid_dev, j); 741a9de470cSBruce Richardson if (rc != 0) 742a9de470cSBruce Richardson return TEST_FAILED; 743a9de470cSBruce Richardson 744a9de470cSBruce Richardson rc = rte_ipsec_sa_init(ut->ss[j].sa, &ut->sa_prm, sz); 745a9de470cSBruce Richardson rc = (rc > 0 && (uint32_t)rc <= sz) ? 0 : -EINVAL; 746a9de470cSBruce Richardson if (rc == 0) 747a9de470cSBruce Richardson rc = rte_ipsec_session_prepare(&ut->ss[j]); 748a9de470cSBruce Richardson 749a9de470cSBruce Richardson return rc; 750a9de470cSBruce Richardson } 751a9de470cSBruce Richardson 752a9de470cSBruce Richardson static int 7532cb4a0d4SBernard Iremonger crypto_dequeue_burst(uint16_t num_pkts) 7542cb4a0d4SBernard Iremonger { 7552cb4a0d4SBernard Iremonger struct ipsec_testsuite_params *ts_params = &testsuite_params; 7562cb4a0d4SBernard Iremonger struct ipsec_unitest_params *ut_params = &unittest_params; 7572cb4a0d4SBernard Iremonger uint32_t pkt_cnt, k; 7582cb4a0d4SBernard Iremonger int i; 7592cb4a0d4SBernard Iremonger 7602cb4a0d4SBernard Iremonger for (i = 0, pkt_cnt = 0; 7612cb4a0d4SBernard Iremonger i < DEQUEUE_COUNT && pkt_cnt != num_pkts; i++) { 7622cb4a0d4SBernard Iremonger k = rte_cryptodev_dequeue_burst(ts_params->valid_dev, 0, 7632cb4a0d4SBernard Iremonger &ut_params->cop[pkt_cnt], num_pkts - pkt_cnt); 7642cb4a0d4SBernard Iremonger pkt_cnt += k; 7652cb4a0d4SBernard Iremonger rte_delay_us(1); 7662cb4a0d4SBernard Iremonger } 7672cb4a0d4SBernard Iremonger 7682cb4a0d4SBernard Iremonger if (pkt_cnt != num_pkts) { 7692cb4a0d4SBernard Iremonger RTE_LOG(ERR, USER1, "rte_cryptodev_dequeue_burst fail\n"); 7702cb4a0d4SBernard Iremonger return TEST_FAILED; 7712cb4a0d4SBernard Iremonger } 7722cb4a0d4SBernard Iremonger return TEST_SUCCESS; 7732cb4a0d4SBernard Iremonger } 7742cb4a0d4SBernard Iremonger 7752cb4a0d4SBernard Iremonger static int 776a9de470cSBruce Richardson crypto_ipsec(uint16_t num_pkts) 777a9de470cSBruce Richardson { 778a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 779a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 780a9de470cSBruce Richardson uint32_t k, ng; 781a9de470cSBruce Richardson struct rte_ipsec_group grp[1]; 782a9de470cSBruce Richardson 783a9de470cSBruce Richardson /* call crypto prepare */ 784a9de470cSBruce Richardson k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[0], ut_params->ibuf, 785a9de470cSBruce Richardson ut_params->cop, num_pkts); 786a9de470cSBruce Richardson if (k != num_pkts) { 787a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_prepare fail\n"); 788a9de470cSBruce Richardson return TEST_FAILED; 789a9de470cSBruce Richardson } 7902cb4a0d4SBernard Iremonger 791a9de470cSBruce Richardson k = rte_cryptodev_enqueue_burst(ts_params->valid_dev, 0, 792a9de470cSBruce Richardson ut_params->cop, num_pkts); 793a9de470cSBruce Richardson if (k != num_pkts) { 794a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_cryptodev_enqueue_burst fail\n"); 795a9de470cSBruce Richardson return TEST_FAILED; 796a9de470cSBruce Richardson } 797a9de470cSBruce Richardson 7982cb4a0d4SBernard Iremonger if (crypto_dequeue_burst(num_pkts) == TEST_FAILED) 799a9de470cSBruce Richardson return TEST_FAILED; 800a9de470cSBruce Richardson 801a9de470cSBruce Richardson ng = rte_ipsec_pkt_crypto_group( 802a9de470cSBruce Richardson (const struct rte_crypto_op **)(uintptr_t)ut_params->cop, 803a9de470cSBruce Richardson ut_params->obuf, grp, num_pkts); 804a9de470cSBruce Richardson if (ng != 1 || 805a9de470cSBruce Richardson grp[0].m[0] != ut_params->obuf[0] || 806a9de470cSBruce Richardson grp[0].cnt != num_pkts || 807a9de470cSBruce Richardson grp[0].id.ptr != &ut_params->ss[0]) { 808a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail\n"); 809a9de470cSBruce Richardson return TEST_FAILED; 810a9de470cSBruce Richardson } 811a9de470cSBruce Richardson 812a9de470cSBruce Richardson /* call crypto process */ 813a9de470cSBruce Richardson k = rte_ipsec_pkt_process(grp[0].id.ptr, grp[0].m, grp[0].cnt); 814a9de470cSBruce Richardson if (k != num_pkts) { 815a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_pkt_process fail\n"); 816a9de470cSBruce Richardson return TEST_FAILED; 817a9de470cSBruce Richardson } 818a9de470cSBruce Richardson 819a9de470cSBruce Richardson return TEST_SUCCESS; 820a9de470cSBruce Richardson } 821a9de470cSBruce Richardson 822a9de470cSBruce Richardson static int 823a9de470cSBruce Richardson lksd_proto_ipsec(uint16_t num_pkts) 824a9de470cSBruce Richardson { 825a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 826a9de470cSBruce Richardson uint32_t i, k, ng; 827a9de470cSBruce Richardson struct rte_ipsec_group grp[1]; 828a9de470cSBruce Richardson 829a9de470cSBruce Richardson /* call crypto prepare */ 830a9de470cSBruce Richardson k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[0], ut_params->ibuf, 831a9de470cSBruce Richardson ut_params->cop, num_pkts); 832a9de470cSBruce Richardson if (k != num_pkts) { 833a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_prepare fail\n"); 834a9de470cSBruce Richardson return TEST_FAILED; 835a9de470cSBruce Richardson } 836a9de470cSBruce Richardson 837a9de470cSBruce Richardson /* check crypto ops */ 838a9de470cSBruce Richardson for (i = 0; i != num_pkts; i++) { 839a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->cop[i]->type, 840a9de470cSBruce Richardson RTE_CRYPTO_OP_TYPE_SYMMETRIC, 841a9de470cSBruce Richardson "%s: invalid crypto op type for %u-th packet\n", 842a9de470cSBruce Richardson __func__, i); 843a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->cop[i]->status, 844a9de470cSBruce Richardson RTE_CRYPTO_OP_STATUS_NOT_PROCESSED, 845a9de470cSBruce Richardson "%s: invalid crypto op status for %u-th packet\n", 846a9de470cSBruce Richardson __func__, i); 847a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->cop[i]->sess_type, 848a9de470cSBruce Richardson RTE_CRYPTO_OP_SECURITY_SESSION, 849a9de470cSBruce Richardson "%s: invalid crypto op sess_type for %u-th packet\n", 850a9de470cSBruce Richardson __func__, i); 851a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->cop[i]->sym->m_src, 852a9de470cSBruce Richardson ut_params->ibuf[i], 853a9de470cSBruce Richardson "%s: invalid crypto op m_src for %u-th packet\n", 854a9de470cSBruce Richardson __func__, i); 855a9de470cSBruce Richardson } 856a9de470cSBruce Richardson 857a9de470cSBruce Richardson /* update crypto ops, pretend all finished ok */ 858a9de470cSBruce Richardson for (i = 0; i != num_pkts; i++) 859a9de470cSBruce Richardson ut_params->cop[i]->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 860a9de470cSBruce Richardson 861a9de470cSBruce Richardson ng = rte_ipsec_pkt_crypto_group( 862a9de470cSBruce Richardson (const struct rte_crypto_op **)(uintptr_t)ut_params->cop, 863a9de470cSBruce Richardson ut_params->obuf, grp, num_pkts); 864a9de470cSBruce Richardson if (ng != 1 || 865a9de470cSBruce Richardson grp[0].m[0] != ut_params->obuf[0] || 866a9de470cSBruce Richardson grp[0].cnt != num_pkts || 867a9de470cSBruce Richardson grp[0].id.ptr != &ut_params->ss[0]) { 868a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail\n"); 869a9de470cSBruce Richardson return TEST_FAILED; 870a9de470cSBruce Richardson } 871a9de470cSBruce Richardson 872a9de470cSBruce Richardson /* call crypto process */ 873a9de470cSBruce Richardson k = rte_ipsec_pkt_process(grp[0].id.ptr, grp[0].m, grp[0].cnt); 874a9de470cSBruce Richardson if (k != num_pkts) { 875a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_pkt_process fail\n"); 876a9de470cSBruce Richardson return TEST_FAILED; 877a9de470cSBruce Richardson } 878a9de470cSBruce Richardson 879a9de470cSBruce Richardson return TEST_SUCCESS; 880a9de470cSBruce Richardson } 881a9de470cSBruce Richardson 882a9de470cSBruce Richardson static int 883a9de470cSBruce Richardson crypto_ipsec_2sa(void) 884a9de470cSBruce Richardson { 885a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 886a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 887a9de470cSBruce Richardson struct rte_ipsec_group grp[BURST_SIZE]; 888a9de470cSBruce Richardson uint32_t k, ng, i, r; 889a9de470cSBruce Richardson 890a9de470cSBruce Richardson for (i = 0; i < BURST_SIZE; i++) { 891a9de470cSBruce Richardson r = i % 2; 892a9de470cSBruce Richardson /* call crypto prepare */ 893a9de470cSBruce Richardson k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[r], 894a9de470cSBruce Richardson ut_params->ibuf + i, ut_params->cop + i, 1); 895a9de470cSBruce Richardson if (k != 1) { 896a9de470cSBruce Richardson RTE_LOG(ERR, USER1, 897a9de470cSBruce Richardson "rte_ipsec_pkt_crypto_prepare fail\n"); 898a9de470cSBruce Richardson return TEST_FAILED; 899a9de470cSBruce Richardson } 900a9de470cSBruce Richardson k = rte_cryptodev_enqueue_burst(ts_params->valid_dev, 0, 901a9de470cSBruce Richardson ut_params->cop + i, 1); 902a9de470cSBruce Richardson if (k != 1) { 903a9de470cSBruce Richardson RTE_LOG(ERR, USER1, 904a9de470cSBruce Richardson "rte_cryptodev_enqueue_burst fail\n"); 905a9de470cSBruce Richardson return TEST_FAILED; 906a9de470cSBruce Richardson } 907a9de470cSBruce Richardson } 908a9de470cSBruce Richardson 9092cb4a0d4SBernard Iremonger if (crypto_dequeue_burst(BURST_SIZE) == TEST_FAILED) 910a9de470cSBruce Richardson return TEST_FAILED; 911a9de470cSBruce Richardson 912a9de470cSBruce Richardson ng = rte_ipsec_pkt_crypto_group( 913a9de470cSBruce Richardson (const struct rte_crypto_op **)(uintptr_t)ut_params->cop, 914a9de470cSBruce Richardson ut_params->obuf, grp, BURST_SIZE); 915a9de470cSBruce Richardson if (ng != BURST_SIZE) { 916a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail ng=%d\n", 917a9de470cSBruce Richardson ng); 918a9de470cSBruce Richardson return TEST_FAILED; 919a9de470cSBruce Richardson } 920a9de470cSBruce Richardson 921a9de470cSBruce Richardson /* call crypto process */ 922a9de470cSBruce Richardson for (i = 0; i < ng; i++) { 923a9de470cSBruce Richardson k = rte_ipsec_pkt_process(grp[i].id.ptr, grp[i].m, grp[i].cnt); 924a9de470cSBruce Richardson if (k != grp[i].cnt) { 925a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_pkt_process fail\n"); 926a9de470cSBruce Richardson return TEST_FAILED; 927a9de470cSBruce Richardson } 928a9de470cSBruce Richardson } 929a9de470cSBruce Richardson return TEST_SUCCESS; 930a9de470cSBruce Richardson } 931a9de470cSBruce Richardson 932a9de470cSBruce Richardson #define PKT_4 4 933a9de470cSBruce Richardson #define PKT_12 12 934a9de470cSBruce Richardson #define PKT_21 21 935a9de470cSBruce Richardson 936a9de470cSBruce Richardson static uint32_t 937a9de470cSBruce Richardson crypto_ipsec_4grp(uint32_t pkt_num) 938a9de470cSBruce Richardson { 939a9de470cSBruce Richardson uint32_t sa_ind; 940a9de470cSBruce Richardson 941a9de470cSBruce Richardson /* group packets in 4 different size groups groups, 2 per SA */ 942a9de470cSBruce Richardson if (pkt_num < PKT_4) 943a9de470cSBruce Richardson sa_ind = 0; 944a9de470cSBruce Richardson else if (pkt_num < PKT_12) 945a9de470cSBruce Richardson sa_ind = 1; 946a9de470cSBruce Richardson else if (pkt_num < PKT_21) 947a9de470cSBruce Richardson sa_ind = 0; 948a9de470cSBruce Richardson else 949a9de470cSBruce Richardson sa_ind = 1; 950a9de470cSBruce Richardson 951a9de470cSBruce Richardson return sa_ind; 952a9de470cSBruce Richardson } 953a9de470cSBruce Richardson 954a9de470cSBruce Richardson static uint32_t 955a9de470cSBruce Richardson crypto_ipsec_4grp_check_mbufs(uint32_t grp_ind, struct rte_ipsec_group *grp) 956a9de470cSBruce Richardson { 957a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 958a9de470cSBruce Richardson uint32_t i, j; 959a9de470cSBruce Richardson uint32_t rc = 0; 960a9de470cSBruce Richardson 961a9de470cSBruce Richardson if (grp_ind == 0) { 962a9de470cSBruce Richardson for (i = 0, j = 0; i < PKT_4; i++, j++) 963a9de470cSBruce Richardson if (grp[grp_ind].m[i] != ut_params->obuf[j]) { 964a9de470cSBruce Richardson rc = TEST_FAILED; 965a9de470cSBruce Richardson break; 966a9de470cSBruce Richardson } 967a9de470cSBruce Richardson } else if (grp_ind == 1) { 968a9de470cSBruce Richardson for (i = 0, j = PKT_4; i < (PKT_12 - PKT_4); i++, j++) { 969a9de470cSBruce Richardson if (grp[grp_ind].m[i] != ut_params->obuf[j]) { 970a9de470cSBruce Richardson rc = TEST_FAILED; 971a9de470cSBruce Richardson break; 972a9de470cSBruce Richardson } 973a9de470cSBruce Richardson } 974a9de470cSBruce Richardson } else if (grp_ind == 2) { 975a9de470cSBruce Richardson for (i = 0, j = PKT_12; i < (PKT_21 - PKT_12); i++, j++) 976a9de470cSBruce Richardson if (grp[grp_ind].m[i] != ut_params->obuf[j]) { 977a9de470cSBruce Richardson rc = TEST_FAILED; 978a9de470cSBruce Richardson break; 979a9de470cSBruce Richardson } 980a9de470cSBruce Richardson } else if (grp_ind == 3) { 981a9de470cSBruce Richardson for (i = 0, j = PKT_21; i < (BURST_SIZE - PKT_21); i++, j++) 982a9de470cSBruce Richardson if (grp[grp_ind].m[i] != ut_params->obuf[j]) { 983a9de470cSBruce Richardson rc = TEST_FAILED; 984a9de470cSBruce Richardson break; 985a9de470cSBruce Richardson } 986a9de470cSBruce Richardson } else 987a9de470cSBruce Richardson rc = TEST_FAILED; 988a9de470cSBruce Richardson 989a9de470cSBruce Richardson return rc; 990a9de470cSBruce Richardson } 991a9de470cSBruce Richardson 992a9de470cSBruce Richardson static uint32_t 993a9de470cSBruce Richardson crypto_ipsec_4grp_check_cnt(uint32_t grp_ind, struct rte_ipsec_group *grp) 994a9de470cSBruce Richardson { 995a9de470cSBruce Richardson uint32_t rc = 0; 996a9de470cSBruce Richardson 997a9de470cSBruce Richardson if (grp_ind == 0) { 998a9de470cSBruce Richardson if (grp[grp_ind].cnt != PKT_4) 999a9de470cSBruce Richardson rc = TEST_FAILED; 1000a9de470cSBruce Richardson } else if (grp_ind == 1) { 1001a9de470cSBruce Richardson if (grp[grp_ind].cnt != PKT_12 - PKT_4) 1002a9de470cSBruce Richardson rc = TEST_FAILED; 1003a9de470cSBruce Richardson } else if (grp_ind == 2) { 1004a9de470cSBruce Richardson if (grp[grp_ind].cnt != PKT_21 - PKT_12) 1005a9de470cSBruce Richardson rc = TEST_FAILED; 1006a9de470cSBruce Richardson } else if (grp_ind == 3) { 1007a9de470cSBruce Richardson if (grp[grp_ind].cnt != BURST_SIZE - PKT_21) 1008a9de470cSBruce Richardson rc = TEST_FAILED; 1009a9de470cSBruce Richardson } else 1010a9de470cSBruce Richardson rc = TEST_FAILED; 1011a9de470cSBruce Richardson 1012a9de470cSBruce Richardson return rc; 1013a9de470cSBruce Richardson } 1014a9de470cSBruce Richardson 1015a9de470cSBruce Richardson static int 1016a9de470cSBruce Richardson crypto_ipsec_2sa_4grp(void) 1017a9de470cSBruce Richardson { 1018a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 1019a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1020a9de470cSBruce Richardson struct rte_ipsec_group grp[BURST_SIZE]; 1021a9de470cSBruce Richardson uint32_t k, ng, i, j; 1022a9de470cSBruce Richardson uint32_t rc = 0; 1023a9de470cSBruce Richardson 1024a9de470cSBruce Richardson for (i = 0; i < BURST_SIZE; i++) { 1025a9de470cSBruce Richardson j = crypto_ipsec_4grp(i); 1026a9de470cSBruce Richardson 1027a9de470cSBruce Richardson /* call crypto prepare */ 1028a9de470cSBruce Richardson k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[j], 1029a9de470cSBruce Richardson ut_params->ibuf + i, ut_params->cop + i, 1); 1030a9de470cSBruce Richardson if (k != 1) { 1031a9de470cSBruce Richardson RTE_LOG(ERR, USER1, 1032a9de470cSBruce Richardson "rte_ipsec_pkt_crypto_prepare fail\n"); 1033a9de470cSBruce Richardson return TEST_FAILED; 1034a9de470cSBruce Richardson } 1035a9de470cSBruce Richardson k = rte_cryptodev_enqueue_burst(ts_params->valid_dev, 0, 1036a9de470cSBruce Richardson ut_params->cop + i, 1); 1037a9de470cSBruce Richardson if (k != 1) { 1038a9de470cSBruce Richardson RTE_LOG(ERR, USER1, 1039a9de470cSBruce Richardson "rte_cryptodev_enqueue_burst fail\n"); 1040a9de470cSBruce Richardson return TEST_FAILED; 1041a9de470cSBruce Richardson } 1042a9de470cSBruce Richardson } 1043a9de470cSBruce Richardson 10442cb4a0d4SBernard Iremonger if (crypto_dequeue_burst(BURST_SIZE) == TEST_FAILED) 1045a9de470cSBruce Richardson return TEST_FAILED; 1046a9de470cSBruce Richardson 1047a9de470cSBruce Richardson ng = rte_ipsec_pkt_crypto_group( 1048a9de470cSBruce Richardson (const struct rte_crypto_op **)(uintptr_t)ut_params->cop, 1049a9de470cSBruce Richardson ut_params->obuf, grp, BURST_SIZE); 1050a9de470cSBruce Richardson if (ng != 4) { 1051a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail ng=%d\n", 1052a9de470cSBruce Richardson ng); 1053a9de470cSBruce Richardson return TEST_FAILED; 1054a9de470cSBruce Richardson } 1055a9de470cSBruce Richardson 1056a9de470cSBruce Richardson /* call crypto process */ 1057a9de470cSBruce Richardson for (i = 0; i < ng; i++) { 1058a9de470cSBruce Richardson k = rte_ipsec_pkt_process(grp[i].id.ptr, grp[i].m, grp[i].cnt); 1059a9de470cSBruce Richardson if (k != grp[i].cnt) { 1060a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_pkt_process fail\n"); 1061a9de470cSBruce Richardson return TEST_FAILED; 1062a9de470cSBruce Richardson } 1063a9de470cSBruce Richardson rc = crypto_ipsec_4grp_check_cnt(i, grp); 1064a9de470cSBruce Richardson if (rc != 0) { 1065a9de470cSBruce Richardson RTE_LOG(ERR, USER1, 1066a9de470cSBruce Richardson "crypto_ipsec_4grp_check_cnt fail\n"); 1067a9de470cSBruce Richardson return TEST_FAILED; 1068a9de470cSBruce Richardson } 1069a9de470cSBruce Richardson rc = crypto_ipsec_4grp_check_mbufs(i, grp); 1070a9de470cSBruce Richardson if (rc != 0) { 1071a9de470cSBruce Richardson RTE_LOG(ERR, USER1, 1072a9de470cSBruce Richardson "crypto_ipsec_4grp_check_mbufs fail\n"); 1073a9de470cSBruce Richardson return TEST_FAILED; 1074a9de470cSBruce Richardson } 1075a9de470cSBruce Richardson } 1076a9de470cSBruce Richardson return TEST_SUCCESS; 1077a9de470cSBruce Richardson } 1078a9de470cSBruce Richardson 1079a9de470cSBruce Richardson static void 1080a9de470cSBruce Richardson test_ipsec_reorder_inb_pkt_burst(uint16_t num_pkts) 1081a9de470cSBruce Richardson { 1082a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1083a9de470cSBruce Richardson struct rte_mbuf *ibuf_tmp[BURST_SIZE]; 1084a9de470cSBruce Richardson uint16_t j; 1085a9de470cSBruce Richardson 1086a9de470cSBruce Richardson /* reorder packets and create gaps in sequence numbers */ 1087a9de470cSBruce Richardson static const uint32_t reorder[BURST_SIZE] = { 1088a9de470cSBruce Richardson 24, 25, 26, 27, 28, 29, 30, 31, 1089a9de470cSBruce Richardson 16, 17, 18, 19, 20, 21, 22, 23, 1090a9de470cSBruce Richardson 8, 9, 10, 11, 12, 13, 14, 15, 1091a9de470cSBruce Richardson 0, 1, 2, 3, 4, 5, 6, 7, 1092a9de470cSBruce Richardson }; 1093a9de470cSBruce Richardson 1094a9de470cSBruce Richardson if (num_pkts != BURST_SIZE) 1095a9de470cSBruce Richardson return; 1096a9de470cSBruce Richardson 1097a9de470cSBruce Richardson for (j = 0; j != BURST_SIZE; j++) 1098a9de470cSBruce Richardson ibuf_tmp[j] = ut_params->ibuf[reorder[j]]; 1099a9de470cSBruce Richardson 1100a9de470cSBruce Richardson memcpy(ut_params->ibuf, ibuf_tmp, sizeof(ut_params->ibuf)); 1101a9de470cSBruce Richardson } 1102a9de470cSBruce Richardson 1103a9de470cSBruce Richardson static int 1104a9de470cSBruce Richardson test_ipsec_crypto_op_alloc(uint16_t num_pkts) 1105a9de470cSBruce Richardson { 1106a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 1107a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1108a9de470cSBruce Richardson int rc = 0; 1109a9de470cSBruce Richardson uint16_t j; 1110a9de470cSBruce Richardson 1111a9de470cSBruce Richardson for (j = 0; j < num_pkts && rc == 0; j++) { 1112a9de470cSBruce Richardson ut_params->cop[j] = rte_crypto_op_alloc(ts_params->cop_mpool, 1113a9de470cSBruce Richardson RTE_CRYPTO_OP_TYPE_SYMMETRIC); 1114a9de470cSBruce Richardson if (ut_params->cop[j] == NULL) { 1115a9de470cSBruce Richardson RTE_LOG(ERR, USER1, 1116a9de470cSBruce Richardson "Failed to allocate symmetric crypto op\n"); 1117a9de470cSBruce Richardson rc = TEST_FAILED; 1118a9de470cSBruce Richardson } 1119a9de470cSBruce Richardson } 1120a9de470cSBruce Richardson 1121a9de470cSBruce Richardson return rc; 1122a9de470cSBruce Richardson } 1123a9de470cSBruce Richardson 1124a9de470cSBruce Richardson static void 1125a9de470cSBruce Richardson test_ipsec_dump_buffers(struct ipsec_unitest_params *ut_params, int i) 1126a9de470cSBruce Richardson { 1127a9de470cSBruce Richardson uint16_t j = ut_params->pkt_index; 1128a9de470cSBruce Richardson 1129a9de470cSBruce Richardson printf("\ntest config: num %d\n", i); 1130a9de470cSBruce Richardson printf(" replay_win_sz %u\n", test_cfg[i].replay_win_sz); 1131a9de470cSBruce Richardson printf(" esn %u\n", test_cfg[i].esn); 1132a9de470cSBruce Richardson printf(" flags 0x%" PRIx64 "\n", test_cfg[i].flags); 1133a9de470cSBruce Richardson printf(" pkt_sz %zu\n", test_cfg[i].pkt_sz); 1134a9de470cSBruce Richardson printf(" num_pkts %u\n\n", test_cfg[i].num_pkts); 1135a9de470cSBruce Richardson 1136a9de470cSBruce Richardson if (ut_params->ibuf[j]) { 1137a9de470cSBruce Richardson printf("ibuf[%u] data:\n", j); 1138a9de470cSBruce Richardson rte_pktmbuf_dump(stdout, ut_params->ibuf[j], 1139a9de470cSBruce Richardson ut_params->ibuf[j]->data_len); 1140a9de470cSBruce Richardson } 1141a9de470cSBruce Richardson if (ut_params->obuf[j]) { 1142a9de470cSBruce Richardson printf("obuf[%u] data:\n", j); 1143a9de470cSBruce Richardson rte_pktmbuf_dump(stdout, ut_params->obuf[j], 1144a9de470cSBruce Richardson ut_params->obuf[j]->data_len); 1145a9de470cSBruce Richardson } 1146a9de470cSBruce Richardson if (ut_params->testbuf[j]) { 1147a9de470cSBruce Richardson printf("testbuf[%u] data:\n", j); 1148a9de470cSBruce Richardson rte_pktmbuf_dump(stdout, ut_params->testbuf[j], 1149a9de470cSBruce Richardson ut_params->testbuf[j]->data_len); 1150a9de470cSBruce Richardson } 1151a9de470cSBruce Richardson } 1152a9de470cSBruce Richardson 1153a9de470cSBruce Richardson static void 1154a9de470cSBruce Richardson destroy_sa(uint32_t j) 1155a9de470cSBruce Richardson { 1156a9de470cSBruce Richardson struct ipsec_unitest_params *ut = &unittest_params; 1157a9de470cSBruce Richardson 1158a9de470cSBruce Richardson rte_ipsec_sa_fini(ut->ss[j].sa); 1159a9de470cSBruce Richardson rte_free(ut->ss[j].sa); 1160a9de470cSBruce Richardson rte_cryptodev_sym_session_free(ut->ss[j].crypto.ses); 1161a9de470cSBruce Richardson memset(&ut->ss[j], 0, sizeof(ut->ss[j])); 1162a9de470cSBruce Richardson } 1163a9de470cSBruce Richardson 1164a9de470cSBruce Richardson static int 1165a9de470cSBruce Richardson crypto_inb_burst_null_null_check(struct ipsec_unitest_params *ut_params, int i, 1166a9de470cSBruce Richardson uint16_t num_pkts) 1167a9de470cSBruce Richardson { 1168a9de470cSBruce Richardson uint16_t j; 1169a9de470cSBruce Richardson 1170a9de470cSBruce Richardson for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) { 1171a9de470cSBruce Richardson ut_params->pkt_index = j; 1172a9de470cSBruce Richardson 1173a9de470cSBruce Richardson /* compare the data buffers */ 1174a9de470cSBruce Richardson TEST_ASSERT_BUFFERS_ARE_EQUAL(null_plain_data, 1175a9de470cSBruce Richardson rte_pktmbuf_mtod(ut_params->obuf[j], void *), 1176a9de470cSBruce Richardson test_cfg[i].pkt_sz, 1177a9de470cSBruce Richardson "input and output data does not match\n"); 1178a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len, 1179a9de470cSBruce Richardson ut_params->obuf[j]->pkt_len, 1180a9de470cSBruce Richardson "data_len is not equal to pkt_len"); 1181a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len, 1182a9de470cSBruce Richardson test_cfg[i].pkt_sz, 1183a9de470cSBruce Richardson "data_len is not equal to input data"); 1184a9de470cSBruce Richardson } 1185a9de470cSBruce Richardson 1186a9de470cSBruce Richardson return 0; 1187a9de470cSBruce Richardson } 1188a9de470cSBruce Richardson 1189a9de470cSBruce Richardson static int 1190a9de470cSBruce Richardson test_ipsec_crypto_inb_burst_null_null(int i) 1191a9de470cSBruce Richardson { 1192a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 1193a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1194a9de470cSBruce Richardson uint16_t num_pkts = test_cfg[i].num_pkts; 1195a9de470cSBruce Richardson uint16_t j; 1196a9de470cSBruce Richardson int rc; 1197a9de470cSBruce Richardson 1198a9de470cSBruce Richardson /* create rte_ipsec_sa */ 1199a9de470cSBruce Richardson rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE, 1200a9de470cSBruce Richardson test_cfg[i].replay_win_sz, test_cfg[i].flags, 0); 1201a9de470cSBruce Richardson if (rc != 0) { 1202a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_sa_init failed, cfg %d\n", 1203a9de470cSBruce Richardson i); 1204a9de470cSBruce Richardson return TEST_FAILED; 1205a9de470cSBruce Richardson } 1206a9de470cSBruce Richardson 1207a9de470cSBruce Richardson /* Generate test mbuf data */ 1208a9de470cSBruce Richardson for (j = 0; j < num_pkts && rc == 0; j++) { 1209a9de470cSBruce Richardson /* packet with sequence number 0 is invalid */ 1210a9de470cSBruce Richardson ut_params->ibuf[j] = setup_test_string_tunneled( 1211a9de470cSBruce Richardson ts_params->mbuf_pool, null_encrypted_data, 1212a9de470cSBruce Richardson test_cfg[i].pkt_sz, INBOUND_SPI, j + 1); 1213a9de470cSBruce Richardson if (ut_params->ibuf[j] == NULL) 1214a9de470cSBruce Richardson rc = TEST_FAILED; 1215a9de470cSBruce Richardson } 1216a9de470cSBruce Richardson 1217a9de470cSBruce Richardson if (rc == 0) { 1218a9de470cSBruce Richardson if (test_cfg[i].reorder_pkts) 1219a9de470cSBruce Richardson test_ipsec_reorder_inb_pkt_burst(num_pkts); 1220a9de470cSBruce Richardson rc = test_ipsec_crypto_op_alloc(num_pkts); 1221a9de470cSBruce Richardson } 1222a9de470cSBruce Richardson 1223a9de470cSBruce Richardson if (rc == 0) { 1224a9de470cSBruce Richardson /* call ipsec library api */ 1225a9de470cSBruce Richardson rc = crypto_ipsec(num_pkts); 1226a9de470cSBruce Richardson if (rc == 0) 1227a9de470cSBruce Richardson rc = crypto_inb_burst_null_null_check( 1228a9de470cSBruce Richardson ut_params, i, num_pkts); 1229a9de470cSBruce Richardson else { 1230a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n", 1231a9de470cSBruce Richardson i); 1232a9de470cSBruce Richardson rc = TEST_FAILED; 1233a9de470cSBruce Richardson } 1234a9de470cSBruce Richardson } 1235a9de470cSBruce Richardson 1236a9de470cSBruce Richardson if (rc == TEST_FAILED) 1237a9de470cSBruce Richardson test_ipsec_dump_buffers(ut_params, i); 1238a9de470cSBruce Richardson 1239a9de470cSBruce Richardson destroy_sa(0); 1240a9de470cSBruce Richardson return rc; 1241a9de470cSBruce Richardson } 1242a9de470cSBruce Richardson 1243a9de470cSBruce Richardson static int 1244a9de470cSBruce Richardson test_ipsec_crypto_inb_burst_null_null_wrapper(void) 1245a9de470cSBruce Richardson { 1246a9de470cSBruce Richardson int i; 1247a9de470cSBruce Richardson int rc = 0; 1248a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1249a9de470cSBruce Richardson 1250a9de470cSBruce Richardson ut_params->ipsec_xform.spi = INBOUND_SPI; 1251a9de470cSBruce Richardson ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS; 1252a9de470cSBruce Richardson ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP; 1253a9de470cSBruce Richardson ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL; 1254a9de470cSBruce Richardson ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4; 1255a9de470cSBruce Richardson 1256a9de470cSBruce Richardson for (i = 0; i < num_cfg && rc == 0; i++) { 1257a9de470cSBruce Richardson ut_params->ipsec_xform.options.esn = test_cfg[i].esn; 1258a9de470cSBruce Richardson rc = test_ipsec_crypto_inb_burst_null_null(i); 1259a9de470cSBruce Richardson } 1260a9de470cSBruce Richardson 1261a9de470cSBruce Richardson return rc; 1262a9de470cSBruce Richardson } 1263a9de470cSBruce Richardson 1264a9de470cSBruce Richardson static int 1265a9de470cSBruce Richardson crypto_outb_burst_null_null_check(struct ipsec_unitest_params *ut_params, 1266a9de470cSBruce Richardson uint16_t num_pkts) 1267a9de470cSBruce Richardson { 1268a9de470cSBruce Richardson void *obuf_data; 1269a9de470cSBruce Richardson void *testbuf_data; 1270a9de470cSBruce Richardson uint16_t j; 1271a9de470cSBruce Richardson 1272a9de470cSBruce Richardson for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) { 1273a9de470cSBruce Richardson ut_params->pkt_index = j; 1274a9de470cSBruce Richardson 1275a9de470cSBruce Richardson testbuf_data = rte_pktmbuf_mtod(ut_params->testbuf[j], void *); 1276a9de470cSBruce Richardson obuf_data = rte_pktmbuf_mtod(ut_params->obuf[j], void *); 1277a9de470cSBruce Richardson /* compare the buffer data */ 1278a9de470cSBruce Richardson TEST_ASSERT_BUFFERS_ARE_EQUAL(testbuf_data, obuf_data, 1279a9de470cSBruce Richardson ut_params->obuf[j]->pkt_len, 1280a9de470cSBruce Richardson "test and output data does not match\n"); 1281a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len, 1282a9de470cSBruce Richardson ut_params->testbuf[j]->data_len, 1283a9de470cSBruce Richardson "obuf data_len is not equal to testbuf data_len"); 1284a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->obuf[j]->pkt_len, 1285a9de470cSBruce Richardson ut_params->testbuf[j]->pkt_len, 1286a9de470cSBruce Richardson "obuf pkt_len is not equal to testbuf pkt_len"); 1287a9de470cSBruce Richardson } 1288a9de470cSBruce Richardson 1289a9de470cSBruce Richardson return 0; 1290a9de470cSBruce Richardson } 1291a9de470cSBruce Richardson 1292a9de470cSBruce Richardson static int 1293a9de470cSBruce Richardson test_ipsec_crypto_outb_burst_null_null(int i) 1294a9de470cSBruce Richardson { 1295a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 1296a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1297a9de470cSBruce Richardson uint16_t num_pkts = test_cfg[i].num_pkts; 1298a9de470cSBruce Richardson uint16_t j; 1299a9de470cSBruce Richardson int32_t rc; 1300a9de470cSBruce Richardson 1301a9de470cSBruce Richardson /* create rte_ipsec_sa*/ 1302a9de470cSBruce Richardson rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE, 1303a9de470cSBruce Richardson test_cfg[i].replay_win_sz, test_cfg[i].flags, 0); 1304a9de470cSBruce Richardson if (rc != 0) { 1305a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_sa_init failed, cfg %d\n", 1306a9de470cSBruce Richardson i); 1307a9de470cSBruce Richardson return TEST_FAILED; 1308a9de470cSBruce Richardson } 1309a9de470cSBruce Richardson 1310a9de470cSBruce Richardson /* Generate input mbuf data */ 1311a9de470cSBruce Richardson for (j = 0; j < num_pkts && rc == 0; j++) { 1312a9de470cSBruce Richardson ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool, 1313a9de470cSBruce Richardson null_plain_data, test_cfg[i].pkt_sz, 0); 1314a9de470cSBruce Richardson if (ut_params->ibuf[j] == NULL) 1315a9de470cSBruce Richardson rc = TEST_FAILED; 1316a9de470cSBruce Richardson else { 1317a9de470cSBruce Richardson /* Generate test mbuf data */ 1318a9de470cSBruce Richardson /* packet with sequence number 0 is invalid */ 1319a9de470cSBruce Richardson ut_params->testbuf[j] = setup_test_string_tunneled( 1320a9de470cSBruce Richardson ts_params->mbuf_pool, 1321a9de470cSBruce Richardson null_plain_data, test_cfg[i].pkt_sz, 1322a9de470cSBruce Richardson OUTBOUND_SPI, j + 1); 1323a9de470cSBruce Richardson if (ut_params->testbuf[j] == NULL) 1324a9de470cSBruce Richardson rc = TEST_FAILED; 1325a9de470cSBruce Richardson } 1326a9de470cSBruce Richardson } 1327a9de470cSBruce Richardson 1328a9de470cSBruce Richardson if (rc == 0) 1329a9de470cSBruce Richardson rc = test_ipsec_crypto_op_alloc(num_pkts); 1330a9de470cSBruce Richardson 1331a9de470cSBruce Richardson if (rc == 0) { 1332a9de470cSBruce Richardson /* call ipsec library api */ 1333a9de470cSBruce Richardson rc = crypto_ipsec(num_pkts); 1334a9de470cSBruce Richardson if (rc == 0) 1335a9de470cSBruce Richardson rc = crypto_outb_burst_null_null_check(ut_params, 1336a9de470cSBruce Richardson num_pkts); 1337a9de470cSBruce Richardson else 1338a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n", 1339a9de470cSBruce Richardson i); 1340a9de470cSBruce Richardson } 1341a9de470cSBruce Richardson 1342a9de470cSBruce Richardson if (rc == TEST_FAILED) 1343a9de470cSBruce Richardson test_ipsec_dump_buffers(ut_params, i); 1344a9de470cSBruce Richardson 1345a9de470cSBruce Richardson destroy_sa(0); 1346a9de470cSBruce Richardson return rc; 1347a9de470cSBruce Richardson } 1348a9de470cSBruce Richardson 1349a9de470cSBruce Richardson static int 1350a9de470cSBruce Richardson test_ipsec_crypto_outb_burst_null_null_wrapper(void) 1351a9de470cSBruce Richardson { 1352a9de470cSBruce Richardson int i; 1353a9de470cSBruce Richardson int rc = 0; 1354a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1355a9de470cSBruce Richardson 1356a9de470cSBruce Richardson ut_params->ipsec_xform.spi = OUTBOUND_SPI; 1357a9de470cSBruce Richardson ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS; 1358a9de470cSBruce Richardson ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP; 1359a9de470cSBruce Richardson ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL; 1360a9de470cSBruce Richardson ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4; 1361a9de470cSBruce Richardson 1362a9de470cSBruce Richardson for (i = 0; i < num_cfg && rc == 0; i++) { 1363a9de470cSBruce Richardson ut_params->ipsec_xform.options.esn = test_cfg[i].esn; 1364a9de470cSBruce Richardson rc = test_ipsec_crypto_outb_burst_null_null(i); 1365a9de470cSBruce Richardson } 1366a9de470cSBruce Richardson 1367a9de470cSBruce Richardson return rc; 1368a9de470cSBruce Richardson } 1369a9de470cSBruce Richardson 1370a9de470cSBruce Richardson static int 1371a9de470cSBruce Richardson inline_inb_burst_null_null_check(struct ipsec_unitest_params *ut_params, int i, 1372a9de470cSBruce Richardson uint16_t num_pkts) 1373a9de470cSBruce Richardson { 1374a9de470cSBruce Richardson void *ibuf_data; 1375a9de470cSBruce Richardson void *obuf_data; 1376a9de470cSBruce Richardson uint16_t j; 1377a9de470cSBruce Richardson 1378a9de470cSBruce Richardson for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) { 1379a9de470cSBruce Richardson ut_params->pkt_index = j; 1380a9de470cSBruce Richardson 1381a9de470cSBruce Richardson /* compare the buffer data */ 1382a9de470cSBruce Richardson ibuf_data = rte_pktmbuf_mtod(ut_params->ibuf[j], void *); 1383a9de470cSBruce Richardson obuf_data = rte_pktmbuf_mtod(ut_params->obuf[j], void *); 1384a9de470cSBruce Richardson 1385a9de470cSBruce Richardson TEST_ASSERT_BUFFERS_ARE_EQUAL(ibuf_data, obuf_data, 1386a9de470cSBruce Richardson ut_params->ibuf[j]->data_len, 1387a9de470cSBruce Richardson "input and output data does not match\n"); 1388a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->ibuf[j]->data_len, 1389a9de470cSBruce Richardson ut_params->obuf[j]->data_len, 1390a9de470cSBruce Richardson "ibuf data_len is not equal to obuf data_len"); 1391a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->ibuf[j]->pkt_len, 1392a9de470cSBruce Richardson ut_params->obuf[j]->pkt_len, 1393a9de470cSBruce Richardson "ibuf pkt_len is not equal to obuf pkt_len"); 1394a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->ibuf[j]->data_len, 1395a9de470cSBruce Richardson test_cfg[i].pkt_sz, 1396a9de470cSBruce Richardson "data_len is not equal input data"); 1397a9de470cSBruce Richardson } 1398a9de470cSBruce Richardson return 0; 1399a9de470cSBruce Richardson } 1400a9de470cSBruce Richardson 1401a9de470cSBruce Richardson static int 1402a9de470cSBruce Richardson test_ipsec_inline_crypto_inb_burst_null_null(int i) 1403a9de470cSBruce Richardson { 1404a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 1405a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1406a9de470cSBruce Richardson uint16_t num_pkts = test_cfg[i].num_pkts; 1407a9de470cSBruce Richardson uint16_t j; 1408a9de470cSBruce Richardson int32_t rc; 1409a9de470cSBruce Richardson uint32_t n; 1410a9de470cSBruce Richardson 1411a9de470cSBruce Richardson /* create rte_ipsec_sa*/ 1412a9de470cSBruce Richardson rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO, 1413a9de470cSBruce Richardson test_cfg[i].replay_win_sz, test_cfg[i].flags, 0); 1414a9de470cSBruce Richardson if (rc != 0) { 1415a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_sa_init failed, cfg %d\n", 1416a9de470cSBruce Richardson i); 1417a9de470cSBruce Richardson return TEST_FAILED; 1418a9de470cSBruce Richardson } 1419a9de470cSBruce Richardson 1420a9de470cSBruce Richardson /* Generate inbound mbuf data */ 1421a9de470cSBruce Richardson for (j = 0; j < num_pkts && rc == 0; j++) { 1422a9de470cSBruce Richardson ut_params->ibuf[j] = setup_test_string_tunneled( 1423a9de470cSBruce Richardson ts_params->mbuf_pool, 1424a9de470cSBruce Richardson null_plain_data, test_cfg[i].pkt_sz, 1425a9de470cSBruce Richardson INBOUND_SPI, j + 1); 1426a9de470cSBruce Richardson if (ut_params->ibuf[j] == NULL) 1427a9de470cSBruce Richardson rc = TEST_FAILED; 1428a9de470cSBruce Richardson else { 1429a9de470cSBruce Richardson /* Generate test mbuf data */ 1430a9de470cSBruce Richardson ut_params->obuf[j] = setup_test_string( 1431a9de470cSBruce Richardson ts_params->mbuf_pool, 1432a9de470cSBruce Richardson null_plain_data, test_cfg[i].pkt_sz, 0); 1433a9de470cSBruce Richardson if (ut_params->obuf[j] == NULL) 1434a9de470cSBruce Richardson rc = TEST_FAILED; 1435a9de470cSBruce Richardson } 1436a9de470cSBruce Richardson } 1437a9de470cSBruce Richardson 1438a9de470cSBruce Richardson if (rc == 0) { 1439a9de470cSBruce Richardson n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf, 1440a9de470cSBruce Richardson num_pkts); 1441a9de470cSBruce Richardson if (n == num_pkts) 1442a9de470cSBruce Richardson rc = inline_inb_burst_null_null_check(ut_params, i, 1443a9de470cSBruce Richardson num_pkts); 1444a9de470cSBruce Richardson else { 1445a9de470cSBruce Richardson RTE_LOG(ERR, USER1, 1446a9de470cSBruce Richardson "rte_ipsec_pkt_process failed, cfg %d\n", 1447a9de470cSBruce Richardson i); 1448a9de470cSBruce Richardson rc = TEST_FAILED; 1449a9de470cSBruce Richardson } 1450a9de470cSBruce Richardson } 1451a9de470cSBruce Richardson 1452a9de470cSBruce Richardson if (rc == TEST_FAILED) 1453a9de470cSBruce Richardson test_ipsec_dump_buffers(ut_params, i); 1454a9de470cSBruce Richardson 1455a9de470cSBruce Richardson destroy_sa(0); 1456a9de470cSBruce Richardson return rc; 1457a9de470cSBruce Richardson } 1458a9de470cSBruce Richardson 1459a9de470cSBruce Richardson static int 1460a9de470cSBruce Richardson test_ipsec_inline_crypto_inb_burst_null_null_wrapper(void) 1461a9de470cSBruce Richardson { 1462a9de470cSBruce Richardson int i; 1463a9de470cSBruce Richardson int rc = 0; 1464a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1465a9de470cSBruce Richardson 1466a9de470cSBruce Richardson ut_params->ipsec_xform.spi = INBOUND_SPI; 1467a9de470cSBruce Richardson ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS; 1468a9de470cSBruce Richardson ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP; 1469a9de470cSBruce Richardson ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL; 1470a9de470cSBruce Richardson ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4; 1471a9de470cSBruce Richardson 1472a9de470cSBruce Richardson for (i = 0; i < num_cfg && rc == 0; i++) { 1473a9de470cSBruce Richardson ut_params->ipsec_xform.options.esn = test_cfg[i].esn; 1474a9de470cSBruce Richardson rc = test_ipsec_inline_crypto_inb_burst_null_null(i); 1475a9de470cSBruce Richardson } 1476a9de470cSBruce Richardson 1477a9de470cSBruce Richardson return rc; 1478a9de470cSBruce Richardson } 1479a9de470cSBruce Richardson 1480a9de470cSBruce Richardson static int 1481a9de470cSBruce Richardson test_ipsec_inline_proto_inb_burst_null_null(int i) 1482a9de470cSBruce Richardson { 1483a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 1484a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1485a9de470cSBruce Richardson uint16_t num_pkts = test_cfg[i].num_pkts; 1486a9de470cSBruce Richardson uint16_t j; 1487a9de470cSBruce Richardson int32_t rc; 1488a9de470cSBruce Richardson uint32_t n; 1489a9de470cSBruce Richardson 1490a9de470cSBruce Richardson /* create rte_ipsec_sa*/ 1491a9de470cSBruce Richardson rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL, 1492a9de470cSBruce Richardson test_cfg[i].replay_win_sz, test_cfg[i].flags, 0); 1493a9de470cSBruce Richardson if (rc != 0) { 1494a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_sa_init failed, cfg %d\n", 1495a9de470cSBruce Richardson i); 1496a9de470cSBruce Richardson return TEST_FAILED; 1497a9de470cSBruce Richardson } 1498a9de470cSBruce Richardson 1499a9de470cSBruce Richardson /* Generate inbound mbuf data */ 1500a9de470cSBruce Richardson for (j = 0; j < num_pkts && rc == 0; j++) { 1501a9de470cSBruce Richardson ut_params->ibuf[j] = setup_test_string( 1502a9de470cSBruce Richardson ts_params->mbuf_pool, 1503a9de470cSBruce Richardson null_plain_data, test_cfg[i].pkt_sz, 0); 1504a9de470cSBruce Richardson if (ut_params->ibuf[j] == NULL) 1505a9de470cSBruce Richardson rc = TEST_FAILED; 1506a9de470cSBruce Richardson else { 1507a9de470cSBruce Richardson /* Generate test mbuf data */ 1508a9de470cSBruce Richardson ut_params->obuf[j] = setup_test_string( 1509a9de470cSBruce Richardson ts_params->mbuf_pool, 1510a9de470cSBruce Richardson null_plain_data, test_cfg[i].pkt_sz, 0); 1511a9de470cSBruce Richardson if (ut_params->obuf[j] == NULL) 1512a9de470cSBruce Richardson rc = TEST_FAILED; 1513a9de470cSBruce Richardson } 1514a9de470cSBruce Richardson } 1515a9de470cSBruce Richardson 1516a9de470cSBruce Richardson if (rc == 0) { 1517a9de470cSBruce Richardson n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf, 1518a9de470cSBruce Richardson num_pkts); 1519a9de470cSBruce Richardson if (n == num_pkts) 1520a9de470cSBruce Richardson rc = inline_inb_burst_null_null_check(ut_params, i, 1521a9de470cSBruce Richardson num_pkts); 1522a9de470cSBruce Richardson else { 1523a9de470cSBruce Richardson RTE_LOG(ERR, USER1, 1524a9de470cSBruce Richardson "rte_ipsec_pkt_process failed, cfg %d\n", 1525a9de470cSBruce Richardson i); 1526a9de470cSBruce Richardson rc = TEST_FAILED; 1527a9de470cSBruce Richardson } 1528a9de470cSBruce Richardson } 1529a9de470cSBruce Richardson 1530a9de470cSBruce Richardson if (rc == TEST_FAILED) 1531a9de470cSBruce Richardson test_ipsec_dump_buffers(ut_params, i); 1532a9de470cSBruce Richardson 1533a9de470cSBruce Richardson destroy_sa(0); 1534a9de470cSBruce Richardson return rc; 1535a9de470cSBruce Richardson } 1536a9de470cSBruce Richardson 1537a9de470cSBruce Richardson static int 1538a9de470cSBruce Richardson test_ipsec_inline_proto_inb_burst_null_null_wrapper(void) 1539a9de470cSBruce Richardson { 1540a9de470cSBruce Richardson int i; 1541a9de470cSBruce Richardson int rc = 0; 1542a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1543a9de470cSBruce Richardson 1544a9de470cSBruce Richardson ut_params->ipsec_xform.spi = INBOUND_SPI; 1545a9de470cSBruce Richardson ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS; 1546a9de470cSBruce Richardson ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP; 1547a9de470cSBruce Richardson ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL; 1548a9de470cSBruce Richardson ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4; 1549a9de470cSBruce Richardson 1550a9de470cSBruce Richardson for (i = 0; i < num_cfg && rc == 0; i++) { 1551a9de470cSBruce Richardson ut_params->ipsec_xform.options.esn = test_cfg[i].esn; 1552a9de470cSBruce Richardson rc = test_ipsec_inline_proto_inb_burst_null_null(i); 1553a9de470cSBruce Richardson } 1554a9de470cSBruce Richardson 1555a9de470cSBruce Richardson return rc; 1556a9de470cSBruce Richardson } 1557a9de470cSBruce Richardson 1558a9de470cSBruce Richardson static int 1559a9de470cSBruce Richardson inline_outb_burst_null_null_check(struct ipsec_unitest_params *ut_params, 1560a9de470cSBruce Richardson uint16_t num_pkts) 1561a9de470cSBruce Richardson { 1562a9de470cSBruce Richardson void *obuf_data; 1563a9de470cSBruce Richardson void *ibuf_data; 1564a9de470cSBruce Richardson uint16_t j; 1565a9de470cSBruce Richardson 1566a9de470cSBruce Richardson for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) { 1567a9de470cSBruce Richardson ut_params->pkt_index = j; 1568a9de470cSBruce Richardson 1569a9de470cSBruce Richardson /* compare the buffer data */ 1570a9de470cSBruce Richardson ibuf_data = rte_pktmbuf_mtod(ut_params->ibuf[j], void *); 1571a9de470cSBruce Richardson obuf_data = rte_pktmbuf_mtod(ut_params->obuf[j], void *); 1572a9de470cSBruce Richardson TEST_ASSERT_BUFFERS_ARE_EQUAL(ibuf_data, obuf_data, 1573a9de470cSBruce Richardson ut_params->ibuf[j]->data_len, 1574a9de470cSBruce Richardson "input and output data does not match\n"); 1575a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->ibuf[j]->data_len, 1576a9de470cSBruce Richardson ut_params->obuf[j]->data_len, 1577a9de470cSBruce Richardson "ibuf data_len is not equal to obuf data_len"); 1578a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->ibuf[j]->pkt_len, 1579a9de470cSBruce Richardson ut_params->obuf[j]->pkt_len, 1580a9de470cSBruce Richardson "ibuf pkt_len is not equal to obuf pkt_len"); 1581a9de470cSBruce Richardson 1582a9de470cSBruce Richardson /* check mbuf ol_flags */ 1583a9de470cSBruce Richardson TEST_ASSERT(ut_params->ibuf[j]->ol_flags & PKT_TX_SEC_OFFLOAD, 1584a9de470cSBruce Richardson "ibuf PKT_TX_SEC_OFFLOAD is not set"); 1585a9de470cSBruce Richardson } 1586a9de470cSBruce Richardson return 0; 1587a9de470cSBruce Richardson } 1588a9de470cSBruce Richardson 1589a9de470cSBruce Richardson static int 1590a9de470cSBruce Richardson test_ipsec_inline_crypto_outb_burst_null_null(int i) 1591a9de470cSBruce Richardson { 1592a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 1593a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1594a9de470cSBruce Richardson uint16_t num_pkts = test_cfg[i].num_pkts; 1595a9de470cSBruce Richardson uint16_t j; 1596a9de470cSBruce Richardson int32_t rc; 1597a9de470cSBruce Richardson uint32_t n; 1598a9de470cSBruce Richardson 1599a9de470cSBruce Richardson /* create rte_ipsec_sa */ 1600a9de470cSBruce Richardson rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO, 1601a9de470cSBruce Richardson test_cfg[i].replay_win_sz, test_cfg[i].flags, 0); 1602a9de470cSBruce Richardson if (rc != 0) { 1603a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_sa_init failed, cfg %d\n", 1604a9de470cSBruce Richardson i); 1605a9de470cSBruce Richardson return TEST_FAILED; 1606a9de470cSBruce Richardson } 1607a9de470cSBruce Richardson 1608a9de470cSBruce Richardson /* Generate test mbuf data */ 1609a9de470cSBruce Richardson for (j = 0; j < num_pkts && rc == 0; j++) { 1610a9de470cSBruce Richardson ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool, 1611a9de470cSBruce Richardson null_plain_data, test_cfg[i].pkt_sz, 0); 1612a9de470cSBruce Richardson if (ut_params->ibuf[0] == NULL) 1613a9de470cSBruce Richardson rc = TEST_FAILED; 1614a9de470cSBruce Richardson 1615a9de470cSBruce Richardson if (rc == 0) { 1616a9de470cSBruce Richardson /* Generate test tunneled mbuf data for comparison */ 1617a9de470cSBruce Richardson ut_params->obuf[j] = setup_test_string_tunneled( 1618a9de470cSBruce Richardson ts_params->mbuf_pool, 1619a9de470cSBruce Richardson null_plain_data, test_cfg[i].pkt_sz, 1620a9de470cSBruce Richardson OUTBOUND_SPI, j + 1); 1621a9de470cSBruce Richardson if (ut_params->obuf[j] == NULL) 1622a9de470cSBruce Richardson rc = TEST_FAILED; 1623a9de470cSBruce Richardson } 1624a9de470cSBruce Richardson } 1625a9de470cSBruce Richardson 1626a9de470cSBruce Richardson if (rc == 0) { 1627a9de470cSBruce Richardson n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf, 1628a9de470cSBruce Richardson num_pkts); 1629a9de470cSBruce Richardson if (n == num_pkts) 1630a9de470cSBruce Richardson rc = inline_outb_burst_null_null_check(ut_params, 1631a9de470cSBruce Richardson num_pkts); 1632a9de470cSBruce Richardson else { 1633a9de470cSBruce Richardson RTE_LOG(ERR, USER1, 1634a9de470cSBruce Richardson "rte_ipsec_pkt_process failed, cfg %d\n", 1635a9de470cSBruce Richardson i); 1636a9de470cSBruce Richardson rc = TEST_FAILED; 1637a9de470cSBruce Richardson } 1638a9de470cSBruce Richardson } 1639a9de470cSBruce Richardson 1640a9de470cSBruce Richardson if (rc == TEST_FAILED) 1641a9de470cSBruce Richardson test_ipsec_dump_buffers(ut_params, i); 1642a9de470cSBruce Richardson 1643a9de470cSBruce Richardson destroy_sa(0); 1644a9de470cSBruce Richardson return rc; 1645a9de470cSBruce Richardson } 1646a9de470cSBruce Richardson 1647a9de470cSBruce Richardson static int 1648a9de470cSBruce Richardson test_ipsec_inline_crypto_outb_burst_null_null_wrapper(void) 1649a9de470cSBruce Richardson { 1650a9de470cSBruce Richardson int i; 1651a9de470cSBruce Richardson int rc = 0; 1652a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1653a9de470cSBruce Richardson 1654a9de470cSBruce Richardson ut_params->ipsec_xform.spi = OUTBOUND_SPI; 1655a9de470cSBruce Richardson ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS; 1656a9de470cSBruce Richardson ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP; 1657a9de470cSBruce Richardson ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL; 1658a9de470cSBruce Richardson ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4; 1659a9de470cSBruce Richardson 1660a9de470cSBruce Richardson for (i = 0; i < num_cfg && rc == 0; i++) { 1661a9de470cSBruce Richardson ut_params->ipsec_xform.options.esn = test_cfg[i].esn; 1662a9de470cSBruce Richardson rc = test_ipsec_inline_crypto_outb_burst_null_null(i); 1663a9de470cSBruce Richardson } 1664a9de470cSBruce Richardson 1665a9de470cSBruce Richardson return rc; 1666a9de470cSBruce Richardson } 1667a9de470cSBruce Richardson 1668a9de470cSBruce Richardson static int 1669a9de470cSBruce Richardson test_ipsec_inline_proto_outb_burst_null_null(int i) 1670a9de470cSBruce Richardson { 1671a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 1672a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1673a9de470cSBruce Richardson uint16_t num_pkts = test_cfg[i].num_pkts; 1674a9de470cSBruce Richardson uint16_t j; 1675a9de470cSBruce Richardson int32_t rc; 1676a9de470cSBruce Richardson uint32_t n; 1677a9de470cSBruce Richardson 1678a9de470cSBruce Richardson /* create rte_ipsec_sa */ 1679a9de470cSBruce Richardson rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL, 1680a9de470cSBruce Richardson test_cfg[i].replay_win_sz, test_cfg[i].flags, 0); 1681a9de470cSBruce Richardson if (rc != 0) { 1682a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_sa_init failed, cfg %d\n", 1683a9de470cSBruce Richardson i); 1684a9de470cSBruce Richardson return TEST_FAILED; 1685a9de470cSBruce Richardson } 1686a9de470cSBruce Richardson 1687a9de470cSBruce Richardson /* Generate test mbuf data */ 1688a9de470cSBruce Richardson for (j = 0; j < num_pkts && rc == 0; j++) { 1689a9de470cSBruce Richardson ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool, 1690a9de470cSBruce Richardson null_plain_data, test_cfg[i].pkt_sz, 0); 1691a9de470cSBruce Richardson if (ut_params->ibuf[0] == NULL) 1692a9de470cSBruce Richardson rc = TEST_FAILED; 1693a9de470cSBruce Richardson 1694a9de470cSBruce Richardson if (rc == 0) { 1695a9de470cSBruce Richardson /* Generate test tunneled mbuf data for comparison */ 1696a9de470cSBruce Richardson ut_params->obuf[j] = setup_test_string( 1697a9de470cSBruce Richardson ts_params->mbuf_pool, 1698a9de470cSBruce Richardson null_plain_data, test_cfg[i].pkt_sz, 0); 1699a9de470cSBruce Richardson if (ut_params->obuf[j] == NULL) 1700a9de470cSBruce Richardson rc = TEST_FAILED; 1701a9de470cSBruce Richardson } 1702a9de470cSBruce Richardson } 1703a9de470cSBruce Richardson 1704a9de470cSBruce Richardson if (rc == 0) { 1705a9de470cSBruce Richardson n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf, 1706a9de470cSBruce Richardson num_pkts); 1707a9de470cSBruce Richardson if (n == num_pkts) 1708a9de470cSBruce Richardson rc = inline_outb_burst_null_null_check(ut_params, 1709a9de470cSBruce Richardson num_pkts); 1710a9de470cSBruce Richardson else { 1711a9de470cSBruce Richardson RTE_LOG(ERR, USER1, 1712a9de470cSBruce Richardson "rte_ipsec_pkt_process failed, cfg %d\n", 1713a9de470cSBruce Richardson i); 1714a9de470cSBruce Richardson rc = TEST_FAILED; 1715a9de470cSBruce Richardson } 1716a9de470cSBruce Richardson } 1717a9de470cSBruce Richardson 1718a9de470cSBruce Richardson if (rc == TEST_FAILED) 1719a9de470cSBruce Richardson test_ipsec_dump_buffers(ut_params, i); 1720a9de470cSBruce Richardson 1721a9de470cSBruce Richardson destroy_sa(0); 1722a9de470cSBruce Richardson return rc; 1723a9de470cSBruce Richardson } 1724a9de470cSBruce Richardson 1725a9de470cSBruce Richardson static int 1726a9de470cSBruce Richardson test_ipsec_inline_proto_outb_burst_null_null_wrapper(void) 1727a9de470cSBruce Richardson { 1728a9de470cSBruce Richardson int i; 1729a9de470cSBruce Richardson int rc = 0; 1730a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1731a9de470cSBruce Richardson 1732a9de470cSBruce Richardson ut_params->ipsec_xform.spi = OUTBOUND_SPI; 1733a9de470cSBruce Richardson ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS; 1734a9de470cSBruce Richardson ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP; 1735a9de470cSBruce Richardson ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL; 1736a9de470cSBruce Richardson ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4; 1737a9de470cSBruce Richardson 1738a9de470cSBruce Richardson for (i = 0; i < num_cfg && rc == 0; i++) { 1739a9de470cSBruce Richardson ut_params->ipsec_xform.options.esn = test_cfg[i].esn; 1740a9de470cSBruce Richardson rc = test_ipsec_inline_proto_outb_burst_null_null(i); 1741a9de470cSBruce Richardson } 1742a9de470cSBruce Richardson 1743a9de470cSBruce Richardson return rc; 1744a9de470cSBruce Richardson } 1745a9de470cSBruce Richardson 1746a9de470cSBruce Richardson static int 1747a9de470cSBruce Richardson test_ipsec_lksd_proto_inb_burst_null_null(int i) 1748a9de470cSBruce Richardson { 1749a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 1750a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1751a9de470cSBruce Richardson uint16_t num_pkts = test_cfg[i].num_pkts; 1752a9de470cSBruce Richardson uint16_t j; 1753a9de470cSBruce Richardson int rc; 1754a9de470cSBruce Richardson 1755a9de470cSBruce Richardson /* create rte_ipsec_sa */ 1756a9de470cSBruce Richardson rc = create_sa(RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, 1757a9de470cSBruce Richardson test_cfg[i].replay_win_sz, test_cfg[i].flags, 0); 1758a9de470cSBruce Richardson if (rc != 0) { 1759a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_sa_init failed, cfg %d\n", 1760a9de470cSBruce Richardson i); 1761a9de470cSBruce Richardson return TEST_FAILED; 1762a9de470cSBruce Richardson } 1763a9de470cSBruce Richardson 1764a9de470cSBruce Richardson /* Generate test mbuf data */ 1765a9de470cSBruce Richardson for (j = 0; j < num_pkts && rc == 0; j++) { 1766a9de470cSBruce Richardson /* packet with sequence number 0 is invalid */ 1767a9de470cSBruce Richardson ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool, 1768a9de470cSBruce Richardson null_encrypted_data, test_cfg[i].pkt_sz, 0); 1769a9de470cSBruce Richardson if (ut_params->ibuf[j] == NULL) 1770a9de470cSBruce Richardson rc = TEST_FAILED; 1771a9de470cSBruce Richardson } 1772a9de470cSBruce Richardson 1773a9de470cSBruce Richardson if (rc == 0) { 1774a9de470cSBruce Richardson if (test_cfg[i].reorder_pkts) 1775a9de470cSBruce Richardson test_ipsec_reorder_inb_pkt_burst(num_pkts); 1776a9de470cSBruce Richardson rc = test_ipsec_crypto_op_alloc(num_pkts); 1777a9de470cSBruce Richardson } 1778a9de470cSBruce Richardson 1779a9de470cSBruce Richardson if (rc == 0) { 1780a9de470cSBruce Richardson /* call ipsec library api */ 1781a9de470cSBruce Richardson rc = lksd_proto_ipsec(num_pkts); 1782a9de470cSBruce Richardson if (rc == 0) 1783a9de470cSBruce Richardson rc = crypto_inb_burst_null_null_check(ut_params, i, 1784a9de470cSBruce Richardson num_pkts); 1785a9de470cSBruce Richardson else { 1786a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "%s failed, cfg %d\n", 1787a9de470cSBruce Richardson __func__, i); 1788a9de470cSBruce Richardson rc = TEST_FAILED; 1789a9de470cSBruce Richardson } 1790a9de470cSBruce Richardson } 1791a9de470cSBruce Richardson 1792a9de470cSBruce Richardson if (rc == TEST_FAILED) 1793a9de470cSBruce Richardson test_ipsec_dump_buffers(ut_params, i); 1794a9de470cSBruce Richardson 1795a9de470cSBruce Richardson destroy_sa(0); 1796a9de470cSBruce Richardson return rc; 1797a9de470cSBruce Richardson } 1798a9de470cSBruce Richardson 1799a9de470cSBruce Richardson static int 1800a9de470cSBruce Richardson test_ipsec_lksd_proto_inb_burst_null_null_wrapper(void) 1801a9de470cSBruce Richardson { 1802a9de470cSBruce Richardson int i; 1803a9de470cSBruce Richardson int rc = 0; 1804a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1805a9de470cSBruce Richardson 1806a9de470cSBruce Richardson ut_params->ipsec_xform.spi = INBOUND_SPI; 1807a9de470cSBruce Richardson ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS; 1808a9de470cSBruce Richardson ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP; 1809a9de470cSBruce Richardson ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL; 1810a9de470cSBruce Richardson ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4; 1811a9de470cSBruce Richardson 1812a9de470cSBruce Richardson for (i = 0; i < num_cfg && rc == 0; i++) { 1813a9de470cSBruce Richardson ut_params->ipsec_xform.options.esn = test_cfg[i].esn; 1814a9de470cSBruce Richardson rc = test_ipsec_lksd_proto_inb_burst_null_null(i); 1815a9de470cSBruce Richardson } 1816a9de470cSBruce Richardson 1817a9de470cSBruce Richardson return rc; 1818a9de470cSBruce Richardson } 1819a9de470cSBruce Richardson 1820a9de470cSBruce Richardson static int 1821a9de470cSBruce Richardson test_ipsec_lksd_proto_outb_burst_null_null_wrapper(void) 1822a9de470cSBruce Richardson { 1823a9de470cSBruce Richardson int i; 1824a9de470cSBruce Richardson int rc = 0; 1825a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1826a9de470cSBruce Richardson 1827a9de470cSBruce Richardson ut_params->ipsec_xform.spi = INBOUND_SPI; 1828a9de470cSBruce Richardson ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS; 1829a9de470cSBruce Richardson ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP; 1830a9de470cSBruce Richardson ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL; 1831a9de470cSBruce Richardson ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4; 1832a9de470cSBruce Richardson 1833a9de470cSBruce Richardson for (i = 0; i < num_cfg && rc == 0; i++) { 1834a9de470cSBruce Richardson ut_params->ipsec_xform.options.esn = test_cfg[i].esn; 1835a9de470cSBruce Richardson rc = test_ipsec_lksd_proto_inb_burst_null_null(i); 1836a9de470cSBruce Richardson } 1837a9de470cSBruce Richardson 1838a9de470cSBruce Richardson return rc; 1839a9de470cSBruce Richardson } 1840a9de470cSBruce Richardson 1841a9de470cSBruce Richardson static int 1842a9de470cSBruce Richardson replay_inb_null_null_check(struct ipsec_unitest_params *ut_params, int i, 1843a9de470cSBruce Richardson int num_pkts) 1844a9de470cSBruce Richardson { 1845a9de470cSBruce Richardson uint16_t j; 1846a9de470cSBruce Richardson 1847a9de470cSBruce Richardson for (j = 0; j < num_pkts; j++) { 1848a9de470cSBruce Richardson /* compare the buffer data */ 1849a9de470cSBruce Richardson TEST_ASSERT_BUFFERS_ARE_EQUAL(null_plain_data, 1850a9de470cSBruce Richardson rte_pktmbuf_mtod(ut_params->obuf[j], void *), 1851a9de470cSBruce Richardson test_cfg[i].pkt_sz, 1852a9de470cSBruce Richardson "input and output data does not match\n"); 1853a9de470cSBruce Richardson 1854a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len, 1855a9de470cSBruce Richardson ut_params->obuf[j]->pkt_len, 1856a9de470cSBruce Richardson "data_len is not equal to pkt_len"); 1857a9de470cSBruce Richardson } 1858a9de470cSBruce Richardson 1859a9de470cSBruce Richardson return 0; 1860a9de470cSBruce Richardson } 1861a9de470cSBruce Richardson 1862a9de470cSBruce Richardson static int 1863a9de470cSBruce Richardson test_ipsec_replay_inb_inside_null_null(int i) 1864a9de470cSBruce Richardson { 1865a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 1866a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1867a9de470cSBruce Richardson int rc; 1868a9de470cSBruce Richardson 1869a9de470cSBruce Richardson /* create rte_ipsec_sa*/ 1870a9de470cSBruce Richardson rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE, 1871a9de470cSBruce Richardson test_cfg[i].replay_win_sz, test_cfg[i].flags, 0); 1872a9de470cSBruce Richardson if (rc != 0) { 1873a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_sa_init failed, cfg %d\n", 1874a9de470cSBruce Richardson i); 1875a9de470cSBruce Richardson return TEST_FAILED; 1876a9de470cSBruce Richardson } 1877a9de470cSBruce Richardson 1878a9de470cSBruce Richardson /* Generate inbound mbuf data */ 1879a9de470cSBruce Richardson ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool, 1880a9de470cSBruce Richardson null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI, 1); 1881a9de470cSBruce Richardson if (ut_params->ibuf[0] == NULL) 1882a9de470cSBruce Richardson rc = TEST_FAILED; 1883a9de470cSBruce Richardson else 1884a9de470cSBruce Richardson rc = test_ipsec_crypto_op_alloc(1); 1885a9de470cSBruce Richardson 1886a9de470cSBruce Richardson if (rc == 0) { 1887a9de470cSBruce Richardson /* call ipsec library api */ 1888a9de470cSBruce Richardson rc = crypto_ipsec(1); 1889a9de470cSBruce Richardson if (rc == 0) 1890a9de470cSBruce Richardson rc = replay_inb_null_null_check(ut_params, i, 1); 1891a9de470cSBruce Richardson else { 1892a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n", 1893a9de470cSBruce Richardson i); 1894a9de470cSBruce Richardson rc = TEST_FAILED; 1895a9de470cSBruce Richardson } 1896a9de470cSBruce Richardson } 1897a9de470cSBruce Richardson 1898a9de470cSBruce Richardson if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) { 1899a9de470cSBruce Richardson /* generate packet with seq number inside the replay window */ 1900a9de470cSBruce Richardson if (ut_params->ibuf[0]) { 1901a9de470cSBruce Richardson rte_pktmbuf_free(ut_params->ibuf[0]); 1902a9de470cSBruce Richardson ut_params->ibuf[0] = 0; 1903a9de470cSBruce Richardson } 1904a9de470cSBruce Richardson 1905a9de470cSBruce Richardson ut_params->ibuf[0] = setup_test_string_tunneled( 1906a9de470cSBruce Richardson ts_params->mbuf_pool, null_encrypted_data, 1907a9de470cSBruce Richardson test_cfg[i].pkt_sz, INBOUND_SPI, 1908a9de470cSBruce Richardson test_cfg[i].replay_win_sz); 1909a9de470cSBruce Richardson if (ut_params->ibuf[0] == NULL) 1910a9de470cSBruce Richardson rc = TEST_FAILED; 1911a9de470cSBruce Richardson else 1912a9de470cSBruce Richardson rc = test_ipsec_crypto_op_alloc(1); 1913a9de470cSBruce Richardson 1914a9de470cSBruce Richardson if (rc == 0) { 1915a9de470cSBruce Richardson /* call ipsec library api */ 1916a9de470cSBruce Richardson rc = crypto_ipsec(1); 1917a9de470cSBruce Richardson if (rc == 0) 1918a9de470cSBruce Richardson rc = replay_inb_null_null_check( 1919a9de470cSBruce Richardson ut_params, i, 1); 1920a9de470cSBruce Richardson else { 1921a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "crypto_ipsec failed\n"); 1922a9de470cSBruce Richardson rc = TEST_FAILED; 1923a9de470cSBruce Richardson } 1924a9de470cSBruce Richardson } 1925a9de470cSBruce Richardson } 1926a9de470cSBruce Richardson 1927a9de470cSBruce Richardson if (rc == TEST_FAILED) 1928a9de470cSBruce Richardson test_ipsec_dump_buffers(ut_params, i); 1929a9de470cSBruce Richardson 1930a9de470cSBruce Richardson destroy_sa(0); 1931a9de470cSBruce Richardson 1932a9de470cSBruce Richardson return rc; 1933a9de470cSBruce Richardson } 1934a9de470cSBruce Richardson 1935a9de470cSBruce Richardson static int 1936a9de470cSBruce Richardson test_ipsec_replay_inb_inside_null_null_wrapper(void) 1937a9de470cSBruce Richardson { 1938a9de470cSBruce Richardson int i; 1939a9de470cSBruce Richardson int rc = 0; 1940a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1941a9de470cSBruce Richardson 1942a9de470cSBruce Richardson ut_params->ipsec_xform.spi = INBOUND_SPI; 1943a9de470cSBruce Richardson ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS; 1944a9de470cSBruce Richardson ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP; 1945a9de470cSBruce Richardson ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL; 1946a9de470cSBruce Richardson ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4; 1947a9de470cSBruce Richardson 1948a9de470cSBruce Richardson for (i = 0; i < num_cfg && rc == 0; i++) { 1949a9de470cSBruce Richardson ut_params->ipsec_xform.options.esn = test_cfg[i].esn; 1950a9de470cSBruce Richardson rc = test_ipsec_replay_inb_inside_null_null(i); 1951a9de470cSBruce Richardson } 1952a9de470cSBruce Richardson 1953a9de470cSBruce Richardson return rc; 1954a9de470cSBruce Richardson } 1955a9de470cSBruce Richardson 1956a9de470cSBruce Richardson static int 1957a9de470cSBruce Richardson test_ipsec_replay_inb_outside_null_null(int i) 1958a9de470cSBruce Richardson { 1959a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 1960a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 1961a9de470cSBruce Richardson int rc; 1962a9de470cSBruce Richardson 1963a9de470cSBruce Richardson /* create rte_ipsec_sa */ 1964a9de470cSBruce Richardson rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE, 1965a9de470cSBruce Richardson test_cfg[i].replay_win_sz, test_cfg[i].flags, 0); 1966a9de470cSBruce Richardson if (rc != 0) { 1967a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_sa_init failed, cfg %d\n", 1968a9de470cSBruce Richardson i); 1969a9de470cSBruce Richardson return TEST_FAILED; 1970a9de470cSBruce Richardson } 1971a9de470cSBruce Richardson 1972a9de470cSBruce Richardson /* Generate test mbuf data */ 1973a9de470cSBruce Richardson ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool, 1974a9de470cSBruce Richardson null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI, 1975a9de470cSBruce Richardson test_cfg[i].replay_win_sz + 2); 1976a9de470cSBruce Richardson if (ut_params->ibuf[0] == NULL) 1977a9de470cSBruce Richardson rc = TEST_FAILED; 1978a9de470cSBruce Richardson else 1979a9de470cSBruce Richardson rc = test_ipsec_crypto_op_alloc(1); 1980a9de470cSBruce Richardson 1981a9de470cSBruce Richardson if (rc == 0) { 1982a9de470cSBruce Richardson /* call ipsec library api */ 1983a9de470cSBruce Richardson rc = crypto_ipsec(1); 1984a9de470cSBruce Richardson if (rc == 0) 1985a9de470cSBruce Richardson rc = replay_inb_null_null_check(ut_params, i, 1); 1986a9de470cSBruce Richardson else { 1987a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n", 1988a9de470cSBruce Richardson i); 1989a9de470cSBruce Richardson rc = TEST_FAILED; 1990a9de470cSBruce Richardson } 1991a9de470cSBruce Richardson } 1992a9de470cSBruce Richardson 1993a9de470cSBruce Richardson if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) { 1994a9de470cSBruce Richardson /* generate packet with seq number outside the replay window */ 1995a9de470cSBruce Richardson if (ut_params->ibuf[0]) { 1996a9de470cSBruce Richardson rte_pktmbuf_free(ut_params->ibuf[0]); 1997a9de470cSBruce Richardson ut_params->ibuf[0] = 0; 1998a9de470cSBruce Richardson } 1999a9de470cSBruce Richardson ut_params->ibuf[0] = setup_test_string_tunneled( 2000a9de470cSBruce Richardson ts_params->mbuf_pool, null_encrypted_data, 2001a9de470cSBruce Richardson test_cfg[i].pkt_sz, INBOUND_SPI, 1); 2002a9de470cSBruce Richardson if (ut_params->ibuf[0] == NULL) 2003a9de470cSBruce Richardson rc = TEST_FAILED; 2004a9de470cSBruce Richardson else 2005a9de470cSBruce Richardson rc = test_ipsec_crypto_op_alloc(1); 2006a9de470cSBruce Richardson 2007a9de470cSBruce Richardson if (rc == 0) { 2008a9de470cSBruce Richardson /* call ipsec library api */ 2009a9de470cSBruce Richardson rc = crypto_ipsec(1); 2010a9de470cSBruce Richardson if (rc == 0) { 2011a9de470cSBruce Richardson if (test_cfg[i].esn == 0) { 2012a9de470cSBruce Richardson RTE_LOG(ERR, USER1, 2013a9de470cSBruce Richardson "packet is not outside the replay window, cfg %d pkt0_seq %u pkt1_seq %u\n", 2014a9de470cSBruce Richardson i, 2015a9de470cSBruce Richardson test_cfg[i].replay_win_sz + 2, 2016a9de470cSBruce Richardson 1); 2017a9de470cSBruce Richardson rc = TEST_FAILED; 2018a9de470cSBruce Richardson } 2019a9de470cSBruce Richardson } else { 2020a9de470cSBruce Richardson RTE_LOG(ERR, USER1, 2021a9de470cSBruce Richardson "packet is outside the replay window, cfg %d pkt0_seq %u pkt1_seq %u\n", 2022a9de470cSBruce Richardson i, test_cfg[i].replay_win_sz + 2, 1); 2023a9de470cSBruce Richardson rc = 0; 2024a9de470cSBruce Richardson } 2025a9de470cSBruce Richardson } 2026a9de470cSBruce Richardson } 2027a9de470cSBruce Richardson 2028a9de470cSBruce Richardson if (rc == TEST_FAILED) 2029a9de470cSBruce Richardson test_ipsec_dump_buffers(ut_params, i); 2030a9de470cSBruce Richardson 2031a9de470cSBruce Richardson destroy_sa(0); 2032a9de470cSBruce Richardson 2033a9de470cSBruce Richardson return rc; 2034a9de470cSBruce Richardson } 2035a9de470cSBruce Richardson 2036a9de470cSBruce Richardson static int 2037a9de470cSBruce Richardson test_ipsec_replay_inb_outside_null_null_wrapper(void) 2038a9de470cSBruce Richardson { 2039a9de470cSBruce Richardson int i; 2040a9de470cSBruce Richardson int rc = 0; 2041a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 2042a9de470cSBruce Richardson 2043a9de470cSBruce Richardson ut_params->ipsec_xform.spi = INBOUND_SPI; 2044a9de470cSBruce Richardson ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS; 2045a9de470cSBruce Richardson ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP; 2046a9de470cSBruce Richardson ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL; 2047a9de470cSBruce Richardson ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4; 2048a9de470cSBruce Richardson 2049a9de470cSBruce Richardson for (i = 0; i < num_cfg && rc == 0; i++) { 2050a9de470cSBruce Richardson ut_params->ipsec_xform.options.esn = test_cfg[i].esn; 2051a9de470cSBruce Richardson rc = test_ipsec_replay_inb_outside_null_null(i); 2052a9de470cSBruce Richardson } 2053a9de470cSBruce Richardson 2054a9de470cSBruce Richardson return rc; 2055a9de470cSBruce Richardson } 2056a9de470cSBruce Richardson 2057a9de470cSBruce Richardson static int 2058a9de470cSBruce Richardson test_ipsec_replay_inb_repeat_null_null(int i) 2059a9de470cSBruce Richardson { 2060a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 2061a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 2062a9de470cSBruce Richardson int rc; 2063a9de470cSBruce Richardson 2064a9de470cSBruce Richardson /* create rte_ipsec_sa */ 2065a9de470cSBruce Richardson rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE, 2066a9de470cSBruce Richardson test_cfg[i].replay_win_sz, test_cfg[i].flags, 0); 2067a9de470cSBruce Richardson if (rc != 0) { 2068a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_sa_init failed, cfg %d\n", i); 2069a9de470cSBruce Richardson return TEST_FAILED; 2070a9de470cSBruce Richardson } 2071a9de470cSBruce Richardson 2072a9de470cSBruce Richardson /* Generate test mbuf data */ 2073a9de470cSBruce Richardson ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool, 2074a9de470cSBruce Richardson null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI, 1); 2075a9de470cSBruce Richardson if (ut_params->ibuf[0] == NULL) 2076a9de470cSBruce Richardson rc = TEST_FAILED; 2077a9de470cSBruce Richardson else 2078a9de470cSBruce Richardson rc = test_ipsec_crypto_op_alloc(1); 2079a9de470cSBruce Richardson 2080a9de470cSBruce Richardson if (rc == 0) { 2081a9de470cSBruce Richardson /* call ipsec library api */ 2082a9de470cSBruce Richardson rc = crypto_ipsec(1); 2083a9de470cSBruce Richardson if (rc == 0) 2084a9de470cSBruce Richardson rc = replay_inb_null_null_check(ut_params, i, 1); 2085a9de470cSBruce Richardson else { 2086a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n", 2087a9de470cSBruce Richardson i); 2088a9de470cSBruce Richardson rc = TEST_FAILED; 2089a9de470cSBruce Richardson } 2090a9de470cSBruce Richardson } 2091a9de470cSBruce Richardson 2092a9de470cSBruce Richardson if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) { 2093a9de470cSBruce Richardson /* 2094a9de470cSBruce Richardson * generate packet with repeat seq number in the replay 2095a9de470cSBruce Richardson * window 2096a9de470cSBruce Richardson */ 2097a9de470cSBruce Richardson if (ut_params->ibuf[0]) { 2098a9de470cSBruce Richardson rte_pktmbuf_free(ut_params->ibuf[0]); 2099a9de470cSBruce Richardson ut_params->ibuf[0] = 0; 2100a9de470cSBruce Richardson } 2101a9de470cSBruce Richardson 2102a9de470cSBruce Richardson ut_params->ibuf[0] = setup_test_string_tunneled( 2103a9de470cSBruce Richardson ts_params->mbuf_pool, null_encrypted_data, 2104a9de470cSBruce Richardson test_cfg[i].pkt_sz, INBOUND_SPI, 1); 2105a9de470cSBruce Richardson if (ut_params->ibuf[0] == NULL) 2106a9de470cSBruce Richardson rc = TEST_FAILED; 2107a9de470cSBruce Richardson else 2108a9de470cSBruce Richardson rc = test_ipsec_crypto_op_alloc(1); 2109a9de470cSBruce Richardson 2110a9de470cSBruce Richardson if (rc == 0) { 2111a9de470cSBruce Richardson /* call ipsec library api */ 2112a9de470cSBruce Richardson rc = crypto_ipsec(1); 2113a9de470cSBruce Richardson if (rc == 0) { 2114a9de470cSBruce Richardson RTE_LOG(ERR, USER1, 2115a9de470cSBruce Richardson "packet is not repeated in the replay window, cfg %d seq %u\n", 2116a9de470cSBruce Richardson i, 1); 2117a9de470cSBruce Richardson rc = TEST_FAILED; 2118a9de470cSBruce Richardson } else { 2119a9de470cSBruce Richardson RTE_LOG(ERR, USER1, 2120a9de470cSBruce Richardson "packet is repeated in the replay window, cfg %d seq %u\n", 2121a9de470cSBruce Richardson i, 1); 2122a9de470cSBruce Richardson rc = 0; 2123a9de470cSBruce Richardson } 2124a9de470cSBruce Richardson } 2125a9de470cSBruce Richardson } 2126a9de470cSBruce Richardson 2127a9de470cSBruce Richardson if (rc == TEST_FAILED) 2128a9de470cSBruce Richardson test_ipsec_dump_buffers(ut_params, i); 2129a9de470cSBruce Richardson 2130a9de470cSBruce Richardson destroy_sa(0); 2131a9de470cSBruce Richardson 2132a9de470cSBruce Richardson return rc; 2133a9de470cSBruce Richardson } 2134a9de470cSBruce Richardson 2135a9de470cSBruce Richardson static int 2136a9de470cSBruce Richardson test_ipsec_replay_inb_repeat_null_null_wrapper(void) 2137a9de470cSBruce Richardson { 2138a9de470cSBruce Richardson int i; 2139a9de470cSBruce Richardson int rc = 0; 2140a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 2141a9de470cSBruce Richardson 2142a9de470cSBruce Richardson ut_params->ipsec_xform.spi = INBOUND_SPI; 2143a9de470cSBruce Richardson ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS; 2144a9de470cSBruce Richardson ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP; 2145a9de470cSBruce Richardson ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL; 2146a9de470cSBruce Richardson ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4; 2147a9de470cSBruce Richardson 2148a9de470cSBruce Richardson for (i = 0; i < num_cfg && rc == 0; i++) { 2149a9de470cSBruce Richardson ut_params->ipsec_xform.options.esn = test_cfg[i].esn; 2150a9de470cSBruce Richardson rc = test_ipsec_replay_inb_repeat_null_null(i); 2151a9de470cSBruce Richardson } 2152a9de470cSBruce Richardson 2153a9de470cSBruce Richardson return rc; 2154a9de470cSBruce Richardson } 2155a9de470cSBruce Richardson 2156a9de470cSBruce Richardson static int 2157a9de470cSBruce Richardson test_ipsec_replay_inb_inside_burst_null_null(int i) 2158a9de470cSBruce Richardson { 2159a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 2160a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 2161a9de470cSBruce Richardson uint16_t num_pkts = test_cfg[i].num_pkts; 2162a9de470cSBruce Richardson int rc; 2163a9de470cSBruce Richardson int j; 2164a9de470cSBruce Richardson 2165a9de470cSBruce Richardson /* create rte_ipsec_sa*/ 2166a9de470cSBruce Richardson rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE, 2167a9de470cSBruce Richardson test_cfg[i].replay_win_sz, test_cfg[i].flags, 0); 2168a9de470cSBruce Richardson if (rc != 0) { 2169a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_sa_init failed, cfg %d\n", 2170a9de470cSBruce Richardson i); 2171a9de470cSBruce Richardson return TEST_FAILED; 2172a9de470cSBruce Richardson } 2173a9de470cSBruce Richardson 2174a9de470cSBruce Richardson /* Generate inbound mbuf data */ 2175a9de470cSBruce Richardson ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool, 2176a9de470cSBruce Richardson null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI, 1); 2177a9de470cSBruce Richardson if (ut_params->ibuf[0] == NULL) 2178a9de470cSBruce Richardson rc = TEST_FAILED; 2179a9de470cSBruce Richardson else 2180a9de470cSBruce Richardson rc = test_ipsec_crypto_op_alloc(1); 2181a9de470cSBruce Richardson 2182a9de470cSBruce Richardson if (rc == 0) { 2183a9de470cSBruce Richardson /* call ipsec library api */ 2184a9de470cSBruce Richardson rc = crypto_ipsec(1); 2185a9de470cSBruce Richardson if (rc == 0) 2186a9de470cSBruce Richardson rc = replay_inb_null_null_check(ut_params, i, 1); 2187a9de470cSBruce Richardson else { 2188a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n", 2189a9de470cSBruce Richardson i); 2190a9de470cSBruce Richardson rc = TEST_FAILED; 2191a9de470cSBruce Richardson } 2192a9de470cSBruce Richardson } 2193a9de470cSBruce Richardson 2194a9de470cSBruce Richardson if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) { 2195a9de470cSBruce Richardson /* 2196a9de470cSBruce Richardson * generate packet(s) with seq number(s) inside the 2197a9de470cSBruce Richardson * replay window 2198a9de470cSBruce Richardson */ 2199a9de470cSBruce Richardson if (ut_params->ibuf[0]) { 2200a9de470cSBruce Richardson rte_pktmbuf_free(ut_params->ibuf[0]); 2201a9de470cSBruce Richardson ut_params->ibuf[0] = 0; 2202a9de470cSBruce Richardson } 2203a9de470cSBruce Richardson 2204a9de470cSBruce Richardson for (j = 0; j < num_pkts && rc == 0; j++) { 2205a9de470cSBruce Richardson /* packet with sequence number 1 already processed */ 2206a9de470cSBruce Richardson ut_params->ibuf[j] = setup_test_string_tunneled( 2207a9de470cSBruce Richardson ts_params->mbuf_pool, null_encrypted_data, 2208a9de470cSBruce Richardson test_cfg[i].pkt_sz, INBOUND_SPI, j + 2); 2209a9de470cSBruce Richardson if (ut_params->ibuf[j] == NULL) 2210a9de470cSBruce Richardson rc = TEST_FAILED; 2211a9de470cSBruce Richardson } 2212a9de470cSBruce Richardson 2213a9de470cSBruce Richardson if (rc == 0) { 2214a9de470cSBruce Richardson if (test_cfg[i].reorder_pkts) 2215a9de470cSBruce Richardson test_ipsec_reorder_inb_pkt_burst(num_pkts); 2216a9de470cSBruce Richardson rc = test_ipsec_crypto_op_alloc(num_pkts); 2217a9de470cSBruce Richardson } 2218a9de470cSBruce Richardson 2219a9de470cSBruce Richardson if (rc == 0) { 2220a9de470cSBruce Richardson /* call ipsec library api */ 2221a9de470cSBruce Richardson rc = crypto_ipsec(num_pkts); 2222a9de470cSBruce Richardson if (rc == 0) 2223a9de470cSBruce Richardson rc = replay_inb_null_null_check( 2224a9de470cSBruce Richardson ut_params, i, num_pkts); 2225a9de470cSBruce Richardson else { 2226a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "crypto_ipsec failed\n"); 2227a9de470cSBruce Richardson rc = TEST_FAILED; 2228a9de470cSBruce Richardson } 2229a9de470cSBruce Richardson } 2230a9de470cSBruce Richardson } 2231a9de470cSBruce Richardson 2232a9de470cSBruce Richardson if (rc == TEST_FAILED) 2233a9de470cSBruce Richardson test_ipsec_dump_buffers(ut_params, i); 2234a9de470cSBruce Richardson 2235a9de470cSBruce Richardson destroy_sa(0); 2236a9de470cSBruce Richardson 2237a9de470cSBruce Richardson return rc; 2238a9de470cSBruce Richardson } 2239a9de470cSBruce Richardson 2240a9de470cSBruce Richardson static int 2241a9de470cSBruce Richardson test_ipsec_replay_inb_inside_burst_null_null_wrapper(void) 2242a9de470cSBruce Richardson { 2243a9de470cSBruce Richardson int i; 2244a9de470cSBruce Richardson int rc = 0; 2245a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 2246a9de470cSBruce Richardson 2247a9de470cSBruce Richardson ut_params->ipsec_xform.spi = INBOUND_SPI; 2248a9de470cSBruce Richardson ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS; 2249a9de470cSBruce Richardson ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP; 2250a9de470cSBruce Richardson ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL; 2251a9de470cSBruce Richardson ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4; 2252a9de470cSBruce Richardson 2253a9de470cSBruce Richardson for (i = 0; i < num_cfg && rc == 0; i++) { 2254a9de470cSBruce Richardson ut_params->ipsec_xform.options.esn = test_cfg[i].esn; 2255a9de470cSBruce Richardson rc = test_ipsec_replay_inb_inside_burst_null_null(i); 2256a9de470cSBruce Richardson } 2257a9de470cSBruce Richardson 2258a9de470cSBruce Richardson return rc; 2259a9de470cSBruce Richardson } 2260a9de470cSBruce Richardson 2261a9de470cSBruce Richardson 2262a9de470cSBruce Richardson static int 2263a9de470cSBruce Richardson crypto_inb_burst_2sa_null_null_check(struct ipsec_unitest_params *ut_params, 2264a9de470cSBruce Richardson int i) 2265a9de470cSBruce Richardson { 2266a9de470cSBruce Richardson uint16_t j; 2267a9de470cSBruce Richardson 2268a9de470cSBruce Richardson for (j = 0; j < BURST_SIZE; j++) { 2269a9de470cSBruce Richardson ut_params->pkt_index = j; 2270a9de470cSBruce Richardson 2271a9de470cSBruce Richardson /* compare the data buffers */ 2272a9de470cSBruce Richardson TEST_ASSERT_BUFFERS_ARE_EQUAL(null_plain_data, 2273a9de470cSBruce Richardson rte_pktmbuf_mtod(ut_params->obuf[j], void *), 2274a9de470cSBruce Richardson test_cfg[i].pkt_sz, 2275a9de470cSBruce Richardson "input and output data does not match\n"); 2276a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len, 2277a9de470cSBruce Richardson ut_params->obuf[j]->pkt_len, 2278a9de470cSBruce Richardson "data_len is not equal to pkt_len"); 2279a9de470cSBruce Richardson TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len, 2280a9de470cSBruce Richardson test_cfg[i].pkt_sz, 2281a9de470cSBruce Richardson "data_len is not equal to input data"); 2282a9de470cSBruce Richardson } 2283a9de470cSBruce Richardson 2284a9de470cSBruce Richardson return 0; 2285a9de470cSBruce Richardson } 2286a9de470cSBruce Richardson 2287a9de470cSBruce Richardson static int 2288a9de470cSBruce Richardson test_ipsec_crypto_inb_burst_2sa_null_null(int i) 2289a9de470cSBruce Richardson { 2290a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 2291a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 2292a9de470cSBruce Richardson uint16_t num_pkts = test_cfg[i].num_pkts; 2293a9de470cSBruce Richardson uint16_t j, r; 2294a9de470cSBruce Richardson int rc = 0; 2295a9de470cSBruce Richardson 2296a9de470cSBruce Richardson if (num_pkts != BURST_SIZE) 2297a9de470cSBruce Richardson return rc; 2298a9de470cSBruce Richardson 2299a9de470cSBruce Richardson /* create rte_ipsec_sa */ 2300a9de470cSBruce Richardson rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE, 2301a9de470cSBruce Richardson test_cfg[i].replay_win_sz, test_cfg[i].flags, 0); 2302a9de470cSBruce Richardson if (rc != 0) { 2303a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_sa_init failed, cfg %d\n", 2304a9de470cSBruce Richardson i); 2305a9de470cSBruce Richardson return TEST_FAILED; 2306a9de470cSBruce Richardson } 2307a9de470cSBruce Richardson 2308a9de470cSBruce Richardson /* create second rte_ipsec_sa */ 2309a9de470cSBruce Richardson ut_params->ipsec_xform.spi = INBOUND_SPI + 1; 2310a9de470cSBruce Richardson rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE, 2311a9de470cSBruce Richardson test_cfg[i].replay_win_sz, test_cfg[i].flags, 1); 2312a9de470cSBruce Richardson if (rc != 0) { 2313a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_sa_init failed, cfg %d\n", 2314a9de470cSBruce Richardson i); 2315a9de470cSBruce Richardson destroy_sa(0); 2316a9de470cSBruce Richardson return TEST_FAILED; 2317a9de470cSBruce Richardson } 2318a9de470cSBruce Richardson 2319a9de470cSBruce Richardson /* Generate test mbuf data */ 2320a9de470cSBruce Richardson for (j = 0; j < num_pkts && rc == 0; j++) { 2321a9de470cSBruce Richardson r = j % 2; 2322a9de470cSBruce Richardson /* packet with sequence number 0 is invalid */ 2323a9de470cSBruce Richardson ut_params->ibuf[j] = setup_test_string_tunneled( 2324a9de470cSBruce Richardson ts_params->mbuf_pool, null_encrypted_data, 2325a9de470cSBruce Richardson test_cfg[i].pkt_sz, INBOUND_SPI + r, j + 1); 2326a9de470cSBruce Richardson if (ut_params->ibuf[j] == NULL) 2327a9de470cSBruce Richardson rc = TEST_FAILED; 2328a9de470cSBruce Richardson } 2329a9de470cSBruce Richardson 2330a9de470cSBruce Richardson if (rc == 0) 2331a9de470cSBruce Richardson rc = test_ipsec_crypto_op_alloc(num_pkts); 2332a9de470cSBruce Richardson 2333a9de470cSBruce Richardson if (rc == 0) { 2334a9de470cSBruce Richardson /* call ipsec library api */ 2335a9de470cSBruce Richardson rc = crypto_ipsec_2sa(); 2336a9de470cSBruce Richardson if (rc == 0) 2337a9de470cSBruce Richardson rc = crypto_inb_burst_2sa_null_null_check( 2338a9de470cSBruce Richardson ut_params, i); 2339a9de470cSBruce Richardson else { 2340a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n", 2341a9de470cSBruce Richardson i); 2342a9de470cSBruce Richardson rc = TEST_FAILED; 2343a9de470cSBruce Richardson } 2344a9de470cSBruce Richardson } 2345a9de470cSBruce Richardson 2346a9de470cSBruce Richardson if (rc == TEST_FAILED) 2347a9de470cSBruce Richardson test_ipsec_dump_buffers(ut_params, i); 2348a9de470cSBruce Richardson 2349a9de470cSBruce Richardson destroy_sa(0); 2350a9de470cSBruce Richardson destroy_sa(1); 2351a9de470cSBruce Richardson return rc; 2352a9de470cSBruce Richardson } 2353a9de470cSBruce Richardson 2354a9de470cSBruce Richardson static int 2355a9de470cSBruce Richardson test_ipsec_crypto_inb_burst_2sa_null_null_wrapper(void) 2356a9de470cSBruce Richardson { 2357a9de470cSBruce Richardson int i; 2358a9de470cSBruce Richardson int rc = 0; 2359a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 2360a9de470cSBruce Richardson 2361a9de470cSBruce Richardson ut_params->ipsec_xform.spi = INBOUND_SPI; 2362a9de470cSBruce Richardson ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS; 2363a9de470cSBruce Richardson ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP; 2364a9de470cSBruce Richardson ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL; 2365a9de470cSBruce Richardson ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4; 2366a9de470cSBruce Richardson 2367a9de470cSBruce Richardson for (i = 0; i < num_cfg && rc == 0; i++) { 2368a9de470cSBruce Richardson ut_params->ipsec_xform.options.esn = test_cfg[i].esn; 2369a9de470cSBruce Richardson rc = test_ipsec_crypto_inb_burst_2sa_null_null(i); 2370a9de470cSBruce Richardson } 2371a9de470cSBruce Richardson 2372a9de470cSBruce Richardson return rc; 2373a9de470cSBruce Richardson } 2374a9de470cSBruce Richardson 2375a9de470cSBruce Richardson static int 2376a9de470cSBruce Richardson test_ipsec_crypto_inb_burst_2sa_4grp_null_null(int i) 2377a9de470cSBruce Richardson { 2378a9de470cSBruce Richardson struct ipsec_testsuite_params *ts_params = &testsuite_params; 2379a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 2380a9de470cSBruce Richardson uint16_t num_pkts = test_cfg[i].num_pkts; 2381a9de470cSBruce Richardson uint16_t j, k; 2382a9de470cSBruce Richardson int rc = 0; 2383a9de470cSBruce Richardson 2384a9de470cSBruce Richardson if (num_pkts != BURST_SIZE) 2385a9de470cSBruce Richardson return rc; 2386a9de470cSBruce Richardson 2387a9de470cSBruce Richardson /* create rte_ipsec_sa */ 2388a9de470cSBruce Richardson rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE, 2389a9de470cSBruce Richardson test_cfg[i].replay_win_sz, test_cfg[i].flags, 0); 2390a9de470cSBruce Richardson if (rc != 0) { 2391a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_sa_init failed, cfg %d\n", 2392a9de470cSBruce Richardson i); 2393a9de470cSBruce Richardson return TEST_FAILED; 2394a9de470cSBruce Richardson } 2395a9de470cSBruce Richardson 2396a9de470cSBruce Richardson /* create second rte_ipsec_sa */ 2397a9de470cSBruce Richardson ut_params->ipsec_xform.spi = INBOUND_SPI + 1; 2398a9de470cSBruce Richardson rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE, 2399a9de470cSBruce Richardson test_cfg[i].replay_win_sz, test_cfg[i].flags, 1); 2400a9de470cSBruce Richardson if (rc != 0) { 2401a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "rte_ipsec_sa_init failed, cfg %d\n", 2402a9de470cSBruce Richardson i); 2403a9de470cSBruce Richardson destroy_sa(0); 2404a9de470cSBruce Richardson return TEST_FAILED; 2405a9de470cSBruce Richardson } 2406a9de470cSBruce Richardson 2407a9de470cSBruce Richardson /* Generate test mbuf data */ 2408a9de470cSBruce Richardson for (j = 0; j < num_pkts && rc == 0; j++) { 2409a9de470cSBruce Richardson k = crypto_ipsec_4grp(j); 2410a9de470cSBruce Richardson 2411a9de470cSBruce Richardson /* packet with sequence number 0 is invalid */ 2412a9de470cSBruce Richardson ut_params->ibuf[j] = setup_test_string_tunneled( 2413a9de470cSBruce Richardson ts_params->mbuf_pool, null_encrypted_data, 2414a9de470cSBruce Richardson test_cfg[i].pkt_sz, INBOUND_SPI + k, j + 1); 2415a9de470cSBruce Richardson if (ut_params->ibuf[j] == NULL) 2416a9de470cSBruce Richardson rc = TEST_FAILED; 2417a9de470cSBruce Richardson } 2418a9de470cSBruce Richardson 2419a9de470cSBruce Richardson if (rc == 0) 2420a9de470cSBruce Richardson rc = test_ipsec_crypto_op_alloc(num_pkts); 2421a9de470cSBruce Richardson 2422a9de470cSBruce Richardson if (rc == 0) { 2423a9de470cSBruce Richardson /* call ipsec library api */ 2424a9de470cSBruce Richardson rc = crypto_ipsec_2sa_4grp(); 2425a9de470cSBruce Richardson if (rc == 0) 2426a9de470cSBruce Richardson rc = crypto_inb_burst_2sa_null_null_check( 2427a9de470cSBruce Richardson ut_params, i); 2428a9de470cSBruce Richardson else { 2429a9de470cSBruce Richardson RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n", 2430a9de470cSBruce Richardson i); 2431a9de470cSBruce Richardson rc = TEST_FAILED; 2432a9de470cSBruce Richardson } 2433a9de470cSBruce Richardson } 2434a9de470cSBruce Richardson 2435a9de470cSBruce Richardson if (rc == TEST_FAILED) 2436a9de470cSBruce Richardson test_ipsec_dump_buffers(ut_params, i); 2437a9de470cSBruce Richardson 2438a9de470cSBruce Richardson destroy_sa(0); 2439a9de470cSBruce Richardson destroy_sa(1); 2440a9de470cSBruce Richardson return rc; 2441a9de470cSBruce Richardson } 2442a9de470cSBruce Richardson 2443a9de470cSBruce Richardson static int 2444a9de470cSBruce Richardson test_ipsec_crypto_inb_burst_2sa_4grp_null_null_wrapper(void) 2445a9de470cSBruce Richardson { 2446a9de470cSBruce Richardson int i; 2447a9de470cSBruce Richardson int rc = 0; 2448a9de470cSBruce Richardson struct ipsec_unitest_params *ut_params = &unittest_params; 2449a9de470cSBruce Richardson 2450a9de470cSBruce Richardson ut_params->ipsec_xform.spi = INBOUND_SPI; 2451a9de470cSBruce Richardson ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS; 2452a9de470cSBruce Richardson ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP; 2453a9de470cSBruce Richardson ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL; 2454a9de470cSBruce Richardson ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4; 2455a9de470cSBruce Richardson 2456a9de470cSBruce Richardson for (i = 0; i < num_cfg && rc == 0; i++) { 2457a9de470cSBruce Richardson ut_params->ipsec_xform.options.esn = test_cfg[i].esn; 2458a9de470cSBruce Richardson rc = test_ipsec_crypto_inb_burst_2sa_4grp_null_null(i); 2459a9de470cSBruce Richardson } 2460a9de470cSBruce Richardson 2461a9de470cSBruce Richardson return rc; 2462a9de470cSBruce Richardson } 2463a9de470cSBruce Richardson 2464a9de470cSBruce Richardson static struct unit_test_suite ipsec_testsuite = { 2465a9de470cSBruce Richardson .suite_name = "IPsec NULL Unit Test Suite", 2466a9de470cSBruce Richardson .setup = testsuite_setup, 2467a9de470cSBruce Richardson .teardown = testsuite_teardown, 2468a9de470cSBruce Richardson .unit_test_cases = { 2469a9de470cSBruce Richardson TEST_CASE_ST(ut_setup, ut_teardown, 2470a9de470cSBruce Richardson test_ipsec_crypto_inb_burst_null_null_wrapper), 2471a9de470cSBruce Richardson TEST_CASE_ST(ut_setup, ut_teardown, 2472a9de470cSBruce Richardson test_ipsec_crypto_outb_burst_null_null_wrapper), 2473a9de470cSBruce Richardson TEST_CASE_ST(ut_setup, ut_teardown, 2474a9de470cSBruce Richardson test_ipsec_inline_crypto_inb_burst_null_null_wrapper), 2475a9de470cSBruce Richardson TEST_CASE_ST(ut_setup, ut_teardown, 2476a9de470cSBruce Richardson test_ipsec_inline_crypto_outb_burst_null_null_wrapper), 2477a9de470cSBruce Richardson TEST_CASE_ST(ut_setup, ut_teardown, 2478a9de470cSBruce Richardson test_ipsec_inline_proto_inb_burst_null_null_wrapper), 2479a9de470cSBruce Richardson TEST_CASE_ST(ut_setup, ut_teardown, 2480a9de470cSBruce Richardson test_ipsec_inline_proto_outb_burst_null_null_wrapper), 2481a9de470cSBruce Richardson TEST_CASE_ST(ut_setup, ut_teardown, 2482a9de470cSBruce Richardson test_ipsec_lksd_proto_inb_burst_null_null_wrapper), 2483a9de470cSBruce Richardson TEST_CASE_ST(ut_setup, ut_teardown, 2484a9de470cSBruce Richardson test_ipsec_lksd_proto_outb_burst_null_null_wrapper), 2485a9de470cSBruce Richardson TEST_CASE_ST(ut_setup, ut_teardown, 2486a9de470cSBruce Richardson test_ipsec_replay_inb_inside_null_null_wrapper), 2487a9de470cSBruce Richardson TEST_CASE_ST(ut_setup, ut_teardown, 2488a9de470cSBruce Richardson test_ipsec_replay_inb_outside_null_null_wrapper), 2489a9de470cSBruce Richardson TEST_CASE_ST(ut_setup, ut_teardown, 2490a9de470cSBruce Richardson test_ipsec_replay_inb_repeat_null_null_wrapper), 2491a9de470cSBruce Richardson TEST_CASE_ST(ut_setup, ut_teardown, 2492a9de470cSBruce Richardson test_ipsec_replay_inb_inside_burst_null_null_wrapper), 2493a9de470cSBruce Richardson TEST_CASE_ST(ut_setup, ut_teardown, 2494a9de470cSBruce Richardson test_ipsec_crypto_inb_burst_2sa_null_null_wrapper), 2495a9de470cSBruce Richardson TEST_CASE_ST(ut_setup, ut_teardown, 2496a9de470cSBruce Richardson test_ipsec_crypto_inb_burst_2sa_4grp_null_null_wrapper), 2497a9de470cSBruce Richardson TEST_CASES_END() /**< NULL terminate unit test array */ 2498a9de470cSBruce Richardson } 2499a9de470cSBruce Richardson }; 2500a9de470cSBruce Richardson 2501a9de470cSBruce Richardson static int 2502a9de470cSBruce Richardson test_ipsec(void) 2503a9de470cSBruce Richardson { 2504a9de470cSBruce Richardson return unit_test_suite_runner(&ipsec_testsuite); 2505a9de470cSBruce Richardson } 2506a9de470cSBruce Richardson 2507a9de470cSBruce Richardson REGISTER_TEST_COMMAND(ipsec_autotest, test_ipsec); 2508