14418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
24418919fSjohnjiang * Copyright(c) 2018 Intel Corporation
34418919fSjohnjiang */
44418919fSjohnjiang
54418919fSjohnjiang #include <time.h>
64418919fSjohnjiang
74418919fSjohnjiang #include <rte_common.h>
84418919fSjohnjiang #include <rte_hexdump.h>
94418919fSjohnjiang #include <rte_mbuf.h>
104418919fSjohnjiang #include <rte_malloc.h>
114418919fSjohnjiang #include <rte_memcpy.h>
124418919fSjohnjiang #include <rte_cycles.h>
134418919fSjohnjiang #include <rte_bus_vdev.h>
144418919fSjohnjiang #include <rte_ip.h>
154418919fSjohnjiang
164418919fSjohnjiang #include <rte_crypto.h>
174418919fSjohnjiang #include <rte_cryptodev.h>
184418919fSjohnjiang #include <rte_cryptodev_pmd.h>
194418919fSjohnjiang #include <rte_lcore.h>
204418919fSjohnjiang #include <rte_ipsec.h>
214418919fSjohnjiang #include <rte_random.h>
224418919fSjohnjiang #include <rte_esp.h>
234418919fSjohnjiang #include <rte_security_driver.h>
244418919fSjohnjiang
254418919fSjohnjiang #include "test.h"
264418919fSjohnjiang #include "test_cryptodev.h"
274418919fSjohnjiang
284418919fSjohnjiang #define VDEV_ARGS_SIZE 100
294418919fSjohnjiang #define MAX_NB_SESSIONS 200
304418919fSjohnjiang #define MAX_NB_SAS 2
314418919fSjohnjiang #define REPLAY_WIN_0 0
324418919fSjohnjiang #define REPLAY_WIN_32 32
334418919fSjohnjiang #define REPLAY_WIN_64 64
344418919fSjohnjiang #define REPLAY_WIN_128 128
354418919fSjohnjiang #define REPLAY_WIN_256 256
364418919fSjohnjiang #define DATA_64_BYTES 64
374418919fSjohnjiang #define DATA_80_BYTES 80
384418919fSjohnjiang #define DATA_100_BYTES 100
394418919fSjohnjiang #define ESN_ENABLED 1
404418919fSjohnjiang #define ESN_DISABLED 0
414418919fSjohnjiang #define INBOUND_SPI 7
424418919fSjohnjiang #define OUTBOUND_SPI 17
434418919fSjohnjiang #define BURST_SIZE 32
444418919fSjohnjiang #define REORDER_PKTS 1
454418919fSjohnjiang #define DEQUEUE_COUNT 1000
464418919fSjohnjiang
474418919fSjohnjiang struct user_params {
484418919fSjohnjiang enum rte_crypto_sym_xform_type auth;
494418919fSjohnjiang enum rte_crypto_sym_xform_type cipher;
504418919fSjohnjiang enum rte_crypto_sym_xform_type aead;
514418919fSjohnjiang
524418919fSjohnjiang char auth_algo[128];
534418919fSjohnjiang char cipher_algo[128];
544418919fSjohnjiang char aead_algo[128];
554418919fSjohnjiang };
564418919fSjohnjiang
574418919fSjohnjiang struct ipsec_testsuite_params {
584418919fSjohnjiang struct rte_mempool *mbuf_pool;
594418919fSjohnjiang struct rte_mempool *cop_mpool;
604418919fSjohnjiang struct rte_cryptodev_config conf;
614418919fSjohnjiang struct rte_cryptodev_qp_conf qp_conf;
624418919fSjohnjiang
634418919fSjohnjiang uint8_t valid_dev;
644418919fSjohnjiang uint8_t valid_dev_found;
654418919fSjohnjiang };
664418919fSjohnjiang
674418919fSjohnjiang struct ipsec_unitest_params {
684418919fSjohnjiang struct rte_crypto_sym_xform cipher_xform;
694418919fSjohnjiang struct rte_crypto_sym_xform auth_xform;
704418919fSjohnjiang struct rte_crypto_sym_xform aead_xform;
714418919fSjohnjiang struct rte_crypto_sym_xform *crypto_xforms;
724418919fSjohnjiang
734418919fSjohnjiang struct rte_security_ipsec_xform ipsec_xform;
744418919fSjohnjiang
754418919fSjohnjiang struct rte_ipsec_sa_prm sa_prm;
764418919fSjohnjiang struct rte_ipsec_session ss[MAX_NB_SAS];
774418919fSjohnjiang
784418919fSjohnjiang struct rte_crypto_op *cop[BURST_SIZE];
794418919fSjohnjiang
804418919fSjohnjiang struct rte_mbuf *obuf[BURST_SIZE], *ibuf[BURST_SIZE],
814418919fSjohnjiang *testbuf[BURST_SIZE];
824418919fSjohnjiang
834418919fSjohnjiang uint16_t pkt_index;
844418919fSjohnjiang };
854418919fSjohnjiang
864418919fSjohnjiang struct ipsec_test_cfg {
874418919fSjohnjiang uint32_t replay_win_sz;
884418919fSjohnjiang uint32_t esn;
894418919fSjohnjiang uint64_t flags;
904418919fSjohnjiang size_t pkt_sz;
914418919fSjohnjiang uint16_t num_pkts;
924418919fSjohnjiang uint32_t reorder_pkts;
934418919fSjohnjiang };
944418919fSjohnjiang
954418919fSjohnjiang static const struct ipsec_test_cfg test_cfg[] = {
964418919fSjohnjiang {REPLAY_WIN_0, ESN_DISABLED, 0, DATA_64_BYTES, 1, 0},
974418919fSjohnjiang {REPLAY_WIN_0, ESN_DISABLED, 0, DATA_64_BYTES, BURST_SIZE, 0},
984418919fSjohnjiang {REPLAY_WIN_0, ESN_DISABLED, 0, DATA_80_BYTES, BURST_SIZE,
994418919fSjohnjiang REORDER_PKTS},
1004418919fSjohnjiang {REPLAY_WIN_32, ESN_ENABLED, 0, DATA_100_BYTES, 1, 0},
1014418919fSjohnjiang {REPLAY_WIN_32, ESN_ENABLED, 0, DATA_100_BYTES, BURST_SIZE,
1024418919fSjohnjiang REORDER_PKTS},
1034418919fSjohnjiang {REPLAY_WIN_64, ESN_ENABLED, 0, DATA_64_BYTES, 1, 0},
1044418919fSjohnjiang {REPLAY_WIN_128, ESN_ENABLED, RTE_IPSEC_SAFLAG_SQN_ATOM,
1054418919fSjohnjiang DATA_80_BYTES, 1, 0},
1064418919fSjohnjiang {REPLAY_WIN_256, ESN_DISABLED, 0, DATA_100_BYTES, 1, 0},
1074418919fSjohnjiang };
1084418919fSjohnjiang
1094418919fSjohnjiang static const int num_cfg = RTE_DIM(test_cfg);
1104418919fSjohnjiang static struct ipsec_testsuite_params testsuite_params = { NULL };
1114418919fSjohnjiang static struct ipsec_unitest_params unittest_params;
1124418919fSjohnjiang static struct user_params uparams;
1134418919fSjohnjiang
1144418919fSjohnjiang struct supported_cipher_algo {
1154418919fSjohnjiang const char *keyword;
1164418919fSjohnjiang enum rte_crypto_cipher_algorithm algo;
1174418919fSjohnjiang uint16_t iv_len;
1184418919fSjohnjiang uint16_t block_size;
1194418919fSjohnjiang uint16_t key_len;
1204418919fSjohnjiang };
1214418919fSjohnjiang
1224418919fSjohnjiang struct supported_auth_algo {
1234418919fSjohnjiang const char *keyword;
1244418919fSjohnjiang enum rte_crypto_auth_algorithm algo;
1254418919fSjohnjiang uint16_t digest_len;
1264418919fSjohnjiang uint16_t key_len;
1274418919fSjohnjiang uint8_t key_not_req;
1284418919fSjohnjiang };
1294418919fSjohnjiang
1304418919fSjohnjiang const struct supported_cipher_algo cipher_algos[] = {
1314418919fSjohnjiang {
1324418919fSjohnjiang .keyword = "null",
1334418919fSjohnjiang .algo = RTE_CRYPTO_CIPHER_NULL,
1344418919fSjohnjiang .iv_len = 0,
1354418919fSjohnjiang .block_size = 4,
1364418919fSjohnjiang .key_len = 0
1374418919fSjohnjiang },
1384418919fSjohnjiang };
1394418919fSjohnjiang
1404418919fSjohnjiang const struct supported_auth_algo auth_algos[] = {
1414418919fSjohnjiang {
1424418919fSjohnjiang .keyword = "null",
1434418919fSjohnjiang .algo = RTE_CRYPTO_AUTH_NULL,
1444418919fSjohnjiang .digest_len = 0,
1454418919fSjohnjiang .key_len = 0,
1464418919fSjohnjiang .key_not_req = 1
1474418919fSjohnjiang },
1484418919fSjohnjiang };
1494418919fSjohnjiang
1504418919fSjohnjiang static int
dummy_sec_create(void * device,struct rte_security_session_conf * conf,struct rte_security_session * sess,struct rte_mempool * mp)1514418919fSjohnjiang dummy_sec_create(void *device, struct rte_security_session_conf *conf,
1524418919fSjohnjiang struct rte_security_session *sess, struct rte_mempool *mp)
1534418919fSjohnjiang {
1544418919fSjohnjiang RTE_SET_USED(device);
1554418919fSjohnjiang RTE_SET_USED(conf);
1564418919fSjohnjiang RTE_SET_USED(mp);
1574418919fSjohnjiang
1584418919fSjohnjiang sess->sess_private_data = NULL;
1594418919fSjohnjiang return 0;
1604418919fSjohnjiang }
1614418919fSjohnjiang
1624418919fSjohnjiang static int
dummy_sec_destroy(void * device,struct rte_security_session * sess)1634418919fSjohnjiang dummy_sec_destroy(void *device, struct rte_security_session *sess)
1644418919fSjohnjiang {
1654418919fSjohnjiang RTE_SET_USED(device);
1664418919fSjohnjiang RTE_SET_USED(sess);
1674418919fSjohnjiang return 0;
1684418919fSjohnjiang }
1694418919fSjohnjiang
1704418919fSjohnjiang static const struct rte_security_ops dummy_sec_ops = {
1714418919fSjohnjiang .session_create = dummy_sec_create,
1724418919fSjohnjiang .session_destroy = dummy_sec_destroy,
1734418919fSjohnjiang };
1744418919fSjohnjiang
1754418919fSjohnjiang static struct rte_security_ctx dummy_sec_ctx = {
1764418919fSjohnjiang .ops = &dummy_sec_ops,
1774418919fSjohnjiang };
1784418919fSjohnjiang
1794418919fSjohnjiang static const struct supported_cipher_algo *
find_match_cipher_algo(const char * cipher_keyword)1804418919fSjohnjiang find_match_cipher_algo(const char *cipher_keyword)
1814418919fSjohnjiang {
1824418919fSjohnjiang size_t i;
1834418919fSjohnjiang
1844418919fSjohnjiang for (i = 0; i < RTE_DIM(cipher_algos); i++) {
1854418919fSjohnjiang const struct supported_cipher_algo *algo =
1864418919fSjohnjiang &cipher_algos[i];
1874418919fSjohnjiang
1884418919fSjohnjiang if (strcmp(cipher_keyword, algo->keyword) == 0)
1894418919fSjohnjiang return algo;
1904418919fSjohnjiang }
1914418919fSjohnjiang
1924418919fSjohnjiang return NULL;
1934418919fSjohnjiang }
1944418919fSjohnjiang
1954418919fSjohnjiang static const struct supported_auth_algo *
find_match_auth_algo(const char * auth_keyword)1964418919fSjohnjiang find_match_auth_algo(const char *auth_keyword)
1974418919fSjohnjiang {
1984418919fSjohnjiang size_t i;
1994418919fSjohnjiang
2004418919fSjohnjiang for (i = 0; i < RTE_DIM(auth_algos); i++) {
2014418919fSjohnjiang const struct supported_auth_algo *algo =
2024418919fSjohnjiang &auth_algos[i];
2034418919fSjohnjiang
2044418919fSjohnjiang if (strcmp(auth_keyword, algo->keyword) == 0)
2054418919fSjohnjiang return algo;
2064418919fSjohnjiang }
2074418919fSjohnjiang
2084418919fSjohnjiang return NULL;
2094418919fSjohnjiang }
2104418919fSjohnjiang
2114418919fSjohnjiang static void
fill_crypto_xform(struct ipsec_unitest_params * ut_params,const struct supported_auth_algo * auth_algo,const struct supported_cipher_algo * cipher_algo)2124418919fSjohnjiang fill_crypto_xform(struct ipsec_unitest_params *ut_params,
2134418919fSjohnjiang const struct supported_auth_algo *auth_algo,
2144418919fSjohnjiang const struct supported_cipher_algo *cipher_algo)
2154418919fSjohnjiang {
2164418919fSjohnjiang ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2174418919fSjohnjiang ut_params->cipher_xform.cipher.algo = cipher_algo->algo;
2184418919fSjohnjiang ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2194418919fSjohnjiang ut_params->auth_xform.auth.algo = auth_algo->algo;
2204418919fSjohnjiang
2214418919fSjohnjiang if (ut_params->ipsec_xform.direction ==
2224418919fSjohnjiang RTE_SECURITY_IPSEC_SA_DIR_INGRESS) {
2234418919fSjohnjiang ut_params->cipher_xform.cipher.op =
2244418919fSjohnjiang RTE_CRYPTO_CIPHER_OP_DECRYPT;
2254418919fSjohnjiang ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2264418919fSjohnjiang ut_params->cipher_xform.next = NULL;
2274418919fSjohnjiang ut_params->auth_xform.next = &ut_params->cipher_xform;
2284418919fSjohnjiang ut_params->crypto_xforms = &ut_params->auth_xform;
2294418919fSjohnjiang } else {
2304418919fSjohnjiang ut_params->cipher_xform.cipher.op =
2314418919fSjohnjiang RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2324418919fSjohnjiang ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2334418919fSjohnjiang ut_params->auth_xform.next = NULL;
2344418919fSjohnjiang ut_params->cipher_xform.next = &ut_params->auth_xform;
2354418919fSjohnjiang ut_params->crypto_xforms = &ut_params->cipher_xform;
2364418919fSjohnjiang }
2374418919fSjohnjiang }
2384418919fSjohnjiang
2394418919fSjohnjiang static int
check_cryptodev_capability(const struct ipsec_unitest_params * ut,uint8_t dev_id)2404418919fSjohnjiang check_cryptodev_capability(const struct ipsec_unitest_params *ut,
2414418919fSjohnjiang uint8_t dev_id)
2424418919fSjohnjiang {
2434418919fSjohnjiang struct rte_cryptodev_sym_capability_idx cap_idx;
2444418919fSjohnjiang const struct rte_cryptodev_symmetric_capability *cap;
2454418919fSjohnjiang int rc = -1;
2464418919fSjohnjiang
2474418919fSjohnjiang cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2484418919fSjohnjiang cap_idx.algo.auth = ut->auth_xform.auth.algo;
2494418919fSjohnjiang cap = rte_cryptodev_sym_capability_get(dev_id, &cap_idx);
2504418919fSjohnjiang
2514418919fSjohnjiang if (cap != NULL) {
2524418919fSjohnjiang rc = rte_cryptodev_sym_capability_check_auth(cap,
2534418919fSjohnjiang ut->auth_xform.auth.key.length,
2544418919fSjohnjiang ut->auth_xform.auth.digest_length, 0);
2554418919fSjohnjiang if (rc == 0) {
2564418919fSjohnjiang cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2574418919fSjohnjiang cap_idx.algo.cipher = ut->cipher_xform.cipher.algo;
2584418919fSjohnjiang cap = rte_cryptodev_sym_capability_get(
2594418919fSjohnjiang dev_id, &cap_idx);
2604418919fSjohnjiang if (cap != NULL)
2614418919fSjohnjiang rc = rte_cryptodev_sym_capability_check_cipher(
2624418919fSjohnjiang cap,
2634418919fSjohnjiang ut->cipher_xform.cipher.key.length,
2644418919fSjohnjiang ut->cipher_xform.cipher.iv.length);
2654418919fSjohnjiang }
2664418919fSjohnjiang }
2674418919fSjohnjiang
2684418919fSjohnjiang return rc;
2694418919fSjohnjiang }
2704418919fSjohnjiang
2714418919fSjohnjiang static int
testsuite_setup(void)2724418919fSjohnjiang testsuite_setup(void)
2734418919fSjohnjiang {
2744418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
2754418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
2764418919fSjohnjiang const struct supported_auth_algo *auth_algo;
2774418919fSjohnjiang const struct supported_cipher_algo *cipher_algo;
2784418919fSjohnjiang struct rte_cryptodev_info info;
2794418919fSjohnjiang uint32_t i, nb_devs, dev_id;
2804418919fSjohnjiang size_t sess_sz;
2814418919fSjohnjiang int rc;
2824418919fSjohnjiang
2834418919fSjohnjiang memset(ts_params, 0, sizeof(*ts_params));
2844418919fSjohnjiang memset(ut_params, 0, sizeof(*ut_params));
2854418919fSjohnjiang memset(&uparams, 0, sizeof(struct user_params));
2864418919fSjohnjiang
2874418919fSjohnjiang uparams.auth = RTE_CRYPTO_SYM_XFORM_AUTH;
2884418919fSjohnjiang uparams.cipher = RTE_CRYPTO_SYM_XFORM_CIPHER;
2894418919fSjohnjiang uparams.aead = RTE_CRYPTO_SYM_XFORM_NOT_SPECIFIED;
2904418919fSjohnjiang strcpy(uparams.auth_algo, "null");
2914418919fSjohnjiang strcpy(uparams.cipher_algo, "null");
2924418919fSjohnjiang
2934418919fSjohnjiang auth_algo = find_match_auth_algo(uparams.auth_algo);
2944418919fSjohnjiang cipher_algo = find_match_cipher_algo(uparams.cipher_algo);
2954418919fSjohnjiang fill_crypto_xform(ut_params, auth_algo, cipher_algo);
2964418919fSjohnjiang
2974418919fSjohnjiang nb_devs = rte_cryptodev_count();
2984418919fSjohnjiang if (nb_devs < 1) {
2994418919fSjohnjiang RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
3004418919fSjohnjiang return TEST_SKIPPED;
3014418919fSjohnjiang }
3024418919fSjohnjiang
3034418919fSjohnjiang /* Find first valid crypto device */
3044418919fSjohnjiang for (i = 0; i < nb_devs; i++) {
3054418919fSjohnjiang rc = check_cryptodev_capability(ut_params, i);
3064418919fSjohnjiang if (rc == 0) {
3074418919fSjohnjiang ts_params->valid_dev = i;
3084418919fSjohnjiang ts_params->valid_dev_found = 1;
3094418919fSjohnjiang break;
3104418919fSjohnjiang }
3114418919fSjohnjiang }
3124418919fSjohnjiang
3134418919fSjohnjiang if (ts_params->valid_dev_found == 0)
3144418919fSjohnjiang return TEST_FAILED;
3154418919fSjohnjiang
3164418919fSjohnjiang ts_params->mbuf_pool = rte_pktmbuf_pool_create(
3174418919fSjohnjiang "CRYPTO_MBUFPOOL",
3184418919fSjohnjiang NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
3194418919fSjohnjiang rte_socket_id());
3204418919fSjohnjiang if (ts_params->mbuf_pool == NULL) {
3214418919fSjohnjiang RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
3224418919fSjohnjiang return TEST_FAILED;
3234418919fSjohnjiang }
3244418919fSjohnjiang
3254418919fSjohnjiang ts_params->cop_mpool = rte_crypto_op_pool_create(
3264418919fSjohnjiang "MBUF_CRYPTO_SYM_OP_POOL",
3274418919fSjohnjiang RTE_CRYPTO_OP_TYPE_SYMMETRIC,
3284418919fSjohnjiang NUM_MBUFS, MBUF_CACHE_SIZE,
3294418919fSjohnjiang DEFAULT_NUM_XFORMS *
3304418919fSjohnjiang sizeof(struct rte_crypto_sym_xform) +
3314418919fSjohnjiang MAXIMUM_IV_LENGTH,
3324418919fSjohnjiang rte_socket_id());
3334418919fSjohnjiang if (ts_params->cop_mpool == NULL) {
3344418919fSjohnjiang RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
3354418919fSjohnjiang return TEST_FAILED;
3364418919fSjohnjiang }
3374418919fSjohnjiang
3384418919fSjohnjiang /* Set up all the qps on the first of the valid devices found */
3394418919fSjohnjiang dev_id = ts_params->valid_dev;
3404418919fSjohnjiang
3414418919fSjohnjiang rte_cryptodev_info_get(dev_id, &info);
3424418919fSjohnjiang
3434418919fSjohnjiang ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
3444418919fSjohnjiang ts_params->conf.socket_id = SOCKET_ID_ANY;
3454418919fSjohnjiang ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO;
3464418919fSjohnjiang
3474418919fSjohnjiang sess_sz = rte_cryptodev_sym_get_private_session_size(dev_id);
3484418919fSjohnjiang sess_sz = RTE_MAX(sess_sz, sizeof(struct rte_security_session));
3494418919fSjohnjiang
3504418919fSjohnjiang /*
3514418919fSjohnjiang * Create mempools for sessions
3524418919fSjohnjiang */
3534418919fSjohnjiang if (info.sym.max_nb_sessions != 0 &&
3544418919fSjohnjiang info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
3554418919fSjohnjiang RTE_LOG(ERR, USER1, "Device does not support "
3564418919fSjohnjiang "at least %u sessions\n",
3574418919fSjohnjiang MAX_NB_SESSIONS);
3584418919fSjohnjiang return TEST_FAILED;
3594418919fSjohnjiang }
3604418919fSjohnjiang
3614418919fSjohnjiang ts_params->qp_conf.mp_session_private = rte_mempool_create(
3624418919fSjohnjiang "test_priv_sess_mp",
3634418919fSjohnjiang MAX_NB_SESSIONS,
3644418919fSjohnjiang sess_sz,
3654418919fSjohnjiang 0, 0, NULL, NULL, NULL,
3664418919fSjohnjiang NULL, SOCKET_ID_ANY,
3674418919fSjohnjiang 0);
3684418919fSjohnjiang
3694418919fSjohnjiang TEST_ASSERT_NOT_NULL(ts_params->qp_conf.mp_session_private,
3704418919fSjohnjiang "private session mempool allocation failed");
3714418919fSjohnjiang
3724418919fSjohnjiang ts_params->qp_conf.mp_session =
3734418919fSjohnjiang rte_cryptodev_sym_session_pool_create("test_sess_mp",
3744418919fSjohnjiang MAX_NB_SESSIONS, 0, 0, 0, SOCKET_ID_ANY);
3754418919fSjohnjiang
3764418919fSjohnjiang TEST_ASSERT_NOT_NULL(ts_params->qp_conf.mp_session,
3774418919fSjohnjiang "session mempool allocation failed");
3784418919fSjohnjiang
3794418919fSjohnjiang TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
3804418919fSjohnjiang &ts_params->conf),
3814418919fSjohnjiang "Failed to configure cryptodev %u with %u qps",
3824418919fSjohnjiang dev_id, ts_params->conf.nb_queue_pairs);
3834418919fSjohnjiang
3844418919fSjohnjiang ts_params->qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
3854418919fSjohnjiang
3864418919fSjohnjiang TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
3874418919fSjohnjiang dev_id, 0, &ts_params->qp_conf,
3884418919fSjohnjiang rte_cryptodev_socket_id(dev_id)),
3894418919fSjohnjiang "Failed to setup queue pair %u on cryptodev %u",
3904418919fSjohnjiang 0, dev_id);
3914418919fSjohnjiang
3924418919fSjohnjiang return TEST_SUCCESS;
3934418919fSjohnjiang }
3944418919fSjohnjiang
3954418919fSjohnjiang static void
testsuite_teardown(void)3964418919fSjohnjiang testsuite_teardown(void)
3974418919fSjohnjiang {
3984418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
3994418919fSjohnjiang
4004418919fSjohnjiang if (ts_params->mbuf_pool != NULL) {
4014418919fSjohnjiang RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
4024418919fSjohnjiang rte_mempool_avail_count(ts_params->mbuf_pool));
4034418919fSjohnjiang rte_mempool_free(ts_params->mbuf_pool);
4044418919fSjohnjiang ts_params->mbuf_pool = NULL;
4054418919fSjohnjiang }
4064418919fSjohnjiang
4074418919fSjohnjiang if (ts_params->cop_mpool != NULL) {
4084418919fSjohnjiang RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
4094418919fSjohnjiang rte_mempool_avail_count(ts_params->cop_mpool));
4104418919fSjohnjiang rte_mempool_free(ts_params->cop_mpool);
4114418919fSjohnjiang ts_params->cop_mpool = NULL;
4124418919fSjohnjiang }
4134418919fSjohnjiang
4144418919fSjohnjiang /* Free session mempools */
4154418919fSjohnjiang if (ts_params->qp_conf.mp_session != NULL) {
4164418919fSjohnjiang rte_mempool_free(ts_params->qp_conf.mp_session);
4174418919fSjohnjiang ts_params->qp_conf.mp_session = NULL;
4184418919fSjohnjiang }
4194418919fSjohnjiang
4204418919fSjohnjiang if (ts_params->qp_conf.mp_session_private != NULL) {
4214418919fSjohnjiang rte_mempool_free(ts_params->qp_conf.mp_session_private);
4224418919fSjohnjiang ts_params->qp_conf.mp_session_private = NULL;
4234418919fSjohnjiang }
4244418919fSjohnjiang }
4254418919fSjohnjiang
4264418919fSjohnjiang static int
ut_setup(void)4274418919fSjohnjiang ut_setup(void)
4284418919fSjohnjiang {
4294418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
4304418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
4314418919fSjohnjiang
4324418919fSjohnjiang /* Clear unit test parameters before running test */
4334418919fSjohnjiang memset(ut_params, 0, sizeof(*ut_params));
4344418919fSjohnjiang
4354418919fSjohnjiang /* Reconfigure device to default parameters */
4364418919fSjohnjiang ts_params->conf.socket_id = SOCKET_ID_ANY;
4374418919fSjohnjiang
4384418919fSjohnjiang /* Start the device */
4394418919fSjohnjiang TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_dev),
4404418919fSjohnjiang "Failed to start cryptodev %u",
4414418919fSjohnjiang ts_params->valid_dev);
4424418919fSjohnjiang
4434418919fSjohnjiang return TEST_SUCCESS;
4444418919fSjohnjiang }
4454418919fSjohnjiang
4464418919fSjohnjiang static void
ut_teardown(void)4474418919fSjohnjiang ut_teardown(void)
4484418919fSjohnjiang {
4494418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
4504418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
4514418919fSjohnjiang int i;
4524418919fSjohnjiang
4534418919fSjohnjiang for (i = 0; i < BURST_SIZE; i++) {
4544418919fSjohnjiang /* free crypto operation structure */
4554418919fSjohnjiang if (ut_params->cop[i]) {
4564418919fSjohnjiang rte_crypto_op_free(ut_params->cop[i]);
4574418919fSjohnjiang ut_params->cop[i] = NULL;
4584418919fSjohnjiang }
4594418919fSjohnjiang
4604418919fSjohnjiang /*
4614418919fSjohnjiang * free mbuf - both obuf and ibuf are usually the same,
4624418919fSjohnjiang * so check if they point at the same address is necessary,
4634418919fSjohnjiang * to avoid freeing the mbuf twice.
4644418919fSjohnjiang */
4654418919fSjohnjiang if (ut_params->obuf[i]) {
4664418919fSjohnjiang rte_pktmbuf_free(ut_params->obuf[i]);
4674418919fSjohnjiang if (ut_params->ibuf[i] == ut_params->obuf[i])
4684418919fSjohnjiang ut_params->ibuf[i] = NULL;
4694418919fSjohnjiang ut_params->obuf[i] = NULL;
4704418919fSjohnjiang }
4714418919fSjohnjiang if (ut_params->ibuf[i]) {
4724418919fSjohnjiang rte_pktmbuf_free(ut_params->ibuf[i]);
4734418919fSjohnjiang ut_params->ibuf[i] = NULL;
4744418919fSjohnjiang }
4754418919fSjohnjiang
4764418919fSjohnjiang if (ut_params->testbuf[i]) {
4774418919fSjohnjiang rte_pktmbuf_free(ut_params->testbuf[i]);
4784418919fSjohnjiang ut_params->testbuf[i] = NULL;
4794418919fSjohnjiang }
4804418919fSjohnjiang }
4814418919fSjohnjiang
4824418919fSjohnjiang if (ts_params->mbuf_pool != NULL)
4834418919fSjohnjiang RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
4844418919fSjohnjiang rte_mempool_avail_count(ts_params->mbuf_pool));
4854418919fSjohnjiang
4864418919fSjohnjiang /* Stop the device */
4874418919fSjohnjiang rte_cryptodev_stop(ts_params->valid_dev);
4884418919fSjohnjiang }
4894418919fSjohnjiang
4904418919fSjohnjiang #define IPSEC_MAX_PAD_SIZE UINT8_MAX
4914418919fSjohnjiang
4924418919fSjohnjiang static const uint8_t esp_pad_bytes[IPSEC_MAX_PAD_SIZE] = {
4934418919fSjohnjiang 1, 2, 3, 4, 5, 6, 7, 8,
4944418919fSjohnjiang 9, 10, 11, 12, 13, 14, 15, 16,
4954418919fSjohnjiang 17, 18, 19, 20, 21, 22, 23, 24,
4964418919fSjohnjiang 25, 26, 27, 28, 29, 30, 31, 32,
4974418919fSjohnjiang 33, 34, 35, 36, 37, 38, 39, 40,
4984418919fSjohnjiang 41, 42, 43, 44, 45, 46, 47, 48,
4994418919fSjohnjiang 49, 50, 51, 52, 53, 54, 55, 56,
5004418919fSjohnjiang 57, 58, 59, 60, 61, 62, 63, 64,
5014418919fSjohnjiang 65, 66, 67, 68, 69, 70, 71, 72,
5024418919fSjohnjiang 73, 74, 75, 76, 77, 78, 79, 80,
5034418919fSjohnjiang 81, 82, 83, 84, 85, 86, 87, 88,
5044418919fSjohnjiang 89, 90, 91, 92, 93, 94, 95, 96,
5054418919fSjohnjiang 97, 98, 99, 100, 101, 102, 103, 104,
5064418919fSjohnjiang 105, 106, 107, 108, 109, 110, 111, 112,
5074418919fSjohnjiang 113, 114, 115, 116, 117, 118, 119, 120,
5084418919fSjohnjiang 121, 122, 123, 124, 125, 126, 127, 128,
5094418919fSjohnjiang 129, 130, 131, 132, 133, 134, 135, 136,
5104418919fSjohnjiang 137, 138, 139, 140, 141, 142, 143, 144,
5114418919fSjohnjiang 145, 146, 147, 148, 149, 150, 151, 152,
5124418919fSjohnjiang 153, 154, 155, 156, 157, 158, 159, 160,
5134418919fSjohnjiang 161, 162, 163, 164, 165, 166, 167, 168,
5144418919fSjohnjiang 169, 170, 171, 172, 173, 174, 175, 176,
5154418919fSjohnjiang 177, 178, 179, 180, 181, 182, 183, 184,
5164418919fSjohnjiang 185, 186, 187, 188, 189, 190, 191, 192,
5174418919fSjohnjiang 193, 194, 195, 196, 197, 198, 199, 200,
5184418919fSjohnjiang 201, 202, 203, 204, 205, 206, 207, 208,
5194418919fSjohnjiang 209, 210, 211, 212, 213, 214, 215, 216,
5204418919fSjohnjiang 217, 218, 219, 220, 221, 222, 223, 224,
5214418919fSjohnjiang 225, 226, 227, 228, 229, 230, 231, 232,
5224418919fSjohnjiang 233, 234, 235, 236, 237, 238, 239, 240,
5234418919fSjohnjiang 241, 242, 243, 244, 245, 246, 247, 248,
5244418919fSjohnjiang 249, 250, 251, 252, 253, 254, 255,
5254418919fSjohnjiang };
5264418919fSjohnjiang
5274418919fSjohnjiang /* ***** data for tests ***** */
5284418919fSjohnjiang
5294418919fSjohnjiang const char null_plain_data[] =
5304418919fSjohnjiang "Network Security People Have A Strange Sense Of Humor unlike Other "
5314418919fSjohnjiang "People who have a normal sense of humour";
5324418919fSjohnjiang
5334418919fSjohnjiang const char null_encrypted_data[] =
5344418919fSjohnjiang "Network Security People Have A Strange Sense Of Humor unlike Other "
5354418919fSjohnjiang "People who have a normal sense of humour";
5364418919fSjohnjiang
5374418919fSjohnjiang struct rte_ipv4_hdr ipv4_outer = {
5384418919fSjohnjiang .version_ihl = IPVERSION << 4 |
5394418919fSjohnjiang sizeof(ipv4_outer) / RTE_IPV4_IHL_MULTIPLIER,
5404418919fSjohnjiang .time_to_live = IPDEFTTL,
5414418919fSjohnjiang .next_proto_id = IPPROTO_ESP,
5424418919fSjohnjiang .src_addr = RTE_IPV4(192, 168, 1, 100),
5434418919fSjohnjiang .dst_addr = RTE_IPV4(192, 168, 2, 100),
5444418919fSjohnjiang };
5454418919fSjohnjiang
5464418919fSjohnjiang static struct rte_mbuf *
setup_test_string(struct rte_mempool * mpool,const char * string,size_t len,uint8_t blocksize)5474418919fSjohnjiang setup_test_string(struct rte_mempool *mpool,
5484418919fSjohnjiang const char *string, size_t len, uint8_t blocksize)
5494418919fSjohnjiang {
5504418919fSjohnjiang struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
5514418919fSjohnjiang size_t t_len = len - (blocksize ? (len % blocksize) : 0);
5524418919fSjohnjiang
5534418919fSjohnjiang if (m) {
5544418919fSjohnjiang memset(m->buf_addr, 0, m->buf_len);
5554418919fSjohnjiang char *dst = rte_pktmbuf_append(m, t_len);
5564418919fSjohnjiang
5574418919fSjohnjiang if (!dst) {
5584418919fSjohnjiang rte_pktmbuf_free(m);
5594418919fSjohnjiang return NULL;
5604418919fSjohnjiang }
5614418919fSjohnjiang if (string != NULL)
5624418919fSjohnjiang rte_memcpy(dst, string, t_len);
5634418919fSjohnjiang else
5644418919fSjohnjiang memset(dst, 0, t_len);
5654418919fSjohnjiang }
5664418919fSjohnjiang
5674418919fSjohnjiang return m;
5684418919fSjohnjiang }
5694418919fSjohnjiang
5704418919fSjohnjiang static struct rte_mbuf *
setup_test_string_tunneled(struct rte_mempool * mpool,const char * string,size_t len,uint32_t spi,uint32_t seq)5714418919fSjohnjiang setup_test_string_tunneled(struct rte_mempool *mpool, const char *string,
5724418919fSjohnjiang size_t len, uint32_t spi, uint32_t seq)
5734418919fSjohnjiang {
5744418919fSjohnjiang struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
5754418919fSjohnjiang uint32_t hdrlen = sizeof(struct rte_ipv4_hdr) +
5764418919fSjohnjiang sizeof(struct rte_esp_hdr);
5774418919fSjohnjiang uint32_t taillen = sizeof(struct rte_esp_tail);
5784418919fSjohnjiang uint32_t t_len = len + hdrlen + taillen;
5794418919fSjohnjiang uint32_t padlen;
5804418919fSjohnjiang
5814418919fSjohnjiang struct rte_esp_hdr esph = {
5824418919fSjohnjiang .spi = rte_cpu_to_be_32(spi),
5834418919fSjohnjiang .seq = rte_cpu_to_be_32(seq)
5844418919fSjohnjiang };
5854418919fSjohnjiang
5864418919fSjohnjiang padlen = RTE_ALIGN(t_len, 4) - t_len;
5874418919fSjohnjiang t_len += padlen;
5884418919fSjohnjiang
5894418919fSjohnjiang struct rte_esp_tail espt = {
5904418919fSjohnjiang .pad_len = padlen,
5914418919fSjohnjiang .next_proto = IPPROTO_IPIP,
5924418919fSjohnjiang };
5934418919fSjohnjiang
5944418919fSjohnjiang if (m == NULL)
5954418919fSjohnjiang return NULL;
5964418919fSjohnjiang
5974418919fSjohnjiang memset(m->buf_addr, 0, m->buf_len);
5984418919fSjohnjiang char *dst = rte_pktmbuf_append(m, t_len);
5994418919fSjohnjiang
6004418919fSjohnjiang if (!dst) {
6014418919fSjohnjiang rte_pktmbuf_free(m);
6024418919fSjohnjiang return NULL;
6034418919fSjohnjiang }
6044418919fSjohnjiang /* copy outer IP and ESP header */
6054418919fSjohnjiang ipv4_outer.total_length = rte_cpu_to_be_16(t_len);
6064418919fSjohnjiang ipv4_outer.packet_id = rte_cpu_to_be_16(seq);
6074418919fSjohnjiang rte_memcpy(dst, &ipv4_outer, sizeof(ipv4_outer));
6084418919fSjohnjiang dst += sizeof(ipv4_outer);
6094418919fSjohnjiang m->l3_len = sizeof(ipv4_outer);
6104418919fSjohnjiang rte_memcpy(dst, &esph, sizeof(esph));
6114418919fSjohnjiang dst += sizeof(esph);
6124418919fSjohnjiang
6134418919fSjohnjiang if (string != NULL) {
6144418919fSjohnjiang /* copy payload */
6154418919fSjohnjiang rte_memcpy(dst, string, len);
6164418919fSjohnjiang dst += len;
6174418919fSjohnjiang /* copy pad bytes */
6184418919fSjohnjiang rte_memcpy(dst, esp_pad_bytes, padlen);
6194418919fSjohnjiang dst += padlen;
6204418919fSjohnjiang /* copy ESP tail header */
6214418919fSjohnjiang rte_memcpy(dst, &espt, sizeof(espt));
6224418919fSjohnjiang } else
6234418919fSjohnjiang memset(dst, 0, t_len);
6244418919fSjohnjiang
6254418919fSjohnjiang return m;
6264418919fSjohnjiang }
6274418919fSjohnjiang
6284418919fSjohnjiang static int
create_dummy_sec_session(struct ipsec_unitest_params * ut,struct rte_cryptodev_qp_conf * qp,uint32_t j)6294418919fSjohnjiang create_dummy_sec_session(struct ipsec_unitest_params *ut,
6304418919fSjohnjiang struct rte_cryptodev_qp_conf *qp, uint32_t j)
6314418919fSjohnjiang {
6324418919fSjohnjiang static struct rte_security_session_conf conf;
6334418919fSjohnjiang
6344418919fSjohnjiang ut->ss[j].security.ses = rte_security_session_create(&dummy_sec_ctx,
635*2d9fd380Sjfb8856606 &conf, qp->mp_session,
636*2d9fd380Sjfb8856606 qp->mp_session_private);
6374418919fSjohnjiang
6384418919fSjohnjiang if (ut->ss[j].security.ses == NULL)
6394418919fSjohnjiang return -ENOMEM;
6404418919fSjohnjiang
6414418919fSjohnjiang ut->ss[j].security.ctx = &dummy_sec_ctx;
6424418919fSjohnjiang ut->ss[j].security.ol_flags = 0;
6434418919fSjohnjiang return 0;
6444418919fSjohnjiang }
6454418919fSjohnjiang
6464418919fSjohnjiang static int
create_crypto_session(struct ipsec_unitest_params * ut,struct rte_cryptodev_qp_conf * qp,uint8_t dev_id,uint32_t j)6474418919fSjohnjiang create_crypto_session(struct ipsec_unitest_params *ut,
6484418919fSjohnjiang struct rte_cryptodev_qp_conf *qp, uint8_t dev_id, uint32_t j)
6494418919fSjohnjiang {
6504418919fSjohnjiang int32_t rc;
6514418919fSjohnjiang struct rte_cryptodev_sym_session *s;
6524418919fSjohnjiang
6534418919fSjohnjiang s = rte_cryptodev_sym_session_create(qp->mp_session);
6544418919fSjohnjiang if (s == NULL)
6554418919fSjohnjiang return -ENOMEM;
6564418919fSjohnjiang
6574418919fSjohnjiang /* initiliaze SA crypto session for device */
6584418919fSjohnjiang rc = rte_cryptodev_sym_session_init(dev_id, s,
6594418919fSjohnjiang ut->crypto_xforms, qp->mp_session_private);
6604418919fSjohnjiang if (rc == 0) {
6614418919fSjohnjiang ut->ss[j].crypto.ses = s;
6624418919fSjohnjiang return 0;
6634418919fSjohnjiang } else {
6644418919fSjohnjiang /* failure, do cleanup */
6654418919fSjohnjiang rte_cryptodev_sym_session_clear(dev_id, s);
6664418919fSjohnjiang rte_cryptodev_sym_session_free(s);
6674418919fSjohnjiang return rc;
6684418919fSjohnjiang }
6694418919fSjohnjiang }
6704418919fSjohnjiang
6714418919fSjohnjiang static int
create_session(struct ipsec_unitest_params * ut,struct rte_cryptodev_qp_conf * qp,uint8_t crypto_dev,uint32_t j)6724418919fSjohnjiang create_session(struct ipsec_unitest_params *ut,
6734418919fSjohnjiang struct rte_cryptodev_qp_conf *qp, uint8_t crypto_dev, uint32_t j)
6744418919fSjohnjiang {
6754418919fSjohnjiang if (ut->ss[j].type == RTE_SECURITY_ACTION_TYPE_NONE)
6764418919fSjohnjiang return create_crypto_session(ut, qp, crypto_dev, j);
6774418919fSjohnjiang else
6784418919fSjohnjiang return create_dummy_sec_session(ut, qp, j);
6794418919fSjohnjiang }
6804418919fSjohnjiang
6814418919fSjohnjiang static int
fill_ipsec_param(uint32_t replay_win_sz,uint64_t flags)6824418919fSjohnjiang fill_ipsec_param(uint32_t replay_win_sz, uint64_t flags)
6834418919fSjohnjiang {
6844418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
6854418919fSjohnjiang struct rte_ipsec_sa_prm *prm = &ut_params->sa_prm;
6864418919fSjohnjiang const struct supported_auth_algo *auth_algo;
6874418919fSjohnjiang const struct supported_cipher_algo *cipher_algo;
6884418919fSjohnjiang
6894418919fSjohnjiang memset(prm, 0, sizeof(*prm));
6904418919fSjohnjiang
6914418919fSjohnjiang prm->userdata = 1;
6924418919fSjohnjiang prm->flags = flags;
6934418919fSjohnjiang
6944418919fSjohnjiang /* setup ipsec xform */
6954418919fSjohnjiang prm->ipsec_xform = ut_params->ipsec_xform;
6964418919fSjohnjiang prm->ipsec_xform.salt = (uint32_t)rte_rand();
6974418919fSjohnjiang prm->ipsec_xform.replay_win_sz = replay_win_sz;
6984418919fSjohnjiang
6994418919fSjohnjiang /* setup tunnel related fields */
7004418919fSjohnjiang prm->tun.hdr_len = sizeof(ipv4_outer);
7014418919fSjohnjiang prm->tun.next_proto = IPPROTO_IPIP;
7024418919fSjohnjiang prm->tun.hdr = &ipv4_outer;
7034418919fSjohnjiang
7044418919fSjohnjiang /* setup crypto section */
7054418919fSjohnjiang if (uparams.aead != 0) {
7064418919fSjohnjiang /* TODO: will need to fill out with other test cases */
7074418919fSjohnjiang } else {
7084418919fSjohnjiang if (uparams.auth == 0 && uparams.cipher == 0)
7094418919fSjohnjiang return TEST_FAILED;
7104418919fSjohnjiang
7114418919fSjohnjiang auth_algo = find_match_auth_algo(uparams.auth_algo);
7124418919fSjohnjiang cipher_algo = find_match_cipher_algo(uparams.cipher_algo);
7134418919fSjohnjiang
7144418919fSjohnjiang fill_crypto_xform(ut_params, auth_algo, cipher_algo);
7154418919fSjohnjiang }
7164418919fSjohnjiang
7174418919fSjohnjiang prm->crypto_xform = ut_params->crypto_xforms;
7184418919fSjohnjiang return TEST_SUCCESS;
7194418919fSjohnjiang }
7204418919fSjohnjiang
7214418919fSjohnjiang static int
create_sa(enum rte_security_session_action_type action_type,uint32_t replay_win_sz,uint64_t flags,uint32_t j)7224418919fSjohnjiang create_sa(enum rte_security_session_action_type action_type,
7234418919fSjohnjiang uint32_t replay_win_sz, uint64_t flags, uint32_t j)
7244418919fSjohnjiang {
7254418919fSjohnjiang struct ipsec_testsuite_params *ts = &testsuite_params;
7264418919fSjohnjiang struct ipsec_unitest_params *ut = &unittest_params;
7274418919fSjohnjiang size_t sz;
7284418919fSjohnjiang int rc;
7294418919fSjohnjiang
7304418919fSjohnjiang memset(&ut->ss[j], 0, sizeof(ut->ss[j]));
7314418919fSjohnjiang
7324418919fSjohnjiang rc = fill_ipsec_param(replay_win_sz, flags);
7334418919fSjohnjiang if (rc != 0)
7344418919fSjohnjiang return TEST_FAILED;
7354418919fSjohnjiang
7364418919fSjohnjiang /* create rte_ipsec_sa*/
7374418919fSjohnjiang sz = rte_ipsec_sa_size(&ut->sa_prm);
7384418919fSjohnjiang TEST_ASSERT(sz > 0, "rte_ipsec_sa_size() failed\n");
7394418919fSjohnjiang
7404418919fSjohnjiang ut->ss[j].sa = rte_zmalloc(NULL, sz, RTE_CACHE_LINE_SIZE);
7414418919fSjohnjiang TEST_ASSERT_NOT_NULL(ut->ss[j].sa,
7424418919fSjohnjiang "failed to allocate memory for rte_ipsec_sa\n");
7434418919fSjohnjiang
7444418919fSjohnjiang ut->ss[j].type = action_type;
7454418919fSjohnjiang rc = create_session(ut, &ts->qp_conf, ts->valid_dev, j);
7464418919fSjohnjiang if (rc != 0)
7474418919fSjohnjiang return TEST_FAILED;
7484418919fSjohnjiang
7494418919fSjohnjiang rc = rte_ipsec_sa_init(ut->ss[j].sa, &ut->sa_prm, sz);
7504418919fSjohnjiang rc = (rc > 0 && (uint32_t)rc <= sz) ? 0 : -EINVAL;
7514418919fSjohnjiang if (rc == 0)
7524418919fSjohnjiang rc = rte_ipsec_session_prepare(&ut->ss[j]);
7534418919fSjohnjiang
7544418919fSjohnjiang return rc;
7554418919fSjohnjiang }
7564418919fSjohnjiang
7574418919fSjohnjiang static int
crypto_dequeue_burst(uint16_t num_pkts)7584418919fSjohnjiang crypto_dequeue_burst(uint16_t num_pkts)
7594418919fSjohnjiang {
7604418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
7614418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
7624418919fSjohnjiang uint32_t pkt_cnt, k;
7634418919fSjohnjiang int i;
7644418919fSjohnjiang
7654418919fSjohnjiang for (i = 0, pkt_cnt = 0;
7664418919fSjohnjiang i < DEQUEUE_COUNT && pkt_cnt != num_pkts; i++) {
7674418919fSjohnjiang k = rte_cryptodev_dequeue_burst(ts_params->valid_dev, 0,
7684418919fSjohnjiang &ut_params->cop[pkt_cnt], num_pkts - pkt_cnt);
7694418919fSjohnjiang pkt_cnt += k;
7704418919fSjohnjiang rte_delay_us(1);
7714418919fSjohnjiang }
7724418919fSjohnjiang
7734418919fSjohnjiang if (pkt_cnt != num_pkts) {
7744418919fSjohnjiang RTE_LOG(ERR, USER1, "rte_cryptodev_dequeue_burst fail\n");
7754418919fSjohnjiang return TEST_FAILED;
7764418919fSjohnjiang }
7774418919fSjohnjiang return TEST_SUCCESS;
7784418919fSjohnjiang }
7794418919fSjohnjiang
7804418919fSjohnjiang static int
crypto_ipsec(uint16_t num_pkts)7814418919fSjohnjiang crypto_ipsec(uint16_t num_pkts)
7824418919fSjohnjiang {
7834418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
7844418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
7854418919fSjohnjiang uint32_t k, ng;
7864418919fSjohnjiang struct rte_ipsec_group grp[1];
7874418919fSjohnjiang
7884418919fSjohnjiang /* call crypto prepare */
7894418919fSjohnjiang k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[0], ut_params->ibuf,
7904418919fSjohnjiang ut_params->cop, num_pkts);
7914418919fSjohnjiang if (k != num_pkts) {
7924418919fSjohnjiang RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_prepare fail\n");
7934418919fSjohnjiang return TEST_FAILED;
7944418919fSjohnjiang }
7954418919fSjohnjiang
7964418919fSjohnjiang k = rte_cryptodev_enqueue_burst(ts_params->valid_dev, 0,
7974418919fSjohnjiang ut_params->cop, num_pkts);
7984418919fSjohnjiang if (k != num_pkts) {
7994418919fSjohnjiang RTE_LOG(ERR, USER1, "rte_cryptodev_enqueue_burst fail\n");
8004418919fSjohnjiang return TEST_FAILED;
8014418919fSjohnjiang }
8024418919fSjohnjiang
8034418919fSjohnjiang if (crypto_dequeue_burst(num_pkts) == TEST_FAILED)
8044418919fSjohnjiang return TEST_FAILED;
8054418919fSjohnjiang
8064418919fSjohnjiang ng = rte_ipsec_pkt_crypto_group(
8074418919fSjohnjiang (const struct rte_crypto_op **)(uintptr_t)ut_params->cop,
8084418919fSjohnjiang ut_params->obuf, grp, num_pkts);
8094418919fSjohnjiang if (ng != 1 ||
8104418919fSjohnjiang grp[0].m[0] != ut_params->obuf[0] ||
8114418919fSjohnjiang grp[0].cnt != num_pkts ||
8124418919fSjohnjiang grp[0].id.ptr != &ut_params->ss[0]) {
8134418919fSjohnjiang RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail\n");
8144418919fSjohnjiang return TEST_FAILED;
8154418919fSjohnjiang }
8164418919fSjohnjiang
8174418919fSjohnjiang /* call crypto process */
8184418919fSjohnjiang k = rte_ipsec_pkt_process(grp[0].id.ptr, grp[0].m, grp[0].cnt);
8194418919fSjohnjiang if (k != num_pkts) {
8204418919fSjohnjiang RTE_LOG(ERR, USER1, "rte_ipsec_pkt_process fail\n");
8214418919fSjohnjiang return TEST_FAILED;
8224418919fSjohnjiang }
8234418919fSjohnjiang
8244418919fSjohnjiang return TEST_SUCCESS;
8254418919fSjohnjiang }
8264418919fSjohnjiang
8274418919fSjohnjiang static int
lksd_proto_ipsec(uint16_t num_pkts)8284418919fSjohnjiang lksd_proto_ipsec(uint16_t num_pkts)
8294418919fSjohnjiang {
8304418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
8314418919fSjohnjiang uint32_t i, k, ng;
8324418919fSjohnjiang struct rte_ipsec_group grp[1];
8334418919fSjohnjiang
8344418919fSjohnjiang /* call crypto prepare */
8354418919fSjohnjiang k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[0], ut_params->ibuf,
8364418919fSjohnjiang ut_params->cop, num_pkts);
8374418919fSjohnjiang if (k != num_pkts) {
8384418919fSjohnjiang RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_prepare fail\n");
8394418919fSjohnjiang return TEST_FAILED;
8404418919fSjohnjiang }
8414418919fSjohnjiang
8424418919fSjohnjiang /* check crypto ops */
8434418919fSjohnjiang for (i = 0; i != num_pkts; i++) {
8444418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->cop[i]->type,
8454418919fSjohnjiang RTE_CRYPTO_OP_TYPE_SYMMETRIC,
8464418919fSjohnjiang "%s: invalid crypto op type for %u-th packet\n",
8474418919fSjohnjiang __func__, i);
8484418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->cop[i]->status,
8494418919fSjohnjiang RTE_CRYPTO_OP_STATUS_NOT_PROCESSED,
8504418919fSjohnjiang "%s: invalid crypto op status for %u-th packet\n",
8514418919fSjohnjiang __func__, i);
8524418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->cop[i]->sess_type,
8534418919fSjohnjiang RTE_CRYPTO_OP_SECURITY_SESSION,
8544418919fSjohnjiang "%s: invalid crypto op sess_type for %u-th packet\n",
8554418919fSjohnjiang __func__, i);
8564418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->cop[i]->sym->m_src,
8574418919fSjohnjiang ut_params->ibuf[i],
8584418919fSjohnjiang "%s: invalid crypto op m_src for %u-th packet\n",
8594418919fSjohnjiang __func__, i);
8604418919fSjohnjiang }
8614418919fSjohnjiang
8624418919fSjohnjiang /* update crypto ops, pretend all finished ok */
8634418919fSjohnjiang for (i = 0; i != num_pkts; i++)
8644418919fSjohnjiang ut_params->cop[i]->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
8654418919fSjohnjiang
8664418919fSjohnjiang ng = rte_ipsec_pkt_crypto_group(
8674418919fSjohnjiang (const struct rte_crypto_op **)(uintptr_t)ut_params->cop,
8684418919fSjohnjiang ut_params->obuf, grp, num_pkts);
8694418919fSjohnjiang if (ng != 1 ||
8704418919fSjohnjiang grp[0].m[0] != ut_params->obuf[0] ||
8714418919fSjohnjiang grp[0].cnt != num_pkts ||
8724418919fSjohnjiang grp[0].id.ptr != &ut_params->ss[0]) {
8734418919fSjohnjiang RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail\n");
8744418919fSjohnjiang return TEST_FAILED;
8754418919fSjohnjiang }
8764418919fSjohnjiang
8774418919fSjohnjiang /* call crypto process */
8784418919fSjohnjiang k = rte_ipsec_pkt_process(grp[0].id.ptr, grp[0].m, grp[0].cnt);
8794418919fSjohnjiang if (k != num_pkts) {
8804418919fSjohnjiang RTE_LOG(ERR, USER1, "rte_ipsec_pkt_process fail\n");
8814418919fSjohnjiang return TEST_FAILED;
8824418919fSjohnjiang }
8834418919fSjohnjiang
8844418919fSjohnjiang return TEST_SUCCESS;
8854418919fSjohnjiang }
8864418919fSjohnjiang
8874418919fSjohnjiang static void
dump_grp_pkt(uint32_t i,struct rte_ipsec_group * grp,uint32_t k)8884418919fSjohnjiang dump_grp_pkt(uint32_t i, struct rte_ipsec_group *grp, uint32_t k)
8894418919fSjohnjiang {
8904418919fSjohnjiang RTE_LOG(ERR, USER1,
8914418919fSjohnjiang "After rte_ipsec_pkt_process grp[%d].cnt=%d k=%d fail\n",
8924418919fSjohnjiang i, grp[i].cnt, k);
8934418919fSjohnjiang RTE_LOG(ERR, USER1,
8944418919fSjohnjiang "After rte_ipsec_pkt_process grp[%d].m=%p grp[%d].m[%d]=%p\n",
8954418919fSjohnjiang i, grp[i].m, i, k, grp[i].m[k]);
8964418919fSjohnjiang
8974418919fSjohnjiang rte_pktmbuf_dump(stdout, grp[i].m[k], grp[i].m[k]->data_len);
8984418919fSjohnjiang }
8994418919fSjohnjiang
9004418919fSjohnjiang static int
crypto_ipsec_2sa(void)9014418919fSjohnjiang crypto_ipsec_2sa(void)
9024418919fSjohnjiang {
9034418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
9044418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
9054418919fSjohnjiang struct rte_ipsec_group grp[BURST_SIZE];
9064418919fSjohnjiang uint32_t k, ng, i, r;
9074418919fSjohnjiang
9084418919fSjohnjiang for (i = 0; i < BURST_SIZE; i++) {
9094418919fSjohnjiang r = i % 2;
9104418919fSjohnjiang /* call crypto prepare */
9114418919fSjohnjiang k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[r],
9124418919fSjohnjiang ut_params->ibuf + i, ut_params->cop + i, 1);
9134418919fSjohnjiang if (k != 1) {
9144418919fSjohnjiang RTE_LOG(ERR, USER1,
9154418919fSjohnjiang "rte_ipsec_pkt_crypto_prepare fail\n");
9164418919fSjohnjiang return TEST_FAILED;
9174418919fSjohnjiang }
9184418919fSjohnjiang k = rte_cryptodev_enqueue_burst(ts_params->valid_dev, 0,
9194418919fSjohnjiang ut_params->cop + i, 1);
9204418919fSjohnjiang if (k != 1) {
9214418919fSjohnjiang RTE_LOG(ERR, USER1,
9224418919fSjohnjiang "rte_cryptodev_enqueue_burst fail\n");
9234418919fSjohnjiang return TEST_FAILED;
9244418919fSjohnjiang }
9254418919fSjohnjiang }
9264418919fSjohnjiang
9274418919fSjohnjiang if (crypto_dequeue_burst(BURST_SIZE) == TEST_FAILED)
9284418919fSjohnjiang return TEST_FAILED;
9294418919fSjohnjiang
9304418919fSjohnjiang ng = rte_ipsec_pkt_crypto_group(
9314418919fSjohnjiang (const struct rte_crypto_op **)(uintptr_t)ut_params->cop,
9324418919fSjohnjiang ut_params->obuf, grp, BURST_SIZE);
9334418919fSjohnjiang if (ng != BURST_SIZE) {
9344418919fSjohnjiang RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail ng=%d\n",
9354418919fSjohnjiang ng);
9364418919fSjohnjiang return TEST_FAILED;
9374418919fSjohnjiang }
9384418919fSjohnjiang
9394418919fSjohnjiang /* call crypto process */
9404418919fSjohnjiang for (i = 0; i < ng; i++) {
9414418919fSjohnjiang k = rte_ipsec_pkt_process(grp[i].id.ptr, grp[i].m, grp[i].cnt);
9424418919fSjohnjiang if (k != grp[i].cnt) {
9434418919fSjohnjiang dump_grp_pkt(i, grp, k);
9444418919fSjohnjiang return TEST_FAILED;
9454418919fSjohnjiang }
9464418919fSjohnjiang }
9474418919fSjohnjiang return TEST_SUCCESS;
9484418919fSjohnjiang }
9494418919fSjohnjiang
9504418919fSjohnjiang #define PKT_4 4
9514418919fSjohnjiang #define PKT_12 12
9524418919fSjohnjiang #define PKT_21 21
9534418919fSjohnjiang
9544418919fSjohnjiang static uint32_t
crypto_ipsec_4grp(uint32_t pkt_num)9554418919fSjohnjiang crypto_ipsec_4grp(uint32_t pkt_num)
9564418919fSjohnjiang {
9574418919fSjohnjiang uint32_t sa_ind;
9584418919fSjohnjiang
9594418919fSjohnjiang /* group packets in 4 different size groups groups, 2 per SA */
9604418919fSjohnjiang if (pkt_num < PKT_4)
9614418919fSjohnjiang sa_ind = 0;
9624418919fSjohnjiang else if (pkt_num < PKT_12)
9634418919fSjohnjiang sa_ind = 1;
9644418919fSjohnjiang else if (pkt_num < PKT_21)
9654418919fSjohnjiang sa_ind = 0;
9664418919fSjohnjiang else
9674418919fSjohnjiang sa_ind = 1;
9684418919fSjohnjiang
9694418919fSjohnjiang return sa_ind;
9704418919fSjohnjiang }
9714418919fSjohnjiang
9724418919fSjohnjiang static uint32_t
crypto_ipsec_4grp_check_mbufs(uint32_t grp_ind,struct rte_ipsec_group * grp)9734418919fSjohnjiang crypto_ipsec_4grp_check_mbufs(uint32_t grp_ind, struct rte_ipsec_group *grp)
9744418919fSjohnjiang {
9754418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
9764418919fSjohnjiang uint32_t i, j;
9774418919fSjohnjiang uint32_t rc = 0;
9784418919fSjohnjiang
9794418919fSjohnjiang if (grp_ind == 0) {
9804418919fSjohnjiang for (i = 0, j = 0; i < PKT_4; i++, j++)
9814418919fSjohnjiang if (grp[grp_ind].m[i] != ut_params->obuf[j]) {
9824418919fSjohnjiang rc = TEST_FAILED;
9834418919fSjohnjiang break;
9844418919fSjohnjiang }
9854418919fSjohnjiang } else if (grp_ind == 1) {
9864418919fSjohnjiang for (i = 0, j = PKT_4; i < (PKT_12 - PKT_4); i++, j++) {
9874418919fSjohnjiang if (grp[grp_ind].m[i] != ut_params->obuf[j]) {
9884418919fSjohnjiang rc = TEST_FAILED;
9894418919fSjohnjiang break;
9904418919fSjohnjiang }
9914418919fSjohnjiang }
9924418919fSjohnjiang } else if (grp_ind == 2) {
9934418919fSjohnjiang for (i = 0, j = PKT_12; i < (PKT_21 - PKT_12); i++, j++)
9944418919fSjohnjiang if (grp[grp_ind].m[i] != ut_params->obuf[j]) {
9954418919fSjohnjiang rc = TEST_FAILED;
9964418919fSjohnjiang break;
9974418919fSjohnjiang }
9984418919fSjohnjiang } else if (grp_ind == 3) {
9994418919fSjohnjiang for (i = 0, j = PKT_21; i < (BURST_SIZE - PKT_21); i++, j++)
10004418919fSjohnjiang if (grp[grp_ind].m[i] != ut_params->obuf[j]) {
10014418919fSjohnjiang rc = TEST_FAILED;
10024418919fSjohnjiang break;
10034418919fSjohnjiang }
10044418919fSjohnjiang } else
10054418919fSjohnjiang rc = TEST_FAILED;
10064418919fSjohnjiang
10074418919fSjohnjiang return rc;
10084418919fSjohnjiang }
10094418919fSjohnjiang
10104418919fSjohnjiang static uint32_t
crypto_ipsec_4grp_check_cnt(uint32_t grp_ind,struct rte_ipsec_group * grp)10114418919fSjohnjiang crypto_ipsec_4grp_check_cnt(uint32_t grp_ind, struct rte_ipsec_group *grp)
10124418919fSjohnjiang {
10134418919fSjohnjiang uint32_t rc = 0;
10144418919fSjohnjiang
10154418919fSjohnjiang if (grp_ind == 0) {
10164418919fSjohnjiang if (grp[grp_ind].cnt != PKT_4)
10174418919fSjohnjiang rc = TEST_FAILED;
10184418919fSjohnjiang } else if (grp_ind == 1) {
10194418919fSjohnjiang if (grp[grp_ind].cnt != PKT_12 - PKT_4)
10204418919fSjohnjiang rc = TEST_FAILED;
10214418919fSjohnjiang } else if (grp_ind == 2) {
10224418919fSjohnjiang if (grp[grp_ind].cnt != PKT_21 - PKT_12)
10234418919fSjohnjiang rc = TEST_FAILED;
10244418919fSjohnjiang } else if (grp_ind == 3) {
10254418919fSjohnjiang if (grp[grp_ind].cnt != BURST_SIZE - PKT_21)
10264418919fSjohnjiang rc = TEST_FAILED;
10274418919fSjohnjiang } else
10284418919fSjohnjiang rc = TEST_FAILED;
10294418919fSjohnjiang
10304418919fSjohnjiang return rc;
10314418919fSjohnjiang }
10324418919fSjohnjiang
10334418919fSjohnjiang static int
crypto_ipsec_2sa_4grp(void)10344418919fSjohnjiang crypto_ipsec_2sa_4grp(void)
10354418919fSjohnjiang {
10364418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
10374418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
10384418919fSjohnjiang struct rte_ipsec_group grp[BURST_SIZE];
10394418919fSjohnjiang uint32_t k, ng, i, j;
10404418919fSjohnjiang uint32_t rc = 0;
10414418919fSjohnjiang
10424418919fSjohnjiang for (i = 0; i < BURST_SIZE; i++) {
10434418919fSjohnjiang j = crypto_ipsec_4grp(i);
10444418919fSjohnjiang
10454418919fSjohnjiang /* call crypto prepare */
10464418919fSjohnjiang k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[j],
10474418919fSjohnjiang ut_params->ibuf + i, ut_params->cop + i, 1);
10484418919fSjohnjiang if (k != 1) {
10494418919fSjohnjiang RTE_LOG(ERR, USER1,
10504418919fSjohnjiang "rte_ipsec_pkt_crypto_prepare fail\n");
10514418919fSjohnjiang return TEST_FAILED;
10524418919fSjohnjiang }
10534418919fSjohnjiang k = rte_cryptodev_enqueue_burst(ts_params->valid_dev, 0,
10544418919fSjohnjiang ut_params->cop + i, 1);
10554418919fSjohnjiang if (k != 1) {
10564418919fSjohnjiang RTE_LOG(ERR, USER1,
10574418919fSjohnjiang "rte_cryptodev_enqueue_burst fail\n");
10584418919fSjohnjiang return TEST_FAILED;
10594418919fSjohnjiang }
10604418919fSjohnjiang }
10614418919fSjohnjiang
10624418919fSjohnjiang if (crypto_dequeue_burst(BURST_SIZE) == TEST_FAILED)
10634418919fSjohnjiang return TEST_FAILED;
10644418919fSjohnjiang
10654418919fSjohnjiang ng = rte_ipsec_pkt_crypto_group(
10664418919fSjohnjiang (const struct rte_crypto_op **)(uintptr_t)ut_params->cop,
10674418919fSjohnjiang ut_params->obuf, grp, BURST_SIZE);
10684418919fSjohnjiang if (ng != 4) {
10694418919fSjohnjiang RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_group fail ng=%d\n",
10704418919fSjohnjiang ng);
10714418919fSjohnjiang return TEST_FAILED;
10724418919fSjohnjiang }
10734418919fSjohnjiang
10744418919fSjohnjiang /* call crypto process */
10754418919fSjohnjiang for (i = 0; i < ng; i++) {
10764418919fSjohnjiang k = rte_ipsec_pkt_process(grp[i].id.ptr, grp[i].m, grp[i].cnt);
10774418919fSjohnjiang if (k != grp[i].cnt) {
10784418919fSjohnjiang dump_grp_pkt(i, grp, k);
10794418919fSjohnjiang return TEST_FAILED;
10804418919fSjohnjiang }
10814418919fSjohnjiang rc = crypto_ipsec_4grp_check_cnt(i, grp);
10824418919fSjohnjiang if (rc != 0) {
10834418919fSjohnjiang RTE_LOG(ERR, USER1,
10844418919fSjohnjiang "crypto_ipsec_4grp_check_cnt fail\n");
10854418919fSjohnjiang return TEST_FAILED;
10864418919fSjohnjiang }
10874418919fSjohnjiang rc = crypto_ipsec_4grp_check_mbufs(i, grp);
10884418919fSjohnjiang if (rc != 0) {
10894418919fSjohnjiang RTE_LOG(ERR, USER1,
10904418919fSjohnjiang "crypto_ipsec_4grp_check_mbufs fail\n");
10914418919fSjohnjiang return TEST_FAILED;
10924418919fSjohnjiang }
10934418919fSjohnjiang }
10944418919fSjohnjiang return TEST_SUCCESS;
10954418919fSjohnjiang }
10964418919fSjohnjiang
10974418919fSjohnjiang static void
test_ipsec_reorder_inb_pkt_burst(uint16_t num_pkts)10984418919fSjohnjiang test_ipsec_reorder_inb_pkt_burst(uint16_t num_pkts)
10994418919fSjohnjiang {
11004418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
11014418919fSjohnjiang struct rte_mbuf *ibuf_tmp[BURST_SIZE];
11024418919fSjohnjiang uint16_t j;
11034418919fSjohnjiang
11044418919fSjohnjiang /* reorder packets and create gaps in sequence numbers */
11054418919fSjohnjiang static const uint32_t reorder[BURST_SIZE] = {
11064418919fSjohnjiang 24, 25, 26, 27, 28, 29, 30, 31,
11074418919fSjohnjiang 16, 17, 18, 19, 20, 21, 22, 23,
11084418919fSjohnjiang 8, 9, 10, 11, 12, 13, 14, 15,
11094418919fSjohnjiang 0, 1, 2, 3, 4, 5, 6, 7,
11104418919fSjohnjiang };
11114418919fSjohnjiang
11124418919fSjohnjiang if (num_pkts != BURST_SIZE)
11134418919fSjohnjiang return;
11144418919fSjohnjiang
11154418919fSjohnjiang for (j = 0; j != BURST_SIZE; j++)
11164418919fSjohnjiang ibuf_tmp[j] = ut_params->ibuf[reorder[j]];
11174418919fSjohnjiang
11184418919fSjohnjiang memcpy(ut_params->ibuf, ibuf_tmp, sizeof(ut_params->ibuf));
11194418919fSjohnjiang }
11204418919fSjohnjiang
11214418919fSjohnjiang static int
test_ipsec_crypto_op_alloc(uint16_t num_pkts)11224418919fSjohnjiang test_ipsec_crypto_op_alloc(uint16_t num_pkts)
11234418919fSjohnjiang {
11244418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
11254418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
11264418919fSjohnjiang int rc = 0;
11274418919fSjohnjiang uint16_t j;
11284418919fSjohnjiang
11294418919fSjohnjiang for (j = 0; j < num_pkts && rc == 0; j++) {
11304418919fSjohnjiang ut_params->cop[j] = rte_crypto_op_alloc(ts_params->cop_mpool,
11314418919fSjohnjiang RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11324418919fSjohnjiang if (ut_params->cop[j] == NULL) {
11334418919fSjohnjiang RTE_LOG(ERR, USER1,
11344418919fSjohnjiang "Failed to allocate symmetric crypto op\n");
11354418919fSjohnjiang rc = TEST_FAILED;
11364418919fSjohnjiang }
11374418919fSjohnjiang }
11384418919fSjohnjiang
11394418919fSjohnjiang return rc;
11404418919fSjohnjiang }
11414418919fSjohnjiang
11424418919fSjohnjiang static void
test_ipsec_dump_buffers(struct ipsec_unitest_params * ut_params,int i)11434418919fSjohnjiang test_ipsec_dump_buffers(struct ipsec_unitest_params *ut_params, int i)
11444418919fSjohnjiang {
11454418919fSjohnjiang uint16_t j = ut_params->pkt_index;
11464418919fSjohnjiang
11474418919fSjohnjiang printf("\ntest config: num %d\n", i);
11484418919fSjohnjiang printf(" replay_win_sz %u\n", test_cfg[i].replay_win_sz);
11494418919fSjohnjiang printf(" esn %u\n", test_cfg[i].esn);
11504418919fSjohnjiang printf(" flags 0x%" PRIx64 "\n", test_cfg[i].flags);
11514418919fSjohnjiang printf(" pkt_sz %zu\n", test_cfg[i].pkt_sz);
11524418919fSjohnjiang printf(" num_pkts %u\n\n", test_cfg[i].num_pkts);
11534418919fSjohnjiang
11544418919fSjohnjiang if (ut_params->ibuf[j]) {
11554418919fSjohnjiang printf("ibuf[%u] data:\n", j);
11564418919fSjohnjiang rte_pktmbuf_dump(stdout, ut_params->ibuf[j],
11574418919fSjohnjiang ut_params->ibuf[j]->data_len);
11584418919fSjohnjiang }
11594418919fSjohnjiang if (ut_params->obuf[j]) {
11604418919fSjohnjiang printf("obuf[%u] data:\n", j);
11614418919fSjohnjiang rte_pktmbuf_dump(stdout, ut_params->obuf[j],
11624418919fSjohnjiang ut_params->obuf[j]->data_len);
11634418919fSjohnjiang }
11644418919fSjohnjiang if (ut_params->testbuf[j]) {
11654418919fSjohnjiang printf("testbuf[%u] data:\n", j);
11664418919fSjohnjiang rte_pktmbuf_dump(stdout, ut_params->testbuf[j],
11674418919fSjohnjiang ut_params->testbuf[j]->data_len);
11684418919fSjohnjiang }
11694418919fSjohnjiang }
11704418919fSjohnjiang
11714418919fSjohnjiang static void
destroy_dummy_sec_session(struct ipsec_unitest_params * ut,uint32_t j)11720c6bd470Sfengbojiang destroy_dummy_sec_session(struct ipsec_unitest_params *ut,
11730c6bd470Sfengbojiang uint32_t j)
11740c6bd470Sfengbojiang {
11750c6bd470Sfengbojiang rte_security_session_destroy(&dummy_sec_ctx,
11760c6bd470Sfengbojiang ut->ss[j].security.ses);
11770c6bd470Sfengbojiang ut->ss[j].security.ctx = NULL;
11780c6bd470Sfengbojiang }
11790c6bd470Sfengbojiang
11800c6bd470Sfengbojiang static void
destroy_crypto_session(struct ipsec_unitest_params * ut,uint8_t crypto_dev,uint32_t j)11810c6bd470Sfengbojiang destroy_crypto_session(struct ipsec_unitest_params *ut,
11820c6bd470Sfengbojiang uint8_t crypto_dev, uint32_t j)
11830c6bd470Sfengbojiang {
11840c6bd470Sfengbojiang rte_cryptodev_sym_session_clear(crypto_dev, ut->ss[j].crypto.ses);
11850c6bd470Sfengbojiang rte_cryptodev_sym_session_free(ut->ss[j].crypto.ses);
11860c6bd470Sfengbojiang memset(&ut->ss[j], 0, sizeof(ut->ss[j]));
11870c6bd470Sfengbojiang }
11880c6bd470Sfengbojiang
11890c6bd470Sfengbojiang static void
destroy_session(struct ipsec_unitest_params * ut,uint8_t crypto_dev,uint32_t j)11900c6bd470Sfengbojiang destroy_session(struct ipsec_unitest_params *ut,
11910c6bd470Sfengbojiang uint8_t crypto_dev, uint32_t j)
11920c6bd470Sfengbojiang {
11930c6bd470Sfengbojiang if (ut->ss[j].type == RTE_SECURITY_ACTION_TYPE_NONE)
11940c6bd470Sfengbojiang return destroy_crypto_session(ut, crypto_dev, j);
11950c6bd470Sfengbojiang else
11960c6bd470Sfengbojiang return destroy_dummy_sec_session(ut, j);
11970c6bd470Sfengbojiang }
11980c6bd470Sfengbojiang
11990c6bd470Sfengbojiang static void
destroy_sa(uint32_t j)12004418919fSjohnjiang destroy_sa(uint32_t j)
12014418919fSjohnjiang {
12024418919fSjohnjiang struct ipsec_unitest_params *ut = &unittest_params;
12034418919fSjohnjiang struct ipsec_testsuite_params *ts = &testsuite_params;
12044418919fSjohnjiang
12054418919fSjohnjiang rte_ipsec_sa_fini(ut->ss[j].sa);
12064418919fSjohnjiang rte_free(ut->ss[j].sa);
12070c6bd470Sfengbojiang
12080c6bd470Sfengbojiang destroy_session(ut, ts->valid_dev, j);
12094418919fSjohnjiang }
12104418919fSjohnjiang
12114418919fSjohnjiang static int
crypto_inb_burst_null_null_check(struct ipsec_unitest_params * ut_params,int i,uint16_t num_pkts)12124418919fSjohnjiang crypto_inb_burst_null_null_check(struct ipsec_unitest_params *ut_params, int i,
12134418919fSjohnjiang uint16_t num_pkts)
12144418919fSjohnjiang {
12154418919fSjohnjiang uint16_t j;
12164418919fSjohnjiang
12174418919fSjohnjiang for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) {
12184418919fSjohnjiang ut_params->pkt_index = j;
12194418919fSjohnjiang
12204418919fSjohnjiang /* compare the data buffers */
12214418919fSjohnjiang TEST_ASSERT_BUFFERS_ARE_EQUAL(null_plain_data,
12224418919fSjohnjiang rte_pktmbuf_mtod(ut_params->obuf[j], void *),
12234418919fSjohnjiang test_cfg[i].pkt_sz,
12244418919fSjohnjiang "input and output data does not match\n");
12254418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
12264418919fSjohnjiang ut_params->obuf[j]->pkt_len,
12274418919fSjohnjiang "data_len is not equal to pkt_len");
12284418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
12294418919fSjohnjiang test_cfg[i].pkt_sz,
12304418919fSjohnjiang "data_len is not equal to input data");
12314418919fSjohnjiang }
12324418919fSjohnjiang
12334418919fSjohnjiang return 0;
12344418919fSjohnjiang }
12354418919fSjohnjiang
12364418919fSjohnjiang static int
test_ipsec_crypto_inb_burst_null_null(int i)12374418919fSjohnjiang test_ipsec_crypto_inb_burst_null_null(int i)
12384418919fSjohnjiang {
12394418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
12404418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
12414418919fSjohnjiang uint16_t num_pkts = test_cfg[i].num_pkts;
12424418919fSjohnjiang uint16_t j;
12434418919fSjohnjiang int rc;
12444418919fSjohnjiang
12454418919fSjohnjiang /* create rte_ipsec_sa */
12464418919fSjohnjiang rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
12474418919fSjohnjiang test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
12484418919fSjohnjiang if (rc != 0) {
12494418919fSjohnjiang RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
12504418919fSjohnjiang return TEST_FAILED;
12514418919fSjohnjiang }
12524418919fSjohnjiang
12534418919fSjohnjiang /* Generate test mbuf data */
12544418919fSjohnjiang for (j = 0; j < num_pkts && rc == 0; j++) {
12554418919fSjohnjiang /* packet with sequence number 0 is invalid */
12564418919fSjohnjiang ut_params->ibuf[j] = setup_test_string_tunneled(
12574418919fSjohnjiang ts_params->mbuf_pool, null_encrypted_data,
12584418919fSjohnjiang test_cfg[i].pkt_sz, INBOUND_SPI, j + 1);
12594418919fSjohnjiang if (ut_params->ibuf[j] == NULL)
12604418919fSjohnjiang rc = TEST_FAILED;
12614418919fSjohnjiang }
12624418919fSjohnjiang
12634418919fSjohnjiang if (rc == 0) {
12644418919fSjohnjiang if (test_cfg[i].reorder_pkts)
12654418919fSjohnjiang test_ipsec_reorder_inb_pkt_burst(num_pkts);
12664418919fSjohnjiang rc = test_ipsec_crypto_op_alloc(num_pkts);
12674418919fSjohnjiang }
12684418919fSjohnjiang
12694418919fSjohnjiang if (rc == 0) {
12704418919fSjohnjiang /* call ipsec library api */
12714418919fSjohnjiang rc = crypto_ipsec(num_pkts);
12724418919fSjohnjiang if (rc == 0)
12734418919fSjohnjiang rc = crypto_inb_burst_null_null_check(
12744418919fSjohnjiang ut_params, i, num_pkts);
12754418919fSjohnjiang else {
12764418919fSjohnjiang RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
12774418919fSjohnjiang i);
12784418919fSjohnjiang rc = TEST_FAILED;
12794418919fSjohnjiang }
12804418919fSjohnjiang }
12814418919fSjohnjiang
12824418919fSjohnjiang if (rc == TEST_FAILED)
12834418919fSjohnjiang test_ipsec_dump_buffers(ut_params, i);
12844418919fSjohnjiang
12854418919fSjohnjiang destroy_sa(0);
12864418919fSjohnjiang return rc;
12874418919fSjohnjiang }
12884418919fSjohnjiang
12894418919fSjohnjiang static int
test_ipsec_crypto_inb_burst_null_null_wrapper(void)12904418919fSjohnjiang test_ipsec_crypto_inb_burst_null_null_wrapper(void)
12914418919fSjohnjiang {
12924418919fSjohnjiang int i;
12934418919fSjohnjiang int rc = 0;
12944418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
12954418919fSjohnjiang
12964418919fSjohnjiang ut_params->ipsec_xform.spi = INBOUND_SPI;
12974418919fSjohnjiang ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
12984418919fSjohnjiang ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
12994418919fSjohnjiang ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
13004418919fSjohnjiang ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
13014418919fSjohnjiang
13024418919fSjohnjiang for (i = 0; i < num_cfg && rc == 0; i++) {
13034418919fSjohnjiang ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
13044418919fSjohnjiang rc = test_ipsec_crypto_inb_burst_null_null(i);
13054418919fSjohnjiang }
13064418919fSjohnjiang
13074418919fSjohnjiang return rc;
13084418919fSjohnjiang }
13094418919fSjohnjiang
13104418919fSjohnjiang static int
crypto_outb_burst_null_null_check(struct ipsec_unitest_params * ut_params,uint16_t num_pkts)13114418919fSjohnjiang crypto_outb_burst_null_null_check(struct ipsec_unitest_params *ut_params,
13124418919fSjohnjiang uint16_t num_pkts)
13134418919fSjohnjiang {
13144418919fSjohnjiang void *obuf_data;
13154418919fSjohnjiang void *testbuf_data;
13164418919fSjohnjiang uint16_t j;
13174418919fSjohnjiang
13184418919fSjohnjiang for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) {
13194418919fSjohnjiang ut_params->pkt_index = j;
13204418919fSjohnjiang
13214418919fSjohnjiang testbuf_data = rte_pktmbuf_mtod(ut_params->testbuf[j], void *);
13224418919fSjohnjiang obuf_data = rte_pktmbuf_mtod(ut_params->obuf[j], void *);
13234418919fSjohnjiang /* compare the buffer data */
13244418919fSjohnjiang TEST_ASSERT_BUFFERS_ARE_EQUAL(testbuf_data, obuf_data,
13254418919fSjohnjiang ut_params->obuf[j]->pkt_len,
13264418919fSjohnjiang "test and output data does not match\n");
13274418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
13284418919fSjohnjiang ut_params->testbuf[j]->data_len,
13294418919fSjohnjiang "obuf data_len is not equal to testbuf data_len");
13304418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->obuf[j]->pkt_len,
13314418919fSjohnjiang ut_params->testbuf[j]->pkt_len,
13324418919fSjohnjiang "obuf pkt_len is not equal to testbuf pkt_len");
13334418919fSjohnjiang }
13344418919fSjohnjiang
13354418919fSjohnjiang return 0;
13364418919fSjohnjiang }
13374418919fSjohnjiang
13384418919fSjohnjiang static int
test_ipsec_crypto_outb_burst_null_null(int i)13394418919fSjohnjiang test_ipsec_crypto_outb_burst_null_null(int i)
13404418919fSjohnjiang {
13414418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
13424418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
13434418919fSjohnjiang uint16_t num_pkts = test_cfg[i].num_pkts;
13444418919fSjohnjiang uint16_t j;
13454418919fSjohnjiang int32_t rc;
13464418919fSjohnjiang
13474418919fSjohnjiang /* create rte_ipsec_sa*/
13484418919fSjohnjiang rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
13494418919fSjohnjiang test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
13504418919fSjohnjiang if (rc != 0) {
13514418919fSjohnjiang RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
13524418919fSjohnjiang return TEST_FAILED;
13534418919fSjohnjiang }
13544418919fSjohnjiang
13554418919fSjohnjiang /* Generate input mbuf data */
13564418919fSjohnjiang for (j = 0; j < num_pkts && rc == 0; j++) {
13574418919fSjohnjiang ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool,
13584418919fSjohnjiang null_plain_data, test_cfg[i].pkt_sz, 0);
13594418919fSjohnjiang if (ut_params->ibuf[j] == NULL)
13604418919fSjohnjiang rc = TEST_FAILED;
13614418919fSjohnjiang else {
13624418919fSjohnjiang /* Generate test mbuf data */
13634418919fSjohnjiang /* packet with sequence number 0 is invalid */
13644418919fSjohnjiang ut_params->testbuf[j] = setup_test_string_tunneled(
13654418919fSjohnjiang ts_params->mbuf_pool,
13664418919fSjohnjiang null_plain_data, test_cfg[i].pkt_sz,
13674418919fSjohnjiang OUTBOUND_SPI, j + 1);
13684418919fSjohnjiang if (ut_params->testbuf[j] == NULL)
13694418919fSjohnjiang rc = TEST_FAILED;
13704418919fSjohnjiang }
13714418919fSjohnjiang }
13724418919fSjohnjiang
13734418919fSjohnjiang if (rc == 0)
13744418919fSjohnjiang rc = test_ipsec_crypto_op_alloc(num_pkts);
13754418919fSjohnjiang
13764418919fSjohnjiang if (rc == 0) {
13774418919fSjohnjiang /* call ipsec library api */
13784418919fSjohnjiang rc = crypto_ipsec(num_pkts);
13794418919fSjohnjiang if (rc == 0)
13804418919fSjohnjiang rc = crypto_outb_burst_null_null_check(ut_params,
13814418919fSjohnjiang num_pkts);
13824418919fSjohnjiang else
13834418919fSjohnjiang RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
13844418919fSjohnjiang i);
13854418919fSjohnjiang }
13864418919fSjohnjiang
13874418919fSjohnjiang if (rc == TEST_FAILED)
13884418919fSjohnjiang test_ipsec_dump_buffers(ut_params, i);
13894418919fSjohnjiang
13904418919fSjohnjiang destroy_sa(0);
13914418919fSjohnjiang return rc;
13924418919fSjohnjiang }
13934418919fSjohnjiang
13944418919fSjohnjiang static int
test_ipsec_crypto_outb_burst_null_null_wrapper(void)13954418919fSjohnjiang test_ipsec_crypto_outb_burst_null_null_wrapper(void)
13964418919fSjohnjiang {
13974418919fSjohnjiang int i;
13984418919fSjohnjiang int rc = 0;
13994418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
14004418919fSjohnjiang
14014418919fSjohnjiang ut_params->ipsec_xform.spi = OUTBOUND_SPI;
14024418919fSjohnjiang ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS;
14034418919fSjohnjiang ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
14044418919fSjohnjiang ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
14054418919fSjohnjiang ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
14064418919fSjohnjiang
14074418919fSjohnjiang for (i = 0; i < num_cfg && rc == 0; i++) {
14084418919fSjohnjiang ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
14094418919fSjohnjiang rc = test_ipsec_crypto_outb_burst_null_null(i);
14104418919fSjohnjiang }
14114418919fSjohnjiang
14124418919fSjohnjiang return rc;
14134418919fSjohnjiang }
14144418919fSjohnjiang
14154418919fSjohnjiang static int
inline_inb_burst_null_null_check(struct ipsec_unitest_params * ut_params,int i,uint16_t num_pkts)14164418919fSjohnjiang inline_inb_burst_null_null_check(struct ipsec_unitest_params *ut_params, int i,
14174418919fSjohnjiang uint16_t num_pkts)
14184418919fSjohnjiang {
14194418919fSjohnjiang void *ibuf_data;
14204418919fSjohnjiang void *obuf_data;
14214418919fSjohnjiang uint16_t j;
14224418919fSjohnjiang
14234418919fSjohnjiang for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) {
14244418919fSjohnjiang ut_params->pkt_index = j;
14254418919fSjohnjiang
14264418919fSjohnjiang /* compare the buffer data */
14274418919fSjohnjiang ibuf_data = rte_pktmbuf_mtod(ut_params->ibuf[j], void *);
14284418919fSjohnjiang obuf_data = rte_pktmbuf_mtod(ut_params->obuf[j], void *);
14294418919fSjohnjiang
14304418919fSjohnjiang TEST_ASSERT_BUFFERS_ARE_EQUAL(ibuf_data, obuf_data,
14314418919fSjohnjiang ut_params->ibuf[j]->data_len,
14324418919fSjohnjiang "input and output data does not match\n");
14334418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->ibuf[j]->data_len,
14344418919fSjohnjiang ut_params->obuf[j]->data_len,
14354418919fSjohnjiang "ibuf data_len is not equal to obuf data_len");
14364418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->ibuf[j]->pkt_len,
14374418919fSjohnjiang ut_params->obuf[j]->pkt_len,
14384418919fSjohnjiang "ibuf pkt_len is not equal to obuf pkt_len");
14394418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->ibuf[j]->data_len,
14404418919fSjohnjiang test_cfg[i].pkt_sz,
14414418919fSjohnjiang "data_len is not equal input data");
14424418919fSjohnjiang }
14434418919fSjohnjiang return 0;
14444418919fSjohnjiang }
14454418919fSjohnjiang
14464418919fSjohnjiang static int
test_ipsec_inline_crypto_inb_burst_null_null(int i)14474418919fSjohnjiang test_ipsec_inline_crypto_inb_burst_null_null(int i)
14484418919fSjohnjiang {
14494418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
14504418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
14514418919fSjohnjiang uint16_t num_pkts = test_cfg[i].num_pkts;
14524418919fSjohnjiang uint16_t j;
14534418919fSjohnjiang int32_t rc;
14544418919fSjohnjiang uint32_t n;
14554418919fSjohnjiang
14564418919fSjohnjiang /* create rte_ipsec_sa*/
14574418919fSjohnjiang rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO,
14584418919fSjohnjiang test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
14594418919fSjohnjiang if (rc != 0) {
14604418919fSjohnjiang RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
14614418919fSjohnjiang return TEST_FAILED;
14624418919fSjohnjiang }
14634418919fSjohnjiang
14644418919fSjohnjiang /* Generate inbound mbuf data */
14654418919fSjohnjiang for (j = 0; j < num_pkts && rc == 0; j++) {
14664418919fSjohnjiang ut_params->ibuf[j] = setup_test_string_tunneled(
14674418919fSjohnjiang ts_params->mbuf_pool,
14684418919fSjohnjiang null_plain_data, test_cfg[i].pkt_sz,
14694418919fSjohnjiang INBOUND_SPI, j + 1);
14704418919fSjohnjiang if (ut_params->ibuf[j] == NULL)
14714418919fSjohnjiang rc = TEST_FAILED;
14724418919fSjohnjiang else {
14734418919fSjohnjiang /* Generate test mbuf data */
14744418919fSjohnjiang ut_params->obuf[j] = setup_test_string(
14754418919fSjohnjiang ts_params->mbuf_pool,
14764418919fSjohnjiang null_plain_data, test_cfg[i].pkt_sz, 0);
14774418919fSjohnjiang if (ut_params->obuf[j] == NULL)
14784418919fSjohnjiang rc = TEST_FAILED;
14794418919fSjohnjiang }
14804418919fSjohnjiang }
14814418919fSjohnjiang
14824418919fSjohnjiang if (rc == 0) {
14834418919fSjohnjiang n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf,
14844418919fSjohnjiang num_pkts);
14854418919fSjohnjiang if (n == num_pkts)
14864418919fSjohnjiang rc = inline_inb_burst_null_null_check(ut_params, i,
14874418919fSjohnjiang num_pkts);
14884418919fSjohnjiang else {
14894418919fSjohnjiang RTE_LOG(ERR, USER1,
14904418919fSjohnjiang "rte_ipsec_pkt_process failed, cfg %d\n",
14914418919fSjohnjiang i);
14924418919fSjohnjiang rc = TEST_FAILED;
14934418919fSjohnjiang }
14944418919fSjohnjiang }
14954418919fSjohnjiang
14964418919fSjohnjiang if (rc == TEST_FAILED)
14974418919fSjohnjiang test_ipsec_dump_buffers(ut_params, i);
14984418919fSjohnjiang
14994418919fSjohnjiang destroy_sa(0);
15004418919fSjohnjiang return rc;
15014418919fSjohnjiang }
15024418919fSjohnjiang
15034418919fSjohnjiang static int
test_ipsec_inline_crypto_inb_burst_null_null_wrapper(void)15044418919fSjohnjiang test_ipsec_inline_crypto_inb_burst_null_null_wrapper(void)
15054418919fSjohnjiang {
15064418919fSjohnjiang int i;
15074418919fSjohnjiang int rc = 0;
15084418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
15094418919fSjohnjiang
15104418919fSjohnjiang ut_params->ipsec_xform.spi = INBOUND_SPI;
15114418919fSjohnjiang ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
15124418919fSjohnjiang ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
15134418919fSjohnjiang ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
15144418919fSjohnjiang ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
15154418919fSjohnjiang
15164418919fSjohnjiang for (i = 0; i < num_cfg && rc == 0; i++) {
15174418919fSjohnjiang ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
15184418919fSjohnjiang rc = test_ipsec_inline_crypto_inb_burst_null_null(i);
15194418919fSjohnjiang }
15204418919fSjohnjiang
15214418919fSjohnjiang return rc;
15224418919fSjohnjiang }
15234418919fSjohnjiang
15244418919fSjohnjiang static int
test_ipsec_inline_proto_inb_burst_null_null(int i)15254418919fSjohnjiang test_ipsec_inline_proto_inb_burst_null_null(int i)
15264418919fSjohnjiang {
15274418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
15284418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
15294418919fSjohnjiang uint16_t num_pkts = test_cfg[i].num_pkts;
15304418919fSjohnjiang uint16_t j;
15314418919fSjohnjiang int32_t rc;
15324418919fSjohnjiang uint32_t n;
15334418919fSjohnjiang
15344418919fSjohnjiang /* create rte_ipsec_sa*/
15354418919fSjohnjiang rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL,
15364418919fSjohnjiang test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
15374418919fSjohnjiang if (rc != 0) {
15384418919fSjohnjiang RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
15394418919fSjohnjiang return TEST_FAILED;
15404418919fSjohnjiang }
15414418919fSjohnjiang
15424418919fSjohnjiang /* Generate inbound mbuf data */
15434418919fSjohnjiang for (j = 0; j < num_pkts && rc == 0; j++) {
15444418919fSjohnjiang ut_params->ibuf[j] = setup_test_string(
15454418919fSjohnjiang ts_params->mbuf_pool,
15464418919fSjohnjiang null_plain_data, test_cfg[i].pkt_sz, 0);
15474418919fSjohnjiang if (ut_params->ibuf[j] == NULL)
15484418919fSjohnjiang rc = TEST_FAILED;
15494418919fSjohnjiang else {
15504418919fSjohnjiang /* Generate test mbuf data */
15514418919fSjohnjiang ut_params->obuf[j] = setup_test_string(
15524418919fSjohnjiang ts_params->mbuf_pool,
15534418919fSjohnjiang null_plain_data, test_cfg[i].pkt_sz, 0);
15544418919fSjohnjiang if (ut_params->obuf[j] == NULL)
15554418919fSjohnjiang rc = TEST_FAILED;
15564418919fSjohnjiang }
15574418919fSjohnjiang }
15584418919fSjohnjiang
15594418919fSjohnjiang if (rc == 0) {
15604418919fSjohnjiang n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf,
15614418919fSjohnjiang num_pkts);
15624418919fSjohnjiang if (n == num_pkts)
15634418919fSjohnjiang rc = inline_inb_burst_null_null_check(ut_params, i,
15644418919fSjohnjiang num_pkts);
15654418919fSjohnjiang else {
15664418919fSjohnjiang RTE_LOG(ERR, USER1,
15674418919fSjohnjiang "rte_ipsec_pkt_process failed, cfg %d\n",
15684418919fSjohnjiang i);
15694418919fSjohnjiang rc = TEST_FAILED;
15704418919fSjohnjiang }
15714418919fSjohnjiang }
15724418919fSjohnjiang
15734418919fSjohnjiang if (rc == TEST_FAILED)
15744418919fSjohnjiang test_ipsec_dump_buffers(ut_params, i);
15754418919fSjohnjiang
15764418919fSjohnjiang destroy_sa(0);
15774418919fSjohnjiang return rc;
15784418919fSjohnjiang }
15794418919fSjohnjiang
15804418919fSjohnjiang static int
test_ipsec_inline_proto_inb_burst_null_null_wrapper(void)15814418919fSjohnjiang test_ipsec_inline_proto_inb_burst_null_null_wrapper(void)
15824418919fSjohnjiang {
15834418919fSjohnjiang int i;
15844418919fSjohnjiang int rc = 0;
15854418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
15864418919fSjohnjiang
15874418919fSjohnjiang ut_params->ipsec_xform.spi = INBOUND_SPI;
15884418919fSjohnjiang ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
15894418919fSjohnjiang ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
15904418919fSjohnjiang ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
15914418919fSjohnjiang ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
15924418919fSjohnjiang
15934418919fSjohnjiang for (i = 0; i < num_cfg && rc == 0; i++) {
15944418919fSjohnjiang ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
15954418919fSjohnjiang rc = test_ipsec_inline_proto_inb_burst_null_null(i);
15964418919fSjohnjiang }
15974418919fSjohnjiang
15984418919fSjohnjiang return rc;
15994418919fSjohnjiang }
16004418919fSjohnjiang
16014418919fSjohnjiang static int
inline_outb_burst_null_null_check(struct ipsec_unitest_params * ut_params,uint16_t num_pkts)16024418919fSjohnjiang inline_outb_burst_null_null_check(struct ipsec_unitest_params *ut_params,
16034418919fSjohnjiang uint16_t num_pkts)
16044418919fSjohnjiang {
16054418919fSjohnjiang void *obuf_data;
16064418919fSjohnjiang void *ibuf_data;
16074418919fSjohnjiang uint16_t j;
16084418919fSjohnjiang
16094418919fSjohnjiang for (j = 0; j < num_pkts && num_pkts <= BURST_SIZE; j++) {
16104418919fSjohnjiang ut_params->pkt_index = j;
16114418919fSjohnjiang
16124418919fSjohnjiang /* compare the buffer data */
16134418919fSjohnjiang ibuf_data = rte_pktmbuf_mtod(ut_params->ibuf[j], void *);
16144418919fSjohnjiang obuf_data = rte_pktmbuf_mtod(ut_params->obuf[j], void *);
16154418919fSjohnjiang TEST_ASSERT_BUFFERS_ARE_EQUAL(ibuf_data, obuf_data,
16164418919fSjohnjiang ut_params->ibuf[j]->data_len,
16174418919fSjohnjiang "input and output data does not match\n");
16184418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->ibuf[j]->data_len,
16194418919fSjohnjiang ut_params->obuf[j]->data_len,
16204418919fSjohnjiang "ibuf data_len is not equal to obuf data_len");
16214418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->ibuf[j]->pkt_len,
16224418919fSjohnjiang ut_params->obuf[j]->pkt_len,
16234418919fSjohnjiang "ibuf pkt_len is not equal to obuf pkt_len");
16244418919fSjohnjiang
16254418919fSjohnjiang /* check mbuf ol_flags */
16264418919fSjohnjiang TEST_ASSERT(ut_params->ibuf[j]->ol_flags & PKT_TX_SEC_OFFLOAD,
16274418919fSjohnjiang "ibuf PKT_TX_SEC_OFFLOAD is not set");
16284418919fSjohnjiang }
16294418919fSjohnjiang return 0;
16304418919fSjohnjiang }
16314418919fSjohnjiang
16324418919fSjohnjiang static int
test_ipsec_inline_crypto_outb_burst_null_null(int i)16334418919fSjohnjiang test_ipsec_inline_crypto_outb_burst_null_null(int i)
16344418919fSjohnjiang {
16354418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
16364418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
16374418919fSjohnjiang uint16_t num_pkts = test_cfg[i].num_pkts;
16384418919fSjohnjiang uint16_t j;
16394418919fSjohnjiang int32_t rc;
16404418919fSjohnjiang uint32_t n;
16414418919fSjohnjiang
16424418919fSjohnjiang /* create rte_ipsec_sa */
16434418919fSjohnjiang rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO,
16444418919fSjohnjiang test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
16454418919fSjohnjiang if (rc != 0) {
16464418919fSjohnjiang RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
16474418919fSjohnjiang return TEST_FAILED;
16484418919fSjohnjiang }
16494418919fSjohnjiang
16504418919fSjohnjiang /* Generate test mbuf data */
16514418919fSjohnjiang for (j = 0; j < num_pkts && rc == 0; j++) {
16524418919fSjohnjiang ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool,
16534418919fSjohnjiang null_plain_data, test_cfg[i].pkt_sz, 0);
16544418919fSjohnjiang if (ut_params->ibuf[0] == NULL)
16554418919fSjohnjiang rc = TEST_FAILED;
16564418919fSjohnjiang
16574418919fSjohnjiang if (rc == 0) {
16584418919fSjohnjiang /* Generate test tunneled mbuf data for comparison */
16594418919fSjohnjiang ut_params->obuf[j] = setup_test_string_tunneled(
16604418919fSjohnjiang ts_params->mbuf_pool,
16614418919fSjohnjiang null_plain_data, test_cfg[i].pkt_sz,
16624418919fSjohnjiang OUTBOUND_SPI, j + 1);
16634418919fSjohnjiang if (ut_params->obuf[j] == NULL)
16644418919fSjohnjiang rc = TEST_FAILED;
16654418919fSjohnjiang }
16664418919fSjohnjiang }
16674418919fSjohnjiang
16684418919fSjohnjiang if (rc == 0) {
16694418919fSjohnjiang n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf,
16704418919fSjohnjiang num_pkts);
16714418919fSjohnjiang if (n == num_pkts)
16724418919fSjohnjiang rc = inline_outb_burst_null_null_check(ut_params,
16734418919fSjohnjiang num_pkts);
16744418919fSjohnjiang else {
16754418919fSjohnjiang RTE_LOG(ERR, USER1,
16764418919fSjohnjiang "rte_ipsec_pkt_process failed, cfg %d\n",
16774418919fSjohnjiang i);
16784418919fSjohnjiang rc = TEST_FAILED;
16794418919fSjohnjiang }
16804418919fSjohnjiang }
16814418919fSjohnjiang
16824418919fSjohnjiang if (rc == TEST_FAILED)
16834418919fSjohnjiang test_ipsec_dump_buffers(ut_params, i);
16844418919fSjohnjiang
16854418919fSjohnjiang destroy_sa(0);
16864418919fSjohnjiang return rc;
16874418919fSjohnjiang }
16884418919fSjohnjiang
16894418919fSjohnjiang static int
test_ipsec_inline_crypto_outb_burst_null_null_wrapper(void)16904418919fSjohnjiang test_ipsec_inline_crypto_outb_burst_null_null_wrapper(void)
16914418919fSjohnjiang {
16924418919fSjohnjiang int i;
16934418919fSjohnjiang int rc = 0;
16944418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
16954418919fSjohnjiang
16964418919fSjohnjiang ut_params->ipsec_xform.spi = OUTBOUND_SPI;
16974418919fSjohnjiang ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS;
16984418919fSjohnjiang ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
16994418919fSjohnjiang ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
17004418919fSjohnjiang ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
17014418919fSjohnjiang
17024418919fSjohnjiang for (i = 0; i < num_cfg && rc == 0; i++) {
17034418919fSjohnjiang ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
17044418919fSjohnjiang rc = test_ipsec_inline_crypto_outb_burst_null_null(i);
17054418919fSjohnjiang }
17064418919fSjohnjiang
17074418919fSjohnjiang return rc;
17084418919fSjohnjiang }
17094418919fSjohnjiang
17104418919fSjohnjiang static int
test_ipsec_inline_proto_outb_burst_null_null(int i)17114418919fSjohnjiang test_ipsec_inline_proto_outb_burst_null_null(int i)
17124418919fSjohnjiang {
17134418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
17144418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
17154418919fSjohnjiang uint16_t num_pkts = test_cfg[i].num_pkts;
17164418919fSjohnjiang uint16_t j;
17174418919fSjohnjiang int32_t rc;
17184418919fSjohnjiang uint32_t n;
17194418919fSjohnjiang
17204418919fSjohnjiang /* create rte_ipsec_sa */
17214418919fSjohnjiang rc = create_sa(RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL,
17224418919fSjohnjiang test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
17234418919fSjohnjiang if (rc != 0) {
17244418919fSjohnjiang RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
17254418919fSjohnjiang return TEST_FAILED;
17264418919fSjohnjiang }
17274418919fSjohnjiang
17284418919fSjohnjiang /* Generate test mbuf data */
17294418919fSjohnjiang for (j = 0; j < num_pkts && rc == 0; j++) {
17304418919fSjohnjiang ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool,
17314418919fSjohnjiang null_plain_data, test_cfg[i].pkt_sz, 0);
17324418919fSjohnjiang if (ut_params->ibuf[0] == NULL)
17334418919fSjohnjiang rc = TEST_FAILED;
17344418919fSjohnjiang
17354418919fSjohnjiang if (rc == 0) {
17364418919fSjohnjiang /* Generate test tunneled mbuf data for comparison */
17374418919fSjohnjiang ut_params->obuf[j] = setup_test_string(
17384418919fSjohnjiang ts_params->mbuf_pool,
17394418919fSjohnjiang null_plain_data, test_cfg[i].pkt_sz, 0);
17404418919fSjohnjiang if (ut_params->obuf[j] == NULL)
17414418919fSjohnjiang rc = TEST_FAILED;
17424418919fSjohnjiang }
17434418919fSjohnjiang }
17444418919fSjohnjiang
17454418919fSjohnjiang if (rc == 0) {
17464418919fSjohnjiang n = rte_ipsec_pkt_process(&ut_params->ss[0], ut_params->ibuf,
17474418919fSjohnjiang num_pkts);
17484418919fSjohnjiang if (n == num_pkts)
17494418919fSjohnjiang rc = inline_outb_burst_null_null_check(ut_params,
17504418919fSjohnjiang num_pkts);
17514418919fSjohnjiang else {
17524418919fSjohnjiang RTE_LOG(ERR, USER1,
17534418919fSjohnjiang "rte_ipsec_pkt_process failed, cfg %d\n",
17544418919fSjohnjiang i);
17554418919fSjohnjiang rc = TEST_FAILED;
17564418919fSjohnjiang }
17574418919fSjohnjiang }
17584418919fSjohnjiang
17594418919fSjohnjiang if (rc == TEST_FAILED)
17604418919fSjohnjiang test_ipsec_dump_buffers(ut_params, i);
17614418919fSjohnjiang
17624418919fSjohnjiang destroy_sa(0);
17634418919fSjohnjiang return rc;
17644418919fSjohnjiang }
17654418919fSjohnjiang
17664418919fSjohnjiang static int
test_ipsec_inline_proto_outb_burst_null_null_wrapper(void)17674418919fSjohnjiang test_ipsec_inline_proto_outb_burst_null_null_wrapper(void)
17684418919fSjohnjiang {
17694418919fSjohnjiang int i;
17704418919fSjohnjiang int rc = 0;
17714418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
17724418919fSjohnjiang
17734418919fSjohnjiang ut_params->ipsec_xform.spi = OUTBOUND_SPI;
17744418919fSjohnjiang ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS;
17754418919fSjohnjiang ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
17764418919fSjohnjiang ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
17774418919fSjohnjiang ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
17784418919fSjohnjiang
17794418919fSjohnjiang for (i = 0; i < num_cfg && rc == 0; i++) {
17804418919fSjohnjiang ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
17814418919fSjohnjiang rc = test_ipsec_inline_proto_outb_burst_null_null(i);
17824418919fSjohnjiang }
17834418919fSjohnjiang
17844418919fSjohnjiang return rc;
17854418919fSjohnjiang }
17864418919fSjohnjiang
17874418919fSjohnjiang static int
test_ipsec_lksd_proto_inb_burst_null_null(int i)17884418919fSjohnjiang test_ipsec_lksd_proto_inb_burst_null_null(int i)
17894418919fSjohnjiang {
17904418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
17914418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
17924418919fSjohnjiang uint16_t num_pkts = test_cfg[i].num_pkts;
17934418919fSjohnjiang uint16_t j;
17944418919fSjohnjiang int rc;
17954418919fSjohnjiang
17964418919fSjohnjiang /* create rte_ipsec_sa */
17974418919fSjohnjiang rc = create_sa(RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
17984418919fSjohnjiang test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
17994418919fSjohnjiang if (rc != 0) {
18004418919fSjohnjiang RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
18014418919fSjohnjiang return TEST_FAILED;
18024418919fSjohnjiang }
18034418919fSjohnjiang
18044418919fSjohnjiang /* Generate test mbuf data */
18054418919fSjohnjiang for (j = 0; j < num_pkts && rc == 0; j++) {
18064418919fSjohnjiang /* packet with sequence number 0 is invalid */
18074418919fSjohnjiang ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool,
18084418919fSjohnjiang null_encrypted_data, test_cfg[i].pkt_sz, 0);
18094418919fSjohnjiang if (ut_params->ibuf[j] == NULL)
18104418919fSjohnjiang rc = TEST_FAILED;
18114418919fSjohnjiang }
18124418919fSjohnjiang
18134418919fSjohnjiang if (rc == 0) {
18144418919fSjohnjiang if (test_cfg[i].reorder_pkts)
18154418919fSjohnjiang test_ipsec_reorder_inb_pkt_burst(num_pkts);
18164418919fSjohnjiang rc = test_ipsec_crypto_op_alloc(num_pkts);
18174418919fSjohnjiang }
18184418919fSjohnjiang
18194418919fSjohnjiang if (rc == 0) {
18204418919fSjohnjiang /* call ipsec library api */
18214418919fSjohnjiang rc = lksd_proto_ipsec(num_pkts);
18224418919fSjohnjiang if (rc == 0)
18234418919fSjohnjiang rc = crypto_inb_burst_null_null_check(ut_params, i,
18244418919fSjohnjiang num_pkts);
18254418919fSjohnjiang else {
18264418919fSjohnjiang RTE_LOG(ERR, USER1, "%s failed, cfg %d\n",
18274418919fSjohnjiang __func__, i);
18284418919fSjohnjiang rc = TEST_FAILED;
18294418919fSjohnjiang }
18304418919fSjohnjiang }
18314418919fSjohnjiang
18324418919fSjohnjiang if (rc == TEST_FAILED)
18334418919fSjohnjiang test_ipsec_dump_buffers(ut_params, i);
18344418919fSjohnjiang
18354418919fSjohnjiang destroy_sa(0);
18364418919fSjohnjiang return rc;
18374418919fSjohnjiang }
18384418919fSjohnjiang
18394418919fSjohnjiang static int
test_ipsec_lksd_proto_inb_burst_null_null_wrapper(void)18404418919fSjohnjiang test_ipsec_lksd_proto_inb_burst_null_null_wrapper(void)
18414418919fSjohnjiang {
18424418919fSjohnjiang int i;
18434418919fSjohnjiang int rc = 0;
18444418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
18454418919fSjohnjiang
18464418919fSjohnjiang ut_params->ipsec_xform.spi = INBOUND_SPI;
18474418919fSjohnjiang ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
18484418919fSjohnjiang ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
18494418919fSjohnjiang ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
18504418919fSjohnjiang ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
18514418919fSjohnjiang
18524418919fSjohnjiang for (i = 0; i < num_cfg && rc == 0; i++) {
18534418919fSjohnjiang ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
18544418919fSjohnjiang rc = test_ipsec_lksd_proto_inb_burst_null_null(i);
18554418919fSjohnjiang }
18564418919fSjohnjiang
18574418919fSjohnjiang return rc;
18584418919fSjohnjiang }
18594418919fSjohnjiang
18604418919fSjohnjiang static int
test_ipsec_lksd_proto_outb_burst_null_null_wrapper(void)18614418919fSjohnjiang test_ipsec_lksd_proto_outb_burst_null_null_wrapper(void)
18624418919fSjohnjiang {
18634418919fSjohnjiang int i;
18644418919fSjohnjiang int rc = 0;
18654418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
18664418919fSjohnjiang
18674418919fSjohnjiang ut_params->ipsec_xform.spi = INBOUND_SPI;
18684418919fSjohnjiang ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS;
18694418919fSjohnjiang ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
18704418919fSjohnjiang ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
18714418919fSjohnjiang ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
18724418919fSjohnjiang
18734418919fSjohnjiang for (i = 0; i < num_cfg && rc == 0; i++) {
18744418919fSjohnjiang ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
18754418919fSjohnjiang rc = test_ipsec_lksd_proto_inb_burst_null_null(i);
18764418919fSjohnjiang }
18774418919fSjohnjiang
18784418919fSjohnjiang return rc;
18794418919fSjohnjiang }
18804418919fSjohnjiang
18814418919fSjohnjiang static int
replay_inb_null_null_check(struct ipsec_unitest_params * ut_params,int i,int num_pkts)18824418919fSjohnjiang replay_inb_null_null_check(struct ipsec_unitest_params *ut_params, int i,
18834418919fSjohnjiang int num_pkts)
18844418919fSjohnjiang {
18854418919fSjohnjiang uint16_t j;
18864418919fSjohnjiang
18874418919fSjohnjiang for (j = 0; j < num_pkts; j++) {
18884418919fSjohnjiang /* compare the buffer data */
18894418919fSjohnjiang TEST_ASSERT_BUFFERS_ARE_EQUAL(null_plain_data,
18904418919fSjohnjiang rte_pktmbuf_mtod(ut_params->obuf[j], void *),
18914418919fSjohnjiang test_cfg[i].pkt_sz,
18924418919fSjohnjiang "input and output data does not match\n");
18934418919fSjohnjiang
18944418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
18954418919fSjohnjiang ut_params->obuf[j]->pkt_len,
18964418919fSjohnjiang "data_len is not equal to pkt_len");
18974418919fSjohnjiang }
18984418919fSjohnjiang
18994418919fSjohnjiang return 0;
19004418919fSjohnjiang }
19014418919fSjohnjiang
19024418919fSjohnjiang static int
test_ipsec_replay_inb_inside_null_null(int i)19034418919fSjohnjiang test_ipsec_replay_inb_inside_null_null(int i)
19044418919fSjohnjiang {
19054418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
19064418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
19074418919fSjohnjiang int rc;
19084418919fSjohnjiang
19094418919fSjohnjiang /* create rte_ipsec_sa*/
19104418919fSjohnjiang rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
19114418919fSjohnjiang test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
19124418919fSjohnjiang if (rc != 0) {
19134418919fSjohnjiang RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
19144418919fSjohnjiang return TEST_FAILED;
19154418919fSjohnjiang }
19164418919fSjohnjiang
19174418919fSjohnjiang /* Generate inbound mbuf data */
19184418919fSjohnjiang ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool,
19194418919fSjohnjiang null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI, 1);
19204418919fSjohnjiang if (ut_params->ibuf[0] == NULL)
19214418919fSjohnjiang rc = TEST_FAILED;
19224418919fSjohnjiang else
19234418919fSjohnjiang rc = test_ipsec_crypto_op_alloc(1);
19244418919fSjohnjiang
19254418919fSjohnjiang if (rc == 0) {
19264418919fSjohnjiang /* call ipsec library api */
19274418919fSjohnjiang rc = crypto_ipsec(1);
19284418919fSjohnjiang if (rc == 0)
19294418919fSjohnjiang rc = replay_inb_null_null_check(ut_params, i, 1);
19304418919fSjohnjiang else {
19314418919fSjohnjiang RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
19324418919fSjohnjiang i);
19334418919fSjohnjiang rc = TEST_FAILED;
19344418919fSjohnjiang }
19354418919fSjohnjiang }
19364418919fSjohnjiang
19374418919fSjohnjiang if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) {
19384418919fSjohnjiang /* generate packet with seq number inside the replay window */
19394418919fSjohnjiang if (ut_params->ibuf[0]) {
19404418919fSjohnjiang rte_pktmbuf_free(ut_params->ibuf[0]);
19414418919fSjohnjiang ut_params->ibuf[0] = 0;
19424418919fSjohnjiang }
19434418919fSjohnjiang
19444418919fSjohnjiang ut_params->ibuf[0] = setup_test_string_tunneled(
19454418919fSjohnjiang ts_params->mbuf_pool, null_encrypted_data,
19464418919fSjohnjiang test_cfg[i].pkt_sz, INBOUND_SPI,
19474418919fSjohnjiang test_cfg[i].replay_win_sz);
19484418919fSjohnjiang if (ut_params->ibuf[0] == NULL)
19494418919fSjohnjiang rc = TEST_FAILED;
19504418919fSjohnjiang else
19514418919fSjohnjiang rc = test_ipsec_crypto_op_alloc(1);
19524418919fSjohnjiang
19534418919fSjohnjiang if (rc == 0) {
19544418919fSjohnjiang /* call ipsec library api */
19554418919fSjohnjiang rc = crypto_ipsec(1);
19564418919fSjohnjiang if (rc == 0)
19574418919fSjohnjiang rc = replay_inb_null_null_check(
19584418919fSjohnjiang ut_params, i, 1);
19594418919fSjohnjiang else {
19604418919fSjohnjiang RTE_LOG(ERR, USER1, "crypto_ipsec failed\n");
19614418919fSjohnjiang rc = TEST_FAILED;
19624418919fSjohnjiang }
19634418919fSjohnjiang }
19644418919fSjohnjiang }
19654418919fSjohnjiang
19664418919fSjohnjiang if (rc == TEST_FAILED)
19674418919fSjohnjiang test_ipsec_dump_buffers(ut_params, i);
19684418919fSjohnjiang
19694418919fSjohnjiang destroy_sa(0);
19704418919fSjohnjiang
19714418919fSjohnjiang return rc;
19724418919fSjohnjiang }
19734418919fSjohnjiang
19744418919fSjohnjiang static int
test_ipsec_replay_inb_inside_null_null_wrapper(void)19754418919fSjohnjiang test_ipsec_replay_inb_inside_null_null_wrapper(void)
19764418919fSjohnjiang {
19774418919fSjohnjiang int i;
19784418919fSjohnjiang int rc = 0;
19794418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
19804418919fSjohnjiang
19814418919fSjohnjiang ut_params->ipsec_xform.spi = INBOUND_SPI;
19824418919fSjohnjiang ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
19834418919fSjohnjiang ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
19844418919fSjohnjiang ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
19854418919fSjohnjiang ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
19864418919fSjohnjiang
19874418919fSjohnjiang for (i = 0; i < num_cfg && rc == 0; i++) {
19884418919fSjohnjiang ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
19894418919fSjohnjiang rc = test_ipsec_replay_inb_inside_null_null(i);
19904418919fSjohnjiang }
19914418919fSjohnjiang
19924418919fSjohnjiang return rc;
19934418919fSjohnjiang }
19944418919fSjohnjiang
19954418919fSjohnjiang static int
test_ipsec_replay_inb_outside_null_null(int i)19964418919fSjohnjiang test_ipsec_replay_inb_outside_null_null(int i)
19974418919fSjohnjiang {
19984418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
19994418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
20004418919fSjohnjiang int rc;
20014418919fSjohnjiang
20024418919fSjohnjiang /* create rte_ipsec_sa */
20034418919fSjohnjiang rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
20044418919fSjohnjiang test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
20054418919fSjohnjiang if (rc != 0) {
20064418919fSjohnjiang RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
20074418919fSjohnjiang return TEST_FAILED;
20084418919fSjohnjiang }
20094418919fSjohnjiang
20104418919fSjohnjiang /* Generate test mbuf data */
20114418919fSjohnjiang ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool,
20124418919fSjohnjiang null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI,
20134418919fSjohnjiang test_cfg[i].replay_win_sz + 2);
20144418919fSjohnjiang if (ut_params->ibuf[0] == NULL)
20154418919fSjohnjiang rc = TEST_FAILED;
20164418919fSjohnjiang else
20174418919fSjohnjiang rc = test_ipsec_crypto_op_alloc(1);
20184418919fSjohnjiang
20194418919fSjohnjiang if (rc == 0) {
20204418919fSjohnjiang /* call ipsec library api */
20214418919fSjohnjiang rc = crypto_ipsec(1);
20224418919fSjohnjiang if (rc == 0)
20234418919fSjohnjiang rc = replay_inb_null_null_check(ut_params, i, 1);
20244418919fSjohnjiang else {
20254418919fSjohnjiang RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
20264418919fSjohnjiang i);
20274418919fSjohnjiang rc = TEST_FAILED;
20284418919fSjohnjiang }
20294418919fSjohnjiang }
20304418919fSjohnjiang
20314418919fSjohnjiang if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) {
20324418919fSjohnjiang /* generate packet with seq number outside the replay window */
20334418919fSjohnjiang if (ut_params->ibuf[0]) {
20344418919fSjohnjiang rte_pktmbuf_free(ut_params->ibuf[0]);
20354418919fSjohnjiang ut_params->ibuf[0] = 0;
20364418919fSjohnjiang }
20374418919fSjohnjiang ut_params->ibuf[0] = setup_test_string_tunneled(
20384418919fSjohnjiang ts_params->mbuf_pool, null_encrypted_data,
20394418919fSjohnjiang test_cfg[i].pkt_sz, INBOUND_SPI, 1);
20404418919fSjohnjiang if (ut_params->ibuf[0] == NULL)
20414418919fSjohnjiang rc = TEST_FAILED;
20424418919fSjohnjiang else
20434418919fSjohnjiang rc = test_ipsec_crypto_op_alloc(1);
20444418919fSjohnjiang
20454418919fSjohnjiang if (rc == 0) {
20464418919fSjohnjiang /* call ipsec library api */
20474418919fSjohnjiang rc = crypto_ipsec(1);
20484418919fSjohnjiang if (rc == 0) {
20494418919fSjohnjiang if (test_cfg[i].esn == 0) {
20504418919fSjohnjiang RTE_LOG(ERR, USER1,
20514418919fSjohnjiang "packet is not outside the replay window, cfg %d pkt0_seq %u pkt1_seq %u\n",
20524418919fSjohnjiang i,
20534418919fSjohnjiang test_cfg[i].replay_win_sz + 2,
20544418919fSjohnjiang 1);
20554418919fSjohnjiang rc = TEST_FAILED;
20564418919fSjohnjiang }
20574418919fSjohnjiang } else {
20584418919fSjohnjiang RTE_LOG(ERR, USER1,
20594418919fSjohnjiang "packet is outside the replay window, cfg %d pkt0_seq %u pkt1_seq %u\n",
20604418919fSjohnjiang i, test_cfg[i].replay_win_sz + 2, 1);
20614418919fSjohnjiang rc = 0;
20624418919fSjohnjiang }
20634418919fSjohnjiang }
20644418919fSjohnjiang }
20654418919fSjohnjiang
20664418919fSjohnjiang if (rc == TEST_FAILED)
20674418919fSjohnjiang test_ipsec_dump_buffers(ut_params, i);
20684418919fSjohnjiang
20694418919fSjohnjiang destroy_sa(0);
20704418919fSjohnjiang
20714418919fSjohnjiang return rc;
20724418919fSjohnjiang }
20734418919fSjohnjiang
20744418919fSjohnjiang static int
test_ipsec_replay_inb_outside_null_null_wrapper(void)20754418919fSjohnjiang test_ipsec_replay_inb_outside_null_null_wrapper(void)
20764418919fSjohnjiang {
20774418919fSjohnjiang int i;
20784418919fSjohnjiang int rc = 0;
20794418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
20804418919fSjohnjiang
20814418919fSjohnjiang ut_params->ipsec_xform.spi = INBOUND_SPI;
20824418919fSjohnjiang ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
20834418919fSjohnjiang ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
20844418919fSjohnjiang ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
20854418919fSjohnjiang ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
20864418919fSjohnjiang
20874418919fSjohnjiang for (i = 0; i < num_cfg && rc == 0; i++) {
20884418919fSjohnjiang ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
20894418919fSjohnjiang rc = test_ipsec_replay_inb_outside_null_null(i);
20904418919fSjohnjiang }
20914418919fSjohnjiang
20924418919fSjohnjiang return rc;
20934418919fSjohnjiang }
20944418919fSjohnjiang
20954418919fSjohnjiang static int
test_ipsec_replay_inb_repeat_null_null(int i)20964418919fSjohnjiang test_ipsec_replay_inb_repeat_null_null(int i)
20974418919fSjohnjiang {
20984418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
20994418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
21004418919fSjohnjiang int rc;
21014418919fSjohnjiang
21024418919fSjohnjiang /* create rte_ipsec_sa */
21034418919fSjohnjiang rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
21044418919fSjohnjiang test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
21054418919fSjohnjiang if (rc != 0) {
21064418919fSjohnjiang RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
21074418919fSjohnjiang return TEST_FAILED;
21084418919fSjohnjiang }
21094418919fSjohnjiang
21104418919fSjohnjiang /* Generate test mbuf data */
21114418919fSjohnjiang ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool,
21124418919fSjohnjiang null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI, 1);
21134418919fSjohnjiang if (ut_params->ibuf[0] == NULL)
21144418919fSjohnjiang rc = TEST_FAILED;
21154418919fSjohnjiang else
21164418919fSjohnjiang rc = test_ipsec_crypto_op_alloc(1);
21174418919fSjohnjiang
21184418919fSjohnjiang if (rc == 0) {
21194418919fSjohnjiang /* call ipsec library api */
21204418919fSjohnjiang rc = crypto_ipsec(1);
21214418919fSjohnjiang if (rc == 0)
21224418919fSjohnjiang rc = replay_inb_null_null_check(ut_params, i, 1);
21234418919fSjohnjiang else {
21244418919fSjohnjiang RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
21254418919fSjohnjiang i);
21264418919fSjohnjiang rc = TEST_FAILED;
21274418919fSjohnjiang }
21284418919fSjohnjiang }
21294418919fSjohnjiang
21304418919fSjohnjiang if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) {
21314418919fSjohnjiang /*
21324418919fSjohnjiang * generate packet with repeat seq number in the replay
21334418919fSjohnjiang * window
21344418919fSjohnjiang */
21354418919fSjohnjiang if (ut_params->ibuf[0]) {
21364418919fSjohnjiang rte_pktmbuf_free(ut_params->ibuf[0]);
21374418919fSjohnjiang ut_params->ibuf[0] = 0;
21384418919fSjohnjiang }
21394418919fSjohnjiang
21404418919fSjohnjiang ut_params->ibuf[0] = setup_test_string_tunneled(
21414418919fSjohnjiang ts_params->mbuf_pool, null_encrypted_data,
21424418919fSjohnjiang test_cfg[i].pkt_sz, INBOUND_SPI, 1);
21434418919fSjohnjiang if (ut_params->ibuf[0] == NULL)
21444418919fSjohnjiang rc = TEST_FAILED;
21454418919fSjohnjiang else
21464418919fSjohnjiang rc = test_ipsec_crypto_op_alloc(1);
21474418919fSjohnjiang
21484418919fSjohnjiang if (rc == 0) {
21494418919fSjohnjiang /* call ipsec library api */
21504418919fSjohnjiang rc = crypto_ipsec(1);
21514418919fSjohnjiang if (rc == 0) {
21524418919fSjohnjiang RTE_LOG(ERR, USER1,
21534418919fSjohnjiang "packet is not repeated in the replay window, cfg %d seq %u\n",
21544418919fSjohnjiang i, 1);
21554418919fSjohnjiang rc = TEST_FAILED;
21564418919fSjohnjiang } else {
21574418919fSjohnjiang RTE_LOG(ERR, USER1,
21584418919fSjohnjiang "packet is repeated in the replay window, cfg %d seq %u\n",
21594418919fSjohnjiang i, 1);
21604418919fSjohnjiang rc = 0;
21614418919fSjohnjiang }
21624418919fSjohnjiang }
21634418919fSjohnjiang }
21644418919fSjohnjiang
21654418919fSjohnjiang if (rc == TEST_FAILED)
21664418919fSjohnjiang test_ipsec_dump_buffers(ut_params, i);
21674418919fSjohnjiang
21684418919fSjohnjiang destroy_sa(0);
21694418919fSjohnjiang
21704418919fSjohnjiang return rc;
21714418919fSjohnjiang }
21724418919fSjohnjiang
21734418919fSjohnjiang static int
test_ipsec_replay_inb_repeat_null_null_wrapper(void)21744418919fSjohnjiang test_ipsec_replay_inb_repeat_null_null_wrapper(void)
21754418919fSjohnjiang {
21764418919fSjohnjiang int i;
21774418919fSjohnjiang int rc = 0;
21784418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
21794418919fSjohnjiang
21804418919fSjohnjiang ut_params->ipsec_xform.spi = INBOUND_SPI;
21814418919fSjohnjiang ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
21824418919fSjohnjiang ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
21834418919fSjohnjiang ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
21844418919fSjohnjiang ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
21854418919fSjohnjiang
21864418919fSjohnjiang for (i = 0; i < num_cfg && rc == 0; i++) {
21874418919fSjohnjiang ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
21884418919fSjohnjiang rc = test_ipsec_replay_inb_repeat_null_null(i);
21894418919fSjohnjiang }
21904418919fSjohnjiang
21914418919fSjohnjiang return rc;
21924418919fSjohnjiang }
21934418919fSjohnjiang
21944418919fSjohnjiang static int
test_ipsec_replay_inb_inside_burst_null_null(int i)21954418919fSjohnjiang test_ipsec_replay_inb_inside_burst_null_null(int i)
21964418919fSjohnjiang {
21974418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
21984418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
21994418919fSjohnjiang uint16_t num_pkts = test_cfg[i].num_pkts;
22004418919fSjohnjiang int rc;
22014418919fSjohnjiang int j;
22024418919fSjohnjiang
22034418919fSjohnjiang /* create rte_ipsec_sa*/
22044418919fSjohnjiang rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
22054418919fSjohnjiang test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
22064418919fSjohnjiang if (rc != 0) {
22074418919fSjohnjiang RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
22084418919fSjohnjiang return TEST_FAILED;
22094418919fSjohnjiang }
22104418919fSjohnjiang
22114418919fSjohnjiang /* Generate inbound mbuf data */
22124418919fSjohnjiang ut_params->ibuf[0] = setup_test_string_tunneled(ts_params->mbuf_pool,
22134418919fSjohnjiang null_encrypted_data, test_cfg[i].pkt_sz, INBOUND_SPI, 1);
22144418919fSjohnjiang if (ut_params->ibuf[0] == NULL)
22154418919fSjohnjiang rc = TEST_FAILED;
22164418919fSjohnjiang else
22174418919fSjohnjiang rc = test_ipsec_crypto_op_alloc(1);
22184418919fSjohnjiang
22194418919fSjohnjiang if (rc == 0) {
22204418919fSjohnjiang /* call ipsec library api */
22214418919fSjohnjiang rc = crypto_ipsec(1);
22224418919fSjohnjiang if (rc == 0)
22234418919fSjohnjiang rc = replay_inb_null_null_check(ut_params, i, 1);
22244418919fSjohnjiang else {
22254418919fSjohnjiang RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
22264418919fSjohnjiang i);
22274418919fSjohnjiang rc = TEST_FAILED;
22284418919fSjohnjiang }
22294418919fSjohnjiang }
22304418919fSjohnjiang
22314418919fSjohnjiang if ((rc == 0) && (test_cfg[i].replay_win_sz != 0)) {
22324418919fSjohnjiang /*
22334418919fSjohnjiang * generate packet(s) with seq number(s) inside the
22344418919fSjohnjiang * replay window
22354418919fSjohnjiang */
22364418919fSjohnjiang if (ut_params->ibuf[0]) {
22374418919fSjohnjiang rte_pktmbuf_free(ut_params->ibuf[0]);
22384418919fSjohnjiang ut_params->ibuf[0] = 0;
22394418919fSjohnjiang }
22404418919fSjohnjiang
22414418919fSjohnjiang for (j = 0; j < num_pkts && rc == 0; j++) {
22424418919fSjohnjiang /* packet with sequence number 1 already processed */
22434418919fSjohnjiang ut_params->ibuf[j] = setup_test_string_tunneled(
22444418919fSjohnjiang ts_params->mbuf_pool, null_encrypted_data,
22454418919fSjohnjiang test_cfg[i].pkt_sz, INBOUND_SPI, j + 2);
22464418919fSjohnjiang if (ut_params->ibuf[j] == NULL)
22474418919fSjohnjiang rc = TEST_FAILED;
22484418919fSjohnjiang }
22494418919fSjohnjiang
22504418919fSjohnjiang if (rc == 0) {
22514418919fSjohnjiang if (test_cfg[i].reorder_pkts)
22524418919fSjohnjiang test_ipsec_reorder_inb_pkt_burst(num_pkts);
22534418919fSjohnjiang rc = test_ipsec_crypto_op_alloc(num_pkts);
22544418919fSjohnjiang }
22554418919fSjohnjiang
22564418919fSjohnjiang if (rc == 0) {
22574418919fSjohnjiang /* call ipsec library api */
22584418919fSjohnjiang rc = crypto_ipsec(num_pkts);
22594418919fSjohnjiang if (rc == 0)
22604418919fSjohnjiang rc = replay_inb_null_null_check(
22614418919fSjohnjiang ut_params, i, num_pkts);
22624418919fSjohnjiang else {
22634418919fSjohnjiang RTE_LOG(ERR, USER1, "crypto_ipsec failed\n");
22644418919fSjohnjiang rc = TEST_FAILED;
22654418919fSjohnjiang }
22664418919fSjohnjiang }
22674418919fSjohnjiang }
22684418919fSjohnjiang
22694418919fSjohnjiang if (rc == TEST_FAILED)
22704418919fSjohnjiang test_ipsec_dump_buffers(ut_params, i);
22714418919fSjohnjiang
22724418919fSjohnjiang destroy_sa(0);
22734418919fSjohnjiang
22744418919fSjohnjiang return rc;
22754418919fSjohnjiang }
22764418919fSjohnjiang
22774418919fSjohnjiang static int
test_ipsec_replay_inb_inside_burst_null_null_wrapper(void)22784418919fSjohnjiang test_ipsec_replay_inb_inside_burst_null_null_wrapper(void)
22794418919fSjohnjiang {
22804418919fSjohnjiang int i;
22814418919fSjohnjiang int rc = 0;
22824418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
22834418919fSjohnjiang
22844418919fSjohnjiang ut_params->ipsec_xform.spi = INBOUND_SPI;
22854418919fSjohnjiang ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
22864418919fSjohnjiang ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
22874418919fSjohnjiang ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
22884418919fSjohnjiang ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
22894418919fSjohnjiang
22904418919fSjohnjiang for (i = 0; i < num_cfg && rc == 0; i++) {
22914418919fSjohnjiang ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
22924418919fSjohnjiang rc = test_ipsec_replay_inb_inside_burst_null_null(i);
22934418919fSjohnjiang }
22944418919fSjohnjiang
22954418919fSjohnjiang return rc;
22964418919fSjohnjiang }
22974418919fSjohnjiang
22984418919fSjohnjiang
22994418919fSjohnjiang static int
crypto_inb_burst_2sa_null_null_check(struct ipsec_unitest_params * ut_params,int i)23004418919fSjohnjiang crypto_inb_burst_2sa_null_null_check(struct ipsec_unitest_params *ut_params,
23014418919fSjohnjiang int i)
23024418919fSjohnjiang {
23034418919fSjohnjiang uint16_t j;
23044418919fSjohnjiang
23054418919fSjohnjiang for (j = 0; j < BURST_SIZE; j++) {
23064418919fSjohnjiang ut_params->pkt_index = j;
23074418919fSjohnjiang
23084418919fSjohnjiang /* compare the data buffers */
23094418919fSjohnjiang TEST_ASSERT_BUFFERS_ARE_EQUAL(null_plain_data,
23104418919fSjohnjiang rte_pktmbuf_mtod(ut_params->obuf[j], void *),
23114418919fSjohnjiang test_cfg[i].pkt_sz,
23124418919fSjohnjiang "input and output data does not match\n");
23134418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
23144418919fSjohnjiang ut_params->obuf[j]->pkt_len,
23154418919fSjohnjiang "data_len is not equal to pkt_len");
23164418919fSjohnjiang TEST_ASSERT_EQUAL(ut_params->obuf[j]->data_len,
23174418919fSjohnjiang test_cfg[i].pkt_sz,
23184418919fSjohnjiang "data_len is not equal to input data");
23194418919fSjohnjiang }
23204418919fSjohnjiang
23214418919fSjohnjiang return 0;
23224418919fSjohnjiang }
23234418919fSjohnjiang
23244418919fSjohnjiang static int
test_ipsec_crypto_inb_burst_2sa_null_null(int i)23254418919fSjohnjiang test_ipsec_crypto_inb_burst_2sa_null_null(int i)
23264418919fSjohnjiang {
23274418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
23284418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
23294418919fSjohnjiang uint16_t num_pkts = test_cfg[i].num_pkts;
23304418919fSjohnjiang uint16_t j, r;
23314418919fSjohnjiang int rc = 0;
23324418919fSjohnjiang
23334418919fSjohnjiang if (num_pkts != BURST_SIZE)
23344418919fSjohnjiang return rc;
23354418919fSjohnjiang
23364418919fSjohnjiang /* create rte_ipsec_sa */
23374418919fSjohnjiang rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
23384418919fSjohnjiang test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
23394418919fSjohnjiang if (rc != 0) {
23404418919fSjohnjiang RTE_LOG(ERR, USER1, "create_sa 0 failed, cfg %d\n", i);
23414418919fSjohnjiang return TEST_FAILED;
23424418919fSjohnjiang }
23434418919fSjohnjiang
23444418919fSjohnjiang /* create second rte_ipsec_sa */
23454418919fSjohnjiang ut_params->ipsec_xform.spi = INBOUND_SPI + 1;
23464418919fSjohnjiang rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
23474418919fSjohnjiang test_cfg[i].replay_win_sz, test_cfg[i].flags, 1);
23484418919fSjohnjiang if (rc != 0) {
23494418919fSjohnjiang RTE_LOG(ERR, USER1, "create_sa 1 failed, cfg %d\n", i);
23504418919fSjohnjiang destroy_sa(0);
23514418919fSjohnjiang return TEST_FAILED;
23524418919fSjohnjiang }
23534418919fSjohnjiang
23544418919fSjohnjiang /* Generate test mbuf data */
23554418919fSjohnjiang for (j = 0; j < num_pkts && rc == 0; j++) {
23564418919fSjohnjiang r = j % 2;
23574418919fSjohnjiang /* packet with sequence number 0 is invalid */
23584418919fSjohnjiang ut_params->ibuf[j] = setup_test_string_tunneled(
23594418919fSjohnjiang ts_params->mbuf_pool, null_encrypted_data,
23604418919fSjohnjiang test_cfg[i].pkt_sz, INBOUND_SPI + r, j + 1);
23614418919fSjohnjiang if (ut_params->ibuf[j] == NULL)
23624418919fSjohnjiang rc = TEST_FAILED;
23634418919fSjohnjiang }
23644418919fSjohnjiang
23654418919fSjohnjiang if (rc == 0)
23664418919fSjohnjiang rc = test_ipsec_crypto_op_alloc(num_pkts);
23674418919fSjohnjiang
23684418919fSjohnjiang if (rc == 0) {
23694418919fSjohnjiang /* call ipsec library api */
23704418919fSjohnjiang rc = crypto_ipsec_2sa();
23714418919fSjohnjiang if (rc == 0)
23724418919fSjohnjiang rc = crypto_inb_burst_2sa_null_null_check(
23734418919fSjohnjiang ut_params, i);
23744418919fSjohnjiang else {
23754418919fSjohnjiang RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
23764418919fSjohnjiang i);
23774418919fSjohnjiang rc = TEST_FAILED;
23784418919fSjohnjiang }
23794418919fSjohnjiang }
23804418919fSjohnjiang
23814418919fSjohnjiang if (rc == TEST_FAILED)
23824418919fSjohnjiang test_ipsec_dump_buffers(ut_params, i);
23834418919fSjohnjiang
23844418919fSjohnjiang destroy_sa(0);
23854418919fSjohnjiang destroy_sa(1);
23864418919fSjohnjiang return rc;
23874418919fSjohnjiang }
23884418919fSjohnjiang
23894418919fSjohnjiang static int
test_ipsec_crypto_inb_burst_2sa_null_null_wrapper(void)23904418919fSjohnjiang test_ipsec_crypto_inb_burst_2sa_null_null_wrapper(void)
23914418919fSjohnjiang {
23924418919fSjohnjiang int i;
23934418919fSjohnjiang int rc = 0;
23944418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
23954418919fSjohnjiang
23964418919fSjohnjiang ut_params->ipsec_xform.spi = INBOUND_SPI;
23974418919fSjohnjiang ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
23984418919fSjohnjiang ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
23994418919fSjohnjiang ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
24004418919fSjohnjiang ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
24014418919fSjohnjiang
24024418919fSjohnjiang for (i = 0; i < num_cfg && rc == 0; i++) {
24034418919fSjohnjiang ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
24044418919fSjohnjiang rc = test_ipsec_crypto_inb_burst_2sa_null_null(i);
24054418919fSjohnjiang }
24064418919fSjohnjiang
24074418919fSjohnjiang return rc;
24084418919fSjohnjiang }
24094418919fSjohnjiang
24104418919fSjohnjiang static int
test_ipsec_crypto_inb_burst_2sa_4grp_null_null(int i)24114418919fSjohnjiang test_ipsec_crypto_inb_burst_2sa_4grp_null_null(int i)
24124418919fSjohnjiang {
24134418919fSjohnjiang struct ipsec_testsuite_params *ts_params = &testsuite_params;
24144418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
24154418919fSjohnjiang uint16_t num_pkts = test_cfg[i].num_pkts;
24164418919fSjohnjiang uint16_t j, k;
24174418919fSjohnjiang int rc = 0;
24184418919fSjohnjiang
24194418919fSjohnjiang if (num_pkts != BURST_SIZE)
24204418919fSjohnjiang return rc;
24214418919fSjohnjiang
24224418919fSjohnjiang /* create rte_ipsec_sa */
24234418919fSjohnjiang rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
24244418919fSjohnjiang test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
24254418919fSjohnjiang if (rc != 0) {
24264418919fSjohnjiang RTE_LOG(ERR, USER1, "create_sa 0 failed, cfg %d\n", i);
24274418919fSjohnjiang return TEST_FAILED;
24284418919fSjohnjiang }
24294418919fSjohnjiang
24304418919fSjohnjiang /* create second rte_ipsec_sa */
24314418919fSjohnjiang ut_params->ipsec_xform.spi = INBOUND_SPI + 1;
24324418919fSjohnjiang rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
24334418919fSjohnjiang test_cfg[i].replay_win_sz, test_cfg[i].flags, 1);
24344418919fSjohnjiang if (rc != 0) {
24354418919fSjohnjiang RTE_LOG(ERR, USER1, "create_sa 1 failed, cfg %d\n", i);
24364418919fSjohnjiang destroy_sa(0);
24374418919fSjohnjiang return TEST_FAILED;
24384418919fSjohnjiang }
24394418919fSjohnjiang
24404418919fSjohnjiang /* Generate test mbuf data */
24414418919fSjohnjiang for (j = 0; j < num_pkts && rc == 0; j++) {
24424418919fSjohnjiang k = crypto_ipsec_4grp(j);
24434418919fSjohnjiang
24444418919fSjohnjiang /* packet with sequence number 0 is invalid */
24454418919fSjohnjiang ut_params->ibuf[j] = setup_test_string_tunneled(
24464418919fSjohnjiang ts_params->mbuf_pool, null_encrypted_data,
24474418919fSjohnjiang test_cfg[i].pkt_sz, INBOUND_SPI + k, j + 1);
24484418919fSjohnjiang if (ut_params->ibuf[j] == NULL)
24494418919fSjohnjiang rc = TEST_FAILED;
24504418919fSjohnjiang }
24514418919fSjohnjiang
24524418919fSjohnjiang if (rc == 0)
24534418919fSjohnjiang rc = test_ipsec_crypto_op_alloc(num_pkts);
24544418919fSjohnjiang
24554418919fSjohnjiang if (rc == 0) {
24564418919fSjohnjiang /* call ipsec library api */
24574418919fSjohnjiang rc = crypto_ipsec_2sa_4grp();
24584418919fSjohnjiang if (rc == 0)
24594418919fSjohnjiang rc = crypto_inb_burst_2sa_null_null_check(
24604418919fSjohnjiang ut_params, i);
24614418919fSjohnjiang else {
24624418919fSjohnjiang RTE_LOG(ERR, USER1, "crypto_ipsec failed, cfg %d\n",
24634418919fSjohnjiang i);
24644418919fSjohnjiang rc = TEST_FAILED;
24654418919fSjohnjiang }
24664418919fSjohnjiang }
24674418919fSjohnjiang
24684418919fSjohnjiang if (rc == TEST_FAILED)
24694418919fSjohnjiang test_ipsec_dump_buffers(ut_params, i);
24704418919fSjohnjiang
24714418919fSjohnjiang destroy_sa(0);
24724418919fSjohnjiang destroy_sa(1);
24734418919fSjohnjiang return rc;
24744418919fSjohnjiang }
24754418919fSjohnjiang
24764418919fSjohnjiang static int
test_ipsec_crypto_inb_burst_2sa_4grp_null_null_wrapper(void)24774418919fSjohnjiang test_ipsec_crypto_inb_burst_2sa_4grp_null_null_wrapper(void)
24784418919fSjohnjiang {
24794418919fSjohnjiang int i;
24804418919fSjohnjiang int rc = 0;
24814418919fSjohnjiang struct ipsec_unitest_params *ut_params = &unittest_params;
24824418919fSjohnjiang
24834418919fSjohnjiang ut_params->ipsec_xform.spi = INBOUND_SPI;
24844418919fSjohnjiang ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
24854418919fSjohnjiang ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
24864418919fSjohnjiang ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
24874418919fSjohnjiang ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
24884418919fSjohnjiang
24894418919fSjohnjiang for (i = 0; i < num_cfg && rc == 0; i++) {
24904418919fSjohnjiang ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
24914418919fSjohnjiang rc = test_ipsec_crypto_inb_burst_2sa_4grp_null_null(i);
24924418919fSjohnjiang }
24934418919fSjohnjiang
24944418919fSjohnjiang return rc;
24954418919fSjohnjiang }
24964418919fSjohnjiang
24974418919fSjohnjiang static struct unit_test_suite ipsec_testsuite = {
24984418919fSjohnjiang .suite_name = "IPsec NULL Unit Test Suite",
24994418919fSjohnjiang .setup = testsuite_setup,
25004418919fSjohnjiang .teardown = testsuite_teardown,
25014418919fSjohnjiang .unit_test_cases = {
25024418919fSjohnjiang TEST_CASE_ST(ut_setup, ut_teardown,
25034418919fSjohnjiang test_ipsec_crypto_inb_burst_null_null_wrapper),
25044418919fSjohnjiang TEST_CASE_ST(ut_setup, ut_teardown,
25054418919fSjohnjiang test_ipsec_crypto_outb_burst_null_null_wrapper),
25064418919fSjohnjiang TEST_CASE_ST(ut_setup, ut_teardown,
25074418919fSjohnjiang test_ipsec_inline_crypto_inb_burst_null_null_wrapper),
25084418919fSjohnjiang TEST_CASE_ST(ut_setup, ut_teardown,
25094418919fSjohnjiang test_ipsec_inline_crypto_outb_burst_null_null_wrapper),
25104418919fSjohnjiang TEST_CASE_ST(ut_setup, ut_teardown,
25114418919fSjohnjiang test_ipsec_inline_proto_inb_burst_null_null_wrapper),
25124418919fSjohnjiang TEST_CASE_ST(ut_setup, ut_teardown,
25134418919fSjohnjiang test_ipsec_inline_proto_outb_burst_null_null_wrapper),
25144418919fSjohnjiang TEST_CASE_ST(ut_setup, ut_teardown,
25154418919fSjohnjiang test_ipsec_lksd_proto_inb_burst_null_null_wrapper),
25164418919fSjohnjiang TEST_CASE_ST(ut_setup, ut_teardown,
25174418919fSjohnjiang test_ipsec_lksd_proto_outb_burst_null_null_wrapper),
25184418919fSjohnjiang TEST_CASE_ST(ut_setup, ut_teardown,
25194418919fSjohnjiang test_ipsec_replay_inb_inside_null_null_wrapper),
25204418919fSjohnjiang TEST_CASE_ST(ut_setup, ut_teardown,
25214418919fSjohnjiang test_ipsec_replay_inb_outside_null_null_wrapper),
25224418919fSjohnjiang TEST_CASE_ST(ut_setup, ut_teardown,
25234418919fSjohnjiang test_ipsec_replay_inb_repeat_null_null_wrapper),
25244418919fSjohnjiang TEST_CASE_ST(ut_setup, ut_teardown,
25254418919fSjohnjiang test_ipsec_replay_inb_inside_burst_null_null_wrapper),
25264418919fSjohnjiang TEST_CASE_ST(ut_setup, ut_teardown,
25274418919fSjohnjiang test_ipsec_crypto_inb_burst_2sa_null_null_wrapper),
25284418919fSjohnjiang TEST_CASE_ST(ut_setup, ut_teardown,
25294418919fSjohnjiang test_ipsec_crypto_inb_burst_2sa_4grp_null_null_wrapper),
25304418919fSjohnjiang TEST_CASES_END() /**< NULL terminate unit test array */
25314418919fSjohnjiang }
25324418919fSjohnjiang };
25334418919fSjohnjiang
25344418919fSjohnjiang static int
test_ipsec(void)25354418919fSjohnjiang test_ipsec(void)
25364418919fSjohnjiang {
25374418919fSjohnjiang return unit_test_suite_runner(&ipsec_testsuite);
25384418919fSjohnjiang }
25394418919fSjohnjiang
25404418919fSjohnjiang REGISTER_TEST_COMMAND(ipsec_autotest, test_ipsec);
2541