FD.io VPP
v17.07-30-g839fa73
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
} l2;
181
182
/* l2tpv3 softwire encap, only valid there */
183
struct
184
{
185
u32
pad
[4];
/* do not overlay w/ ip.adj_index[0,1] */
186
u8
next_index
;
187
u32
session_index
;
188
} l2t;
189
190
struct
191
{
192
u32
src
, dst;
193
} gre;
194
195
/* L2 classify */
196
struct
197
{
198
struct
opaque_l2
pad
;
199
union
200
{
201
u32
table_index
;
202
u32
opaque_index
;
203
};
204
u64
hash
;
205
} l2_classify;
206
207
/* IO - worker thread handoff */
208
struct
209
{
210
u32
next_index
;
211
} handoff;
212
213
/* vnet policer */
214
struct
215
{
216
u32
pad
[8 -
VLIB_N_RX_TX
- 1];
/* to end of opaque */
217
u32
index
;
218
} policer;
219
220
/* interface output features */
221
struct
222
{
223
u32
flags
;
224
u32
sad_index
;
225
} ipsec;
226
227
/* MAP */
228
struct
229
{
230
u16
mtu
;
231
} map;
232
233
/* MAP-T */
234
struct
235
{
236
u32
map_domain_index
;
237
struct
238
{
239
u32
saddr
, daddr;
240
u16
frag_offset
;
//Fragmentation header offset
241
u16
l4_offset
;
//L4 header overall offset
242
u8
l4_protocol
;
//The final protocol number
243
} v6;
//Used by ip6_map_t only
244
u16
checksum_offset
;
//L4 checksum overall offset
245
u16
mtu;
//Exit MTU
246
} map_t;
247
248
/* IP Fragmentation */
249
struct
250
{
251
u16
header_offset
;
252
u16
mtu;
253
u8
next_index;
254
u8
flags
;
//See ip_frag.h
255
} ip_frag;
256
257
/* COP - configurable junk filter(s) */
258
struct
259
{
260
/* Current configuration index. */
261
u32
current_config_index
;
262
} cop;
263
264
/* LISP */
265
struct
266
{
267
/* overlay address family */
268
u16
overlay_afi
;
269
} lisp;
270
271
/* Driver rx feature */
272
struct
273
{
274
u32
saved_next_index
;
/**< saved by drivers for short-cut */
275
u16
buffer_advance
;
276
} device_input_feat;
277
278
/* TCP */
279
struct
280
{
281
u32
connection_index
;
282
u32
seq_number
;
283
u32
seq_end
;
284
u32
ack_number
;
285
u16
hdr_offset
;
/**< offset relative to ip hdr */
286
u16
data_offset
;
/**< offset relative to ip hdr */
287
u16
data_len
;
/**< data len */
288
u8
flags
;
289
} tcp;
290
291
u32
unused[6];
292
};
293
}
vnet_buffer_opaque_t
;
294
295
/*
296
* The opaque field of the vlib_buffer_t is intepreted as a
297
* vnet_buffer_opaque_t. Hence it should be big enough to accommodate one.
298
*/
299
STATIC_ASSERT
(
sizeof
(
vnet_buffer_opaque_t
) <=
300
STRUCT_SIZE_OF
(
vlib_buffer_t
, opaque),
301
"VNET buffer meta-data too large for vlib_buffer"
);
302
303
#define vnet_buffer(b) ((vnet_buffer_opaque_t *) (b)->opaque)
304
305
/* Full cache line (64 bytes) of additional space */
306
typedef
struct
307
{
308
union
309
{
310
};
311
}
vnet_buffer_opaque2_t
;
312
313
314
315
#endif
/* included_vnet_buffer_h */
316
317
/*
318
* fd.io coding-style-patch-verification: ON
319
*
320
* Local Variables:
321
* eval: (c-set-style "gnu")
322
* End:
323
*/
vnet_buffer_opaque_t::header_offset
u16 header_offset
Definition:
buffer.h:251
vnet_buffer_opaque_t::connection_index
u32 connection_index
Definition:
buffer.h:281
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:244
vnet_buffer_opaque_t::current_config_index
u32 current_config_index
Definition:
buffer.h:261
vnet_buffer_opaque_t::ack_number
u32 ack_number
Definition:
buffer.h:284
vnet_buffer_opaque_t::saved_next_index
u32 saved_next_index
saved by drivers for short-cut
Definition:
buffer.h:274
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:202
vnet_buffer_opaque_t::session_index
u32 session_index
Definition:
buffer.h:187
vnet_buffer_opaque_t::bd_index
u16 bd_index
Definition:
buffer.h:176
vnet_buffer_opaque_t::flags
u8 flags
Definition:
buffer.h:254
vnet_buffer_opaque_t::data_offset
u16 data_offset
offset relative to ip hdr
Definition:
buffer.h:286
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:230
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:186
vnet_buffer_opaque_t::l2_len
u8 l2_len
Definition:
buffer.h:177
vnet_buffer_opaque_t::flags
u32 flags
Definition:
buffer.h:223
vnet_buffer_opaque_t::code
u8 code
Definition:
buffer.h:143
vnet_buffer_opaque_t::saddr
u32 saddr
Definition:
buffer.h:239
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:268
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:283
vnet_buffer_opaque_t::l4_protocol
u8 l4_protocol
Definition:
buffer.h:242
vnet_buffer_opaque_t::seq_number
u32 seq_number
Definition:
buffer.h:282
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:204
vnet_buffer_opaque_t::table_index
u32 table_index
Definition:
buffer.h:201
vnet_buffer_opaque_t::src
u32 src
Definition:
buffer.h:192
vnet_buffer_opaque_t::frag_offset
u16 frag_offset
Definition:
buffer.h:240
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:241
vlib_buffer_t
Definition:
buffer.h:61
vnet_buffer_opaque_t::index
u32 index
Definition:
buffer.h:217
vlib.h
vnet_buffer_opaque_t::buffer_advance
u16 buffer_advance
Definition:
buffer.h:275
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:210
vnet_buffer_opaque_t::swt_disable
u8 swt_disable
Definition:
buffer.h:168
u16
unsigned short u16
Definition:
types.h:57
vnet_buffer_opaque_t::sad_index
u32 sad_index
Definition:
buffer.h:224
vnet_buffer_opaque2_t
Definition:
buffer.h:306
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:285
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:287
vnet_buffer_opaque_t::map_domain_index
u32 map_domain_index
Definition:
buffer.h:236
vnet_buffer_opaque_t::first
u8 first
Definition:
buffer.h:162
src
vnet
buffer.h
Generated on Fri Sep 8 2017 03:35:56 for FD.io VPP by
1.8.11