vppinfra: add vec_set_len()
l2-flood and bier nodes reset vector length without updating it to its effective size. Introduce a helper to do it (this allows ASAN to keep track of the new vector size). Type: refactor Change-Id: I2d652550c440f0553a2b49c3ee3d37b49ebc16c3 Signed-off-by: Benoît Ganne <bganne@cisco.com>
This commit is contained in:

committed by
Damjan Marion

parent
26ea1465ae
commit
8a4bfdae87
@ -147,10 +147,9 @@ bier_lookup (vlib_main_t * vm,
|
||||
memcpy(bbs.bbs_buckets, bh0->bh_bit_string, bbs.bbs_len);
|
||||
|
||||
/*
|
||||
* reset the fmask and clone storage vectors
|
||||
* reset the fmask storage vector
|
||||
*/
|
||||
vec_reset_length (blm->blm_fmasks[thread_index]);
|
||||
vec_reset_length (blm->blm_clones[thread_index]);
|
||||
|
||||
/*
|
||||
* Loop through the buckets in the header
|
||||
@ -225,7 +224,9 @@ bier_lookup (vlib_main_t * vm,
|
||||
n_clones,
|
||||
VLIB_BUFFER_CLONE_HEAD_SIZE);
|
||||
|
||||
if (num_cloned != vec_len(blm->blm_fmasks[thread_index]))
|
||||
vec_set_len(blm->blm_clones[thread_index], num_cloned);
|
||||
|
||||
if (num_cloned != n_clones)
|
||||
{
|
||||
vlib_node_increment_counter
|
||||
(vm, node->node_index,
|
||||
|
@ -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);
|
||||
vec_reset_length (msm->clones[thread_index]);
|
||||
|
||||
/*
|
||||
* the header offset needs to be large enough to incorporate
|
||||
@ -226,6 +225,8 @@ VLIB_NODE_FN (l2flood_node) (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];
|
||||
|
@ -142,12 +142,6 @@ vec_aligned_header_end (void *v, uword header_bytes, uword align)
|
||||
|
||||
#define vec_len(v) ((v) ? _vec_len(v) : 0)
|
||||
|
||||
/** \brief Reset vector length to zero
|
||||
NULL-pointer tolerant
|
||||
*/
|
||||
|
||||
#define vec_reset_length(v) do { if (v) _vec_len (v) = 0; } while (0)
|
||||
|
||||
/** \brief Number of data bytes in vector. */
|
||||
|
||||
#define vec_bytes(v) (vec_len (v) * sizeof (v[0]))
|
||||
@ -165,6 +159,19 @@ vec_aligned_header_end (void *v, uword header_bytes, uword align)
|
||||
/** \brief Total number of elements that can fit into vector. */
|
||||
#define vec_max_len(v) (vec_capacity(v,0) / sizeof (v[0]))
|
||||
|
||||
/** \brief Set vector length to a user-defined value */
|
||||
#define vec_set_len(v, l) do { \
|
||||
ASSERT(v); \
|
||||
ASSERT((l) <= vec_max_len(v)); \
|
||||
_vec_len(v) = (l); \
|
||||
} while (0)
|
||||
|
||||
/** \brief Reset vector length to zero
|
||||
NULL-pointer tolerant
|
||||
*/
|
||||
|
||||
#define vec_reset_length(v) do { if (v) vec_set_len (v, 0); } while (0)
|
||||
|
||||
/** \brief End (last data address) of vector. */
|
||||
#define vec_end(v) ((v) + vec_len (v))
|
||||
|
||||
|
Reference in New Issue
Block a user