Remove c-11 memcpy checks from perf-critical code
[vpp.git] / src / vnet / dpo / mpls_label_dpo.c
index ebbbbec..ab8c06d 100644 (file)
@@ -40,7 +40,7 @@ mpls_label_dpo_alloc (void)
     mpls_label_dpo_t *mld;
 
     pool_get_aligned(mpls_label_dpo_pool, mld, CLIB_CACHE_LINE_BYTES);
-    memset(mld, 0, sizeof(*mld));
+    clib_memset(mld, 0, sizeof(*mld));
 
     dpo_reset(&mld->mld_dpo);
 
@@ -205,7 +205,7 @@ format_mpls_label_dpo (u8 *s, va_list *args)
     }
 
     mld = mpls_label_dpo_get(index);
-    s = format(s, "mpls-label[%U%d]:",
+    s = format(s, "mpls-label[%U@%d]:",
                format_mpls_label_dpo_flags,
                (int) mld->mld_flags, index);
 
@@ -287,7 +287,7 @@ mpls_label_paint (vlib_buffer_t * b0,
     }
     else
     {
-        clib_memcpy(hdr0, mld0->mld_hdr, mld0->mld_n_hdr_bytes);
+        clib_memcpy_fast(hdr0, mld0->mld_hdr, mld0->mld_n_hdr_bytes);
         hdr0 = hdr0 + (mld0->mld_n_labels - 1);
     }
 
@@ -1204,11 +1204,44 @@ mpls_label_dpo_mem_show (void)
                          sizeof(mpls_label_dpo_t));
 }
 
+/**
+ * Interpose a label DPO. used in the FIB unit tests
+ */
+static void
+mpls_label_interpose (const dpo_id_t *original,
+                      const dpo_id_t *parent,
+                      dpo_id_t *clone)
+{
+    mpls_label_dpo_t *mld, *mld_clone;
+
+    mld_clone = mpls_label_dpo_alloc();
+    mld = mpls_label_dpo_get(original->dpoi_index);
+
+    mld_clone->mld_locks = 0;
+    clib_memcpy_fast(&mld_clone->mld_hdr,
+                &mld->mld_hdr,
+                sizeof(mld_clone->mld_hdr));
+    mld_clone->mld_payload_proto = mld->mld_payload_proto;
+    mld_clone->mld_n_labels = mld->mld_n_labels;
+    mld_clone->mld_n_hdr_bytes = mld->mld_n_hdr_bytes;
+
+    dpo_stack(mpls_label_dpo_types[MPLS_LABEL_DPO_FLAG_NONE],
+              mld_clone->mld_payload_proto,
+              &mld_clone->mld_dpo,
+              parent);
+
+    dpo_set(clone,
+            mpls_label_dpo_types[MPLS_LABEL_DPO_FLAG_NONE],
+            mld_clone->mld_payload_proto,
+            mpls_label_dpo_get_index(mld_clone));
+}
+
 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,
 };
 
 const static char* const mpls_label_imp_pipe_ip4_nodes[] =