get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 73972,
    "url": "http://patchwork.dpdk.org/api/patches/73972/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20200713165755.61814-4-roy.fan.zhang@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20200713165755.61814-4-roy.fan.zhang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200713165755.61814-4-roy.fan.zhang@intel.com",
    "date": "2020-07-13T16:57:54",
    "name": "[v5,3/4] test/crypto: add unit-test for cryptodev direct APIs",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "5237e8dff46161c6b3d7e02874209dd6a99ba81d",
    "submitter": {
        "id": 304,
        "url": "http://patchwork.dpdk.org/api/people/304/?format=api",
        "name": "Fan Zhang",
        "email": "roy.fan.zhang@intel.com"
    },
    "delegate": {
        "id": 6690,
        "url": "http://patchwork.dpdk.org/api/users/6690/?format=api",
        "username": "akhil",
        "first_name": "akhil",
        "last_name": "goyal",
        "email": "gakhil@marvell.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20200713165755.61814-4-roy.fan.zhang@intel.com/mbox/",
    "series": [
        {
            "id": 11006,
            "url": "http://patchwork.dpdk.org/api/series/11006/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=11006",
            "date": "2020-07-13T16:57:51",
            "name": "cryptodev: add symmetric crypto data-path APIs",
            "version": 5,
            "mbox": "http://patchwork.dpdk.org/series/11006/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/73972/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/73972/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 980E1A0540;\n\tMon, 13 Jul 2020 18:58:31 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 2F9741D6D0;\n\tMon, 13 Jul 2020 18:58:10 +0200 (CEST)",
            "from mga06.intel.com (mga06.intel.com [134.134.136.31])\n by dpdk.org (Postfix) with ESMTP id A22291D6AA\n for <dev@dpdk.org>; Mon, 13 Jul 2020 18:58:04 +0200 (CEST)",
            "from orsmga003.jf.intel.com ([10.7.209.27])\n by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 13 Jul 2020 09:58:04 -0700",
            "from silpixa00398673.ir.intel.com (HELO\n silpixa00398673.ger.corp.intel.com) ([10.237.223.136])\n by orsmga003.jf.intel.com with ESMTP; 13 Jul 2020 09:58:02 -0700"
        ],
        "IronPort-SDR": [
            "\n nf3E3UkL1ZUft6uTI9+a5KSByD3e6NLzGMwC3O3Y4TcrvbR3E8fhwSZpVwkYYomfp3MNrCR29S\n u0w99XjtxOvA==",
            "\n Q7HWlcpR6v/eMNPkcLIW17uf04tIAIb/+v7czsrc6MMrOynjNy8NmJwHIE2qyA83CooPH4ETZw\n L96BXuJrwIdg=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6000,8403,9681\"; a=\"210203475\"",
            "E=Sophos;i=\"5.75,348,1589266800\"; d=\"scan'208\";a=\"210203475\"",
            "E=Sophos;i=\"5.75,348,1589266800\"; d=\"scan'208\";a=\"281465672\""
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "From": "Fan Zhang <roy.fan.zhang@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "fiona.trahe@intel.com, akhil.goyal@nxp.com,\n Fan Zhang <roy.fan.zhang@intel.com>",
        "Date": "Mon, 13 Jul 2020 17:57:54 +0100",
        "Message-Id": "<20200713165755.61814-4-roy.fan.zhang@intel.com>",
        "X-Mailer": "git-send-email 2.20.1",
        "In-Reply-To": "<20200713165755.61814-1-roy.fan.zhang@intel.com>",
        "References": "<20200703124942.29171-1-roy.fan.zhang@intel.com>\n <20200713165755.61814-1-roy.fan.zhang@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [dpdk-dev v5 3/4] test/crypto: add unit-test for\n\tcryptodev direct APIs",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "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": "This patch adds the QAT test to use cryptodev symmetric crypto\ndirect APIs.\n\nSigned-off-by: Fan Zhang <roy.fan.zhang@intel.com>\n---\n app/test/test_cryptodev.c             | 367 ++++++++++++++++++++++++--\n app/test/test_cryptodev.h             |   6 +\n app/test/test_cryptodev_blockcipher.c |  50 ++--\n 3 files changed, 386 insertions(+), 37 deletions(-)",
    "diff": "diff --git a/app/test/test_cryptodev.c b/app/test/test_cryptodev.c\nindex e71e73ae1..5e168c124 100644\n--- a/app/test/test_cryptodev.c\n+++ b/app/test/test_cryptodev.c\n@@ -57,6 +57,8 @@ static int gbl_driver_id;\n static enum rte_security_session_action_type gbl_action_type =\n \tRTE_SECURITY_ACTION_TYPE_NONE;\n \n+int hw_dp_test;\n+\n struct crypto_testsuite_params {\n \tstruct rte_mempool *mbuf_pool;\n \tstruct rte_mempool *large_mbuf_pool;\n@@ -147,6 +149,168 @@ ceil_byte_length(uint32_t num_bits)\n \t\treturn (num_bits >> 3);\n }\n \n+static uint32_t\n+get_dequeue_count(void *opaque __rte_unused)\n+{\n+\treturn 1;\n+}\n+\n+static void\n+write_status(void *opaque __rte_unused, uint32_t index __rte_unused,\n+\t\tuint8_t is_op_success)\n+{\n+\tstruct rte_crypto_op *op = opaque;\n+\top->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :\n+\t\t\tRTE_CRYPTO_OP_STATUS_ERROR;\n+}\n+\n+void\n+process_sym_hw_api_op(uint8_t dev_id, uint16_t qp_id, struct rte_crypto_op *op,\n+\t\tuint8_t is_cipher, uint8_t is_auth, uint8_t len_in_bits)\n+{\n+\tint32_t n;\n+\tstruct rte_crypto_sym_op *sop;\n+\tstruct rte_crypto_sym_vec vec;\n+\tstruct rte_crypto_sgl sgl;\n+\tstruct rte_crypto_op *ret_op = NULL;\n+\tstruct rte_crypto_vec data_vec[UINT8_MAX], iv_vec, aad_vec, digest_vec;\n+\tunion rte_crypto_sym_ofs ofs;\n+\tint32_t status;\n+\tuint32_t min_ofs, max_len, nb_ops;\n+\tuint32_t n_success_ops;\n+\tunion rte_cryptodev_hw_session_ctx sess;\n+\tenum {\n+\t\tcipher = 0,\n+\t\tauth,\n+\t\tchain,\n+\t\taead\n+\t} hw_dp_test_type;\n+\tuint32_t count = 0;\n+\tuint32_t flags = RTE_CRYPTO_HW_DP_FF_CRYPTO_SESSION |\n+\t\t\tRTE_CRYPTO_HW_DP_FF_SET_OPAQUE_ARRAY |\n+\t\t\tRTE_CRYPTO_HW_DP_FF_KICK_QUEUE;\n+\n+\tmemset(&vec, 0, sizeof(vec));\n+\n+\tvec.sgl = &sgl;\n+\tvec.iv_vec = &iv_vec;\n+\tvec.aad_vec = &aad_vec;\n+\tvec.digest_vec = &digest_vec;\n+\tvec.status = &status;\n+\tvec.num = 1;\n+\n+\tsop = op->sym;\n+\n+\tsess.crypto_sess = sop->session;\n+\n+\tif (is_cipher && is_auth) {\n+\t\thw_dp_test_type = chain;\n+\t\tmin_ofs = RTE_MIN(sop->cipher.data.offset,\n+\t\t\t\tsop->auth.data.offset);\n+\t\tmax_len = RTE_MAX(sop->cipher.data.length,\n+\t\t\t\tsop->auth.data.length);\n+\t} else if (is_cipher) {\n+\t\thw_dp_test_type = cipher;\n+\t\tmin_ofs = sop->cipher.data.offset;\n+\t\tmax_len = sop->cipher.data.length;\n+\t} else if (is_auth) {\n+\t\thw_dp_test_type = auth;\n+\t\tmin_ofs = sop->auth.data.offset;\n+\t\tmax_len = sop->auth.data.length;\n+\t} else { /* aead */\n+\t\thw_dp_test_type = aead;\n+\t\tmin_ofs = sop->aead.data.offset;\n+\t\tmax_len = sop->aead.data.length;\n+\t}\n+\n+\tif (len_in_bits) {\n+\t\tmax_len = max_len >> 3;\n+\t\tmin_ofs = min_ofs >> 3;\n+\t}\n+\n+\tn = rte_crypto_mbuf_to_vec(sop->m_src, 0, min_ofs + max_len,\n+\t\t\tdata_vec, RTE_DIM(data_vec));\n+\tif (n < 0 || n != sop->m_src->nb_segs) {\n+\t\top->status = RTE_CRYPTO_OP_STATUS_ERROR;\n+\t\treturn;\n+\t}\n+\n+\tsgl.vec = data_vec;\n+\tsgl.num = n;\n+\n+\tofs.raw = 0;\n+\n+\tiv_vec.base = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);\n+\tiv_vec.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);\n+\n+\tswitch (hw_dp_test_type) {\n+\tcase aead:\n+\t\tofs.ofs.cipher.head = sop->cipher.data.offset;\n+\t\taad_vec.base = (void *)sop->aead.aad.data;\n+\t\taad_vec.iova = sop->aead.aad.phys_addr;\n+\t\tdigest_vec.base = (void *)sop->aead.digest.data;\n+\t\tdigest_vec.iova = sop->aead.digest.phys_addr;\n+\t\tif (len_in_bits) {\n+\t\t\tofs.ofs.cipher.head >>= 3;\n+\t\t\tofs.ofs.cipher.tail >>= 3;\n+\t\t}\n+\t\tnb_ops = rte_cryptodev_sym_hw_crypto_enqueue_aead(dev_id, qp_id,\n+\t\t\tsess, ofs, &vec, (void **)&op, flags);\n+\t\tbreak;\n+\tcase cipher:\n+\t\tofs.ofs.cipher.head = sop->cipher.data.offset;\n+\t\tif (len_in_bits) {\n+\t\t\tofs.ofs.cipher.head >>= 3;\n+\t\t\tofs.ofs.cipher.tail >>= 3;\n+\t\t}\n+\t\tnb_ops = rte_cryptodev_sym_hw_crypto_enqueue_cipher(dev_id,\n+\t\t\tqp_id, sess, ofs, &vec, (void **)&op, flags);\n+\t\tbreak;\n+\tcase auth:\n+\t\tofs.ofs.auth.head = sop->auth.data.offset;\n+\t\tdigest_vec.base = (void *)sop->auth.digest.data;\n+\t\tdigest_vec.iova = sop->auth.digest.phys_addr;\n+\t\tnb_ops = rte_cryptodev_sym_hw_crypto_enqueue_auth(dev_id, qp_id,\n+\t\t\tsess, ofs, &vec, (void **)&op, flags);\n+\t\tbreak;\n+\tcase chain:\n+\t\tofs.ofs.cipher.head =\n+\t\t\tsop->cipher.data.offset - sop->auth.data.offset;\n+\t\tofs.ofs.cipher.tail =\n+\t\t\t(sop->auth.data.offset + sop->auth.data.length) -\n+\t\t\t(sop->cipher.data.offset + sop->cipher.data.length);\n+\t\tif (len_in_bits) {\n+\t\t\tofs.ofs.cipher.head >>= 3;\n+\t\t\tofs.ofs.cipher.tail >>= 3;\n+\t\t}\n+\t\tdigest_vec.base = (void *)sop->auth.digest.data;\n+\t\tdigest_vec.iova = sop->auth.digest.phys_addr;\n+\t\tnb_ops = rte_cryptodev_sym_hw_crypto_enqueue_chain(dev_id,\n+\t\t\tqp_id, sess, ofs, &vec, (void **)&op, flags);\n+\t\tbreak;\n+\t}\n+\n+\tif (nb_ops < vec.num) {\n+\t\top->status = RTE_CRYPTO_OP_STATUS_ERROR;\n+\t\treturn;\n+\t}\n+\n+\tnb_ops = 0;\n+\tflags = RTE_CRYPTO_HW_DP_FF_GET_OPAQUE_ARRAY |\n+\t\tRTE_CRYPTO_HW_DP_FF_DEQUEUE_EXHAUST;\n+\twhile (count++ < 1024 && nb_ops < vec.num) {\n+\t\tnb_ops = rte_cryptodev_sym_hw_crypto_dequeue(dev_id, qp_id,\n+\t\t\tget_dequeue_count, write_status, (void **)&ret_op,\n+\t\t\t&n_success_ops, flags);\n+\t}\n+\n+\tif (count == 1024 || n_success_ops == 0 || nb_ops == 0 ||\n+\t\t\tret_op != op) {\n+\t\top->status = RTE_CRYPTO_OP_STATUS_ERROR;\n+\t\treturn;\n+\t}\n+}\n+\n static void\n process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)\n {\n@@ -2456,7 +2620,11 @@ test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 0, 1, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\t\tut_params->op);\n \tut_params->obuf = ut_params->op->sym->m_src;\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n@@ -2535,7 +2703,11 @@ test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 0, 1, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \tut_params->obuf = ut_params->op->sym->m_src;\n@@ -2605,6 +2777,9 @@ test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)\n \tif (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)\n \t\tprocess_cpu_crypt_auth_op(ts_params->valid_devs[0],\n \t\t\tut_params->op);\n+\telse if (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 0, 1, 1);\n \telse\n \t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\tut_params->op);\n@@ -2676,7 +2851,11 @@ test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 0, 1, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \tut_params->obuf = ut_params->op->sym->m_src;\n@@ -2883,8 +3062,12 @@ test_kasumi_encryption(const struct kasumi_test_data *tdata)\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n-\t\t\t\t\t\tut_params->op);\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 0, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\t\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n \tut_params->obuf = ut_params->op->sym->m_dst;\n@@ -2969,7 +3152,11 @@ test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 0, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\t\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n@@ -3292,7 +3479,11 @@ test_kasumi_decryption(const struct kasumi_test_data *tdata)\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 0, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\t\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n@@ -3367,7 +3558,11 @@ test_snow3g_encryption(const struct snow3g_test_data *tdata)\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 0, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\t\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n@@ -3742,7 +3937,11 @@ static int test_snow3g_decryption(const struct snow3g_test_data *tdata)\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 0, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\t\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \tut_params->obuf = ut_params->op->sym->m_dst;\n@@ -3910,7 +4109,11 @@ test_zuc_cipher_auth(const struct wireless_test_data *tdata)\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 1, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \tut_params->obuf = ut_params->op->sym->m_src;\n@@ -4005,7 +4208,11 @@ test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 1, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \tut_params->obuf = ut_params->op->sym->m_src;\n@@ -4141,7 +4348,11 @@ test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 1, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\tut_params->op);\n \n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n@@ -4330,7 +4541,11 @@ test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 1, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\tut_params->op);\n \n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n@@ -4512,7 +4727,11 @@ test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 1, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\tut_params->op);\n \n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n@@ -4702,7 +4921,11 @@ test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 1, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\tut_params->op);\n \n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n@@ -4843,7 +5066,11 @@ test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 1, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n@@ -4930,7 +5157,11 @@ test_zuc_encryption(const struct wireless_test_data *tdata)\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 0, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\t\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n@@ -5017,7 +5248,11 @@ test_zuc_encryption_sgl(const struct wireless_test_data *tdata)\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 0, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\t\t\t\tut_params->op);\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n \n@@ -5105,7 +5340,11 @@ test_zuc_authentication(const struct wireless_test_data *tdata)\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 0, 1, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\t\tut_params->op);\n \tut_params->obuf = ut_params->op->sym->m_src;\n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n@@ -5237,7 +5476,11 @@ test_zuc_auth_cipher(const struct wireless_test_data *tdata,\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 1, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\tut_params->op);\n \n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n@@ -5423,7 +5666,11 @@ test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,\n \tif (retval < 0)\n \t\treturn retval;\n \n-\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n+\tif (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 1, 1, 1);\n+\telse\n+\t\tut_params->op = process_crypto_request(ts_params->valid_devs[0],\n \t\t\tut_params->op);\n \n \tTEST_ASSERT_NOT_NULL(ut_params->op, \"failed to retrieve obuf\");\n@@ -7029,6 +7276,9 @@ test_authenticated_encryption(const struct aead_test_data *tdata)\n \t/* Process crypto operation */\n \tif (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)\n \t\tprocess_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);\n+\telse if (hw_dp_test)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 0, 0, 0);\n \telse\n \t\tTEST_ASSERT_NOT_NULL(\n \t\t\tprocess_crypto_request(ts_params->valid_devs[0],\n@@ -8521,6 +8771,9 @@ test_authenticated_decryption(const struct aead_test_data *tdata)\n \t/* Process crypto operation */\n \tif (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)\n \t\tprocess_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);\n+\telse if (hw_dp_test == 1)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 0, 0, 0);\n \telse\n \t\tTEST_ASSERT_NOT_NULL(\n \t\t\tprocess_crypto_request(ts_params->valid_devs[0],\n@@ -11461,6 +11714,9 @@ test_authenticated_encryption_SGL(const struct aead_test_data *tdata,\n \tif (oop == IN_PLACE &&\n \t\t\tgbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)\n \t\tprocess_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);\n+\telse if (oop == IN_PLACE && hw_dp_test == 1)\n+\t\tprocess_sym_hw_api_op(ts_params->valid_devs[0], 0,\n+\t\t\t\tut_params->op, 0, 0, 0);\n \telse\n \t\tTEST_ASSERT_NOT_NULL(\n \t\t\tprocess_crypto_request(ts_params->valid_devs[0],\n@@ -13022,6 +13278,75 @@ test_cryptodev_nitrox(void)\n \treturn unit_test_suite_runner(&cryptodev_nitrox_testsuite);\n }\n \n+static struct unit_test_suite cryptodev_sym_direct_api_testsuite = {\n+\t.suite_name = \"Crypto Sym direct API 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\ttest_snow3g_encryption_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_decryption_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_snow3g_auth_cipher_verify_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_hash_generate_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_hash_verify_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_encryption_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_kasumi_decryption_test_case_1),\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_AES_chain_all),\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+\t\t\ttest_AES_CCM_authenticated_decryption_test_case_128_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_AES_GCM_authenticated_encryption_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_AES_GCM_authenticated_decryption_test_case_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_AES_GCM_auth_encryption_test_case_192_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_AES_GCM_auth_decryption_test_case_192_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_AES_GCM_auth_encryption_test_case_256_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_AES_GCM_auth_decryption_test_case_256_1),\n+\t\tTEST_CASE_ST(ut_setup, ut_teardown,\n+\t\t\ttest_AES_GCM_auth_encrypt_SGL_in_place_1500B),\n+\t\tTEST_CASES_END() /**< NULL terminate unit test array */\n+\t}\n+};\n+\n+static int\n+test_qat_sym_direct_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. Check that both \"\n+\t\t\"CONFIG_RTE_LIBRTE_PMD_QAT and CONFIG_RTE_LIBRTE_PMD_QAT_SYM \"\n+\t\t\"are enabled in config file to run this testsuite.\\n\");\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\thw_dp_test = 1;\n+\tret = unit_test_suite_runner(&cryptodev_sym_direct_api_testsuite);\n+\thw_dp_test = 0;\n+\n+\treturn ret;\n+}\n+\n+REGISTER_TEST_COMMAND(cryptodev_qat_sym_api_autotest, test_qat_sym_direct_api);\n REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);\n REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);\n REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,\ndiff --git a/app/test/test_cryptodev.h b/app/test/test_cryptodev.h\nindex 41542e055..c382c12c4 100644\n--- a/app/test/test_cryptodev.h\n+++ b/app/test/test_cryptodev.h\n@@ -71,6 +71,8 @@\n #define CRYPTODEV_NAME_CAAM_JR_PMD\tcrypto_caam_jr\n #define CRYPTODEV_NAME_NITROX_PMD\tcrypto_nitrox_sym\n \n+extern int hw_dp_test;\n+\n /**\n  * Write (spread) data from buffer to mbuf data\n  *\n@@ -209,4 +211,8 @@ create_segmented_mbuf(struct rte_mempool *mbuf_pool, int pkt_len,\n \treturn NULL;\n }\n \n+void\n+process_sym_hw_api_op(uint8_t dev_id, uint16_t qp_id, struct rte_crypto_op *op,\n+\t\tuint8_t is_cipher, uint8_t is_auth, uint8_t len_in_bits);\n+\n #endif /* TEST_CRYPTODEV_H_ */\ndiff --git a/app/test/test_cryptodev_blockcipher.c b/app/test/test_cryptodev_blockcipher.c\nindex 642b54971..26f1c41c9 100644\n--- a/app/test/test_cryptodev_blockcipher.c\n+++ b/app/test/test_cryptodev_blockcipher.c\n@@ -461,25 +461,43 @@ test_blockcipher_one_case(const struct blockcipher_test_case *t,\n \t}\n \n \t/* Process crypto operation */\n-\tif (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {\n-\t\tsnprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,\n-\t\t\t\"line %u FAILED: %s\",\n-\t\t\t__LINE__, \"Error sending packet for encryption\");\n-\t\tstatus = TEST_FAILED;\n-\t\tgoto error_exit;\n-\t}\n+\tif (hw_dp_test) {\n+\t\tuint8_t is_cipher = 0, is_auth = 0;\n+\n+\t\tif (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) {\n+\t\t\tRTE_LOG(DEBUG, USER1,\n+\t\t\t\"QAT direct API does not support OOP, Test Skipped.\\n\");\n+\t\t\tsnprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, \"SKIPPED\");\n+\t\t\tstatus = TEST_SUCCESS;\n+\t\t\tgoto error_exit;\n+\t\t}\n+\t\tif (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER)\n+\t\t\tis_cipher = 1;\n+\t\tif (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH)\n+\t\t\tis_auth = 1;\n+\n+\t\tprocess_sym_hw_api_op(dev_id, 0, op, is_cipher, is_auth, 0);\n+\t} else {\n+\t\tif (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {\n+\t\t\tsnprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,\n+\t\t\t\t\"line %u FAILED: %s\",\n+\t\t\t\t__LINE__, \"Error sending packet for encryption\");\n+\t\t\tstatus = TEST_FAILED;\n+\t\t\tgoto error_exit;\n+\t\t}\n \n-\top = NULL;\n+\t\top = NULL;\n \n-\twhile (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)\n-\t\trte_pause();\n+\t\twhile (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)\n+\t\t\trte_pause();\n \n-\tif (!op) {\n-\t\tsnprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,\n-\t\t\t\"line %u FAILED: %s\",\n-\t\t\t__LINE__, \"Failed to process sym crypto op\");\n-\t\tstatus = TEST_FAILED;\n-\t\tgoto error_exit;\n+\t\tif (!op) {\n+\t\t\tsnprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,\n+\t\t\t\t\"line %u FAILED: %s\",\n+\t\t\t\t__LINE__, \"Failed to process sym crypto op\");\n+\t\t\tstatus = TEST_FAILED;\n+\t\t\tgoto error_exit;\n+\t\t}\n \t}\n \n \tdebug_hexdump(stdout, \"m_src(after):\",\n",
    "prefixes": [
        "v5",
        "3/4"
    ]
}