X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface.c;h=797fe44419a2f0e58cd1bab2d2b5072d91fd7821;hb=048a4e5a000017d0d632ebf02dcc23d9bf9ccf72;hp=ba342d49c9e84dbd585741dc1f919b1b3b87df0c;hpb=6f4a6be8f222dd8caa94d19a7e4d87cb864ba7f4;p=vpp.git diff --git a/src/vnet/interface.c b/src/vnet/interface.c index ba342d49c9e..797fe44419a 100644 --- a/src/vnet/interface.c +++ b/src/vnet/interface.c @@ -485,10 +485,13 @@ vnet_sw_interface_set_flags_helper (vnet_main_t * vnm, u32 sw_if_index, error = call_elf_section_interface_callbacks (vnm, sw_if_index, flags, vnm->sw_interface_admin_up_down_functions); - si->flags = old_flags; if (error) - goto done; + { + /* restore flags on error */ + si->flags = old_flags; + goto done; + } if (si->type == VNET_SW_INTERFACE_TYPE_HARDWARE) { @@ -667,6 +670,7 @@ vnet_delete_sw_interface (vnet_main_t * vnm, u32 sw_if_index) if (config->xconnect || config->bridge) set_int_l2_mode (vm, vnm, MODE_L3, sw_if_index, 0, 0, 0, 0); } + vnet_clear_sw_interface_tag (vnm, sw_if_index); /* Bring down interface in case it is up. */ if (sw->flags != 0) @@ -717,7 +721,7 @@ vnet_register_interface (vnet_main_t * vnm, vnet_feature_config_main_t *fcm; vnet_config_main_t *cm; u32 hw_index, i; - char *tx_node_name, *output_node_name; + char *tx_node_name = NULL, *output_node_name = NULL; pool_get (im->hw_interfaces, hw); memset (hw, 0, sizeof (*hw)); @@ -907,6 +911,8 @@ no_output_nodes: VNET_INTERFACE_SET_FLAGS_HELPER_IS_CREATE); vnet_hw_interface_set_flags_helper (vnm, hw_index, /* flags */ 0, VNET_INTERFACE_SET_FLAGS_HELPER_IS_CREATE); + vec_free (tx_node_name); + vec_free (output_node_name); return hw_index; } @@ -973,6 +979,7 @@ vnet_delete_hw_interface (vnet_main_t * vnm, u32 hw_if_index) hash_unset_mem (im->hw_interface_by_name, hw->name); vec_free (hw->name); + vec_free (hw->hw_address); vec_free (hw->input_node_thread_index_by_queue); vec_free (hw->dq_runtime_index_by_queue); @@ -995,11 +1002,30 @@ vnet_hw_interface_walk_sw (vnet_main_t * vnm, hash_foreach (id, sw_if_index, hi->sub_interface_sw_if_index_by_id, ({ - fn (vnm, sw_if_index, ctx); + if (WALK_STOP == fn (vnm, sw_if_index, ctx)) + break; })); /* *INDENT-ON* */ } +void +vnet_sw_interface_walk (vnet_main_t * vnm, + vnet_sw_interface_walk_t fn, void *ctx) +{ + vnet_interface_main_t *im; + vnet_sw_interface_t *si; + + im = &vnm->interface_main; + + /* *INDENT-OFF* */ + pool_foreach (si, im->sw_interfaces, + { + if (WALK_STOP == fn (vnm, si, ctx)) + break; + }); + /* *INDENT-ON* */ +} + static void serialize_vnet_hw_interface_set_class (serialize_main_t * m, va_list * va) { @@ -1224,6 +1250,10 @@ vnet_interface_init (vlib_main_t * vm) CLIB_CACHE_LINE_BYTES); im->sw_if_counter_lock[0] = 1; /* should be no need */ + /* + * $$$$ add stat segment name(s) if desired + * set xxx.stat_segment_name = "whatever"... + */ vec_validate (im->sw_if_counters, VNET_N_SIMPLE_INTERFACE_COUNTER - 1); im->sw_if_counters[VNET_INTERFACE_COUNTER_DROP].name = "drops"; im->sw_if_counters[VNET_INTERFACE_COUNTER_PUNT].name = "punts"; @@ -1534,7 +1564,7 @@ default_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, u32 ai) vnet_build_rewrite_for_sw_interface (vnm, sw_if_index, adj_get_link_type (ai), - NULL), 0, 0); + NULL), 0); break; case IP_LOOKUP_NEXT_DROP: case IP_LOOKUP_NEXT_PUNT: @@ -1552,13 +1582,13 @@ default_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, u32 ai) int collect_detailed_interface_stats_flag = 0; void -collect_detailed_interface_stats_flag_set () +collect_detailed_interface_stats_flag_set (void) { collect_detailed_interface_stats_flag = 1; } void -collect_detailed_interface_stats_flag_clear () +collect_detailed_interface_stats_flag_clear (void) { collect_detailed_interface_stats_flag = 0; }