xref: /dpdk/lib/net/rte_vxlan.h (revision fba9875559906e04eaeb74532f4cfd51194259a2)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2018-2019 Intel Corporation
3  */
4 
5 #ifndef _RTE_VXLAN_H_
6 #define _RTE_VXLAN_H_
7 
8 /**
9  * @file
10  *
11  * VXLAN-related definitions
12  */
13 
14 #include <stdint.h>
15 
16 #include <rte_byteorder.h>
17 #include <rte_udp.h>
18 
19 /** VXLAN default port. */
20 #define RTE_VXLAN_DEFAULT_PORT 4789
21 /** VXLAN GPE port. */
22 #define RTE_VXLAN_GPE_DEFAULT_PORT 4790
23 
24 /**
25  * VXLAN protocol header.
26  * Contains the 8-bit flag, 24-bit VXLAN Network Identifier and
27  * Reserved fields (24 bits and 8 bits)
28  */
29 __extension__ /* no named member in struct */
30 struct __rte_packed_begin rte_vxlan_hdr {
31 	union {
32 		rte_be32_t vx_flags; /**< flags (8 bits) + extensions (24 bits). */
33 		struct __rte_packed_begin {
34 			union {
35 				uint8_t flags; /**< Default is I bit, others are extensions. */
36 				struct __rte_packed_begin {
37 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
38 					uint8_t flag_g:1,     /**< GBP bit. */
39 						flag_rsvd:1,  /*   Reserved. */
40 						flag_ver:2,   /**< GPE Protocol Version. */
41 						flag_i:1,     /**< VNI bit. */
42 						flag_p:1,     /**< GPE Next Protocol bit. */
43 						flag_b:1,     /**< GPE Ingress-Replicated BUM. */
44 						flag_o:1;     /**< GPE OAM Packet bit. */
45 #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
46 					uint8_t flag_o:1,
47 						flag_b:1,
48 						flag_p:1,
49 						flag_i:1,
50 						flag_ver:2,
51 						flag_rsvd:1,
52 						flag_g:1;
53 #endif
54 				} __rte_packed_end;
55 			}; /* end of 1st byte */
56 			union {
57 				uint8_t rsvd0[3]; /* Reserved for extensions. */
58 				struct __rte_packed_begin {
59 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
60 					uint8_t rsvd0_gbp1:1, /*   Reserved. */
61 						flag_d:1,     /**< GBP Don't Learn bit. */
62 						rsvd0_gbp2:2, /*   Reserved. */
63 						flag_a:1,     /**< GBP Applied bit. */
64 						rsvd0_gbp3:3; /*   Reserved. */
65 #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
66 					uint8_t rsvd0_gbp3:3,
67 						flag_a:1,
68 						rsvd0_gbp2:2,
69 						flag_d:1,
70 						rsvd0_gbp1:1;
71 #endif
72 					union {
73 						uint16_t policy_id; /**< GBP Identifier. */
74 						struct __rte_packed_begin {
75 							uint8_t rsvd0_gpe; /* Reserved. */
76 							uint8_t proto; /**< GPE Next protocol. */
77 								/* 0x01 : IPv4
78 								 * 0x02 : IPv6
79 								 * 0x03 : Ethernet
80 								 * 0x04 : Network Service Header
81 								 */
82 						} __rte_packed_end;
83 					};
84 				} __rte_packed_end;
85 			};
86 		} __rte_packed_end;
87 	}; /* end of 1st 32-bit word */
88 	union {
89 		rte_be32_t vx_vni; /**< VNI (24 bits) + reserved (8 bits). */
90 		struct __rte_packed_begin {
91 			uint8_t    vni[3];   /**< VXLAN Identifier. */
92 			union {
93 				uint8_t    rsvd1;        /**< Reserved. */
94 				uint8_t    last_rsvd;    /**< Reserved. */
95 			};
96 		} __rte_packed_end;
97 	}; /* end of 2nd 32-bit word */
98 } __rte_packed_end;
99 
100 /** VXLAN tunnel header length. */
101 #define RTE_ETHER_VXLAN_HLEN \
102 	(sizeof(struct rte_udp_hdr) + sizeof(struct rte_vxlan_hdr))
103 
104 
105 /**
106  * @deprecated
107  * @see rte_vxlan_hdr
108  *
109  * VXLAN-GPE protocol header (draft-ietf-nvo3-vxlan-gpe-05).
110  * Contains the 8-bit flag, 8-bit next-protocol, 24-bit VXLAN Network
111  * Identifier and Reserved fields (16 bits and 8 bits).
112  */
113 __extension__ /* no named member in struct */
114 struct __rte_packed_begin rte_vxlan_gpe_hdr {
115 	union {
116 		struct {
117 			uint8_t vx_flags;    /**< flag (8). */
118 			uint8_t reserved[2]; /**< Reserved (16). */
119 			uint8_t protocol;    /**< next-protocol (8). */
120 			rte_be32_t vx_vni;   /**< VNI (24) + Reserved (8). */
121 		};
122 		struct {
123 			uint8_t flags;    /**< Flags. */
124 			uint8_t rsvd0[2]; /**< Reserved. */
125 			uint8_t proto;    /**< Next protocol. */
126 			uint8_t vni[3];   /**< VXLAN identifier. */
127 			uint8_t rsvd1;    /**< Reserved. */
128 		};
129 	};
130 } __rte_packed_end;
131 
132 /**
133  * @deprecated
134  * @see RTE_ETHER_VXLAN_HLEN
135  *
136  * VXLAN-GPE tunnel header length.
137  */
138 #define RTE_ETHER_VXLAN_GPE_HLEN (sizeof(struct rte_udp_hdr) + \
139 		sizeof(struct rte_vxlan_gpe_hdr))
140 
141 /* VXLAN-GPE next protocol types */
142 #define RTE_VXLAN_GPE_TYPE_IPV4 1 /**< IPv4 Protocol. */
143 #define RTE_VXLAN_GPE_TYPE_IPV6 2 /**< IPv6 Protocol. */
144 #define RTE_VXLAN_GPE_TYPE_ETH  3 /**< Ethernet Protocol. */
145 #define RTE_VXLAN_GPE_TYPE_NSH  4 /**< NSH Protocol. */
146 #define RTE_VXLAN_GPE_TYPE_MPLS 5 /**< MPLS Protocol. */
147 #define RTE_VXLAN_GPE_TYPE_GBP  6 /**< GBP Protocol. */
148 #define RTE_VXLAN_GPE_TYPE_VBNG 7 /**< vBNG Protocol. */
149 
150 #endif /* RTE_VXLAN_H_ */
151