X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fl2%2Fl2_flood.c;h=b5eb5fe6381a301dac6758f9c82282951459881d;hb=95e19253320ab07748787f4c8a7620704563f6b8;hp=1bc528138d757846eef78f5fc1c4575a9c65cd58;hpb=44f0f71b6b1e6dac466452664817abc388662efd;p=vpp.git diff --git a/src/vnet/l2/l2_flood.c b/src/vnet/l2/l2_flood.c index 1bc528138d7..b5eb5fe6381 100644 --- a/src/vnet/l2/l2_flood.c +++ b/src/vnet/l2/l2_flood.c @@ -213,7 +213,6 @@ VLIB_NODE_FN (l2flood_node) (vlib_main_t * vm, else if (n_clones > 1) { vec_validate (msm->clones[thread_index], n_clones); - vec_reset_length (msm->clones[thread_index]); /* * the header offset needs to be large enough to incorporate @@ -226,9 +225,18 @@ VLIB_NODE_FN (l2flood_node) (vlib_main_t * vm, n_clones, VLIB_BUFFER_CLONE_HEAD_SIZE); + vec_set_len (msm->clones[thread_index], n_cloned); + if (PREDICT_FALSE (n_cloned != n_clones)) { b0->error = node->errors[L2FLOOD_ERROR_REPL_FAIL]; + /* Worst-case, no clones, consume the original buf */ + if (n_cloned == 0) + { + ci0 = bi0; + member = msm->members[thread_index][0]; + goto use_original_buffer; + } } /* @@ -250,9 +258,6 @@ VLIB_NODE_FN (l2flood_node) (vlib_main_t * vm, ethernet_header_t *h0; l2flood_trace_t *t; - if (c0 != b0) - vlib_buffer_copy_trace_flag (vm, b0, ci0); - t = vlib_add_trace (vm, node, c0, sizeof (*t)); h0 = vlib_buffer_get_current (c0); t->sw_if_index = sw_if_index0; @@ -286,6 +291,7 @@ VLIB_NODE_FN (l2flood_node) (vlib_main_t * vm, member = msm->members[thread_index][0]; } + use_original_buffer: /* * the last clone that might go to a BVI */ @@ -301,9 +307,6 @@ VLIB_NODE_FN (l2flood_node) (vlib_main_t * vm, ethernet_header_t *h0; l2flood_trace_t *t; - if (c0 != b0) - vlib_buffer_copy_trace_flag (vm, b0, ci0); - t = vlib_add_trace (vm, node, c0, sizeof (*t)); h0 = vlib_buffer_get_current (c0); t->sw_if_index = sw_if_index0; @@ -311,8 +314,6 @@ VLIB_NODE_FN (l2flood_node) (vlib_main_t * vm, clib_memcpy_fast (t->src, h0->src_address, 6); clib_memcpy_fast (t->dst, h0->dst_address, 6); } - - /* Forward packet to the current member */ if (PREDICT_FALSE (member->flags & L2_FLOOD_MEMBER_BVI)) {