vlib: fix for vlib_node_add_next_with_slot

- vlib_node_add_next_with_slot was not cleaning the old next node
references to the given slot when replacing it with new next node. This mostly
worked until one tried to set the slot to a previously (but not currently) used
next node for that slot.

Type: fix

Signed-off-by: Christian Hopps <chopps@labn.net>
Change-Id: I7ee607625da874e320158b80f12ddc16e377f8e9
This commit is contained in:
Christian Hopps
2019-11-03 00:59:49 -04:00
committed by Dave Barach
parent bf103d99e6
commit 2e8b0618b1

View File

@@ -201,7 +201,8 @@ vlib_node_add_next_with_slot (vlib_main_t * vm,
uword next_node_index, uword slot)
{
vlib_node_main_t *nm = &vm->node_main;
vlib_node_t *node, *next;
vlib_node_t *node, *next, *old_next;
u32 old_next_index;
uword *p;
ASSERT (vlib_get_thread_index () == 0);
@@ -228,6 +229,14 @@ vlib_node_add_next_with_slot (vlib_main_t * vm,
vec_validate_init_empty (node->next_nodes, slot, ~0);
vec_validate (node->n_vectors_by_next_node, slot);
if ((old_next_index = node->next_nodes[slot]) != ~0u)
{
hash_unset (node->next_slot_by_node, old_next_index);
old_next = vlib_get_node (vm, old_next_index);
old_next->prev_node_bitmap =
clib_bitmap_andnoti (old_next->prev_node_bitmap, node_index);
}
node->next_nodes[slot] = next_node_index;
hash_set (node->next_slot_by_node, next_node_index, slot);