Skip to contentSkip to conversation

extend VXLAN header to support more extensions

PATCH Superseded Gavin Li 2 participants 4 messages May 17, 2024 – May 23, 2024

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore

Gavin Li

author
#0 lore raw

cover extend VXLAN header to support more extensions

In this patch series, all the VXLAN extension header will be merged with VXLAN as union if the overlapped field has different format among protocols. The existing VXLAN-GPE will be marked as deprecated and new extensions of VXLAN should be added to VXLAN instead of a new RTE item.

RFC
https://patches.dpdk.org/project/dpdk/patch/[email protected]/

PMD changes
https://patches.dpdk.org/project/dpdk/patch/[email protected]/

Gavin Li (2):
net: extend VXLAN header to support more extensions app/testpmd: introduce VXLAN-GBP and VXLAN-GPE fields

 app/test-pmd/cmdline_flow.c                 | 40 ++++++++++++
 doc/guides/rel_notes/deprecation.rst        |  5 ++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  4 ++
 lib/ethdev/rte_flow.h                       | 13 +++-
 lib/net/rte_vxlan.h                         | 69 +++++++++++++++++++--
 5 files changed, 125 insertions(+), 6 deletions(-)
Signature · 1 line
2.34.1
author
#1 lore raw

PATCH 1/2 net: extend VXLAN header to support more extensions

Currently, DPDK supports VXLAN and VXLAN-GPE with similar header structures and we are working on adding support for VXLAN-GBP which is another extension to VXLAN. More extension of VXLAN may be added in the future.

VXLAN and VXLAN-GBP use the same UDP port(4789) while VXLAN-GPE uses a different one, 4790. The three protocols have the same header length and overall similar header structure as below.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |R|R|R|R|I|R|R|R|            Reserved                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                VXLAN Network Identifier (VNI) |   Reserved    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 1: VXLAN Header

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |R|R|Ver|I|P|B|O|       Reserved                |Next Protocol  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                VXLAN Network Identifier (VNI) |   Reserved    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 2: VXLAN-GPE Header

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |G|R|R|R|I|R|R|R|R|D|R|R|A|R|R|R|        Group Policy ID        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          VXLAN Network Identifier (VNI)       |   Reserved    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 3: VXLAN-GBP Extension

Both VXLAN-GPE and VXLAN-GBP extended VXLAN by redefining its reserved bits, which means the packets can be processed with same pattern and most of the code can be reused. Instead of adding more new items by copying/pasting code for the VXLAN extensions in the future, it’s better to use existing VXLAN infrastructure and add support code in it.

In this patch, all the VXLAN extension header will be merged with VXLAN as union if the overlapped field has different format among protocols. The existing VXLAN-GPE will be marked as deprecated and new extensions of VXLAN should be added to VXLAN instead of a new RTE item.

---
 doc/guides/rel_notes/deprecation.rst |  5 ++
 lib/ethdev/rte_flow.h                | 13 +++++-
 lib/net/rte_vxlan.h                  | 69 ++++++++++++++++++++++++++--
 3 files changed, 81 insertions(+), 6 deletions(-)
doc/guides/rel_notes/deprecation.rst +5 -0
index 6948641ff6..c9c8cf1868 100644
@@ -91,6 +91,11 @@ Deprecation Notices
   - ``rte_flow_item_pppoe``
   - ``rte_flow_item_pppoe_proto_id``
 
+* ethdev: The flow item ``RTE_FLOW_ITEM_TYPE_VXLAN_GPE`` is replaced with ``RTE_FLOW_ITEM_TYPE_VXLAN``.
+  The item ``RTE_FLOW_ITEM_TYPE_VXLAN_GPE``, the struct ``rte_flow_item_vxlan_gpe``, its mask ``rte_flow_item_vxlan_gpe_mask``,
+  and the header struct ``rte_vxlan_gpe_hdr`` with the macro ``RTE_ETHER_VXLAN_GPE_HLEN``
+  will be removed in DPDK 25.11.
+
 * ethdev: Queue specific stats fields will be removed from ``struct rte_eth_stats``.
   Mentioned fields are: ``q_ipackets``, ``q_opackets``, ``q_ibytes``, ``q_obytes``,
   ``q_errors``.
lib/ethdev/rte_flow.h +11 -2
index 6e8ab1d4c7..635b291f90 100644
@@ -355,6 +355,7 @@ enum rte_flow_item_type {
 	RTE_FLOW_ITEM_TYPE_GENEVE,
 
 	/**
+	 * @deprecated Replaced with ``RTE_FLOW_ITEM_TYPE_VXLAN``.
 	 * Matches a VXLAN-GPE header.
 	 *
 	 * See struct rte_flow_item_vxlan_gpe.
@@ -1103,7 +1104,11 @@ static const struct rte_flow_item_sctp rte_flow_item_sctp_mask = {
 /**
  * RTE_FLOW_ITEM_TYPE_VXLAN.
  *
- * Matches a VXLAN header (RFC 7348).
+ * Matches a VXLAN header (RFC 7348), including GPE (draft-ietf-nvo3-vxlan-gpe-13.txt)
+ * and GBP (draft-smith-vxlan-group-policy-05.txt).
+ *
+ * GPE is distinguished with its UDP port.
+ * UDP port may be specified with ``rte_eth_dev_udp_tunnel_port_add()``.
  */
 struct rte_flow_item_vxlan {
 	union {
@@ -1346,6 +1351,7 @@ static const struct rte_flow_item_geneve rte_flow_item_geneve_mask = {
 #endif
 
 /**
+ * @deprecated Replaced with ``rte_flow_item_vxlan``.
  * RTE_FLOW_ITEM_TYPE_VXLAN_GPE (draft-ietf-nvo3-vxlan-gpe-05).
  *
  * Matches a VXLAN-GPE header.
@@ -1367,7 +1373,10 @@ struct rte_flow_item_vxlan_gpe {
 	};
 };
 
-/** Default mask for RTE_FLOW_ITEM_TYPE_VXLAN_GPE. */
+/**
+ * @deprecated Replaced with ``rte_flow_item_vxlan_mask``.
+ * Default mask for RTE_FLOW_ITEM_TYPE_VXLAN_GPE.
+ */
 #ifndef __cplusplus
 static const struct rte_flow_item_vxlan_gpe rte_flow_item_vxlan_gpe_mask = {
 	.hdr.vni = "\xff\xff\xff",
lib/net/rte_vxlan.h +65 -4

89 lines not on this page · raw message

Signature · 1 line
2.34.1
author
#2 lore raw

PATCH 2/2 app/testpmd: introduce VXLAN-GBP and VXLAN-GPE fields

In reply to Gavin Li

After unification of VXLAN and all its extension protocols(VXLAN-GPE and VXLAN-GBP currently), all related RTE items should be spicified after 'vxlan'. And it's user's responsibility to specify correct UDP port for the protocol to be matched.

Below are the examples to match standard VXLAN, VXLAN-GPE and VXLAN-GBP. To match standard vxlan,
... / udp dst is 4789 / vxlan ... / ...
To match VXLAN-GBP group policy ID 4321,
... / udp dst is 4789 / vxlan group_policy_id is 4321 ... / ... To match VXLAN-GPE,
... / udp dst is 4790 / vxlan protocol is 2 ... / ...

---
 app/test-pmd/cmdline_flow.c                 | 40 +++++++++++++++++++++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  4 +++
 2 files changed, 44 insertions(+)
app/test-pmd/cmdline_flow.c +40 -0
index 60ee9337cf..78b31d9bcd 100644
@@ -383,6 +383,10 @@ enum index {
 	ITEM_VXLAN,
 	ITEM_VXLAN_VNI,
 	ITEM_VXLAN_LAST_RSVD,
+	ITEM_VXLAN_FLAGS,
+	ITEM_VXLAN_EXT_GBP_GPI,
+	ITEM_VXLAN_EXT_GPE_PROTO,
+	ITEM_VXLAN_EXT_GPE_RSVD0,
 	ITEM_E_TAG,
 	ITEM_E_TAG_GRP_ECID_B,
 	ITEM_NVGRE,
@@ -1779,6 +1783,10 @@ static const enum index item_sctp[] = {
 static const enum index item_vxlan[] = {
 	ITEM_VXLAN_VNI,
 	ITEM_VXLAN_LAST_RSVD,
+	ITEM_VXLAN_FLAGS,
+	ITEM_VXLAN_EXT_GBP_GPI,
+	ITEM_VXLAN_EXT_GPE_PROTO,
+	ITEM_VXLAN_EXT_GPE_RSVD0,
 	ITEM_NEXT,
 	ZERO,
 };
@@ -4918,6 +4926,38 @@ static const struct token token_list[] = {
 		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_vxlan,
 					     hdr.rsvd1)),
 	},
+	[ITEM_VXLAN_FLAGS] = {
+		.name = "flags",
+		.help = "VXLAN flags",
+		.next = NEXT(item_vxlan, NEXT_ENTRY(COMMON_UNSIGNED),
+			     item_param),
+		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_vxlan,
+					     flags)),
+	},
+	[ITEM_VXLAN_EXT_GBP_GPI] = {
+		.name = "group_policy_id",
+		.help = "VXLAN Group Based Policy ID",
+		.next = NEXT(item_vxlan, NEXT_ENTRY(COMMON_UNSIGNED),
+			     item_param),
+		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_vxlan,
+					     hdr.policy_id)),
+	},
+	[ITEM_VXLAN_EXT_GPE_PROTO] = {
+		.name = "protocol",
+		.help = "VXLAN-GPE next protocol",
+		.next = NEXT(item_vxlan, NEXT_ENTRY(COMMON_UNSIGNED),
+			     item_param),
+		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_vxlan,
+					     hdr.proto)),
+	},
+	[ITEM_VXLAN_EXT_GPE_RSVD0] = {
+		.name = "rsvd0_gpe",
+		.help = "VXLAN-GPE rsvd0",
+		.next = NEXT(item_vxlan, NEXT_ENTRY(COMMON_UNSIGNED),
+			     item_param),
+		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_vxlan,
+					     hdr.rsvd0_gpe)),
+	},
 	[ITEM_E_TAG] = {
 		.name = "e_tag",
 		.help = "match E-Tag header",
doc/guides/testpmd_app_ug/testpmd_funcs.rst +4 -0
index 2fbf9220d8..f1770ab950 100644
@@ -3697,6 +3697,10 @@ This section lists supported pattern items and their attributes, if any.
 
   - ``vni {unsigned}``: VXLAN identifier.
   - ``last_rsvd {unsigned}``: VXLAN last reserved 8-bits.
+  - ``flags {unsigned}``: VXLAN flags
+  - ``group_policy_id {unsigned}``: VXLAN-GBP Group Policy ID.
+  - ``protocol {unsigned}`` : VXLAN-GPE next protocol
+  - ``rsvd0_gpe {unsigned}`` : VXLAN-GPE rsvd0
 
 - ``e_tag``: match IEEE 802.1BR E-Tag header.
 
Signature · 1 line
2.34.1
Acked-by on v1 2/2
#3 lore raw

RE: [v1 2/2] app/testpmd: introduce VXLAN-GBP and VXLAN-GPE fields

Quoted 21 lines

-----Original Message-----
From: Minggang(Gavin) Li <[email protected]>
Sent: Friday, May 17, 2024 11:08 AM
Subject: [v1 2/2] app/testpmd: introduce VXLAN-GBP and VXLAN-GPE fields

After unification of VXLAN and all its extension protocols(VXLAN-GPE and VXLAN-GBP currently), all related RTE items should be spicified after 'vxlan'. And it's user's responsibility to specify correct UDP port for the protocol to be matched.

Below are the examples to match standard VXLAN, VXLAN-GPE and VXLAN- GBP.
To match standard vxlan,
... / udp dst is 4789 / vxlan ... / ...
To match VXLAN-GBP group policy ID 4321,
... / udp dst is 4789 / vxlan group_policy_id is 4321 ... / ... To match VXLAN-GPE,
... / udp dst is 4790 / vxlan protocol is 2 ... / ...

Quoted 3 lines

---

Best,
Ori