Add a feature arc consistency check

Verify that last node in the computed feature order matches
reality. This check doesn't make sense in all cases, so we skip it if
the newly-added vnet_feature_arc_registration_t ".last_in_arc" datum
is a NULL pointer.

Change-Id: Ia99c3e2b2da2e4780a7d5bc71670c5742a66fef2
Signed-off-by: Dave Barach <dave@barachs.net>
diff --git a/src/vnet/feature/feature.c b/src/vnet/feature/feature.c
index 2cdbcff..f1afa37 100644
--- a/src/vnet/feature/feature.c
+++ b/src/vnet/feature/feature.c
@@ -115,6 +115,7 @@
       clib_error_t *error;
       vnet_feature_config_main_t *cm;
       vnet_config_main_t *vcm;
+      char **features_in_order, *last_feature;
 
       arc_index = areg->feature_arc_index;
       cm = &fm->feature_config_mains[arc_index];
@@ -129,6 +130,19 @@
 	  os_exit (1);
 	}
 
+      features_in_order = fm->feature_nodes[arc_index];
+
+      /* If specificed, verify that the last node in the arc is actually last */
+      if (areg->last_in_arc && vec_len (features_in_order) > 0)
+	{
+	  last_feature = features_in_order[vec_len (features_in_order) - 1];
+	  if (strncmp (areg->last_in_arc, last_feature,
+		       strlen (areg->last_in_arc)))
+	    clib_warning
+	      ("WARNING: %s arc: last node is %s, but expected %s!",
+	       areg->arc_name, last_feature, areg->last_in_arc);
+	}
+
       fm->next_feature_by_name[arc_index] =
 	hash_create_string (0, sizeof (uword));
       freg = fm->next_feature_by_arc[arc_index];