FD.io VPP
v17.04.2-2-ga8f93f8
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
88
/*
89
* vnet stack buffer opaque array overlay structure.
90
* The vnet_buffer_opaque_t *must* be the same size as the
91
* vlib_buffer_t "opaque" structure member, 32 bytes.
92
*
93
* When adding a union type, please add a stanza to
94
* foreach_buffer_opaque_union_subtype (directly above).
95
* Code in vnet_interface_init(...) verifies the size
96
* of the union, and will announce any deviations in an
97
* impossible-to-miss manner.
98
*/
99
typedef
struct
100
{
101
u32
sw_if_index[
VLIB_N_RX_TX
];
102
103
union
104
{
105
/* Ethernet. */
106
struct
107
{
108
/* Saved value of current header by ethernet-input. */
109
i32
start_of_ethernet_header
;
110
} ethernet;
111
112
/* IP4/6 buffer opaque. */
113
struct
114
{
115
/* Adjacency from destination IP address lookup [VLIB_TX].
116
Adjacency from source IP address lookup [VLIB_RX].
117
This gets set to ~0 until source lookup is performed. */
118
u32
adj_index[
VLIB_N_RX_TX
];
119
120
union
121
{
122
struct
123
{
124
/* Flow hash value for this packet computed from IP src/dst address
125
protocol and ports. */
126
u32
flow_hash
;
127
128
/* next protocol */
129
u32
save_protocol
;
130
131
/* Rewrite length */
132
u32
save_rewrite_length
;
133
};
134
135
/* ICMP */
136
struct
137
{
138
u8
type
;
139
u8
code
;
140
u32
data
;
141
} icmp;
142
143
/* IP header offset from vlib_buffer.data - saved by ip*_local nodes */
144
i32
start_of_ip_header
;
145
};
146
147
} ip;
148
149
/*
150
* MPLS:
151
* data copied from the MPLS header that was popped from the packet
152
* during the look-up.
153
*/
154
struct
155
{
156
u8
ttl
;
157
u8
exp
;
158
u8
first
;
159
} mpls;
160
161
/* ip4-in-ip6 softwire termination, only valid there */
162
struct
163
{
164
u8
swt_disable
;
165
u32
mapping_index
;
166
} swt;
167
168
/* l2 bridging path, only valid there */
169
struct
170
{
171
u32
feature_bitmap
;
172
u16
bd_index
;
/* bridge-domain index */
173
u8
l2_len
;
/* ethernet header length */
174
u8
shg
;
/* split-horizon group */
175
u8
bd_sn
;
/* bridge domain seq# */
176
u8
int_sn
;
/* interface seq# */
177
} l2;
178
179
/* l2tpv3 softwire encap, only valid there */
180
struct
181
{
182
u32
pad
[4];
/* do not overlay w/ ip.adj_index[0,1] */
183
u8
next_index
;
184
u32
session_index
;
185
} l2t;
186
187
struct
188
{
189
u32
src
, dst;
190
} gre;
191
192
/* L2 classify */
193
struct
194
{
195
u64
pad
;
196
u32
table_index
;
197
u32
opaque_index
;
198
u64
hash
;
199
} l2_classify;
200
201
/* IO - worker thread handoff */
202
struct
203
{
204
u32
next_index
;
205
} handoff;
206
207
/* vnet policer */
208
struct
209
{
210
u32
pad
[8 -
VLIB_N_RX_TX
- 1];
/* to end of opaque */
211
u32
index
;
212
} policer;
213
214
/* interface output features */
215
struct
216
{
217
u32
flags
;
218
u32
sad_index
;
219
} ipsec;
220
221
/* MAP */
222
struct
223
{
224
u16
mtu
;
225
} map;
226
227
/* MAP-T */
228
struct
229
{
230
u32
map_domain_index
;
231
struct
232
{
233
u32
saddr
, daddr;
234
u16
frag_offset
;
//Fragmentation header offset
235
u16
l4_offset
;
//L4 header overall offset
236
u8
l4_protocol
;
//The final protocol number
237
} v6;
//Used by ip6_map_t only
238
u16
checksum_offset
;
//L4 checksum overall offset
239
u16
mtu;
//Exit MTU
240
} map_t;
241
242
/* IP Fragmentation */
243
struct
244
{
245
u16
header_offset
;
246
u16
mtu;
247
u8
next_index;
248
u8
flags
;
//See ip_frag.h
249
} ip_frag;
250
251
/* COP - configurable junk filter(s) */
252
struct
253
{
254
/* Current configuration index. */
255
u32
current_config_index
;
256
} cop;
257
258
/* LISP */
259
struct
260
{
261
/* overlay address family */
262
u16
overlay_afi
;
263
} lisp;
264
265
/* Driver rx feature */
266
struct
267
{
268
u32
saved_next_index
;
/**< saved by drivers for short-cut */
269
u16
buffer_advance
;
270
} device_input_feat;
271
272
/* TCP */
273
struct
274
{
275
u32
connection_index
;
276
u32
seq_number
;
277
u32
seq_end
;
278
u32
ack_number
;
279
u8
flags
;
280
} tcp;
281
282
u32
unused[6];
283
};
284
}
vnet_buffer_opaque_t
;
285
286
/*
287
* The opaque field of the vlib_buffer_t is intepreted as a
288
* vnet_buffer_opaque_t. Hence it should be big enough to accommodate one.
289
*/
290
STATIC_ASSERT
(
sizeof
(
vnet_buffer_opaque_t
) <=
STRUCT_SIZE_OF
(
vlib_buffer_t
,
291
opaque),
292
"VNET buffer meta-data too large for vlib_buffer"
);
293
294
#define vnet_buffer(b) ((vnet_buffer_opaque_t *) (b)->opaque)
295
296
/* Full cache line (64 bytes) of additional space */
297
typedef
struct
298
{
299
union
300
{
301
};
302
}
vnet_buffer_opaque2_t
;
303
304
305
306
#endif
/* included_vnet_buffer_h */
307
308
/*
309
* fd.io coding-style-patch-verification: ON
310
*
311
* Local Variables:
312
* eval: (c-set-style "gnu")
313
* End:
314
*/
vnet_buffer_opaque_t::header_offset
u16 header_offset
Definition:
buffer.h:245
vnet_buffer_opaque_t::connection_index
u32 connection_index
Definition:
buffer.h:275
pad
u8 pad[3]
log2 (size of the packing page block)
Definition:
bihash_doc.h:61
vnet_buffer_opaque_t::bd_sn
u8 bd_sn
Definition:
buffer.h:175
vnet_buffer_opaque_t::shg
u8 shg
Definition:
buffer.h:174
vnet_buffer_opaque_t::checksum_offset
u16 checksum_offset
Definition:
buffer.h:238
vnet_buffer_opaque_t::current_config_index
u32 current_config_index
Definition:
buffer.h:255
vnet_buffer_opaque_t::ack_number
u32 ack_number
Definition:
buffer.h:278
vnet_buffer_opaque_t::saved_next_index
u32 saved_next_index
saved by drivers for short-cut
Definition:
buffer.h:268
vnet_buffer_opaque_t::start_of_ethernet_header
i32 start_of_ethernet_header
Definition:
buffer.h:109
vnet_buffer_opaque_t::opaque_index
u32 opaque_index
Definition:
buffer.h:197
vnet_buffer_opaque_t::session_index
u32 session_index
Definition:
buffer.h:184
vnet_buffer_opaque_t::bd_index
u16 bd_index
Definition:
buffer.h:172
vnet_buffer_opaque_t::flags
u8 flags
Definition:
buffer.h:248
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:224
vnet_buffer_opaque_t::next_index
u8 next_index
Definition:
buffer.h:183
vnet_buffer_opaque_t::l2_len
u8 l2_len
Definition:
buffer.h:173
vnet_buffer_opaque_t::flags
u32 flags
Definition:
buffer.h:217
vnet_buffer_opaque_t::pad
u64 pad
Definition:
buffer.h:195
vnet_buffer_opaque_t::code
u8 code
Definition:
buffer.h:139
vnet_buffer_opaque_t::saddr
u32 saddr
Definition:
buffer.h:233
vnet_buffer_opaque_t::feature_bitmap
u32 feature_bitmap
Definition:
buffer.h:171
i32
int i32
Definition:
types.h:81
vnet_buffer_opaque_t::start_of_ip_header
i32 start_of_ip_header
Definition:
buffer.h:144
vnet_buffer_opaque_t::overlay_afi
u16 overlay_afi
Definition:
buffer.h:262
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:277
vnet_buffer_opaque_t::l4_protocol
u8 l4_protocol
Definition:
buffer.h:236
vnet_buffer_opaque_t::seq_number
u32 seq_number
Definition:
buffer.h:276
vnet_buffer_opaque_t::save_rewrite_length
u32 save_rewrite_length
Definition:
buffer.h:132
vnet_buffer_opaque_t::hash
u64 hash
Definition:
buffer.h:198
vnet_buffer_opaque_t::table_index
u32 table_index
Definition:
buffer.h:196
vnet_buffer_opaque_t::src
u32 src
Definition:
buffer.h:189
vnet_buffer_opaque_t::frag_offset
u16 frag_offset
Definition:
buffer.h:234
vnet_buffer_opaque_t::mapping_index
u32 mapping_index
Definition:
buffer.h:165
vnet_buffer_opaque_t::l4_offset
u16 l4_offset
Definition:
buffer.h:235
vlib_buffer_t
Definition:
buffer.h:61
vnet_buffer_opaque_t::index
u32 index
Definition:
buffer.h:211
vlib.h
vnet_buffer_opaque_t::buffer_advance
u16 buffer_advance
Definition:
buffer.h:269
u32
unsigned int u32
Definition:
types.h:88
vnet_buffer_opaque_t::data
u32 data
Definition:
buffer.h:140
vnet_buffer_opaque_t::save_protocol
u32 save_protocol
Definition:
buffer.h:129
vnet_buffer_opaque_t::next_index
u32 next_index
Definition:
buffer.h:204
vnet_buffer_opaque_t::swt_disable
u8 swt_disable
Definition:
buffer.h:164
u16
unsigned short u16
Definition:
types.h:57
vnet_buffer_opaque_t::sad_index
u32 sad_index
Definition:
buffer.h:218
vnet_buffer_opaque2_t
Definition:
buffer.h:297
u8
unsigned char u8
Definition:
types.h:56
vnet_buffer_opaque_t::exp
u8 exp
Definition:
buffer.h:157
vnet_buffer_opaque_t::ttl
u8 ttl
Definition:
buffer.h:156
vnet_buffer_opaque_t::type
u8 type
Definition:
buffer.h:138
vnet_buffer_opaque_t::int_sn
u8 int_sn
Definition:
buffer.h:176
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:126
flags
u32 flags
Definition:
vhost-user.h:78
vnet_buffer_opaque_t
Definition:
buffer.h:99
vnet_buffer_opaque_t::map_domain_index
u32 map_domain_index
Definition:
buffer.h:230
vnet_buffer_opaque_t::first
u8 first
Definition:
buffer.h:158
src
vnet
buffer.h
Generated on Sat Jul 1 2017 12:01:41 for FD.io VPP by
1.8.11