FD.io VPP  v18.01-8-g0eacf49
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[40]; /* 16B aligned to allow vector unit copy */
31  u8 reserved[24]; /* 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  u32 flags; /* vnet buffer flags */
47  u16 ip_tos; /* v4 and v6 */
48  u16 ip4_checksum; /* needed for v4 only */
49 
50  /* data saved from the vlib buffer header and restored for each replica */
51  i16 current_data; /* offset of first byte of packet in packet data */
52  u8 pad[2]; /* to 64B */
53  u8 l2_packet; /* flag for l2 vs l3 packet data */
54 
55 } replication_context_t; /* 128B */
56 
57 
58 typedef struct
59 {
60 
62 
63  /* per-thread pools of replication contexts */
65 
68 
70 
71 
73 
74 
75 /* Return 1 if this buffer just came from the replication recycle handler. */
78 {
79  return b0->flags & VLIB_BUFFER_IS_RECYCLED;
80 }
81 
82 /*
83  * Clear the recycle flag. If buffer came from the replication recycle
84  * handler, this flag must be cleared before the packet is transmitted again.
85  */
86 always_inline void
88 {
90 }
91 
92 /*
93  * Return the active replication context if this buffer has
94  * been recycled, otherwise return 0. (Note that this essentially
95  * restricts access to the replication context to the replication
96  * feature's prep and recycle nodes.)
97  */
100 {
102 
103  return replication_is_recycled (b0) ?
105  b0->recycle_count) : 0;
106 }
107 
108 /* Prefetch the replication context for this buffer, if it exists */
109 always_inline void
111 {
113 
114  if (ctx)
115  {
116  CLIB_PREFETCH (ctx, (2 * CLIB_CACHE_LINE_BYTES), STORE);
117  }
118 }
119 
121  vlib_buffer_t * b0,
122  u32 recycle_node_index,
123  u32 l2_packet);
124 
126  vlib_buffer_t * b0, u32 is_last);
127 
128 
129 #endif
130 
131 /*
132  * fd.io coding-style-patch-verification: ON
133  *
134  * Local Variables:
135  * eval: (c-set-style "gnu")
136  * End:
137  */
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:87
u32 recycle_count
Used by L2 path recycle code.
Definition: buffer.h:140
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:92
unsigned long u64
Definition: types.h:89
static void replication_prefetch_ctx(vlib_buffer_t *b0)
Definition: replication.h:110
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:459
#define VLIB_BUFFER_IS_RECYCLED
Definition: buffer.h:96
static_always_inline uword vlib_get_thread_index(void)
Definition: threads.h:221
#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:94
vlib_main_t * vlib_main
Definition: replication.h:66
static replication_context_t * replication_get_ctx(vlib_buffer_t *b0)
Definition: replication.h:99
static u32 replication_is_recycled(vlib_buffer_t *b0)
Definition: replication.h:77
unsigned int u32
Definition: types.h:88
long ctx[MAX_CONNS]
Definition: main.c:122
vnet_main_t * vnet_main
Definition: replication.h:67
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:326
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:67
u32 flags
buffer flags: VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index, VLIB_BUFFER_IS_TRACED: trace this buffer.
Definition: buffer.h:75
replication_context_t ** contexts
Definition: replication.h:64