get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/90478/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 90478,
    "url": "http://patches.dpdk.org/api/patches/90478/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20210402142424.1353789-7-ciara.power@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20210402142424.1353789-7-ciara.power@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210402142424.1353789-7-ciara.power@intel.com",
    "date": "2021-04-02T14:24:24",
    "name": "[v2,6/6] test/crypto: dynamically build blockcipher suite",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "c6b68152b422e599ec23705ef82de43f59b5cc3c",
    "submitter": {
        "id": 978,
        "url": "http://patches.dpdk.org/api/people/978/?format=api",
        "name": "Power, Ciara",
        "email": "ciara.power@intel.com"
    },
    "delegate": {
        "id": 6690,
        "url": "http://patches.dpdk.org/api/users/6690/?format=api",
        "username": "akhil",
        "first_name": "akhil",
        "last_name": "goyal",
        "email": "gakhil@marvell.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20210402142424.1353789-7-ciara.power@intel.com/mbox/",
    "series": [
        {
            "id": 16085,
            "url": "http://patches.dpdk.org/api/series/16085/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=16085",
            "date": "2021-04-02T14:24:18",
            "name": "test: refactor crypto unit test framework",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/16085/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/90478/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/90478/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id D2E49A0548;\n\tFri,  2 Apr 2021 16:25:27 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 995F5141036;\n\tFri,  2 Apr 2021 16:25:03 +0200 (CEST)",
            "from mga03.intel.com (mga03.intel.com [134.134.136.65])\n by mails.dpdk.org (Postfix) with ESMTP id 6FAFC141033\n for <dev@dpdk.org>; Fri,  2 Apr 2021 16:25:01 +0200 (CEST)",
            "from fmsmga008.fm.intel.com ([10.253.24.58])\n by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 02 Apr 2021 07:25:00 -0700",
            "from silpixa00400355.ir.intel.com (HELO\n silpixa00400355.ger.corp.intel.com) ([10.237.223.148])\n by fmsmga008.fm.intel.com with ESMTP; 02 Apr 2021 07:24:57 -0700"
        ],
        "IronPort-SDR": [
            "\n jFcXR3EBMwFos1s1uV08vOC8JJCOfngfLADSQsBzewzXq4LKhgOoXFE+6yq2Qu3TPiRCaI+ib2\n gKQ6G267kqfw==",
            "\n 8UAv5lMdTDQ9QKXHWA5b+fg+b2Cl0woTG2nm3Z2UDCw/OAw0yOtyjwNILSAySjxAKUfR1EcdR2\n 7YTlOq5zzTYw=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6000,8403,9942\"; a=\"192512497\"",
            "E=Sophos;i=\"5.81,300,1610438400\"; d=\"scan'208\";a=\"192512497\"",
            "E=Sophos;i=\"5.81,300,1610438400\"; d=\"scan'208\";a=\"413199645\""
        ],
        "X-ExtLoop1": "1",
        "From": "Ciara Power <ciara.power@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "declan.doherty@intel.com, gakhil@marvell.com, aconole@redhat.com,\n hemant.agrawal@nxp.com, anoobj@marvell.com, ruifeng.wang@arm.com,\n asomalap@amd.com, ajit.khaparde@broadcom.com, g.singh@nxp.com,\n Ciara Power <ciara.power@intel.com>",
        "Date": "Fri,  2 Apr 2021 14:24:24 +0000",
        "Message-Id": "<20210402142424.1353789-7-ciara.power@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20210402142424.1353789-1-ciara.power@intel.com>",
        "References": "<20210402142424.1353789-1-ciara.power@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v2 6/6] test/crypto: dynamically build\n blockcipher suite",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "In the existing implementation, the blockcipher test cases are being run\nand reported as one test case per type, even though multiple test cases\nare hidden in each. For example, \"test_AES_chain_all\" runs 46 test cases.\nEach blockcipher type should have a testsuite instead.\n\nThe blockcipher testsuite is dynamically built, depending on the\nblockcipher type chosen. The testcase struct is modified to allow\nrunning a testcase with data, which is used for data required when\nrunning each blockcipher testcase.\n\nThe blockcipher testsuites are added dynamically to parent testsuites\nas sub-testsuites where needed.\n\nSigned-off-by: Ciara Power <ciara.power@intel.com>\n\n---\nv2:\n  - Squashed release note patch into this patch.\n  - Modified the build blockcipher suite function to use the testcases\n    flexible array, and return a testsuite pointer.\n---\n app/test/test.c                        |  11 +-\n app/test/test.h                        |  16 +-\n app/test/test_cryptodev.c              | 507 +++++++++++++++----------\n app/test/test_cryptodev_blockcipher.c  | 125 +++---\n app/test/test_cryptodev_blockcipher.h  |  12 +-\n doc/guides/rel_notes/release_21_05.rst |   5 +\n 6 files changed, 407 insertions(+), 269 deletions(-)",
    "diff": "diff --git a/app/test/test.c b/app/test/test.c\nindex e401de0fdf..6151dbd55b 100644\n--- a/app/test/test.c\n+++ b/app/test/test.c\n@@ -38,7 +38,8 @@ extern cmdline_parse_ctx_t main_ctx[];\n \n #define FOR_EACH_SUITE_TESTCASE(iter, suite, case)\t\t\t\\\n \tfor (iter = 0, case = suite->unit_test_cases[0];\t\t\\\n-\t\tsuite->unit_test_cases[iter].testcase;\t\t\t\\\n+\t\tsuite->unit_test_cases[iter].testcase ||\t\t\\\n+\t\tsuite->unit_test_cases[iter].testcase_with_data;\t\\\n \t\titer++, case = suite->unit_test_cases[iter])\n \n #define FOR_EACH_SUITE_TESTSUITE(iter, suite, sub_ts)\t\t\t\\\n@@ -328,7 +329,13 @@ unit_test_suite_runner(struct unit_test_suite *suite)\n \n \t\t\tif (test_success == TEST_SUCCESS) {\n \t\t\t\t/* run the test case */\n-\t\t\t\ttest_success = tc.testcase();\n+\t\t\t\tif (tc.testcase)\n+\t\t\t\t\ttest_success = tc.testcase();\n+\t\t\t\telse if (tc.testcase_with_data)\n+\t\t\t\t\ttest_success = tc.testcase_with_data(tc.data);\n+\t\t\t\telse\n+\t\t\t\t\ttest_success = -ENOTSUP;\n+\n \t\t\t\tif (test_success == TEST_SUCCESS)\n \t\t\t\t\tsuite->succeeded++;\n \t\t\t\telse if (test_success == TEST_SKIPPED)\ndiff --git a/app/test/test.h b/app/test/test.h\nindex e9bfc365e4..3ec68cada0 100644\n--- a/app/test/test.h\n+++ b/app/test/test.h\n@@ -108,24 +108,28 @@ struct unit_test_case {\n \tint (*setup)(void);\n \tvoid (*teardown)(void);\n \tint (*testcase)(void);\n+\tint (*testcase_with_data)(const void *data);\n \tconst char *name;\n \tunsigned enabled;\n+\tconst void *data;\n };\n \n-#define TEST_CASE(fn) { NULL, NULL, fn, #fn, 1 }\n+#define TEST_CASE(fn) { NULL, NULL, fn, NULL, #fn, 1, NULL }\n \n-#define TEST_CASE_NAMED(name, fn) { NULL, NULL, fn, name, 1 }\n+#define TEST_CASE_NAMED(name, fn) { NULL, NULL, fn, NULL, name, 1, NULL }\n \n #define TEST_CASE_ST(setup, teardown, testcase) \\\n-\t\t{ setup, teardown, testcase, #testcase, 1 }\n+\t\t{ setup, teardown, testcase, NULL, #testcase, 1, NULL }\n \n+#define TEST_CASE_WITH_DATA(setup, teardown, testcase, data) \\\n+\t\t{ setup, teardown, NULL, testcase, #testcase, 1, data }\n \n-#define TEST_CASE_DISABLED(fn) { NULL, NULL, fn, #fn, 0 }\n+#define TEST_CASE_DISABLED(fn) { NULL, NULL, fn, NULL, #fn, 0, NULL }\n \n #define TEST_CASE_ST_DISABLED(setup, teardown, testcase) \\\n-\t\t{ setup, teardown, testcase, #testcase, 0 }\n+\t\t{ setup, teardown, testcase, NULL, #testcase, 0, NULL }\n \n-#define TEST_CASES_END() { NULL, NULL, NULL, NULL, 0 }\n+#define TEST_CASES_END() { NULL, NULL, NULL, NULL, NULL, 0, NULL }\n \n static inline void\n debug_hexdump(FILE *file, const char *title, const void *buf, size_t len)\ndiff --git a/app/test/test_cryptodev.c b/app/test/test_cryptodev.c\nindex ea751da432..86569d7a3d 100644\n--- a/app/test/test_cryptodev.c\n+++ b/app/test/test_cryptodev.c\n@@ -103,6 +103,15 @@ struct crypto_unittest_params {\n \tfor (j = 0; j < num_child_ts; index++, j++)\t\t\t\\\n \t\tparent_ts.unit_test_suites[index] = child_ts[j]\n \n+#define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types)\t\\\n+\tfor (j = 0; j < num_blk_types; index++, j++)\t\t\t\t\\\n+\t\tparent_ts.unit_test_suites[index] =\t\t\t\t\\\n+\t\t\t\tbuild_blockcipher_test_suite(blk_types[j])\n+\n+#define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types)\t\t\\\n+\tfor (j = index; j < index + num_blk_types; j++)\t\t\t\t\\\n+\t\tfree_blockcipher_test_suite(parent_ts.unit_test_suites[j])\n+\n /*\n  * Forward declarations.\n  */\n@@ -1921,80 +1930,6 @@ test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,\n \treturn TEST_SUCCESS;\n }\n \n-static int\n-test_blockcipher(enum blockcipher_test_type test_type)\n-{\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tint status;\n-\n-\tstatus = test_blockcipher_all_tests(ts_params->mbuf_pool,\n-\t\tts_params->op_mpool,\n-\t\tts_params->session_mpool, ts_params->session_priv_mpool,\n-\t\tts_params->valid_devs[0],\n-\t\ttest_type);\n-\n-\tif (status == -ENOTSUP)\n-\t\treturn status;\n-\n-\tTEST_ASSERT_EQUAL(status, 0, \"Test failed\");\n-\n-\treturn TEST_SUCCESS;\n-}\n-\n-static int\n-test_AES_cipheronly_all(void)\n-{\n-\treturn test_blockcipher(BLKCIPHER_AES_CIPHERONLY_TYPE);\n-}\n-\n-static int\n-test_AES_docsis_all(void)\n-{\n-\t/* Data-path service does not support DOCSIS yet */\n-\tif (global_api_test_type == CRYPTODEV_RAW_API_TEST)\n-\t\treturn -ENOTSUP;\n-\treturn test_blockcipher(BLKCIPHER_AES_DOCSIS_TYPE);\n-}\n-\n-static int\n-test_DES_docsis_all(void)\n-{\n-\t/* Data-path service does not support DOCSIS yet */\n-\tif (global_api_test_type == CRYPTODEV_RAW_API_TEST)\n-\t\treturn -ENOTSUP;\n-\treturn test_blockcipher(BLKCIPHER_DES_DOCSIS_TYPE);\n-}\n-\n-static int\n-test_DES_cipheronly_all(void)\n-{\n-\treturn test_blockcipher(BLKCIPHER_DES_CIPHERONLY_TYPE);\n-}\n-\n-static int\n-test_authonly_all(void)\n-{\n-\treturn test_blockcipher(BLKCIPHER_AUTHONLY_TYPE);\n-}\n-\n-static int\n-test_AES_chain_all(void)\n-{\n-\treturn test_blockcipher(BLKCIPHER_AES_CHAIN_TYPE);\n-}\n-\n-static int\n-test_3DES_chain_all(void)\n-{\n-\treturn test_blockcipher(BLKCIPHER_3DES_CHAIN_TYPE);\n-}\n-\n-static int\n-test_3DES_cipheronly_all(void)\n-{\n-\treturn test_blockcipher(BLKCIPHER_3DES_CIPHERONLY_TYPE);\n-}\n-\n /* ***** SNOW 3G Tests ***** */\n static int\n create_wireless_algo_hash_session(uint8_t dev_id,\n@@ -13362,14 +13297,6 @@ static struct unit_test_suite cryptodev_testsuite  = {\n \t\t\t\ttest_queue_pair_descriptor_setup),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\t\ttest_device_configure_invalid_queue_pair_ids),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_DES_cipheronly_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_DES_docsis_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown, test_stats),\n #ifdef RTE_LIB_SECURITY\n \t\tTEST_CASE_ST(ut_setup_security, ut_teardown,\n@@ -14086,15 +14013,6 @@ static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {\n \t}\n };\n \n-static struct unit_test_suite cryptodev_virtio_sub_testsuite = {\n-\t.suite_name = \"Crypto VIRTIO Unit Test Suite\",\n-\t.unit_test_cases = {\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n-\n-\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n-\t}\n-};\n-\n static struct unit_test_suite cryptodev_caam_jr_sub_testsuite = {\n \t.suite_name = \"Crypto CAAM JR Sub Unit Test Suite\",\n \t.unit_test_cases = {\n@@ -14102,38 +14020,6 @@ static struct unit_test_suite cryptodev_caam_jr_sub_testsuite = {\n \t\t\t\ttest_device_configure_invalid_dev_id),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),\n \n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n-\n-\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n-\t}\n-};\n-\n-static struct unit_test_suite cryptodev_mrvl_sub_testsuite  = {\n-\t.suite_name = \"Crypto Device Marvell Component Test Suite\",\n-\t.unit_test_cases = {\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),\n-\n-\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n-\t}\n-};\n-\n-static struct unit_test_suite cryptodev_ccp_sub_testsuite  = {\n-\t.suite_name = \"Crypto Device CCP Unit Test Suite\",\n-\t.unit_test_cases = {\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n-\n \t\tTEST_CASES_END() /**< NULL terminate unit test array */\n \t}\n };\n@@ -14141,7 +14027,16 @@ static struct unit_test_suite cryptodev_ccp_sub_testsuite  = {\n static int\n test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -14175,11 +14070,13 @@ test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)\n \t\treturn TEST_SKIPPED;\n \t}\n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -14187,9 +14084,11 @@ test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)\n static int\n test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE\n+\t};\n \tstruct unit_test_suite *static_suites[] = {\n-\t\t&cryptodev_virtio_sub_testsuite,\n \t\t&end_testsuite\n \t};\n \tstruct unit_test_suite ts = {\n@@ -14206,11 +14105,13 @@ test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/)\n \t\treturn TEST_FAILED;\n \t}\n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -14218,7 +14119,16 @@ test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/)\n static int\n test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -14253,11 +14163,13 @@ test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -14266,8 +14178,17 @@ static int\n test_cryptodev_cpu_aesni_mb(void)\n {\n \tint32_t rc;\n-\tuint8_t j, i = 0;\n+\tuint8_t j, i = 0, blk_start_idx = 0;\n \tenum rte_security_session_action_type at;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -14302,13 +14223,15 @@ test_cryptodev_cpu_aesni_mb(void)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \n \tat = gbl_action_type;\n \tgbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;\n \trc = unit_test_suite_runner(&ts);\n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \tgbl_action_type = at;\n \treturn rc;\n@@ -14317,7 +14240,16 @@ test_cryptodev_cpu_aesni_mb(void)\n static int\n test_cryptodev_openssl(void)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -14352,11 +14284,13 @@ test_cryptodev_openssl(void)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -14364,7 +14298,16 @@ test_cryptodev_openssl(void)\n static int\n test_cryptodev_aesni_gcm(void)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -14399,11 +14342,13 @@ test_cryptodev_aesni_gcm(void)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -14412,8 +14357,17 @@ static int\n test_cryptodev_cpu_aesni_gcm(void)\n {\n \tint32_t rc;\n-\tuint8_t j, i = 0;\n+\tuint8_t j, i = 0, blk_start_idx = 0;\n \tenum rte_security_session_action_type at;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -14448,13 +14402,15 @@ test_cryptodev_cpu_aesni_gcm(void)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \n \tat = gbl_action_type;\n \tgbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;\n \trc  = unit_test_suite_runner(&ts);\n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \tgbl_action_type = at;\n \treturn rc;\n@@ -14463,7 +14419,16 @@ test_cryptodev_cpu_aesni_gcm(void)\n static int\n test_cryptodev_null(void)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -14498,11 +14463,13 @@ test_cryptodev_null(void)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -14510,7 +14477,16 @@ test_cryptodev_null(void)\n static int\n test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -14545,11 +14521,13 @@ test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -14557,7 +14535,16 @@ test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)\n static int\n test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -14592,11 +14579,13 @@ test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -14604,7 +14593,16 @@ test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)\n static int\n test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -14639,11 +14637,13 @@ test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -14651,7 +14651,16 @@ test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)\n static int\n test_cryptodev_armv8(void)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -14686,11 +14695,13 @@ test_cryptodev_armv8(void)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -14698,7 +14709,13 @@ test_cryptodev_armv8(void)\n static int\n test_cryptodev_mrvl(void)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -14716,7 +14733,6 @@ test_cryptodev_mrvl(void)\n \t\t&cryptodev_mixed_cipher_hash_testsuite,\n \t\t&cryptodev_negative_hmac_sha1_testsuite,\n \t\t&cryptodev_testsuite,\n-\t\t&cryptodev_mrvl_sub_testsuite,\n \t\t&end_testsuite\n \t};\n \tstruct unit_test_suite ts = {\n@@ -14734,11 +14750,13 @@ test_cryptodev_mrvl(void)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -14748,54 +14766,31 @@ test_cryptodev_mrvl(void)\n static int\n test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE\n+\t};\n \tstatic struct unit_test_suite scheduler_multicore = {\n \t\t.suite_name = \"Scheduler Multicore Unit Test Suite\",\n \t\t.setup = scheduler_multicore_testsuite_setup,\n-\t\t.teardown = scheduler_mode_testsuite_teardown,\n-\t\t.unit_test_cases = {\n-\t\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n-\t\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\ttest_AES_cipheronly_all),\n-\t\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n-\t\t\tTEST_CASES_END()\n-\t\t}\n+\t\t.teardown = scheduler_mode_testsuite_teardown\n \t};\n \tstatic struct unit_test_suite scheduler_round_robin = {\n \t\t.suite_name = \"Scheduler Round Robin Unit Test Suite\",\n \t\t.setup = scheduler_roundrobin_testsuite_setup,\n-\t\t.teardown = scheduler_mode_testsuite_teardown,\n-\t\t.unit_test_cases = {\n-\t\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n-\t\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\ttest_AES_cipheronly_all),\n-\t\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n-\t\t\tTEST_CASES_END()\n-\t\t}\n+\t\t.teardown = scheduler_mode_testsuite_teardown\n \t};\n \tstatic struct unit_test_suite scheduler_failover = {\n \t\t.suite_name = \"Scheduler Failover Unit Test Suite\",\n \t\t.setup = scheduler_failover_testsuite_setup,\n-\t\t.teardown = scheduler_mode_testsuite_teardown,\n-\t\t.unit_test_cases = {\n-\t\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n-\t\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\ttest_AES_cipheronly_all),\n-\t\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n-\t\t\tTEST_CASES_END()\n-\t\t}\n+\t\t.teardown = scheduler_mode_testsuite_teardown\n \t};\n \tstatic struct unit_test_suite scheduler_pkt_size_distr = {\n \t\t.suite_name = \"Scheduler Pkt Size Distr Unit Test Suite\",\n \t\t.setup = scheduler_pkt_size_distr_testsuite_setup,\n-\t\t.teardown = scheduler_mode_testsuite_teardown,\n-\t\t.unit_test_cases = {\n-\t\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),\n-\t\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\t\ttest_AES_cipheronly_all),\n-\t\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),\n-\t\t\tTEST_CASES_END()\n-\t\t}\n+\t\t.teardown = scheduler_mode_testsuite_teardown\n \t};\n \tstruct unit_test_suite *sched_mode_suites[] = {\n \t\t&scheduler_multicore,\n@@ -14840,6 +14835,16 @@ test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)\n \t\treturn TEST_SKIPPED;\n \t}\n \n+\tfor (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {\n+\t\tuint8_t blk_i = 0;\n+\t\tsched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof\n+\t\t\t\t(struct unit_test_suite *) *\n+\t\t\t\t(RTE_DIM(blk_suites) + 1));\n+\t\tADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),\n+\t\t\t\tblk_suites, RTE_DIM(blk_suites));\n+\t\tsched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;\n+\t}\n+\n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n \t\t\t(RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));\n \tADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,\n@@ -14847,6 +14852,12 @@ test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tfor (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {\n+\t\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,\n+\t\t\t\t(*sched_mode_suites[sched_i]),\n+\t\t\t\tRTE_DIM(blk_suites));\n+\t\tfree(sched_mode_suites[sched_i]->unit_test_suites);\n+\t}\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -14858,7 +14869,16 @@ REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);\n static int\n test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -14893,11 +14913,13 @@ test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -14905,7 +14927,16 @@ test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/)\n static int\n test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -14940,11 +14971,13 @@ test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -14952,11 +14985,16 @@ test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/)\n static int\n test_cryptodev_ccp(void)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_negative_hmac_sha1_testsuite,\n-\t\t&cryptodev_ccp_sub_testsuite,\n \t\t&end_testsuite\n \t};\n \tstruct unit_test_suite ts = {\n@@ -14974,11 +15012,13 @@ test_cryptodev_ccp(void)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -14986,7 +15026,16 @@ test_cryptodev_ccp(void)\n static int\n test_cryptodev_octeontx(void)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -15021,11 +15070,13 @@ test_cryptodev_octeontx(void)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -15033,7 +15084,16 @@ test_cryptodev_octeontx(void)\n static int\n test_cryptodev_octeontx2(void)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -15068,11 +15128,13 @@ test_cryptodev_octeontx2(void)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -15080,7 +15142,13 @@ test_cryptodev_octeontx2(void)\n static int\n test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_caam_jr_sub_testsuite,\n \t\t&end_testsuite\n@@ -15100,11 +15168,13 @@ test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -15112,7 +15182,16 @@ test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/)\n static int\n test_cryptodev_nitrox(void)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -15147,11 +15226,13 @@ test_cryptodev_nitrox(void)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -15159,7 +15240,16 @@ test_cryptodev_nitrox(void)\n static int\n test_cryptodev_bcmfs(void)\n {\n-\tuint8_t ret, j, i = 0;\n+\tuint8_t ret, j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_DOCSIS_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -15194,11 +15284,13 @@ test_cryptodev_bcmfs(void)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tret = unit_test_suite_runner(&ts);\n \n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \treturn ret;\n }\n@@ -15207,7 +15299,14 @@ static int\n test_cryptodev_qat_raw_api(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n \tint ret;\n-\tuint8_t j, i = 0;\n+\tuint8_t j, i = 0, blk_start_idx = 0;\n+\tconst enum blockcipher_test_type blk_suites[] = {\n+\t\tBLKCIPHER_AES_CHAIN_TYPE,\n+\t\tBLKCIPHER_AES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_3DES_CHAIN_TYPE,\n+\t\tBLKCIPHER_3DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_DES_CIPHERONLY_TYPE,\n+\t\tBLKCIPHER_AUTHONLY_TYPE};\n \tstruct unit_test_suite *static_suites[] = {\n \t\t&cryptodev_multi_session_testsuite,\n \t\t&cryptodev_null_testsuite,\n@@ -15242,11 +15341,13 @@ test_cryptodev_qat_raw_api(void /*argv __rte_unused, int argc __rte_unused*/)\n \t}\n \n \tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n-\t\t\tRTE_DIM(static_suites));\n+\t\t\t(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));\n \n+\tADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));\n \tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n \tglobal_api_test_type = CRYPTODEV_RAW_API_TEST;\n \tret = unit_test_suite_runner(&ts);\n+\tFREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));\n \tfree(ts.unit_test_suites);\n \tglobal_api_test_type = CRYPTODEV_API_TEST;\n \ndiff --git a/app/test/test_cryptodev_blockcipher.c b/app/test/test_cryptodev_blockcipher.c\nindex 8e168724be..9c844c6bd2 100644\n--- a/app/test/test_cryptodev_blockcipher.c\n+++ b/app/test/test_cryptodev_blockcipher.c\n@@ -738,82 +738,105 @@ test_blockcipher_one_case(const struct blockcipher_test_case *t,\n \treturn status;\n }\n \n-int\n-test_blockcipher_all_tests(struct rte_mempool *mbuf_pool,\n-\tstruct rte_mempool *op_mpool,\n-\tstruct rte_mempool *sess_mpool,\n-\tstruct rte_mempool *sess_priv_mpool,\n-\tuint8_t dev_id,\n-\tenum blockcipher_test_type test_type)\n+static int\n+blockcipher_test_case_run(const void *data)\n {\n-\tint status, overall_status = TEST_SUCCESS;\n-\tuint32_t i, test_index = 0;\n+\tconst struct blockcipher_test_case *tc_data = data;\n+\tint status;\n \tchar test_msg[BLOCKCIPHER_TEST_MSG_LEN + 1];\n-\tuint32_t n_test_cases = 0;\n-\tconst struct blockcipher_test_case *tcs = NULL;\n+\n+\tstatus = test_blockcipher_one_case(tc_data,\n+\t\t\tp_testsuite_params->mbuf_pool,\n+\t\t\tp_testsuite_params->op_mpool,\n+\t\t\tp_testsuite_params->session_mpool,\n+\t\t\tp_testsuite_params->session_priv_mpool,\n+\t\t\tp_testsuite_params->valid_devs[0],\n+\t\t\ttest_msg);\n+\treturn status;\n+}\n+\n+struct unit_test_suite *\n+build_blockcipher_test_suite(enum blockcipher_test_type test_type)\n+{\n+\tint i, n_test_cases = 0;\n+\tstruct unit_test_suite *ts;\n+\tconst char *ts_name = NULL;\n+\tconst struct blockcipher_test_case *blk_tcs;\n+\tstruct unit_test_case *tc;\n \n \tswitch (test_type) {\n \tcase BLKCIPHER_AES_CHAIN_TYPE:\n-\t\tn_test_cases = sizeof(aes_chain_test_cases) /\n-\t\tsizeof(aes_chain_test_cases[0]);\n-\t\ttcs = aes_chain_test_cases;\n+\t\tn_test_cases = RTE_DIM(aes_chain_test_cases);\n+\t\tblk_tcs = aes_chain_test_cases;\n+\t\tts_name = \"AES Chain\";\n \t\tbreak;\n \tcase BLKCIPHER_AES_CIPHERONLY_TYPE:\n-\t\tn_test_cases = sizeof(aes_cipheronly_test_cases) /\n-\t\tsizeof(aes_cipheronly_test_cases[0]);\n-\t\ttcs = aes_cipheronly_test_cases;\n+\t\tn_test_cases = RTE_DIM(aes_cipheronly_test_cases);\n+\t\tblk_tcs = aes_cipheronly_test_cases;\n+\t\tts_name = \"AES Cipher Only\";\n \t\tbreak;\n \tcase BLKCIPHER_AES_DOCSIS_TYPE:\n-\t\tn_test_cases = sizeof(aes_docsis_test_cases) /\n-\t\tsizeof(aes_docsis_test_cases[0]);\n-\t\ttcs = aes_docsis_test_cases;\n+\t\tn_test_cases = RTE_DIM(aes_docsis_test_cases);\n+\t\tblk_tcs = aes_docsis_test_cases;\n+\t\tts_name = \"AES Docsis\";\n \t\tbreak;\n \tcase BLKCIPHER_3DES_CHAIN_TYPE:\n-\t\tn_test_cases = sizeof(triple_des_chain_test_cases) /\n-\t\tsizeof(triple_des_chain_test_cases[0]);\n-\t\ttcs = triple_des_chain_test_cases;\n+\t\tn_test_cases = RTE_DIM(triple_des_chain_test_cases);\n+\t\tblk_tcs = triple_des_chain_test_cases;\n+\t\tts_name = \"3DES Chain\";\n \t\tbreak;\n \tcase BLKCIPHER_3DES_CIPHERONLY_TYPE:\n-\t\tn_test_cases = sizeof(triple_des_cipheronly_test_cases) /\n-\t\tsizeof(triple_des_cipheronly_test_cases[0]);\n-\t\ttcs = triple_des_cipheronly_test_cases;\n+\t\tn_test_cases = RTE_DIM(triple_des_cipheronly_test_cases);\n+\t\tblk_tcs = triple_des_cipheronly_test_cases;\n+\t\tts_name = \"3DES Cipher Only\";\n \t\tbreak;\n \tcase BLKCIPHER_DES_CIPHERONLY_TYPE:\n-\t\tn_test_cases = sizeof(des_cipheronly_test_cases) /\n-\t\tsizeof(des_cipheronly_test_cases[0]);\n-\t\ttcs = des_cipheronly_test_cases;\n+\t\tn_test_cases = RTE_DIM(des_cipheronly_test_cases);\n+\t\tblk_tcs = des_cipheronly_test_cases;\n+\t\tts_name = \"DES Cipher Only\";\n \t\tbreak;\n \tcase BLKCIPHER_DES_DOCSIS_TYPE:\n-\t\tn_test_cases = sizeof(des_docsis_test_cases) /\n-\t\tsizeof(des_docsis_test_cases[0]);\n-\t\ttcs = des_docsis_test_cases;\n+\t\tn_test_cases = RTE_DIM(des_docsis_test_cases);\n+\t\tblk_tcs = des_docsis_test_cases;\n+\t\tts_name = \"DES Docsis\";\n \t\tbreak;\n \tcase BLKCIPHER_AUTHONLY_TYPE:\n-\t\tn_test_cases = sizeof(hash_test_cases) /\n-\t\tsizeof(hash_test_cases[0]);\n-\t\ttcs = hash_test_cases;\n+\t\tn_test_cases = RTE_DIM(hash_test_cases);\n+\t\tblk_tcs = hash_test_cases;\n+\t\tts_name = \"Auth Only\";\n \t\tbreak;\n \tdefault:\n \t\tbreak;\n \t}\n \n-\tfor (i = 0; i < n_test_cases; i++) {\n-\t\tconst struct blockcipher_test_case *tc = &tcs[i];\n-\n-\t\tstatus = test_blockcipher_one_case(tc, mbuf_pool, op_mpool,\n-\t\t\tsess_mpool, sess_priv_mpool, dev_id,\n-\t\t\ttest_msg);\n-\n-\t\tprintf(\"  %u) TestCase %s %s\\n\", test_index ++,\n-\t\t\ttc->test_descr, test_msg);\n+\tts = calloc(1, sizeof(struct unit_test_suite) +\n+\t\t\t(sizeof(struct unit_test_case) * (n_test_cases + 1)));\n+\tts->suite_name = ts_name;\n \n-\t\tif (status == TEST_FAILED) {\n-\t\t\toverall_status = status;\n-\n-\t\t\tif (tc->feature_mask & BLOCKCIPHER_TEST_FEATURE_STOPPER)\n-\t\t\t\tbreak;\n-\t\t}\n+\tfor (i = 0; i < n_test_cases; i++) {\n+\t\ttc = &ts->unit_test_cases[i];\n+\t\ttc->name = blk_tcs[i].test_descr;\n+\t\ttc->enabled = 1;\n+\t\ttc->setup = ut_setup;\n+\t\ttc->teardown = ut_teardown;\n+\t\ttc->testcase = NULL;\n+\t\ttc->testcase_with_data = blockcipher_test_case_run;\n+\t\ttc->data = &blk_tcs[i];\n \t}\n+\ttc = &ts->unit_test_cases[i];\n+\ttc->name = NULL;\n+\ttc->enabled = 0;\n+\ttc->setup = NULL;\n+\ttc->teardown = NULL;\n+\ttc->testcase = NULL;\n+\ttc->testcase_with_data = NULL;\n+\ttc->data = NULL;\n+\n+\treturn ts;\n+}\n \n-\treturn overall_status;\n+void\n+free_blockcipher_test_suite(struct unit_test_suite *ts)\n+{\n+\tfree(ts);\n }\ndiff --git a/app/test/test_cryptodev_blockcipher.h b/app/test/test_cryptodev_blockcipher.h\nindex 8990716844..ad2a4fd61b 100644\n--- a/app/test/test_cryptodev_blockcipher.h\n+++ b/app/test/test_cryptodev_blockcipher.h\n@@ -89,12 +89,10 @@ struct blockcipher_test_data {\n \tunsigned int auth_offset;\n };\n \n-int\n-test_blockcipher_all_tests(struct rte_mempool *mbuf_pool,\n-\tstruct rte_mempool *op_mpool,\n-\tstruct rte_mempool *sess_mpool,\n-\tstruct rte_mempool *sess_priv_mpool,\n-\tuint8_t dev_id,\n-\tenum blockcipher_test_type test_type);\n+struct unit_test_suite *\n+build_blockcipher_test_suite(enum blockcipher_test_type test_type);\n+\n+void\n+free_blockcipher_test_suite(struct unit_test_suite *ts);\n \n #endif /* TEST_CRYPTODEV_BLOCKCIPHER_H_ */\ndiff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst\nindex 19cec62c73..cf1fbb5533 100644\n--- a/doc/guides/rel_notes/release_21_05.rst\n+++ b/doc/guides/rel_notes/release_21_05.rst\n@@ -126,6 +126,11 @@ New Features\n   * Added command to display Rx queue used descriptor count.\n     ``show port (port_id) rxq (queue_id) desc used count``\n \n+* **Added sub-testsuite support.**\n+\n+  * The unit test suite struct now supports having either a nested\n+    list of sub-testsuites, or a list of testcases as before.\n+\n \n Removed Items\n -------------\n",
    "prefixes": [
        "v2",
        "6/6"
    ]
}