LCOV - code coverage report
Current view: top level - vnet/interface - stats.c (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 30 30 100.0 %
Date: 2023-10-26 01:39:38 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: Apache-2.0
       2             :  * Copyright(c) 2022 Cisco Systems, Inc.
       3             :  */
       4             : 
       5             : #include <vlib/vlib.h>
       6             : #include <vlib/unix/unix.h>
       7             : #include <vlib/stats/stats.h>
       8             : #include <vnet/vnet.h>
       9             : #include <vnet/devices/devices.h> /* vnet_get_aggregate_rx_packets */
      10             : #include <vnet/interface.h>
      11             : 
      12             : vlib_stats_string_vector_t if_names = 0;
      13             : static u32 **dir_entry_indices = 0;
      14             : 
      15             : static struct
      16             : {
      17             :   char *prefix, *name;
      18             :   u32 index;
      19             : } if_counters[] = {
      20             : #define _(e, n, p) { .prefix = #p, .name = #n },
      21             :   foreach_simple_interface_counter_name foreach_combined_interface_counter_name
      22             : #undef _
      23             : };
      24             : 
      25             : static clib_error_t *
      26       11798 : statseg_sw_interface_add_del (vnet_main_t *vnm, u32 sw_if_index, u32 is_add)
      27             : {
      28       11798 :   u8 *name = 0;
      29             : 
      30       11798 :   if (if_names == 0)
      31             :     {
      32         575 :       if_names = vlib_stats_add_string_vector ("/if/names");
      33             : 
      34       10350 :       for (int i = 0; i < ARRAY_LEN (if_counters); i++)
      35        9775 :         if_counters[i].index = vlib_stats_find_entry_index (
      36             :           "/%s/%s", if_counters[i].prefix, if_counters[i].name);
      37             :     }
      38             : 
      39       11798 :   vec_validate (dir_entry_indices, sw_if_index);
      40             : 
      41       11798 :   vlib_stats_segment_lock ();
      42             : 
      43       11798 :   if (is_add)
      44             :     {
      45             :       vnet_sw_interface_t *si, *si_sup;
      46             :       vnet_hw_interface_t *hi_sup;
      47             : 
      48        7547 :       si = vnet_get_sw_interface (vnm, sw_if_index);
      49        7547 :       si_sup = vnet_get_sup_sw_interface (vnm, si->sw_if_index);
      50        7547 :       ASSERT (si_sup->type == VNET_SW_INTERFACE_TYPE_HARDWARE);
      51        7547 :       hi_sup = vnet_get_hw_interface (vnm, si_sup->hw_if_index);
      52             : 
      53        7547 :       name = format (0, "%v", hi_sup->name);
      54        7547 :       if (si->type != VNET_SW_INTERFACE_TYPE_HARDWARE)
      55        1119 :         name = format (name, ".%d", si->sub.id);
      56             : 
      57        7547 :       vlib_stats_set_string_vector (&if_names, sw_if_index, "%v", name);
      58             : 
      59      135846 :       for (u32 index, i = 0; i < ARRAY_LEN (if_counters); i++)
      60             :         {
      61      128299 :           index = vlib_stats_add_symlink (
      62             :             if_counters[i].index, sw_if_index, "/interfaces/%U/%s",
      63             :             format_vlib_stats_symlink, name, if_counters[i].name);
      64      128299 :           ASSERT (index != ~0);
      65      128299 :           vec_add1 (dir_entry_indices[sw_if_index], index);
      66             :         }
      67             :     }
      68             :   else
      69             :     {
      70        4251 :       name = format (0, "%s", "deleted");
      71        4251 :       vlib_stats_set_string_vector (&if_names, sw_if_index, "%v", name);
      72       76518 :       for (u32 i = 0; i < vec_len (dir_entry_indices[sw_if_index]); i++)
      73       72267 :         vlib_stats_remove_entry (dir_entry_indices[sw_if_index][i]);
      74        4251 :       vec_free (dir_entry_indices[sw_if_index]);
      75             :     }
      76             : 
      77       11798 :   vec_free (name);
      78             : 
      79       11798 :   vlib_stats_segment_unlock ();
      80             : 
      81       11798 :   return 0;
      82             : }
      83             : 
      84        3459 : VNET_SW_INTERFACE_ADD_DEL_FUNCTION (statseg_sw_interface_add_del);

Generated by: LCOV version 1.14