Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
l2: handle complete clone fail in l2_flood
[vpp.git]
/
src
/
vnet
/
l2
/
l2_flood.c
diff --git
a/src/vnet/l2/l2_flood.c
b/src/vnet/l2/l2_flood.c
index
1bc5281
..
b5eb5fe
100644
(file)
--- 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);
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
/*
* 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);
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];
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;
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;
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];
}
member = msm->members[thread_index][0];
}
+ use_original_buffer:
/*
* the last clone that might go to a BVI
*/
/*
* 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;
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;
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);
}
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))
{
/* Forward packet to the current member */
if (PREDICT_FALSE (member->flags & L2_FLOOD_MEMBER_BVI))
{