From 5957a14329ab174e1215a914296cade8de8865e9 Mon Sep 17 00:00:00 2001 From: John Lo Date: Thu, 18 Jan 2018 12:44:50 -0500 Subject: Sub-Interface deletion not cleanup hash's properly (VPP-1136) On deleting sub-interfaces, functions vnet_delete_sub_interface() and vnet_delete_hw_interface() are not cleaning up sub-interface related hash tables and memory properly. Change-Id: I17c7c4b2078c062c77bfe48889beb677610035ca Signed-off-by: John Lo (cherry picked from commit 7f5bec647c9dc743c015d461d040e63a77fd0a08) --- src/vnet/ethernet/interface.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'src/vnet/ethernet/interface.c') diff --git a/src/vnet/ethernet/interface.c b/src/vnet/ethernet/interface.c index 3e78a49d62b..801c99f824d 100644 --- a/src/vnet/ethernet/interface.c +++ b/src/vnet/ethernet/interface.c @@ -737,29 +737,26 @@ int vnet_delete_sub_interface (u32 sw_if_index) { vnet_main_t *vnm = vnet_get_main (); + vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, sw_if_index); int rv = 0; if (pool_is_free_index (vnm->interface_main.sw_interfaces, sw_if_index)) return VNET_API_ERROR_INVALID_SW_IF_INDEX; - - vnet_interface_main_t *im = &vnm->interface_main; - vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, sw_if_index); - if (si->type == VNET_SW_INTERFACE_TYPE_SUB || si->type == VNET_SW_INTERFACE_TYPE_P2P) { - vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, sw_if_index); + vnet_interface_main_t *im = &vnm->interface_main; + vnet_hw_interface_t *hi = vnet_get_sup_hw_interface (vnm, sw_if_index); u64 sup_and_sub_key = ((u64) (si->sup_sw_if_index) << 32) | (u64) si->sub.id; - - hash_unset_mem (im->sw_if_index_by_sup_and_sub, &sup_and_sub_key); + hash_unset_mem_free (&im->sw_if_index_by_sup_and_sub, &sup_and_sub_key); + hash_unset (hi->sub_interface_sw_if_index_by_id, si->sub.id); vnet_delete_sw_interface (vnm, sw_if_index); } else - { - rv = VNET_API_ERROR_INVALID_SUB_SW_IF_INDEX; - } + rv = VNET_API_ERROR_INVALID_SUB_SW_IF_INDEX; + return rv; } -- cgit 1.2.3-korg