FD.io VPP  v20.05-21-gb1500e9ff
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 static inline u32
146 {
147  return (h->vni_rsvd & clib_net_to_host_u32 (GENEVE_VNI_MASK));
148 }
149 
150 static inline void
152 {
153  h->vni_rsvd &= ~(GENEVE_VNI_MASK);
154  h->vni_rsvd |=
155  clib_host_to_net_u32 ((vni << GENEVE_VNI_SHIFT) & GENEVE_VNI_MASK);
156 }
157 
158 static inline u8
160 {
162 }
163 
164 static inline void
166 {
168  h->first_word |= ((version << GENEVE_VERSION_SHIFT) & GENEVE_VERSION_MASK);
169 }
170 
171 static inline u8
173 {
175 }
176 
177 static inline void
179 {
182 }
183 
184 static inline u8
186 {
188 }
189 
190 static inline void
192 {
193  h->first_word &= ~(GENEVE_O_BIT_MASK);
195 }
196 
197 static inline u8
199 {
201 }
202 
203 static inline void
205 {
206  h->first_word &= ~(GENEVE_C_BIT_MASK);
207  h->first_word |=
208  ((critical_opts << GENEVE_C_BIT_SHIFT) & GENEVE_C_BIT_MASK);
209 }
210 
211 static inline u16
213 {
214  return (h->first_word & GENEVE_PROTOCOL_MASK);
215 }
216 
217 static inline void
219 {
221  h->first_word |= (protocol & GENEVE_PROTOCOL_MASK);
222 }
223 
224 static inline void
226 {
227  h->first_word = clib_net_to_host_u32 (h->first_word);
228 }
229 
230 static inline void
232 {
233  h->first_word = clib_host_to_net_u32 (h->first_word);
234 }
235 
236 #endif
237 
238 /*
239  * fd.io coding-style-patch-verification: ON
240  *
241  * Local Variables:
242  * eval: (c-set-style "gnu")
243  * End:
244  */
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)
option version
Definition: sample.api:19
#define GENEVE_VERSION_SHIFT
#define GENEVE_O_BIT_SHIFT
unsigned char u8
Definition: types.h:56
#define GENEVE_C_BIT_MASK
vl_api_ip_proto_t protocol
Definition: lb_types.api:71
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)
#define GENEVE_VERSION_MASK
static void vnet_set_geneve_options_len(geneve_header_t *h, u8 len)
unsigned int u32
Definition: types.h:88
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)
unsigned short u16
Definition: types.h:57
u32 vni
Definition: lisp_gpe.api:119
vec_header_t h
Definition: buffer.c:322
static void vnet_set_geneve_version(geneve_header_t *h, u8 version)
static void vnet_set_geneve_protocol(geneve_header_t *h, u16 protocol)
u8 len
Definition: ip_types.api:92
#define GENEVE_OPTLEN_SHIFT
static u8 vnet_get_geneve_oamframe_bit(geneve_header_t *h)
static u8 vnet_get_geneve_version(geneve_header_t *h)
static u32 vnet_get_geneve_vni_network_order(geneve_header_t *h)
static void vnet_set_geneve_critical_bit(geneve_header_t *h, u8 critical_opts)
#define GENEVE_O_BIT_MASK
#define GENEVE_VNI_SHIFT
#define GENEVE_C_BIT_SHIFT
static u16 vnet_get_geneve_protocol(geneve_header_t *h)