ARP/ND: copy opaque2 persistent fields to new packet

Change-Id: Ic65f686aaccaf8450732d88d7471b587faccaa9d
Signed-off-by: Neale Ranns <nranns@cisco.com>
diff --git a/src/vnet/ip/ip4_forward.c b/src/vnet/ip/ip4_forward.c
index f523ae6..1a1b7e5 100644
--- a/src/vnet/ip/ip4_forward.c
+++ b/src/vnet/ip/ip4_forward.c
@@ -1854,6 +1854,10 @@
 	    vlib_packet_template_get_packet (vm,
 					     &im->ip4_arp_request_packet_template,
 					     &bi0);
+	  b0 = vlib_get_buffer (vm, bi0);
+
+	  /* copy the persistent fields from the original */
+	  clib_memcpy_fast (b0->opaque2, p0->opaque2, sizeof (p0->opaque2));
 
 	  /* Seems we're out of buffers */
 	  if (PREDICT_FALSE (!h0))
@@ -1894,7 +1898,6 @@
 	  p0->error = node->errors[IP4_ARP_ERROR_REQUEST_SENT];
 
 	  vlib_buffer_copy_trace_flag (vm, p0, bi0);
-	  b0 = vlib_get_buffer (vm, bi0);
 	  VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
 	  vnet_buffer (b0)->sw_if_index[VLIB_TX] = sw_if_index0;
 
diff --git a/src/vnet/ip/ip6_neighbor.c b/src/vnet/ip/ip6_neighbor.c
index fde3a7e..3acfb1a 100755
--- a/src/vnet/ip/ip6_neighbor.c
+++ b/src/vnet/ip/ip6_neighbor.c
@@ -3284,6 +3284,10 @@
 	    if (!h0)
 	      continue;
 
+	    /* copy the persistent fields from the original */
+	    b0 = vlib_get_buffer (vm, bi0);
+	    clib_memcpy_fast (b0->opaque2, p0->opaque2, sizeof (p0->opaque2));
+
 	    /*
 	     * Build ethernet header.
 	     * Choose source address based on destination lookup
@@ -3324,7 +3328,6 @@
 	    ASSERT (bogus_length == 0);
 
 	    vlib_buffer_copy_trace_flag (vm, p0, bi0);
-	    b0 = vlib_get_buffer (vm, bi0);
 	    vnet_buffer (b0)->sw_if_index[VLIB_TX]
 	      = vnet_buffer (p0)->sw_if_index[VLIB_TX];
 
diff --git a/src/vnet/vxlan-gbp/encap.c b/src/vnet/vxlan-gbp/encap.c
index d260ccc..f1b839c 100644
--- a/src/vnet/vxlan-gbp/encap.c
+++ b/src/vnet/vxlan-gbp/encap.c
@@ -50,6 +50,7 @@
   u32 tunnel_index;
   u32 vni;
   u16 sclass;
+  u8 flags;
 } vxlan_gbp_encap_trace_t;
 
 u8 *
@@ -59,8 +60,10 @@
   CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
   vxlan_gbp_encap_trace_t *t = va_arg (*args, vxlan_gbp_encap_trace_t *);
 
-  s = format (s, "VXLAN_GBP encap to vxlan_gbp_tunnel%d vni %d sclass %d",
-	      t->tunnel_index, t->vni, t->sclass);
+  s =
+    format (s,
+	    "VXLAN_GBP encap to vxlan_gbp_tunnel%d vni %d sclass %d flags %d",
+	    t->tunnel_index, t->vni, t->sclass, t->flags);
   return s;
 }
 
@@ -322,6 +325,7 @@
 	      tr->tunnel_index = t0 - vxm->tunnels;
 	      tr->vni = t0->vni;
 	      tr->sclass = vnet_buffer2 (b0)->gbp.src_epg;
+	      tr->flags = vnet_buffer2 (b0)->gbp.flags;
 	    }
 
 	  if (PREDICT_FALSE (b1->flags & VLIB_BUFFER_IS_TRACED))
@@ -331,6 +335,7 @@
 	      tr->tunnel_index = t1 - vxm->tunnels;
 	      tr->vni = t1->vni;
 	      tr->sclass = vnet_buffer2 (b1)->gbp.src_epg;
+	      tr->flags = vnet_buffer2 (b1)->gbp.flags;
 	    }
 
 	  vlib_validate_buffer_enqueue_x2 (vm, node, next_index,
@@ -465,6 +470,7 @@
 	      tr->tunnel_index = t0 - vxm->tunnels;
 	      tr->vni = t0->vni;
 	      tr->sclass = vnet_buffer2 (b0)->gbp.src_epg;
+	      tr->flags = vnet_buffer2 (b0)->gbp.flags;
 	    }
 	  vlib_validate_buffer_enqueue_x1 (vm, node, next_index,
 					   to_next, n_left_to_next,