#include <vppinfra/serialize.h>
-extern void vl_msg_api_barrier_sync (void);
-extern void vl_msg_api_barrier_release (void);
-
/* serialized representation of state strings */
#define foreach_state_string_code \
* to recycle a vector / avoid memory allocation, etc.
* Switch heaps before/after to serialize into API client shared memory.
*/
-
u8 *
-vlib_node_serialize (vlib_node_main_t * nm, u8 * vector,
- u32 max_threads, int include_nexts, int include_stats)
+vlib_node_serialize (vlib_main_t * vm, vlib_node_t *** node_dups, u8 * vector,
+ int include_nexts, int include_stats)
{
serialize_main_t _sm, *sm = &_sm;
- vlib_main_t *vm = vlib_get_main ();
vlib_node_t *n;
- static vlib_node_t ***node_dups;
vlib_node_t **nodes;
- static vlib_main_t **stat_vms;
- vlib_main_t *stat_vm;
u8 *namep;
u32 name_bytes;
uword i, j, k;
u64 l, v, c, d;
state_string_enum_t state_code;
- u32 threads_to_serialize;
-
- vec_reset_length (node_dups);
-
- if (vec_len (stat_vms) == 0)
- {
- if (vec_len (vlib_mains) == 0)
- vec_add1 (stat_vms, vm);
- else
- {
- for (i = 0; i < vec_len (vlib_mains); i++)
- {
- stat_vm = vlib_mains[i];
- if (stat_vm)
- vec_add1 (stat_vms, stat_vm);
- }
- }
- }
-
- threads_to_serialize = clib_min (max_threads, vec_len (stat_vms));
-
- /*
- * Barrier sync across stats scraping.
- * Otherwise, the counts will be grossly inaccurate.
- */
- vl_msg_api_barrier_sync ();
-
- for (j = 0; j < threads_to_serialize; j++)
- {
- stat_vm = stat_vms[j];
- nm = &stat_vm->node_main;
-
- if (include_stats)
- {
- for (i = 0; i < vec_len (nm->nodes); i++)
- {
- n = nm->nodes[i];
- vlib_node_sync_stats (stat_vm, n);
- }
- }
-
- nodes = vec_dup (nm->nodes);
-
- vec_add1 (node_dups, nodes);
- }
- vl_msg_api_barrier_release ();
serialize_open_vector (sm, vector);
+ serialize_likely_small_unsigned_integer (sm, vec_len (node_dups));
- serialize_likely_small_unsigned_integer (sm, vec_len (stat_vms));
-
- for (j = 0; j < vec_len (stat_vms); j++)
+ for (j = 0; j < vec_len (node_dups); j++)
{
- stat_vm = stat_vms[j];
nodes = node_dups[j];
serialize_likely_small_unsigned_integer (sm, vec_len (nodes));
serialize_likely_small_unsigned_integer (sm, (u64) state_code);
serialize_likely_small_unsigned_integer (sm, n->type);
+ serialize_likely_small_unsigned_integer (sm, n->flags);
if (include_nexts)
{
else /* no stats */
serialize_likely_small_unsigned_integer (sm, 0);
}
- vec_free (nodes);
}
return (serialize_close_vector (sm));
}
node->state_string = (u8 *) state_strings[state_code];
node->type = unserialize_likely_small_unsigned_integer (sm);
+ node->flags = unserialize_likely_small_unsigned_integer (sm);
nnexts = unserialize_likely_small_unsigned_integer (sm);
if (nnexts > 0)
vec_validate (node->next_nodes, nnexts - 1);
return nodes_by_thread;
}
-#if CLIB_DEBUG > 0
+#if TEST_CODE
static clib_error_t *
test_node_serialize_command_fn (vlib_main_t * vm,