Add a feature arc consistency check 93/16193/2
authorDave Barach <dave@barachs.net>
Mon, 26 Nov 2018 16:04:45 +0000 (11:04 -0500)
committerDamjan Marion <dmarion@me.com>
Mon, 26 Nov 2018 19:52:42 +0000 (19:52 +0000)
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>
src/vnet/devices/devices.c
src/vnet/ethernet/init.c
src/vnet/feature/feature.c
src/vnet/feature/feature.h
src/vnet/interface_output.c
src/vnet/ip/ip4_forward.c
src/vnet/ip/ip6_forward.c
src/vnet/mpls/mpls_features.c

index 99011da..e78c5cb 100644 (file)
@@ -66,6 +66,7 @@ VNET_FEATURE_ARC_INIT (device_input, static) =
 {
   .arc_name  = "device-input",
   .start_nodes = VNET_FEATURES ("device-input"),
+  .last_in_arc = "ethernet-input",
   .arc_index_ptr = &feature_main.device_input_feature_arc_index,
 };
 
index a468959..5d10c60 100644 (file)
@@ -66,6 +66,7 @@ add_type (ethernet_main_t * em, ethernet_type_t type, char *type_name)
 VNET_FEATURE_ARC_INIT (ethernet_output, static) =
 {
   .arc_name  = "ethernet-output",
+  .last_in_arc = "error-drop",
   .start_nodes = VNET_FEATURES ("adj-l2-midchain"),
   .arc_index_ptr = &ethernet_main.output_feature_arc_index,
 };
index 2cdbcff..f1afa37 100644 (file)
@@ -115,6 +115,7 @@ vnet_feature_init (vlib_main_t * vm)
       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 @@ vnet_feature_init (vlib_main_t * vm)
          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];
index 5c202dd..2d1569b 100644 (file)
@@ -30,6 +30,8 @@ typedef struct _vnet_feature_arc_registration
   /** Start nodes */
   char **start_nodes;
   int n_start_nodes;
+  /** End of the arc (optional, for consistency-checking) */
+  char *last_in_arc;
   /* Feature arc index, assigned by init function */
   u8 feature_arc_index;
   u8 *arc_index_ptr;
index b09f799..34f0a97 100644 (file)
@@ -1080,6 +1080,7 @@ VNET_FEATURE_ARC_INIT (interface_output, static) =
 {
   .arc_name  = "interface-output",
   .start_nodes = VNET_FEATURES (0),
+  .last_in_arc = "interface-tx",
   .arc_index_ptr = &vnet_main.interface_main.output_feature_arc_index,
 };
 
index e011e51..9963f6b 100644 (file)
@@ -711,6 +711,7 @@ VNET_FEATURE_ARC_INIT (ip4_unicast, static) =
 {
   .arc_name = "ip4-unicast",
   .start_nodes = VNET_FEATURES ("ip4-input", "ip4-input-no-checksum"),
+  .last_in_arc = "ip4-lookup",
   .arc_index_ptr = &ip4_main.lookup_main.ucast_feature_arc_index,
 };
 
@@ -796,6 +797,7 @@ VNET_FEATURE_ARC_INIT (ip4_multicast, static) =
 {
   .arc_name = "ip4-multicast",
   .start_nodes = VNET_FEATURES ("ip4-input", "ip4-input-no-checksum"),
+  .last_in_arc = "ip4-mfib-forward-lookup",
   .arc_index_ptr = &ip4_main.lookup_main.mcast_feature_arc_index,
 };
 
@@ -825,6 +827,7 @@ VNET_FEATURE_ARC_INIT (ip4_output, static) =
 {
   .arc_name = "ip4-output",
   .start_nodes = VNET_FEATURES ("ip4-rewrite", "ip4-midchain", "ip4-dvr-dpo"),
+  .last_in_arc = "interface-output",
   .arc_index_ptr = &ip4_main.lookup_main.output_feature_arc_index,
 };
 
@@ -1212,6 +1215,7 @@ VNET_FEATURE_ARC_INIT (ip4_local) =
 {
   .arc_name  = "ip4-local",
   .start_nodes = VNET_FEATURES ("ip4-local"),
+  .last_in_arc = "ip4-local-end-of-arc",
 };
 /* *INDENT-ON* */
 
index 5a17643..3c0dcbf 100644 (file)
@@ -371,6 +371,7 @@ VNET_FEATURE_ARC_INIT (ip6_unicast, static) =
 {
   .arc_name  = "ip6-unicast",
   .start_nodes = VNET_FEATURES ("ip6-input"),
+  .last_in_arc = "ip6-lookup",
   .arc_index_ptr = &ip6_main.lookup_main.ucast_feature_arc_index,
 };
 
@@ -442,6 +443,7 @@ VNET_FEATURE_ARC_INIT (ip6_multicast, static) =
 {
   .arc_name  = "ip6-multicast",
   .start_nodes = VNET_FEATURES ("ip6-input"),
+  .last_in_arc = "ip6-mfib-forward-lookup",
   .arc_index_ptr = &ip6_main.lookup_main.mcast_feature_arc_index,
 };
 
@@ -468,6 +470,7 @@ VNET_FEATURE_ARC_INIT (ip6_output, static) =
 {
   .arc_name  = "ip6-output",
   .start_nodes = VNET_FEATURES ("ip6-rewrite", "ip6-midchain", "ip6-dvr-dpo"),
+  .last_in_arc = "interface-output",
   .arc_index_ptr = &ip6_main.lookup_main.output_feature_arc_index,
 };
 
index 0281d0c..9ed56df 100644 (file)
@@ -104,6 +104,7 @@ VNET_FEATURE_ARC_INIT (mpls_input, static) =
 {
   .arc_name  = "mpls-input",
   .start_nodes = VNET_FEATURES ("mpls-input"),
+  .last_in_arc = "mpls-lookup",
   .arc_index_ptr = &mpls_main.input_feature_arc_index,
 };
 
@@ -123,6 +124,7 @@ VNET_FEATURE_ARC_INIT (mpls_output, static) =
 {
   .arc_name  = "mpls-output",
   .start_nodes = VNET_FEATURES ("mpls-output", "mpls-midchain"),
+  .last_in_arc = "interface-output",
   .arc_index_ptr = &mpls_main.output_feature_arc_index,
 };