hs-test: handle error in config serialization
[vpp.git] / src / vnet / dpo / mpls_label_dpo.c
index 9d147f9..7856f05 100644 (file)
@@ -18,6 +18,8 @@
 #include <vnet/mpls/mpls.h>
 #include <vnet/dpo/drop_dpo.h>
 
+// clang-format off
+
 #ifndef CLIB_MARCH_VARIANT
 /*
  * pool of all MPLS Label DPOs
@@ -39,8 +41,13 @@ static mpls_label_dpo_t *
 mpls_label_dpo_alloc (void)
 {
     mpls_label_dpo_t *mld;
+    vlib_main_t *vm;
+    u8 did_barrier_sync;
 
+    dpo_pool_barrier_sync (vm, mpls_label_dpo_pool, did_barrier_sync);
     pool_get_aligned(mpls_label_dpo_pool, mld, CLIB_CACHE_LINE_BYTES);
+    dpo_pool_barrier_release (vm, did_barrier_sync);
+
     clib_memset(mld, 0, sizeof(*mld));
 
     dpo_reset(&mld->mld_dpo);
@@ -432,8 +439,14 @@ mpls_label_imposition_inline (vlib_main_t * vm,
             if (DPO_PROTO_MPLS != dproto)
             {
                 /*
-                 * These are the non-MPLS payload imposition cases
+                 * These are the non-MPLS payload imposition cases.
+                 * Save the l3 offset
                  */
+                vnet_buffer (b0)->l3_hdr_offset = b0->current_data;
+                vnet_buffer (b1)->l3_hdr_offset = b1->current_data;
+                vnet_buffer (b2)->l3_hdr_offset = b2->current_data;
+                vnet_buffer (b3)->l3_hdr_offset = b3->current_data;
+
                 if (DPO_PROTO_IP4 == dproto)
                 {
                     ip4_header_t * ip0 = vlib_buffer_get_current(b0);
@@ -778,6 +791,8 @@ mpls_label_imposition_inline (vlib_main_t * vm,
 
             if (DPO_PROTO_MPLS != dproto)
             {
+                vnet_buffer (b0)->l3_hdr_offset = b0->current_data;
+
                 if (DPO_PROTO_IP4 == dproto)
                 {
                     /*
@@ -1208,12 +1223,25 @@ mpls_label_interpose (const dpo_id_t *original,
             mpls_label_dpo_get_index(mld_clone));
 }
 
+static u16
+mpls_label_dpo_get_mtu (const dpo_id_t *dpo)
+{
+    mpls_label_dpo_t *mld;
+
+    mld = mpls_label_dpo_get(dpo->dpoi_index);
+
+    /* return the parent's MTU minus the amount of header
+     * this DPO imposes */
+    return (dpo_get_mtu (&mld->mld_dpo) - sizeof(mpls_label_t) * mld->mld_n_labels);
+}
+
 const static dpo_vft_t mld_vft = {
     .dv_lock = mpls_label_dpo_lock,
     .dv_unlock = mpls_label_dpo_unlock,
     .dv_format = format_mpls_label_dpo,
     .dv_mem_show = mpls_label_dpo_mem_show,
     .dv_mk_interpose = mpls_label_interpose,
+    .dv_get_mtu = mpls_label_dpo_get_mtu,
 };
 
 const static char* const mpls_label_imp_pipe_ip4_nodes[] =
@@ -1332,3 +1360,5 @@ mpls_label_dpo_get_type (mpls_label_dpo_flags_t flags)
     return (mpls_label_dpo_types[flags]);
 }
 #endif /* CLIB_MARCH_VARIANT */
+
+// clang-format on