get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 92088,
    "url": "http://patches.dpdk.org/api/patches/92088/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20210423161820.2135053-4-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": "<20210423161820.2135053-4-ciara.power@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210423161820.2135053-4-ciara.power@intel.com",
    "date": "2021-04-23T16:18:16",
    "name": "[v3,3/7] test/crypto: refactor to use sub-testsuites",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "f810fe8bd2f3767849450ee351d6272fe1f077fb",
    "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/20210423161820.2135053-4-ciara.power@intel.com/mbox/",
    "series": [
        {
            "id": 16638,
            "url": "http://patches.dpdk.org/api/series/16638/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=16638",
            "date": "2021-04-23T16:18:13",
            "name": "test: refactor crypto unit test framework",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/16638/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/92088/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/92088/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 E9EF7A0547;\n\tFri, 23 Apr 2021 18:19:05 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id DC9C9410F6;\n\tFri, 23 Apr 2021 18:18:56 +0200 (CEST)",
            "from mga18.intel.com (mga18.intel.com [134.134.136.126])\n by mails.dpdk.org (Postfix) with ESMTP id 516184110C\n for <dev@dpdk.org>; Fri, 23 Apr 2021 18:18:54 +0200 (CEST)",
            "from orsmga008.jf.intel.com ([10.7.209.65])\n by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 23 Apr 2021 09:18:53 -0700",
            "from silpixa00400355.ir.intel.com (HELO\n silpixa00400355.ger.corp.intel.com) ([10.237.223.148])\n by orsmga008.jf.intel.com with ESMTP; 23 Apr 2021 09:18:50 -0700"
        ],
        "IronPort-SDR": [
            "\n BOs7wTLoqnfzWMeaxxeiDD+uRDLMfx85ENnzaoZY1lmw4qUXcH5E4fP9iyZuYs90o1Xyn4Ni25\n FMMs9LCqfvNg==",
            "\n bldu/K//AFl04fliChHqJvIqlMGdXba/+tZyQB+AN3nJWoFAXO+7Uo9x4gQdwIOGz6LJgG7nHx\n YhQKIdjJUVLA=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6200,9189,9963\"; a=\"183572775\"",
            "E=Sophos;i=\"5.82,246,1613462400\"; d=\"scan'208\";a=\"183572775\"",
            "E=Sophos;i=\"5.82,246,1613462400\"; d=\"scan'208\";a=\"428442329\""
        ],
        "X-ExtLoop1": "1",
        "From": "Ciara Power <ciara.power@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "thomas@monjalon.net, declan.doherty@intel.com, gakhil@marvell.com,\n aconole@redhat.com, hemant.agrawal@nxp.com, anoobj@marvell.com,\n ruifeng.wang@arm.com, asomalap@amd.com, ajit.khaparde@broadcom.com,\n g.singh@nxp.com, Ciara Power <ciara.power@intel.com>",
        "Date": "Fri, 23 Apr 2021 16:18:16 +0000",
        "Message-Id": "<20210423161820.2135053-4-ciara.power@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20210423161820.2135053-1-ciara.power@intel.com>",
        "References": "<20210423161820.2135053-1-ciara.power@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v3 3/7] test/crypto: refactor to use\n sub-testsuites",
        "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": "The existing implementation runs a giant cryptodev testsuite for most\nautotests, which in turns runs one setup function regardless of device.\n\nThis is now broken down into multiple testsuites,\nthat are used as sub-testsuites. Each autotest runs a general crypto\nparent test suite, to which the sub-testsuites are added.\n\nFor example, the AESNI_MB test runs \"Cryptodev Unit Test Suite\",\nwhich has a setup function only to configure testsuite params.\nCreation of vdevs in the setup function is no longer supported,\nit is expected the user does this when running the app.\nThis autotest previously just ran the cryptodev_testsuite,\nbut now has the smaller sub-testsuites added to the parent suite instead.\nThe same test cases are being run as before.\n\nThe scheduler autotest creates its own parent testsuite with nested\nsub-testsuites, rather than using the cryptodev testsuite mentioned above.\nThis is due to it being more complex in execution,\nby requiring setting different modes before running tests.\nThe scheduler autotest no longer requires the extra test cases to\nattach/set mode/detach when running the blockcipher test cases for\neach mode. The attach/set mode/detach functionality is now tested in a\nsub-testsuite. When running the sub-testsuites for each mode,\nthe attach/set mode/detach happens in the setup and teardown functions\nfor that sub-testsuite.\n\nSigned-off-by: Ciara Power <ciara.power@intel.com>\n\n---\nv3:\n  - Added NULL testcase to each testsuite that has only sub-testsuites,\n    and no other testcases.\n  - Autotests now run one general crypto testsuite, rather than have\n    PMD based parent testsuites.\n  - Sub-testsuites now have setup functions which verify the\n    capabilities needed for the testcases in that suite are supported.\n  - Vdevs are no longer created in the setup functions,\n    this must be done by the user when running the test.\nv2:\n  - Modified sub-testsuites to be added as pointers.\n  - Made necessary changes resulting from v2 changes in previous patches.\n---\n app/test/test_cryptodev.c | 1797 +++++++++++++++++++++++--------------\n app/test/test_cryptodev.h |   12 +\n 2 files changed, 1147 insertions(+), 662 deletions(-)",
    "diff": "diff --git a/app/test/test_cryptodev.c b/app/test/test_cryptodev.c\nindex 32e64e2dd1..4fe30ddb21 100644\n--- a/app/test/test_cryptodev.c\n+++ b/app/test/test_cryptodev.c\n@@ -112,6 +112,10 @@ struct crypto_unittest_params {\n #define ALIGN_POW2_ROUNDUP(num, align) \\\n \t(((num) + (align) - 1) & ~((align) - 1))\n \n+#define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts)\t\\\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 /*\n  * Forward declarations.\n  */\n@@ -490,7 +494,6 @@ testsuite_setup(void)\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n \tstruct rte_cryptodev_info info;\n \tuint32_t i = 0, nb_devs, dev_id;\n-\tint ret;\n \tuint16_t qp_id;\n \n \tmemset(ts_params, 0, sizeof(*ts_params));\n@@ -536,223 +539,18 @@ testsuite_setup(void)\n \t\treturn TEST_FAILED;\n \t}\n \n-\t/* Create an AESNI MB device if required */\n-\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) {\n-\t\tnb_devs = rte_cryptodev_device_count_by_driver(\n-\t\t\t\trte_cryptodev_driver_id_get(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));\n-\t\tif (nb_devs < 1) {\n-\t\t\tret = rte_vdev_init(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), NULL);\n-\n-\t\t\tTEST_ASSERT(ret == 0,\n-\t\t\t\t\"Failed to create instance of\"\n-\t\t\t\t\" pmd : %s\",\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));\n-\t\t}\n-\t}\n-\n-\t/* Create an AESNI GCM device if required */\n-\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))) {\n-\t\tnb_devs = rte_cryptodev_device_count_by_driver(\n-\t\t\t\trte_cryptodev_driver_id_get(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)));\n-\t\tif (nb_devs < 1) {\n-\t\t\tTEST_ASSERT_SUCCESS(rte_vdev_init(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD), NULL),\n-\t\t\t\t\"Failed to create instance of\"\n-\t\t\t\t\" pmd : %s\",\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));\n-\t\t}\n-\t}\n-\n-\t/* Create a SNOW 3G device if required */\n-\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_SNOW3G_PMD))) {\n-\t\tnb_devs = rte_cryptodev_device_count_by_driver(\n-\t\t\t\trte_cryptodev_driver_id_get(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)));\n-\t\tif (nb_devs < 1) {\n-\t\t\tTEST_ASSERT_SUCCESS(rte_vdev_init(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_SNOW3G_PMD), NULL),\n-\t\t\t\t\"Failed to create instance of\"\n-\t\t\t\t\" pmd : %s\",\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));\n-\t\t}\n-\t}\n-\n-\t/* Create a KASUMI device if required */\n-\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_KASUMI_PMD))) {\n-\t\tnb_devs = rte_cryptodev_device_count_by_driver(\n-\t\t\t\trte_cryptodev_driver_id_get(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_KASUMI_PMD)));\n-\t\tif (nb_devs < 1) {\n-\t\t\tTEST_ASSERT_SUCCESS(rte_vdev_init(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_KASUMI_PMD), NULL),\n-\t\t\t\t\"Failed to create instance of\"\n-\t\t\t\t\" pmd : %s\",\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_KASUMI_PMD));\n-\t\t}\n-\t}\n-\n-\t/* Create a ZUC device if required */\n-\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_ZUC_PMD))) {\n-\t\tnb_devs = rte_cryptodev_device_count_by_driver(\n-\t\t\t\trte_cryptodev_driver_id_get(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_ZUC_PMD)));\n-\t\tif (nb_devs < 1) {\n-\t\t\tTEST_ASSERT_SUCCESS(rte_vdev_init(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_ZUC_PMD), NULL),\n-\t\t\t\t\"Failed to create instance of\"\n-\t\t\t\t\" pmd : %s\",\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_ZUC_PMD));\n-\t\t}\n-\t}\n-\n-\t/* Create a NULL device if required */\n-\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_NULL_PMD))) {\n-\t\tnb_devs = rte_cryptodev_device_count_by_driver(\n-\t\t\t\trte_cryptodev_driver_id_get(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_NULL_PMD)));\n-\t\tif (nb_devs < 1) {\n-\t\t\tret = rte_vdev_init(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_NULL_PMD), NULL);\n-\n-\t\t\tTEST_ASSERT(ret == 0,\n-\t\t\t\t\"Failed to create instance of\"\n-\t\t\t\t\" pmd : %s\",\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_NULL_PMD));\n-\t\t}\n-\t}\n-\n-\t/* Create an OPENSSL device if required */\n-\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) {\n-\t\tnb_devs = rte_cryptodev_device_count_by_driver(\n-\t\t\t\trte_cryptodev_driver_id_get(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)));\n-\t\tif (nb_devs < 1) {\n-\t\t\tret = rte_vdev_init(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_OPENSSL_PMD),\n-\t\t\t\tNULL);\n-\n-\t\t\tTEST_ASSERT(ret == 0, \"Failed to create \"\n-\t\t\t\t\"instance of pmd : %s\",\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));\n-\t\t}\n-\t}\n-\n-\t/* Create a ARMv8 device if required */\n-\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_ARMV8_PMD))) {\n-\t\tnb_devs = rte_cryptodev_device_count_by_driver(\n-\t\t\t\trte_cryptodev_driver_id_get(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_ARMV8_PMD)));\n-\t\tif (nb_devs < 1) {\n-\t\t\tret = rte_vdev_init(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_ARMV8_PMD),\n-\t\t\t\tNULL);\n-\n-\t\t\tTEST_ASSERT(ret == 0, \"Failed to create \"\n-\t\t\t\t\"instance of pmd : %s\",\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_ARMV8_PMD));\n-\t\t}\n-\t}\n-\n-\t/* Create a MVSAM device if required */\n-\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_MVSAM_PMD))) {\n-\t\tnb_devs = rte_cryptodev_device_count_by_driver(\n-\t\t\t\trte_cryptodev_driver_id_get(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_MVSAM_PMD)));\n-\t\tif (nb_devs < 1) {\n-\t\t\tret = rte_vdev_init(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_MVSAM_PMD),\n-\t\t\t\tNULL);\n-\n-\t\t\tTEST_ASSERT(ret == 0, \"Failed to create \"\n-\t\t\t\t\"instance of pmd : %s\",\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_MVSAM_PMD));\n-\t\t}\n-\t}\n-\n-\t/* Create an CCP device if required */\n-\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_CCP_PMD))) {\n-\t\tnb_devs = rte_cryptodev_device_count_by_driver(\n-\t\t\t\trte_cryptodev_driver_id_get(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_CCP_PMD)));\n-\t\tif (nb_devs < 1) {\n-\t\t\tret = rte_vdev_init(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_CCP_PMD),\n-\t\t\t\tNULL);\n-\n-\t\t\tTEST_ASSERT(ret == 0, \"Failed to create \"\n-\t\t\t\t\"instance of pmd : %s\",\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_CCP_PMD));\n-\t\t}\n-\t}\n-\n-#ifdef RTE_CRYPTO_SCHEDULER\n-\tchar vdev_args[VDEV_ARGS_SIZE] = {\"\"};\n-\tchar temp_str[VDEV_ARGS_SIZE] = {\"mode=multi-core,\"\n-\t\t\"ordering=enable,name=cryptodev_test_scheduler,corelist=\"};\n-\tuint16_t worker_core_count = 0;\n-\tuint16_t socket_id = 0;\n-\n-\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {\n-\n-\t\t/* Identify the Worker Cores\n-\t\t * Use 2 worker cores for the device args\n-\t\t */\n-\t\tRTE_LCORE_FOREACH_WORKER(i) {\n-\t\t\tif (worker_core_count > 1)\n-\t\t\t\tbreak;\n-\t\t\tsnprintf(vdev_args, sizeof(vdev_args),\n-\t\t\t\t\t\"%s%d\", temp_str, i);\n-\t\t\tstrcpy(temp_str, vdev_args);\n-\t\t\tstrlcat(temp_str, \";\", sizeof(temp_str));\n-\t\t\tworker_core_count++;\n-\t\t\tsocket_id = rte_lcore_to_socket_id(i);\n-\t\t}\n-\t\tif (worker_core_count != 2) {\n-\t\t\tRTE_LOG(ERR, USER1,\n-\t\t\t\t\"Cryptodev scheduler test require at least \"\n-\t\t\t\t\"two worker cores to run. \"\n-\t\t\t\t\"Please use the correct coremask.\\n\");\n-\t\t\treturn TEST_FAILED;\n-\t\t}\n-\t\tstrcpy(temp_str, vdev_args);\n-\t\tsnprintf(vdev_args, sizeof(vdev_args), \"%s,socket_id=%d\",\n-\t\t\t\ttemp_str, socket_id);\n-\t\tRTE_LOG(DEBUG, USER1, \"vdev_args: %s\\n\", vdev_args);\n-\t\tnb_devs = rte_cryptodev_device_count_by_driver(\n-\t\t\t\trte_cryptodev_driver_id_get(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));\n-\t\tif (nb_devs < 1) {\n-\t\t\tret = rte_vdev_init(\n-\t\t\t\tRTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),\n-\t\t\t\t\tvdev_args);\n-\t\t\tTEST_ASSERT(ret == 0,\n-\t\t\t\t\"Failed to create instance %u of\"\n-\t\t\t\t\" pmd : %s\",\n-\t\t\t\ti, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));\n-\t\t}\n-\t}\n-#endif /* RTE_CRYPTO_SCHEDULER */\n-\n \tnb_devs = rte_cryptodev_count();\n \tif (nb_devs < 1) {\n \t\tRTE_LOG(WARNING, USER1, \"No crypto devices found?\\n\");\n \t\treturn TEST_SKIPPED;\n \t}\n \n+\tif (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) {\n+\t\tRTE_LOG(WARNING, USER1, \"No %s devices found?\\n\",\n+\t\t\t\trte_cryptodev_driver_name_get(gbl_driver_id));\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n \t/* Create list of valid crypto devs */\n \tfor (i = 0; i < nb_devs; i++) {\n \t\trte_cryptodev_info_get(i, &info);\n@@ -865,125 +663,733 @@ testsuite_teardown(void)\n }\n \n static int\n-dev_configure_and_start(uint64_t ff_disable)\n+check_capabilities_supported(enum rte_crypto_sym_xform_type type,\n+\t\tconst int *algs, uint16_t num_algs)\n {\n-\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\n-\tuint16_t qp_id;\n-\n-\t/* Clear unit test parameters before running test */\n-\tmemset(ut_params, 0, sizeof(*ut_params));\n-\n-\t/* Reconfigure device to default parameters */\n-\tts_params->conf.socket_id = SOCKET_ID_ANY;\n-\tts_params->conf.ff_disable = ff_disable;\n-\tts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;\n-\tts_params->qp_conf.mp_session = ts_params->session_mpool;\n-\tts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;\n-\n-\tTEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],\n-\t\t\t&ts_params->conf),\n-\t\t\t\"Failed to configure cryptodev %u\",\n-\t\t\tts_params->valid_devs[0]);\n+\tuint8_t dev_id = testsuite_params.valid_devs[0];\n+\tbool some_alg_supported = FALSE;\n+\tuint16_t i;\n \n-\tfor (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {\n-\t\tTEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(\n-\t\t\tts_params->valid_devs[0], qp_id,\n-\t\t\t&ts_params->qp_conf,\n-\t\t\trte_cryptodev_socket_id(ts_params->valid_devs[0])),\n-\t\t\t\"Failed to setup queue pair %u on cryptodev %u\",\n-\t\t\tqp_id, ts_params->valid_devs[0]);\n+\tfor (i = 0; i < num_algs && !some_alg_supported; i++) {\n+\t\tstruct rte_cryptodev_sym_capability_idx alg = {\n+\t\t\ttype, {algs[i]}\n+\t\t};\n+\t\tif (rte_cryptodev_sym_capability_get(dev_id,\n+\t\t\t\t&alg) != NULL)\n+\t\t\tsome_alg_supported = TRUE;\n \t}\n+\tif (!some_alg_supported)\n+\t\treturn TEST_SKIPPED;\n \n+\treturn 0;\n+}\n \n-\trte_cryptodev_stats_reset(ts_params->valid_devs[0]);\n-\n-\t/* Start the device */\n-\tTEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),\n-\t\t\t\"Failed to start cryptodev %u\",\n-\t\t\tts_params->valid_devs[0]);\n-\n-\treturn TEST_SUCCESS;\n+int\n+check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,\n+\t\tuint16_t num_ciphers)\n+{\n+\treturn check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER,\n+\t\t\t(const int *) ciphers, num_ciphers);\n }\n \n-static int\n-ut_setup(void)\n+int\n+check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,\n+\t\tuint16_t num_auths)\n {\n-\t/* Configure and start the device with security feature disabled */\n-\treturn dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);\n+\treturn check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH,\n+\t\t\t(const int *) auths, num_auths);\n }\n \n-static int\n-ut_setup_security(void)\n+int\n+check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,\n+\t\tuint16_t num_aeads)\n {\n-\t/* Configure and start the device with no features disabled */\n-\treturn dev_configure_and_start(0);\n+\treturn check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD,\n+\t\t\t(const int *) aeads, num_aeads);\n }\n \n-static void\n-ut_teardown(void)\n+static int\n+null_testsuite_setup(void)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tstruct crypto_unittest_params *ut_params = &unittest_params;\n-\tstruct rte_cryptodev_stats stats;\n-\n-\t/* free crypto session structure */\n-#ifdef RTE_LIB_SECURITY\n-\tif (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {\n-\t\tif (ut_params->sec_session) {\n-\t\t\trte_security_session_destroy(rte_cryptodev_get_sec_ctx\n-\t\t\t\t\t\t(ts_params->valid_devs[0]),\n-\t\t\t\t\t\tut_params->sec_session);\n-\t\t\tut_params->sec_session = NULL;\n-\t\t}\n-\t} else\n-#endif\n-\t{\n-\t\tif (ut_params->sess) {\n-\t\t\trte_cryptodev_sym_session_clear(\n-\t\t\t\t\tts_params->valid_devs[0],\n-\t\t\t\t\tut_params->sess);\n-\t\t\trte_cryptodev_sym_session_free(ut_params->sess);\n-\t\t\tut_params->sess = NULL;\n-\t\t}\n-\t}\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_cipher_algorithm ciphers[] = {\n+\t\tRTE_CRYPTO_CIPHER_NULL\n+\t};\n+\tconst enum rte_crypto_auth_algorithm auths[] = {\n+\t\tRTE_CRYPTO_AUTH_NULL\n+\t};\n \n-\t/* free crypto operation structure */\n-\tif (ut_params->op)\n-\t\trte_crypto_op_free(ut_params->op);\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n \n-\t/*\n-\t * free mbuf - both obuf and ibuf are usually the same,\n-\t * so check if they point at the same address is necessary,\n-\t * to avoid freeing the mbuf twice.\n-\t */\n-\tif (ut_params->obuf) {\n-\t\trte_pktmbuf_free(ut_params->obuf);\n-\t\tif (ut_params->ibuf == ut_params->obuf)\n-\t\t\tut_params->ibuf = 0;\n-\t\tut_params->obuf = 0;\n-\t}\n-\tif (ut_params->ibuf) {\n-\t\trte_pktmbuf_free(ut_params->ibuf);\n-\t\tut_params->ibuf = 0;\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for NULL \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n \t}\n \n-\tif (ts_params->mbuf_pool != NULL)\n-\t\tRTE_LOG(DEBUG, USER1, \"CRYPTO_MBUFPOOL count %u\\n\",\n-\t\t\trte_mempool_avail_count(ts_params->mbuf_pool));\n-\n-\trte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);\n+\tif (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0\n+\t\t\t&& check_auth_capabilities_supported(auths,\n+\t\t\tRTE_DIM(auths)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for NULL \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n \n-\t/* Stop the device */\n-\trte_cryptodev_stop(ts_params->valid_devs[0]);\n+\treturn 0;\n }\n \n static int\n-test_device_configure_invalid_dev_id(void)\n+crypto_gen_testsuite_setup(void)\n {\n \tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n-\tuint16_t dev_id, num_devs = 0;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for Crypto Gen \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+#ifdef RTE_LIB_SECURITY\n+static int\n+pdcp_proto_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_cipher_algorithm ciphers[] = {\n+\t\tRTE_CRYPTO_CIPHER_NULL,\n+\t\tRTE_CRYPTO_CIPHER_AES_CTR,\n+\t\tRTE_CRYPTO_CIPHER_ZUC_EEA3,\n+\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2\n+\t};\n+\tconst enum rte_crypto_auth_algorithm auths[] = {\n+\t\tRTE_CRYPTO_AUTH_NULL,\n+\t\tRTE_CRYPTO_AUTH_SNOW3G_UIA2,\n+\t\tRTE_CRYPTO_AUTH_AES_CMAC,\n+\t\tRTE_CRYPTO_AUTH_ZUC_EIA3\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||\n+\t\t\t!(dev_info.feature_flags &\n+\t\t\tRTE_CRYPTODEV_FF_SECURITY)) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for PDCP Proto \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0\n+\t\t\t&& check_auth_capabilities_supported(auths,\n+\t\t\tRTE_DIM(auths)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for PDCP Proto \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+docsis_proto_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_cipher_algorithm ciphers[] = {\n+\t\tRTE_CRYPTO_CIPHER_AES_DOCSISBPI\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||\n+\t\t\t!(dev_info.feature_flags &\n+\t\t\tRTE_CRYPTODEV_FF_SECURITY)) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for Docsis \"\n+\t\t\t\t\"Proto testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for Docsis Proto \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+#endif\n+\n+static int\n+aes_ccm_auth_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_aead_algorithm aeads[] = {\n+\t\tRTE_CRYPTO_AEAD_AES_CCM\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||\n+\t\t\t((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&\n+\t\t\t!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for AES CCM \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for AES CCM \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+aes_gcm_auth_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_aead_algorithm aeads[] = {\n+\t\tRTE_CRYPTO_AEAD_AES_GCM\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for AES GCM \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for AES GCM \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+aes_gmac_auth_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_auth_algorithm auths[] = {\n+\t\tRTE_CRYPTO_AUTH_AES_GMAC\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||\n+\t\t\t((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&\n+\t\t\t!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for AES GMAC \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for AES GMAC \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+chacha20_poly1305_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_aead_algorithm aeads[] = {\n+\t\tRTE_CRYPTO_AEAD_CHACHA20_POLY1305\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||\n+\t\t\t((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&\n+\t\t\t!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for \"\n+\t\t\t\t\"Chacha20-Poly1305 testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for \"\n+\t\t\t\t\"Chacha20-Poly1305 testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+snow3g_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_cipher_algorithm ciphers[] = {\n+\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2\n+\n+\t};\n+\tconst enum rte_crypto_auth_algorithm auths[] = {\n+\t\tRTE_CRYPTO_AUTH_SNOW3G_UIA2\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for Snow3G \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0\n+\t\t\t&& check_auth_capabilities_supported(auths,\n+\t\t\tRTE_DIM(auths)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for Snow3G \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+zuc_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_cipher_algorithm ciphers[] = {\n+\t\tRTE_CRYPTO_CIPHER_ZUC_EEA3\n+\t};\n+\tconst enum rte_crypto_auth_algorithm auths[] = {\n+\t\tRTE_CRYPTO_AUTH_ZUC_EIA3\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for ZUC \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0\n+\t\t\t&& check_auth_capabilities_supported(auths,\n+\t\t\tRTE_DIM(auths)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for ZUC \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+hmac_md5_auth_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_auth_algorithm auths[] = {\n+\t\tRTE_CRYPTO_AUTH_MD5_HMAC\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||\n+\t\t\t((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&\n+\t\t\t!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for HMAC MD5 \"\n+\t\t\t\t\"Auth testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for HMAC MD5 \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+kasumi_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_cipher_algorithm ciphers[] = {\n+\t\tRTE_CRYPTO_CIPHER_KASUMI_F8\n+\t};\n+\tconst enum rte_crypto_auth_algorithm auths[] = {\n+\t\tRTE_CRYPTO_AUTH_KASUMI_F9\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||\n+\t\t\t((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&\n+\t\t\t!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for Kasumi \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0\n+\t\t\t&& check_auth_capabilities_supported(auths,\n+\t\t\tRTE_DIM(auths)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for Kasumi \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+negative_aes_gcm_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_aead_algorithm aeads[] = {\n+\t\tRTE_CRYPTO_AEAD_AES_GCM\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||\n+\t\t\t((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&\n+\t\t\t!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for Negative \"\n+\t\t\t\t\"AES GCM testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for Negative \"\n+\t\t\t\t\"AES GCM testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+negative_aes_gmac_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_auth_algorithm auths[] = {\n+\t\tRTE_CRYPTO_AUTH_AES_GMAC\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||\n+\t\t\t((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&\n+\t\t\t!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for Negative \"\n+\t\t\t\t\"AES GMAC testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for Negative \"\n+\t\t\t\t\"AES GMAC testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+mixed_cipher_hash_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tuint64_t feat_flags;\n+\tconst enum rte_crypto_cipher_algorithm ciphers[] = {\n+\t\tRTE_CRYPTO_CIPHER_NULL,\n+\t\tRTE_CRYPTO_CIPHER_AES_CTR,\n+\t\tRTE_CRYPTO_CIPHER_ZUC_EEA3,\n+\t\tRTE_CRYPTO_CIPHER_SNOW3G_UEA2\n+\t};\n+\tconst enum rte_crypto_auth_algorithm auths[] = {\n+\t\tRTE_CRYPTO_AUTH_NULL,\n+\t\tRTE_CRYPTO_AUTH_SNOW3G_UIA2,\n+\t\tRTE_CRYPTO_AUTH_AES_CMAC,\n+\t\tRTE_CRYPTO_AUTH_ZUC_EIA3\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\tfeat_flags = dev_info.feature_flags;\n+\n+\tif (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||\n+\t\t\t(global_api_test_type == CRYPTODEV_RAW_API_TEST)) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for Mixed \"\n+\t\t\t\t\"Cipher Hash testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0\n+\t\t\t&& check_auth_capabilities_supported(auths,\n+\t\t\tRTE_DIM(auths)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for Mixed \"\n+\t\t\t\t\"Cipher Hash testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+esn_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_cipher_algorithm ciphers[] = {\n+\t\tRTE_CRYPTO_CIPHER_AES_CBC\n+\t};\n+\tconst enum rte_crypto_auth_algorithm auths[] = {\n+\t\tRTE_CRYPTO_AUTH_SHA1_HMAC\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||\n+\t\t\t((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&\n+\t\t\t!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for ESN \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0\n+\t\t\t&& check_auth_capabilities_supported(auths,\n+\t\t\tRTE_DIM(auths)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for ESN \"\n+\t\t\t\t\"testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+multi_session_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_cipher_algorithm ciphers[] = {\n+\t\tRTE_CRYPTO_CIPHER_AES_CBC\n+\t};\n+\tconst enum rte_crypto_auth_algorithm auths[] = {\n+\t\tRTE_CRYPTO_AUTH_SHA512_HMAC\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for Multi \"\n+\t\t\t\t\"Session testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0\n+\t\t\t&& check_auth_capabilities_supported(auths,\n+\t\t\tRTE_DIM(auths)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for Multi \"\n+\t\t\t\t\"Session testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+negative_hmac_sha1_testsuite_setup(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint8_t dev_id = ts_params->valid_devs[0];\n+\tstruct rte_cryptodev_info dev_info;\n+\tconst enum rte_crypto_cipher_algorithm ciphers[] = {\n+\t\tRTE_CRYPTO_CIPHER_AES_CBC\n+\t};\n+\tconst enum rte_crypto_auth_algorithm auths[] = {\n+\t\tRTE_CRYPTO_AUTH_SHA1_HMAC\n+\t};\n+\n+\trte_cryptodev_info_get(dev_id, &dev_info);\n+\n+\tif (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||\n+\t\t\t((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&\n+\t\t\t!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {\n+\t\tRTE_LOG(INFO, USER1, \"Feature flag requirements for Negative \"\n+\t\t\t\t\"HMAC SHA1 testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\tif (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0\n+\t\t\t&& check_auth_capabilities_supported(auths,\n+\t\t\tRTE_DIM(auths)) != 0) {\n+\t\tRTE_LOG(INFO, USER1, \"Capability requirements for Negative \"\n+\t\t\t\t\"HMAC SHA1 testsuite not met\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+dev_configure_and_start(uint64_t ff_disable)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\n+\tuint16_t qp_id;\n+\n+\t/* Clear unit test parameters before running test */\n+\tmemset(ut_params, 0, sizeof(*ut_params));\n+\n+\t/* Reconfigure device to default parameters */\n+\tts_params->conf.socket_id = SOCKET_ID_ANY;\n+\tts_params->conf.ff_disable = ff_disable;\n+\tts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;\n+\tts_params->qp_conf.mp_session = ts_params->session_mpool;\n+\tts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;\n+\n+\tTEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],\n+\t\t\t&ts_params->conf),\n+\t\t\t\"Failed to configure cryptodev %u\",\n+\t\t\tts_params->valid_devs[0]);\n+\n+\tfor (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {\n+\t\tTEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(\n+\t\t\tts_params->valid_devs[0], qp_id,\n+\t\t\t&ts_params->qp_conf,\n+\t\t\trte_cryptodev_socket_id(ts_params->valid_devs[0])),\n+\t\t\t\"Failed to setup queue pair %u on cryptodev %u\",\n+\t\t\tqp_id, ts_params->valid_devs[0]);\n+\t}\n+\n+\n+\trte_cryptodev_stats_reset(ts_params->valid_devs[0]);\n+\n+\t/* Start the device */\n+\tTEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),\n+\t\t\t\"Failed to start cryptodev %u\",\n+\t\t\tts_params->valid_devs[0]);\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+ut_setup(void)\n+{\n+\t/* Configure and start the device with security feature disabled */\n+\treturn dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);\n+}\n+\n+static int\n+ut_setup_security(void)\n+{\n+\t/* Configure and start the device with no features disabled */\n+\treturn dev_configure_and_start(0);\n+}\n+\n+static void\n+ut_teardown(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tstruct crypto_unittest_params *ut_params = &unittest_params;\n+\tstruct rte_cryptodev_stats stats;\n+\n+\t/* free crypto session structure */\n+#ifdef RTE_LIB_SECURITY\n+\tif (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {\n+\t\tif (ut_params->sec_session) {\n+\t\t\trte_security_session_destroy(rte_cryptodev_get_sec_ctx\n+\t\t\t\t\t\t(ts_params->valid_devs[0]),\n+\t\t\t\t\t\tut_params->sec_session);\n+\t\t\tut_params->sec_session = NULL;\n+\t\t}\n+\t} else\n+#endif\n+\t{\n+\t\tif (ut_params->sess) {\n+\t\t\trte_cryptodev_sym_session_clear(\n+\t\t\t\t\tts_params->valid_devs[0],\n+\t\t\t\t\tut_params->sess);\n+\t\t\trte_cryptodev_sym_session_free(ut_params->sess);\n+\t\t\tut_params->sess = NULL;\n+\t\t}\n+\t}\n+\n+\t/* free crypto operation structure */\n+\tif (ut_params->op)\n+\t\trte_crypto_op_free(ut_params->op);\n+\n+\t/*\n+\t * free mbuf - both obuf and ibuf are usually the same,\n+\t * so check if they point at the same address is necessary,\n+\t * to avoid freeing the mbuf twice.\n+\t */\n+\tif (ut_params->obuf) {\n+\t\trte_pktmbuf_free(ut_params->obuf);\n+\t\tif (ut_params->ibuf == ut_params->obuf)\n+\t\t\tut_params->ibuf = 0;\n+\t\tut_params->obuf = 0;\n+\t}\n+\tif (ut_params->ibuf) {\n+\t\trte_pktmbuf_free(ut_params->ibuf);\n+\t\tut_params->ibuf = 0;\n+\t}\n+\n+\tif (ts_params->mbuf_pool != NULL)\n+\t\tRTE_LOG(DEBUG, USER1, \"CRYPTO_MBUFPOOL count %u\\n\",\n+\t\t\trte_mempool_avail_count(ts_params->mbuf_pool));\n+\n+\trte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);\n+\n+\t/* Stop the device */\n+\trte_cryptodev_stop(ts_params->valid_devs[0]);\n+}\n+\n+static int\n+test_device_configure_invalid_dev_id(void)\n+{\n+\tstruct crypto_testsuite_params *ts_params = &testsuite_params;\n+\tuint16_t dev_id, num_devs = 0;\n \n \tTEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,\n \t\t\t\"Need at least %d devices for test\", 1);\n@@ -13068,6 +13474,59 @@ test_chacha20_poly1305_decrypt_test_case_rfc8439(void)\n /* global AESNI worker IDs for the scheduler test */\n uint8_t aesni_ids[2];\n \n+static int\n+scheduler_testsuite_setup(void)\n+{\n+\tuint32_t i = 0;\n+\tint32_t nb_devs, ret;\n+\tchar vdev_args[VDEV_ARGS_SIZE] = {\"\"};\n+\tchar temp_str[VDEV_ARGS_SIZE] = {\"mode=multi-core,\"\n+\t\t\"ordering=enable,name=cryptodev_test_scheduler,corelist=\"};\n+\tuint16_t worker_core_count = 0;\n+\tuint16_t socket_id = 0;\n+\n+\tif (gbl_driver_id == rte_cryptodev_driver_id_get(\n+\t\t\tRTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {\n+\n+\t\t/* Identify the Worker Cores\n+\t\t * Use 2 worker cores for the device args\n+\t\t */\n+\t\tRTE_LCORE_FOREACH_WORKER(i) {\n+\t\t\tif (worker_core_count > 1)\n+\t\t\t\tbreak;\n+\t\t\tsnprintf(vdev_args, sizeof(vdev_args),\n+\t\t\t\t\t\"%s%d\", temp_str, i);\n+\t\t\tstrcpy(temp_str, vdev_args);\n+\t\t\tstrlcat(temp_str, \";\", sizeof(temp_str));\n+\t\t\tworker_core_count++;\n+\t\t\tsocket_id = rte_lcore_to_socket_id(i);\n+\t\t}\n+\t\tif (worker_core_count != 2) {\n+\t\t\tRTE_LOG(ERR, USER1,\n+\t\t\t\t\"Cryptodev scheduler test require at least \"\n+\t\t\t\t\"two worker cores to run. \"\n+\t\t\t\t\"Please use the correct coremask.\\n\");\n+\t\t\treturn TEST_FAILED;\n+\t\t}\n+\t\tstrcpy(temp_str, vdev_args);\n+\t\tsnprintf(vdev_args, sizeof(vdev_args), \"%s,socket_id=%d\",\n+\t\t\t\ttemp_str, socket_id);\n+\t\tRTE_LOG(DEBUG, USER1, \"vdev_args: %s\\n\", vdev_args);\n+\t\tnb_devs = rte_cryptodev_device_count_by_driver(\n+\t\t\t\trte_cryptodev_driver_id_get(\n+\t\t\t\tRTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));\n+\t\tif (nb_devs < 1) {\n+\t\t\tret = rte_vdev_init(\n+\t\t\t\tRTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),\n+\t\t\t\t\tvdev_args);\n+\t\t\tTEST_ASSERT(ret == 0,\n+\t\t\t\t\"Failed to create instance %u of pmd : %s\",\n+\t\t\t\ti, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));\n+\t\t}\n+\t}\n+\treturn testsuite_setup();\n+}\n+\n static int\n test_scheduler_attach_slave_op(void)\n {\n@@ -13242,53 +13701,86 @@ test_scheduler_mode_pkt_size_distr_op(void)\n \treturn 0;\n }\n \n-static struct unit_test_suite cryptodev_scheduler_testsuite  = {\n-\t.suite_name = \"Crypto Device Scheduler Unit Test Suite\",\n-\t.setup = testsuite_setup,\n-\t.teardown = testsuite_teardown,\n-\t.unit_test_cases = {\n-\t\t/* Multi Core */\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_mode_multicore_op),\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(NULL, NULL, test_scheduler_detach_slave_op),\n+static int\n+scheduler_multicore_testsuite_setup(void)\n+{\n+\tif (test_scheduler_attach_slave_op() < 0)\n+\t\treturn TEST_SKIPPED;\n+\tif (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)\n+\t\treturn TEST_SKIPPED;\n+\treturn 0;\n+}\n \n-\t\t/* Round Robin */\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_mode_roundrobin_op),\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(NULL, NULL, test_scheduler_detach_slave_op),\n+static int\n+scheduler_roundrobin_testsuite_setup(void)\n+{\n+\tif (test_scheduler_attach_slave_op() < 0)\n+\t\treturn TEST_SKIPPED;\n+\tif (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)\n+\t\treturn TEST_SKIPPED;\n+\treturn 0;\n+}\n \n-\t\t/* Fail over */\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_mode_failover_op),\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(NULL, NULL, test_scheduler_detach_slave_op),\n+static int\n+scheduler_failover_testsuite_setup(void)\n+{\n+\tif (test_scheduler_attach_slave_op() < 0)\n+\t\treturn TEST_SKIPPED;\n+\tif (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)\n+\t\treturn TEST_SKIPPED;\n+\treturn 0;\n+}\n \n-\t\t/* PKT SIZE */\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),\n-\t\tTEST_CASE_ST(NULL, NULL, test_scheduler_mode_pkt_size_distr_op),\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(NULL, NULL, test_scheduler_detach_slave_op),\n+static int\n+scheduler_pkt_size_distr_testsuite_setup(void)\n+{\n+\tif (test_scheduler_attach_slave_op() < 0)\n+\t\treturn TEST_SKIPPED;\n+\tif (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)\n+\t\treturn TEST_SKIPPED;\n+\treturn 0;\n+}\n+\n+static void\n+scheduler_mode_testsuite_teardown(void)\n+{\n+\ttest_scheduler_detach_slave_op();\n+}\n+\n+#endif /* RTE_CRYPTO_SCHEDULER */\n+\n+static struct unit_test_suite end_testsuite = {\n+\t.suite_name = NULL,\n+\t.setup = NULL,\n+\t.teardown = NULL,\n+\t.unit_test_suites = NULL\n+};\n \n+#ifdef RTE_LIB_SECURITY\n+static struct unit_test_suite pdcp_proto_testsuite  = {\n+\t.suite_name = \"PDCP Proto Unit Test Suite\",\n+\t.setup = pdcp_proto_testsuite_setup,\n+\t.unit_test_cases = {\n+\t\tTEST_CASE_ST(ut_setup_security, ut_teardown,\n+\t\t\ttest_PDCP_PROTO_all),\n \t\tTEST_CASES_END() /**< NULL terminate unit test array */\n \t}\n };\n \n-#endif /* RTE_CRYPTO_SCHEDULER */\n+static struct unit_test_suite docsis_proto_testsuite  = {\n+\t.suite_name = \"Docsis Proto Unit Test Suite\",\n+\t.setup = docsis_proto_testsuite_setup,\n+\t.unit_test_cases = {\n+\t\tTEST_CASE_ST(ut_setup_security, ut_teardown,\n+\t\t\ttest_DOCSIS_PROTO_all),\n+\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n+\t}\n+};\n+#endif\n \n-static struct unit_test_suite cryptodev_testsuite  = {\n-\t.suite_name = \"Crypto Unit Test Suite\",\n-\t.setup = testsuite_setup,\n-\t.teardown = testsuite_teardown,\n+static struct unit_test_suite cryptodev_gen_testsuite  = {\n+\t.suite_name = \"Crypto General Unit Test Suite\",\n+\t.setup = crypto_gen_testsuite_setup,\n \t.unit_test_cases = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\t\ttest_device_configure_invalid_dev_id),\n@@ -13296,14 +13788,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,\n-\t\t\t\ttest_multi_session),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_multi_session_random_usage),\n-\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\ttest_null_invalid_operation),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),\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@@ -13313,8 +13797,58 @@ static struct unit_test_suite cryptodev_testsuite  = {\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+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),\n+\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n+\t}\n+};\n+\n+static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {\n+\t.suite_name = \"Negative HMAC SHA1 Unit Test Suite\",\n+\t.setup = negative_hmac_sha1_testsuite_setup,\n+\t.unit_test_cases = {\n+\t\t/** Negative tests */\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\tauthentication_verify_HMAC_SHA1_fail_data_corrupt),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\tauthentication_verify_HMAC_SHA1_fail_tag_corrupt),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\tauth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\tauth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),\n+\n+\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n+\t}\n+};\n+\n+static struct unit_test_suite cryptodev_multi_session_testsuite = {\n+\t.suite_name = \"Multi Session Unit Test Suite\",\n+\t.setup = multi_session_testsuite_setup,\n+\t.unit_test_cases = {\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\t\ttest_multi_session_random_usage),\n+\n+\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n+\t}\n+};\n+\n+static struct unit_test_suite cryptodev_null_testsuite  = {\n+\t.suite_name = \"NULL Test Suite\",\n+\t.setup = null_testsuite_setup,\n+\t.unit_test_cases = {\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_null_invalid_operation),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),\n+\t\tTEST_CASES_END()\n+\t}\n+};\n \n-\t\t/** AES CCM Authenticated Encryption 128 bits key */\n+static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {\n+\t.suite_name = \"AES CCM Authenticated Test Suite\",\n+\t.setup = aes_ccm_auth_testsuite_setup,\n+\t.unit_test_cases = {\n+\t\t/** AES CCM Authenticated Encryption 128 bits key*/\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_CCM_authenticated_encryption_test_case_128_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -13361,7 +13895,14 @@ static struct unit_test_suite cryptodev_testsuite  = {\n \t\t\ttest_AES_CCM_authenticated_decryption_test_case_256_2),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_CCM_authenticated_decryption_test_case_256_3),\n+\t\tTEST_CASES_END()\n+\t}\n+};\n \n+static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite  = {\n+\t.suite_name = \"AES GCM Authenticated Test Suite\",\n+\t.setup = aes_gcm_auth_testsuite_setup,\n+\t.unit_test_cases = {\n \t\t/** AES GCM Authenticated Encryption */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_GCM_auth_encrypt_SGL_in_place_1500B),\n@@ -13498,7 +14039,14 @@ static struct unit_test_suite cryptodev_testsuite  = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_GCM_authenticated_decryption_sessionless_test_case_1),\n \n-\t\t/** AES GMAC Authentication */\n+\t\tTEST_CASES_END()\n+\t}\n+};\n+\n+static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite  = {\n+\t.suite_name = \"AES GMAC Authentication Test Suite\",\n+\t.setup = aes_gmac_auth_testsuite_setup,\n+\t.unit_test_cases = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_GMAC_authentication_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -13524,11 +14072,26 @@ static struct unit_test_suite cryptodev_testsuite  = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_GMAC_authentication_SGL_2047B),\n \n-\t\t/** Chacha20-Poly1305 */\n+\t\tTEST_CASES_END()\n+\t}\n+};\n+\n+static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite  = {\n+\t.suite_name = \"Chacha20-Poly1305 Test Suite\",\n+\t.setup = chacha20_poly1305_testsuite_setup,\n+\t.unit_test_cases = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_chacha20_poly1305_encrypt_test_case_rfc8439),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_chacha20_poly1305_decrypt_test_case_rfc8439),\n+\t\tTEST_CASES_END()\n+\t}\n+};\n+\n+static struct unit_test_suite cryptodev_snow3g_testsuite  = {\n+\t.suite_name = \"SNOW 3G Test Suite\",\n+\t.setup = snow3g_testsuite_setup,\n+\t.unit_test_cases = {\n \t\t/** SNOW 3G encrypt only (UEA2) */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_snow3g_encryption_test_case_1),\n@@ -13609,6 +14172,7 @@ static struct unit_test_suite cryptodev_testsuite  = {\n \t\t\ttest_snow3g_hash_generate_test_case_2),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_snow3g_hash_generate_test_case_3),\n+\n \t\t/* Tests with buffers which length is not byte-aligned */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_snow3g_hash_generate_test_case_4),\n@@ -13622,6 +14186,7 @@ static struct unit_test_suite cryptodev_testsuite  = {\n \t\t\ttest_snow3g_hash_verify_test_case_2),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_snow3g_hash_verify_test_case_3),\n+\n \t\t/* Tests with buffers which length is not byte-aligned */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_snow3g_hash_verify_test_case_4),\n@@ -13633,7 +14198,14 @@ static struct unit_test_suite cryptodev_testsuite  = {\n \t\t\ttest_snow3g_cipher_auth_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_snow3g_auth_cipher_with_digest_test_case_1),\n+\t\tTEST_CASES_END()\n+\t}\n+};\n \n+static struct unit_test_suite cryptodev_zuc_testsuite  = {\n+\t.suite_name = \"ZUC Test Suite\",\n+\t.setup = zuc_testsuite_setup,\n+\t.unit_test_cases = {\n \t\t/** ZUC encrypt only (EEA3) */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_zuc_encryption_test_case_1),\n@@ -13691,8 +14263,14 @@ static struct unit_test_suite cryptodev_testsuite  = {\n \t\t\ttest_zuc_auth_cipher_verify_test_case_1_sgl),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_zuc_auth_cipher_verify_test_case_1_oop_sgl),\n+\t\tTEST_CASES_END()\n+\t}\n+};\n \n-\t\t/** HMAC_MD5 Authentication */\n+static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite  = {\n+\t.suite_name = \"HMAC_MD5 Authentication Test Suite\",\n+\t.setup = hmac_md5_auth_testsuite_setup,\n+\t.unit_test_cases = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_MD5_HMAC_generate_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -13701,7 +14279,14 @@ static struct unit_test_suite cryptodev_testsuite  = {\n \t\t\ttest_MD5_HMAC_generate_case_2),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_MD5_HMAC_verify_case_2),\n+\t\tTEST_CASES_END()\n+\t}\n+};\n \n+static struct unit_test_suite cryptodev_kasumi_testsuite  = {\n+\t.suite_name = \"Kasumi Test Suite\",\n+\t.setup = kasumi_testsuite_setup,\n+\t.unit_test_cases = {\n \t\t/** KASUMI hash only (UIA1) */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_kasumi_hash_generate_test_case_1),\n@@ -13786,17 +14371,26 @@ static struct unit_test_suite cryptodev_testsuite  = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_kasumi_auth_cipher_verify_test_case_2_oop_sgl),\n \n-\t\t/** ESN Testcase */\n+\t\tTEST_CASES_END()\n+\t}\n+};\n+\n+static struct unit_test_suite cryptodev_esn_testsuite  = {\n+\t.suite_name = \"ESN Test Suite\",\n+\t.setup = esn_testsuite_setup,\n+\t.unit_test_cases = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\tauth_encrypt_AES128CBC_HMAC_SHA1_esn_check),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\tauth_decrypt_AES128CBC_HMAC_SHA1_esn_check),\n+\t\tTEST_CASES_END()\n+\t}\n+};\n \n-\t\t/** Negative tests */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_HMAC_SHA1_fail_data_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_HMAC_SHA1_fail_tag_corrupt),\n+static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite  = {\n+\t.suite_name = \"Negative AES GCM Test Suite\",\n+\t.setup = negative_aes_gcm_testsuite_setup,\n+\t.unit_test_cases = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_GCM_auth_encryption_fail_iv_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -13821,16 +14415,28 @@ static struct unit_test_suite cryptodev_testsuite  = {\n \t\t\ttest_AES_GCM_auth_decryption_fail_aad_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_AES_GCM_auth_decryption_fail_tag_corrupt),\n+\n+\t\tTEST_CASES_END()\n+\t}\n+};\n+\n+static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite  = {\n+\t.suite_name = \"Negative AES GMAC Test Suite\",\n+\t.setup = negative_aes_gmac_testsuite_setup,\n+\t.unit_test_cases = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\tauthentication_verify_AES128_GMAC_fail_data_corrupt),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\tauthentication_verify_AES128_GMAC_fail_tag_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),\n \n-\t\t/** Mixed CIPHER + HASH algorithms */\n+\t\tTEST_CASES_END()\n+\t}\n+};\n+\n+static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {\n+\t.suite_name = \"Mixed CIPHER + HASH algorithms Test Suite\",\n+\t.setup = mixed_cipher_hash_testsuite_setup,\n+\t.unit_test_cases = {\n \t\t/** AUTH AES CMAC + CIPHER AES CTR */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_aes_cmac_aes_ctr_digest_enc_test_case_1),\n@@ -13843,11 +14449,11 @@ static struct unit_test_suite cryptodev_testsuite  = {\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t       test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),\n+\t\t\ttest_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t       test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),\n+\t\t\ttest_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t   test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),\n+\t\t\ttest_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),\n \n \t\t/** AUTH ZUC + CIPHER SNOW3G */\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n@@ -13910,165 +14516,86 @@ static struct unit_test_suite cryptodev_testsuite  = {\n \t\t\ttest_auth_aes_cmac_cipher_null_test_case_1),\n \t\tTEST_CASE_ST(ut_setup, ut_teardown,\n \t\t\ttest_verify_auth_aes_cmac_cipher_null_test_case_1),\n-\n-#ifdef RTE_LIB_SECURITY\n-\t\tTEST_CASE_ST(ut_setup_security, ut_teardown,\n-\t\t\ttest_PDCP_PROTO_all),\n-\t\tTEST_CASE_ST(ut_setup_security, ut_teardown,\n-\t\t\ttest_DOCSIS_PROTO_all),\n-#endif\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),\n-\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n-\t}\n-};\n-\n-static struct unit_test_suite cryptodev_virtio_testsuite = {\n-\t.suite_name = \"Crypto VIRTIO Unit Test Suite\",\n-\t.setup = testsuite_setup,\n-\t.teardown = testsuite_teardown,\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_testsuite  = {\n-\t.suite_name = \"Crypto CAAM JR Unit Test Suite\",\n-\t.setup = testsuite_setup,\n-\t.teardown = testsuite_teardown,\n-\t.unit_test_cases = {\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t     test_device_configure_invalid_dev_id),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t     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\tTEST_CASES_END()\n \t}\n };\n \n-static struct unit_test_suite cryptodev_mrvl_testsuite  = {\n-\t.suite_name = \"Crypto Device Marvell Component Test Suite\",\n-\t.setup = testsuite_setup,\n-\t.teardown = testsuite_teardown,\n-\t.unit_test_cases = {\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_multi_session_random_usage),\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+static int\n+run_cryptodev_testsuite(const char *pmd_name)\n+{\n+\tuint8_t ret, j, i = 0;\n+\tstruct unit_test_suite *static_suites[] = {\n+\t\t&cryptodev_multi_session_testsuite,\n+\t\t&cryptodev_null_testsuite,\n+\t\t&cryptodev_aes_ccm_auth_testsuite,\n+\t\t&cryptodev_aes_gcm_auth_testsuite,\n+\t\t&cryptodev_aes_gmac_auth_testsuite,\n+\t\t&cryptodev_snow3g_testsuite,\n+\t\t&cryptodev_chacha20_poly1305_testsuite,\n+\t\t&cryptodev_zuc_testsuite,\n+\t\t&cryptodev_hmac_md5_auth_testsuite,\n+\t\t&cryptodev_kasumi_testsuite,\n+\t\t&cryptodev_esn_testsuite,\n+\t\t&cryptodev_negative_aes_gcm_testsuite,\n+\t\t&cryptodev_negative_aes_gmac_testsuite,\n+\t\t&cryptodev_mixed_cipher_hash_testsuite,\n+\t\t&cryptodev_negative_hmac_sha1_testsuite,\n+\t\t&cryptodev_gen_testsuite,\n+#ifdef RTE_LIB_SECURITY\n+\t\t&pdcp_proto_testsuite,\n+\t\t&docsis_proto_testsuite,\n+#endif\n+\t\t&end_testsuite\n+\t};\n+\tstatic struct unit_test_suite ts = {\n+\t\t.suite_name = \"Cryptodev Unit Test Suite\",\n+\t\t.setup = testsuite_setup,\n+\t\t.teardown = testsuite_teardown,\n+\t\t.unit_test_cases = {TEST_CASES_END()}\n+\t};\n \n-\t\t/** Negative tests */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_HMAC_SHA1_fail_data_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_HMAC_SHA1_fail_tag_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),\n+\tgbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);\n \n-\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n+\tif (gbl_driver_id == -1) {\n+\t\tRTE_LOG(ERR, USER1, \"%s PMD must be loaded.\\n\", pmd_name);\n+\t\treturn TEST_FAILED;\n \t}\n-};\n \n-static struct unit_test_suite cryptodev_ccp_testsuite  = {\n-\t.suite_name = \"Crypto Device CCP Unit Test Suite\",\n-\t.setup = testsuite_setup,\n-\t.teardown = testsuite_teardown,\n-\t.unit_test_cases = {\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\t\ttest_multi_session_random_usage),\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+\tts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *\n+\t\t\tRTE_DIM(static_suites));\n \n-\t\t/** Negative tests */\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_HMAC_SHA1_fail_data_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauthentication_verify_HMAC_SHA1_fail_tag_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),\n-\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n-\t\t\tauth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),\n+\tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n+\tret = unit_test_suite_runner(&ts);\n \n-\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n-\t}\n-};\n+\tfree(ts.unit_test_suites);\n+\treturn ret;\n+}\n \n static int\n test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tgbl_driver_id =\trte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"QAT PMD must be loaded.\\n\");\n-\t\treturn TEST_SKIPPED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));\n }\n \n static int\n test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tgbl_driver_id =\trte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"VIRTIO PMD must be loaded.\\n\");\n-\t\treturn TEST_FAILED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_virtio_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));\n }\n \n static int\n test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tgbl_driver_id =\trte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"AESNI MB PMD must be loaded.\\n\");\n-\t\treturn TEST_SKIPPED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));\n }\n \n static int\n test_cryptodev_cpu_aesni_mb(void)\n {\n \tint32_t rc;\n-\tenum rte_security_session_action_type at;\n-\n-\tgbl_driver_id =\trte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"AESNI MB PMD must be loaded.\\n\");\n-\t\treturn TEST_SKIPPED;\n-\t}\n-\n-\tat = gbl_action_type;\n+\tenum rte_security_session_action_type at = gbl_action_type;\n \tgbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;\n-\trc = unit_test_suite_runner(&cryptodev_testsuite);\n+\trc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));\n \tgbl_action_type = at;\n \treturn rc;\n }\n@@ -14076,48 +14603,22 @@ test_cryptodev_cpu_aesni_mb(void)\n static int\n test_cryptodev_openssl(void)\n {\n-\tgbl_driver_id = rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"OPENSSL PMD must be loaded.\\n\");\n-\t\treturn TEST_SKIPPED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));\n }\n \n static int\n test_cryptodev_aesni_gcm(void)\n {\n-\tgbl_driver_id = rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"AESNI GCM PMD must be loaded.\\n\");\n-\t\treturn TEST_SKIPPED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));\n }\n \n static int\n test_cryptodev_cpu_aesni_gcm(void)\n {\n \tint32_t rc;\n-\tenum rte_security_session_action_type at;\n-\n-\tgbl_driver_id = rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"AESNI GCM PMD must be loaded.\\n\");\n-\t\treturn TEST_SKIPPED;\n-\t}\n-\n-\tat = gbl_action_type;\n+\tenum rte_security_session_action_type at = gbl_action_type;\n \tgbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;\n-\trc = unit_test_suite_runner(&cryptodev_testsuite);\n+\trc  = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));\n \tgbl_action_type = at;\n \treturn rc;\n }\n@@ -14125,85 +14626,37 @@ test_cryptodev_cpu_aesni_gcm(void)\n static int\n test_cryptodev_null(void)\n {\n-\tgbl_driver_id = rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_NULL_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"NULL PMD must be loaded.\\n\");\n-\t\treturn TEST_SKIPPED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));\n }\n \n static int\n test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tgbl_driver_id = rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"SNOW3G PMD must be loaded.\\n\");\n-\t\treturn TEST_SKIPPED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));\n }\n \n static int\n test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tgbl_driver_id = rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_KASUMI_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"ZUC PMD must be loaded.\\n\");\n-\t\treturn TEST_SKIPPED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));\n }\n \n static int\n test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tgbl_driver_id = rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_ZUC_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"ZUC PMD must be loaded.\\n\");\n-\t\treturn TEST_SKIPPED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));\n }\n \n static int\n test_cryptodev_armv8(void)\n {\n-\tgbl_driver_id = rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_ARMV8_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"ARMV8 PMD must be loaded.\\n\");\n-\t\treturn TEST_SKIPPED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));\n }\n \n static int\n test_cryptodev_mrvl(void)\n {\n-\tgbl_driver_id = rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_MVSAM_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"MVSAM PMD must be loaded.\\n\");\n-\t\treturn TEST_SKIPPED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_mrvl_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));\n }\n \n #ifdef RTE_CRYPTO_SCHEDULER\n@@ -14211,6 +14664,85 @@ 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+\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};\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};\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};\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};\n+\tstruct unit_test_suite *sched_mode_suites[] = {\n+\t\t&scheduler_multicore,\n+\t\t&scheduler_round_robin,\n+\t\t&scheduler_failover,\n+\t\t&scheduler_pkt_size_distr\n+\t};\n+\tstatic struct unit_test_suite scheduler_config = {\n+\t\t.suite_name = \"Crypto Device Scheduler Config Unit Test Suite\",\n+\t\t.unit_test_cases = {\n+\t\t\tTEST_CASE(test_scheduler_attach_slave_op),\n+\t\t\tTEST_CASE(test_scheduler_mode_multicore_op),\n+\t\t\tTEST_CASE(test_scheduler_mode_roundrobin_op),\n+\t\t\tTEST_CASE(test_scheduler_mode_failover_op),\n+\t\t\tTEST_CASE(test_scheduler_mode_pkt_size_distr_op),\n+\t\t\tTEST_CASE(test_scheduler_detach_slave_op),\n+\n+\t\t\tTEST_CASES_END() /**< NULL terminate array */\n+\t\t}\n+\t};\n+\tstruct unit_test_suite *static_suites[] = {\n+\t\t&scheduler_config,\n+\t\t&end_testsuite\n+\t};\n+\tstatic struct unit_test_suite ts = {\n+\t\t.suite_name = \"Scheduler Unit Test Suite\",\n+\t\t.setup = scheduler_testsuite_setup,\n+\t\t.teardown = testsuite_teardown,\n+\t\t.unit_test_cases = {TEST_CASES_END()}\n+\t};\n+\n \tgbl_driver_id =\trte_cryptodev_driver_id_get(\n \t\t\tRTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));\n \n@@ -14223,8 +14755,17 @@ test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)\n \t\t\t\tRTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {\n \t\tRTE_LOG(ERR, USER1, \"AESNI MB PMD must be loaded.\\n\");\n \t\treturn TEST_SKIPPED;\n-}\n-\treturn unit_test_suite_runner(&cryptodev_scheduler_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+\t\t\tRTE_DIM(sched_mode_suites));\n+\tADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));\n+\tret = unit_test_suite_runner(&ts);\n+\n+\tfree(ts.unit_test_suites);\n+\treturn ret;\n }\n \n REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);\n@@ -14234,109 +14775,49 @@ 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-\tgbl_driver_id =\trte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"DPAA2 SEC PMD must be loaded.\\n\");\n-\t\treturn TEST_SKIPPED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));\n }\n \n static int\n test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tgbl_driver_id =\trte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"DPAA SEC PMD must be loaded.\\n\");\n-\t\treturn TEST_SKIPPED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));\n }\n \n static int\n test_cryptodev_ccp(void)\n {\n-\tgbl_driver_id = rte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_CCP_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"CCP PMD must be loaded.\\n\");\n-\t\treturn TEST_FAILED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_ccp_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));\n }\n \n static int\n test_cryptodev_octeontx(void)\n {\n-\tgbl_driver_id =\trte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"OCTEONTX PMD must be loaded.\\n\");\n-\t\treturn TEST_FAILED;\n-\t}\n-\treturn unit_test_suite_runner(&cryptodev_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));\n }\n \n static int\n test_cryptodev_octeontx2(void)\n {\n-\tgbl_driver_id =\trte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"OCTEON TX2 PMD must be loaded.\\n\");\n-\t\treturn TEST_FAILED;\n-\t}\n-\treturn unit_test_suite_runner(&cryptodev_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));\n }\n \n static int\n test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n-\tgbl_driver_id =\trte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"CAAM_JR PMD must be loaded.\\n\");\n-\t\treturn TEST_FAILED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_caam_jr_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));\n }\n \n static int\n test_cryptodev_nitrox(void)\n {\n-\tgbl_driver_id =\trte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_NITROX_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"NITROX PMD must be loaded.\\n\");\n-\t\treturn TEST_FAILED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));\n }\n \n static int\n test_cryptodev_bcmfs(void)\n {\n-\tgbl_driver_id =\trte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_BCMFS_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"BCMFS PMD must be loaded.\\n\");\n-\t\treturn TEST_FAILED;\n-\t}\n-\n-\treturn unit_test_suite_runner(&cryptodev_testsuite);\n+\treturn run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));\n }\n \n static int\n@@ -14344,16 +14825,8 @@ test_cryptodev_qat_raw_api(void /*argv __rte_unused, int argc __rte_unused*/)\n {\n \tint ret;\n \n-\tgbl_driver_id =\trte_cryptodev_driver_id_get(\n-\t\t\tRTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));\n-\n-\tif (gbl_driver_id == -1) {\n-\t\tRTE_LOG(ERR, USER1, \"QAT PMD must be loaded.\\n\");\n-\t\treturn TEST_SKIPPED;\n-\t}\n-\n \tglobal_api_test_type = CRYPTODEV_RAW_API_TEST;\n-\tret = unit_test_suite_runner(&cryptodev_testsuite);\n+\tret = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));\n \tglobal_api_test_type = CRYPTODEV_API_TEST;\n \n \treturn ret;\ndiff --git a/app/test/test_cryptodev.h b/app/test/test_cryptodev.h\nindex bf4f6c8d62..5c41e36f44 100644\n--- a/app/test/test_cryptodev.h\n+++ b/app/test/test_cryptodev.h\n@@ -222,4 +222,16 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,\n \t\tstruct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,\n \t\tuint8_t len_in_bits, uint8_t cipher_iv_len);\n \n+int\n+check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,\n+\t\tuint16_t num_ciphers);\n+\n+int\n+check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,\n+\t\tuint16_t num_auths);\n+\n+int\n+check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,\n+\t\tuint16_t num_aeads);\n+\n #endif /* TEST_CRYPTODEV_H_ */\n",
    "prefixes": [
        "v3",
        "3/7"
    ]
}