get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 75621,
    "url": "http://patches.dpdk.org/api/patches/75621/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200818121720.52090-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": "<20200818121720.52090-2-roy.fan.zhang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200818121720.52090-2-roy.fan.zhang@intel.com",
    "date": "2020-08-18T12:17:19",
    "name": "[1/2] fips_validation: add SGL support",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "1b4728bbfdc2b390bb5c65a0878d8b19befb1e1b",
    "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/20200818121720.52090-2-roy.fan.zhang@intel.com/mbox/",
    "series": [
        {
            "id": 11685,
            "url": "http://patches.dpdk.org/api/series/11685/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=11685",
            "date": "2020-08-18T12:17:18",
            "name": "fips_validation: add SGL and GMAC support",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/11685/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/75621/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/75621/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 920CEA034C;\n\tTue, 18 Aug 2020 14:17:35 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 494551C020;\n\tTue, 18 Aug 2020 14:17:28 +0200 (CEST)",
            "from mga01.intel.com (mga01.intel.com [192.55.52.88])\n by dpdk.org (Postfix) with ESMTP id D5C812BAA\n for <dev@dpdk.org>; Tue, 18 Aug 2020 14:17:25 +0200 (CEST)",
            "from fmsmga002.fm.intel.com ([10.253.24.26])\n by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 18 Aug 2020 05:17:25 -0700",
            "from silpixa00398673.ir.intel.com (HELO\n silpixa00398673.ger.corp.intel.com) ([10.237.223.136])\n by fmsmga002.fm.intel.com with ESMTP; 18 Aug 2020 05:17:23 -0700"
        ],
        "IronPort-SDR": [
            "\n BMab3mHtXWZPaIn3IVxWvX74jKgVFlPKuTtzHtcXJIaIJ9YEbYz0UQ0e7L1GkzbVB9g1WCytu5\n Lrn5ECVCHvyA==",
            "\n dtnaDpWIyqFjS/Sc8JPm51cCaaHXVGvFZ6EegG8ONvqbioHcN1I+iiaA00Hwq0GhGFn7fyrVKU\n xs1eaK7MmXRQ=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6000,8403,9716\"; a=\"172937291\"",
            "E=Sophos;i=\"5.76,327,1592895600\"; d=\"scan'208\";a=\"172937291\"",
            "E=Sophos;i=\"5.76,327,1592895600\"; d=\"scan'208\";a=\"328951128\""
        ],
        "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,\n\tFan Zhang <roy.fan.zhang@intel.com>",
        "Date": "Tue, 18 Aug 2020 13:17:19 +0100",
        "Message-Id": "<20200818121720.52090-2-roy.fan.zhang@intel.com>",
        "X-Mailer": "git-send-email 2.20.1",
        "In-Reply-To": "<20200818121720.52090-1-roy.fan.zhang@intel.com>",
        "References": "<20200818121720.52090-1-roy.fan.zhang@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [dpdk-dev 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   |   2 +-\n examples/fips_validation/main.c              | 372 +++++++++++++------\n 3 files changed, 265 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..7bf0eb48a 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 splitted 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..d48648467 100644\n--- a/examples/fips_validation/fips_validation.h\n+++ b/examples/fips_validation/fips_validation.h\n@@ -12,7 +12,7 @@\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\tUINT16_MAX\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..b2660b0d7 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@@ -195,15 +205,16 @@ cryptodev_fips_validate_usage(const char *prgname)\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 +228,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 +239,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 +325,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 +352,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 +487,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-\n-\t} else {\n-\t\tuint8_t *ct;\n+\t\tmemcpy(dst, src, len);\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 +612,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 +651,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 +1041,44 @@ 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 total_len = rte_pktmbuf_pkt_len(m) + env.digest_len, tlen;\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, \"Not enough memory\\n\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\ttlen = total_len;\n+\n+\twhile (m && tlen) {\n+\t\tuint16_t seg_len = RTE_MIN(rte_pktmbuf_data_len(m), tlen);\n+\n+\t\tsrc = rte_pktmbuf_mtod(m, uint8_t *);\n+\t\tmemcpy(dst, src, seg_len);\n+\t\tm = m->next;\n+\t\ttlen -= seg_len;\n+\t\tdst += seg_len;\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 +1137,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 +1152,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 +1175,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 +1186,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 +1213,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 +1342,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 +1354,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 +1376,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 +1422,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 +1433,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 +1529,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 +1541,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 +1615,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 +1709,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 +1756,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": [
        "1/2"
    ]
}