vppinfra: add vec_set_len() 35/21935/6
authorBenoît Ganne <bganne@cisco.com>
Mon, 22 Jul 2019 12:21:46 +0000 (14:21 +0200)
committerDamjan Marion <dmarion@me.com>
Tue, 22 Oct 2019 08:14:26 +0000 (08:14 +0000)
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>
src/vnet/bier/bier_lookup.c
src/vnet/l2/l2_flood.c
src/vppinfra/vec_bootstrap.h

index a9fab9c..9361845 100644 (file)
@@ -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,
index 8d34233..10e0877 100644 (file)
@@ -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];
index fec0df0..7fb016f 100644 (file)
@@ -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))