X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fl2%2Fl2_flood.c;h=b5eb5fe6381a301dac6758f9c82282951459881d;hb=95e19253320ab07748787f4c8a7620704563f6b8;hp=3198d323d60626708bb67582ec525cf6b318848a;hpb=178cf493d009995b28fdf220f04c98860ff79a9b;p=vpp.git diff --git a/src/vnet/l2/l2_flood.c b/src/vnet/l2/l2_flood.c index 3198d323d60..b5eb5fe6381 100644 --- a/src/vnet/l2/l2_flood.c +++ b/src/vnet/l2/l2_flood.c @@ -87,9 +87,11 @@ format_l2flood_trace (u8 * s, va_list * args) return s; } -l2flood_main_t l2flood_main; +extern l2flood_main_t l2flood_main; -static vlib_node_registration_t l2flood_node; +#ifndef CLIB_MARCH_VARIANT +l2flood_main_t l2flood_main; +#endif /* CLIB_MARCH_VARIANT */ #define foreach_l2flood_error \ _(L2FLOOD, "L2 flood packets") \ @@ -134,9 +136,8 @@ typedef enum * could be turned into an ICMP reply. If BVI processing is not performed * last, the modified packet would be replicated to the remaining members. */ -static uword -l2flood_node_fn (vlib_main_t * vm, - vlib_node_runtime_t * node, vlib_frame_t * frame) +VLIB_NODE_FN (l2flood_node) (vlib_main_t * vm, + vlib_node_runtime_t * node, vlib_frame_t * frame) { u32 n_left_from, *from, *to_next; l2flood_next_t next_index; @@ -212,7 +213,6 @@ l2flood_node_fn (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 @@ -225,9 +225,18 @@ l2flood_node_fn (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; + } } /* @@ -249,9 +258,6 @@ l2flood_node_fn (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; @@ -285,6 +291,7 @@ l2flood_node_fn (vlib_main_t * vm, member = msm->members[thread_index][0]; } + use_original_buffer: /* * the last clone that might go to a BVI */ @@ -300,9 +307,6 @@ l2flood_node_fn (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; @@ -310,8 +314,6 @@ l2flood_node_fn (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)) { @@ -362,8 +364,7 @@ l2flood_node_fn (vlib_main_t * vm, /* *INDENT-OFF* */ -VLIB_REGISTER_NODE (l2flood_node,static) = { - .function = l2flood_node_fn, +VLIB_REGISTER_NODE (l2flood_node) = { .name = "l2-flood", .vector_size = sizeof (u32), .format_trace = format_l2flood_trace, @@ -380,10 +381,9 @@ VLIB_REGISTER_NODE (l2flood_node,static) = { [L2FLOOD_NEXT_DROP] = "error-drop", }, }; - -VLIB_NODE_FUNCTION_MULTIARCH (l2flood_node, l2flood_node_fn) /* *INDENT-ON* */ +#ifndef CLIB_MARCH_VARIANT clib_error_t * l2flood_init (vlib_main_t * vm) { @@ -421,6 +421,7 @@ l2flood_register_input_type (vlib_main_t * vm, next_by_ethertype_register (&mp->l3_next, type, next_index); } +#endif /* CLIB_MARCH_VARIANT */ /**