dpdk: xstats vecor stuck at 0 elements
[vpp.git] / src / vnet / dpo / replicate_dpo.c
index 69e367a..0474fd8 100644 (file)
@@ -172,6 +172,8 @@ replicate_create_i (u32 num_buckets,
 {
     replicate_t *rep;
 
+    ASSERT (num_buckets <= REP_MAX_BUCKETS);
+
     rep = replicate_alloc_i();
     rep->rep_n_buckets = num_buckets;
     rep->rep_proto = rep_proto;
@@ -311,7 +313,8 @@ static inline void
 replicate_set_n_buckets (replicate_t *rep,
                          u32 n_buckets)
 {
-    rep->rep_n_buckets = n_buckets;
+  ASSERT (n_buckets <= REP_MAX_BUCKETS);
+  rep->rep_n_buckets = n_buckets;
 }
 
 void
@@ -331,6 +334,17 @@ replicate_multipath_update (const dpo_id_t *dpo,
                                              rep->rep_proto);
     n_buckets = vec_len(nhs);
 
+    if (n_buckets > REP_MAX_BUCKETS)
+      {
+       vlib_log_err (replicate_logger,
+                     "Too many paths for replicate, truncating %d -> %d",
+                     n_buckets, REP_MAX_BUCKETS);
+       for (int i = REP_MAX_BUCKETS; i < n_buckets; i++)
+         dpo_reset (&vec_elt (nhs, i).path_dpo);
+       vec_set_len (nhs, REP_MAX_BUCKETS);
+       n_buckets = REP_MAX_BUCKETS;
+      }
+
     if (0 == rep->rep_n_buckets)
     {
         /*
@@ -687,19 +701,22 @@ replicate_show (vlib_main_t * vm,
 
     if (INDEX_INVALID != repi)
     {
-        vlib_cli_output (vm, "%U", format_replicate, repi,
+           if (pool_is_free_index (replicate_pool, repi))
+               vlib_cli_output (vm, "no such index %d", repi);
+           else
+               vlib_cli_output (vm, "%U", format_replicate, repi,
                          REPLICATE_FORMAT_DETAIL);
     }
     else
     {
         replicate_t *rep;
 
-        pool_foreach(rep, replicate_pool,
-        ({
+        pool_foreach (rep, replicate_pool)
+         {
             vlib_cli_output (vm, "%U", format_replicate,
                              replicate_get_index(rep),
                              REPLICATE_FORMAT_NONE);
-        }));
+        }
     }
 
     return 0;
@@ -788,11 +805,6 @@ replicate_inline (vlib_main_t * vm,
                 {
                     replicate_trace_t *t;
 
-                    if (c0 != b0)
-                    {
-                        vlib_buffer_copy_trace_flag (vm, b0, ci0);
-                        VLIB_BUFFER_TRACE_TRAJECTORY_INIT (c0);
-                    }
                     t = vlib_add_trace (vm, node, c0, sizeof (*t));
                     t->rep_index = repi0;
                     t->dpo = *dpo0;