summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Shin <jonshin@cisco.com>2017-11-13 15:46:35 -0800
committerJohn Lo <loj@cisco.com>2017-11-14 03:08:50 +0000
commit49806fe252030a4cd993f598ff65a89590d57388 (patch)
tree5e50408039f2258331e9c1bb772a79b323f8b565
parent9324284af8d8436ce434e3da58e8eabbe609cb56 (diff)
l2-flood: fix restore vnet buffer's flags in the replication routine
When BUM packets are flooded in the l2 domain, some data should be kept and restored for recycling in the replication routine. If l2 bridge domain has multiple interfaces mixed with normal and vlan tagged, the vlan tag value of the vnet buffer can be changed while flooding the replicated packets. The change is made to store and restore the original vlan tag in the replication logic. Change-Id: I399cf54cd2e74cb44a2be42241bdc4fba85032c5 Signed-off-by: Steve Shin <jonshin@cisco.com>
-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 */