get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 5284,
    "url": "http://patches.dpdk.org/api/patches/5284/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1433760090-17110-9-git-send-email-konstantin.ananyev@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": "<1433760090-17110-9-git-send-email-konstantin.ananyev@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1433760090-17110-9-git-send-email-konstantin.ananyev@intel.com",
    "date": "2015-06-08T10:41:30",
    "name": "[dpdk-dev,PATCHv2,8/8] acl: add new test-cases into UT",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "487df8bf911e74f9bb4a1636dbeff77193b439f9",
    "submitter": {
        "id": 33,
        "url": "http://patches.dpdk.org/api/people/33/?format=api",
        "name": "Ananyev, Konstantin",
        "email": "konstantin.ananyev@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1433760090-17110-9-git-send-email-konstantin.ananyev@intel.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/5284/comments/",
    "check": "pending",
    "checks": "http://patches.dpdk.org/api/patches/5284/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 [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 5B1C15ABA;\n\tMon,  8 Jun 2015 12:44:01 +0200 (CEST)",
            "from mga14.intel.com (mga14.intel.com [192.55.52.115])\n\tby dpdk.org (Postfix) with ESMTP id 9EC885688\n\tfor <dev@dpdk.org>; Mon,  8 Jun 2015 12:43:54 +0200 (CEST)",
            "from orsmga002.jf.intel.com ([10.7.209.21])\n\tby fmsmga103.fm.intel.com with ESMTP; 08 Jun 2015 03:41:39 -0700",
            "from irvmail001.ir.intel.com ([163.33.26.43])\n\tby orsmga002.jf.intel.com with ESMTP; 08 Jun 2015 03:41:38 -0700",
            "from sivswdev02.ir.intel.com (sivswdev02.ir.intel.com\n\t[10.237.217.46])\n\tby irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id\n\tt58Afb3t029646; Mon, 8 Jun 2015 11:41:37 +0100",
            "from sivswdev02.ir.intel.com (localhost [127.0.0.1])\n\tby sivswdev02.ir.intel.com with ESMTP id t58AfbHN017603;\n\tMon, 8 Jun 2015 11:41:37 +0100",
            "(from kananye1@localhost)\n\tby sivswdev02.ir.intel.com with  id t58Afbdo017599;\n\tMon, 8 Jun 2015 11:41:37 +0100"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.13,573,1427785200\"; d=\"scan'208\";a=\"742911388\"",
        "From": "Konstantin Ananyev <konstantin.ananyev@intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Mon,  8 Jun 2015 11:41:30 +0100",
        "Message-Id": "<1433760090-17110-9-git-send-email-konstantin.ananyev@intel.com>",
        "X-Mailer": "git-send-email 1.7.4.1",
        "In-Reply-To": "<1433760090-17110-1-git-send-email-konstantin.ananyev@intel.com>",
        "References": "<1433373024-5558-2-git-send-email-konstantin.ananyev@intel.com>\n\t<1433760090-17110-1-git-send-email-konstantin.ananyev@intel.com>",
        "Subject": "[dpdk-dev] [PATCHv2 8/8] acl: add new test-cases into UT",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/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 several new test cases for ACL to cover different build configurations.\n\nSigned-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>\n---\n app/test/test_acl.c | 431 +++++++++++++++++++++++++++++++++++++++++++++++++++-\n 1 file changed, 423 insertions(+), 8 deletions(-)",
    "diff": "diff --git a/app/test/test_acl.c b/app/test/test_acl.c\nindex 6a032f9..b4a107d 100644\n--- a/app/test/test_acl.c\n+++ b/app/test/test_acl.c\n@@ -47,6 +47,8 @@\n \n #define LEN RTE_ACL_MAX_CATEGORIES\n \n+RTE_ACL_RULE_DEF(acl_ipv4vlan_rule, RTE_ACL_IPV4VLAN_NUM_FIELDS);\n+\n struct rte_acl_param acl_param = {\n \t.name = \"acl_ctx\",\n \t.socket_id = SOCKET_ID_ANY,\n@@ -62,6 +64,15 @@ struct rte_acl_ipv4vlan_rule acl_rule = {\n \t\t.dst_port_high = UINT16_MAX,\n };\n \n+const uint32_t ipv4_7tuple_layout[RTE_ACL_IPV4VLAN_NUM] = {\n+\toffsetof(struct ipv4_7tuple, proto),\n+\toffsetof(struct ipv4_7tuple, vlan),\n+\toffsetof(struct ipv4_7tuple, ip_src),\n+\toffsetof(struct ipv4_7tuple, ip_dst),\n+\toffsetof(struct ipv4_7tuple, port_src),\n+};\n+\n+\n /* byteswap to cpu or network order */\n static void\n bswap_test_data(struct ipv4_7tuple *data, int len, int to_be)\n@@ -195,13 +206,6 @@ test_classify_buid(struct rte_acl_ctx *acx,\n \tconst struct rte_acl_ipv4vlan_rule *rules, uint32_t num)\n {\n \tint ret;\n-\tconst uint32_t layout[RTE_ACL_IPV4VLAN_NUM] = {\n-\t\t\toffsetof(struct ipv4_7tuple, proto),\n-\t\t\toffsetof(struct ipv4_7tuple, vlan),\n-\t\t\toffsetof(struct ipv4_7tuple, ip_src),\n-\t\t\toffsetof(struct ipv4_7tuple, ip_dst),\n-\t\t\toffsetof(struct ipv4_7tuple, port_src),\n-\t};\n \n \t/* add rules to the context */\n \tret = rte_acl_ipv4vlan_add_rules(acx, rules, num);\n@@ -212,7 +216,8 @@ test_classify_buid(struct rte_acl_ctx *acx,\n \t}\n \n \t/* try building the context */\n-\tret = rte_acl_ipv4vlan_build(acx, layout, RTE_ACL_MAX_CATEGORIES);\n+\tret = rte_acl_ipv4vlan_build(acx, ipv4_7tuple_layout,\n+\t\tRTE_ACL_MAX_CATEGORIES);\n \tif (ret != 0) {\n \t\tprintf(\"Line %i: Building ACL context failed!\\n\", __LINE__);\n \t\treturn ret;\n@@ -412,6 +417,414 @@ test_build_ports_range(void)\n \treturn ret;\n }\n \n+static void\n+convert_rule(const struct rte_acl_ipv4vlan_rule *ri,\n+\tstruct acl_ipv4vlan_rule *ro)\n+{\n+\tro->data = ri->data;\n+\n+\tro->field[RTE_ACL_IPV4VLAN_PROTO_FIELD].value.u8 = ri->proto;\n+\tro->field[RTE_ACL_IPV4VLAN_VLAN1_FIELD].value.u16 = ri->vlan;\n+\tro->field[RTE_ACL_IPV4VLAN_VLAN2_FIELD].value.u16 = ri->domain;\n+\tro->field[RTE_ACL_IPV4VLAN_SRC_FIELD].value.u32 = ri->src_addr;\n+\tro->field[RTE_ACL_IPV4VLAN_DST_FIELD].value.u32 = ri->dst_addr;\n+\tro->field[RTE_ACL_IPV4VLAN_SRCP_FIELD].value.u16 = ri->src_port_low;\n+\tro->field[RTE_ACL_IPV4VLAN_DSTP_FIELD].value.u16 = ri->dst_port_low;\n+\n+\tro->field[RTE_ACL_IPV4VLAN_PROTO_FIELD].mask_range.u8 = ri->proto_mask;\n+\tro->field[RTE_ACL_IPV4VLAN_VLAN1_FIELD].mask_range.u16 = ri->vlan_mask;\n+\tro->field[RTE_ACL_IPV4VLAN_VLAN2_FIELD].mask_range.u16 =\n+\t\tri->domain_mask;\n+\tro->field[RTE_ACL_IPV4VLAN_SRC_FIELD].mask_range.u32 =\n+\t\tri->src_mask_len;\n+\tro->field[RTE_ACL_IPV4VLAN_DST_FIELD].mask_range.u32 = ri->dst_mask_len;\n+\tro->field[RTE_ACL_IPV4VLAN_SRCP_FIELD].mask_range.u16 =\n+\t\tri->src_port_high;\n+\tro->field[RTE_ACL_IPV4VLAN_DSTP_FIELD].mask_range.u16 =\n+\t\tri->dst_port_high;\n+}\n+\n+/*\n+ * Convert IPV4 source and destination from RTE_ACL_FIELD_TYPE_MASK to\n+ * RTE_ACL_FIELD_TYPE_BITMASK.\n+ */\n+static void\n+convert_rule_1(const struct rte_acl_ipv4vlan_rule *ri,\n+\tstruct acl_ipv4vlan_rule *ro)\n+{\n+\tuint32_t v;\n+\n+\tconvert_rule(ri, ro);\n+\tv = ro->field[RTE_ACL_IPV4VLAN_SRC_FIELD].mask_range.u32;\n+\tro->field[RTE_ACL_IPV4VLAN_SRC_FIELD].mask_range.u32 =\n+\t\tRTE_ACL_MASKLEN_TO_BITMASK(v, sizeof(v));\n+\tv = ro->field[RTE_ACL_IPV4VLAN_DST_FIELD].mask_range.u32;\n+\tro->field[RTE_ACL_IPV4VLAN_DST_FIELD].mask_range.u32 =\n+\t\tRTE_ACL_MASKLEN_TO_BITMASK(v, sizeof(v));\n+}\n+\n+/*\n+ * Convert IPV4 source and destination from RTE_ACL_FIELD_TYPE_MASK to\n+ * RTE_ACL_FIELD_TYPE_RANGE.\n+ */\n+static void\n+convert_rule_2(const struct rte_acl_ipv4vlan_rule *ri,\n+\tstruct acl_ipv4vlan_rule *ro)\n+{\n+\tuint32_t hi, lo, mask;\n+\n+\tconvert_rule(ri, ro);\n+\n+\tmask = ro->field[RTE_ACL_IPV4VLAN_SRC_FIELD].mask_range.u32;\n+\tmask = RTE_ACL_MASKLEN_TO_BITMASK(mask, sizeof(mask));\n+\tlo = ro->field[RTE_ACL_IPV4VLAN_SRC_FIELD].value.u32 & mask;\n+\thi = lo + ~mask;\n+\tro->field[RTE_ACL_IPV4VLAN_SRC_FIELD].value.u32 = lo;\n+\tro->field[RTE_ACL_IPV4VLAN_SRC_FIELD].mask_range.u32 = hi;\n+\n+\tmask = ro->field[RTE_ACL_IPV4VLAN_DST_FIELD].mask_range.u32;\n+\tmask = RTE_ACL_MASKLEN_TO_BITMASK(mask, sizeof(mask));\n+\tlo = ro->field[RTE_ACL_IPV4VLAN_DST_FIELD].value.u32 & mask;\n+\thi = lo + ~mask;\n+\tro->field[RTE_ACL_IPV4VLAN_DST_FIELD].value.u32 = lo;\n+\tro->field[RTE_ACL_IPV4VLAN_DST_FIELD].mask_range.u32 = hi;\n+}\n+\n+/*\n+ * Convert rte_acl_ipv4vlan_rule: swap VLAN and PORTS rule fields.\n+ */\n+static void\n+convert_rule_3(const struct rte_acl_ipv4vlan_rule *ri,\n+\tstruct acl_ipv4vlan_rule *ro)\n+{\n+\tstruct rte_acl_field t1, t2;\n+\n+\tconvert_rule(ri, ro);\n+\n+\tt1 = ro->field[RTE_ACL_IPV4VLAN_VLAN1_FIELD];\n+\tt2 = ro->field[RTE_ACL_IPV4VLAN_VLAN2_FIELD];\n+\n+\tro->field[RTE_ACL_IPV4VLAN_VLAN1_FIELD] =\n+\t\tro->field[RTE_ACL_IPV4VLAN_SRCP_FIELD];\n+\tro->field[RTE_ACL_IPV4VLAN_VLAN2_FIELD] =\n+\t\tro->field[RTE_ACL_IPV4VLAN_DSTP_FIELD];\n+\n+\tro->field[RTE_ACL_IPV4VLAN_SRCP_FIELD] = t1;\n+\tro->field[RTE_ACL_IPV4VLAN_DSTP_FIELD] = t2;\n+}\n+\n+/*\n+ * Convert rte_acl_ipv4vlan_rule: swap SRC and DST IPv4 address rules.\n+ */\n+static void\n+convert_rule_4(const struct rte_acl_ipv4vlan_rule *ri,\n+\tstruct acl_ipv4vlan_rule *ro)\n+{\n+\tstruct rte_acl_field t;\n+\n+\tconvert_rule(ri, ro);\n+\n+\tt = ro->field[RTE_ACL_IPV4VLAN_SRC_FIELD];\n+\tro->field[RTE_ACL_IPV4VLAN_SRC_FIELD] =\n+\t\tro->field[RTE_ACL_IPV4VLAN_DST_FIELD];\n+\n+\tro->field[RTE_ACL_IPV4VLAN_DST_FIELD] = t;\n+}\n+\n+static void\n+ipv4vlan_config(struct rte_acl_config *cfg,\n+\tconst uint32_t layout[RTE_ACL_IPV4VLAN_NUM],\n+\tuint32_t num_categories)\n+{\n+\tstatic const struct rte_acl_field_def\n+\t\tipv4_defs[RTE_ACL_IPV4VLAN_NUM_FIELDS] = {\n+\t\t{\n+\t\t\t.type = RTE_ACL_FIELD_TYPE_BITMASK,\n+\t\t\t.size = sizeof(uint8_t),\n+\t\t\t.field_index = RTE_ACL_IPV4VLAN_PROTO_FIELD,\n+\t\t\t.input_index = RTE_ACL_IPV4VLAN_PROTO,\n+\t\t},\n+\t\t{\n+\t\t\t.type = RTE_ACL_FIELD_TYPE_BITMASK,\n+\t\t\t.size = sizeof(uint16_t),\n+\t\t\t.field_index = RTE_ACL_IPV4VLAN_VLAN1_FIELD,\n+\t\t\t.input_index = RTE_ACL_IPV4VLAN_VLAN,\n+\t\t},\n+\t\t{\n+\t\t\t.type = RTE_ACL_FIELD_TYPE_BITMASK,\n+\t\t\t.size = sizeof(uint16_t),\n+\t\t\t.field_index = RTE_ACL_IPV4VLAN_VLAN2_FIELD,\n+\t\t\t.input_index = RTE_ACL_IPV4VLAN_VLAN,\n+\t\t},\n+\t\t{\n+\t\t\t.type = RTE_ACL_FIELD_TYPE_MASK,\n+\t\t\t.size = sizeof(uint32_t),\n+\t\t\t.field_index = RTE_ACL_IPV4VLAN_SRC_FIELD,\n+\t\t\t.input_index = RTE_ACL_IPV4VLAN_SRC,\n+\t\t},\n+\t\t{\n+\t\t\t.type = RTE_ACL_FIELD_TYPE_MASK,\n+\t\t\t.size = sizeof(uint32_t),\n+\t\t\t.field_index = RTE_ACL_IPV4VLAN_DST_FIELD,\n+\t\t\t.input_index = RTE_ACL_IPV4VLAN_DST,\n+\t\t},\n+\t\t{\n+\t\t\t.type = RTE_ACL_FIELD_TYPE_RANGE,\n+\t\t\t.size = sizeof(uint16_t),\n+\t\t\t.field_index = RTE_ACL_IPV4VLAN_SRCP_FIELD,\n+\t\t\t.input_index = RTE_ACL_IPV4VLAN_PORTS,\n+\t\t},\n+\t\t{\n+\t\t\t.type = RTE_ACL_FIELD_TYPE_RANGE,\n+\t\t\t.size = sizeof(uint16_t),\n+\t\t\t.field_index = RTE_ACL_IPV4VLAN_DSTP_FIELD,\n+\t\t\t.input_index = RTE_ACL_IPV4VLAN_PORTS,\n+\t\t},\n+\t};\n+\n+\tmemcpy(&cfg->defs, ipv4_defs, sizeof(ipv4_defs));\n+\tcfg->num_fields = RTE_DIM(ipv4_defs);\n+\n+\tcfg->defs[RTE_ACL_IPV4VLAN_PROTO_FIELD].offset =\n+\t\tlayout[RTE_ACL_IPV4VLAN_PROTO];\n+\tcfg->defs[RTE_ACL_IPV4VLAN_VLAN1_FIELD].offset =\n+\t\tlayout[RTE_ACL_IPV4VLAN_VLAN];\n+\tcfg->defs[RTE_ACL_IPV4VLAN_VLAN2_FIELD].offset =\n+\t\tlayout[RTE_ACL_IPV4VLAN_VLAN] +\n+\t\tcfg->defs[RTE_ACL_IPV4VLAN_VLAN1_FIELD].size;\n+\tcfg->defs[RTE_ACL_IPV4VLAN_SRC_FIELD].offset =\n+\t\tlayout[RTE_ACL_IPV4VLAN_SRC];\n+\tcfg->defs[RTE_ACL_IPV4VLAN_DST_FIELD].offset =\n+\t\tlayout[RTE_ACL_IPV4VLAN_DST];\n+\tcfg->defs[RTE_ACL_IPV4VLAN_SRCP_FIELD].offset =\n+\t\tlayout[RTE_ACL_IPV4VLAN_PORTS];\n+\tcfg->defs[RTE_ACL_IPV4VLAN_DSTP_FIELD].offset =\n+\t\tlayout[RTE_ACL_IPV4VLAN_PORTS] +\n+\t\tcfg->defs[RTE_ACL_IPV4VLAN_SRCP_FIELD].size;\n+\n+\tcfg->num_categories = num_categories;\n+}\n+\n+static int\n+convert_rules(struct rte_acl_ctx *acx,\n+\tvoid (*convert)(const struct rte_acl_ipv4vlan_rule *,\n+\tstruct acl_ipv4vlan_rule *),\n+\tconst struct rte_acl_ipv4vlan_rule *rules, uint32_t num)\n+{\n+\tint32_t rc;\n+\tuint32_t i;\n+\tstruct acl_ipv4vlan_rule r;\n+\n+\tfor (i = 0; i != num; i++) {\n+\t\tconvert(rules + i, &r);\n+\t\trc = rte_acl_add_rules(acx, (struct rte_acl_rule *)&r, 1);\n+\t\tif (rc != 0) {\n+\t\t\tprintf(\"Line %i: Adding rule %u to ACL context \"\n+\t\t\t\t\"failed with error code: %d\\n\",\n+\t\t\t__LINE__, i, rc);\n+\t\t\treturn rc;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+convert_config(struct rte_acl_config *cfg)\n+{\n+\tipv4vlan_config(cfg, ipv4_7tuple_layout, RTE_ACL_MAX_CATEGORIES);\n+}\n+\n+/*\n+ * Convert rte_acl_ipv4vlan_rule to use RTE_ACL_FIELD_TYPE_BITMASK.\n+ */\n+static void\n+convert_config_1(struct rte_acl_config *cfg)\n+{\n+\tipv4vlan_config(cfg, ipv4_7tuple_layout, RTE_ACL_MAX_CATEGORIES);\n+\tcfg->defs[RTE_ACL_IPV4VLAN_SRC_FIELD].type = RTE_ACL_FIELD_TYPE_BITMASK;\n+\tcfg->defs[RTE_ACL_IPV4VLAN_DST_FIELD].type = RTE_ACL_FIELD_TYPE_BITMASK;\n+}\n+\n+/*\n+ * Convert rte_acl_ipv4vlan_rule to use RTE_ACL_FIELD_TYPE_RANGE.\n+ */\n+static void\n+convert_config_2(struct rte_acl_config *cfg)\n+{\n+\tipv4vlan_config(cfg, ipv4_7tuple_layout, RTE_ACL_MAX_CATEGORIES);\n+\tcfg->defs[RTE_ACL_IPV4VLAN_SRC_FIELD].type = RTE_ACL_FIELD_TYPE_RANGE;\n+\tcfg->defs[RTE_ACL_IPV4VLAN_DST_FIELD].type = RTE_ACL_FIELD_TYPE_RANGE;\n+}\n+\n+/*\n+ * Convert rte_acl_ipv4vlan_rule: swap VLAN and PORTS rule definitions.\n+ */\n+static void\n+convert_config_3(struct rte_acl_config *cfg)\n+{\n+\tstruct rte_acl_field_def t1, t2;\n+\n+\tipv4vlan_config(cfg, ipv4_7tuple_layout, RTE_ACL_MAX_CATEGORIES);\n+\n+\tt1 = cfg->defs[RTE_ACL_IPV4VLAN_VLAN1_FIELD];\n+\tt2 = cfg->defs[RTE_ACL_IPV4VLAN_VLAN2_FIELD];\n+\n+\t/* swap VLAN1 and SRCP rule definition. */\n+\tcfg->defs[RTE_ACL_IPV4VLAN_VLAN1_FIELD] =\n+\t\tcfg->defs[RTE_ACL_IPV4VLAN_SRCP_FIELD];\n+\tcfg->defs[RTE_ACL_IPV4VLAN_VLAN1_FIELD].field_index = t1.field_index;\n+\tcfg->defs[RTE_ACL_IPV4VLAN_VLAN1_FIELD].input_index = t1.input_index;\n+\n+\t/* swap VLAN2 and DSTP rule definition. */\n+\tcfg->defs[RTE_ACL_IPV4VLAN_VLAN2_FIELD] =\n+\t\tcfg->defs[RTE_ACL_IPV4VLAN_DSTP_FIELD];\n+\tcfg->defs[RTE_ACL_IPV4VLAN_VLAN2_FIELD].field_index = t2.field_index;\n+\tcfg->defs[RTE_ACL_IPV4VLAN_VLAN2_FIELD].input_index = t2.input_index;\n+\n+\tcfg->defs[RTE_ACL_IPV4VLAN_SRCP_FIELD].type = t1.type;\n+\tcfg->defs[RTE_ACL_IPV4VLAN_SRCP_FIELD].size = t1.size;\n+\tcfg->defs[RTE_ACL_IPV4VLAN_SRCP_FIELD].offset = t1.offset;\n+\n+\tcfg->defs[RTE_ACL_IPV4VLAN_DSTP_FIELD].type = t2.type;\n+\tcfg->defs[RTE_ACL_IPV4VLAN_DSTP_FIELD].size = t2.size;\n+\tcfg->defs[RTE_ACL_IPV4VLAN_DSTP_FIELD].offset = t2.offset;\n+}\n+\n+/*\n+ * Convert rte_acl_ipv4vlan_rule: swap SRC and DST ip address rule definitions.\n+ */\n+static void\n+convert_config_4(struct rte_acl_config *cfg)\n+{\n+\tstruct rte_acl_field_def t;\n+\n+\tipv4vlan_config(cfg, ipv4_7tuple_layout, RTE_ACL_MAX_CATEGORIES);\n+\n+\tt = cfg->defs[RTE_ACL_IPV4VLAN_SRC_FIELD];\n+\n+\tcfg->defs[RTE_ACL_IPV4VLAN_SRC_FIELD] =\n+\t\tcfg->defs[RTE_ACL_IPV4VLAN_DST_FIELD];\n+\tcfg->defs[RTE_ACL_IPV4VLAN_SRC_FIELD].field_index = t.field_index;\n+\tcfg->defs[RTE_ACL_IPV4VLAN_SRC_FIELD].input_index = t.input_index;\n+\n+\tcfg->defs[RTE_ACL_IPV4VLAN_DST_FIELD].type = t.type;\n+\tcfg->defs[RTE_ACL_IPV4VLAN_DST_FIELD].size = t.size;\n+\tcfg->defs[RTE_ACL_IPV4VLAN_DST_FIELD].offset = t.offset;\n+}\n+\n+\n+static int\n+build_convert_rules(struct rte_acl_ctx *acx,\n+\tvoid (*config)(struct rte_acl_config *),\n+\tsize_t max_size)\n+{\n+\tstruct rte_acl_config cfg;\n+\n+\tmemset(&cfg, 0, sizeof(cfg));\n+\tconfig(&cfg);\n+\tcfg.max_size = max_size;\n+\treturn rte_acl_build(acx, &cfg);\n+}\n+\n+static int\n+test_convert_rules(const char *desc,\n+\tvoid (*config)(struct rte_acl_config *),\n+\tvoid (*convert)(const struct rte_acl_ipv4vlan_rule *,\n+\tstruct acl_ipv4vlan_rule *))\n+{\n+\tstruct rte_acl_ctx *acx;\n+\tint32_t rc;\n+\tuint32_t i;\n+\tstatic const size_t mem_sizes[] = {0, -1};\n+\n+\tprintf(\"running %s(%s)\\n\", __func__, desc);\n+\n+\tacx = rte_acl_create(&acl_param);\n+\tif (acx == NULL) {\n+\t\tprintf(\"Line %i: Error creating ACL context!\\n\", __LINE__);\n+\t\treturn -1;\n+\t}\n+\n+\trc = convert_rules(acx, convert, acl_test_rules,\n+\t\tRTE_DIM(acl_test_rules));\n+\tif (rc != 0)\n+\t\tprintf(\"Line %i: Error converting ACL rules!\\n\", __LINE__);\n+\n+\tfor (i = 0; rc == 0 && i != RTE_DIM(mem_sizes); i++) {\n+\n+\t\trc = build_convert_rules(acx, config, mem_sizes[i]);\n+\t\tif (rc != 0) {\n+\t\t\tprintf(\"Line %i: Error @ build_convert_rules(%zu)!\\n\",\n+\t\t\t\t__LINE__, mem_sizes[i]);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\trc = test_classify_run(acx);\n+\t\tif (rc != 0)\n+\t\t\tprintf(\"%s failed at line %i, max_size=%zu\\n\",\n+\t\t\t\t__func__, __LINE__, mem_sizes[i]);\n+\t}\n+\n+\trte_acl_free(acx);\n+\treturn rc;\n+}\n+\n+static int\n+test_convert(void)\n+{\n+\tstatic const struct {\n+\t\tconst char *desc;\n+\t\tvoid (*config)(struct rte_acl_config *);\n+\t\tvoid (*convert)(const struct rte_acl_ipv4vlan_rule *,\n+\t\t\tstruct acl_ipv4vlan_rule *);\n+\t} convert_param[] = {\n+\t\t{\n+\t\t\t\"acl_ipv4vlan_tuple\",\n+\t\t\tconvert_config,\n+\t\t\tconvert_rule,\n+\t\t},\n+\t\t{\n+\t\t\t\"acl_ipv4vlan_tuple, RTE_ACL_FIELD_TYPE_BITMASK type \"\n+\t\t\t\"for IPv4\",\n+\t\t\tconvert_config_1,\n+\t\t\tconvert_rule_1,\n+\t\t},\n+\t\t{\n+\t\t\t\"acl_ipv4vlan_tuple, RTE_ACL_FIELD_TYPE_RANGE type \"\n+\t\t\t\"for IPv4\",\n+\t\t\tconvert_config_2,\n+\t\t\tconvert_rule_2,\n+\t\t},\n+\t\t{\n+\t\t\t\"acl_ipv4vlan_tuple: swap VLAN and PORTs order\",\n+\t\t\tconvert_config_3,\n+\t\t\tconvert_rule_3,\n+\t\t},\n+\t\t{\n+\t\t\t\"acl_ipv4vlan_tuple: swap SRC and DST IPv4 order\",\n+\t\t\tconvert_config_4,\n+\t\t\tconvert_rule_4,\n+\t\t},\n+\t};\n+\n+\tuint32_t i;\n+\tint32_t rc;\n+\n+\tfor (i = 0; i != RTE_DIM(convert_param); i++) {\n+\t\trc = test_convert_rules(convert_param[i].desc,\n+\t\t\tconvert_param[i].config,\n+\t\t\tconvert_param[i].convert);\n+\t\tif (rc != 0) {\n+\t\t\tprintf(\"%s for test-case: %s failed, error code: %d;\\n\",\n+\t\t\t\t__func__, convert_param[i].desc, rc);\n+\t\t\treturn rc;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n /*\n  * Test wrong layout behavior\n  * This test supplies the ACL context with invalid layout, which results in\n@@ -1069,6 +1482,8 @@ test_acl(void)\n \t\treturn -1;\n \tif (test_build_ports_range() < 0)\n \t\treturn -1;\n+\tif (test_convert() < 0)\n+\t\treturn -1;\n \n \treturn 0;\n }\n",
    "prefixes": [
        "dpdk-dev",
        "PATCHv2",
        "8/8"
    ]
}