vlib: fix for vlib_node_add_next_with_slot 45/23445/2
authorChristian Hopps <chopps@labn.net>
Sun, 3 Nov 2019 04:59:49 +0000 (00:59 -0400)
committerAndrew Yourtchenko <ayourtch@gmail.com>
Mon, 18 Nov 2019 13:16:39 +0000 (13:16 +0000)
- 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
(cherry picked from commit 2e8b0618b12d317f2a4632e69a0663dcd8dde472)

src/vlib/node.c

index b6a44b2..2bb5bce 100644 (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);