From b8dca74c232d6f177479d644dc3359b82772ea9e Mon Sep 17 00:00:00 2001 From: Dave Barach Date: Fri, 1 Jul 2016 12:38:11 -0400 Subject: [PATCH] VPP-171: fix a set of hw interface recycling bugs Change-Id: I735292bb2176742acab2295f90956c57e6f7ec1c Signed-off-by: Dave Barach --- vnet/vnet/devices/dpdk/vhost_user.c | 2 +- vnet/vnet/interface.c | 9 +++++++++ vnet/vnet/ip/ip46_cli.c | 17 +++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/vnet/vnet/devices/dpdk/vhost_user.c b/vnet/vnet/devices/dpdk/vhost_user.c index fd1bd221062..1918a8fe634 100644 --- a/vnet/vnet/devices/dpdk/vhost_user.c +++ b/vnet/vnet/devices/dpdk/vhost_user.c @@ -939,7 +939,7 @@ static void dpdk_unmap_all_mem_regions(dpdk_device_t * xd) vui->region_addr[i]= -1; if (r == -1) { - clib_warning("failed to unmap memory region (errno %d)", errno); + clib_unix_warning("failed to unmap memory region"); } close(vui->region_fd[i]); } diff --git a/vnet/vnet/interface.c b/vnet/vnet/interface.c index 2fb93748b1e..d84c8b03bc2 100644 --- a/vnet/vnet/interface.c +++ b/vnet/vnet/interface.c @@ -656,7 +656,16 @@ vnet_register_interface (vnet_main_t * vnm, rt = vlib_node_get_runtime_data (vm, hw->output_node_index); ASSERT (rt->is_deleted == 1); rt->is_deleted = 0; + rt->hw_if_index = hw_index; + rt->sw_if_index = hw->sw_if_index; + rt->dev_instance = hw->dev_instance; + rt = vlib_node_get_runtime_data (vm, hw->tx_node_index); + rt->hw_if_index = hw_index; + rt->sw_if_index = hw->sw_if_index; + rt->dev_instance = hw->dev_instance; + + vlib_worker_thread_node_runtime_update(); _vec_len (im->deleted_hw_interface_nodes) -= 1; } else diff --git a/vnet/vnet/ip/ip46_cli.c b/vnet/vnet/ip/ip46_cli.c index 44dde9bf3e7..3bb7d766d70 100644 --- a/vnet/vnet/ip/ip46_cli.c +++ b/vnet/vnet/ip/ip46_cli.c @@ -101,6 +101,23 @@ void ip_del_all_interface_addresses (vlib_main_t *vm, u32 sw_if_index) vec_free (ip6_masks); } +static clib_error_t * +ip_address_delete_cleanup (vnet_main_t * vnm, u32 hw_if_index, u32 is_create) +{ + vlib_main_t * vm = vlib_get_main(); + vnet_hw_interface_t * hw; + + if (is_create) + return 0; + + hw = vnet_get_hw_interface (vnm, hw_if_index); + + ip_del_all_interface_addresses (vm, hw->sw_if_index); + return 0; +} + +VNET_HW_INTERFACE_ADD_DEL_FUNCTION (ip_address_delete_cleanup); + static clib_error_t * add_del_ip_address (vlib_main_t * vm, unformat_input_t * input, -- 2.16.6