FD.io VPP
v16.06
Vector Packet Processing
Main Page
Related Pages
Data Structures
Source
Files
Symbols
replication.h
Go to the documentation of this file.
1
/*
2
* replication.h : packet replication
3
*
4
* Copyright (c) 2013 Cisco and/or its affiliates.
5
* Licensed under the Apache License, Version 2.0 (the "License");
6
* you may not use this file except in compliance with the License.
7
* You may obtain a copy of the License at:
8
*
9
* http://www.apache.org/licenses/LICENSE-2.0
10
*
11
* Unless required by applicable law or agreed to in writing, software
12
* distributed under the License is distributed on an "AS IS" BASIS,
13
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
* See the License for the specific language governing permissions and
15
* limitations under the License.
16
*/
17
18
#ifndef included_replication_h
19
#define included_replication_h
20
21
22
#include <
vlib/vlib.h
>
23
#include <
vnet/vnet.h
>
24
#include <
vnet/replication.h
>
25
26
27
typedef
struct
{
28
29
// The entire vnet buffer header restored for each replica
30
u8
vnet_buffer
[32];
// 16B aligned to allow vector unit copy
31
u8
reserved[32];
// space for future expansion of vnet buffer header
32
33
// feature state used during this replication
34
u64
feature_replicas
;
// feature's id for its set of replicas
35
u32
feature_counter
;
// feature's current index into set of replicas
36
u32
recycle_node_index
;
// feature's recycle node index
37
38
// data saved from the start of replication and restored at the end of replication
39
u32
saved_clone_count
;
// from vlib buffer
40
u32
saved_free_list_index
;
// from vlib buffer
41
42
// data saved from the original packet and restored for each replica
43
u64
l2_header[3];
// 24B (must be at least 22B for l2 packets)
44
u16
ip_tos
;
// v4 and v6
45
u16
ip4_checksum
;
// needed for v4 only
46
47
// data saved from the vlib buffer header and restored for each replica
48
i16
current_data
;
// offset of first byte of packet in packet data
49
u8
pad[6];
// to 64B
50
u8
l2_packet
;
// flag for l2 vs l3 packet data
51
52
}
replication_context_t
;
// 128B
53
54
55
typedef
struct
{
56
57
u32
recycle_list_index
;
58
59
// per-thread pools of replication contexts
60
replication_context_t
**
contexts
;
61
62
vlib_main_t
*
vlib_main
;
63
vnet_main_t
*
vnet_main
;
64
65
}
replication_main_t
;
66
67
68
extern
replication_main_t
replication_main
;
69
70
71
// Return 1 if this buffer just came from the replication recycle handler.
72
always_inline
u32
73
replication_is_recycled
(
vlib_buffer_t
* b0)
74
{
75
return
b0->
flags
&
VLIB_BUFFER_IS_RECYCLED
;
76
}
77
78
// Clear the recycle flag. If buffer came from the replication recycle
79
// handler, this flag must be cleared before the packet is transmitted again.
80
always_inline
void
81
replication_clear_recycled
(
vlib_buffer_t
* b0)
82
{
83
b0->
flags
&= ~
VLIB_BUFFER_IS_RECYCLED
;
84
}
85
86
// Return the active replication context if this buffer has
87
// been recycled, otherwise return 0. (Note that this essentially
88
// restricts access to the replication context to the replication
89
// feature's prep and recycle nodes.)
90
always_inline
replication_context_t
*
91
replication_get_ctx
(
vlib_buffer_t
* b0)
92
{
93
replication_main_t
* rm = &
replication_main
;
94
95
return
replication_is_recycled
(b0) ?
96
pool_elt_at_index
(rm->
contexts
[
os_get_cpu_number
()], b0->
clone_count
) :
97
0;
98
}
99
100
// Prefetch the replication context for this buffer, if it exists
101
always_inline
void
102
replication_prefetch_ctx
(
vlib_buffer_t
* b0)
103
{
104
replication_context_t
*ctx =
replication_get_ctx
(b0);
105
106
if
(ctx) {
107
CLIB_PREFETCH
(ctx, (2*
CLIB_CACHE_LINE_BYTES
), STORE);
108
}
109
}
110
111
replication_context_t
*
112
replication_prep
(
vlib_main_t
* vm,
113
vlib_buffer_t
* b0,
114
u32
recycle_node_index,
115
u32
l2_packet);
116
117
replication_context_t
*
118
replication_recycle
(
vlib_main_t
* vm,
119
vlib_buffer_t
* b0,
120
u32
is_last);
121
122
123
#endif
replication_context_t
Definition:
replication.h:27
replication_clear_recycled
always_inline void replication_clear_recycled(vlib_buffer_t *b0)
Definition:
replication.h:81
replication_context_t::saved_free_list_index
u32 saved_free_list_index
Definition:
replication.h:40
replication_context_t::ip4_checksum
u16 ip4_checksum
Definition:
replication.h:45
replication_prep
replication_context_t * replication_prep(vlib_main_t *vm, vlib_buffer_t *b0, u32 recycle_node_index, u32 l2_packet)
Definition:
replication.c:29
replication_context_t::current_data
i16 current_data
Definition:
replication.h:48
replication_get_ctx
always_inline replication_context_t * replication_get_ctx(vlib_buffer_t *b0)
Definition:
replication.h:91
always_inline
#define always_inline
Definition:
clib.h:84
replication_main_t::recycle_list_index
u32 recycle_list_index
Definition:
replication.h:57
u64
unsigned long u64
Definition:
types.h:89
pool_elt_at_index
#define pool_elt_at_index(p, i)
Definition:
pool.h:346
os_get_cpu_number
uword os_get_cpu_number(void)
Definition:
unix-misc.c:206
replication_context_t::feature_counter
u32 feature_counter
Definition:
replication.h:35
replication_is_recycled
always_inline u32 replication_is_recycled(vlib_buffer_t *b0)
Definition:
replication.h:73
replication_context_t::saved_clone_count
u32 saved_clone_count
Definition:
replication.h:39
replication_context_t::feature_replicas
u64 feature_replicas
Definition:
replication.h:34
vnet.h
replication_main_t
Definition:
replication.h:55
CLIB_PREFETCH
#define CLIB_PREFETCH(addr, size, type)
Definition:
cache.h:82
vlib_buffer_t
Definition:
buffer.h:73
replication_recycle
replication_context_t * replication_recycle(vlib_main_t *vm, vlib_buffer_t *b0, u32 is_last)
Definition:
replication.c:88
replication_context_t::recycle_node_index
u32 recycle_node_index
Definition:
replication.h:36
vlib.h
replication_context_t::ip_tos
u16 ip_tos
Definition:
replication.h:44
vnet_main_t
Definition:
vnet.h:58
replication_main_t::vlib_main
vlib_main_t * vlib_main
Definition:
replication.h:62
u32
unsigned int u32
Definition:
types.h:88
replication_context_t::l2_packet
u8 l2_packet
Definition:
replication.h:50
vnet_buffer
#define vnet_buffer(b)
Definition:
buffer.h:300
replication_main_t::vnet_main
vnet_main_t * vnet_main
Definition:
replication.h:63
vlib_buffer_t::clone_count
u32 clone_count
Specifies whether this buffer should be reinitialized when freed.
Definition:
buffer.h:121
replication.h
u16
unsigned short u16
Definition:
types.h:57
u8
unsigned char u8
Definition:
types.h:56
vlib_main_t
Definition:
main.h:59
replication_prefetch_ctx
always_inline void replication_prefetch_ctx(vlib_buffer_t *b0)
Definition:
replication.h:102
replication_main
replication_main_t replication_main
Definition:
replication.c:25
i16
short i16
Definition:
types.h:46
VLIB_BUFFER_IS_RECYCLED
#define VLIB_BUFFER_IS_RECYCLED
Definition:
buffer.h:94
CLIB_CACHE_LINE_BYTES
#define CLIB_CACHE_LINE_BYTES
Definition:
cache.h:67
vlib_buffer_t::flags
u32 flags
buffer flags: VLIB_BUFFER_IS_TRACED: trace this buffer.
Definition:
buffer.h:84
replication_main_t::contexts
replication_context_t ** contexts
Definition:
replication.h:60
vnet
vnet
replication.h
Generated on Thu Sep 1 2016 09:11:45 for FD.io VPP by
1.8.11