Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/5284/?format=api
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" ] }{ "id": 5284, "url": "