-static char *
-counter_type_to_str (u8 counter_type, u8 is_combined)
-{
- if (!is_combined)
- {
- switch (counter_type)
- {
- case VNET_INTERFACE_COUNTER_DROP:
- return "drop";
- case VNET_INTERFACE_COUNTER_PUNT:
- return "punt";
- case VNET_INTERFACE_COUNTER_IP4:
- return "ip4";
- case VNET_INTERFACE_COUNTER_IP6:
- return "ip6";
- case VNET_INTERFACE_COUNTER_RX_NO_BUF:
- return "rx-no-buf";
- case VNET_INTERFACE_COUNTER_RX_MISS:
- return "rx-miss";
- case VNET_INTERFACE_COUNTER_RX_ERROR:
- return "rx-error";
- case VNET_INTERFACE_COUNTER_TX_ERROR:
- return "tx-error";
- default:
- return "INVALID-COUNTER-TYPE";
- }
- }
- else
- {
- switch (counter_type)
- {
- case VNET_INTERFACE_COUNTER_RX:
- return "rx";
- case VNET_INTERFACE_COUNTER_TX:
- return "tx";
- default:
- return "INVALID-COUNTER-TYPE";
- }
- }
-}
-
-static int
-dump_stats_table (vat_main_t * vam)
-{
- vat_json_node_t node;
- vat_json_node_t *msg_array;
- vat_json_node_t *msg;
- vat_json_node_t *counter_array;
- vat_json_node_t *counter;
- interface_counter_t c;
- u64 packets;
- ip4_fib_counter_t *c4;
- ip6_fib_counter_t *c6;
- ip4_nbr_counter_t *n4;
- ip6_nbr_counter_t *n6;
- int i, j;
-
- if (!vam->json_output)
- {
- clib_warning ("dump_stats_table supported only in JSON format");
- return -99;
- }
-
- vat_json_init_object (&node);
-
- /* interface counters */
- msg_array = vat_json_object_add (&node, "interface_counters");
- vat_json_init_array (msg_array);
- for (i = 0; i < vec_len (vam->simple_interface_counters); i++)
- {
- msg = vat_json_array_add (msg_array);
- vat_json_init_object (msg);
- vat_json_object_add_string_copy (msg, "vnet_counter_type",
- (u8 *) counter_type_to_str (i, 0));
- vat_json_object_add_int (msg, "is_combined", 0);
- counter_array = vat_json_object_add (msg, "data");
- vat_json_init_array (counter_array);
- for (j = 0; j < vec_len (vam->simple_interface_counters[i]); j++)
- {
- packets = vam->simple_interface_counters[i][j];
- vat_json_array_add_uint (counter_array, packets);
- }
- }
- for (i = 0; i < vec_len (vam->combined_interface_counters); i++)
- {
- msg = vat_json_array_add (msg_array);
- vat_json_init_object (msg);
- vat_json_object_add_string_copy (msg, "vnet_counter_type",
- (u8 *) counter_type_to_str (i, 1));
- vat_json_object_add_int (msg, "is_combined", 1);
- counter_array = vat_json_object_add (msg, "data");
- vat_json_init_array (counter_array);
- for (j = 0; j < vec_len (vam->combined_interface_counters[i]); j++)
- {
- c = vam->combined_interface_counters[i][j];
- counter = vat_json_array_add (counter_array);
- vat_json_init_object (counter);
- vat_json_object_add_uint (counter, "packets", c.packets);
- vat_json_object_add_uint (counter, "bytes", c.bytes);
- }
- }
-
- /* ip4 fib counters */
- msg_array = vat_json_object_add (&node, "ip4_fib_counters");
- vat_json_init_array (msg_array);
- for (i = 0; i < vec_len (vam->ip4_fib_counters); i++)
- {
- msg = vat_json_array_add (msg_array);
- vat_json_init_object (msg);
- vat_json_object_add_uint (msg, "vrf_id",
- vam->ip4_fib_counters_vrf_id_by_index[i]);
- counter_array = vat_json_object_add (msg, "c");
- vat_json_init_array (counter_array);
- for (j = 0; j < vec_len (vam->ip4_fib_counters[i]); j++)
- {
- counter = vat_json_array_add (counter_array);
- vat_json_init_object (counter);
- c4 = &vam->ip4_fib_counters[i][j];
- vat_json_object_add_ip4 (counter, "address", c4->address);
- vat_json_object_add_uint (counter, "address_length",
- c4->address_length);
- vat_json_object_add_uint (counter, "packets", c4->packets);
- vat_json_object_add_uint (counter, "bytes", c4->bytes);
- }
- }
-
- /* ip6 fib counters */
- msg_array = vat_json_object_add (&node, "ip6_fib_counters");
- vat_json_init_array (msg_array);
- for (i = 0; i < vec_len (vam->ip6_fib_counters); i++)
- {
- msg = vat_json_array_add (msg_array);
- vat_json_init_object (msg);
- vat_json_object_add_uint (msg, "vrf_id",
- vam->ip6_fib_counters_vrf_id_by_index[i]);
- counter_array = vat_json_object_add (msg, "c");
- vat_json_init_array (counter_array);
- for (j = 0; j < vec_len (vam->ip6_fib_counters[i]); j++)
- {
- counter = vat_json_array_add (counter_array);
- vat_json_init_object (counter);
- c6 = &vam->ip6_fib_counters[i][j];
- vat_json_object_add_ip6 (counter, "address", c6->address);
- vat_json_object_add_uint (counter, "address_length",
- c6->address_length);
- vat_json_object_add_uint (counter, "packets", c6->packets);
- vat_json_object_add_uint (counter, "bytes", c6->bytes);
- }
- }
-
- /* ip4 nbr counters */
- msg_array = vat_json_object_add (&node, "ip4_nbr_counters");
- vat_json_init_array (msg_array);
- for (i = 0; i < vec_len (vam->ip4_nbr_counters); i++)
- {
- msg = vat_json_array_add (msg_array);
- vat_json_init_object (msg);
- vat_json_object_add_uint (msg, "sw_if_index", i);
- counter_array = vat_json_object_add (msg, "c");
- vat_json_init_array (counter_array);
- for (j = 0; j < vec_len (vam->ip4_nbr_counters[i]); j++)
- {
- counter = vat_json_array_add (counter_array);
- vat_json_init_object (counter);
- n4 = &vam->ip4_nbr_counters[i][j];
- vat_json_object_add_ip4 (counter, "address", n4->address);
- vat_json_object_add_uint (counter, "link-type", n4->linkt);
- vat_json_object_add_uint (counter, "packets", n4->packets);
- vat_json_object_add_uint (counter, "bytes", n4->bytes);
- }
- }
-
- /* ip6 nbr counters */
- msg_array = vat_json_object_add (&node, "ip6_nbr_counters");
- vat_json_init_array (msg_array);
- for (i = 0; i < vec_len (vam->ip6_nbr_counters); i++)
- {
- msg = vat_json_array_add (msg_array);
- vat_json_init_object (msg);
- vat_json_object_add_uint (msg, "sw_if_index", i);
- counter_array = vat_json_object_add (msg, "c");
- vat_json_init_array (counter_array);
- for (j = 0; j < vec_len (vam->ip6_nbr_counters[i]); j++)
- {
- counter = vat_json_array_add (counter_array);
- vat_json_init_object (counter);
- n6 = &vam->ip6_nbr_counters[i][j];
- vat_json_object_add_ip6 (counter, "address", n6->address);
- vat_json_object_add_uint (counter, "packets", n6->packets);
- vat_json_object_add_uint (counter, "bytes", n6->bytes);
- }
- }
-
- vat_json_print (vam->ofp, &node);
- vat_json_free (&node);
-
- return 0;
-}
-
-int
-exec (vat_main_t * vam)
-{
- api_main_t *am = &api_main;
- vl_api_cli_t *mp;
- f64 timeout;
- void *oldheap;
- u8 *cmd = 0;
- unformat_input_t *i = vam->input;
-
- if (vec_len (i->buffer) == 0)
- return -1;
-
- if (vam->exec_mode == 0 && unformat (i, "mode"))
- {
- vam->exec_mode = 1;
- return 0;
- }
- if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
- {
- vam->exec_mode = 0;
- return 0;
- }
-
-
- M (CLI, mp);
-
- /*
- * Copy cmd into shared memory.
- * In order for the CLI command to work, it
- * must be a vector ending in \n, not a C-string ending
- * in \n\0.
- */
- pthread_mutex_lock (&am->vlib_rp->mutex);
- oldheap = svm_push_data_heap (am->vlib_rp);
-
- vec_validate (cmd, vec_len (vam->input->buffer) - 1);
- clib_memcpy (cmd, vam->input->buffer, vec_len (vam->input->buffer));
-
- svm_pop_heap (oldheap);
- pthread_mutex_unlock (&am->vlib_rp->mutex);
-
- mp->cmd_in_shmem = pointer_to_uword (cmd);
- S (mp);
- timeout = vat_time_now (vam) + 10.0;
-
- while (vat_time_now (vam) < timeout)
- {
- if (vam->result_ready == 1)
- {
- u8 *free_me;
- if (vam->shmem_result != NULL)
- print (vam->ofp, "%s", vam->shmem_result);
- pthread_mutex_lock (&am->vlib_rp->mutex);
- oldheap = svm_push_data_heap (am->vlib_rp);
-
- free_me = (u8 *) vam->shmem_result;
- vec_free (free_me);
-
- svm_pop_heap (oldheap);
- pthread_mutex_unlock (&am->vlib_rp->mutex);
- return 0;
- }
- }
- return -99;
-}
-
-/*
- * Future replacement of exec() that passes CLI buffers directly in
- * the API messages instead of an additional shared memory area.
- */