aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vnet/replication.c5
-rw-r--r--src/vnet/replication.h3
2 files changed, 7 insertions, 1 deletions
diff --git a/src/vnet/replication.c b/src/vnet/replication.c
index 0fdca0bf13c..5a8a0fe63b1 100644
--- a/src/vnet/replication.c
+++ b/src/vnet/replication.c
@@ -45,6 +45,7 @@ replication_prep (vlib_main_t * vm,
/* Save state from vlib buffer */
ctx->saved_free_list_index = vlib_buffer_get_free_list_index (b0);
ctx->current_data = b0->current_data;
+ ctx->flags = b0->flags & VNET_BUFFER_FLAGS_VLAN_BITS;
/* Set up vlib buffer hooks */
b0->recycle_count = ctx_id;
@@ -104,6 +105,10 @@ replication_recycle (vlib_main_t * vm, vlib_buffer_t * b0, u32 is_last)
clib_memcpy (vnet_buffer (b0), ctx->vnet_buffer,
sizeof (vnet_buffer_opaque_t));
+ /* Restore the vlan flags */
+ b0->flags &= ~VNET_BUFFER_FLAGS_VLAN_BITS;
+ b0->flags |= ctx->flags;
+
/* Restore the packet start (current_data) and length */
vlib_buffer_advance (b0, ctx->current_data - b0->current_data);
diff --git a/src/vnet/replication.h b/src/vnet/replication.h
index 42ec69a43ff..531a61c2fd1 100644
--- a/src/vnet/replication.h
+++ b/src/vnet/replication.h
@@ -43,12 +43,13 @@ typedef struct
/* data saved from the original packet and restored for each replica */
u64 l2_header[3]; /* 24B (must be at least 22B for l2 packets) */
+ u32 flags; /* vnet buffer flags */
u16 ip_tos; /* v4 and v6 */
u16 ip4_checksum; /* needed for v4 only */
/* data saved from the vlib buffer header and restored for each replica */
i16 current_data; /* offset of first byte of packet in packet data */
- u8 pad[6]; /* to 64B */
+ u8 pad[2]; /* to 64B */
u8 l2_packet; /* flag for l2 vs l3 packet data */
} replication_context_t; /* 128B */