get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 136414,
    "url": "http://patches.dpdk.org/api/patches/136414/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20240206020626.545946-4-suanmingm@nvidia.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": "<20240206020626.545946-4-suanmingm@nvidia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240206020626.545946-4-suanmingm@nvidia.com",
    "date": "2024-02-06T02:06:24",
    "name": "[v7,3/4] ethdev: add compare item",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "6502aba6c1927412ab59cd3959a62c37cca1cda5",
    "submitter": {
        "id": 1887,
        "url": "http://patches.dpdk.org/api/people/1887/?format=api",
        "name": "Suanming Mou",
        "email": "suanmingm@nvidia.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20240206020626.545946-4-suanmingm@nvidia.com/mbox/",
    "series": [
        {
            "id": 31005,
            "url": "http://patches.dpdk.org/api/series/31005/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=31005",
            "date": "2024-02-06T02:06:21",
            "name": "ethdev: add RTE_FLOW_ITEM_TYPE_COMPARE",
            "version": 7,
            "mbox": "http://patches.dpdk.org/series/31005/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/136414/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/136414/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 8CA2343A94;\n\tTue,  6 Feb 2024 03:07:17 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 169BD40EE5;\n\tTue,  6 Feb 2024 03:07:11 +0100 (CET)",
            "from NAM12-BN8-obe.outbound.protection.outlook.com\n (mail-bn8nam12on2072.outbound.protection.outlook.com [40.107.237.72])\n by mails.dpdk.org (Postfix) with ESMTP id 3EBB340E7C\n for <dev@dpdk.org>; Tue,  6 Feb 2024 03:07:09 +0100 (CET)",
            "from SJ0PR03CA0005.namprd03.prod.outlook.com (2603:10b6:a03:33a::10)\n by MW4PR12MB6950.namprd12.prod.outlook.com (2603:10b6:303:207::11)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7270.13; Tue, 6 Feb\n 2024 02:07:06 +0000",
            "from SJ1PEPF00001CE4.namprd03.prod.outlook.com\n (2603:10b6:a03:33a:cafe::73) by SJ0PR03CA0005.outlook.office365.com\n (2603:10b6:a03:33a::10) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7249.36 via Frontend\n Transport; Tue, 6 Feb 2024 02:07:05 +0000",
            "from mail.nvidia.com (216.228.117.160) by\n SJ1PEPF00001CE4.mail.protection.outlook.com (10.167.242.20) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.7202.16 via Frontend Transport; Tue, 6 Feb 2024 02:07:05 +0000",
            "from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com\n (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Mon, 5 Feb 2024\n 18:06:54 -0800",
            "from nvidia.com (10.126.230.35) by rnnvmail201.nvidia.com\n (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1258.12; Mon, 5 Feb\n 2024 18:06:50 -0800"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=ccpc9uIp6GSP7au8cshDWTAERdxpHs77tWe9lER+REfC26yUHurMjdf+kunlfIFQAShnZRZPm9Ax8pJ4ca2pbloFcfhUHjn2qfYfSts9xQuiUWCEPtxx5EyNB1kzuOwgH2RQDD443APSQXu2dfQp1YGvCvhfbeQmZPNrzzbwuBFvxks3s4V0VDG0/thGoP7YhcAgfNNO4UEXO6FIwBtLzkQL5egM0uFuniujeV2v4sylr2NQUM4DiY1w+N7jS1/LhhZdqhIAuH/A4M28OCDIkzbtvs8Rkec1XD+eElhaDzysHFTbNAszfBzt0R21fxI/1y7b6kj5OgkRr/AoLzO0gA==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=PjeUYUsuIUoChmhAmFTc7el5JQmlheAZHA/YbmwUuuU=;\n b=T5GUzG56jzyF1UhsiPJfvvZYJtZDFgBEXGunhS8Gz50uu0B/9JEZu4WYvO8NzPYiB35a7/37zaEwvf9RYSfKRyDkLib29/twnd2qjDMSs1m88kRAKTIAW4akkGUI27jFCepz5JIvqaRrGPt+ghICrqGrpZ5uMTtyQIxTXDZLEF+dm5/EXrBIuSkaH+Gn0ffSRZqrd+xvjKQuFrYVTivieIOIu8cuie28upQC46VLqg0fRxxUBAm0YUcZdp2VGbYolp1uCUOC6aSoFXZ48OzdCoC6H5s8QxZx1MsXFSBk1u2X+Lreqip4+cjXy2qrC8Hzgz2SImOMPsNooeWn6xGV6A==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 216.228.117.160) smtp.rcpttodomain=monjalon.net smtp.mailfrom=nvidia.com;\n dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com;\n dkim=none (message not signed); arc=none (0)",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com;\n s=selector2;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=PjeUYUsuIUoChmhAmFTc7el5JQmlheAZHA/YbmwUuuU=;\n b=r/vTchPyfBj+lhNijWc1IXKHeHvw4moHCszDuAuQa7k/oJQiEYCI4XL/Ac+N1bV5gIuWl392d8+QvB2ULni+u76AdDwIgVHOB+jj14MNvG0BZP9ycbhH0Gns91MrmvRUgURx7EBswi+xYEQFR9hZ4k1HTxxMSOwaspdGD4EXQHZRejA2Z11Tt+NMVAgvL8cj7cmrGXqgtsL8DPh7KoR32U4v6eiUHjbv9Sdt8Ze2/CNG7dQ6jHicpTXW0Qi0H0tXNOBsvsSENdjwlU+DZSOkOl9cCBwCY2y0nt4XMSISloFO91fmpgmkQqOOtKwSTj450nASbRWXTcW6IA3T9Se8UA==",
        "X-MS-Exchange-Authentication-Results": "spf=pass (sender IP is 216.228.117.160)\n smtp.mailfrom=nvidia.com;\n dkim=none (message not signed)\n header.d=none;dmarc=pass action=none header.from=nvidia.com;",
        "Received-SPF": "Pass (protection.outlook.com: domain of nvidia.com designates\n 216.228.117.160 as permitted sender) receiver=protection.outlook.com;\n client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C",
        "From": "Suanming Mou <suanmingm@nvidia.com>",
        "To": "<thomas@monjalon.net>, <ferruh.yigit@amd.com>, Ori Kam <orika@nvidia.com>,\n Aman Singh <aman.deep.singh@intel.com>, Yuying Zhang\n <yuying.zhang@intel.com>, Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>",
        "CC": "<dev@dpdk.org>",
        "Subject": "[PATCH v7 3/4] ethdev: add compare item",
        "Date": "Tue, 6 Feb 2024 10:06:24 +0800",
        "Message-ID": "<20240206020626.545946-4-suanmingm@nvidia.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20240206020626.545946-1-suanmingm@nvidia.com>",
        "References": "<20231214031227.363911-1-suanmingm@nvidia.com>\n <20240206020626.545946-1-suanmingm@nvidia.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[10.126.230.35]",
        "X-ClientProxiedBy": "rnnvmail203.nvidia.com (10.129.68.9) To\n rnnvmail201.nvidia.com (10.129.68.8)",
        "X-EOPAttributedMessage": "0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "SJ1PEPF00001CE4:EE_|MW4PR12MB6950:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "ef788a96-af70-4bf5-0443-08dc26b850e6",
        "X-LD-Processed": "43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n vthNGeQkDhokOdI0ylkMX5/QjjMamNv4s3kfJG/kiZKVSfl7hNbh6zOo8ACFpmufsOB7X+iWhE2ke143l0ZIKknYoPGmHV2qyrXBEI91uYaSy7Kj4eR7Wr+fw3aXw4XIfU/5qouRZa8nkFogWIno/ryUwEjBWHwjJRV5FrFERbh89dNWSODceiIi6UZRRFUxqXtAr8zpCIAfHvh0CR7CVCXFvRTamX2X7fFjvKuk0rB2ABUXPBK01MjotY6wymCamWIc834LnAHpEmY79bterkwQ5NjJ4Px+SqLatpWP710VRcVRiQi8TIocfEPL2AimeV9QEjVXWtvFHECHmGFXJbtGHcKi63QpA/AqRgNU5MJPmiEnpa4PWIk6bEMLbgGzIdSoBrPOqmjmF9Tf2yWYTsA5YTC7EI6k0da8V7awM387JY5PHdQIULH50CBIGSVoPCBe6B8BJhPAnL5/nOluqFgZ+vZzgvDiMnUQ/t9QCpkvmrYqG4gps1ngqOYELDiU+xRTiGUjP44a9wJxZEhkg4ZXiXgOq9eO/ZgYFXoaR89+wv18HRgRJCjwSRc3Ntjht+SldKqJGmQYm73PPo8WMJK7albhIlyfthsGh2xZv/voN4oxGM75TUIXKkVp361dMeH+w3wICQkKNc0HuZo4GDN/L/W6e3Ydoi5XCZaPbImaU5Z3O4Z+y1OSSAKTS/xEY7iGjsOG8vhWhD21s+KKZ/7KRYKHertm9/AecfLqWW9fazmiveyr0uucTqrJzz1I",
        "X-Forefront-Antispam-Report": "CIP:216.228.117.160; CTRY:US; LANG:en; SCL:1;\n SRV:;\n IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge1.nvidia.com; CAT:NONE;\n SFS:(13230031)(4636009)(346002)(396003)(136003)(376002)(39860400002)(230273577357003)(230922051799003)(186009)(451199024)(64100799003)(82310400011)(1800799012)(36840700001)(46966006)(40470700004)(5660300002)(30864003)(6666004)(478600001)(8676002)(4326008)(86362001)(316002)(7696005)(2616005)(70206006)(8936002)(110136005)(426003)(36756003)(36860700001)(6286002)(41300700001)(26005)(1076003)(82740400003)(7636003)(336012)(70586007)(83380400001)(356005)(47076005)(16526019)(55016003)(2906002)(40480700001)(40460700003);\n DIR:OUT; SFP:1101;",
        "X-OriginatorOrg": "Nvidia.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "06 Feb 2024 02:07:05.1607 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n ef788a96-af70-4bf5-0443-08dc26b850e6",
        "X-MS-Exchange-CrossTenant-Id": "43083d15-7273-40c1-b7db-39efd9ccc17a",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.117.160];\n Helo=[mail.nvidia.com]",
        "X-MS-Exchange-CrossTenant-AuthSource": "\n SJ1PEPF00001CE4.namprd03.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "MW4PR12MB6950",
        "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"
    },
    "content": "The new item type is added for the case user wants to match traffic\nbased on packet field compare result with other fields or immediate\nvalue.\n\ne.g. take advantage the compare item user will be able to accumulate\na IPv4/TCP packet's TCP data_offset and IPv4 IHL field to a tag\nregister, then compare the tag register with IPv4 header total length\nto understand the packet has payload or not.\n\nThe supported operations can be as below:\n - RTE_FLOW_ITEM_COMPARE_EQ (equal)\n - RTE_FLOW_ITEM_COMPARE_NE (not equal)\n - RTE_FLOW_ITEM_COMPARE_LT (less than)\n - RTE_FLOW_ITEM_COMPARE_LE (less than or equal)\n - RTE_FLOW_ITEM_COMPARE_GT (great than)\n - RTE_FLOW_ITEM_COMPARE_GE (great than or equal)\n\nA sample for create the comparison flow:\nflow pattern_template 0 create ingress pattern_template_id 1 template \\\n\tcompare op mask le a_type mask tag a_tag_index mask 1 b_type \\\n\tmask tag b_tag_index mask 2 width mask 0xffffffff / end\nflow actions_template 0 create ingress actions_template_id 1 template \\\n\tcount / drop / end mask count / drop  / end\nflow template_table 0 create table_id 1 group 2 priority 1  ingress \\\n\trules_number 1 pattern_template 1 actions_template 1\nflow queue 0 create 0 template_table 1 pattern_template 0 \\\n\tactions_template 0 postpone no pattern compare op is le \\\n\ta_type is tag a_tag_index is 1 b_type is tag b_tag_index is 2 \\\n\twidth is 32 / end actions count / drop / end\n\nSigned-off-by: Suanming Mou <suanmingm@nvidia.com>\nAcked-by: Ori Kam <orika@nvidia.com>\nAcked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>\n---\n app/test-pmd/cmdline_flow.c                 | 394 ++++++++++++++++++++\n doc/guides/nics/features/default.ini        |   1 +\n doc/guides/prog_guide/rte_flow.rst          |   7 +\n doc/guides/rel_notes/release_24_03.rst      |   5 +\n doc/guides/testpmd_app_ug/testpmd_funcs.rst |  24 ++\n lib/ethdev/rte_flow.c                       |   1 +\n lib/ethdev/rte_flow.h                       |  40 +-\n 7 files changed, 470 insertions(+), 2 deletions(-)",
    "diff": "diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c\nindex 35030b5c47..06f8c82342 100644\n--- a/app/test-pmd/cmdline_flow.c\n+++ b/app/test-pmd/cmdline_flow.c\n@@ -545,6 +545,28 @@ enum index {\n \tITEM_PTYPE,\n \tITEM_PTYPE_VALUE,\n \tITEM_NSH,\n+\tITEM_COMPARE,\n+\tITEM_COMPARE_OP,\n+\tITEM_COMPARE_OP_VALUE,\n+\tITEM_COMPARE_FIELD_A_TYPE,\n+\tITEM_COMPARE_FIELD_A_TYPE_VALUE,\n+\tITEM_COMPARE_FIELD_A_LEVEL,\n+\tITEM_COMPARE_FIELD_A_LEVEL_VALUE,\n+\tITEM_COMPARE_FIELD_A_TAG_INDEX,\n+\tITEM_COMPARE_FIELD_A_TYPE_ID,\n+\tITEM_COMPARE_FIELD_A_CLASS_ID,\n+\tITEM_COMPARE_FIELD_A_OFFSET,\n+\tITEM_COMPARE_FIELD_B_TYPE,\n+\tITEM_COMPARE_FIELD_B_TYPE_VALUE,\n+\tITEM_COMPARE_FIELD_B_LEVEL,\n+\tITEM_COMPARE_FIELD_B_LEVEL_VALUE,\n+\tITEM_COMPARE_FIELD_B_TAG_INDEX,\n+\tITEM_COMPARE_FIELD_B_TYPE_ID,\n+\tITEM_COMPARE_FIELD_B_CLASS_ID,\n+\tITEM_COMPARE_FIELD_B_OFFSET,\n+\tITEM_COMPARE_FIELD_B_VALUE,\n+\tITEM_COMPARE_FIELD_B_POINTER,\n+\tITEM_COMPARE_FIELD_WIDTH,\n \n \t/* Validate/create actions. */\n \tACTIONS,\n@@ -744,6 +766,10 @@ enum index {\n #define ITEM_RAW_SIZE \\\n \t(sizeof(struct rte_flow_item_raw) + ITEM_RAW_PATTERN_SIZE)\n \n+static const char *const compare_ops[] = {\n+\t\"eq\", \"ne\", \"lt\", \"le\", \"gt\", \"ge\", NULL\n+};\n+\n /** Maximum size for external pattern in struct rte_flow_field_data. */\n #define FLOW_FIELD_PATTERN_SIZE 32\n \n@@ -1596,6 +1622,7 @@ static const enum index next_item[] = {\n \tITEM_IB_BTH,\n \tITEM_PTYPE,\n \tITEM_NSH,\n+\tITEM_COMPARE,\n \tEND_SET,\n \tZERO,\n };\n@@ -2133,6 +2160,38 @@ static const enum index item_nsh[] = {\n \tZERO,\n };\n \n+static const enum index item_compare_field[] = {\n+\tITEM_COMPARE_OP,\n+\tITEM_COMPARE_FIELD_A_TYPE,\n+\tITEM_COMPARE_FIELD_B_TYPE,\n+\tITEM_NEXT,\n+\tZERO,\n+};\n+\n+static const enum index compare_field_a[] = {\n+\tITEM_COMPARE_FIELD_A_TYPE,\n+\tITEM_COMPARE_FIELD_A_LEVEL,\n+\tITEM_COMPARE_FIELD_A_TAG_INDEX,\n+\tITEM_COMPARE_FIELD_A_TYPE_ID,\n+\tITEM_COMPARE_FIELD_A_CLASS_ID,\n+\tITEM_COMPARE_FIELD_A_OFFSET,\n+\tITEM_COMPARE_FIELD_B_TYPE,\n+\tZERO,\n+};\n+\n+static const enum index compare_field_b[] = {\n+\tITEM_COMPARE_FIELD_B_TYPE,\n+\tITEM_COMPARE_FIELD_B_LEVEL,\n+\tITEM_COMPARE_FIELD_B_TAG_INDEX,\n+\tITEM_COMPARE_FIELD_B_TYPE_ID,\n+\tITEM_COMPARE_FIELD_B_CLASS_ID,\n+\tITEM_COMPARE_FIELD_B_OFFSET,\n+\tITEM_COMPARE_FIELD_B_VALUE,\n+\tITEM_COMPARE_FIELD_B_POINTER,\n+\tITEM_COMPARE_FIELD_WIDTH,\n+\tZERO,\n+};\n+\n static const enum index next_action[] = {\n \tACTION_END,\n \tACTION_VOID,\n@@ -2882,6 +2941,24 @@ comp_quota_update_name(struct context *ctx, const struct token *token,\n static int\n comp_qu_mode_name(struct context *ctx, const struct token *token,\n \t\t  unsigned int ent, char *buf, unsigned int size);\n+static int\n+comp_set_compare_field_id(struct context *ctx, const struct token *token,\n+\t\t\t  unsigned int ent, char *buf, unsigned int size);\n+static int\n+comp_set_compare_op(struct context *ctx, const struct token *token,\n+\t\t    unsigned int ent, char *buf, unsigned int size);\n+static int\n+parse_vc_compare_op(struct context *ctx, const struct token *token,\n+\t\t\t const char *str, unsigned int len, void *buf,\n+\t\t\t unsigned int size);\n+static int\n+parse_vc_compare_field_id(struct context *ctx, const struct token *token,\n+\t\t\t  const char *str, unsigned int len, void *buf,\n+\t\t\t  unsigned int size);\n+static int\n+parse_vc_compare_field_level(struct context *ctx, const struct token *token,\n+\t\t\t     const char *str, unsigned int len, void *buf,\n+\t\t\t     unsigned int size);\n \n struct indlst_conf {\n \tuint32_t id;\n@@ -6016,6 +6093,174 @@ static const struct token token_list[] = {\n \t\t.next = NEXT(item_nsh),\n \t\t.call = parse_vc,\n \t},\n+\t[ITEM_COMPARE] = {\n+\t\t.name = \"compare\",\n+\t\t.help = \"match with the comparison result\",\n+\t\t.priv = PRIV_ITEM(COMPARE, sizeof(struct rte_flow_item_compare)),\n+\t\t.next = NEXT(NEXT_ENTRY(ITEM_COMPARE_OP)),\n+\t\t.call = parse_vc,\n+\t},\n+\t[ITEM_COMPARE_OP] = {\n+\t\t.name = \"op\",\n+\t\t.help = \"operation type\",\n+\t\t.next = NEXT(item_compare_field,\n+\t\t\tNEXT_ENTRY(ITEM_COMPARE_OP_VALUE), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, operation)),\n+\t},\n+\t[ITEM_COMPARE_OP_VALUE] = {\n+\t\t.name = \"{operation}\",\n+\t\t.help = \"operation type value\",\n+\t\t.call = parse_vc_compare_op,\n+\t\t.comp = comp_set_compare_op,\n+\t},\n+\t[ITEM_COMPARE_FIELD_A_TYPE] = {\n+\t\t.name = \"a_type\",\n+\t\t.help = \"compared field type\",\n+\t\t.next = NEXT(compare_field_a,\n+\t\t\tNEXT_ENTRY(ITEM_COMPARE_FIELD_A_TYPE_VALUE), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, a.field)),\n+\t},\n+\t[ITEM_COMPARE_FIELD_A_TYPE_VALUE] = {\n+\t\t.name = \"{a_type}\",\n+\t\t.help = \"compared field type value\",\n+\t\t.call = parse_vc_compare_field_id,\n+\t\t.comp = comp_set_compare_field_id,\n+\t},\n+\t[ITEM_COMPARE_FIELD_A_LEVEL] = {\n+\t\t.name = \"a_level\",\n+\t\t.help = \"compared field level\",\n+\t\t.next = NEXT(compare_field_a,\n+\t\t\t     NEXT_ENTRY(ITEM_COMPARE_FIELD_A_LEVEL_VALUE), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare, a.level)),\n+\t},\n+\t[ITEM_COMPARE_FIELD_A_LEVEL_VALUE] = {\n+\t\t.name = \"{a_level}\",\n+\t\t.help = \"compared field level value\",\n+\t\t.call = parse_vc_compare_field_level,\n+\t\t.comp = comp_none,\n+\t},\n+\t[ITEM_COMPARE_FIELD_A_TAG_INDEX] = {\n+\t\t.name = \"a_tag_index\",\n+\t\t.help = \"compared field tag array\",\n+\t\t.next = NEXT(compare_field_a,\n+\t\t\t     NEXT_ENTRY(COMMON_UNSIGNED), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare,\n+\t\t\t\t\ta.tag_index)),\n+\t},\n+\t[ITEM_COMPARE_FIELD_A_TYPE_ID] = {\n+\t\t.name = \"a_type_id\",\n+\t\t.help = \"compared field type ID\",\n+\t\t.next = NEXT(compare_field_a,\n+\t\t\t     NEXT_ENTRY(COMMON_UNSIGNED), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare,\n+\t\t\t\t\ta.type)),\n+\t},\n+\t[ITEM_COMPARE_FIELD_A_CLASS_ID] = {\n+\t\t.name = \"a_class\",\n+\t\t.help = \"compared field class ID\",\n+\t\t.next = NEXT(compare_field_a,\n+\t\t\t     NEXT_ENTRY(COMMON_UNSIGNED), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_compare,\n+\t\t\t\t\t     a.class_id)),\n+\t},\n+\t[ITEM_COMPARE_FIELD_A_OFFSET] = {\n+\t\t.name = \"a_offset\",\n+\t\t.help = \"compared field bit offset\",\n+\t\t.next = NEXT(compare_field_a,\n+\t\t\t     NEXT_ENTRY(COMMON_UNSIGNED), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare,\n+\t\t\t\t\ta.offset)),\n+\t},\n+\t[ITEM_COMPARE_FIELD_B_TYPE] = {\n+\t\t.name = \"b_type\",\n+\t\t.help = \"comparator field type\",\n+\t\t.next = NEXT(compare_field_b,\n+\t\t\tNEXT_ENTRY(ITEM_COMPARE_FIELD_B_TYPE_VALUE), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare,\n+\t\t\t\t\tb.field)),\n+\t},\n+\t[ITEM_COMPARE_FIELD_B_TYPE_VALUE] = {\n+\t\t.name = \"{b_type}\",\n+\t\t.help = \"comparator field type value\",\n+\t\t.call = parse_vc_compare_field_id,\n+\t\t.comp = comp_set_compare_field_id,\n+\t},\n+\t[ITEM_COMPARE_FIELD_B_LEVEL] = {\n+\t\t.name = \"b_level\",\n+\t\t.help = \"comparator field level\",\n+\t\t.next = NEXT(compare_field_b,\n+\t\t\t     NEXT_ENTRY(ITEM_COMPARE_FIELD_B_LEVEL_VALUE), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare,\n+\t\t\t\t\tb.level)),\n+\t},\n+\t[ITEM_COMPARE_FIELD_B_LEVEL_VALUE] = {\n+\t\t.name = \"{b_level}\",\n+\t\t.help = \"comparator field level value\",\n+\t\t.call = parse_vc_compare_field_level,\n+\t\t.comp = comp_none,\n+\t},\n+\t[ITEM_COMPARE_FIELD_B_TAG_INDEX] = {\n+\t\t.name = \"b_tag_index\",\n+\t\t.help = \"comparator field tag array\",\n+\t\t.next = NEXT(compare_field_b,\n+\t\t\t     NEXT_ENTRY(COMMON_UNSIGNED), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare,\n+\t\t\t\t\tb.tag_index)),\n+\t},\n+\t[ITEM_COMPARE_FIELD_B_TYPE_ID] = {\n+\t\t.name = \"b_type_id\",\n+\t\t.help = \"comparator field type ID\",\n+\t\t.next = NEXT(compare_field_b,\n+\t\t\t     NEXT_ENTRY(COMMON_UNSIGNED), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare,\n+\t\t\t\t\tb.type)),\n+\t},\n+\t[ITEM_COMPARE_FIELD_B_CLASS_ID] = {\n+\t\t.name = \"b_class\",\n+\t\t.help = \"comparator field class ID\",\n+\t\t.next = NEXT(compare_field_b,\n+\t\t\t     NEXT_ENTRY(COMMON_UNSIGNED), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_compare,\n+\t\t\t\t\t     b.class_id)),\n+\t},\n+\t[ITEM_COMPARE_FIELD_B_OFFSET] = {\n+\t\t.name = \"b_offset\",\n+\t\t.help = \"comparator field bit offset\",\n+\t\t.next = NEXT(compare_field_b,\n+\t\t\t     NEXT_ENTRY(COMMON_UNSIGNED), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare,\n+\t\t\t\t\tb.offset)),\n+\t},\n+\t[ITEM_COMPARE_FIELD_B_VALUE] = {\n+\t\t.name = \"b_value\",\n+\t\t.help = \"comparator immediate value\",\n+\t\t.next = NEXT(compare_field_b,\n+\t\t\t     NEXT_ENTRY(COMMON_HEX), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY_ARB(0, 0),\n+\t\t\t     ARGS_ENTRY_ARB(0, 0),\n+\t\t\t     ARGS_ENTRY(struct rte_flow_item_compare,\n+\t\t\t\t\tb.value)),\n+\t},\n+\t[ITEM_COMPARE_FIELD_B_POINTER] = {\n+\t\t.name = \"b_ptr\",\n+\t\t.help = \"pointer to comparator immediate value\",\n+\t\t.next = NEXT(compare_field_b,\n+\t\t\t     NEXT_ENTRY(COMMON_HEX), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare,\n+\t\t\t\t\tb.pvalue),\n+\t\t\t     ARGS_ENTRY_ARB(0, 0),\n+\t\t\t     ARGS_ENTRY_ARB\n+\t\t\t\t(sizeof(struct rte_flow_item_compare),\n+\t\t\t\t FLOW_FIELD_PATTERN_SIZE)),\n+\t},\n+\t[ITEM_COMPARE_FIELD_WIDTH] = {\n+\t\t.name = \"width\",\n+\t\t.help = \"number of bits to compare\",\n+\t\t.next = NEXT(item_compare_field,\n+\t\t\tNEXT_ENTRY(COMMON_UNSIGNED), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY(struct rte_flow_item_compare,\n+\t\t\t\t\twidth)),\n+\t},\n \n \t/* Validate/create actions. */\n \t[ACTIONS] = {\n@@ -8452,6 +8697,122 @@ parse_vc_item_l2tpv2_type(struct context *ctx, const struct token *token,\n \treturn len;\n }\n \n+/** Parse operation for compare match item. */\n+static int\n+parse_vc_compare_op(struct context *ctx, const struct token *token,\n+\t\t\t const char *str, unsigned int len, void *buf,\n+\t\t\t unsigned int size)\n+{\n+\tstruct rte_flow_item_compare *compare_item;\n+\tunsigned int i;\n+\n+\t(void)token;\n+\t(void)buf;\n+\t(void)size;\n+\tif (ctx->curr != ITEM_COMPARE_OP_VALUE)\n+\t\treturn -1;\n+\tfor (i = 0; compare_ops[i]; ++i)\n+\t\tif (!strcmp_partial(compare_ops[i], str, len))\n+\t\t\tbreak;\n+\tif (!compare_ops[i])\n+\t\treturn -1;\n+\tif (!ctx->object)\n+\t\treturn len;\n+\tcompare_item = ctx->object;\n+\tcompare_item->operation = (enum rte_flow_item_compare_op)i;\n+\treturn len;\n+}\n+\n+/** Parse id for compare match item. */\n+static int\n+parse_vc_compare_field_id(struct context *ctx, const struct token *token,\n+\t\t\t  const char *str, unsigned int len, void *buf,\n+\t\t\t  unsigned int size)\n+{\n+\tstruct rte_flow_item_compare *compare_item;\n+\tunsigned int i;\n+\n+\t(void)token;\n+\t(void)buf;\n+\t(void)size;\n+\tif (ctx->curr != ITEM_COMPARE_FIELD_A_TYPE_VALUE &&\n+\t\tctx->curr != ITEM_COMPARE_FIELD_B_TYPE_VALUE)\n+\t\treturn -1;\n+\tfor (i = 0; flow_field_ids[i]; ++i)\n+\t\tif (!strcmp_partial(flow_field_ids[i], str, len))\n+\t\t\tbreak;\n+\tif (!flow_field_ids[i])\n+\t\treturn -1;\n+\tif (!ctx->object)\n+\t\treturn len;\n+\tcompare_item = ctx->object;\n+\tif (ctx->curr == ITEM_COMPARE_FIELD_A_TYPE_VALUE)\n+\t\tcompare_item->a.field = (enum rte_flow_field_id)i;\n+\telse\n+\t\tcompare_item->b.field = (enum rte_flow_field_id)i;\n+\treturn len;\n+}\n+\n+/** Parse level for compare match item. */\n+static int\n+parse_vc_compare_field_level(struct context *ctx, const struct token *token,\n+\t\t\t     const char *str, unsigned int len, void *buf,\n+\t\t\t     unsigned int size)\n+{\n+\tstruct rte_flow_item_compare *compare_item;\n+\tstruct flex_item *fp = NULL;\n+\tuint32_t val;\n+\tstruct buffer *out = buf;\n+\tchar *end;\n+\n+\t(void)token;\n+\t(void)size;\n+\tif (ctx->curr != ITEM_COMPARE_FIELD_A_LEVEL_VALUE &&\n+\t\tctx->curr != ITEM_COMPARE_FIELD_B_LEVEL_VALUE)\n+\t\treturn -1;\n+\tif (!ctx->object)\n+\t\treturn len;\n+\tcompare_item = ctx->object;\n+\terrno = 0;\n+\tval = strtoumax(str, &end, 0);\n+\tif (errno || (size_t)(end - str) != len)\n+\t\treturn -1;\n+\t/* No need to validate action template mask value */\n+\tif (out->args.vc.masks) {\n+\t\tif (ctx->curr == ITEM_COMPARE_FIELD_A_LEVEL_VALUE)\n+\t\t\tcompare_item->a.level = val;\n+\t\telse\n+\t\t\tcompare_item->b.level = val;\n+\t\treturn len;\n+\t}\n+\tif ((ctx->curr == ITEM_COMPARE_FIELD_A_LEVEL_VALUE &&\n+\t\tcompare_item->a.field == RTE_FLOW_FIELD_FLEX_ITEM) ||\n+\t\t(ctx->curr == ITEM_COMPARE_FIELD_B_LEVEL_VALUE &&\n+\t\tcompare_item->b.field == RTE_FLOW_FIELD_FLEX_ITEM)) {\n+\t\tif (val >= FLEX_MAX_PARSERS_NUM) {\n+\t\t\tprintf(\"Bad flex item handle\\n\");\n+\t\t\treturn -1;\n+\t\t}\n+\t\tfp = flex_items[ctx->port][val];\n+\t\tif (!fp) {\n+\t\t\tprintf(\"Bad flex item handle\\n\");\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\tif (ctx->curr == ITEM_COMPARE_FIELD_A_LEVEL_VALUE) {\n+\t\tif (compare_item->a.field != RTE_FLOW_FIELD_FLEX_ITEM)\n+\t\t\tcompare_item->a.level = val;\n+\t\telse\n+\t\t\tcompare_item->a.flex_handle = fp->flex_handle;\n+\t} else if (ctx->curr == ITEM_COMPARE_FIELD_B_LEVEL_VALUE) {\n+\t\tif (compare_item->b.field != RTE_FLOW_FIELD_FLEX_ITEM)\n+\t\t\tcompare_item->b.level = val;\n+\t\telse\n+\t\t\tcompare_item->b.flex_handle = fp->flex_handle;\n+\t}\n+\treturn len;\n+}\n+\n /** Parse meter color action type. */\n static int\n parse_vc_action_meter_color_type(struct context *ctx, const struct token *token,\n@@ -11938,6 +12299,39 @@ comp_rule_id(struct context *ctx, const struct token *token,\n \treturn i;\n }\n \n+/** Complete operation for compare match item. */\n+static int\n+comp_set_compare_op(struct context *ctx, const struct token *token,\n+\t\t    unsigned int ent, char *buf, unsigned int size)\n+{\n+\tRTE_SET_USED(ctx);\n+\tRTE_SET_USED(token);\n+\tif (!buf)\n+\t\treturn RTE_DIM(compare_ops);\n+\tif (ent < RTE_DIM(compare_ops) - 1)\n+\t\treturn strlcpy(buf, compare_ops[ent], size);\n+\treturn -1;\n+}\n+\n+/** Complete field id for compare match item. */\n+static int\n+comp_set_compare_field_id(struct context *ctx, const struct token *token,\n+\t\t\t  unsigned int ent, char *buf, unsigned int size)\n+{\n+\tconst char *name;\n+\n+\tRTE_SET_USED(token);\n+\tif (!buf)\n+\t\treturn RTE_DIM(flow_field_ids);\n+\tif (ent >= RTE_DIM(flow_field_ids) - 1)\n+\t\treturn -1;\n+\tname = flow_field_ids[ent];\n+\tif (ctx->curr == ITEM_COMPARE_FIELD_B_TYPE ||\n+\t    (strcmp(name, \"pointer\") && strcmp(name, \"value\")))\n+\t\treturn strlcpy(buf, name, size);\n+\treturn -1;\n+}\n+\n /** Complete type field for RSS action. */\n static int\n comp_vc_action_rss_type(struct context *ctx, const struct token *token,\ndiff --git a/doc/guides/nics/features/default.ini b/doc/guides/nics/features/default.ini\nindex a21168ba21..2488942db6 100644\n--- a/doc/guides/nics/features/default.ini\n+++ b/doc/guides/nics/features/default.ini\n@@ -88,6 +88,7 @@ aggr_affinity        =\n ah                   =\n any                  =\n arp_eth_ipv4         =\n+compare              =\n conntrack            =\n ecpri                =\n esp                  =\ndiff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst\nindex 9192d6ab01..34dc06ec66 100644\n--- a/doc/guides/prog_guide/rte_flow.rst\n+++ b/doc/guides/prog_guide/rte_flow.rst\n@@ -1587,6 +1587,13 @@ the packet.\n \n - ``value``: Specific value to match.\n \n+Item: ``COMPARE``\n+^^^^^^^^^^^^^^^^^\n+\n+Matches the comparison result between packet fields or value.\n+\n+- ``compare``: Comparison information.\n+\n Actions\n ~~~~~~~\n \ndiff --git a/doc/guides/rel_notes/release_24_03.rst b/doc/guides/rel_notes/release_24_03.rst\nindex 222a091e8b..59eda27606 100644\n--- a/doc/guides/rel_notes/release_24_03.rst\n+++ b/doc/guides/rel_notes/release_24_03.rst\n@@ -70,6 +70,11 @@ New Features\n   * Added a fath path function ``rte_eth_tx_queue_count`` to get the number of used\n     descriptors of a Tx queue.\n \n+* **Added flow matching with various comparison results.**\n+\n+  Added ``RTE_FLOW_ITEM_TYPE_COMPARE`` to allow matching on comparison\n+  result between packet fields or value.\n+\n * **Updated Atomic Rules' Arkville PMD.**\n \n   * Added support for Atomic Rules' TK242 packet-capture family of devices\ndiff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst\nindex 0eaccbea4b..53923ad7cc 100644\n--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst\n+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst\n@@ -3856,6 +3856,13 @@ This section lists supported pattern items and their attributes, if any.\n \n         - ``packet_type {unsigned}``: packet type.\n \n+- ``compare``: match the comparison result between packet fields or value.\n+\n+        - ``op {string}``: comparison operation type.\n+        - ``a_type {string}``: compared field.\n+        - ``b_type {string}``: comparator field.\n+        - ``width {unsigned}``: comparison width.\n+\n \n Actions list\n ^^^^^^^^^^^^\n@@ -5324,6 +5331,23 @@ A RAW rule can be created as following using ``pattern_hex`` key and mask.\n              pattern_hex mask 0000000000000000000000000000000000000000000000000000ffffffff / end actions\n              queue index 4 / end\n \n+Sample match with comparison rule\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+Match with comparison rule can be created as following using ``compare``.\n+\n+::\n+\n+    testpmd> flow pattern_template 0 create ingress pattern_template_id 1 template compare op mask le\n+             a_type mask tag a_tag_index mask 1 b_type mask tag b_tag_index mask 2 width mask 0xffffffff / end\n+    testpmd> flow actions_template 0 create ingress actions_template_id 1 template count / drop / end\n+             mask count / drop  / end\n+    testpmd> flow template_table 0 create table_id 1 group 2 priority 1  ingress rules_number 1\n+             pattern_template 1 actions_template 1\n+    testpmd> flow queue 0 create 0 template_table 1 pattern_template 0 actions_template 0 postpone no\n+             pattern compare op is le a_type is tag a_tag_index is 1 b_type is tag b_tag_index is 2 width is 32 / end\n+\t     actions count / drop / end\n+\n BPF Functions\n --------------\n \ndiff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c\nindex 156545454c..b06da0cc00 100644\n--- a/lib/ethdev/rte_flow.c\n+++ b/lib/ethdev/rte_flow.c\n@@ -170,6 +170,7 @@ static const struct rte_flow_desc_data rte_flow_desc_item[] = {\n \tMK_FLOW_ITEM(TX_QUEUE, sizeof(struct rte_flow_item_tx_queue)),\n \tMK_FLOW_ITEM(IB_BTH, sizeof(struct rte_flow_item_ib_bth)),\n \tMK_FLOW_ITEM(PTYPE, sizeof(struct rte_flow_item_ptype)),\n+\tMK_FLOW_ITEM(COMPARE, sizeof(struct rte_flow_item_compare)),\n };\n \n /** Generate flow_action[] entry. */\ndiff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h\nindex 958eb01a80..09c1b13381 100644\n--- a/lib/ethdev/rte_flow.h\n+++ b/lib/ethdev/rte_flow.h\n@@ -714,6 +714,13 @@ enum rte_flow_item_type {\n \t * @see struct rte_flow_item_random.\n \t */\n \tRTE_FLOW_ITEM_TYPE_RANDOM,\n+\n+\t/**\n+\t * Match packet with various comparison types.\n+\t *\n+\t * See struct rte_flow_item_compare.\n+\t */\n+\tRTE_FLOW_ITEM_TYPE_COMPARE,\n };\n \n /**\n@@ -2366,7 +2373,8 @@ static const struct rte_flow_item_ptype rte_flow_item_ptype_mask = {\n #endif\n \n /**\n- * Packet header field IDs, used by RTE_FLOW_ACTION_TYPE_MODIFY_FIELD.\n+ * Packet header field IDs, used by RTE_FLOW_ACTION_TYPE_MODIFY_FIELD\n+ * and RTE_FLOW_ITEM_TYPE_COMPARE.\n  */\n enum rte_flow_field_id {\n \tRTE_FLOW_FIELD_START = 0,       /**< Start of a packet. */\n@@ -2420,7 +2428,8 @@ enum rte_flow_field_id {\n  * @warning\n  * @b EXPERIMENTAL: this structure may change without prior notice\n  *\n- * Packet header field descriptions, used by RTE_FLOW_ACTION_TYPE_MODIFY_FIELD.\n+ * Packet header field descriptions, used by RTE_FLOW_ACTION_TYPE_MODIFY_FIELD\n+ * and RTE_FLOW_ITEM_TYPE_COMPARE.\n  */\n struct rte_flow_field_data {\n \tenum rte_flow_field_id field; /**< Field or memory type ID. */\n@@ -2510,6 +2519,33 @@ struct rte_flow_field_data {\n \t};\n };\n \n+/**\n+ * Expected operation types for compare item.\n+ */\n+enum rte_flow_item_compare_op {\n+\tRTE_FLOW_ITEM_COMPARE_EQ,\t/* Compare result equal. */\n+\tRTE_FLOW_ITEM_COMPARE_NE,\t/* Compare result not equal. */\n+\tRTE_FLOW_ITEM_COMPARE_LT,\t/* Compare result less than. */\n+\tRTE_FLOW_ITEM_COMPARE_LE,\t/* Compare result less than or equal. */\n+\tRTE_FLOW_ITEM_COMPARE_GT,\t/* Compare result great than. */\n+\tRTE_FLOW_ITEM_COMPARE_GE,\t/* Compare result great than or equal. */\n+};\n+\n+/**\n+ *\n+ * RTE_FLOW_ITEM_TYPE_COMPARE\n+ *\n+ * Matches the packet with compare result.\n+ *\n+ * The operation means a compare with b result.\n+ */\n+struct rte_flow_item_compare {\n+\tenum rte_flow_item_compare_op operation; /* The compare operation. */\n+\tstruct rte_flow_field_data a;\t\t /* Field be compared.  */\n+\tstruct rte_flow_field_data b;\t\t /* Field as comparator. */\n+\tuint32_t width;\t\t\t\t /* Compare width. */\n+};\n+\n /**\n  * Action types.\n  *\n",
    "prefixes": [
        "v7",
        "3/4"
    ]
}