FD.io VPP  v17.07-30-g839fa73
Vector Packet Processing
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  /*
39  * data saved from the start of replication and restored
40  * at the end of replication
41  */
42  u32 saved_free_list_index; /* from vlib buffer */
43 
44  /* data saved from the original packet and restored for each replica */
45  u64 l2_header[3]; /* 24B (must be at least 22B for l2 packets) */
46  u16 ip_tos; /* v4 and v6 */
47  u16 ip4_checksum; /* needed for v4 only */
48 
49  /* data saved from the vlib buffer header and restored for each replica */
50  i16 current_data; /* offset of first byte of packet in packet data */
51  u8 pad[6]; /* to 64B */
52  u8 l2_packet; /* flag for l2 vs l3 packet data */
53 
54 } replication_context_t; /* 128B */
55 
56 
57 typedef struct
58 {
59 
61 
62  /* per-thread pools of replication contexts */
64 
67 
69 
70 
72 
73 
74 /* Return 1 if this buffer just came from the replication recycle handler. */
77 {
78  return b0->flags & VLIB_BUFFER_IS_RECYCLED;
79 }
80 
81 /*
82  * Clear the recycle flag. If buffer came from the replication recycle
83  * handler, this flag must be cleared before the packet is transmitted again.
84  */
85 always_inline void
87 {
89 }
90 
91 /*
92  * Return the active replication context if this buffer has
93  * been recycled, otherwise return 0. (Note that this essentially
94  * restricts access to the replication context to the replication
95  * feature's prep and recycle nodes.)
96  */
99 {
101 
102  return replication_is_recycled (b0) ?
104  b0->recycle_count) : 0;
105 }
106 
107 /* Prefetch the replication context for this buffer, if it exists */
108 always_inline void
110 {
112 
113  if (ctx)
114  {
115  CLIB_PREFETCH (ctx, (2 * CLIB_CACHE_LINE_BYTES), STORE);
116  }
117 }
118 
120  vlib_buffer_t * b0,
121  u32 recycle_node_index,
122  u32 l2_packet);
123 
125  vlib_buffer_t * b0, u32 is_last);
126 
127 
128 #endif
129 
130 /*
131  * fd.io coding-style-patch-verification: ON
132  *
133  * Local Variables:
134  * eval: (c-set-style "gnu")
135  * End:
136  */
u8 pad[3]
log2 (size of the packing page block)
Definition: bihash_doc.h:61
static void replication_clear_recycled(vlib_buffer_t *b0)
Definition: replication.h:86
u32 recycle_count
Used by L2 path recycle code.
Definition: buffer.h:139
replication_context_t * replication_prep(vlib_main_t *vm, vlib_buffer_t *b0, u32 recycle_node_index, u32 l2_packet)
Definition: replication.c:29
#define always_inline
Definition: clib.h:84
unsigned long u64
Definition: types.h:89
static void replication_prefetch_ctx(vlib_buffer_t *b0)
Definition: replication.h:109
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:397
#define VLIB_BUFFER_IS_RECYCLED
Definition: buffer.h:88
static_always_inline uword vlib_get_thread_index(void)
Definition: threads.h:185
#define CLIB_PREFETCH(addr, size, type)
Definition: cache.h:82
replication_context_t * replication_recycle(vlib_main_t *vm, vlib_buffer_t *b0, u32 is_last)
Definition: replication.c:93
vlib_main_t * vlib_main
Definition: replication.h:65
static replication_context_t * replication_get_ctx(vlib_buffer_t *b0)
Definition: replication.h:98
static u32 replication_is_recycled(vlib_buffer_t *b0)
Definition: replication.h:76
unsigned int u32
Definition: types.h:88
vnet_main_t * vnet_main
Definition: replication.h:66
unsigned short u16
Definition: types.h:57
unsigned char u8
Definition: types.h:56
replication_main_t replication_main
Definition: replication.c:25
short i16
Definition: types.h:46
#define vnet_buffer(b)
Definition: buffer.h:303
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:67
u32 flags
buffer flags: VLIB_BUFFER_IS_TRACED: trace this buffer.
Definition: buffer.h:74
replication_context_t ** contexts
Definition: replication.h:63