FD.io VPP  v18.01.2-1-g9b554f3
Vector Packet Processing
geneve_packet.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 SUSE LLC.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef included_vnet_geneve_packet_h
17 #define included_vnet_geneve_packet_h
18 
19 /*
20  *
21  * As per draft https://tools.ietf.org/html/draft-ietf-nvo3-geneve-05
22  *
23  * Section 3.5
24  *
25  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
26  * | Option Class | Type |R|R|R| Length |
27  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
28  * | Variable Option Data |
29  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
30  */
31 #define GENEVE_MAX_OPT_LENGTH 128
32 
33 /*
34  *
35  * As per draft https://tools.ietf.org/html/draft-ietf-nvo3-geneve-05
36  *
37  * Section 7
38  *
39  * +----------------+--------------------------------------+
40  * | Option Class | Description |
41  * +----------------+--------------------------------------+
42  * | 0x0000..0x00FF | Unassigned - IETF Review |
43  * | 0x0100 | Linux |
44  * | 0x0101 | Open vSwitch |
45  * | 0x0102 | Open Virtual Networking (OVN) |
46  * | 0x0103 | In-band Network Telemetry (INT) |
47  * | 0x0104 | VMware |
48  * | 0x0105..0xFFEF | Unassigned - First Come First Served |
49  * | 0xFFF0..FFFF | Experimental |
50  * +----------------+--------------------------------------+
51 */
52 #define LINUX_OPT_CLASS 0x0100
53 #define OVS_OPT_CLASS 0x0101
54 #define OVN_OPT_CLASS 0x0102
55 #define INT_OPT_CLASS 0x0103
56 #define VMWARE_OPT_CLASS 0x0104
57 
58 /*
59  * 0 1 2 3
60  * 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
61  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
62  * | Option Class | Type |R|R|R| Length |
63  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
64  * | Variable Option Data |
65  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
66  */
67 typedef struct
68 {
71  /* The 3 reserved bits are for future use;
72  * Need to be 0 on sending and ignored on receipt.
73  */
75  /* Length is expressed in 4-bytes multiples excluding the options header. */
77  u32 opt_data[];
79 
80 /*
81  *
82  * As per draft https://tools.ietf.org/html/draft-ietf-nvo3-geneve-05
83  *
84  * Section 3/3.4
85  *
86  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
87  * |Ver| Opt Len |O|C| Rsvd. | Protocol Type |
88  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
89  * | Virtual Network Identifier (VNI) | Reserved |
90  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
91  * | Variable Length Options |
92  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
93  *
94  */
95 #define GENEVE_BASE_HEADER_LENGTH 8 // GENEVE BASE HEADER in bytes
96 #define GENEVE_MAX_TOTAL_HDR_LENGTH 260
97 
98 #define GENEVE_VERSION 0
99 #define GENEVE_ETH_PROTOCOL 0x6558
100 
101 typedef struct
102 {
103  /*
104  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
105  * |Ver| Opt Len |O|C| Rsvd. | Protocol Type |
106  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
107  */
109 
110  /*
111  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
112  * | Virtual Network Identifier (VNI) | Reserved |
113  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
114  */
118 
119 #define GENEVE_VERSION_SHIFT 30
120 #define GENEVE_OPTLEN_SHIFT 24
121 #define GENEVE_O_BIT_SHIFT 23
122 #define GENEVE_C_BIT_SHIFT 22
123 #define GENEVE_6_RESERVED_SHIFT 16
124 #define GENEVE_VNI_SHIFT 8
125 
126 #define GENEVE_VERSION_MASK 0xC0000000
127 #define GENEVE_OPTLEN_MASK 0x3F000000
128 #define GENEVE_O_BIT_MASK 0x00800000
129 #define GENEVE_C_BIT_MASK 0x00400000
130 #define GENEVE_6_RESERVED_MASK 0x003F0000
131 #define GENEVE_PROTOCOL_MASK 0x0000FFFF
132 #define GENEVE_VNI_MASK 0xFFFFFF00
133 
134 /*
135  * Return the VNI in host-byte order
136  */
137 static inline u32
139 {
140  return (clib_net_to_host_u32 (h->vni_rsvd & GENEVE_VNI_MASK) >>
142 }
143 
144 /*
145  * Return the VNI in network-byte order
146  *
147  * To be used in the DECAP phase to create the lookup key (IP + VNI)
148  */
149 static inline u32
151 {
152  u32 vni_host = vnet_get_geneve_vni (h);
153  return clib_host_to_net_u32 ((vni_host << GENEVE_VNI_SHIFT) &
155 }
156 
157 static inline void
159 {
160  h->vni_rsvd &= ~(GENEVE_VNI_MASK);
161  h->vni_rsvd |=
162  clib_host_to_net_u32 ((vni << GENEVE_VNI_SHIFT) & GENEVE_VNI_MASK);
163 }
164 
165 static inline u8
167 {
169 }
170 
171 static inline void
173 {
175  h->first_word |= ((version << GENEVE_VERSION_SHIFT) & GENEVE_VERSION_MASK);
176 }
177 
178 static inline u8
180 {
182 }
183 
184 static inline void
186 {
189 }
190 
191 static inline u8
193 {
195 }
196 
197 static inline void
199 {
200  h->first_word &= ~(GENEVE_O_BIT_MASK);
202 }
203 
204 static inline u8
206 {
208 }
209 
210 static inline void
212 {
213  h->first_word &= ~(GENEVE_C_BIT_MASK);
214  h->first_word |=
215  ((critical_opts << GENEVE_C_BIT_SHIFT) & GENEVE_C_BIT_MASK);
216 }
217 
218 static inline u16
220 {
221  return (h->first_word & GENEVE_PROTOCOL_MASK);
222 }
223 
224 static inline void
226 {
228  h->first_word |= (protocol & GENEVE_PROTOCOL_MASK);
229 }
230 
231 static inline void
233 {
234  h->first_word = clib_net_to_host_u32 (h->first_word);
235 }
236 
237 static inline void
239 {
240  h->first_word = clib_host_to_net_u32 (h->first_word);
241 }
242 
243 #endif
244 
245 /*
246  * fd.io coding-style-patch-verification: ON
247  *
248  * Local Variables:
249  * eval: (c-set-style "gnu")
250  * End:
251  */
static u8 vnet_get_geneve_critical_bit(geneve_header_t *h)
static void vnet_geneve_hdr_1word_hton(geneve_header_t *h)
#define GENEVE_OPTLEN_MASK
static u32 vnet_get_geneve_vni(geneve_header_t *h)
#define GENEVE_VERSION_SHIFT
#define GENEVE_O_BIT_SHIFT
#define GENEVE_C_BIT_MASK
static u8 vnet_get_geneve_options_len(geneve_header_t *h)
#define GENEVE_PROTOCOL_MASK
static void vnet_set_geneve_oamframe_bit(geneve_header_t *h, u8 oam)
static u32 vnet_get_geneve_vni_bigendian(geneve_header_t *h)
#define GENEVE_VERSION_MASK
static void vnet_set_geneve_options_len(geneve_header_t *h, u8 len)
static void vnet_set_geneve_vni(geneve_header_t *h, u32 vni)
#define GENEVE_VNI_MASK
static void vnet_geneve_hdr_1word_ntoh(geneve_header_t *h)
static void vnet_set_geneve_version(geneve_header_t *h, u8 version)
static void vnet_set_geneve_protocol(geneve_header_t *h, u16 protocol)
#define GENEVE_OPTLEN_SHIFT
vec_header_t h
Definition: buffer.c:282
static u8 vnet_get_geneve_oamframe_bit(geneve_header_t *h)
unsigned int u32
Definition: types.h:88
static u8 vnet_get_geneve_version(geneve_header_t *h)
static void vnet_set_geneve_critical_bit(geneve_header_t *h, u8 critical_opts)
unsigned short u16
Definition: types.h:57
#define GENEVE_O_BIT_MASK
unsigned char u8
Definition: types.h:56
#define GENEVE_VNI_SHIFT
#define GENEVE_C_BIT_SHIFT
static u16 vnet_get_geneve_protocol(geneve_header_t *h)