ip: simpler and faster ip4_full_reass_drop_all

Type: improvement
Change-Id: I4a75583ce718ba6466cd09ca8373fd43988ef62a
Signed-off-by: Damjan Marion <dmarion@me.com>
This commit is contained in:
Damjan Marion
2022-09-14 17:40:24 +02:00
committed by Dave Wallace
parent dd298e804a
commit 42ed836fbd

View File

@@ -427,8 +427,7 @@ ip4_full_reass_free (ip4_full_reass_main_t * rm,
* with local variables would cause either buffer leak or corruption */
always_inline void
ip4_full_reass_drop_all (vlib_main_t *vm, vlib_node_runtime_t *node,
ip4_full_reass_t *reass, u32 *n_left_to_next,
u32 **to_next)
ip4_full_reass_t *reass)
{
u32 range_bi = reass->first_bi;
vlib_buffer_t *range_b;
@@ -452,40 +451,23 @@ ip4_full_reass_drop_all (vlib_main_t *vm, vlib_node_runtime_t *node,
if (~0 != reass->error_next_index &&
reass->error_next_index < node->n_next_nodes)
{
u32 next_index;
next_index = reass->error_next_index;
u32 bi = ~0;
u32 n_free = vec_len (to_free);
/* record number of packets sent to custom app */
vlib_node_increment_counter (vm, node->node_index,
IP4_ERROR_REASS_TO_CUSTOM_APP,
vec_len (to_free));
IP4_ERROR_REASS_TO_CUSTOM_APP, n_free);
while (vec_len (to_free) > 0)
{
vlib_get_next_frame (vm, node, next_index, *to_next,
(*n_left_to_next));
if (node->flags & VLIB_NODE_FLAG_TRACE)
for (u32 i = 0; i < n_free; i++)
{
vlib_buffer_t *b = vlib_get_buffer (vm, to_free[i]);
if (PREDICT_FALSE (b->flags & VLIB_BUFFER_IS_TRACED))
ip4_full_reass_add_trace (vm, node, reass, to_free[i],
RANGE_DISCARD, 0, ~0);
}
while (vec_len (to_free) > 0 && (*n_left_to_next) > 0)
{
bi = vec_pop (to_free);
if (~0 != bi)
{
vlib_buffer_t *b = vlib_get_buffer (vm, bi);
if (PREDICT_FALSE (b->flags & VLIB_BUFFER_IS_TRACED))
{
ip4_full_reass_add_trace (vm, node, reass, bi,
RANGE_DISCARD, 0, ~0);
}
*to_next[0] = bi;
(*to_next) += 1;
(*n_left_to_next) -= 1;
}
}
vlib_put_next_frame (vm, node, next_index, (*n_left_to_next));
}
vlib_buffer_enqueue_to_single_next (vm, node, to_free,
reass->error_next_index, n_free);
}
else
{
@@ -564,8 +546,7 @@ always_inline ip4_full_reass_t *
ip4_full_reass_find_or_create (vlib_main_t *vm, vlib_node_runtime_t *node,
ip4_full_reass_main_t *rm,
ip4_full_reass_per_thread_t *rt,
ip4_full_reass_kv_t *kv, u8 *do_handoff,
u32 *n_left_to_next, u32 **to_next)
ip4_full_reass_kv_t *kv, u8 *do_handoff)
{
ip4_full_reass_t *reass;
f64 now;
@@ -590,7 +571,7 @@ again:
{
vlib_node_increment_counter (vm, node->node_index,
IP4_ERROR_REASS_TIMEOUT, 1);
ip4_full_reass_drop_all (vm, node, reass, n_left_to_next, to_next);
ip4_full_reass_drop_all (vm, node, reass);
ip4_full_reass_free (rm, rt, reass);
reass = NULL;
}
@@ -1257,8 +1238,8 @@ ip4_full_reass_inline (vlib_main_t *vm, vlib_node_runtime_t *node,
};
u8 do_handoff = 0;
ip4_full_reass_t *reass = ip4_full_reass_find_or_create (
vm, node, rm, rt, &kv, &do_handoff, &n_left_to_next, &to_next);
ip4_full_reass_t *reass =
ip4_full_reass_find_or_create (vm, node, rm, rt, &kv, &do_handoff);
if (reass)
{
@@ -1316,8 +1297,7 @@ ip4_full_reass_inline (vlib_main_t *vm, vlib_node_runtime_t *node,
{
vlib_node_increment_counter (vm, node->node_index, counter,
1);
ip4_full_reass_drop_all (vm, node, reass, &n_left_to_next,
&to_next);
ip4_full_reass_drop_all (vm, node, reass);
ip4_full_reass_free (rm, rt, reass);
goto next_packet;
}
@@ -1686,7 +1666,6 @@ ip4_full_reass_walk_expired (vlib_main_t *vm, vlib_node_runtime_t *node,
uword thread_index = 0;
int index;
const uword nthreads = vlib_num_workers () + 1;
u32 n_left_to_next, *to_next;
for (thread_index = 0; thread_index < nthreads; ++thread_index)
{
@@ -1732,8 +1711,7 @@ ip4_full_reass_walk_expired (vlib_main_t *vm, vlib_node_runtime_t *node,
vec_foreach (i, pool_indexes_to_free)
{
ip4_full_reass_t *reass = pool_elt_at_index (rt->pool, i[0]);
ip4_full_reass_drop_all (vm, node, reass, &n_left_to_next,
&to_next);
ip4_full_reass_drop_all (vm, node, reass);
ip4_full_reass_free (rm, rt, reass);
}