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);