FD.io VPP
v17.01-9-ge7dcee4
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_VNET_BUFFER_RTE_MBUF_VALID LOG2_VLIB_BUFFER_FLAG_USER(5)
65
#define VNET_BUFFER_RTE_MBUF_VALID (1 << LOG2_VNET_BUFFER_RTE_MBUF_VALID)
66
67
#define LOG2_BUFFER_HANDOFF_NEXT_VALID LOG2_VLIB_BUFFER_FLAG_USER(6)
68
#define BUFFER_HANDOFF_NEXT_VALID (1 << LOG2_BUFFER_HANDOFF_NEXT_VALID)
69
70
#define LOG2_VNET_BUFFER_LOCALLY_ORIGINATED LOG2_VLIB_BUFFER_FLAG_USER(7)
71
#define VNET_BUFFER_LOCALLY_ORIGINATED (1 << LOG2_VNET_BUFFER_LOCALLY_ORIGINATED)
72
73
#define LOG2_VNET_BUFFER_SPAN_CLONE LOG2_VLIB_BUFFER_FLAG_USER(8)
74
#define VNET_BUFFER_SPAN_CLONE (1 << LOG2_VNET_BUFFER_SPAN_CLONE)
75
76
#define foreach_buffer_opaque_union_subtype \
77
_(ethernet) \
78
_(ip) \
79
_(mcast) \
80
_(swt) \
81
_(l2) \
82
_(l2t) \
83
_(gre) \
84
_(l2_classify) \
85
_(handoff) \
86
_(policer) \
87
_(ipsec) \
88
_(map) \
89
_(map_t) \
90
_(ip_frag)
91
92
/*
93
* vnet stack buffer opaque array overlay structure.
94
* The vnet_buffer_opaque_t *must* be the same size as the
95
* vlib_buffer_t "opaque" structure member, 32 bytes.
96
*
97
* When adding a union type, please add a stanza to
98
* foreach_buffer_opaque_union_subtype (directly above).
99
* Code in vnet_interface_init(...) verifies the size
100
* of the union, and will announce any deviations in an
101
* impossible-to-miss manner.
102
*/
103
typedef
struct
104
{
105
u32
sw_if_index[
VLIB_N_RX_TX
];
106
107
union
108
{
109
/* Ethernet. */
110
struct
111
{
112
/* Saved value of current header by ethernet-input. */
113
i32
start_of_ethernet_header
;
114
} ethernet;
115
116
/* IP4/6 buffer opaque. */
117
struct
118
{
119
/* Adjacency from destination IP address lookup [VLIB_TX].
120
Adjacency from source IP address lookup [VLIB_RX].
121
This gets set to ~0 until source lookup is performed. */
122
u32
adj_index[
VLIB_N_RX_TX
];
123
124
union
125
{
126
struct
127
{
128
/* Flow hash value for this packet computed from IP src/dst address
129
protocol and ports. */
130
u32
flow_hash
;
131
132
/* next protocol */
133
u32
save_protocol
;
134
135
/* Rewrite length */
136
u32
save_rewrite_length
;
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
/* Multicast replication */
166
struct
167
{
168
u32
pad
[3];
169
u32
mcast_group_index
;
170
u32
mcast_current_index
;
171
u32
original_free_list_index
;
172
} mcast;
173
174
/* ip4-in-ip6 softwire termination, only valid there */
175
struct
176
{
177
u8
swt_disable
;
178
u32
mapping_index
;
179
} swt;
180
181
/* l2 bridging path, only valid there */
182
struct
183
{
184
u32
feature_bitmap
;
185
u16
bd_index
;
// bridge-domain index
186
u8
l2_len
;
// ethernet header length
187
u8
shg
;
// split-horizon group
188
} l2;
189
190
/* l2tpv3 softwire encap, only valid there */
191
struct
192
{
193
u32
pad
[4];
/* do not overlay w/ ip.adj_index[0,1] */
194
u8
next_index
;
195
u32
session_index
;
196
} l2t;
197
198
struct
199
{
200
u32
src
, dst;
201
} gre;
202
203
/* L2 classify */
204
struct
205
{
206
u64
pad
;
207
u32
table_index
;
208
u32
opaque_index
;
209
u64
hash
;
210
} l2_classify;
211
212
/* IO - worker thread handoff */
213
struct
214
{
215
u32
next_index
;
216
} handoff;
217
218
/* vnet policer */
219
struct
220
{
221
u32
pad
[8 -
VLIB_N_RX_TX
- 1];
/* to end of opaque */
222
u32
index
;
223
} policer;
224
225
/* interface output features */
226
struct
227
{
228
u32
flags
;
229
u32
sad_index
;
230
} ipsec;
231
232
/* vcgn udp inside input, only valid there */
233
struct
234
{
235
/* This part forms context of the packet. The structure should be
236
* exactly same as spp_ctx_t. Also this should be the first
237
* element of this vcgn_uii structure.
238
*/
239
/****** BEGIN spp_ctx_t section ***********************/
240
union
241
{
/* Roddick specific */
242
u32
roddick_info
;
243
struct
_tx_pkt_info
244
{
/* Used by PI to PI communication for TX */
245
u32
uidb_index:16;
/* uidb_index to transmit */
246
u32
packet_type:2;
/* 1-IPv4, 2-Ipv6, - 0,3 - Unused */
247
u32
ipv4_defrag:1;
/* 0 - Normal, 1 - update first
248
* segment size
249
* (set by 6rd defrag node)
250
*/
251
252
u32
dst_ip_port_idx:4;
/* Index to dst_ip_port_table */
253
u32
from_node:4;
254
u32
calc_chksum:1;
255
u32
reserved:4;
256
} tx;
257
struct
_rx_pkt_info
258
{
/* Used by PD / PI communication */
259
u32
uidb_index:16;
/* uidb_index received in packet */
260
u32
packet_type:2;
/* 1-IPv4, 2-Ipv6, - 0,3 - Unused */
261
u32
icmp_type:1;
/* 0-ICMP query type, 1-ICMP error type */
262
u32
protocol_type:2;
/* 1-TCP, 2-UDP, 3-ICMP, 0 - Unused */
263
u32
ipv4_defrag:1;
/* 0 - Normal, 1 - update first
264
* segment size
265
* (set by 6rd defrag node)
266
*/
267
268
u32
direction:1;
/* 0-Outside, 1-Inside */
269
u32
frag:1;
/*IP fragment-1, Otherwise-0 */
270
u32
option:1;
/* 0-No IP option (v4) present, non-fragHdr
271
* option hdr present (v6)
272
*/
273
u32
df_bit:1;
/* IPv4 DF bit copied here */
274
u32
reserved1:6;
275
} rx;
276
} ru;
277
/****** END spp_ctx_t section ***********************/
278
279
union
280
{
281
struct
282
{
283
u32
ipv4
;
284
u16
port
;
285
u16
vrf
;
//bit0-13:i/f, bit14-15:protocol
286
} k;
287
288
u64
key64
;
289
} key;
290
291
u32
bucket
;
292
293
u16
ovrf
;
/* Exit interface */
294
u8
frag_pkt
;
295
u8
vcgn_unused1
;
296
} vcgn_uii;
297
298
/* MAP */
299
struct
300
{
301
u16
mtu
;
302
} map;
303
304
/* MAP-T */
305
struct
306
{
307
u32
map_domain_index
;
308
struct
309
{
310
u32
saddr
, daddr;
311
u16
frag_offset
;
//Fragmentation header offset
312
u16
l4_offset
;
//L4 header overall offset
313
u8
l4_protocol
;
//The final protocol number
314
} v6;
//Used by ip6_map_t only
315
u16
checksum_offset
;
//L4 checksum overall offset
316
u16
mtu;
//Exit MTU
317
} map_t;
318
319
/* IP Fragmentation */
320
struct
321
{
322
u16
header_offset
;
323
u16
mtu;
324
u8
next_index;
325
u8
flags
;
//See ip_frag.h
326
} ip_frag;
327
328
/* COP - configurable junk filter(s) */
329
struct
330
{
331
/* Current configuration index. */
332
u32
current_config_index
;
333
} cop;
334
335
/* LISP */
336
struct
337
{
338
/* overlay address family */
339
u16
overlay_afi
;
340
} lisp;
341
342
/* Driver rx feature */
343
struct
344
{
345
u32
saved_next_index
;
/**< saved by drivers for short-cut */
346
u16
buffer_advance
;
347
} device_input_feat;
348
349
u32
unused[6];
350
};
351
}
vnet_buffer_opaque_t
;
352
353
/*
354
* The opaque field of the vlib_buffer_t is intepreted as a
355
* vnet_buffer_opaque_t. Hence it should be big enough to accommodate one.
356
*/
357
STATIC_ASSERT
(
sizeof
(
vnet_buffer_opaque_t
) <=
STRUCT_SIZE_OF
(
vlib_buffer_t
,
358
opaque),
359
"VNET buffer meta-data too large for vlib_buffer"
);
360
361
#define vnet_buffer(b) ((vnet_buffer_opaque_t *) (b)->opaque)
362
363
/* Full cache line (64 bytes) of additional space */
364
typedef
struct
365
{
366
union
367
{
368
};
369
}
vnet_buffer_opaque2_t
;
370
371
372
373
#endif
/* included_vnet_buffer_h */
374
375
/*
376
* fd.io coding-style-patch-verification: ON
377
*
378
* Local Variables:
379
* eval: (c-set-style "gnu")
380
* End:
381
*/
vnet_buffer_opaque_t::header_offset
u16 header_offset
Definition:
buffer.h:322
pad
u8 pad[3]
log2 (size of the packing page block)
Definition:
bihash_doc.h:61
vnet_buffer_opaque_t::shg
u8 shg
Definition:
buffer.h:187
vnet_buffer_opaque_t::checksum_offset
u16 checksum_offset
Definition:
buffer.h:315
vnet_buffer_opaque_t::current_config_index
u32 current_config_index
Definition:
buffer.h:332
vnet_buffer_opaque_t::saved_next_index
u32 saved_next_index
saved by drivers for short-cut
Definition:
buffer.h:345
vnet_buffer_opaque_t::start_of_ethernet_header
i32 start_of_ethernet_header
Definition:
buffer.h:113
vnet_buffer_opaque_t::opaque_index
u32 opaque_index
Definition:
buffer.h:208
vnet_buffer_opaque_t::session_index
u32 session_index
Definition:
buffer.h:195
vnet_buffer_opaque_t::bd_index
u16 bd_index
Definition:
buffer.h:185
vnet_buffer_opaque_t::flags
u8 flags
Definition:
buffer.h:325
vnet_buffer_opaque_t::mtu
u16 mtu
Definition:
buffer.h:301
vnet_buffer_opaque_t::mcast_current_index
u32 mcast_current_index
Definition:
buffer.h:170
vnet_buffer_opaque_t::next_index
u8 next_index
Definition:
buffer.h:194
vnet_buffer_opaque_t::frag_pkt
u8 frag_pkt
Definition:
buffer.h:294
vnet_buffer_opaque_t::l2_len
u8 l2_len
Definition:
buffer.h:186
vnet_buffer_opaque_t::flags
u32 flags
Definition:
buffer.h:228
vnet_buffer_opaque_t::pad
u64 pad
Definition:
buffer.h:206
vnet_buffer_opaque_t::code
u8 code
Definition:
buffer.h:143
vnet_buffer_opaque_t::saddr
u32 saddr
Definition:
buffer.h:310
vnet_buffer_opaque_t::port
u16 port
Definition:
buffer.h:284
vnet_buffer_opaque_t::feature_bitmap
u32 feature_bitmap
Definition:
buffer.h:184
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:339
u64
unsigned long u64
Definition:
types.h:89
vnet_buffer_opaque_t::ovrf
u16 ovrf
Definition:
buffer.h:293
VLIB_N_RX_TX
Definition:
defs.h:48
vnet_buffer_opaque_t::l4_protocol
u8 l4_protocol
Definition:
buffer.h:313
vnet_buffer_opaque_t::save_rewrite_length
u32 save_rewrite_length
Definition:
buffer.h:136
vnet_buffer_opaque_t::hash
u64 hash
Definition:
buffer.h:209
vnet_buffer_opaque_t::table_index
u32 table_index
Definition:
buffer.h:207
vnet_buffer_opaque_t::src
u32 src
Definition:
buffer.h:200
vnet_buffer_opaque_t::frag_offset
u16 frag_offset
Definition:
buffer.h:311
vnet_buffer_opaque_t::mapping_index
u32 mapping_index
Definition:
buffer.h:178
vnet_buffer_opaque_t::l4_offset
u16 l4_offset
Definition:
buffer.h:312
vnet_buffer_opaque_t::mcast_group_index
u32 mcast_group_index
Definition:
buffer.h:169
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")
vlib_buffer_t
Definition:
buffer.h:73
vnet_buffer_opaque_t::original_free_list_index
u32 original_free_list_index
Definition:
buffer.h:171
vnet_buffer_opaque_t::index
u32 index
Definition:
buffer.h:222
vlib.h
vnet_buffer_opaque_t::buffer_advance
u16 buffer_advance
Definition:
buffer.h:346
u32
unsigned int u32
Definition:
types.h:88
vnet_buffer_opaque_t::data
u32 data
Definition:
buffer.h:144
vnet_buffer_opaque_t::vrf
u16 vrf
Definition:
buffer.h:285
vnet_buffer_opaque_t::save_protocol
u32 save_protocol
Definition:
buffer.h:133
vnet_buffer_opaque_t::key64
u64 key64
Definition:
buffer.h:288
vnet_buffer_opaque_t::next_index
u32 next_index
Definition:
buffer.h:215
vnet_buffer_opaque_t::swt_disable
u8 swt_disable
Definition:
buffer.h:177
vnet_buffer_opaque_t::roddick_info
u32 roddick_info
Definition:
buffer.h:242
u16
unsigned short u16
Definition:
types.h:57
vnet_buffer_opaque_t::sad_index
u32 sad_index
Definition:
buffer.h:229
vnet_buffer_opaque2_t
Definition:
buffer.h:364
u8
unsigned char u8
Definition:
types.h:56
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::vcgn_unused1
u8 vcgn_unused1
Definition:
buffer.h:295
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::bucket
u32 bucket
Definition:
buffer.h:291
vnet_buffer_opaque_t::flow_hash
u32 flow_hash
Definition:
buffer.h:130
vnet_buffer_opaque_t::ipv4
u32 ipv4
Definition:
buffer.h:283
vnet_buffer_opaque_t
Definition:
buffer.h:103
vnet_buffer_opaque_t::map_domain_index
u32 map_domain_index
Definition:
buffer.h:307
vnet_buffer_opaque_t::first
u8 first
Definition:
buffer.h:162
vnet
vnet
buffer.h
Generated on Thu Mar 2 2017 19:44:32 for FD.io VPP by
1.8.11