get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 47722,
    "url": "http://patches.dpdk.org/api/patches/47722/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20181102095535.7906-2-marko.kovacevic@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": "<20181102095535.7906-2-marko.kovacevic@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20181102095535.7906-2-marko.kovacevic@intel.com",
    "date": "2018-11-02T09:55:28",
    "name": "[v7,1/8] examples/fips_validation: add cryptodev fips compliant application",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "335fa5d582686c8d4a496c95d99ef53d0bfa286b",
    "submitter": {
        "id": 853,
        "url": "http://patches.dpdk.org/api/people/853/?format=api",
        "name": "Kovacevic, Marko",
        "email": "marko.kovacevic@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/20181102095535.7906-2-marko.kovacevic@intel.com/mbox/",
    "series": [
        {
            "id": 2223,
            "url": "http://patches.dpdk.org/api/series/2223/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=2223",
            "date": "2018-11-02T09:55:27",
            "name": "FIPS validation capability",
            "version": 7,
            "mbox": "http://patches.dpdk.org/series/2223/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/47722/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/47722/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 559CD1B204;\n\tFri,  2 Nov 2018 10:55:48 +0100 (CET)",
            "from mga12.intel.com (mga12.intel.com [192.55.52.136])\n\tby dpdk.org (Postfix) with ESMTP id 7E0B21B1F4\n\tfor <dev@dpdk.org>; Fri,  2 Nov 2018 10:55:45 +0100 (CET)",
            "from fmsmga001.fm.intel.com ([10.253.24.23])\n\tby fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t02 Nov 2018 02:55:44 -0700",
            "from silpixa00399502.ir.intel.com (HELO\n\tsilpixa00399502.ger.corp.intel.com) ([10.237.223.218])\n\tby fmsmga001.fm.intel.com with ESMTP; 02 Nov 2018 02:55:43 -0700"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.54,455,1534834800\"; d=\"scan'208\";a=\"104701187\"",
        "From": "\"Kovacevic, Marko\" <marko.kovacevic@intel.com>",
        "To": "akhil.goyal@nxp.com",
        "Cc": "dev@dpdk.org, roy.fan.zhang@intel.com, arkadiuszx.kusztal@intel.com,\n\t\"Kovacevic, Marko\" <marko.kovacevic@intel.com>",
        "Date": "Fri,  2 Nov 2018 09:55:28 +0000",
        "Message-Id": "<20181102095535.7906-2-marko.kovacevic@intel.com>",
        "X-Mailer": "git-send-email 2.9.5",
        "In-Reply-To": "<20181102095535.7906-1-marko.kovacevic@intel.com>",
        "References": "<20181026110716.42093-1-marko.kovacevic@intel.com>\n\t<20181102095535.7906-1-marko.kovacevic@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v7 1/8] examples/fips_validation: add cryptodev\n\tfips compliant application",
        "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\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Added FIPS application into the examples to allow\nusers to use a simple sample app to validate\ntheir systems and be able to get FIPS certification.\n\nSigned-off-by: Marko Kovacevic <marko.kovacevic@intel.com>\nSigned-off-by: Fan Zhang <roy.fan.zhang@intel.com>\nAcked-by: Arek Kusztal <arkadiuszx.kusztal@intel.com>\n---\n MAINTAINERS                                |   4 +\n examples/fips_validation/Makefile          |  69 ++++\n examples/fips_validation/fips_validation.c | 564 +++++++++++++++++++++++++++++\n examples/fips_validation/fips_validation.h | 149 ++++++++\n examples/fips_validation/main.c            | 388 ++++++++++++++++++++\n examples/fips_validation/meson.build       |  14 +\n 6 files changed, 1188 insertions(+)\n create mode 100644 examples/fips_validation/Makefile\n create mode 100644 examples/fips_validation/fips_validation.c\n create mode 100644 examples/fips_validation/fips_validation.h\n create mode 100644 examples/fips_validation/main.c\n create mode 100644 examples/fips_validation/meson.build",
    "diff": "diff --git a/MAINTAINERS b/MAINTAINERS\nindex e60379d..f52b8b9 100644\n--- a/MAINTAINERS\n+++ b/MAINTAINERS\n@@ -1343,3 +1343,7 @@ F: examples/tep_termination/\n F: examples/vmdq/\n F: examples/vmdq_dcb/\n F: doc/guides/sample_app_ug/vmdq_dcb_forwarding.rst\n+\n+M: Marko Kovacevic <marko.kovacevic@intel.com>\n+F: examples/fips_validation\n+F: doc/guides/sample_app_ug/fips_validation.rst\ndiff --git a/examples/fips_validation/Makefile b/examples/fips_validation/Makefile\nnew file mode 100644\nindex 0000000..59d56c7\n--- /dev/null\n+++ b/examples/fips_validation/Makefile\n@@ -0,0 +1,69 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 2018 Intel Corporation\n+\n+# binary name\n+APP = fips_validation\n+\n+# all source are stored in SRCS-y\n+SRCS-y := fips_validation.c\n+SRCS-y += main.c\n+\n+# Build using pkg-config variables if possible\n+$(shell pkg-config --exists libdpdk)\n+ifeq ($(.SHELLSTATUS),0)\n+\n+all: shared\n+.PHONY: shared static\n+shared: build/$(APP)-shared\n+\tln -sf $(APP)-shared build/$(APP)\n+static: build/$(APP)-static\n+\tln -sf $(APP)-static build/$(APP)\n+\n+PC_FILE := $(shell pkg-config --path libdpdk)\n+CFLAGS += -O3 $(shell pkg-config --cflags libdpdk)\n+LDFLAGS_SHARED = $(shell pkg-config --libs libdpdk)\n+LDFLAGS_STATIC = -Wl,-Bstatic $(shell pkg-config --static --libs libdpdk)\n+\n+build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build\n+\t$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)\n+\n+build/$(APP)-static: $(SRCS-y) Makefile $(PC_FILE) | build\n+\t$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_STATIC)\n+\n+build:\n+\t@mkdir -p $@\n+\n+.PHONY: clean\n+clean:\n+\trm -f build/$(APP) build/$(APP)-static build/$(APP)-shared\n+\trmdir --ignore-fail-on-non-empty build\n+\n+else\n+\n+ifeq ($(RTE_SDK),)\n+$(error \"Please define RTE_SDK environment variable\")\n+endif\n+\n+# Default target, can be overridden by command line or environment\n+RTE_TARGET ?= x86_64-native-linuxapp-gcc\n+\n+INC += $(sort $(wildcard *.h))\n+\n+include $(RTE_SDK)/mk/rte.vars.mk\n+\n+CFLAGS += $(WERROR_FLAGS)\n+\n+# workaround for a gcc bug with noreturn attribute\n+# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603\n+ifeq ($(CONFIG_RTE_TOOLCHAIN_GCC),y)\n+CFLAGS_main.o += -Wno-return-type\n+endif\n+\n+CFLAGS += -DALLOW_EXPERIMENTAL_API\n+CFLAGS += -I$(SRCDIR)\n+CFLAGS += -O3\n+CFLAGS += $(WERROR_FLAGS)\n+\n+include $(RTE_SDK)/mk/rte.extapp.mk\n+\n+endif\ndiff --git a/examples/fips_validation/fips_validation.c b/examples/fips_validation/fips_validation.c\nnew file mode 100644\nindex 0000000..58a3c1b\n--- /dev/null\n+++ b/examples/fips_validation/fips_validation.c\n@@ -0,0 +1,564 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018 Intel Corporation\n+ */\n+\n+#include <stdio.h>\n+#include <string.h>\n+\n+#include <rte_string_fns.h>\n+#include <rte_cryptodev.h>\n+#include <rte_malloc.h>\n+\n+#include \"fips_validation.h\"\n+\n+#define skip_white_spaces(pos)\t\t\t\\\n+({\t\t\t\t\t\t\\\n+\t__typeof__(pos) _p = (pos);\t\t\\\n+\tfor ( ; isspace(*_p); _p++)\t\t\\\n+\t\t;\t\t\t\t\\\n+\t_p;\t\t\t\t\t\\\n+})\n+\n+static int\n+get_file_line(void)\n+{\n+\tFILE *fp = info.fp_rd;\n+\tchar *line = info.one_line_text;\n+\tint ret;\n+\tuint32_t loc = 0;\n+\n+\tmemset(line, 0, MAX_LINE_CHAR);\n+\twhile ((ret = fgetc(fp)) != EOF) {\n+\t\tchar c = (char)ret;\n+\n+\t\tif (loc >= MAX_LINE_CHAR - 1)\n+\t\t\treturn -ENOMEM;\n+\t\tif (c == '\\n')\n+\t\t\tbreak;\n+\t\tline[loc++] = c;\n+\t}\n+\n+\tif (ret == EOF)\n+\t\treturn -EOF;\n+\n+\treturn 0;\n+}\n+\n+int\n+fips_test_fetch_one_block(void)\n+{\n+\tsize_t size;\n+\tint ret = 0;\n+\tuint32_t i;\n+\n+\tfor (i = 0; i < info.nb_vec_lines; i++) {\n+\t\tfree(info.vec[i]);\n+\t\tinfo.vec[i] = NULL;\n+\t}\n+\n+\ti = 0;\n+\tdo {\n+\t\tif (i >= MAX_LINE_PER_VECTOR) {\n+\t\t\tret = -ENOMEM;\n+\t\t\tgoto error_exit;\n+\t\t}\n+\n+\t\tret = get_file_line();\n+\t\tsize = strlen(info.one_line_text);\n+\t\tif (size == 0)\n+\t\t\tbreak;\n+\n+\t\tinfo.vec[i] = calloc(1, size + 5);\n+\t\tif (info.vec[i] == NULL)\n+\t\t\tgoto error_exit;\n+\n+\t\tstrlcpy(info.vec[i], info.one_line_text, size + 1);\n+\t\ti++;\n+\t} while (ret == 0);\n+\n+\tinfo.nb_vec_lines = i;\n+\n+\treturn ret;\n+\n+error_exit:\n+\tfor (i = 0; i < MAX_LINE_PER_VECTOR; i++)\n+\t\tif (info.vec[i] != NULL) {\n+\t\t\tfree(info.vec[i]);\n+\t\t\tinfo.vec[i] = NULL;\n+\t\t}\n+\n+\tinfo.nb_vec_lines = 0;\n+\n+\treturn -ENOMEM;\n+}\n+\n+static int\n+fips_test_parse_header(void)\n+{\n+\tuint32_t i;\n+\tchar *tmp;\n+\tint ret;\n+\ttime_t t = time(NULL);\n+\tstruct tm *tm_now = localtime(&t);\n+\n+\tret = fips_test_fetch_one_block();\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n+\tfor (i = 0; i < info.nb_vec_lines; i++) {\n+\n+\t\ttmp = strstr(info.vec[i], \"# Config info for \");\n+\t\tif (tmp != NULL) {\n+\t\t\tfprintf(info.fp_wr, \"%s%s\\n\", \"# Config info for DPDK Cryptodev \",\n+\t\t\t\t\tinfo.device_name);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\ttmp = strstr(info.vec[i], \"#  HMAC information for \");\n+\t\tif (tmp != NULL) {\n+\t\t\tfprintf(info.fp_wr, \"%s%s\\n\", \"#  HMAC information for \"\n+\t\t\t\t\"DPDK Cryptodev \",\n+\t\t\t\tinfo.device_name);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\ttmp = strstr(info.vec[i], \"# Config Info for : \");\n+\t\tif (tmp != NULL) {\n+\n+\t\t\tfprintf(info.fp_wr, \"%s%s\\n\", \"# Config Info for DPDK Cryptodev : \",\n+\t\t\t\t\tinfo.device_name);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\ttmp = strstr(info.vec[i], \"# information for \");\n+\t\tif (tmp != NULL) {\n+\n+\t\t\tchar tmp_output[128] = {0};\n+\n+\t\t\tstrlcpy(tmp_output, info.vec[i], tmp - info.vec[i] + 1);\n+\n+\t\t\tfprintf(info.fp_wr, \"%s%s%s\\n\", tmp_output,\n+\t\t\t\t\t\"information for DPDK Cryptodev \",\n+\t\t\t\t\tinfo.device_name);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\ttmp = strstr(info.vec[i], \" test information for \");\n+\t\tif (tmp != NULL) {\n+\t\t\tchar tmp_output[128] = {0};\n+\n+\t\t\tstrlcpy(tmp_output, info.vec[i], tmp - info.vec[i] + 1);\n+\n+\t\t\tfprintf(info.fp_wr, \"%s%s%s\\n\", tmp_output,\n+\t\t\t\t\t\"test information for DPDK Cryptodev \",\n+\t\t\t\t\tinfo.device_name);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tif (i == info.nb_vec_lines - 1) {\n+\t\t\t/** update the time as current time, write to file */\n+\t\t\tfprintf(info.fp_wr, \"%s%s\\n\", \"# Generated on \",\n+\t\t\t\t\tasctime(tm_now));\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\t/* to this point, no field need to update,\n+\t\t *  only copy to rsp file\n+\t\t */\n+\t\tfprintf(info.fp_wr, \"%s\\n\", info.vec[i]);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+parse_file_type(const char *path)\n+{\n+\tconst char *tmp = path + strlen(path) - 3;\n+\n+\tif (strstr(tmp, REQ_FILE_PERFIX))\n+\t\tinfo.file_type = FIPS_TYPE_REQ;\n+\telse if (strstr(tmp, RSP_FILE_PERFIX))\n+\t\tinfo.file_type = FIPS_TYPE_RSP;\n+\telse if (strstr(path, FAX_FILE_PERFIX))\n+\t\tinfo.file_type = FIPS_TYPE_FAX;\n+\telse\n+\t\treturn -EINVAL;\n+\n+\treturn 0;\n+}\n+\n+int\n+fips_test_init(const char *req_file_path, const char *rsp_file_path,\n+\t\tconst char *device_name)\n+{\n+\tif (strcmp(req_file_path, rsp_file_path) == 0) {\n+\t\tRTE_LOG(ERR, USER1, \"File paths cannot be the same\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tfips_test_clear();\n+\n+\tinfo.algo = FIPS_TEST_ALGO_MAX;\n+\tif (parse_file_type(req_file_path) < 0) {\n+\t\tRTE_LOG(ERR, USER1, \"File %s type not supported\\n\",\n+\t\t\t\treq_file_path);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tinfo.fp_rd = fopen(req_file_path, \"r\");\n+\tif (!info.fp_rd) {\n+\t\tRTE_LOG(ERR, USER1, \"Cannot open file %s\\n\", req_file_path);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tinfo.fp_wr = fopen(rsp_file_path, \"w\");\n+\tif (!info.fp_wr) {\n+\t\tRTE_LOG(ERR, USER1, \"Cannot open file %s\\n\", rsp_file_path);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tinfo.one_line_text = calloc(1, MAX_LINE_CHAR);\n+\tif (!info.one_line_text) {\n+\t\tRTE_LOG(ERR, USER1, \"Insufficient memory\\n\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tstrlcpy(info.device_name, device_name, sizeof(info.device_name));\n+\n+\tif (fips_test_parse_header() < 0) {\n+\t\tRTE_LOG(ERR, USER1, \"Failed parsing header\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+void\n+fips_test_clear(void)\n+{\n+\tif (info.fp_rd)\n+\t\tfclose(info.fp_rd);\n+\tif (info.fp_wr)\n+\t\tfclose(info.fp_wr);\n+\tif (info.one_line_text)\n+\t\tfree(info.one_line_text);\n+\tif (info.nb_vec_lines) {\n+\t\tuint32_t i;\n+\n+\t\tfor (i = 0; i < info.nb_vec_lines; i++)\n+\t\t\tfree(info.vec[i]);\n+\t}\n+\n+\tmemset(&info, 0, sizeof(info));\n+}\n+\n+int\n+fips_test_parse_one_case(void)\n+{\n+\tuint32_t i, j = 0;\n+\tuint32_t is_interim = 0;\n+\tint ret;\n+\n+\tif (info.interim_callbacks) {\n+\t\tfor (i = 0; i < info.nb_vec_lines; i++) {\n+\t\t\tfor (j = 0; info.interim_callbacks[j].key != NULL; j++)\n+\t\t\t\tif (strstr(info.vec[i],\n+\t\t\t\t\tinfo.interim_callbacks[j].key)) {\n+\t\t\t\t\tis_interim = 1;\n+\n+\t\t\t\t\tret = info.interim_callbacks[j].cb(\n+\t\t\t\t\t\tinfo.interim_callbacks[j].key,\n+\t\t\t\t\t\tinfo.vec[i],\n+\t\t\t\t\t\tinfo.interim_callbacks[j].val);\n+\t\t\t\t\tif (ret < 0)\n+\t\t\t\t\t\treturn ret;\n+\t\t\t\t}\n+\t\t}\n+\t}\n+\n+\tif (is_interim) {\n+\t\tfor (i = 0; i < info.nb_vec_lines; i++)\n+\t\t\tfprintf(info.fp_wr, \"%s\\n\", info.vec[i]);\n+\t\tfprintf(info.fp_wr, \"\\n\");\n+\t\treturn 1;\n+\t}\n+\n+\tfor (i = 0; i < info.nb_vec_lines; i++) {\n+\t\tfor (j = 0; info.callbacks[j].key != NULL; j++)\n+\t\t\tif (strstr(info.vec[i], info.callbacks[j].key)) {\n+\t\t\t\tret = info.callbacks[j].cb(\n+\t\t\t\t\tinfo.callbacks[j].key,\n+\t\t\t\t\tinfo.vec[i], info.callbacks[j].val);\n+\t\t\t\tif (ret < 0)\n+\t\t\t\t\treturn ret;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+void\n+fips_test_write_one_case(void)\n+{\n+\tuint32_t i;\n+\n+\tfor (i = 0; i < info.nb_vec_lines; i++)\n+\t\tfprintf(info.fp_wr, \"%s\\n\", info.vec[i]);\n+}\n+\n+static int\n+parser_read_uint64_hex(uint64_t *value, const char *p)\n+{\n+\tchar *next;\n+\tuint64_t val;\n+\n+\tp = skip_white_spaces(p);\n+\n+\tval = strtoul(p, &next, 16);\n+\tif (p == next)\n+\t\treturn -EINVAL;\n+\n+\tp = skip_white_spaces(next);\n+\tif (*p != '\\0')\n+\t\treturn -EINVAL;\n+\n+\t*value = val;\n+\treturn 0;\n+}\n+\n+int\n+parser_read_uint8_hex(uint8_t *value, const char *p)\n+{\n+\tuint64_t val = 0;\n+\tint ret = parser_read_uint64_hex(&val, p);\n+\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n+\tif (val > UINT8_MAX)\n+\t\treturn -ERANGE;\n+\n+\t*value = val;\n+\treturn 0;\n+}\n+\n+int\n+parse_uint8_known_len_hex_str(const char *key, char *src, struct fips_val *val)\n+{\n+\tstruct fips_val tmp_val = {0};\n+\tuint32_t len = val->len;\n+\tint ret;\n+\n+\tif (len == 0) {\n+\t\tif (val->val != NULL) {\n+\t\t\trte_free(val->val);\n+\t\t\tval->val = NULL;\n+\t\t}\n+\n+\t\treturn 0;\n+\t}\n+\n+\tret = parse_uint8_hex_str(key, src, &tmp_val);\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n+\tif (tmp_val.len == val->len) {\n+\t\tval->val = tmp_val.val;\n+\t\treturn 0;\n+\t}\n+\n+\tif (tmp_val.len < val->len) {\n+\t\trte_free(tmp_val.val);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tval->val = rte_zmalloc(NULL, val->len, 0);\n+\tif (!val->val) {\n+\t\trte_free(tmp_val.val);\n+\t\tmemset(val, 0, sizeof(*val));\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tmemcpy(val->val, tmp_val.val, val->len);\n+\trte_free(tmp_val.val);\n+\n+\treturn 0;\n+}\n+\n+int\n+parse_uint8_hex_str(const char *key, char *src, struct fips_val *val)\n+{\n+\tuint32_t len, j;\n+\n+\tsrc += strlen(key);\n+\n+\tlen = strlen(src) / 2;\n+\n+\tif (val->val) {\n+\t\trte_free(val->val);\n+\t\tval->val = NULL;\n+\t}\n+\n+\tval->val = rte_zmalloc(NULL, len, 0);\n+\tif (!val->val)\n+\t\treturn -ENOMEM;\n+\n+\tfor (j = 0; j < len; j++) {\n+\t\tchar byte[3] = {src[j * 2], src[j * 2 + 1], '\\0'};\n+\n+\t\tif (parser_read_uint8_hex(&val->val[j], byte) < 0) {\n+\t\t\trte_free(val->val);\n+\t\t\tmemset(val, 0, sizeof(*val));\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\t}\n+\n+\tval->len = len;\n+\n+\treturn 0;\n+}\n+\n+int\n+parser_read_uint32_val(const char *key, char *src, struct fips_val *val)\n+{\n+\tchar *data = src + strlen(key);\n+\tsize_t data_len = strlen(data);\n+\tint ret;\n+\n+\tif (data[data_len - 1] == ']') {\n+\t\tchar *tmp_data = calloc(1, data_len + 1);\n+\n+\t\tif (tmp_data == NULL)\n+\t\t\treturn -ENOMEM;\n+\n+\t\tstrlcpy(tmp_data, data, data_len);\n+\n+\t\tret = parser_read_uint32(&val->len, tmp_data);\n+\n+\t\tfree(tmp_data);\n+\t} else\n+\t\tret = parser_read_uint32(&val->len, data);\n+\n+\treturn ret;\n+}\n+\n+int\n+parser_read_uint32_bit_val(const char *key, char *src, struct fips_val *val)\n+{\n+\tint ret;\n+\n+\tret = parser_read_uint32_val(key, src, val);\n+\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n+\tval->len /= 8;\n+\n+\treturn 0;\n+}\n+\n+int\n+writeback_hex_str(const char *key, char *dst, struct fips_val *val)\n+{\n+\tchar *str = dst;\n+\tuint32_t len;\n+\n+\tstr += strlen(key);\n+\n+\tfor (len = 0; len < val->len; len++)\n+\t\tsnprintf(str + len * 2, 255, \"%02x\", val->val[len]);\n+\n+\treturn 0;\n+}\n+\n+static int\n+parser_read_uint64(uint64_t *value, const char *p)\n+{\n+\tchar *next;\n+\tuint64_t val;\n+\n+\tp = skip_white_spaces(p);\n+\tif (!isdigit(*p))\n+\t\treturn -EINVAL;\n+\n+\tval = strtoul(p, &next, 10);\n+\tif (p == next)\n+\t\treturn -EINVAL;\n+\n+\tp = next;\n+\tswitch (*p) {\n+\tcase 'T':\n+\t\tval *= 1024ULL;\n+\t\t/* fall through */\n+\tcase 'G':\n+\t\tval *= 1024ULL;\n+\t\t/* fall through */\n+\tcase 'M':\n+\t\tval *= 1024ULL;\n+\t\t/* fall through */\n+\tcase 'k':\n+\tcase 'K':\n+\t\tval *= 1024ULL;\n+\t\tp++;\n+\t\tbreak;\n+\t}\n+\n+\tp = skip_white_spaces(p);\n+\tif (*p != '\\0')\n+\t\treturn -EINVAL;\n+\n+\t*value = val;\n+\treturn 0;\n+}\n+\n+int\n+parser_read_uint32(uint32_t *value, char *p)\n+{\n+\tuint64_t val = 0;\n+\tint ret = parser_read_uint64(&val, p);\n+\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n+\tif (val > UINT32_MAX)\n+\t\treturn -EINVAL;\n+\n+\t*value = val;\n+\treturn 0;\n+}\n+\n+void\n+parse_write_hex_str(struct fips_val *src)\n+{\n+\twriteback_hex_str(\"\", info.one_line_text, src);\n+\n+\tfprintf(info.fp_wr, \"%s\\n\", info.one_line_text);\n+}\n+\n+int\n+update_info_vec(uint32_t count)\n+{\n+\tconst struct fips_test_callback *cb;\n+\tuint32_t i, j;\n+\n+\tif (!info.writeback_callbacks)\n+\t\treturn -1;\n+\n+\tcb = &info.writeback_callbacks[0];\n+\n+\tsnprintf(info.vec[0], strlen(info.vec[0]) + 4, \"%s%u\", cb->key, count);\n+\n+\tfor (i = 1; i < info.nb_vec_lines; i++) {\n+\t\tfor (j = 1; info.writeback_callbacks[j].key != NULL; j++) {\n+\t\t\tcb = &info.writeback_callbacks[j];\n+\t\t\tif (strstr(info.vec[i], cb->key)) {\n+\t\t\t\tcb->cb(cb->key, info.vec[i], cb->val);\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\ndiff --git a/examples/fips_validation/fips_validation.h b/examples/fips_validation/fips_validation.h\nnew file mode 100644\nindex 0000000..dd3bc09\n--- /dev/null\n+++ b/examples/fips_validation/fips_validation.h\n@@ -0,0 +1,149 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018 Intel Corporation\n+ */\n+\n+#ifndef _FIPS_VALIDATION_H_\n+#define _FIPS_VALIDATION_H_\n+\n+#define FIPS_PARSE_ERR(fmt, args)\t\t\t\t\t\\\n+\tRTE_LOG(ERR, USER1, \"FIPS parse error\" ## fmt ## \"\\n\", ## args)\n+\n+#define ERR_MSG_SIZE\t\t128\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 MAX_STRING_SIZE\t\t64\n+\n+#define POSITIVE_TEST\t\t0\n+#define NEGATIVE_TEST\t\t-1\n+\n+#define REQ_FILE_PERFIX\t\t\"req\"\n+#define RSP_FILE_PERFIX\t\t\"rsp\"\n+#define FAX_FILE_PERFIX\t\t\"fax\"\n+\n+enum fips_test_algorithms {\n+\t\tFIPS_TEST_ALGO_MAX\n+};\n+\n+enum file_types {\n+\tFIPS_TYPE_REQ = 1,\n+\tFIPS_TYPE_FAX,\n+\tFIPS_TYPE_RSP\n+};\n+\n+enum fips_test_op {\n+\tFIPS_TEST_ENC_AUTH_GEN = 1,\n+\tFIPS_TEST_DEC_AUTH_VERIF,\n+};\n+\n+#define MAX_LINE_PER_VECTOR            16\n+\n+struct fips_val {\n+\tuint8_t *val;\n+\tuint32_t len;\n+};\n+\n+struct fips_test_vector {\n+\tunion {\n+\t\tstruct {\n+\t\t\tstruct fips_val key;\n+\t\t\tstruct fips_val digest;\n+\t\t\tstruct fips_val auth_aad;\n+\t\t\tstruct fips_val aad;\n+\t\t} cipher_auth;\n+\t\tstruct {\n+\t\t\tstruct fips_val key;\n+\t\t\tstruct fips_val digest;\n+\t\t\tstruct fips_val aad;\n+\t\t} aead;\n+\t};\n+\n+\tstruct fips_val pt;\n+\tstruct fips_val ct;\n+\tstruct fips_val iv;\n+\n+\tenum rte_crypto_op_status status;\n+};\n+\n+typedef int (*post_prcess_t)(struct fips_val *val);\n+\n+typedef int (*parse_callback_t)(const char *key, char *text,\n+\t\tstruct fips_val *val);\n+\n+struct fips_test_callback {\n+\tconst char *key;\n+\tparse_callback_t cb;\n+\tstruct fips_val *val;\n+};\n+\n+struct fips_test_interim_info {\n+\tFILE *fp_rd;\n+\tFILE *fp_wr;\n+\tenum file_types file_type;\n+\tenum fips_test_algorithms algo;\n+\tchar *one_line_text;\n+\tchar *vec[MAX_LINE_PER_VECTOR];\n+\tuint32_t nb_vec_lines;\n+\tchar device_name[MAX_STRING_SIZE];\n+\n+\tenum fips_test_op op;\n+\n+\tconst struct fips_test_callback *callbacks;\n+\tconst struct fips_test_callback *interim_callbacks;\n+\tconst struct fips_test_callback *writeback_callbacks;\n+\n+\tpost_prcess_t parse_writeback;\n+\tpost_prcess_t kat_check;\n+};\n+\n+extern struct fips_test_vector vec;\n+extern struct fips_test_interim_info info;\n+\n+int\n+fips_test_init(const char *req_file_path, const char *rsp_file_path,\n+\t\tconst char *device_name);\n+\n+void\n+fips_test_clear(void);\n+\n+int\n+fips_test_fetch_one_block(void);\n+\n+int\n+fips_test_parse_one_case(void);\n+\n+void\n+fips_test_write_one_case(void);\n+\n+int\n+parser_read_uint8_hex(uint8_t *value, const char *p);\n+\n+int\n+parse_uint8_hex_str(const char *key, char *src, struct fips_val *val);\n+\n+int\n+parse_uint8_known_len_hex_str(const char *key, char *src, struct fips_val *val);\n+\n+int\n+parser_read_uint32_val(const char *key, char *src, struct fips_val *val);\n+\n+int\n+parser_read_uint32_bit_val(const char *key, char *src, struct fips_val *val);\n+\n+int\n+parser_read_uint32(uint32_t *value, char *p);\n+\n+int\n+parser_read_uint32_val(const char *key, char *src, struct fips_val *val);\n+\n+int\n+writeback_hex_str(const char *key, char *dst, struct fips_val *val);\n+\n+void\n+parse_write_hex_str(struct fips_val *src);\n+\n+int\n+update_info_vec(uint32_t count);\n+\n+#endif\ndiff --git a/examples/fips_validation/main.c b/examples/fips_validation/main.c\nnew file mode 100644\nindex 0000000..7083462\n--- /dev/null\n+++ b/examples/fips_validation/main.c\n@@ -0,0 +1,388 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2018 Intel Corporation\n+ */\n+\n+#include <sys/stat.h>\n+#include <getopt.h>\n+#include <dirent.h>\n+\n+#include <rte_cryptodev.h>\n+#include <rte_cryptodev_pmd.h>\n+#include <rte_mempool.h>\n+#include <rte_mbuf.h>\n+#include <rte_string_fns.h>\n+\n+#include \"fips_validation.h\"\n+\n+#define REQ_FILE_PATH_KEYWORD\t\"req-file\"\n+#define RSP_FILE_PATH_KEYWORD\t\"rsp-file\"\n+#define FOLDER_KEYWORD\t\t\"path-is-folder\"\n+#define CRYPTODEV_KEYWORD\t\"cryptodev\"\n+#define CRYPTODEV_ID_KEYWORD\t\"cryptodev-id\"\n+\n+struct fips_test_vector vec;\n+struct fips_test_interim_info info;\n+\n+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+\tstruct rte_mempool *mpool;\n+\tstruct rte_mempool *op_pool;\n+\tstruct rte_mbuf *mbuf;\n+\tstruct rte_crypto_op *op;\n+\tstruct rte_cryptodev_sym_session *sess;\n+} env;\n+\n+static int\n+cryptodev_fips_validate_app_int(void)\n+{\n+\tstruct rte_cryptodev_config conf = {rte_socket_id(), 1};\n+\tstruct rte_cryptodev_qp_conf qp_conf = {128};\n+\tint ret;\n+\n+\tret = rte_cryptodev_configure(env.dev_id, &conf);\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+\tif (!env.mpool)\n+\t\treturn ret;\n+\n+\tret = rte_cryptodev_queue_pair_setup(env.dev_id, 0, &qp_conf,\n+\t\t\trte_socket_id(), env.mpool);\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n+\tret = -ENOMEM;\n+\n+\tenv.op_pool = rte_crypto_op_pool_create(\n+\t\t\t\"FIPS_OP_POOL\",\n+\t\t\tRTE_CRYPTO_OP_TYPE_SYMMETRIC,\n+\t\t\t1, 0,\n+\t\t\t16,\n+\t\t\trte_socket_id());\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+\n+\treturn 0;\n+\n+error_exit:\n+\trte_mempool_free(env.mpool);\n+\tif (env.op_pool)\n+\t\trte_mempool_free(env.op_pool);\n+\n+\treturn ret;\n+}\n+\n+static void\n+cryptodev_fips_validate_app_uninit(void)\n+{\n+\trte_pktmbuf_free(env.mbuf);\n+\trte_crypto_op_free(env.op);\n+\trte_cryptodev_sym_session_clear(env.dev_id, env.sess);\n+\trte_cryptodev_sym_session_free(env.sess);\n+\trte_mempool_free(env.mpool);\n+\trte_mempool_free(env.op_pool);\n+}\n+\n+static int\n+fips_test_one_file(void);\n+\n+static int\n+parse_cryptodev_arg(char *arg)\n+{\n+\tint id = rte_cryptodev_get_dev_id(arg);\n+\n+\tif (id < 0) {\n+\t\tRTE_LOG(ERR, USER1, \"Error %i: invalid cryptodev name %s\\n\",\n+\t\t\t\tid, arg);\n+\t\treturn id;\n+\t}\n+\n+\tenv.dev_id = (uint32_t)id;\n+\n+\treturn 0;\n+}\n+\n+static int\n+parse_cryptodev_id_arg(char *arg)\n+{\n+\tuint32_t cryptodev_id;\n+\n+\tif (parser_read_uint32(&cryptodev_id, arg) < 0) {\n+\t\tRTE_LOG(ERR, USER1, \"Error %i: invalid cryptodev id %s\\n\",\n+\t\t\t\t-EINVAL, arg);\n+\t\treturn -1;\n+\t}\n+\n+\n+\tif (!rte_cryptodev_pmd_is_valid_dev(cryptodev_id)) {\n+\t\tRTE_LOG(ERR, USER1, \"Error %i: invalid cryptodev id %s\\n\",\n+\t\t\t\tcryptodev_id, arg);\n+\t\treturn -1;\n+\t}\n+\n+\tenv.dev_id = (uint32_t)cryptodev_id;\n+\n+\treturn 0;\n+}\n+\n+static void\n+cryptodev_fips_validate_usage(const char *prgname)\n+{\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: CRYPTODEV-NAME\\n\"\n+\t\t\"  --%s: CRYPTODEV-ID-NAME\\n\",\n+\t\tprgname, REQ_FILE_PATH_KEYWORD, RSP_FILE_PATH_KEYWORD,\n+\t\tFOLDER_KEYWORD, CRYPTODEV_KEYWORD, CRYPTODEV_ID_KEYWORD);\n+}\n+\n+static int\n+cryptodev_fips_validate_parse_args(int argc, char **argv)\n+{\n+\tint opt, ret;\n+\tchar *prgname = argv[0];\n+\tchar **argvopt;\n+\tint option_index;\n+\tstruct option lgopts[] = {\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{CRYPTODEV_KEYWORD, required_argument, 0, 0},\n+\t\t\t{CRYPTODEV_ID_KEYWORD, required_argument, 0, 0},\n+\t\t\t{NULL, 0, 0, 0}\n+\t};\n+\n+\targvopt = argv;\n+\n+\twhile ((opt = getopt_long(argc, argvopt, \"s:\",\n+\t\t\t\t  lgopts, &option_index)) != EOF) {\n+\n+\t\tswitch (opt) {\n+\t\tcase 0:\n+\t\t\tif (strcmp(lgopts[option_index].name,\n+\t\t\t\t\tREQ_FILE_PATH_KEYWORD) == 0)\n+\t\t\t\tenv.req_path = optarg;\n+\t\t\telse if (strcmp(lgopts[option_index].name,\n+\t\t\t\t\tRSP_FILE_PATH_KEYWORD) == 0)\n+\t\t\t\tenv.rsp_path = optarg;\n+\t\t\telse if (strcmp(lgopts[option_index].name,\n+\t\t\t\t\tFOLDER_KEYWORD) == 0)\n+\t\t\t\tenv.is_path_folder = 1;\n+\t\t\telse if (strcmp(lgopts[option_index].name,\n+\t\t\t\t\tCRYPTODEV_KEYWORD) == 0) {\n+\t\t\t\tret = parse_cryptodev_arg(optarg);\n+\t\t\t\tif (ret < 0) {\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\tCRYPTODEV_ID_KEYWORD) == 0) {\n+\t\t\t\tret = parse_cryptodev_id_arg(optarg);\n+\t\t\t\tif (ret < 0) {\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 {\n+\t\t\t\tcryptodev_fips_validate_usage(prgname);\n+\t\t\t\treturn -EINVAL;\n+\t\t\t}\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\treturn -1;\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+\t\tcryptodev_fips_validate_usage(prgname);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int\n+main(int argc, char *argv[])\n+{\n+\tint ret;\n+\n+\tret = rte_eal_init(argc, argv);\n+\tif (ret < 0) {\n+\t\tRTE_LOG(ERR, USER1, \"Error %i: Failed init\\n\", ret);\n+\t\treturn -1;\n+\t}\n+\n+\targc -= ret;\n+\targv += ret;\n+\n+\tret = cryptodev_fips_validate_parse_args(argc, argv);\n+\tif (ret < 0)\n+\t\trte_exit(EXIT_FAILURE, \"Failed to parse arguments!\\n\");\n+\n+\tret = cryptodev_fips_validate_app_int();\n+\tif (ret < 0) {\n+\t\tRTE_LOG(ERR, USER1, \"Error %i: Failed init\\n\", ret);\n+\t\treturn -1;\n+\t}\n+\n+\tif (!env.is_path_folder) {\n+\t\tprintf(\"Processing file %s... \", env.req_path);\n+\n+\t\tret = fips_test_init(env.req_path, env.rsp_path,\n+\t\t\trte_cryptodev_name_get(env.dev_id));\n+\t\tif (ret < 0) {\n+\t\t\tRTE_LOG(ERR, USER1, \"Error %i: Failed test %s\\n\",\n+\t\t\t\t\tret, env.req_path);\n+\t\t\tgoto exit;\n+\t\t}\n+\n+\n+\t\tret = fips_test_one_file();\n+\t\tif (ret < 0) {\n+\t\t\tRTE_LOG(ERR, USER1, \"Error %i: Failed test %s\\n\",\n+\t\t\t\t\tret, env.req_path);\n+\t\t\tgoto exit;\n+\t\t}\n+\n+\t\tprintf(\"Done\\n\");\n+\n+\t} else {\n+\t\tstruct dirent *dir;\n+\t\tDIR *d_req, *d_rsp;\n+\t\tchar req_path[1024];\n+\t\tchar rsp_path[1024];\n+\n+\t\td_req = opendir(env.req_path);\n+\t\tif (!d_req) {\n+\t\t\tRTE_LOG(ERR, USER1, \"Error %i: Path %s not exist\\n\",\n+\t\t\t\t\t-EINVAL, env.req_path);\n+\t\t\tgoto exit;\n+\t\t}\n+\n+\t\td_rsp = opendir(env.rsp_path);\n+\t\tif (!d_rsp) {\n+\t\t\tret = mkdir(env.rsp_path, 0700);\n+\t\t\tif (ret == 0)\n+\t\t\t\td_rsp = opendir(env.rsp_path);\n+\t\t\telse {\n+\t\t\t\tRTE_LOG(ERR, USER1, \"Error %i: Invalid %s\\n\",\n+\t\t\t\t\t\t-EINVAL, env.rsp_path);\n+\t\t\t\tgoto exit;\n+\t\t\t}\n+\t\t}\n+\t\tclosedir(d_rsp);\n+\n+\t\twhile ((dir = readdir(d_req)) != NULL) {\n+\t\t\tif (strstr(dir->d_name, \"req\") == NULL)\n+\t\t\t\tcontinue;\n+\n+\t\t\tsnprintf(req_path, 1023, \"%s/%s\", env.req_path,\n+\t\t\t\t\tdir->d_name);\n+\t\t\tsnprintf(rsp_path, 1023, \"%s/%s\", env.rsp_path,\n+\t\t\t\t\tdir->d_name);\n+\t\t\tstrlcpy(strstr(rsp_path, \"req\"), \"rsp\", 4);\n+\n+\t\t\tprintf(\"Processing file %s... \", req_path);\n+\n+\t\t\tret = fips_test_init(req_path, rsp_path,\n+\t\t\trte_cryptodev_name_get(env.dev_id));\n+\t\t\tif (ret < 0) {\n+\t\t\t\tRTE_LOG(ERR, USER1, \"Error %i: Failed test %s\\n\",\n+\t\t\t\t\t\tret, req_path);\n+\t\t\t\tbreak;\n+\t\t\t}\n+\n+\t\t\tret = fips_test_one_file();\n+\t\t\tif (ret < 0) {\n+\t\t\t\tRTE_LOG(ERR, USER1, \"Error %i: Failed test %s\\n\",\n+\t\t\t\t\t\tret, req_path);\n+\t\t\t\tbreak;\n+\t\t\t}\n+\n+\t\t\tprintf(\"Done\\n\");\n+\t\t}\n+\n+\t\tclosedir(d_req);\n+\t}\n+\n+\n+exit:\n+\tfips_test_clear();\n+\tcryptodev_fips_validate_app_uninit();\n+\n+\treturn ret;\n+\n+}\n+\n+static void\n+print_test_block(void)\n+{\n+\tuint32_t i;\n+\n+\tfor (i = 0; i < info.nb_vec_lines; i++)\n+\t\tprintf(\"%s\\n\", info.vec[i]);\n+\n+\tprintf(\"\\n\");\n+}\n+\n+static int\n+fips_test_one_file(void)\n+{\n+\tint fetch_ret = 0, ret;\n+\n+\twhile (fetch_ret == 0) {\n+\t\tfetch_ret = fips_test_fetch_one_block();\n+\t\tif (fetch_ret < 0) {\n+\t\t\tRTE_LOG(ERR, USER1, \"Error %i: Fetch block\\n\",\n+\t\t\t\t\tfetch_ret);\n+\t\t\tret = fetch_ret;\n+\t\t\tgoto error_one_case;\n+\t\t}\n+\n+\t\tif (info.nb_vec_lines == 0) {\n+\t\t\tif (fetch_ret == -EOF)\n+\t\t\t\tbreak;\n+\n+\t\t\tfprintf(info.fp_wr, \"\\n\");\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tret = fips_test_parse_one_case();\n+\t\tswitch (ret) {\n+\t\tcase 0:\n+\t\t\tif (ret == 0)\n+\t\t\t\tbreak;\n+\t\t\tRTE_LOG(ERR, USER1, \"Error %i: test block\\n\",\n+\t\t\t\t\tret);\n+\t\t\tgoto error_one_case;\n+\t\tcase 1:\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tRTE_LOG(ERR, USER1, \"Error %i: Parse block\\n\",\n+\t\t\t\t\tret);\n+\t\t\tgoto error_one_case;\n+\t\t}\n+\n+\t\tcontinue;\n+error_one_case:\n+\t\tprint_test_block();\n+\t}\n+\n+\tfips_test_clear();\n+\n+}\ndiff --git a/examples/fips_validation/meson.build b/examples/fips_validation/meson.build\nnew file mode 100644\nindex 0000000..cceed4f\n--- /dev/null\n+++ b/examples/fips_validation/meson.build\n@@ -0,0 +1,14 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 2018 Intel Corporation\n+\n+# meson file, for building this example as part of a main DPDK build.\n+#\n+# To build this example as a standalone application with an already-installed\n+# DPDK instance, use 'make'\n+\n+deps += ['cryptodev']\n+allow_experimental_apis = true\n+sources = files(\n+\t'fips_validation.c',\n+\t'main.c'\n+)\n",
    "prefixes": [
        "v7",
        "1/8"
    ]
}