vlib: vlib_validate_buffer_enqueue_with_aux_x1

This change implement a flavour of vlib_validate_buffer_enqueue_x1 with
aux data support

Change-Id: I2ecf7af49cf15ecd23b12d8acd57fe90546c1af7
Type: improvement
Signed-off-by: Mohammed Hawari <mohammed@hawari.fr>
This commit is contained in:
Mohammed Hawari
2022-06-02 13:55:36 +02:00
committed by Beno�t Ganne
parent 83caa62efa
commit 16052480c3
2 changed files with 71 additions and 0 deletions
+47
View File
@@ -236,6 +236,53 @@ do { \
} \
} while (0)
/** \brief Finish enqueueing one buffer forward in the graph, along with its
aux_data if possible. Standard single loop boilerplate element. This is a
MACRO, with MULTIPLE SIDE EFFECTS. In the ideal case, <code>next_index ==
next0</code>, which means that the speculative enqueue at the top of the
single loop has correctly dealt with the packet in hand. In that case, the
macro does nothing at all. This function MAY return to_next_aux = NULL if
next_index does not support aux data
@param vm vlib_main_t pointer, varies by thread
@param node current node vlib_node_runtime_t pointer
@param next_index speculated next index used for both packets
@param to_next speculated vector pointer used for both packets
@param to_next_aux speculated aux_data pointer used for both packets
@param n_left_to_next number of slots left in speculated vector
@param bi0 first buffer index
@param aux0 first aux_data
@param next0 actual next index to be used for the first packet
@return @c next_index -- speculative next index to be used for future packets
@return @c to_next -- speculative frame to be used for future packets
@return @c n_left_to_next -- number of slots left in speculative frame
*/
#define vlib_validate_buffer_enqueue_with_aux_x1( \
vm, node, next_index, to_next, to_next_aux, n_left_to_next, bi0, aux0, \
next0) \
do \
{ \
ASSERT (bi0 != 0); \
if (PREDICT_FALSE (next0 != next_index)) \
{ \
vlib_put_next_frame (vm, node, next_index, n_left_to_next + 1); \
next_index = next0; \
vlib_get_next_frame_with_aux_safe (vm, node, next_index, to_next, \
to_next_aux, n_left_to_next); \
\
to_next[0] = bi0; \
to_next += 1; \
if (to_next_aux) \
{ \
to_next_aux[0] = aux0; \
to_next_aux += 1; \
} \
n_left_to_next -= 1; \
} \
} \
while (0)
always_inline uword
generic_buffer_node_inline (vlib_main_t * vm,
vlib_node_runtime_t * node,
+24
View File
@@ -498,6 +498,16 @@ vlib_put_next_frame (vlib_main_t * vm,
(v); \
})
#define vlib_set_next_frame_with_aux_safe(vm, node, next_index, v, aux) \
({ \
uword _n_left; \
vlib_get_next_frame_with_aux_safe ((vm), (node), (next_index), (v), \
(aux), _n_left); \
ASSERT (_n_left > 0); \
vlib_put_next_frame ((vm), (node), (next_index), _n_left - 1); \
(v); \
})
always_inline void
vlib_set_next_frame_buffer (vlib_main_t * vm,
vlib_node_runtime_t * node,
@@ -508,6 +518,20 @@ vlib_set_next_frame_buffer (vlib_main_t * vm,
p[0] = buffer_index;
}
always_inline void
vlib_set_next_frame_buffer_with_aux_safe (vlib_main_t *vm,
vlib_node_runtime_t *node,
u32 next_index, u32 buffer_index,
u32 aux)
{
u32 *p;
u32 *a;
p = vlib_set_next_frame_with_aux_safe (vm, node, next_index, p, a);
p[0] = buffer_index;
if (a)
a[0] = aux;
}
vlib_frame_t *vlib_get_frame_to_node (vlib_main_t * vm, u32 to_node_index);
void vlib_put_frame_to_node (vlib_main_t * vm, u32 to_node_index,
vlib_frame_t * f);