get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 61430,
    "url": "http://patches.dpdk.org/api/patches/61430/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/e5ae9e4a65517ef7c3df3de6a56c3039a9808433.1571322983.git.vladimir.medvedkin@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": "<e5ae9e4a65517ef7c3df3de6a56c3039a9808433.1571322983.git.vladimir.medvedkin@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/e5ae9e4a65517ef7c3df3de6a56c3039a9808433.1571322983.git.vladimir.medvedkin@intel.com",
    "date": "2019-10-17T15:48:01",
    "name": "[v6,4/6] test/ipsec: add ipsec SAD autotests",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "e4958a6fe6f6e4bd97dfd1f5cdfd6cd2ee3b3ed1",
    "submitter": {
        "id": 1216,
        "url": "http://patches.dpdk.org/api/people/1216/?format=api",
        "name": "Vladimir Medvedkin",
        "email": "vladimir.medvedkin@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/e5ae9e4a65517ef7c3df3de6a56c3039a9808433.1571322983.git.vladimir.medvedkin@intel.com/mbox/",
    "series": [
        {
            "id": 6917,
            "url": "http://patches.dpdk.org/api/series/6917/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=6917",
            "date": "2019-10-17T15:47:57",
            "name": "ipsec: add inbound SAD",
            "version": 6,
            "mbox": "http://patches.dpdk.org/series/6917/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/61430/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/61430/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 379691EA1E;\n\tThu, 17 Oct 2019 17:48:26 +0200 (CEST)",
            "from mga12.intel.com (mga12.intel.com [192.55.52.136])\n\tby dpdk.org (Postfix) with ESMTP id 3578E1E9DA\n\tfor <dev@dpdk.org>; Thu, 17 Oct 2019 17:48:15 +0200 (CEST)",
            "from orsmga005.jf.intel.com ([10.7.209.41])\n\tby fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t17 Oct 2019 08:48:14 -0700",
            "from silpixa00400072.ir.intel.com ([10.237.222.213])\n\tby orsmga005.jf.intel.com with ESMTP; 17 Oct 2019 08:48:12 -0700"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.67,308,1566889200\"; d=\"scan'208\";a=\"371174149\"",
        "From": "Vladimir Medvedkin <vladimir.medvedkin@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "konstantin.ananyev@intel.com, bernard.iremonger@intel.com,\n\takhil.goyal@nxp.com",
        "Date": "Thu, 17 Oct 2019 16:48:01 +0100",
        "Message-Id": "<e5ae9e4a65517ef7c3df3de6a56c3039a9808433.1571322983.git.vladimir.medvedkin@intel.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": [
            "<cover.1571322982.git.vladimir.medvedkin@intel.com>",
            "<cover.1571322982.git.vladimir.medvedkin@intel.com>"
        ],
        "References": [
            "<cover.1571322982.git.vladimir.medvedkin@intel.com>",
            "<cover.1570725871.git.vladimir.medvedkin@intel.com>\n\t<cover.1571322982.git.vladimir.medvedkin@intel.com>"
        ],
        "Subject": "[dpdk-dev] [PATCH v6 4/6] test/ipsec: add ipsec SAD autotests",
        "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": "add unittests for ipsec SAD library\n\nSigned-off-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>\nAcked-by: Akhil Goyal <akhil.goyal@nxp.com>\nAcked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>\nTested-by: Konstantin Ananyev <konstantin.ananyev@intel.com>\n---\n app/test/Makefile         |   1 +\n app/test/autotest_data.py |   6 +\n app/test/meson.build      |   1 +\n app/test/test_ipsec_sad.c | 887 ++++++++++++++++++++++++++++++++++++++++++++++\n 4 files changed, 895 insertions(+)\n create mode 100644 app/test/test_ipsec_sad.c",
    "diff": "diff --git a/app/test/Makefile b/app/test/Makefile\nindex df7f77f..e2832fb 100644\n--- a/app/test/Makefile\n+++ b/app/test/Makefile\n@@ -224,6 +224,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_BPF) += test_bpf.c\n SRCS-$(CONFIG_RTE_LIBRTE_RCU) += test_rcu_qsbr.c test_rcu_qsbr_perf.c\n \n SRCS-$(CONFIG_RTE_LIBRTE_IPSEC) += test_ipsec.c\n+SRCS-$(CONFIG_RTE_LIBRTE_IPSEC) += test_ipsec_sad.c\n ifeq ($(CONFIG_RTE_LIBRTE_IPSEC),y)\n LDLIBS += -lrte_ipsec\n endif\ndiff --git a/app/test/autotest_data.py b/app/test/autotest_data.py\nindex 7405149..a4f2882 100644\n--- a/app/test/autotest_data.py\n+++ b/app/test/autotest_data.py\n@@ -518,6 +518,12 @@\n         \"Func\":    default_autotest,\n         \"Report\":  None,\n     },\n+    {\n+        \"Name\":    \"IPsec_SAD\",\n+        \"Command\": \"ipsec_sad_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n     #\n     #Please always keep all dump tests at the end and together!\n     #\ndiff --git a/app/test/meson.build b/app/test/meson.build\nindex 2c23c63..94f6b49 100644\n--- a/app/test/meson.build\n+++ b/app/test/meson.build\n@@ -58,6 +58,7 @@ test_sources = files('commands.c',\n \t'test_hash_readwrite_lf.c',\n \t'test_interrupts.c',\n \t'test_ipsec.c',\n+\t'test_ipsec_sad.c',\n \t'test_kni.c',\n \t'test_kvargs.c',\n \t'test_latencystats.c',\ndiff --git a/app/test/test_ipsec_sad.c b/app/test/test_ipsec_sad.c\nnew file mode 100644\nindex 0000000..4911646\n--- /dev/null\n+++ b/app/test/test_ipsec_sad.c\n@@ -0,0 +1,887 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2010-2014 Intel Corporation\n+ */\n+\n+#include <stdio.h>\n+#include <stdint.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+#include <rte_ipsec_sad.h>\n+#include <rte_memory.h>\n+\n+#include \"test.h\"\n+#include \"test_xmmt_ops.h\"\n+\n+typedef int32_t (*rte_ipsec_sad_test)(void);\n+\n+static int32_t test_create_invalid(void);\n+static int32_t test_find_existing(void);\n+static int32_t test_multiple_create(void);\n+static int32_t test_add_invalid(void);\n+static int32_t test_delete_invalid(void);\n+static int32_t test_lookup_invalid(void);\n+static int32_t test_lookup_basic(void);\n+static int32_t test_lookup_adv(void);\n+static int32_t test_lookup_order(void);\n+\n+#define MAX_SA\t100000\n+#define PASS 0\n+#define SPI\t0xdead\t/* spi to install */\n+#define DIP\t0xbeef\t/* dip to install */\n+#define SIP\t0xf00d\t/* sip to install */\n+#define BAD\t0xbad\t/* some random value not installed into the table */\n+\n+/*\n+ * Check that rte_ipsec_sad_create fails gracefully for incorrect user input\n+ * arguments\n+ */\n+int32_t\n+test_create_invalid(void)\n+{\n+\tstruct rte_ipsec_sad *sad = NULL;\n+\tstruct rte_ipsec_sad_conf config;\n+\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_ONLY] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP_SIP] = MAX_SA;\n+\tconfig.socket_id = SOCKET_ID_ANY;\n+\tconfig.flags = 0;\n+\n+\t/* name == NULL */\n+\tsad = rte_ipsec_sad_create(NULL, &config);\n+\tRTE_TEST_ASSERT(sad == NULL,\n+\t\t\"Call succeeded with invalid parameters\\n\");\n+\n+\t/* max_sa for every type = 0 */\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_ONLY] = 0;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP] = 0;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP_SIP] = 0;\n+\tsad = rte_ipsec_sad_create(__func__, &config);\n+\tRTE_TEST_ASSERT(sad == NULL,\n+\t\t\"Call succeeded with invalid parameters\\n\");\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_ONLY] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP_SIP] = MAX_SA;\n+\n+\t/* socket_id < -1 is invalid */\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_ONLY] = MAX_SA;\n+\tconfig.socket_id = -2;\n+\tsad = rte_ipsec_sad_create(__func__, &config);\n+\tRTE_TEST_ASSERT(sad == NULL,\n+\t\t\"Call succeeded with invalid parameters\\n\");\n+\tconfig.socket_id = SOCKET_ID_ANY;\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+/*\n+ * Test rte_ipsec_sad_find_existing()\n+ * Create SAD and try to find it by it's name\n+ */\n+int32_t\n+test_find_existing(void)\n+{\n+\tconst char *name1 = \"sad_one\";\n+\tconst char *name2 = \"sad_two\";\n+\tstruct rte_ipsec_sad *one, *two, *tmp;\n+\tstruct rte_ipsec_sad_conf config;\n+\n+\tconfig.socket_id = SOCKET_ID_ANY;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_ONLY] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP] = 0;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP_SIP] = 0;\n+\tone = rte_ipsec_sad_create(name1, &config);\n+\tRTE_TEST_ASSERT_NOT_NULL(one, \"Failed to create SAD\\n\");\n+\ttwo = rte_ipsec_sad_create(name2, &config);\n+\tRTE_TEST_ASSERT_NOT_NULL(two, \"Failed to create SAD\\n\");\n+\n+\t/* Find non existing */\n+\ttmp = rte_ipsec_sad_find_existing(\"sad_three\");\n+\tRTE_TEST_ASSERT(tmp == NULL,\n+\t\t\"rte_ipsec_sad_find_existing returns invalid SAD\\n\");\n+\n+\ttmp = rte_ipsec_sad_find_existing(name1);\n+\tRTE_TEST_ASSERT(tmp == one,\n+\t\t\"rte_ipsec_sad_find_existing returns invalid SAD\\n\");\n+\n+\ttmp = rte_ipsec_sad_find_existing(name2);\n+\tRTE_TEST_ASSERT(tmp == two,\n+\t\t\"rte_ipsec_sad_find_existing returns invalid SAD\\n\");\n+\n+\trte_ipsec_sad_destroy(one);\n+\trte_ipsec_sad_destroy(two);\n+\treturn TEST_SUCCESS;\n+}\n+\n+/*\n+ * Create ipsec sad then delete it 10 times\n+ * Use a slightly different max_sa each time\n+ */\n+int32_t\n+test_multiple_create(void)\n+{\n+\tint i;\n+\tstruct rte_ipsec_sad *sad = NULL;\n+\tstruct rte_ipsec_sad_conf config;\n+\n+\tconfig.socket_id = SOCKET_ID_ANY;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP_SIP] = MAX_SA;\n+\n+\tfor (i = 0; i < 10; i++) {\n+\t\tconfig.max_sa[RTE_IPSEC_SAD_SPI_ONLY] = MAX_SA - i;\n+\t\tsad = rte_ipsec_sad_create(__func__, &config);\n+\t\tRTE_TEST_ASSERT_NOT_NULL(sad, \"Failed to create SAD\\n\");\n+\t\trte_ipsec_sad_destroy(sad);\n+\t}\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int32_t\n+__test_add_invalid(int ipv6, union rte_ipsec_sad_key *tuple)\n+{\n+\tint status;\n+\tstruct rte_ipsec_sad *sad = NULL;\n+\tstruct rte_ipsec_sad_conf config;\n+\tuint64_t tmp;\n+\tvoid *sa = &tmp;\n+\n+\t/* sad == NULL*/\n+\tstatus = rte_ipsec_sad_add(NULL, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_DIP_SIP, sa);\n+\tRTE_TEST_ASSERT(status < 0,\n+\t\t\"Call succeeded with invalid parameters\\n\");\n+\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_ONLY] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP_SIP] = MAX_SA;\n+\tconfig.socket_id = SOCKET_ID_ANY;\n+\tconfig.flags = 0;\n+\tif (ipv6)\n+\t\tconfig.flags = RTE_IPSEC_SAD_FLAG_IPV6;\n+\n+\tsad = rte_ipsec_sad_create(__func__, &config);\n+\tRTE_TEST_ASSERT_NOT_NULL(sad, \"Failed to create SAD\\n\");\n+\n+\t/* key == NULL*/\n+\tstatus = rte_ipsec_sad_add(sad, NULL, RTE_IPSEC_SAD_SPI_DIP_SIP, sa);\n+\tRTE_TEST_ASSERT(status < 0,\n+\t\t\"Call succeeded with invalid parameters\\n\");\n+\n+\t/* len is incorrect*/\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\tRTE_IPSEC_SAD_SPI_DIP_SIP + 1, sa);\n+\tRTE_TEST_ASSERT(status < 0,\n+\t\t\"Call succeeded with invalid parameters\\n\");\n+\n+\t/* sa == NULL*/\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\tRTE_IPSEC_SAD_SPI_DIP_SIP, NULL);\n+\tRTE_TEST_ASSERT(status < 0,\n+\t\t\"Call succeeded with invalid parameters\\n\");\n+\n+\t/* sa is not aligned*/\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\tRTE_IPSEC_SAD_SPI_DIP_SIP, (void *)((uint8_t *)sa + 1));\n+\tRTE_TEST_ASSERT(status < 0,\n+\t\t\"Call succeeded with invalid parameters\\n\");\n+\n+\trte_ipsec_sad_destroy(sad);\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+/*\n+ * Check that rte_ipsec_sad_add fails gracefully\n+ * for incorrect user input arguments\n+ */\n+int32_t\n+test_add_invalid(void)\n+{\n+\tint status;\n+\tstruct rte_ipsec_sadv4_key tuple_v4 = {10, 20, 30};\n+\tstruct rte_ipsec_sadv6_key tuple_v6 = {10, {20, }, {30, } };\n+\n+\tstatus = __test_add_invalid(0, (union rte_ipsec_sad_key *)&tuple_v4);\n+\tif (status != TEST_SUCCESS)\n+\t\treturn status;\n+\n+\tstatus = __test_add_invalid(1, (union rte_ipsec_sad_key *)&tuple_v6);\n+\n+\treturn status;\n+\n+}\n+\n+static int32_t\n+__test_delete_invalid(int ipv6, union rte_ipsec_sad_key *tuple)\n+{\n+\tint status;\n+\tstruct rte_ipsec_sad *sad = NULL;\n+\tstruct rte_ipsec_sad_conf config;\n+\n+\t/* sad == NULL*/\n+\tstatus = rte_ipsec_sad_del(NULL, tuple, RTE_IPSEC_SAD_SPI_DIP_SIP);\n+\tRTE_TEST_ASSERT(status < 0,\n+\t\t\"Call succeeded with invalid parameters\\n\");\n+\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_ONLY] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP_SIP] = MAX_SA;\n+\tconfig.socket_id = SOCKET_ID_ANY;\n+\tconfig.flags = 0;\n+\tif (ipv6)\n+\t\tconfig.flags = RTE_IPSEC_SAD_FLAG_IPV6;\n+\n+\tsad = rte_ipsec_sad_create(__func__, &config);\n+\tRTE_TEST_ASSERT_NOT_NULL(sad, \"Failed to create SAD\\n\");\n+\n+\t/* key == NULL*/\n+\tstatus = rte_ipsec_sad_del(sad, NULL, RTE_IPSEC_SAD_SPI_DIP_SIP);\n+\tRTE_TEST_ASSERT(status < 0,\n+\t\t\"Call succeeded with invalid parameters\\n\");\n+\n+\t/* len is incorrect */\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_DIP_SIP + 1);\n+\tRTE_TEST_ASSERT(status < 0,\n+\t\t\"Call succeeded with invalid parameters\\n\");\n+\n+\trte_ipsec_sad_destroy(sad);\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+/*\n+ * Check that rte_ipsec_sad_delete fails gracefully for incorrect user input\n+ * arguments\n+ */\n+int32_t\n+test_delete_invalid(void)\n+{\n+\tint status;\n+\tstruct rte_ipsec_sadv4_key tuple_v4 = {SPI, DIP, SIP};\n+\tstruct rte_ipsec_sadv6_key tuple_v6 = {SPI, {0xbe, 0xef, },\n+\t\t\t{0xf0, 0x0d, } };\n+\n+\tstatus = __test_delete_invalid(0, (union rte_ipsec_sad_key *)&tuple_v4);\n+\tif (status != TEST_SUCCESS)\n+\t\treturn status;\n+\n+\tstatus = __test_delete_invalid(1, (union rte_ipsec_sad_key *)&tuple_v6);\n+\n+\treturn status;\n+}\n+\n+static int32_t\n+__test_lookup_invalid(int ipv6, union rte_ipsec_sad_key *tuple)\n+{\n+\tint status;\n+\tstruct rte_ipsec_sad *sad = NULL;\n+\tstruct rte_ipsec_sad_conf config;\n+\tconst union rte_ipsec_sad_key *key_arr[] = {tuple};\n+\tvoid *sa[1];\n+\n+\tstatus = rte_ipsec_sad_lookup(NULL, key_arr, sa, 1);\n+\tRTE_TEST_ASSERT(status < 0,\n+\t\t\"Call succeeded with invalid parameters\\n\");\n+\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_ONLY] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP_SIP] = MAX_SA;\n+\tconfig.socket_id = SOCKET_ID_ANY;\n+\tconfig.flags = 0;\n+\tif (ipv6)\n+\t\tconfig.flags = RTE_IPSEC_SAD_FLAG_IPV6;\n+\n+\tsad = rte_ipsec_sad_create(__func__, &config);\n+\tRTE_TEST_ASSERT_NOT_NULL(sad, \"Failed to create SAD\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, NULL, sa, 1);\n+\tRTE_TEST_ASSERT(status < 0,\n+\t\t\"Call succeeded with invalid parameters\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, NULL, 1);\n+\tRTE_TEST_ASSERT(status < 0,\n+\t\t\"Call succeeded with invalid parameters\\n\");\n+\n+\trte_ipsec_sad_destroy(sad);\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+/*\n+ * Check that rte_ipsec_sad_lookup fails gracefully for incorrect user input\n+ * arguments\n+ */\n+int32_t\n+test_lookup_invalid(void)\n+{\n+\tint status;\n+\tstruct rte_ipsec_sadv4_key tuple_v4 = {10, 20, 30};\n+\tstruct rte_ipsec_sadv6_key tuple_v6 = {10, {20, }, {30, } };\n+\n+\tstatus = __test_lookup_invalid(0,\n+\t\t\t(union rte_ipsec_sad_key *)&tuple_v4);\n+\tif (status != TEST_SUCCESS)\n+\t\treturn status;\n+\n+\tstatus = __test_lookup_invalid(1,\n+\t\t\t(union rte_ipsec_sad_key *)&tuple_v6);\n+\n+\treturn status;\n+}\n+\n+static int32_t\n+__test_lookup_basic(int ipv6, union rte_ipsec_sad_key *tuple,\n+\tunion rte_ipsec_sad_key *tuple_1)\n+{\n+\tint status;\n+\tstruct rte_ipsec_sad *sad = NULL;\n+\tstruct rte_ipsec_sad_conf config;\n+\tconst union rte_ipsec_sad_key *key_arr[] = {tuple};\n+\n+\tuint64_t tmp;\n+\tvoid *sa[1];\n+\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_ONLY] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP_SIP] = MAX_SA;\n+\tconfig.socket_id = SOCKET_ID_ANY;\n+\tconfig.flags = 0;\n+\tif (ipv6)\n+\t\tconfig.flags = RTE_IPSEC_SAD_FLAG_IPV6;\n+\n+\tsad = rte_ipsec_sad_create(__func__, &config);\n+\tRTE_TEST_ASSERT_NOT_NULL(sad, \"Failed to create SAD\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 1);\n+\tRTE_TEST_ASSERT((status == 0) && (sa[0] == NULL),\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\tsa[0] = &tmp;\n+\tstatus = rte_ipsec_sad_add(sad, tuple, RTE_IPSEC_SAD_SPI_ONLY, sa[0]);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 1);\n+\tRTE_TEST_ASSERT((status == 1) && (sa[0] == &tmp),\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\tkey_arr[0] = tuple_1;\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 1);\n+\tRTE_TEST_ASSERT((status == 1) && (sa[0] == &tmp),\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tkey_arr[0] = tuple;\n+\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_ONLY);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to delete a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 1);\n+\tRTE_TEST_ASSERT((status == 0) && (sa[0] == NULL),\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\trte_ipsec_sad_destroy(sad);\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+/*\n+ * Lookup missing key, then add it as RTE_IPSEC_SAD_SPI_ONLY, lookup it again,\n+ * lookup different key with the same SPI, then delete it and repeat lookup\n+ */\n+int32_t\n+test_lookup_basic(void)\n+{\n+\tint status;\n+\tstruct rte_ipsec_sadv4_key tuple_v4 = {SPI, DIP, SIP};\n+\tstruct rte_ipsec_sadv4_key tuple_v4_1 = {SPI, BAD, BAD};\n+\tstruct rte_ipsec_sadv6_key tuple_v6 = {SPI, {0xbe, 0xef, },\n+\t\t\t{0xf0, 0x0d, } };\n+\tstruct rte_ipsec_sadv6_key tuple_v6_1 = {SPI, {0x0b, 0xad, },\n+\t\t\t{0x0b, 0xad, } };\n+\n+\tstatus = __test_lookup_basic(0, (union rte_ipsec_sad_key *)&tuple_v4,\n+\t\t\t(union rte_ipsec_sad_key *)&tuple_v4_1);\n+\tif (status != TEST_SUCCESS)\n+\t\treturn status;\n+\n+\tstatus = __test_lookup_basic(1, (union rte_ipsec_sad_key *)&tuple_v6,\n+\t\t\t(union rte_ipsec_sad_key *)&tuple_v6_1);\n+\n+\treturn status;\n+}\n+\n+static int32_t\n+__test_lookup_adv(int ipv6, union rte_ipsec_sad_key *tuple,\n+\tconst union rte_ipsec_sad_key **key_arr)\n+{\n+\tint status;\n+\tstruct rte_ipsec_sad *sad = NULL;\n+\tstruct rte_ipsec_sad_conf config;\n+\tuint64_t tmp1, tmp2, tmp3;\n+\tvoid *install_sa;\n+\tvoid *sa[4];\n+\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_ONLY] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP_SIP] = MAX_SA;\n+\tconfig.socket_id = SOCKET_ID_ANY;\n+\tconfig.flags = 0;\n+\tif (ipv6)\n+\t\tconfig.flags = RTE_IPSEC_SAD_FLAG_IPV6;\n+\tsad = rte_ipsec_sad_create(__func__, &config);\n+\tRTE_TEST_ASSERT_NOT_NULL(sad, \"Failed to create SAD\\n\");\n+\n+\t/* lookup with empty table */\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 4);\n+\tRTE_TEST_ASSERT(status == 0, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[3] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\t/* lookup with one RTE_IPSEC_SAD_SPI_ONLY rule */\n+\tinstall_sa = &tmp1;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_ONLY, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 4);\n+\tRTE_TEST_ASSERT(status == 3, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == &tmp1,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == &tmp1,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == &tmp1,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[3] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_ONLY);\n+\tRTE_TEST_ASSERT(status == 0, \"Failde to delete a rule\\n\");\n+\n+\t/* lookup with one RTE_IPSEC_SAD_SPI_DIP rule */\n+\tinstall_sa = &tmp2;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_DIP, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"failed to add a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 4);\n+\tRTE_TEST_ASSERT(status == 2, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == &tmp2,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == &tmp2,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[3] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_DIP);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to delete a rule\\n\");\n+\n+\t/* lookup with one RTE_IPSEC_SAD_SPI_DIP_SIP rule */\n+\tinstall_sa = &tmp3;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_DIP_SIP, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 4);\n+\tRTE_TEST_ASSERT(status == 1, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == &tmp3,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[3] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_DIP_SIP);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to delete a rule\\n\");\n+\n+\t/* lookup with two RTE_IPSEC_SAD_ONLY and RTE_IPSEC_SAD_DIP rules */\n+\tinstall_sa = &tmp1;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_ONLY, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\tinstall_sa = &tmp2;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_DIP, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 4);\n+\tRTE_TEST_ASSERT(status == 3, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == &tmp2,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == &tmp2,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == &tmp1,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[3] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_ONLY);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to delete a rule\\n\");\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_DIP);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to delete a rule\\n\");\n+\n+\t/* lookup with two RTE_IPSEC_SAD_ONLY and RTE_IPSEC_SAD_DIP_SIP rules */\n+\tinstall_sa = &tmp1;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_ONLY, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\tinstall_sa = &tmp3;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_DIP_SIP, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 4);\n+\tRTE_TEST_ASSERT(status == 3, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == &tmp3,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == &tmp1,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == &tmp1,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[3] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_ONLY);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to delete a rule\\n\");\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_DIP_SIP);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to delete a rule\\n\");\n+\n+\t/* lookup with two RTE_IPSEC_SAD_DIP and RTE_IPSEC_SAD_DIP_SIP rules */\n+\tinstall_sa = &tmp2;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_DIP, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\tinstall_sa = &tmp3;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_DIP_SIP, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 4);\n+\tRTE_TEST_ASSERT(status == 2, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == &tmp3,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == &tmp2,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[3] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_DIP);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to delete a rule\\n\");\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_DIP_SIP);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to delete a rule\\n\");\n+\n+\t/*\n+\t * lookup with three RTE_IPSEC_SAD_DIP, RTE_IPSEC_SAD_DIP and\n+\t * RTE_IPSEC_SAD_DIP_SIP rules\n+\t */\n+\tinstall_sa = &tmp1;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_ONLY, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\tinstall_sa = &tmp2;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_DIP, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\tinstall_sa = &tmp3;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_DIP_SIP, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 4);\n+\tRTE_TEST_ASSERT(status == 3, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == &tmp3,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == &tmp2,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == &tmp1,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[3] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_ONLY);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to delete a rule\\n\");\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_DIP);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to delete a rule\\n\");\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_DIP_SIP);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to delete a rule\\n\");\n+\n+\trte_ipsec_sad_destroy(sad);\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+/*\n+ * Lookup different keys in a table with:\n+ *  - RTE_IPSEC_SAD_SPI_ONLY\n+ *  - RTE_IPSEC_SAD_SPI_DIP\n+ *  - RTE_IPSEC_SAD_SPI_SIP\n+ *  - RTE_IPSEC_SAD_SPI_ONLY/RTE_IPSEC_SAD_SPI_DIP\n+ *  - RTE_IPSEC_SAD_SPI_ONLY/RTE_IPSEC_SAD_SPI_DIP_SIP\n+ *  - RTE_IPSEC_SAD_SPI_DIP/RTE_IPSEC_SAD_SPI_DIP_SIP\n+ *  - RTE_IPSEC_SAD_SPI_ONLY/RTE_IPSEC_SAD_SPI_DIP/RTE_IPSEC_SAD_SPI_DIP_SIP\n+ * length of rule installed.\n+ */\n+int32_t\n+test_lookup_adv(void)\n+{\n+\tint status;\n+\t/* key to install*/\n+\tstruct rte_ipsec_sadv4_key tuple_v4 = {SPI, DIP, SIP};\n+\tstruct rte_ipsec_sadv4_key tuple_v4_1 = {SPI, DIP, BAD};\n+\tstruct rte_ipsec_sadv4_key tuple_v4_2 = {SPI, BAD, SIP};\n+\tstruct rte_ipsec_sadv4_key tuple_v4_3 = {BAD, DIP, SIP};\n+\n+\t/* key to install*/\n+\tstruct rte_ipsec_sadv6_key tuple_v6 = {SPI, {0xbe, 0xef, },\n+\t\t\t{0xf0, 0x0d, } };\n+\tstruct rte_ipsec_sadv6_key tuple_v6_1 = {SPI, {0xbe, 0xef, },\n+\t\t\t{0x0b, 0xad, } };\n+\tstruct rte_ipsec_sadv6_key tuple_v6_2 = {SPI, {0x0b, 0xad, },\n+\t\t\t{0xf0, 0x0d, } };\n+\tstruct rte_ipsec_sadv6_key tuple_v6_3 = {BAD, {0xbe, 0xef, },\n+\t\t\t{0xf0, 0x0d, } };\n+\n+\tconst union rte_ipsec_sad_key *key_arr[] = {\n+\t\t\t\t(union rte_ipsec_sad_key *)&tuple_v4,\n+\t\t\t\t(union rte_ipsec_sad_key *)&tuple_v4_1,\n+\t\t\t\t(union rte_ipsec_sad_key *)&tuple_v4_2,\n+\t\t\t\t(union rte_ipsec_sad_key *)&tuple_v4_3\n+\t\t\t\t\t};\n+\n+\tstatus = __test_lookup_adv(0, (union rte_ipsec_sad_key *)&tuple_v4,\n+\t\t\tkey_arr);\n+\tif (status != TEST_SUCCESS)\n+\t\treturn status;\n+\tkey_arr[0] = (union rte_ipsec_sad_key *)&tuple_v6;\n+\tkey_arr[1] = (union rte_ipsec_sad_key *)&tuple_v6_1;\n+\tkey_arr[2] = (union rte_ipsec_sad_key *)&tuple_v6_2;\n+\tkey_arr[3] = (union rte_ipsec_sad_key *)&tuple_v6_3;\n+\tstatus = __test_lookup_adv(1, (union rte_ipsec_sad_key *)&tuple_v6,\n+\t\t\tkey_arr);\n+\n+\treturn status;\n+}\n+\n+\n+static int32_t\n+__test_lookup_order(int ipv6, union rte_ipsec_sad_key *tuple,\n+\tunion rte_ipsec_sad_key *tuple_1, union rte_ipsec_sad_key *tuple_2)\n+{\n+\tint status;\n+\tstruct rte_ipsec_sad *sad = NULL;\n+\tstruct rte_ipsec_sad_conf config;\n+\tconst union rte_ipsec_sad_key *key_arr[] = {tuple, tuple_1, tuple_2,};\n+\tuint64_t tmp1, tmp2, tmp3;\n+\tvoid *install_sa;\n+\tvoid *sa[3];\n+\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_ONLY] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP] = MAX_SA;\n+\tconfig.max_sa[RTE_IPSEC_SAD_SPI_DIP_SIP] = MAX_SA;\n+\tconfig.socket_id = SOCKET_ID_ANY;\n+\tconfig.flags = 0;\n+\tif (ipv6)\n+\t\tconfig.flags = RTE_IPSEC_SAD_FLAG_IPV6;\n+\tsad = rte_ipsec_sad_create(__func__, &config);\n+\tRTE_TEST_ASSERT_NOT_NULL(sad, \"Failed to create SAD\\n\");\n+\n+\t/* install RTE_IPSEC_SAD_SPI_ONLY */\n+\tinstall_sa = &tmp1;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_ONLY, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 3);\n+\tRTE_TEST_ASSERT(status == 3, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == &tmp1,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == &tmp1,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == &tmp1,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\t/* add RTE_IPSEC_SAD_SPI_DIP */\n+\tinstall_sa = &tmp2;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_DIP, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 3);\n+\tRTE_TEST_ASSERT(status == 3, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == &tmp2,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == &tmp2,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == &tmp1,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\t/* add RTE_IPSEC_SAD_SPI_DIP_SIP */\n+\tinstall_sa = &tmp3;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_DIP_SIP, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 3);\n+\tRTE_TEST_ASSERT(status == 3, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == &tmp3,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == &tmp2,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == &tmp1,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\t/* delete RTE_IPSEC_SAD_SPI_ONLY */\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_ONLY);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to delete a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 3);\n+\tRTE_TEST_ASSERT(status == 2, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == &tmp3,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == &tmp2,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\t/* delete RTE_IPSEC_SAD_SPI_DIP */\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_DIP);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to delete a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 3);\n+\tRTE_TEST_ASSERT(status == 1, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == &tmp3,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\t/* delete RTE_IPSEC_SAD_SPI_DIP_SIP */\n+\tstatus = rte_ipsec_sad_del(sad, tuple, RTE_IPSEC_SAD_SPI_DIP_SIP);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to delete a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 3);\n+\tRTE_TEST_ASSERT(status == 0, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\t/* add RTE_IPSEC_SAD_SPI_DIP_SIP */\n+\tinstall_sa = &tmp3;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_DIP_SIP, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 3);\n+\tRTE_TEST_ASSERT(status == 1, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == &tmp3,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\t/* add RTE_IPSEC_SAD_SPI_DIP */\n+\tinstall_sa = &tmp2;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_DIP, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 3);\n+\tRTE_TEST_ASSERT(status == 2, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == &tmp3,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == &tmp2,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == NULL,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\t/* add RTE_IPSEC_SAD_SPI_ONLY */\n+\tinstall_sa = &tmp1;\n+\tstatus = rte_ipsec_sad_add(sad, tuple,\n+\t\t\tRTE_IPSEC_SAD_SPI_ONLY, install_sa);\n+\tRTE_TEST_ASSERT(status == 0, \"Failed to add a rule\\n\");\n+\n+\tstatus = rte_ipsec_sad_lookup(sad, key_arr, sa, 3);\n+\tRTE_TEST_ASSERT(status == 3, \"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[0] == &tmp3,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[1] == &tmp2,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\tRTE_TEST_ASSERT(sa[2] == &tmp1,\n+\t\t\"Lookup returns an unexpected result\\n\");\n+\n+\trte_ipsec_sad_destroy(sad);\n+\treturn TEST_SUCCESS;\n+}\n+\n+/*\n+ * Check an order of add and delete\n+ */\n+int32_t\n+test_lookup_order(void)\n+{\n+\tint status;\n+\t/* key to install*/\n+\tstruct rte_ipsec_sadv4_key tuple_v4 = {SPI, DIP, SIP};\n+\tstruct rte_ipsec_sadv4_key tuple_v4_1 = {SPI, DIP, BAD};\n+\tstruct rte_ipsec_sadv4_key tuple_v4_2 = {SPI, BAD, SIP};\n+\t/* key to install*/\n+\tstruct rte_ipsec_sadv6_key tuple_v6 = {SPI, {0xbe, 0xef, },\n+\t\t\t{0xf0, 0x0d, } };\n+\tstruct rte_ipsec_sadv6_key tuple_v6_1 = {SPI, {0xbe, 0xef, },\n+\t\t\t{0x0b, 0xad, } };\n+\tstruct rte_ipsec_sadv6_key tuple_v6_2 = {SPI, {0x0b, 0xad, },\n+\t\t\t{0xf0, 0x0d, } };\n+\n+\tstatus = __test_lookup_order(0, (union rte_ipsec_sad_key *)&tuple_v4,\n+\t\t\t(union rte_ipsec_sad_key *)&tuple_v4_1,\n+\t\t\t(union rte_ipsec_sad_key *)&tuple_v4_2);\n+\tif (status != TEST_SUCCESS)\n+\t\treturn status;\n+\n+\tstatus = __test_lookup_order(1, (union rte_ipsec_sad_key *)&tuple_v6,\n+\t\t\t(union rte_ipsec_sad_key *)&tuple_v6_1,\n+\t\t\t(union rte_ipsec_sad_key *)&tuple_v6_2);\n+\treturn status;\n+}\n+\n+static struct unit_test_suite ipsec_sad_tests = {\n+\t.suite_name = \"ipsec sad autotest\",\n+\t.setup = NULL,\n+\t.teardown = NULL,\n+\t.unit_test_cases = {\n+\t\tTEST_CASE(test_create_invalid),\n+\t\tTEST_CASE(test_find_existing),\n+\t\tTEST_CASE(test_multiple_create),\n+\t\tTEST_CASE(test_add_invalid),\n+\t\tTEST_CASE(test_delete_invalid),\n+\t\tTEST_CASE(test_lookup_invalid),\n+\t\tTEST_CASE(test_lookup_basic),\n+\t\tTEST_CASE(test_lookup_adv),\n+\t\tTEST_CASE(test_lookup_order),\n+\t\tTEST_CASES_END()\n+\t}\n+};\n+\n+static int\n+test_ipsec_sad(void)\n+{\n+\treturn unit_test_suite_runner(&ipsec_sad_tests);\n+}\n+\n+REGISTER_TEST_COMMAND(ipsec_sad_autotest, test_ipsec_sad);\n",
    "prefixes": [
        "v6",
        "4/6"
    ]
}