extend VXLAN header to support more extensions
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
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
@@ -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
@@ -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 __cplusplusstatic 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
PATCH 2/2 app/testpmd: introduce VXLAN-GBP and VXLAN-GPE fields
In reply to Gavin LiAfter 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
@@ -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
@@ -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
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 fieldsAfter 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 / vxlangroup_policy_idis 4321 ... / ... To match VXLAN-GPE,
... / udp dst is 4790 / vxlan protocol is 2 ... / ...
Quoted 3 lines
Signed-off-by Gavin Li <[email protected]>Acked-by Thomas Monjalon <[email protected]>---
Best,
Ori