get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 76572,
    "url": "http://patches.dpdk.org/api/patches/76572/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200904160945.24590-2-roy.fan.zhang@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": "<20200904160945.24590-2-roy.fan.zhang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200904160945.24590-2-roy.fan.zhang@intel.com",
    "date": "2020-09-04T16:09:44",
    "name": "[v2,1/2] fips_validation: add SGL support",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "07c92135ba00b14011b6580228fdd8e8a665207f",
    "submitter": {
        "id": 304,
        "url": "http://patches.dpdk.org/api/people/304/?format=api",
        "name": "Fan Zhang",
        "email": "roy.fan.zhang@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/20200904160945.24590-2-roy.fan.zhang@intel.com/mbox/",
    "series": [
        {
            "id": 11957,
            "url": "http://patches.dpdk.org/api/series/11957/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=11957",
            "date": "2020-09-04T16:09:43",
            "name": "fips_validation: add SGL and GMAC support",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/11957/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/76572/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/76572/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 F2A7BA04C5;\n\tFri,  4 Sep 2020 18:10:04 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 2E3151C0D1;\n\tFri,  4 Sep 2020 18:09:56 +0200 (CEST)",
            "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n by dpdk.org (Postfix) with ESMTP id 4E0041C0C6\n for <dev@dpdk.org>; Fri,  4 Sep 2020 18:09:54 +0200 (CEST)",
            "from orsmga005.jf.intel.com ([10.7.209.41])\n by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 04 Sep 2020 09:09:52 -0700",
            "from silpixa00398673.ir.intel.com (HELO\n silpixa00398673.ger.corp.intel.com) ([10.237.223.136])\n by orsmga005.jf.intel.com with ESMTP; 04 Sep 2020 09:09:50 -0700"
        ],
        "IronPort-SDR": [
            "\n jBNA6PJ6PTevMHl7ZVy05GxSDnw0WQoIkzYQOtmUxgpqqfvdVYPt26lcIRQaTgFMPvvzPjz+mk\n v0L7pQIGLLAg==",
            "\n go8v1BA1RrqjOhIn+/eejrPAcbWwqT/7xVWcVcajoq5jD37msYQT8Ko53ExK35gDiSXDpsT1hP\n NPjnFOuIzGWw=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6000,8403,9734\"; a=\"221980406\"",
            "E=Sophos;i=\"5.76,390,1592895600\"; d=\"scan'208\";a=\"221980406\"",
            "E=Sophos;i=\"5.76,390,1592895600\"; d=\"scan'208\";a=\"478556302\""
        ],
        "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": "akhil.goyal@nxp.com, fiona.trahe@intel.com, arkadiuszx.kusztal@intel.com,\n adamx.dybkowski@intel.com, Fan Zhang <roy.fan.zhang@intel.com>",
        "Date": "Fri,  4 Sep 2020 17:09:44 +0100",
        "Message-Id": "<20200904160945.24590-2-roy.fan.zhang@intel.com>",
        "X-Mailer": "git-send-email 2.20.1",
        "In-Reply-To": "<20200904160945.24590-1-roy.fan.zhang@intel.com>",
        "References": "<20200818121720.52090-1-roy.fan.zhang@intel.com>\n <20200904160945.24590-1-roy.fan.zhang@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [dpdk-dev v2 1/2] fips_validation: add SGL support",
        "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 SGL support to FIPS sample application.\nOriginally the application allocates single mbuf of 64KB - 1\nbytes data room. With the change the user may reduce the\nmbuf dataroom size by using the add cmdline option. If the\ninput test data is longer than the user provided data room\nsize the application will automatically build chained mbufs\nfor the target cryptodev PMD to test.\n\nSigned-off-by: Fan Zhang <roy.fan.zhang@intel.com>\n---\n doc/guides/sample_app_ug/fips_validation.rst |   6 +\n examples/fips_validation/fips_validation.h   |   3 +-\n examples/fips_validation/main.c              | 377 +++++++++++++------\n 3 files changed, 271 insertions(+), 115 deletions(-)",
    "diff": "diff --git a/doc/guides/sample_app_ug/fips_validation.rst b/doc/guides/sample_app_ug/fips_validation.rst\nindex 2953fddeb..8d3db2214 100644\n--- a/doc/guides/sample_app_ug/fips_validation.rst\n+++ b/doc/guides/sample_app_ug/fips_validation.rst\n@@ -96,6 +96,7 @@ The application requires a number of command line options:\n          -- --req-file FILE_PATH/FOLDER_PATH\n          --rsp-file FILE_PATH/FOLDER_PATH\n          [--cryptodev DEVICE_NAME] [--cryptodev-id ID] [--path-is-folder]\n+         --mbuf-dataroom DATAROOM_SIZE\n \n where,\n   * req-file: The path of the request file or folder, separated by\n@@ -111,6 +112,11 @@ where,\n   * path-is-folder: If presented the application expects req-file and rsp-file\n     are folder paths.\n \n+  * mbuf-dataroom: By default the application creates mbuf pool with maximum\n+    possible data room (65535 bytes). If the user wants to test scatter-gather\n+    list feature of the PMD he or she may set this value to reduce the dataroom\n+    size so that the input data may be dividied into multiple chained mbufs.\n+\n \n To run the application in linux environment to test one AES FIPS test data\n file for crypto_aesni_mb PMD, issue the command:\ndiff --git a/examples/fips_validation/fips_validation.h b/examples/fips_validation/fips_validation.h\nindex 75fa555fa..ecf3d54dd 100644\n--- a/examples/fips_validation/fips_validation.h\n+++ b/examples/fips_validation/fips_validation.h\n@@ -12,7 +12,8 @@\n #define MAX_CASE_LINE\t\t15\n #define MAX_LINE_CHAR\t\t204800 /*< max number of characters per line */\n #define MAX_NB_TESTS\t\t10240\n-#define MAX_BUF_SIZE\t\t2048\n+#define DEF_MBUF_SEG_SIZE\t(UINT16_MAX - sizeof(struct rte_mbuf) - \\\n+\t\t\t\tRTE_PKTMBUF_HEADROOM)\n #define MAX_STRING_SIZE\t\t64\n #define MAX_DIGEST_SIZE\t\t64\n \ndiff --git a/examples/fips_validation/main.c b/examples/fips_validation/main.c\nindex efd32a86a..fadca6e0c 100644\n--- a/examples/fips_validation/main.c\n+++ b/examples/fips_validation/main.c\n@@ -17,6 +17,7 @@\n \n #define REQ_FILE_PATH_KEYWORD\t\"req-file\"\n #define RSP_FILE_PATH_KEYWORD\t\"rsp-file\"\n+#define MBUF_DATAROOM_KEYWORD\t\"mbuf-dataroom\"\n #define FOLDER_KEYWORD\t\t\"path-is-folder\"\n #define CRYPTODEV_KEYWORD\t\"cryptodev\"\n #define CRYPTODEV_ID_KEYWORD\t\"cryptodev-id\"\n@@ -33,15 +34,19 @@ struct cryptodev_fips_validate_env {\n \tconst char *req_path;\n \tconst char *rsp_path;\n \tuint32_t is_path_folder;\n-\tuint32_t dev_id;\n+\tuint8_t dev_id;\n+\tuint8_t dev_support_sgl;\n+\tuint16_t mbuf_data_room;\n \tstruct rte_mempool *mpool;\n \tstruct rte_mempool *sess_mpool;\n \tstruct rte_mempool *sess_priv_mpool;\n \tstruct rte_mempool *op_pool;\n \tstruct rte_mbuf *mbuf;\n+\tuint8_t *digest;\n+\tuint16_t digest_len;\n \tstruct rte_crypto_op *op;\n \tstruct rte_cryptodev_sym_session *sess;\n-\tuint32_t self_test;\n+\tuint16_t self_test;\n \tstruct fips_dev_broken_test_config *broken_test_config;\n } env;\n \n@@ -50,8 +55,10 @@ cryptodev_fips_validate_app_int(void)\n {\n \tstruct rte_cryptodev_config conf = {rte_socket_id(), 1, 0};\n \tstruct rte_cryptodev_qp_conf qp_conf = {128, NULL, NULL};\n+\tstruct rte_cryptodev_info dev_info;\n \tuint32_t sess_sz = rte_cryptodev_sym_get_private_session_size(\n \t\t\tenv.dev_id);\n+\tuint32_t nb_mbufs = UINT16_MAX / env.mbuf_data_room + 1;\n \tint ret;\n \n \tif (env.self_test) {\n@@ -70,8 +77,15 @@ cryptodev_fips_validate_app_int(void)\n \tif (ret < 0)\n \t\treturn ret;\n \n-\tenv.mpool = rte_pktmbuf_pool_create(\"FIPS_MEMPOOL\", 128, 0, 0,\n-\t\t\tUINT16_MAX, rte_socket_id());\n+\trte_cryptodev_info_get(env.dev_id, &dev_info);\n+\tif (dev_info.feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)\n+\t\tenv.dev_support_sgl = 1;\n+\telse\n+\t\tenv.dev_support_sgl = 0;\n+\n+\tenv.mpool = rte_pktmbuf_pool_create(\"FIPS_MEMPOOL\", nb_mbufs,\n+\t\t\t0, 0, sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM +\n+\t\t\tenv.mbuf_data_room, rte_socket_id());\n \tif (!env.mpool)\n \t\treturn ret;\n \n@@ -102,10 +116,6 @@ cryptodev_fips_validate_app_int(void)\n \tif (!env.op_pool)\n \t\tgoto error_exit;\n \n-\tenv.mbuf = rte_pktmbuf_alloc(env.mpool);\n-\tif (!env.mbuf)\n-\t\tgoto error_exit;\n-\n \tenv.op = rte_crypto_op_alloc(env.op_pool, RTE_CRYPTO_OP_TYPE_SYMMETRIC);\n \tif (!env.op)\n \t\tgoto error_exit;\n@@ -160,7 +170,7 @@ parse_cryptodev_arg(char *arg)\n \t\treturn id;\n \t}\n \n-\tenv.dev_id = (uint32_t)id;\n+\tenv.dev_id = (uint8_t)id;\n \n \treturn 0;\n }\n@@ -191,19 +201,21 @@ parse_cryptodev_id_arg(char *arg)\n static void\n cryptodev_fips_validate_usage(const char *prgname)\n {\n+\tuint32_t def_mbuf_seg_size = DEF_MBUF_SEG_SIZE;\n \tprintf(\"%s [EAL options] --\\n\"\n \t\t\"  --%s: REQUEST-FILE-PATH\\n\"\n \t\t\"  --%s: RESPONSE-FILE-PATH\\n\"\n \t\t\"  --%s: indicating both paths are folders\\n\"\n+\t\t\"  --%s: mbuf dataroom size (default %u bytes)\\n\"\n \t\t\"  --%s: CRYPTODEV-NAME\\n\"\n \t\t\"  --%s: CRYPTODEV-ID-NAME\\n\"\n \t\t\"  --%s: self test indicator\\n\"\n \t\t\"  --%s: self broken test ID\\n\"\n \t\t\"  --%s: self broken test direction\\n\",\n \t\tprgname, REQ_FILE_PATH_KEYWORD, RSP_FILE_PATH_KEYWORD,\n-\t\tFOLDER_KEYWORD, CRYPTODEV_KEYWORD, CRYPTODEV_ID_KEYWORD,\n-\t\tCRYPTODEV_ST_KEYWORD, CRYPTODEV_BK_ID_KEYWORD,\n-\t\tCRYPTODEV_BK_DIR_KEY);\n+\t\tFOLDER_KEYWORD, MBUF_DATAROOM_KEYWORD, def_mbuf_seg_size,\n+\t\tCRYPTODEV_KEYWORD, CRYPTODEV_ID_KEYWORD, CRYPTODEV_ST_KEYWORD,\n+\t\tCRYPTODEV_BK_ID_KEYWORD, CRYPTODEV_BK_DIR_KEY);\n }\n \n static int\n@@ -217,6 +229,7 @@ cryptodev_fips_validate_parse_args(int argc, char **argv)\n \t\t\t{REQ_FILE_PATH_KEYWORD, required_argument, 0, 0},\n \t\t\t{RSP_FILE_PATH_KEYWORD, required_argument, 0, 0},\n \t\t\t{FOLDER_KEYWORD, no_argument, 0, 0},\n+\t\t\t{MBUF_DATAROOM_KEYWORD, required_argument, 0, 0},\n \t\t\t{CRYPTODEV_KEYWORD, required_argument, 0, 0},\n \t\t\t{CRYPTODEV_ID_KEYWORD, required_argument, 0, 0},\n \t\t\t{CRYPTODEV_ST_KEYWORD, no_argument, 0, 0},\n@@ -227,6 +240,14 @@ cryptodev_fips_validate_parse_args(int argc, char **argv)\n \n \targvopt = argv;\n \n+\tenv.mbuf_data_room = DEF_MBUF_SEG_SIZE;\n+\tif (rte_cryptodev_count())\n+\t\tenv.dev_id = 0;\n+\telse {\n+\t\tcryptodev_fips_validate_usage(prgname);\n+\t\treturn -EINVAL;\n+\t}\n+\n \twhile ((opt = getopt_long(argc, argvopt, \"s:\",\n \t\t\t\t  lgopts, &option_index)) != EOF) {\n \n@@ -305,6 +326,23 @@ cryptodev_fips_validate_parse_args(int argc, char **argv)\n \t\t\t\t\tcryptodev_fips_validate_usage(prgname);\n \t\t\t\t\treturn -EINVAL;\n \t\t\t\t}\n+\t\t\t} else if (strcmp(lgopts[option_index].name,\n+\t\t\t\t\tMBUF_DATAROOM_KEYWORD) == 0) {\n+\t\t\t\tuint32_t data_room_size;\n+\n+\t\t\t\tif (parser_read_uint32(&data_room_size,\n+\t\t\t\t\t\toptarg) < 0) {\n+\t\t\t\t\tcryptodev_fips_validate_usage(prgname);\n+\t\t\t\t\treturn -EINVAL;\n+\t\t\t\t}\n+\n+\t\t\t\tif (data_room_size == 0 ||\n+\t\t\t\t\t\tdata_room_size > UINT16_MAX) {\n+\t\t\t\t\tcryptodev_fips_validate_usage(prgname);\n+\t\t\t\t\treturn -EINVAL;\n+\t\t\t\t}\n+\n+\t\t\t\tenv.mbuf_data_room = data_room_size;\n \t\t\t} else {\n \t\t\t\tcryptodev_fips_validate_usage(prgname);\n \t\t\t\treturn -EINVAL;\n@@ -315,8 +353,7 @@ cryptodev_fips_validate_parse_args(int argc, char **argv)\n \t\t}\n \t}\n \n-\tif (env.req_path == NULL || env.rsp_path == NULL ||\n-\t\t\tenv.dev_id == UINT32_MAX) {\n+\tif (env.req_path == NULL || env.rsp_path == NULL) {\n \t\tcryptodev_fips_validate_usage(prgname);\n \t\treturn -EINVAL;\n \t}\n@@ -451,60 +488,124 @@ struct fips_test_ops {\n } test_ops;\n \n static int\n-prepare_cipher_op(void)\n+prepare_data_mbufs(struct fips_val *val)\n {\n-\tstruct rte_crypto_sym_op *sym = env.op->sym;\n-\tuint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *, IV_OFF);\n+\tstruct rte_mbuf *m, *head = 0;\n+\tuint8_t *src = val->val;\n+\tuint32_t total_len = val->len;\n+\tuint16_t nb_seg;\n+\tint ret = 0;\n \n-\t__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\trte_pktmbuf_reset(env.mbuf);\n-\n-\tsym->m_src = env.mbuf;\n-\tsym->cipher.data.offset = 0;\n+\tif (env.mbuf)\n+\t\trte_pktmbuf_free(env.mbuf);\n \n-\tmemcpy(iv, vec.iv.val, vec.iv.len);\n+\tif (total_len > RTE_MBUF_MAX_NB_SEGS) {\n+\t\tRTE_LOG(ERR, USER1, \"Data len %u too big\\n\", total_len);\n+\t\treturn -EPERM;\n+\t}\n \n-\tif (info.op == FIPS_TEST_ENC_AUTH_GEN) {\n-\t\tuint8_t *pt;\n+\tnb_seg = total_len / env.mbuf_data_room;\n+\tif (total_len % env.mbuf_data_room)\n+\t\tnb_seg++;\n \n-\t\tif (vec.pt.len > RTE_MBUF_MAX_NB_SEGS) {\n-\t\t\tRTE_LOG(ERR, USER1, \"PT len %u\\n\", vec.pt.len);\n-\t\t\treturn -EPERM;\n-\t\t}\n+\tm = rte_pktmbuf_alloc(env.mpool);\n+\tif (!m) {\n+\t\tRTE_LOG(ERR, USER1, \"Error %i: Not enough mbuf\\n\",\n+\t\t\t\t-ENOMEM);\n+\t\treturn -ENOMEM;\n+\t}\n+\thead = m;\n \n-\t\tpt = (uint8_t *)rte_pktmbuf_append(env.mbuf, vec.pt.len);\n+\twhile (nb_seg) {\n+\t\tuint16_t len = RTE_MIN(total_len, env.mbuf_data_room);\n+\t\tuint8_t *dst = (uint8_t *)rte_pktmbuf_append(m, len);\n \n-\t\tif (!pt) {\n+\t\tif (!dst) {\n \t\t\tRTE_LOG(ERR, USER1, \"Error %i: MBUF too small\\n\",\n \t\t\t\t\t-ENOMEM);\n-\t\t\treturn -ENOMEM;\n+\t\t\tret = -ENOMEM;\n+\t\t\tgoto error_exit;\n \t\t}\n \n-\t\tmemcpy(pt, vec.pt.val, vec.pt.len);\n-\t\tsym->cipher.data.length = vec.pt.len;\n+\t\tmemcpy(dst, src, len);\n \n-\t} else {\n-\t\tuint8_t *ct;\n-\n-\t\tif (vec.ct.len > RTE_MBUF_MAX_NB_SEGS) {\n-\t\t\tRTE_LOG(ERR, USER1, \"CT len %u\\n\", vec.ct.len);\n-\t\t\treturn -EPERM;\n+\t\tif (head != m) {\n+\t\t\tret = rte_pktmbuf_chain(head, m);\n+\t\t\tif (ret) {\n+\t\t\t\trte_pktmbuf_free(m);\n+\t\t\t\tRTE_LOG(ERR, USER1, \"Error %i: SGL build\\n\",\n+\t\t\t\t\t\tret);\n+\t\t\t\tgoto error_exit;\n+\t\t\t}\n \t\t}\n+\t\ttotal_len -= len;\n \n-\t\tct = (uint8_t *)rte_pktmbuf_append(env.mbuf, vec.ct.len);\n+\t\tif (total_len) {\n+\t\t\tif (!env.dev_support_sgl) {\n+\t\t\t\tRTE_LOG(ERR, USER1, \"SGL not supported\\n\");\n+\t\t\t\tret = -EPERM;\n+\t\t\t\tgoto error_exit;\n+\t\t\t}\n \n-\t\tif (!ct) {\n-\t\t\tRTE_LOG(ERR, USER1, \"Error %i: MBUF too small\\n\",\n-\t\t\t\t\t-ENOMEM);\n-\t\t\treturn -ENOMEM;\n-\t\t}\n+\t\t\tm = rte_pktmbuf_alloc(env.mpool);\n+\t\t\tif (!m) {\n+\t\t\t\tRTE_LOG(ERR, USER1, \"Error %i: No memory\\n\",\n+\t\t\t\t\t\t-ENOMEM);\n+\t\t\t\tgoto error_exit;\n+\t\t\t}\n+\t\t} else\n+\t\t\tbreak;\n+\n+\t\tsrc += len;\n+\t\tnb_seg--;\n+\t}\n+\n+\tif (total_len) {\n+\t\tRTE_LOG(ERR, USER1, \"Error %i: Failed to store all data\\n\",\n+\t\t\t\t-ENOMEM);\n+\t\tgoto error_exit;\n+\t}\n+\n+\tenv.mbuf = head;\n+\n+\treturn 0;\n+\n+error_exit:\n+\tif (head)\n+\t\trte_pktmbuf_free(head);\n+\treturn ret;\n+}\n+\n+static int\n+prepare_cipher_op(void)\n+{\n+\tstruct rte_crypto_sym_op *sym = env.op->sym;\n+\tuint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *, IV_OFF);\n+\tint ret;\n+\n+\t__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);\n+\n+\tmemcpy(iv, vec.iv.val, vec.iv.len);\n+\n+\tif (info.op == FIPS_TEST_ENC_AUTH_GEN) {\n+\t\tret = prepare_data_mbufs(&vec.pt);\n+\t\tif (ret < 0)\n+\t\t\treturn ret;\n+\n+\t\tsym->cipher.data.length = vec.pt.len;\n+\t} else {\n+\t\tret = prepare_data_mbufs(&vec.ct);\n+\t\tif (ret < 0)\n+\t\t\treturn ret;\n \n-\t\tmemcpy(ct, vec.ct.val, vec.ct.len);\n \t\tsym->cipher.data.length = vec.ct.len;\n \t}\n \n \trte_crypto_op_attach_sym_session(env.op, env.sess);\n \n+\tsym->m_src = env.mbuf;\n+\tsym->cipher.data.offset = 0;\n+\n \treturn 0;\n }\n \n@@ -512,32 +613,33 @@ static int\n prepare_auth_op(void)\n {\n \tstruct rte_crypto_sym_op *sym = env.op->sym;\n-\tuint8_t *pt;\n+\tint ret;\n \n \t__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\trte_pktmbuf_reset(env.mbuf);\n \n-\tsym->m_src = env.mbuf;\n-\tsym->auth.data.offset = 0;\n+\tret = prepare_data_mbufs(&vec.pt);\n+\tif (ret < 0)\n+\t\treturn ret;\n \n-\tpt = (uint8_t *)rte_pktmbuf_append(env.mbuf, vec.pt.len +\n-\t\t\tvec.cipher_auth.digest.len);\n+\tif (env.digest)\n+\t\trte_free(env.digest);\n \n-\tif (!pt) {\n-\t\tRTE_LOG(ERR, USER1, \"Error %i: MBUF too small\\n\",\n-\t\t\t\t-ENOMEM);\n+\tenv.digest = rte_zmalloc(NULL, vec.cipher_auth.digest.len,\n+\t\t\tRTE_CACHE_LINE_SIZE);\n+\tif (!env.digest) {\n+\t\tRTE_LOG(ERR, USER1, \"Not enough memory\\n\");\n \t\treturn -ENOMEM;\n \t}\n+\tenv.digest_len = vec.cipher_auth.digest.len;\n \n+\tsym->m_src = env.mbuf;\n+\tsym->auth.data.offset = 0;\n \tsym->auth.data.length = vec.pt.len;\n-\tsym->auth.digest.data = pt + vec.pt.len;\n-\tsym->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(\n-\t\t\tenv.mbuf, vec.pt.len);\n-\n-\tmemcpy(pt, vec.pt.val, vec.pt.len);\n+\tsym->auth.digest.data = env.digest;\n+\tsym->auth.digest.phys_addr = rte_malloc_virt2iova(env.digest);\n \n \tif (info.op == FIPS_TEST_DEC_AUTH_VERIF)\n-\t\tmemcpy(pt + vec.pt.len, vec.cipher_auth.digest.val,\n+\t\tmemcpy(env.digest, vec.cipher_auth.digest.val,\n \t\t\t\tvec.cipher_auth.digest.len);\n \n \trte_crypto_op_attach_sym_session(env.op, env.sess);\n@@ -550,65 +652,53 @@ prepare_aead_op(void)\n {\n \tstruct rte_crypto_sym_op *sym = env.op->sym;\n \tuint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *, IV_OFF);\n+\tint ret;\n \n \t__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);\n-\trte_pktmbuf_reset(env.mbuf);\n \n \tif (info.algo == FIPS_TEST_ALGO_AES_CCM)\n-\t\tmemcpy(iv + 1, vec.iv.val, vec.iv.len);\n-\telse\n-\t\tmemcpy(iv, vec.iv.val, vec.iv.len);\n+\t\tiv++;\n \n-\tsym->m_src = env.mbuf;\n-\tsym->aead.data.offset = 0;\n-\tsym->aead.aad.data = vec.aead.aad.val;\n-\tsym->aead.aad.phys_addr = rte_malloc_virt2iova(sym->aead.aad.data);\n+\tif (vec.iv.val)\n+\t\tmemcpy(iv, vec.iv.val, vec.iv.len);\n+\telse\n+\t\t/* if REQ file has iv length but not data, default as all 0 */\n+\t\tmemset(iv, 0, vec.iv.len);\n \n \tif (info.op == FIPS_TEST_ENC_AUTH_GEN) {\n-\t\tuint8_t *pt;\n-\n-\t\tif (vec.pt.len > RTE_MBUF_MAX_NB_SEGS) {\n-\t\t\tRTE_LOG(ERR, USER1, \"PT len %u\\n\", vec.pt.len);\n-\t\t\treturn -EPERM;\n-\t\t}\n-\n-\t\tpt = (uint8_t *)rte_pktmbuf_append(env.mbuf,\n-\t\t\t\tvec.pt.len + vec.aead.digest.len);\n+\t\tret = prepare_data_mbufs(&vec.pt);\n+\t\tif (ret < 0)\n+\t\t\treturn ret;\n \n-\t\tif (!pt) {\n-\t\t\tRTE_LOG(ERR, USER1, \"Error %i: MBUF too small\\n\",\n-\t\t\t\t\t-ENOMEM);\n+\t\tif (env.digest)\n+\t\t\trte_free(env.digest);\n+\t\tenv.digest = rte_zmalloc(NULL, vec.aead.digest.len,\n+\t\t\t\tRTE_CACHE_LINE_SIZE);\n+\t\tif (!env.digest) {\n+\t\t\tRTE_LOG(ERR, USER1, \"Not enough memory\\n\");\n \t\t\treturn -ENOMEM;\n \t\t}\n+\t\tenv.digest_len = vec.cipher_auth.digest.len;\n \n-\t\tmemcpy(pt, vec.pt.val, vec.pt.len);\n \t\tsym->aead.data.length = vec.pt.len;\n-\t\tsym->aead.digest.data = pt + vec.pt.len;\n-\t\tsym->aead.digest.phys_addr = rte_pktmbuf_mtophys_offset(\n-\t\t\t\tenv.mbuf, vec.pt.len);\n+\t\tsym->aead.digest.data = env.digest;\n+\t\tsym->aead.digest.phys_addr = rte_malloc_virt2iova(env.digest);\n \t} else {\n-\t\tuint8_t *ct;\n-\n-\t\tif (vec.ct.len > RTE_MBUF_MAX_NB_SEGS) {\n-\t\t\tRTE_LOG(ERR, USER1, \"CT len %u\\n\", vec.ct.len);\n-\t\t\treturn -EPERM;\n-\t\t}\n-\n-\t\tct = (uint8_t *)rte_pktmbuf_append(env.mbuf, vec.ct.len);\n-\n-\t\tif (!ct) {\n-\t\t\tRTE_LOG(ERR, USER1, \"Error %i: MBUF too small\\n\",\n-\t\t\t\t\t-ENOMEM);\n-\t\t\treturn -ENOMEM;\n-\t\t}\n+\t\tret = prepare_data_mbufs(&vec.ct);\n+\t\tif (ret < 0)\n+\t\t\treturn ret;\n \n-\t\tmemcpy(ct, vec.ct.val, vec.ct.len);\n \t\tsym->aead.data.length = vec.ct.len;\n \t\tsym->aead.digest.data = vec.aead.digest.val;\n \t\tsym->aead.digest.phys_addr = rte_malloc_virt2iova(\n \t\t\t\tsym->aead.digest.data);\n \t}\n \n+\tsym->m_src = env.mbuf;\n+\tsym->aead.data.offset = 0;\n+\tsym->aead.aad.data = vec.aead.aad.val;\n+\tsym->aead.aad.phys_addr = rte_malloc_virt2iova(sym->aead.aad.data);\n+\n \trte_crypto_op_attach_sym_session(env.op, env.sess);\n \n \treturn 0;\n@@ -952,11 +1042,48 @@ prepare_xts_xform(struct rte_crypto_sym_xform *xform)\n \treturn 0;\n }\n \n-static void\n+static int\n get_writeback_data(struct fips_val *val)\n {\n-\tval->val = rte_pktmbuf_mtod(env.mbuf, uint8_t *);\n-\tval->len = rte_pktmbuf_pkt_len(env.mbuf);\n+\tstruct rte_mbuf *m = env.mbuf;\n+\tuint16_t data_len = rte_pktmbuf_pkt_len(m);\n+\tuint16_t total_len = data_len + env.digest_len;\n+\tuint8_t *src, *dst, *wb_data;\n+\n+\t/* in case val is reused for MCT test, try to free the buffer first */\n+\tif (val->val) {\n+\t\tfree(val->val);\n+\t\tval->val = NULL;\n+\t}\n+\n+\twb_data = dst = calloc(1, total_len);\n+\tif (!dst) {\n+\t\tRTE_LOG(ERR, USER1, \"Error %i: Not enough memory\\n\", -ENOMEM);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\twhile (m && data_len) {\n+\t\tuint16_t seg_len = RTE_MIN(rte_pktmbuf_data_len(m), data_len);\n+\n+\t\tsrc = rte_pktmbuf_mtod(m, uint8_t *);\n+\t\tmemcpy(dst, src, seg_len);\n+\t\tm = m->next;\n+\t\tdata_len -= seg_len;\n+\t\tdst += seg_len;\n+\t}\n+\n+\tif (data_len) {\n+\t\tRTE_LOG(ERR, USER1, \"Error -1: write back data\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\tif (env.digest)\n+\t\tmemcpy(dst, env.digest, env.digest_len);\n+\n+\tval->val = wb_data;\n+\tval->len = total_len;\n+\n+\treturn 0;\n }\n \n static int\n@@ -1015,7 +1142,7 @@ fips_run_test(void)\n static int\n fips_generic_test(void)\n {\n-\tstruct fips_val val;\n+\tstruct fips_val val = {NULL, 0};\n \tint ret;\n \n \tfips_test_write_one_case();\n@@ -1030,7 +1157,9 @@ fips_generic_test(void)\n \t\treturn ret;\n \t}\n \n-\tget_writeback_data(&val);\n+\tret = get_writeback_data(&val);\n+\tif (ret < 0)\n+\t\treturn ret;\n \n \tswitch (info.file_type) {\n \tcase FIPS_TYPE_REQ:\n@@ -1051,6 +1180,7 @@ fips_generic_test(void)\n \t}\n \n \tfprintf(info.fp_wr, \"\\n\");\n+\tfree(val.val);\n \n \treturn 0;\n }\n@@ -1061,7 +1191,7 @@ fips_mct_tdes_test(void)\n #define TDES_BLOCK_SIZE\t\t8\n #define TDES_EXTERN_ITER\t400\n #define TDES_INTERN_ITER\t10000\n-\tstruct fips_val val, val_key;\n+\tstruct fips_val val = {NULL, 0}, val_key;\n \tuint8_t prev_out[TDES_BLOCK_SIZE] = {0};\n \tuint8_t prev_prev_out[TDES_BLOCK_SIZE] = {0};\n \tuint8_t prev_in[TDES_BLOCK_SIZE] = {0};\n@@ -1088,7 +1218,9 @@ fips_mct_tdes_test(void)\n \t\t\t\treturn ret;\n \t\t\t}\n \n-\t\t\tget_writeback_data(&val);\n+\t\t\tret = get_writeback_data(&val);\n+\t\t\tif (ret < 0)\n+\t\t\t\treturn ret;\n \n \t\t\tif (info.op == FIPS_TEST_DEC_AUTH_VERIF)\n \t\t\t\tmemcpy(prev_in, vec.ct.val, TDES_BLOCK_SIZE);\n@@ -1215,6 +1347,9 @@ fips_mct_tdes_test(void)\n \t\t}\n \t}\n \n+\tif (val.val)\n+\t\tfree(val.val);\n+\n \treturn 0;\n }\n \n@@ -1224,7 +1359,7 @@ fips_mct_aes_ecb_test(void)\n #define AES_BLOCK_SIZE\t16\n #define AES_EXTERN_ITER\t100\n #define AES_INTERN_ITER\t1000\n-\tstruct fips_val val, val_key;\n+\tstruct fips_val val = {NULL, 0}, val_key;\n \tuint8_t prev_out[AES_BLOCK_SIZE] = {0};\n \tuint32_t i, j, k;\n \tint ret;\n@@ -1246,7 +1381,9 @@ fips_mct_aes_ecb_test(void)\n \t\t\t\treturn ret;\n \t\t\t}\n \n-\t\t\tget_writeback_data(&val);\n+\t\t\tret = get_writeback_data(&val);\n+\t\t\tif (ret < 0)\n+\t\t\t\treturn ret;\n \n \t\t\tif (info.op == FIPS_TEST_ENC_AUTH_GEN)\n \t\t\t\tmemcpy(vec.pt.val, val.val, AES_BLOCK_SIZE);\n@@ -1290,6 +1427,9 @@ fips_mct_aes_ecb_test(void)\n \t\t}\n \t}\n \n+\tif (val.val)\n+\t\tfree(val.val);\n+\n \treturn 0;\n }\n static int\n@@ -1298,7 +1438,7 @@ fips_mct_aes_test(void)\n #define AES_BLOCK_SIZE\t16\n #define AES_EXTERN_ITER\t100\n #define AES_INTERN_ITER\t1000\n-\tstruct fips_val val, val_key;\n+\tstruct fips_val val = {NULL, 0}, val_key;\n \tuint8_t prev_out[AES_BLOCK_SIZE] = {0};\n \tuint8_t prev_in[AES_BLOCK_SIZE] = {0};\n \tuint32_t i, j, k;\n@@ -1394,6 +1534,9 @@ fips_mct_aes_test(void)\n \t\t\tmemcpy(vec.iv.val, val.val, AES_BLOCK_SIZE);\n \t}\n \n+\tif (val.val)\n+\t\tfree(val.val);\n+\n \treturn 0;\n }\n \n@@ -1403,7 +1546,7 @@ fips_mct_sha_test(void)\n #define SHA_EXTERN_ITER\t100\n #define SHA_INTERN_ITER\t1000\n #define SHA_MD_BLOCK\t3\n-\tstruct fips_val val, md[SHA_MD_BLOCK];\n+\tstruct fips_val val = {NULL, 0}, md[SHA_MD_BLOCK];\n \tchar temp[MAX_DIGEST_SIZE*2];\n \tint ret;\n \tuint32_t i, j;\n@@ -1477,6 +1620,9 @@ fips_mct_sha_test(void)\n \n \trte_free(vec.pt.val);\n \n+\tif (val.val)\n+\t\tfree(val.val);\n+\n \treturn 0;\n }\n \n@@ -1568,7 +1714,6 @@ fips_test_one_file(void)\n {\n \tint fetch_ret = 0, ret;\n \n-\n \tret = init_test_ops();\n \tif (ret < 0) {\n \t\tRTE_LOG(ERR, USER1, \"Error %i: Init test op\\n\", ret);\n@@ -1616,6 +1761,10 @@ fips_test_one_file(void)\n \n \tfips_test_clear();\n \n-\treturn ret;\n+\tif (env.digest)\n+\t\trte_free(env.digest);\n+\tif (env.mbuf)\n+\t\trte_pktmbuf_free(env.mbuf);\n \n+\treturn ret;\n }\n",
    "prefixes": [
        "v2",
        "1/2"
    ]
}