FD.io VPP
v17.07.01-10-g3be13f0
Vector Packet Processing
Main Page
Related Pages
Data Structures
Source
Files
Symbols
buffer.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2015 Cisco and/or its affiliates.
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
* vnet/buffer.h: vnet buffer flags
17
*
18
* Copyright (c) 2008 Eliot Dresselhaus
19
*
20
* Permission is hereby granted, free of charge, to any person obtaining
21
* a copy of this software and associated documentation files (the
22
* "Software"), to deal in the Software without restriction, including
23
* without limitation the rights to use, copy, modify, merge, publish,
24
* distribute, sublicense, and/or sell copies of the Software, and to
25
* permit persons to whom the Software is furnished to do so, subject to
26
* the following conditions:
27
*
28
* The above copyright notice and this permission notice shall be
29
* included in all copies or substantial portions of the Software.
30
*
31
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
32
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
33
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
34
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
35
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
36
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
37
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
38
*/
39
40
#ifndef included_vnet_buffer_h
41
#define included_vnet_buffer_h
42
43
#include <
vlib/vlib.h
>
44
45
/* VLIB buffer flags for ip4/ip6 packets. Set by input interfaces for ip4/ip6
46
tcp/udp packets with hardware computed checksums. */
47
#define LOG2_IP_BUFFER_L4_CHECKSUM_COMPUTED LOG2_VLIB_BUFFER_FLAG_USER(1)
48
#define LOG2_IP_BUFFER_L4_CHECKSUM_CORRECT LOG2_VLIB_BUFFER_FLAG_USER(2)
49
#define IP_BUFFER_L4_CHECKSUM_COMPUTED (1 << LOG2_IP_BUFFER_L4_CHECKSUM_COMPUTED)
50
#define IP_BUFFER_L4_CHECKSUM_CORRECT (1 << LOG2_IP_BUFFER_L4_CHECKSUM_CORRECT)
51
52
/* VLAN header flags.
53
* These bits are zeroed in vlib_buffer_init_for_free_list()
54
* meaning wherever the buffer comes from they have a reasonable
55
* value (eg, if ip4/ip6 generates the packet.)
56
*/
57
#define LOG2_ETH_BUFFER_VLAN_2_DEEP LOG2_VLIB_BUFFER_FLAG_USER(3)
58
#define LOG2_ETH_BUFFER_VLAN_1_DEEP LOG2_VLIB_BUFFER_FLAG_USER(4)
59
#define ETH_BUFFER_VLAN_2_DEEP (1 << LOG2_ETH_BUFFER_VLAN_2_DEEP)
60
#define ETH_BUFFER_VLAN_1_DEEP (1 << LOG2_ETH_BUFFER_VLAN_1_DEEP)
61
#define ETH_BUFFER_VLAN_BITS (ETH_BUFFER_VLAN_1_DEEP | \
62
ETH_BUFFER_VLAN_2_DEEP)
63
64
#define LOG2_BUFFER_HANDOFF_NEXT_VALID LOG2_VLIB_BUFFER_FLAG_USER(6)
65
#define BUFFER_HANDOFF_NEXT_VALID (1 << LOG2_BUFFER_HANDOFF_NEXT_VALID)
66
67
#define LOG2_VNET_BUFFER_LOCALLY_ORIGINATED LOG2_VLIB_BUFFER_FLAG_USER(7)
68
#define VNET_BUFFER_LOCALLY_ORIGINATED (1 << LOG2_VNET_BUFFER_LOCALLY_ORIGINATED)
69
70
#define LOG2_VNET_BUFFER_SPAN_CLONE LOG2_VLIB_BUFFER_FLAG_USER(8)
71
#define VNET_BUFFER_SPAN_CLONE (1 << LOG2_VNET_BUFFER_SPAN_CLONE)
72
73
#define foreach_buffer_opaque_union_subtype \
74
_(ethernet) \
75
_(ip) \
76
_(swt) \
77
_(l2) \
78
_(l2t) \
79
_(gre) \
80
_(l2_classify) \
81
_(handoff) \
82
_(policer) \
83
_(ipsec) \
84
_(map) \
85
_(map_t) \
86
_(ip_frag) \
87
_(tcp)
88
89
/*
90
* vnet stack buffer opaque array overlay structure.
91
* The vnet_buffer_opaque_t *must* be the same size as the
92
* vlib_buffer_t "opaque" structure member, 32 bytes.
93
*
94
* When adding a union type, please add a stanza to
95
* foreach_buffer_opaque_union_subtype (directly above).
96
* Code in vnet_interface_init(...) verifies the size
97
* of the union, and will announce any deviations in an
98
* impossible-to-miss manner.
99
*/
100
typedef
struct
101
{
102
u32
sw_if_index[
VLIB_N_RX_TX
];
103
104
union
105
{
106
/* Ethernet. */
107
struct
108
{
109
/* Saved value of current header by ethernet-input. */
110
i32
start_of_ethernet_header
;
111
} ethernet;
112
113
/* IP4/6 buffer opaque. */
114
struct
115
{
116
/* Adjacency from destination IP address lookup [VLIB_TX].
117
Adjacency from source IP address lookup [VLIB_RX].
118
This gets set to ~0 until source lookup is performed. */
119
u32
adj_index[
VLIB_N_RX_TX
];
120
121
union
122
{
123
struct
124
{
125
/* Flow hash value for this packet computed from IP src/dst address
126
protocol and ports. */
127
u32
flow_hash
;
128
129
/* next protocol */
130
u32
save_protocol
;
131
132
/* Rewrite length */
133
u32
save_rewrite_length
;
134
135
/* MFIB RPF ID */
136
u32
rpf_id
;
137
};
138
139
/* ICMP */
140
struct
141
{
142
u8
type
;
143
u8
code
;
144
u32
data
;
145
} icmp;
146
147
/* IP header offset from vlib_buffer.data - saved by ip*_local nodes */
148
i32
start_of_ip_header
;
149
};
150
151
} ip;
152
153
/*
154
* MPLS:
155
* data copied from the MPLS header that was popped from the packet
156
* during the look-up.
157
*/
158
struct
159
{
160
u8
ttl
;
161
u8
exp
;
162
u8
first
;
163
} mpls;
164
165
/* ip4-in-ip6 softwire termination, only valid there */
166
struct
167
{
168
u8
swt_disable
;
169
u32
mapping_index
;
170
} swt;
171
172
/* l2 bridging path, only valid there */
173
struct
opaque_l2
174
{
175
u32
feature_bitmap
;
176
u16
bd_index
;
/* bridge-domain index */
177
u8
l2_len
;
/* ethernet header length */
178
u8
shg
;
/* split-horizon group */
179
u16
l2fib_sn
;
/* l2fib bd/int seq_num */
180
u8
bd_age
;
/* aging enabled */
181
} l2;
182
183
/* l2tpv3 softwire encap, only valid there */
184
struct
185
{
186
u32
pad
[4];
/* do not overlay w/ ip.adj_index[0,1] */
187
u8
next_index
;
188
u32
session_index
;
189
} l2t;
190
191
struct
192
{
193
u32
src
, dst;
194
} gre;
195
196
/* L2 classify */
197
struct
198
{
199
struct
opaque_l2
pad
;
200
union
201
{
202
u32
table_index
;
203
u32
opaque_index
;
204
};
205
u64
hash
;
206
} l2_classify;
207
208
/* IO - worker thread handoff */
209
struct
210
{
211
u32
next_index
;
212
} handoff;
213
214
/* vnet policer */
215
struct
216
{
217
u32
pad
[8 -
VLIB_N_RX_TX
- 1];
/* to end of opaque */
218
u32
index
;
219
} policer;
220
221
/* interface output features */
222
struct
223
{
224
u32
flags
;
225
u32
sad_index
;
226
} ipsec;
227
228
/* MAP */
229
struct
230
{
231
u16
mtu
;
232
} map;
233
234
/* MAP-T */
235
struct
236
{
237
u32
map_domain_index
;
238
struct
239
{
240
u32
saddr
, daddr;
241
u16
frag_offset
;
//Fragmentation header offset
242
u16
l4_offset
;
//L4 header overall offset
243
u8
l4_protocol
;
//The final protocol number
244
} v6;
//Used by ip6_map_t only
245
u16
checksum_offset
;
//L4 checksum overall offset
246
u16
mtu;
//Exit MTU
247
} map_t;
248
249
/* IP Fragmentation */
250
struct
251
{
252
u16
header_offset
;
253
u16
mtu;
254
u8
next_index;
255
u8
flags
;
//See ip_frag.h
256
} ip_frag;
257
258
/* COP - configurable junk filter(s) */
259
struct
260
{
261
/* Current configuration index. */
262
u32
current_config_index
;
263
} cop;
264
265
/* LISP */
266
struct
267
{
268
/* overlay address family */
269
u16
overlay_afi
;
270
} lisp;
271
272
/* Driver rx feature */
273
struct
274
{
275
u32
saved_next_index
;
/**< saved by drivers for short-cut */
276
u16
buffer_advance
;
277
} device_input_feat;
278
279
/* TCP */
280
struct
281
{
282
u32
connection_index
;
283
u32
seq_number
;
284
u32
seq_end
;
285
u32
ack_number
;
286
u16
hdr_offset
;
/**< offset relative to ip hdr */
287
u16
data_offset
;
/**< offset relative to ip hdr */
288
u16
data_len
;
/**< data len */
289
u8
flags
;
290
} tcp;
291
292
u32
unused[6];
293
};
294
}
vnet_buffer_opaque_t
;
295
296
/*
297
* The opaque field of the vlib_buffer_t is intepreted as a
298
* vnet_buffer_opaque_t. Hence it should be big enough to accommodate one.
299
*/
300
STATIC_ASSERT
(
sizeof
(
vnet_buffer_opaque_t
) <=
301
STRUCT_SIZE_OF
(
vlib_buffer_t
, opaque),
302
"VNET buffer meta-data too large for vlib_buffer"
);
303
304
#define vnet_buffer(b) ((vnet_buffer_opaque_t *) (b)->opaque)
305
306
/* Full cache line (64 bytes) of additional space */
307
typedef
struct
308
{
309
union
310
{
311
};
312
}
vnet_buffer_opaque2_t
;
313
314
315
316
#endif
/* included_vnet_buffer_h */
317
318
/*
319
* fd.io coding-style-patch-verification: ON
320
*
321
* Local Variables:
322
* eval: (c-set-style "gnu")
323
* End:
324
*/
vnet_buffer_opaque_t::header_offset
u16 header_offset
Definition:
buffer.h:252
vnet_buffer_opaque_t::connection_index
u32 connection_index
Definition:
buffer.h:282
pad
u8 pad[3]
log2 (size of the packing page block)
Definition:
bihash_doc.h:61
vnet_buffer_opaque_t::l2fib_sn
u16 l2fib_sn
Definition:
buffer.h:179
vnet_buffer_opaque_t::shg
u8 shg
Definition:
buffer.h:178
vnet_buffer_opaque_t::checksum_offset
u16 checksum_offset
Definition:
buffer.h:245
vnet_buffer_opaque_t::current_config_index
u32 current_config_index
Definition:
buffer.h:262
vnet_buffer_opaque_t::ack_number
u32 ack_number
Definition:
buffer.h:285
vnet_buffer_opaque_t::saved_next_index
u32 saved_next_index
saved by drivers for short-cut
Definition:
buffer.h:275
vnet_buffer_opaque_t::start_of_ethernet_header
i32 start_of_ethernet_header
Definition:
buffer.h:110
vnet_buffer_opaque_t::opaque_index
u32 opaque_index
Definition:
buffer.h:203
vnet_buffer_opaque_t::session_index
u32 session_index
Definition:
buffer.h:188
vnet_buffer_opaque_t::bd_index
u16 bd_index
Definition:
buffer.h:176
vnet_buffer_opaque_t::flags
u8 flags
Definition:
buffer.h:255
vnet_buffer_opaque_t::data_offset
u16 data_offset
offset relative to ip hdr
Definition:
buffer.h:287
STATIC_ASSERT
STATIC_ASSERT(sizeof(vnet_buffer_opaque_t)<=STRUCT_SIZE_OF(vlib_buffer_t, opaque),"VNET buffer meta-data too large for vlib_buffer")
vnet_buffer_opaque_t::mtu
u16 mtu
Definition:
buffer.h:231
vnet_buffer_opaque_t::rpf_id
u32 rpf_id
Definition:
buffer.h:136
vnet_buffer_opaque_t::next_index
u8 next_index
Definition:
buffer.h:187
vnet_buffer_opaque_t::l2_len
u8 l2_len
Definition:
buffer.h:177
vnet_buffer_opaque_t::flags
u32 flags
Definition:
buffer.h:224
vnet_buffer_opaque_t::code
u8 code
Definition:
buffer.h:143
vnet_buffer_opaque_t::saddr
u32 saddr
Definition:
buffer.h:240
vnet_buffer_opaque_t::feature_bitmap
u32 feature_bitmap
Definition:
buffer.h:175
i32
int i32
Definition:
types.h:81
vnet_buffer_opaque_t::start_of_ip_header
i32 start_of_ip_header
Definition:
buffer.h:148
vnet_buffer_opaque_t::overlay_afi
u16 overlay_afi
Definition:
buffer.h:269
u64
unsigned long u64
Definition:
types.h:89
VLIB_N_RX_TX
Definition:
defs.h:48
vnet_buffer_opaque_t::seq_end
u32 seq_end
Definition:
buffer.h:284
vnet_buffer_opaque_t::l4_protocol
u8 l4_protocol
Definition:
buffer.h:243
vnet_buffer_opaque_t::seq_number
u32 seq_number
Definition:
buffer.h:283
vnet_buffer_opaque_t::save_rewrite_length
u32 save_rewrite_length
Definition:
buffer.h:133
vnet_buffer_opaque_t::hash
u64 hash
Definition:
buffer.h:205
vnet_buffer_opaque_t::table_index
u32 table_index
Definition:
buffer.h:202
vnet_buffer_opaque_t::src
u32 src
Definition:
buffer.h:193
vnet_buffer_opaque_t::frag_offset
u16 frag_offset
Definition:
buffer.h:241
vnet_buffer_opaque_t::mapping_index
u32 mapping_index
Definition:
buffer.h:169
vnet_buffer_opaque_t::l4_offset
u16 l4_offset
Definition:
buffer.h:242
vlib_buffer_t
Definition:
buffer.h:61
vnet_buffer_opaque_t::index
u32 index
Definition:
buffer.h:218
vlib.h
vnet_buffer_opaque_t::buffer_advance
u16 buffer_advance
Definition:
buffer.h:276
u32
unsigned int u32
Definition:
types.h:88
vnet_buffer_opaque_t::data
u32 data
Definition:
buffer.h:144
vnet_buffer_opaque_t::save_protocol
u32 save_protocol
Definition:
buffer.h:130
vnet_buffer_opaque_t::next_index
u32 next_index
Definition:
buffer.h:211
vnet_buffer_opaque_t::swt_disable
u8 swt_disable
Definition:
buffer.h:168
vnet_buffer_opaque_t::bd_age
u8 bd_age
Definition:
buffer.h:180
u16
unsigned short u16
Definition:
types.h:57
vnet_buffer_opaque_t::sad_index
u32 sad_index
Definition:
buffer.h:225
vnet_buffer_opaque2_t
Definition:
buffer.h:307
u8
unsigned char u8
Definition:
types.h:56
vnet_buffer_opaque_t::hdr_offset
u16 hdr_offset
offset relative to ip hdr
Definition:
buffer.h:286
vnet_buffer_opaque_t::exp
u8 exp
Definition:
buffer.h:161
vnet_buffer_opaque_t::ttl
u8 ttl
Definition:
buffer.h:160
vnet_buffer_opaque_t::type
u8 type
Definition:
buffer.h:142
STRUCT_SIZE_OF
#define STRUCT_SIZE_OF(t, f)
Definition:
clib.h:64
vnet_buffer_opaque_t::flow_hash
u32 flow_hash
Definition:
buffer.h:127
flags
u32 flags
Definition:
vhost-user.h:76
vnet_buffer_opaque_t
Definition:
buffer.h:100
vnet_buffer_opaque_t::data_len
u16 data_len
data len
Definition:
buffer.h:288
vnet_buffer_opaque_t::map_domain_index
u32 map_domain_index
Definition:
buffer.h:237
vnet_buffer_opaque_t::first
u8 first
Definition:
buffer.h:162
src
vnet
buffer.h
Generated on Tue Nov 7 2017 14:25:55 for FD.io VPP by
1.8.11