X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fdpo%2Fmpls_label_dpo.c;h=ab8c06df4d558676546970e1bb2a6d9968866812;hb=178cf493d009995b28fdf220f04c98860ff79a9b;hp=ebbbbec9b64aebbd46f260fc93eeda0cf3e7fb6c;hpb=19bd1902cb8cc074470f1e178d1df0601f75f58b;p=vpp.git diff --git a/src/vnet/dpo/mpls_label_dpo.c b/src/vnet/dpo/mpls_label_dpo.c index ebbbbec9b64..ab8c06df4d5 100644 --- a/src/vnet/dpo/mpls_label_dpo.c +++ b/src/vnet/dpo/mpls_label_dpo.c @@ -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[] =