xref: /dpdk/lib/net/rte_vxlan.h (revision fba9875559906e04eaeb74532f4cfd51194259a2)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright(c) 2018-2019 Intel Corporation
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #ifndef _RTE_VXLAN_H_
699a2dd95SBruce Richardson #define _RTE_VXLAN_H_
799a2dd95SBruce Richardson 
899a2dd95SBruce Richardson /**
999a2dd95SBruce Richardson  * @file
1099a2dd95SBruce Richardson  *
1199a2dd95SBruce Richardson  * VXLAN-related definitions
1299a2dd95SBruce Richardson  */
1399a2dd95SBruce Richardson 
1499a2dd95SBruce Richardson #include <stdint.h>
1599a2dd95SBruce Richardson 
1699a2dd95SBruce Richardson #include <rte_byteorder.h>
1799a2dd95SBruce Richardson #include <rte_udp.h>
1899a2dd95SBruce Richardson 
1999a2dd95SBruce Richardson /** VXLAN default port. */
2099a2dd95SBruce Richardson #define RTE_VXLAN_DEFAULT_PORT 4789
2177cb7b18SGavin Li /** VXLAN GPE port. */
2299a2dd95SBruce Richardson #define RTE_VXLAN_GPE_DEFAULT_PORT 4790
2399a2dd95SBruce Richardson 
2499a2dd95SBruce Richardson /**
2599a2dd95SBruce Richardson  * VXLAN protocol header.
2699a2dd95SBruce Richardson  * Contains the 8-bit flag, 24-bit VXLAN Network Identifier and
2799a2dd95SBruce Richardson  * Reserved fields (24 bits and 8 bits)
2899a2dd95SBruce Richardson  */
29f1567c73SThomas Monjalon __extension__ /* no named member in struct */
30*fba98755SAndre Muezerie struct __rte_packed_begin rte_vxlan_hdr {
31f1567c73SThomas Monjalon 	union {
3277cb7b18SGavin Li 		rte_be32_t vx_flags; /**< flags (8 bits) + extensions (24 bits). */
33*fba98755SAndre Muezerie 		struct __rte_packed_begin {
3477cb7b18SGavin Li 			union {
3577cb7b18SGavin Li 				uint8_t flags; /**< Default is I bit, others are extensions. */
36*fba98755SAndre Muezerie 				struct __rte_packed_begin {
3777cb7b18SGavin Li #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
3877cb7b18SGavin Li 					uint8_t flag_g:1,     /**< GBP bit. */
3977cb7b18SGavin Li 						flag_rsvd:1,  /*   Reserved. */
4077cb7b18SGavin Li 						flag_ver:2,   /**< GPE Protocol Version. */
4177cb7b18SGavin Li 						flag_i:1,     /**< VNI bit. */
4277cb7b18SGavin Li 						flag_p:1,     /**< GPE Next Protocol bit. */
4377cb7b18SGavin Li 						flag_b:1,     /**< GPE Ingress-Replicated BUM. */
4477cb7b18SGavin Li 						flag_o:1;     /**< GPE OAM Packet bit. */
4577cb7b18SGavin Li #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
4677cb7b18SGavin Li 					uint8_t flag_o:1,
4777cb7b18SGavin Li 						flag_b:1,
4877cb7b18SGavin Li 						flag_p:1,
4977cb7b18SGavin Li 						flag_i:1,
5077cb7b18SGavin Li 						flag_ver:2,
5177cb7b18SGavin Li 						flag_rsvd:1,
5277cb7b18SGavin Li 						flag_g:1;
5377cb7b18SGavin Li #endif
54*fba98755SAndre Muezerie 				} __rte_packed_end;
5577cb7b18SGavin Li 			}; /* end of 1st byte */
5677cb7b18SGavin Li 			union {
5777cb7b18SGavin Li 				uint8_t rsvd0[3]; /* Reserved for extensions. */
58*fba98755SAndre Muezerie 				struct __rte_packed_begin {
5977cb7b18SGavin Li #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
6077cb7b18SGavin Li 					uint8_t rsvd0_gbp1:1, /*   Reserved. */
6177cb7b18SGavin Li 						flag_d:1,     /**< GBP Don't Learn bit. */
6277cb7b18SGavin Li 						rsvd0_gbp2:2, /*   Reserved. */
6377cb7b18SGavin Li 						flag_a:1,     /**< GBP Applied bit. */
6477cb7b18SGavin Li 						rsvd0_gbp3:3; /*   Reserved. */
6577cb7b18SGavin Li #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
6677cb7b18SGavin Li 					uint8_t rsvd0_gbp3:3,
6777cb7b18SGavin Li 						flag_a:1,
6877cb7b18SGavin Li 						rsvd0_gbp2:2,
6977cb7b18SGavin Li 						flag_d:1,
7077cb7b18SGavin Li 						rsvd0_gbp1:1;
7177cb7b18SGavin Li #endif
7277cb7b18SGavin Li 					union {
7377cb7b18SGavin Li 						uint16_t policy_id; /**< GBP Identifier. */
74*fba98755SAndre Muezerie 						struct __rte_packed_begin {
7577cb7b18SGavin Li 							uint8_t rsvd0_gpe; /* Reserved. */
7677cb7b18SGavin Li 							uint8_t proto; /**< GPE Next protocol. */
7777cb7b18SGavin Li 								/* 0x01 : IPv4
7877cb7b18SGavin Li 								 * 0x02 : IPv6
7977cb7b18SGavin Li 								 * 0x03 : Ethernet
8077cb7b18SGavin Li 								 * 0x04 : Network Service Header
8177cb7b18SGavin Li 								 */
82*fba98755SAndre Muezerie 						} __rte_packed_end;
83f1567c73SThomas Monjalon 					};
84*fba98755SAndre Muezerie 				} __rte_packed_end;
8577cb7b18SGavin Li 			};
86*fba98755SAndre Muezerie 		} __rte_packed_end;
8777cb7b18SGavin Li 	}; /* end of 1st 32-bit word */
8877cb7b18SGavin Li 	union {
8977cb7b18SGavin Li 		rte_be32_t vx_vni; /**< VNI (24 bits) + reserved (8 bits). */
90*fba98755SAndre Muezerie 		struct __rte_packed_begin {
9177cb7b18SGavin Li 			uint8_t    vni[3];   /**< VXLAN Identifier. */
925259e8cfSRongwei Liu 			union {
93f1567c73SThomas Monjalon 				uint8_t    rsvd1;        /**< Reserved. */
945259e8cfSRongwei Liu 				uint8_t    last_rsvd;    /**< Reserved. */
955259e8cfSRongwei Liu 			};
96*fba98755SAndre Muezerie 		} __rte_packed_end;
9777cb7b18SGavin Li 	}; /* end of 2nd 32-bit word */
98*fba98755SAndre Muezerie } __rte_packed_end;
9999a2dd95SBruce Richardson 
10099a2dd95SBruce Richardson /** VXLAN tunnel header length. */
10199a2dd95SBruce Richardson #define RTE_ETHER_VXLAN_HLEN \
10299a2dd95SBruce Richardson 	(sizeof(struct rte_udp_hdr) + sizeof(struct rte_vxlan_hdr))
10399a2dd95SBruce Richardson 
10499a2dd95SBruce Richardson 
10599a2dd95SBruce Richardson /**
10677cb7b18SGavin Li  * @deprecated
10777cb7b18SGavin Li  * @see rte_vxlan_hdr
10877cb7b18SGavin Li  *
10999a2dd95SBruce Richardson  * VXLAN-GPE protocol header (draft-ietf-nvo3-vxlan-gpe-05).
11099a2dd95SBruce Richardson  * Contains the 8-bit flag, 8-bit next-protocol, 24-bit VXLAN Network
11199a2dd95SBruce Richardson  * Identifier and Reserved fields (16 bits and 8 bits).
11299a2dd95SBruce Richardson  */
113f1567c73SThomas Monjalon __extension__ /* no named member in struct */
114*fba98755SAndre Muezerie struct __rte_packed_begin rte_vxlan_gpe_hdr {
115f1567c73SThomas Monjalon 	union {
116f1567c73SThomas Monjalon 		struct {
11799a2dd95SBruce Richardson 			uint8_t vx_flags;    /**< flag (8). */
11899a2dd95SBruce Richardson 			uint8_t reserved[2]; /**< Reserved (16). */
119f1567c73SThomas Monjalon 			uint8_t protocol;    /**< next-protocol (8). */
12099a2dd95SBruce Richardson 			rte_be32_t vx_vni;   /**< VNI (24) + Reserved (8). */
121f1567c73SThomas Monjalon 		};
122f1567c73SThomas Monjalon 		struct {
123f1567c73SThomas Monjalon 			uint8_t flags;    /**< Flags. */
124f1567c73SThomas Monjalon 			uint8_t rsvd0[2]; /**< Reserved. */
125f1567c73SThomas Monjalon 			uint8_t proto;    /**< Next protocol. */
126f1567c73SThomas Monjalon 			uint8_t vni[3];   /**< VXLAN identifier. */
127f1567c73SThomas Monjalon 			uint8_t rsvd1;    /**< Reserved. */
128f1567c73SThomas Monjalon 		};
129f1567c73SThomas Monjalon 	};
130*fba98755SAndre Muezerie } __rte_packed_end;
13199a2dd95SBruce Richardson 
13277cb7b18SGavin Li /**
13377cb7b18SGavin Li  * @deprecated
13477cb7b18SGavin Li  * @see RTE_ETHER_VXLAN_HLEN
13577cb7b18SGavin Li  *
13677cb7b18SGavin Li  * VXLAN-GPE tunnel header length.
13777cb7b18SGavin Li  */
13899a2dd95SBruce Richardson #define RTE_ETHER_VXLAN_GPE_HLEN (sizeof(struct rte_udp_hdr) + \
13999a2dd95SBruce Richardson 		sizeof(struct rte_vxlan_gpe_hdr))
14099a2dd95SBruce Richardson 
14199a2dd95SBruce Richardson /* VXLAN-GPE next protocol types */
14299a2dd95SBruce Richardson #define RTE_VXLAN_GPE_TYPE_IPV4 1 /**< IPv4 Protocol. */
14399a2dd95SBruce Richardson #define RTE_VXLAN_GPE_TYPE_IPV6 2 /**< IPv6 Protocol. */
14499a2dd95SBruce Richardson #define RTE_VXLAN_GPE_TYPE_ETH  3 /**< Ethernet Protocol. */
14599a2dd95SBruce Richardson #define RTE_VXLAN_GPE_TYPE_NSH  4 /**< NSH Protocol. */
14699a2dd95SBruce Richardson #define RTE_VXLAN_GPE_TYPE_MPLS 5 /**< MPLS Protocol. */
14799a2dd95SBruce Richardson #define RTE_VXLAN_GPE_TYPE_GBP  6 /**< GBP Protocol. */
14899a2dd95SBruce Richardson #define RTE_VXLAN_GPE_TYPE_VBNG 7 /**< vBNG Protocol. */
14999a2dd95SBruce Richardson 
15099a2dd95SBruce Richardson #endif /* RTE_VXLAN_H_ */
151