From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124])
	by inbox.dpdk.org (Postfix) with ESMTP id A0B6F42BDA;
	Tue, 30 May 2023 05:06:56 +0200 (CEST)
Received: from mails.dpdk.org (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id 29B8F40F18;
	Tue, 30 May 2023 05:06:56 +0200 (CEST)
Received: from NAM12-DM6-obe.outbound.protection.outlook.com
 (mail-dm6nam12on2057.outbound.protection.outlook.com [40.107.243.57])
 by mails.dpdk.org (Postfix) with ESMTP id CB432406BC
 for <dev@dpdk.org>; Tue, 30 May 2023 05:06:54 +0200 (CEST)
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;
 b=lM+vlEYsQfwHm24ZP1P0l8m4HvnTKDtwuTHVU5EYIIyIJRHdWZdauBqJDfXV8vdC/LV8NaUdeEa0n6lsjnC5fgaiLyP7NfVua7688XVcuq3ParPCFY+UH9mSXmyv7b3cEEO+SZ6ros3Fe5VViIuolyk2UB6AO8kQsatc62apfnNryz1nB/EMEJUaU2i8xufAEt7WP7Ot3TBHzEntqh2mcYVRRi0fz4RG9BHK4VyO6bQyGOAr5viLgeQif1HtZ1cdP/JeHoACz2Rwm15ikeDZnlrFeaKuURJ2/ClFeq3ylZenV8atwPS6lt2ooiVZHBqJ71IvIsRp1aQopJs8nHW0gg==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; 
 s=arcselector9901;
 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;
 bh=tnxnizUkLVvlpatobU8HKJ3Z6Vsv11DWaGg7ySHC6yE=;
 b=eVfoh5pHNShu05D+PeeVPxpuZAQbMfd1C7zleaZtjsUS9hd6pog9YU6DlkHMHBlAUnSk28gF6SDV4ESF7nlMwt1bSHozocaRLiJBMH+X/pgD3zlCqbCSgpA609e8+wSmHIfbAoTJ88C5PLwDeMtXovvlepJfwZGYX2qfQY7Y2Yc018mZQ4fo6yZNctNbKO0GEI+rTRSdPzHCpiyMI5ummBDcNURvDfHdd0nj8up6h143xgV2Y7FeKjBx2ZuaZN6uwEO6UnEV3pCP+BHLi28ZoSlOhWQ5W7JJZYBHeQSPa7BPiIp/PgvYvTzcw3vyoNrNASohaYg0a82Vl+0f0aYbrg==
ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is
 216.228.117.161) smtp.rcpttodomain=monjalon.net smtp.mailfrom=nvidia.com;
 dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com;
 dkim=none (message not signed); arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com;
 s=selector2;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=tnxnizUkLVvlpatobU8HKJ3Z6Vsv11DWaGg7ySHC6yE=;
 b=lmreNIUlhJ3ZR9dd5gKXvtbtIMWS0lkB7EFGWynago5YlfvOtEQTEoQ7MSEmeQbb4cA+L4Xs9e60+SppRjYx8tUC3dJZt1E8BYkwfu3GeKt9CteRxRKbQ3ScZBzZSeGXUMdJv6g8KS21czymdZGYisNoGBoNnUOH2NX6xvgGBiA/Cg/ibGzX2CJf4GX6QSum0c3iaNEA3WC6OlnqXywTpGi+esU6Pqcj8qlnLaA7Gb/WMhpdlWGjYSNLARWpvyNVnG6n5iymQLjtCx9exwGJhrOETlVV4fq+UFLZ7w873WdEWZrYGus0lSy1GHkMMkkTwTk9IdB0EDro/Jxn3Z8sVA==
Received: from SJ0PR13CA0067.namprd13.prod.outlook.com (2603:10b6:a03:2c4::12)
 by CYYPR12MB8750.namprd12.prod.outlook.com (2603:10b6:930:be::18)
 with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6433.22; Tue, 30 May
 2023 03:06:52 +0000
Received: from CO1NAM11FT115.eop-nam11.prod.protection.outlook.com
 (2603:10b6:a03:2c4:cafe::1d) by SJ0PR13CA0067.outlook.office365.com
 (2603:10b6:a03:2c4::12) with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6455.20 via Frontend
 Transport; Tue, 30 May 2023 03:06:52 +0000
X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161)
 smtp.mailfrom=nvidia.com;
 dkim=none (message not signed)
 header.d=none;dmarc=pass action=none header.from=nvidia.com;
Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates
 216.228.117.161 as permitted sender) receiver=protection.outlook.com;
 client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C
Received: from mail.nvidia.com (216.228.117.161) by
 CO1NAM11FT115.mail.protection.outlook.com (10.13.174.211) with Microsoft SMTP
 Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
 15.20.6455.22 via Frontend Transport; Tue, 30 May 2023 03:06:52 +0000
Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com
 (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.5; Mon, 29 May 2023
 20:06:34 -0700
Received: from nvidia.com (10.126.230.35) by rnnvmail201.nvidia.com
 (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.37; Mon, 29 May
 2023 20:06:31 -0700
From: Dong Zhou <dongzhou@nvidia.com>
To: <orika@nvidia.com>, <thomas@monjalon.net>, Aman Singh
 <aman.deep.singh@intel.com>, Yuying Zhang <yuying.zhang@intel.com>, "Ferruh
 Yigit" <ferruh.yigit@amd.com>, Andrew Rybchenko
 <andrew.rybchenko@oktetlabs.ru>, Olivier Matz <olivier.matz@6wind.com>
CC: <dev@dpdk.org>
Subject: [PATCH v4] ethdev: add flow item for RoCE infiniband BTH
Date: Tue, 30 May 2023 06:06:19 +0300
Message-ID: <20230530030620.2935042-1-dongzhou@nvidia.com>
X-Mailer: git-send-email 2.27.0
In-Reply-To: <20230525074041.2370704-1-dongzhou@nvidia.com>
References: <20230525074041.2370704-1-dongzhou@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
 rnnvmail201.nvidia.com (10.129.68.8)
X-EOPAttributedMessage: 0
X-MS-PublicTrafficType: Email
X-MS-TrafficTypeDiagnostic: CO1NAM11FT115:EE_|CYYPR12MB8750:EE_
X-MS-Office365-Filtering-Correlation-Id: f65f5c8a-67d3-4a24-56af-08db60baeac9
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: BLZPr65JpI+HW+neGAGWLeRvXROVrXdv9nXyHW2eDLlmPMkdfI6RDkeTYq6Zd835jxM2XyGp4x4DxUh4mlg46iTeAGh9FBx950wHtgHgyC5mgmGvKjGGyRDcGJGvArLeX6JKRjOz2oSx+/tUS9juRW+JkhyePzk74+RBPl73vu+NrTWVdmyzqIsDT90jX+YvzWmDv86YZ9uG75b8of7JJoT6rxvyAigIK1k8qTCQGNAg6jKtmS5+t/0vBm1BJJzbi8OpvTIL0zC0RkGHhHU+CVTPGKbtSM9Es+E+0jEwIt4rvrFiPSYRzLSn0YgVIjissCI09idV/+3hfNMCEfJ8UgF2uEtbGTFOX3j4IcKu1o4XR7xJn8rZKED2+yiSm60N0k7j1h9c7Pw7pZ4TD7GuzS9Jt3S+tKeaEIXVZBH/KpOYyTc4ay2t6OCJoxDHWqAolMZZcOMEQFuxrhQ4d9Cor89Qtm648iOg/e+NDs+iQ7jZm5jv9IGdVZzadLsW8APps0Jy0/IgjZv6YNdaD0+b+EqzqjE/gqJ49fwpzrHWofNueT22ea+La073zMpS1LqTp3WA2JktK7I99lvA43WyhT4sNBrH5P5LX2P/8kqnAcNjO42gCT8Irm72x48LO+8yaY8tJUq7cJFNSalHN6sfN9gCaD6PRvhTYL/uA99bYYReR6qVqubpAf0+WDA+HYjkAb1eGoZnG64comG30wlvW879lkkpqShXsB5rbYTA2R5M0HO5xfmEBXBhR/6qF1bU
X-Forefront-Antispam-Report: CIP:216.228.117.161; CTRY:US; LANG:en; SCL:1; SRV:;
 IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge2.nvidia.com; CAT:NONE;
 SFS:(13230028)(4636009)(39860400002)(136003)(376002)(396003)(346002)(451199021)(40470700004)(46966006)(36840700001)(478600001)(110136005)(40460700003)(5660300002)(8676002)(8936002)(30864003)(2906002)(86362001)(36756003)(82310400005)(70206006)(70586007)(4326008)(356005)(82740400003)(7636003)(316002)(40480700001)(55016003)(41300700001)(16526019)(6286002)(186003)(26005)(1076003)(36860700001)(47076005)(66574015)(6666004)(83380400001)(336012)(426003)(7696005)(2616005);
 DIR:OUT; SFP:1101; 
X-OriginatorOrg: Nvidia.com
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2023 03:06:52.0898 (UTC)
X-MS-Exchange-CrossTenant-Network-Message-Id: f65f5c8a-67d3-4a24-56af-08db60baeac9
X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a
X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.117.161];
 Helo=[mail.nvidia.com]
X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT115.eop-nam11.prod.protection.outlook.com
X-MS-Exchange-CrossTenant-AuthAs: Anonymous
X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem
X-MS-Exchange-Transport-CrossTenantHeadersStamped: CYYPR12MB8750
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>,
 <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>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org

IB(InfiniBand) is one type of networking used in high-performance
computing with high throughput and low latency. Like Ethernet,
IB defines a layered protocol (Physical, Link, Network, Transport
Layers). IB provides native support for RDMA(Remote DMA), an
extension of the DMA that allows direct access to remote host
memory without CPU intervention. IB network requires NICs and
switches to support the IB protocol.

RoCE(RDMA over Converged Ethernet) is a network protocol that
allows RDMA to run on Ethernet. RoCE encapsulates IB packets on
Ethernet and has two versions, RoCEv1 and RoCEv2. RoCEv1 is an
Ethernet link layer protocol, IB packets are encapsulated in the
Ethernet layer and use Ethernet type 0x8915. RoCEv2 is an internet
layer protocol, IB packets are encapsulated in UDP payload and
use a destination port 4791, The format of the RoCEv2 packet is
as follows:
  ETH + IP + UDP(dport 4791) + IB(BTH + ExtHDR + PAYLOAD + CRC)

BTH(Base Transport Header) is the IB transport layer header, RoCEv1
and RoCEv2 both contain this header. This patch introduces a new
RTE item to match the IB BTH in RoCE packets. One use of this match
is that the user can monitor RoCEv2's CNP(Congestion Notification
Packet) by matching BTH opcode 0x81.

This patch also adds the testpmd command line to match the RoCEv2
BTH. Usage example:

  testpmd> flow create 0 group 1 ingress pattern
           eth / ipv4 / udp dst is 4791 / ib_bth opcode is 0x81
           dst_qp is 0xd3 / end actions queue index 0 / end

Signed-off-by: Dong Zhou <dongzhou@nvidia.com>
Acked-by: Ori Kam <orika@nvidia.com>
Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>

v2:
 - Change "ethernet" name to "Ethernet" in the commit log.
 - Add "RoCE" and "IB" 2 words to words-case.txt.
 - Add "rte_byteorder.h" header file in "rte_ib.h" to fix compile errors.
 - Add "Acked-by" labels in the first ethdev patch.

v3:
 - Do rebase to fix the patch apply failure.
 - Add "Acked-by" label in the second net/mlx5 patch.

v4:
 - Split this series of patches, only keep the first ethdev patch.
---
 app/test-pmd/cmdline_flow.c                 | 58 +++++++++++++++++
 devtools/words-case.txt                     |  2 +
 doc/guides/nics/features/default.ini        |  1 +
 doc/guides/prog_guide/rte_flow.rst          |  7 +++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  7 +++
 lib/ethdev/rte_flow.c                       |  1 +
 lib/ethdev/rte_flow.h                       | 27 ++++++++
 lib/net/meson.build                         |  1 +
 lib/net/rte_ib.h                            | 70 +++++++++++++++++++++
 9 files changed, 174 insertions(+)
 create mode 100644 lib/net/rte_ib.h

diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index 58939ec321..3ade229ffc 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -496,6 +496,11 @@ enum index {
 	ITEM_QUOTA_STATE_NAME,
 	ITEM_AGGR_AFFINITY,
 	ITEM_AGGR_AFFINITY_VALUE,
+	ITEM_IB_BTH,
+	ITEM_IB_BTH_OPCODE,
+	ITEM_IB_BTH_PKEY,
+	ITEM_IB_BTH_DST_QPN,
+	ITEM_IB_BTH_PSN,
 
 	/* Validate/create actions. */
 	ACTIONS,
@@ -1452,6 +1457,7 @@ static const enum index next_item[] = {
 	ITEM_METER,
 	ITEM_QUOTA,
 	ITEM_AGGR_AFFINITY,
+	ITEM_IB_BTH,
 	END_SET,
 	ZERO,
 };
@@ -1953,6 +1959,15 @@ static const enum index item_aggr_affinity[] = {
 	ZERO,
 };
 
+static const enum index item_ib_bth[] = {
+	ITEM_IB_BTH_OPCODE,
+	ITEM_IB_BTH_PKEY,
+	ITEM_IB_BTH_DST_QPN,
+	ITEM_IB_BTH_PSN,
+	ITEM_NEXT,
+	ZERO,
+};
+
 static const enum index next_action[] = {
 	ACTION_END,
 	ACTION_VOID,
@@ -5523,6 +5538,46 @@ static const struct token token_list[] = {
 		.call = parse_quota_state_name,
 		.comp = comp_quota_state_name
 	},
+	[ITEM_IB_BTH] = {
+		.name = "ib_bth",
+		.help = "match ib bth fields",
+		.priv = PRIV_ITEM(IB_BTH,
+				  sizeof(struct rte_flow_item_ib_bth)),
+		.next = NEXT(item_ib_bth),
+		.call = parse_vc,
+	},
+	[ITEM_IB_BTH_OPCODE] = {
+		.name = "opcode",
+		.help = "match ib bth opcode",
+		.next = NEXT(item_ib_bth, NEXT_ENTRY(COMMON_UNSIGNED),
+				 item_param),
+		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ib_bth,
+						 hdr.opcode)),
+	},
+	[ITEM_IB_BTH_PKEY] = {
+		.name = "pkey",
+		.help = "partition key",
+		.next = NEXT(item_ib_bth, NEXT_ENTRY(COMMON_UNSIGNED),
+				 item_param),
+		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ib_bth,
+						 hdr.pkey)),
+	},
+	[ITEM_IB_BTH_DST_QPN] = {
+		.name = "dst_qp",
+		.help = "destination qp",
+		.next = NEXT(item_ib_bth, NEXT_ENTRY(COMMON_UNSIGNED),
+				 item_param),
+		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ib_bth,
+						 hdr.dst_qp)),
+	},
+	[ITEM_IB_BTH_PSN] = {
+		.name = "psn",
+		.help = "packet sequence number",
+		.next = NEXT(item_ib_bth, NEXT_ENTRY(COMMON_UNSIGNED),
+				 item_param),
+		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ib_bth,
+						 hdr.psn)),
+	},
 	/* Validate/create actions. */
 	[ACTIONS] = {
 		.name = "actions",
@@ -11849,6 +11904,9 @@ flow_item_default_mask(const struct rte_flow_item *item)
 	case RTE_FLOW_ITEM_TYPE_AGGR_AFFINITY:
 		mask = &rte_flow_item_aggr_affinity_mask;
 		break;
+	case RTE_FLOW_ITEM_TYPE_IB_BTH:
+		mask = &rte_flow_item_ib_bth_mask;
+		break;
 	default:
 		break;
 	}
diff --git a/devtools/words-case.txt b/devtools/words-case.txt
index 42c7861b68..5bd34e8b88 100644
--- a/devtools/words-case.txt
+++ b/devtools/words-case.txt
@@ -27,6 +27,7 @@ GENEVE
 GTPU
 GUID
 HW
+IB
 ICMP
 ID
 IO
@@ -74,6 +75,7 @@ QinQ
 RDMA
 RETA
 ROC
+RoCE
 RQ
 RSS
 RVU
diff --git a/doc/guides/nics/features/default.ini b/doc/guides/nics/features/default.ini
index 1a5087abad..1738715e26 100644
--- a/doc/guides/nics/features/default.ini
+++ b/doc/guides/nics/features/default.ini
@@ -104,6 +104,7 @@ gtpc                 =
 gtpu                 =
 gtp_psc              =
 higig2               =
+ib_bth               =
 icmp                 =
 icmp6                =
 icmp6_echo_request   =
diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
index 32fc45516a..e2957df71c 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -1551,6 +1551,13 @@ Matches flow quota state set by quota action.
 
 - ``state``: Flow quota state
 
+Item: ``IB_BTH``
+^^^^^^^^^^^^^^^^
+
+Matches an InfiniBand base transport header in RoCE packet.
+
+- ``hdr``: InfiniBand base transport header definition (``rte_ib.h``).
+
 Actions
 ~~~~~~~
 
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 8f23847859..4bad244029 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -3781,6 +3781,13 @@ This section lists supported pattern items and their attributes, if any.
 
 - ``send_to_kernel``: send packets to kernel.
 
+- ``ib_bth``: match InfiniBand BTH(base transport header).
+
+  - ``opcode {unsigned}``: Opcode.
+  - ``pkey {unsigned}``: Partition key.
+  - ``dst_qp {unsigned}``: Destination Queue Pair.
+  - ``psn {unsigned}``: Packet Sequence Number.
+
 
 Actions list
 ^^^^^^^^^^^^
diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c
index 69e6e749f7..6e099deca3 100644
--- a/lib/ethdev/rte_flow.c
+++ b/lib/ethdev/rte_flow.c
@@ -164,6 +164,7 @@ static const struct rte_flow_desc_data rte_flow_desc_item[] = {
 	MK_FLOW_ITEM(IPV6_ROUTING_EXT, sizeof(struct rte_flow_item_ipv6_routing_ext)),
 	MK_FLOW_ITEM(QUOTA, sizeof(struct rte_flow_item_quota)),
 	MK_FLOW_ITEM(AGGR_AFFINITY, sizeof(struct rte_flow_item_aggr_affinity)),
+	MK_FLOW_ITEM(IB_BTH, sizeof(struct rte_flow_item_ib_bth)),
 };
 
 /** Generate flow_action[] entry. */
diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h
index 713ba8b65c..2b7f144c27 100644
--- a/lib/ethdev/rte_flow.h
+++ b/lib/ethdev/rte_flow.h
@@ -38,6 +38,7 @@
 #include <rte_ppp.h>
 #include <rte_gre.h>
 #include <rte_macsec.h>
+#include <rte_ib.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -672,6 +673,13 @@ enum rte_flow_item_type {
 	 * @see struct rte_flow_item_aggr_affinity.
 	 */
 	RTE_FLOW_ITEM_TYPE_AGGR_AFFINITY,
+
+	/**
+	 * Matches an InfiniBand base transport header in RoCE packet.
+	 *
+	 * See struct rte_flow_item_ib_bth.
+	 */
+	RTE_FLOW_ITEM_TYPE_IB_BTH,
 };
 
 /**
@@ -2260,6 +2268,25 @@ rte_flow_item_aggr_affinity_mask = {
 };
 #endif
 
+/**
+ * RTE_FLOW_ITEM_TYPE_IB_BTH.
+ *
+ * Matches an InfiniBand base transport header in RoCE packet.
+ */
+struct rte_flow_item_ib_bth {
+	struct rte_ib_bth hdr; /**< InfiniBand base transport header definition. */
+};
+
+/** Default mask for RTE_FLOW_ITEM_TYPE_IB_BTH. */
+#ifndef __cplusplus
+static const struct rte_flow_item_ib_bth rte_flow_item_ib_bth_mask = {
+	.hdr = {
+		.opcode = 0xff,
+		.dst_qp = "\xff\xff\xff",
+	},
+};
+#endif
+
 /**
  * Action types.
  *
diff --git a/lib/net/meson.build b/lib/net/meson.build
index 379d161ee0..b7a0684101 100644
--- a/lib/net/meson.build
+++ b/lib/net/meson.build
@@ -22,6 +22,7 @@ headers = files(
         'rte_geneve.h',
         'rte_l2tpv2.h',
         'rte_ppp.h',
+        'rte_ib.h',
 )
 
 sources = files(
diff --git a/lib/net/rte_ib.h b/lib/net/rte_ib.h
new file mode 100644
index 0000000000..9eab5f9e15
--- /dev/null
+++ b/lib/net/rte_ib.h
@@ -0,0 +1,70 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2023 NVIDIA Corporation & Affiliates
+ */
+
+#ifndef RTE_IB_H
+#define RTE_IB_H
+
+/**
+ * @file
+ *
+ * InfiniBand headers definitions
+ *
+ * The infiniBand headers are used by RoCE (RDMA over Converged Ethernet).
+ */
+
+#include <stdint.h>
+
+#include <rte_byteorder.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * InfiniBand Base Transport Header according to
+ * IB Specification Vol 1-Release-1.4.
+ */
+__extension__
+struct rte_ib_bth {
+	uint8_t	opcode;		/**< Opcode. */
+#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
+	uint8_t	tver:4;		/**< Transport Header Version. */
+	uint8_t	padcnt:2;	/**< Pad Count. */
+	uint8_t	m:1;		/**< MigReq. */
+	uint8_t	se:1;		/**< Solicited Event. */
+#elif RTE_BYTE_ORDER == RTE_BIG_ENDIAN
+	uint8_t	se:1;		/**< Solicited Event. */
+	uint8_t	m:1;		/**< MigReq. */
+	uint8_t	padcnt:2;	/**< Pad Count. */
+	uint8_t	tver:4;		/**< Transport Header Version. */
+#endif
+	rte_be16_t pkey;	/**< Partition key. */
+#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
+	uint8_t	rsvd0:6;	/**< Reserved. */
+	uint8_t	b:1;		/**< BECN. */
+	uint8_t	f:1;		/**< FECN. */
+#elif RTE_BYTE_ORDER == RTE_BIG_ENDIAN
+	uint8_t	f:1;		/**< FECN. */
+	uint8_t	b:1;		/**< BECN. */
+	uint8_t	rsvd0:6;	/**< Reserved. */
+#endif
+	uint8_t	dst_qp[3];	/**< Destination QP */
+#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
+	uint8_t	rsvd1:7;	/**< Reserved. */
+	uint8_t	a:1;		/**< Acknowledge Request. */
+#elif RTE_BYTE_ORDER == RTE_BIG_ENDIAN
+	uint8_t	a:1;		/**< Acknowledge Request. */
+	uint8_t	rsvd1:7;	/**< Reserved. */
+#endif
+	uint8_t	psn[3];		/**< Packet Sequence Number */
+} __rte_packed;
+
+/** RoCEv2 default port. */
+#define RTE_ROCEV2_DEFAULT_PORT 4791
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RTE_IB_H */
-- 
2.27.0