features: don't break linked list, create separate one for arc

We need to keep original linked list so destructire can remove entries.

Change-Id: I5ff5ca0e1a417d88707255207725bba46433c943
Signed-off-by: Damjan Marion <damarion@cisco.com>
diff --git a/src/vlib/init.h b/src/vlib/init.h
index 1eddbb1..f163ee2 100644
--- a/src/vlib/init.h
+++ b/src/vlib/init.h
@@ -81,20 +81,22 @@
 
 #define VLIB_REMOVE_FROM_LINKED_LIST(first,p,next)              \
 {                                                               \
+  ASSERT (first);                                               \
   if (first == p)                                               \
       first = (p)->next;                                        \
   else                                                          \
     {                                                           \
       __typeof__ (p) current = first;                           \
-	while (current->next)                                   \
-	  {                                                     \
-	    if (current->next == p)                             \
-	      {                                                 \
-		current->next = current->next->next;            \
-		break;                                          \
-	      }                                                 \
-	    current = current->next;                            \
-	  }                                                     \
+      while (current->next)                                     \
+	{                                                       \
+	  if (current->next == p)                               \
+	    {                                                   \
+	      current->next = current->next->next;              \
+	      break;                                            \
+	    }                                                   \
+	  current = current->next;                              \
+	}                                                       \
+      ASSERT (current);                                         \
     }                                                           \
 }
 
diff --git a/src/vnet/feature/feature.c b/src/vnet/feature/feature.c
index 89a1951..9710004 100644
--- a/src/vnet/feature/feature.c
+++ b/src/vnet/feature/feature.c
@@ -75,7 +75,7 @@
       arc_index = areg->feature_arc_index;
 
       next = freg->next;
-      freg->next = fm->next_feature_by_arc[arc_index];
+      freg->next_in_arc = fm->next_feature_by_arc[arc_index];
       fm->next_feature_by_arc[arc_index] = freg;
 
       /* next */
@@ -110,7 +110,7 @@
 	{
 	  hash_set_mem (fm->next_feature_by_name[arc_index],
 			freg->node_name, pointer_to_uword (freg));
-	  freg = freg->next;
+	  freg = freg->next_in_arc;
 	}
 
       /* next */
@@ -273,7 +273,7 @@
       while (freg)
 	{
 	  vlib_cli_output (vm, "  %s\n", freg->node_name);
-	  freg = freg->next;
+	  freg = freg->next_in_arc;
 	}
 
 
diff --git a/src/vnet/feature/feature.h b/src/vnet/feature/feature.h
index 70a456e..f6b1d12 100644
--- a/src/vnet/feature/feature.h
+++ b/src/vnet/feature/feature.h
@@ -43,7 +43,7 @@
 typedef struct _vnet_feature_registration
 {
   /** next registration in list of all registrations*/
-  struct _vnet_feature_registration *next;
+  struct _vnet_feature_registration *next, *next_in_arc;
   /** Feature arc name */
   char *arc_name;
   /** Graph node name */
diff --git a/src/vnet/feature/registration.c b/src/vnet/feature/registration.c
index 872a196..61024ca 100644
--- a/src/vnet/feature/registration.c
+++ b/src/vnet/feature/registration.c
@@ -180,7 +180,7 @@
 	  these_constraints++;
 	}
 
-      this_reg = this_reg->next;
+      this_reg = this_reg->next_in_arc;
     }
 
   n_features = vec_len (node_names);