get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 87425,
    "url": "https://patches.dpdk.org/api/patches/87425/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210127160948.6008-19-lironh@marvell.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<20210127160948.6008-19-lironh@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210127160948.6008-19-lironh@marvell.com",
    "date": "2021-01-27T16:09:32",
    "name": "[v3,18/34] net/mvpp2: flow: build table key along with rule",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "abfb40ed109793a49211556a8fe2b687f91693b9",
    "submitter": {
        "id": 996,
        "url": "https://patches.dpdk.org/api/people/996/?format=api",
        "name": "Liron Himi",
        "email": "lironh@marvell.com"
    },
    "delegate": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20210127160948.6008-19-lironh@marvell.com/mbox/",
    "series": [
        {
            "id": 14976,
            "url": "https://patches.dpdk.org/api/series/14976/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=14976",
            "date": "2021-01-27T16:09:14",
            "name": "net/mvpp2: misc updates",
            "version": 3,
            "mbox": "https://patches.dpdk.org/series/14976/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/87425/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/87425/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id D1A0DA052A;\n\tWed, 27 Jan 2021 17:13:52 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 0AC54140EA9;\n\tWed, 27 Jan 2021 17:10:42 +0100 (CET)",
            "from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com\n [67.231.148.174])\n by mails.dpdk.org (Postfix) with ESMTP id F1FD0140F2A\n for <dev@dpdk.org>; Wed, 27 Jan 2021 17:10:37 +0100 (CET)",
            "from pps.filterd (m0045849.ppops.net [127.0.0.1])\n by mx0a-0016f401.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id\n 10RG5eQX027133; Wed, 27 Jan 2021 08:10:37 -0800",
            "from dc5-exch02.marvell.com ([199.233.59.182])\n by mx0a-0016f401.pphosted.com with ESMTP id 368j1uc398-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT);\n Wed, 27 Jan 2021 08:10:37 -0800",
            "from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.2;\n Wed, 27 Jan 2021 08:10:36 -0800",
            "from pt-lxl0023.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.2 via Frontend\n Transport; Wed, 27 Jan 2021 08:10:34 -0800"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n h=from : to : cc :\n subject : date : message-id : in-reply-to : references : mime-version :\n content-transfer-encoding : content-type; s=pfpt0220;\n bh=Z8hVOmxwg6nw6tSBL+HI8jLeciPGRqpT9E1cClwYios=;\n b=ARgTA8GBoJKfE2p15kyAS0478sx/Dz85iQcOIJAUUqKmkc8aV+6fyVHRtVtfcvcyN7n/\n 5AgfYRaFD4+XZnk9ll0Low7aPIqtceundcmGGMcCrGryTd0Y4Q4D2Mma81W/StApAh/V\n /jXwOnmkenUqB99ppgJSFJBapGKG+H02ATCMkBDkJOM2+HWTCOkBYmpvG0sMhP19GvQt\n DtMO1SyxNc9bjuxCbJxxRYY6Vv+OCChXFQPi7D/olbCukvMOl/5jclpqYxbo/HCdE6id\n m+2Fb1nY+QQqbUkLxEkmt6iVl5kRokM5ljrx7Io9svC00Wu+W4jqFwXJo7Co8oCP23KW BA==",
        "From": "<lironh@marvell.com>",
        "To": "<jerinj@marvell.com>, <ferruh.yigit@intel.com>",
        "CC": "<dev@dpdk.org>, Liron Himi <lironh@marvell.com>",
        "Date": "Wed, 27 Jan 2021 18:09:32 +0200",
        "Message-ID": "<20210127160948.6008-19-lironh@marvell.com>",
        "X-Mailer": "git-send-email 2.28.0",
        "In-Reply-To": "<20210127160948.6008-1-lironh@marvell.com>",
        "References": "<20210122191925.24308-1-lironh@marvell.com>\n <20210127160948.6008-1-lironh@marvell.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10434:6.0.343, 18.0.737\n definitions=2021-01-27_05:2021-01-27,\n 2021-01-27 signatures=0",
        "Subject": "[dpdk-dev] [PATCH v3 18/34] net/mvpp2: flow: build table key along\n with rule",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Liron Himi <lironh@marvell.com>\n\nCurrently the key is always built in network order\nregardless of user input.\nBesides the fact that it is not in user order,\nit prevent future support for udf header between standard headers.\nthis patch builds the key while parsing the given rule.\n\nSigned-off-by: Liron Himi <lironh@marvell.com>\n---\n drivers/net/mvpp2/mrvl_ethdev.h |  33 +---\n drivers/net/mvpp2/mrvl_flow.c   | 257 +++++++++++++-------------------\n 2 files changed, 106 insertions(+), 184 deletions(-)",
    "diff": "diff --git a/drivers/net/mvpp2/mrvl_ethdev.h b/drivers/net/mvpp2/mrvl_ethdev.h\nindex eee5182ce8..da026e6068 100644\n--- a/drivers/net/mvpp2/mrvl_ethdev.h\n+++ b/drivers/net/mvpp2/mrvl_ethdev.h\n@@ -82,43 +82,13 @@\n /** Maximum length of a match string */\n #define MRVL_MATCH_LEN 16\n \n-/** Parsed fields in processed rte_flow_item. */\n-enum mrvl_parsed_fields {\n-\t/* eth flags */\n-\tF_DMAC =         BIT(0),\n-\tF_SMAC =         BIT(1),\n-\tF_TYPE =         BIT(2),\n-\t/* vlan flags */\n-\tF_VLAN_PRI =     BIT(3),\n-\tF_VLAN_ID =      BIT(4),\n-\tF_VLAN_TCI =     BIT(5), /* not supported by MUSDK yet */\n-\t/* ip4 flags */\n-\tF_IP4_TOS =      BIT(6),\n-\tF_IP4_SIP =      BIT(7),\n-\tF_IP4_DIP =      BIT(8),\n-\tF_IP4_PROTO =    BIT(9),\n-\t/* ip6 flags */\n-\tF_IP6_TC =       BIT(10), /* not supported by MUSDK yet */\n-\tF_IP6_SIP =      BIT(11),\n-\tF_IP6_DIP =      BIT(12),\n-\tF_IP6_FLOW =     BIT(13),\n-\tF_IP6_NEXT_HDR = BIT(14),\n-\t/* tcp flags */\n-\tF_TCP_SPORT =    BIT(15),\n-\tF_TCP_DPORT =    BIT(16),\n-\t/* udp flags */\n-\tF_UDP_SPORT =    BIT(17),\n-\tF_UDP_DPORT =    BIT(18),\n-};\n-\n /** PMD-specific definition of a flow rule handle. */\n struct mrvl_mtr;\n struct rte_flow {\n \tLIST_ENTRY(rte_flow) next;\n \tstruct mrvl_mtr *mtr;\n \n-\tenum mrvl_parsed_fields pattern;\n-\n+\tstruct pp2_cls_tbl_key table_key;\n \tstruct pp2_cls_tbl_rule rule;\n \tstruct pp2_cls_cos_desc cos;\n \tstruct pp2_cls_tbl_action action;\n@@ -196,7 +166,6 @@ struct mrvl_priv {\n \n \tstruct pp2_cls_tbl_params cls_tbl_params;\n \tstruct pp2_cls_tbl *cls_tbl;\n-\tuint32_t cls_tbl_pattern;\n \tLIST_HEAD(mrvl_flows, rte_flow) flows;\n \n \tstruct pp2_cls_plcr *default_policer;\ndiff --git a/drivers/net/mvpp2/mrvl_flow.c b/drivers/net/mvpp2/mrvl_flow.c\nindex a1a7485292..ffa47a12ec 100644\n--- a/drivers/net/mvpp2/mrvl_flow.c\n+++ b/drivers/net/mvpp2/mrvl_flow.c\n@@ -192,12 +192,14 @@ mrvl_parse_mac(const struct rte_flow_item_eth *spec,\n \t\tk = spec->dst.addr_bytes;\n \t\tm = mask->dst.addr_bytes;\n \n-\t\tflow->pattern |= F_DMAC;\n+\t\tflow->table_key.proto_field[flow->rule.num_fields].field.eth =\n+\t\t\tMV_NET_ETH_F_DA;\n \t} else {\n \t\tk = spec->src.addr_bytes;\n \t\tm = mask->src.addr_bytes;\n \n-\t\tflow->pattern |= F_SMAC;\n+\t\tflow->table_key.proto_field[flow->rule.num_fields].field.eth =\n+\t\t\tMV_NET_ETH_F_SA;\n \t}\n \n \tkey_field = &flow->rule.fields[flow->rule.num_fields];\n@@ -212,6 +214,10 @@ mrvl_parse_mac(const struct rte_flow_item_eth *spec,\n \t\t \"%02x:%02x:%02x:%02x:%02x:%02x\",\n \t\t m[0], m[1], m[2], m[3], m[4], m[5]);\n \n+\tflow->table_key.proto_field[flow->rule.num_fields].proto =\n+\t\tMV_NET_PROTO_ETH;\n+\tflow->table_key.key_size += key_field->size;\n+\n \tflow->rule.num_fields += 1;\n \n \treturn 0;\n@@ -272,7 +278,12 @@ mrvl_parse_type(const struct rte_flow_item_eth *spec,\n \tk = rte_be_to_cpu_16(spec->type);\n \tsnprintf((char *)key_field->key, MRVL_CLS_STR_SIZE_MAX, \"%u\", k);\n \n-\tflow->pattern |= F_TYPE;\n+\tflow->table_key.proto_field[flow->rule.num_fields].proto =\n+\t\tMV_NET_PROTO_ETH;\n+\tflow->table_key.proto_field[flow->rule.num_fields].field.eth =\n+\t\tMV_NET_ETH_F_TYPE;\n+\tflow->table_key.key_size += key_field->size;\n+\n \tflow->rule.num_fields += 1;\n \n \treturn 0;\n@@ -303,7 +314,12 @@ mrvl_parse_vlan_id(const struct rte_flow_item_vlan *spec,\n \tk = rte_be_to_cpu_16(spec->tci) & MRVL_VLAN_ID_MASK;\n \tsnprintf((char *)key_field->key, MRVL_CLS_STR_SIZE_MAX, \"%u\", k);\n \n-\tflow->pattern |= F_VLAN_ID;\n+\tflow->table_key.proto_field[flow->rule.num_fields].proto =\n+\t\tMV_NET_PROTO_VLAN;\n+\tflow->table_key.proto_field[flow->rule.num_fields].field.vlan =\n+\t\tMV_NET_VLAN_F_ID;\n+\tflow->table_key.key_size += key_field->size;\n+\n \tflow->rule.num_fields += 1;\n \n \treturn 0;\n@@ -334,7 +350,12 @@ mrvl_parse_vlan_pri(const struct rte_flow_item_vlan *spec,\n \tk = (rte_be_to_cpu_16(spec->tci) & MRVL_VLAN_PRI_MASK) >> 13;\n \tsnprintf((char *)key_field->key, MRVL_CLS_STR_SIZE_MAX, \"%u\", k);\n \n-\tflow->pattern |= F_VLAN_PRI;\n+\tflow->table_key.proto_field[flow->rule.num_fields].proto =\n+\t\tMV_NET_PROTO_VLAN;\n+\tflow->table_key.proto_field[flow->rule.num_fields].field.vlan =\n+\t\tMV_NET_VLAN_F_PRI;\n+\tflow->table_key.key_size += key_field->size;\n+\n \tflow->rule.num_fields += 1;\n \n \treturn 0;\n@@ -367,7 +388,12 @@ mrvl_parse_ip4_dscp(const struct rte_flow_item_ipv4 *spec,\n \tsnprintf((char *)key_field->key, MRVL_CLS_STR_SIZE_MAX, \"%u\", k);\n \tsnprintf((char *)key_field->mask, MRVL_CLS_STR_SIZE_MAX, \"%u\", m);\n \n-\tflow->pattern |= F_IP4_TOS;\n+\tflow->table_key.proto_field[flow->rule.num_fields].proto =\n+\t\tMV_NET_PROTO_IP4;\n+\tflow->table_key.proto_field[flow->rule.num_fields].field.ipv4 =\n+\t\tMV_NET_IP4_F_DSCP;\n+\tflow->table_key.key_size += key_field->size;\n+\n \tflow->rule.num_fields += 1;\n \n \treturn 0;\n@@ -399,12 +425,14 @@ mrvl_parse_ip4_addr(const struct rte_flow_item_ipv4 *spec,\n \t\tk.s_addr = spec->hdr.dst_addr;\n \t\tm = rte_be_to_cpu_32(mask->hdr.dst_addr);\n \n-\t\tflow->pattern |= F_IP4_DIP;\n+\t\tflow->table_key.proto_field[flow->rule.num_fields].field.ipv4 =\n+\t\t\tMV_NET_IP4_F_DA;\n \t} else {\n \t\tk.s_addr = spec->hdr.src_addr;\n \t\tm = rte_be_to_cpu_32(mask->hdr.src_addr);\n \n-\t\tflow->pattern |= F_IP4_SIP;\n+\t\tflow->table_key.proto_field[flow->rule.num_fields].field.ipv4 =\n+\t\t\tMV_NET_IP4_F_SA;\n \t}\n \n \tkey_field = &flow->rule.fields[flow->rule.num_fields];\n@@ -414,6 +442,10 @@ mrvl_parse_ip4_addr(const struct rte_flow_item_ipv4 *spec,\n \tinet_ntop(AF_INET, &k, (char *)key_field->key, MRVL_CLS_STR_SIZE_MAX);\n \tsnprintf((char *)key_field->mask, MRVL_CLS_STR_SIZE_MAX, \"0x%x\", m);\n \n+\tflow->table_key.proto_field[flow->rule.num_fields].proto =\n+\t\tMV_NET_PROTO_IP4;\n+\tflow->table_key.key_size += key_field->size;\n+\n \tflow->rule.num_fields += 1;\n \n \treturn 0;\n@@ -475,7 +507,12 @@ mrvl_parse_ip4_proto(const struct rte_flow_item_ipv4 *spec,\n \n \tsnprintf((char *)key_field->key, MRVL_CLS_STR_SIZE_MAX, \"%u\", k);\n \n-\tflow->pattern |= F_IP4_PROTO;\n+\tflow->table_key.proto_field[flow->rule.num_fields].proto =\n+\t\tMV_NET_PROTO_IP4;\n+\tflow->table_key.proto_field[flow->rule.num_fields].field.ipv4 =\n+\t\tMV_NET_IP4_F_PROTO;\n+\tflow->table_key.key_size += key_field->size;\n+\n \tflow->rule.num_fields += 1;\n \n \treturn 0;\n@@ -507,12 +544,14 @@ mrvl_parse_ip6_addr(const struct rte_flow_item_ipv6 *spec,\n \t\tmemcpy(k.s6_addr, spec->hdr.dst_addr, size);\n \t\tmemcpy(m.s6_addr, mask->hdr.dst_addr, size);\n \n-\t\tflow->pattern |= F_IP6_DIP;\n+\t\tflow->table_key.proto_field[flow->rule.num_fields].field.ipv6 =\n+\t\t\tMV_NET_IP6_F_DA;\n \t} else {\n \t\tmemcpy(k.s6_addr, spec->hdr.src_addr, size);\n \t\tmemcpy(m.s6_addr, mask->hdr.src_addr, size);\n \n-\t\tflow->pattern |= F_IP6_SIP;\n+\t\tflow->table_key.proto_field[flow->rule.num_fields].field.ipv6 =\n+\t\t\tMV_NET_IP6_F_SA;\n \t}\n \n \tkey_field = &flow->rule.fields[flow->rule.num_fields];\n@@ -522,6 +561,10 @@ mrvl_parse_ip6_addr(const struct rte_flow_item_ipv6 *spec,\n \tinet_ntop(AF_INET6, &k, (char *)key_field->key, MRVL_CLS_STR_SIZE_MAX);\n \tinet_ntop(AF_INET6, &m, (char *)key_field->mask, MRVL_CLS_STR_SIZE_MAX);\n \n+\tflow->table_key.proto_field[flow->rule.num_fields].proto =\n+\t\tMV_NET_PROTO_IP6;\n+\tflow->table_key.key_size += key_field->size;\n+\n \tflow->rule.num_fields += 1;\n \n \treturn 0;\n@@ -585,7 +628,12 @@ mrvl_parse_ip6_flow(const struct rte_flow_item_ipv6 *spec,\n \tsnprintf((char *)key_field->key, MRVL_CLS_STR_SIZE_MAX, \"%u\", k);\n \tsnprintf((char *)key_field->mask, MRVL_CLS_STR_SIZE_MAX, \"%u\", m);\n \n-\tflow->pattern |= F_IP6_FLOW;\n+\tflow->table_key.proto_field[flow->rule.num_fields].proto =\n+\t\tMV_NET_PROTO_IP6;\n+\tflow->table_key.proto_field[flow->rule.num_fields].field.ipv6 =\n+\t\tMV_NET_IP6_F_FLOW;\n+\tflow->table_key.key_size += key_field->size;\n+\n \tflow->rule.num_fields += 1;\n \n \treturn 0;\n@@ -615,7 +663,12 @@ mrvl_parse_ip6_next_hdr(const struct rte_flow_item_ipv6 *spec,\n \n \tsnprintf((char *)key_field->key, MRVL_CLS_STR_SIZE_MAX, \"%u\", k);\n \n-\tflow->pattern |= F_IP6_NEXT_HDR;\n+\tflow->table_key.proto_field[flow->rule.num_fields].proto =\n+\t\tMV_NET_PROTO_IP6;\n+\tflow->table_key.proto_field[flow->rule.num_fields].field.ipv6 =\n+\t\tMV_NET_IP6_F_NEXT_HDR;\n+\tflow->table_key.key_size += key_field->size;\n+\n \tflow->rule.num_fields += 1;\n \n \treturn 0;\n@@ -648,15 +701,21 @@ mrvl_parse_tcp_port(const struct rte_flow_item_tcp *spec,\n \tif (parse_dst) {\n \t\tk = rte_be_to_cpu_16(spec->hdr.dst_port);\n \n-\t\tflow->pattern |= F_TCP_DPORT;\n+\t\tflow->table_key.proto_field[flow->rule.num_fields].field.tcp =\n+\t\t\tMV_NET_TCP_F_DP;\n \t} else {\n \t\tk = rte_be_to_cpu_16(spec->hdr.src_port);\n \n-\t\tflow->pattern |= F_TCP_SPORT;\n+\t\tflow->table_key.proto_field[flow->rule.num_fields].field.tcp =\n+\t\t\tMV_NET_TCP_F_SP;\n \t}\n \n \tsnprintf((char *)key_field->key, MRVL_CLS_STR_SIZE_MAX, \"%u\", k);\n \n+\tflow->table_key.proto_field[flow->rule.num_fields].proto =\n+\t\tMV_NET_PROTO_TCP;\n+\tflow->table_key.key_size += key_field->size;\n+\n \tflow->rule.num_fields += 1;\n \n \treturn 0;\n@@ -721,15 +780,21 @@ mrvl_parse_udp_port(const struct rte_flow_item_udp *spec,\n \tif (parse_dst) {\n \t\tk = rte_be_to_cpu_16(spec->hdr.dst_port);\n \n-\t\tflow->pattern |= F_UDP_DPORT;\n+\t\tflow->table_key.proto_field[flow->rule.num_fields].field.udp =\n+\t\t\tMV_NET_UDP_F_DP;\n \t} else {\n \t\tk = rte_be_to_cpu_16(spec->hdr.src_port);\n \n-\t\tflow->pattern |= F_UDP_SPORT;\n+\t\tflow->table_key.proto_field[flow->rule.num_fields].field.udp =\n+\t\t\tMV_NET_UDP_F_SP;\n \t}\n \n \tsnprintf((char *)key_field->key, MRVL_CLS_STR_SIZE_MAX, \"%u\", k);\n \n+\tflow->table_key.proto_field[flow->rule.num_fields].proto =\n+\t\tMV_NET_PROTO_UDP;\n+\tflow->table_key.key_size += key_field->size;\n+\n \tflow->rule.num_fields += 1;\n \n \treturn 0;\n@@ -832,7 +897,7 @@ mrvl_parse_vlan(const struct rte_flow_item *item,\n {\n \tconst struct rte_flow_item_vlan *spec = NULL, *mask = NULL;\n \tuint16_t m;\n-\tint ret;\n+\tint ret, i;\n \n \tret = mrvl_parse_init(item, (const void **)&spec, (const void **)&mask,\n \t\t\t      &rte_flow_item_vlan_mask,\n@@ -855,12 +920,6 @@ mrvl_parse_vlan(const struct rte_flow_item *item,\n \t\t\tgoto out;\n \t}\n \n-\tif (flow->pattern & F_TYPE) {\n-\t\trte_flow_error_set(error, ENOTSUP,\n-\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM, item,\n-\t\t\t\t   \"VLAN TPID matching is not supported\");\n-\t\treturn -rte_errno;\n-\t}\n \tif (mask->inner_type) {\n \t\tstruct rte_flow_item_eth spec_eth = {\n \t\t\t.type = spec->inner_type,\n@@ -869,6 +928,21 @@ mrvl_parse_vlan(const struct rte_flow_item *item,\n \t\t\t.type = mask->inner_type,\n \t\t};\n \n+\t\t/* TPID is not supported so if ETH_TYPE was selected,\n+\t\t * error is return. else, classify eth-type with the tpid value\n+\t\t */\n+\t\tfor (i = 0; i < flow->rule.num_fields; i++)\n+\t\t\tif (flow->table_key.proto_field[i].proto ==\n+\t\t\t    MV_NET_PROTO_ETH &&\n+\t\t\t    flow->table_key.proto_field[i].field.eth ==\n+\t\t\t    MV_NET_ETH_F_TYPE) {\n+\t\t\t\trte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM,\n+\t\t\t\t\t\t   item,\n+\t\t\t\t\t\t   \"VLAN TPID matching is not supported\");\n+\t\t\t\treturn -rte_errno;\n+\t\t\t}\n+\n \t\tMRVL_LOG(WARNING, \"inner eth type mask is ignored\");\n \t\tret = mrvl_parse_type(&spec_eth, &mask_eth, flow);\n \t\tif (ret)\n@@ -1250,6 +1324,8 @@ mrvl_flow_parse_pattern(struct mrvl_priv *priv __rte_unused,\n \t\t}\n \t}\n \n+\tflow->table_key.num_fields = flow->rule.num_fields;\n+\n \treturn 0;\n }\n \n@@ -1462,134 +1538,9 @@ mrvl_create_cls_table(struct rte_eth_dev *dev, struct rte_flow *first_flow)\n \tpriv->cls_tbl_params.max_num_rules = MRVL_CLS_MAX_NUM_RULES;\n \tpriv->cls_tbl_params.default_act.type = PP2_CLS_TBL_ACT_DONE;\n \tpriv->cls_tbl_params.default_act.cos = &first_flow->cos;\n-\n-\tif (first_flow->pattern & F_DMAC) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_ETH;\n-\t\tkey->proto_field[key->num_fields].field.eth = MV_NET_ETH_F_DA;\n-\t\tkey->key_size += 6;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_SMAC) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_ETH;\n-\t\tkey->proto_field[key->num_fields].field.eth = MV_NET_ETH_F_SA;\n-\t\tkey->key_size += 6;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_TYPE) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_ETH;\n-\t\tkey->proto_field[key->num_fields].field.eth = MV_NET_ETH_F_TYPE;\n-\t\tkey->key_size += 2;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_VLAN_ID) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_VLAN;\n-\t\tkey->proto_field[key->num_fields].field.vlan = MV_NET_VLAN_F_ID;\n-\t\tkey->key_size += 2;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_VLAN_PRI) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_VLAN;\n-\t\tkey->proto_field[key->num_fields].field.vlan =\n-\t\t\tMV_NET_VLAN_F_PRI;\n-\t\tkey->key_size += 1;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_IP4_TOS) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_IP4;\n-\t\tkey->proto_field[key->num_fields].field.ipv4 =\n-\t\t\t\t\t\t\tMV_NET_IP4_F_DSCP;\n-\t\tkey->key_size += 1;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_IP4_SIP) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_IP4;\n-\t\tkey->proto_field[key->num_fields].field.ipv4 = MV_NET_IP4_F_SA;\n-\t\tkey->key_size += 4;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_IP4_DIP) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_IP4;\n-\t\tkey->proto_field[key->num_fields].field.ipv4 = MV_NET_IP4_F_DA;\n-\t\tkey->key_size += 4;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_IP4_PROTO) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_IP4;\n-\t\tkey->proto_field[key->num_fields].field.ipv4 =\n-\t\t\tMV_NET_IP4_F_PROTO;\n-\t\tkey->key_size += 1;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_IP6_SIP) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_IP6;\n-\t\tkey->proto_field[key->num_fields].field.ipv6 = MV_NET_IP6_F_SA;\n-\t\tkey->key_size += 16;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_IP6_DIP) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_IP6;\n-\t\tkey->proto_field[key->num_fields].field.ipv6 = MV_NET_IP6_F_DA;\n-\t\tkey->key_size += 16;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_IP6_FLOW) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_IP6;\n-\t\tkey->proto_field[key->num_fields].field.ipv6 =\n-\t\t\tMV_NET_IP6_F_FLOW;\n-\t\tkey->key_size += 3;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_IP6_NEXT_HDR) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_IP6;\n-\t\tkey->proto_field[key->num_fields].field.ipv6 =\n-\t\t\tMV_NET_IP6_F_NEXT_HDR;\n-\t\tkey->key_size += 1;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_TCP_SPORT) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_TCP;\n-\t\tkey->proto_field[key->num_fields].field.tcp = MV_NET_TCP_F_SP;\n-\t\tkey->key_size += 2;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_TCP_DPORT) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_TCP;\n-\t\tkey->proto_field[key->num_fields].field.tcp = MV_NET_TCP_F_DP;\n-\t\tkey->key_size += 2;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_UDP_SPORT) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_UDP;\n-\t\tkey->proto_field[key->num_fields].field.udp = MV_NET_UDP_F_SP;\n-\t\tkey->key_size += 2;\n-\t\tkey->num_fields += 1;\n-\t}\n-\n-\tif (first_flow->pattern & F_UDP_DPORT) {\n-\t\tkey->proto_field[key->num_fields].proto = MV_NET_PROTO_UDP;\n-\t\tkey->proto_field[key->num_fields].field.udp = MV_NET_UDP_F_DP;\n-\t\tkey->key_size += 2;\n-\t\tkey->num_fields += 1;\n-\t}\n+\tmemcpy(key, &first_flow->table_key, sizeof(struct pp2_cls_tbl_key));\n \n \tret = pp2_cls_tbl_init(&priv->cls_tbl_params, &priv->cls_tbl);\n-\tif (!ret)\n-\t\tpriv->cls_tbl_pattern = first_flow->pattern;\n \n \treturn ret;\n }\n@@ -1604,8 +1555,10 @@ mrvl_create_cls_table(struct rte_eth_dev *dev, struct rte_flow *first_flow)\n static inline int\n mrvl_flow_can_be_added(struct mrvl_priv *priv, const struct rte_flow *flow)\n {\n-\treturn flow->pattern == priv->cls_tbl_pattern &&\n-\t       mrvl_engine_type(flow) == priv->cls_tbl_params.type;\n+\tint same = memcmp(&flow->table_key, &priv->cls_tbl_params.key,\n+\t\t\t  sizeof(struct pp2_cls_tbl_key)) == 0;\n+\n+\treturn same && mrvl_engine_type(flow) == priv->cls_tbl_params.type;\n }\n \n /**\n",
    "prefixes": [
        "v3",
        "18/34"
    ]
}