l2: handle complete clone fail in l2_flood
vlib_buffer_clone(...) may not manage to produce any buffer clones at all. vlib_buffer_clone_256 should not smash the original buffer reference count if no clones are produced. Type: fix Signed-off-by: Dave Barach <dave@barachs.net> Change-Id: I14d9d53637a220485c7a0036cfc75a4149b264ea
This commit is contained in:
@ -1208,11 +1208,11 @@ vlib_buffer_clone_256 (vlib_main_t * vm, u32 src_buffer, u32 * buffers,
|
||||
d->next_buffer = src_buffer;
|
||||
}
|
||||
vlib_buffer_advance (s, head_end_offset);
|
||||
s->ref_count = n_buffers;
|
||||
s->ref_count = n_buffers ? n_buffers : s->ref_count;
|
||||
while (s->flags & VLIB_BUFFER_NEXT_PRESENT)
|
||||
{
|
||||
s = vlib_get_buffer (vm, s->next_buffer);
|
||||
s->ref_count = n_buffers;
|
||||
s->ref_count = n_buffers ? n_buffers : s->ref_count;
|
||||
}
|
||||
|
||||
return n_buffers;
|
||||
|
@ -230,6 +230,13 @@ VLIB_NODE_FN (l2flood_node) (vlib_main_t * vm,
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -284,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
|
||||
*/
|
||||
@ -306,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))
|
||||
{
|
||||
|
Reference in New Issue
Block a user