Fix node siblings 91/1491/4
authorOle Troan <ot@cisco.com>
Fri, 10 Jun 2016 11:22:36 +0000 (13:22 +0200)
committerDave Barach <openvpp@barachs.net>
Tue, 14 Jun 2016 17:10:53 +0000 (17:10 +0000)
Siblings did not work at all. Fixed by generating sibling relationships
earlier in vlib_node_main_init(). Also adding a node dynamically before
nodes were initialised failed for sibling nodes.

Change-Id: I2fb73eb33a6f5ee216f566074e18ed495e20634d
Signed-off-by: Ole Troan <ot@cisco.com>
vlib/vlib/main.c
vlib/vlib/node.c
vnet/vnet/ip/ip4_forward.c
vnet/vnet/ip/ip6_forward.c
vnet/vnet/sr/sr.c

index 24504e7..f7a27cf 100644 (file)
@@ -1570,12 +1570,6 @@ int vlib_main (vlib_main_t * vm, unformat_input_t * input)
     vm->random_seed = clib_cpu_time_now ();
   clib_random_buffer_init (&vm->random_buffer, vm->random_seed);
 
-  /* See unix/main.c; most likely already set up */
-  if (vm->init_functions_called == 0)
-      vm->init_functions_called = hash_create (0, /* value bytes */ 0);
-  if ((error = vlib_call_all_init_functions (vm)))
-    goto done;
-
   /* Initialize node graph. */
   if ((error = vlib_node_main_init (vm)))
     {
@@ -1586,6 +1580,12 @@ int vlib_main (vlib_main_t * vm, unformat_input_t * input)
        goto done;
     }
 
+  /* See unix/main.c; most likely already set up */
+  if (vm->init_functions_called == 0)
+      vm->init_functions_called = hash_create (0, /* value bytes */ 0);
+  if ((error = vlib_call_all_init_functions (vm)))
+    goto done;
+
   /* Create default buffer free list. */
   vlib_buffer_get_or_create_free_list (vm, VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES,
                                       "default");
index 7378701..5d250d0 100644 (file)
@@ -163,17 +163,8 @@ vlib_node_add_next_with_slot (vlib_main_t * vm,
   node = vec_elt (nm->nodes, node_index);
   next = vec_elt (nm->nodes, next_node_index);
 
-  /* Fill in static next nodes if runtime has yet to be initialized. */
-  if (slot == ~0 && ! (nm->flags & VLIB_NODE_MAIN_RUNTIME_STARTED))
-    {
-      uword i;
-      for (i = 0; i < vec_len (node->next_node_names); i++)
-       {
-         char * a = node->next_node_names[i];
-         if (a)
-           vlib_node_add_named_next_with_slot (vm, node->index, a, i);
-       }
-    }
+  /* Runtime has to be initialized. */
+  ASSERT(nm->flags & VLIB_NODE_MAIN_RUNTIME_STARTED);
 
   if ((p = hash_get (node->next_slot_by_node, next_node_index)))
     {
@@ -315,6 +306,8 @@ static void register_node (vlib_main_t * vm,
 
   /* Node index of next sibling will be filled in by vlib_node_main_init. */
   n->sibling_of = r->sibling_of;
+  if (r->sibling_of && r->n_next_nodes > 0)
+    clib_error ("sibling node should not have any next nodes `%v'", n->name);
 
   if (r->type == VLIB_NODE_TYPE_INTERNAL)
     ASSERT (r->vector_size > 0);
@@ -473,6 +466,40 @@ vlib_node_main_init (vlib_main_t * vm)
 
   nm->flags |= VLIB_NODE_MAIN_RUNTIME_STARTED;
 
+  /* Generate sibling relationships */
+  {
+    vlib_node_t * n, * sib;
+    uword si;
+
+    for (ni = 0; ni < vec_len (nm->nodes); ni++)
+      {
+       n = vec_elt (nm->nodes, ni);
+
+       if (! n->sibling_of)
+         continue;
+
+       sib = vlib_get_node_by_name (vm, (u8 *) n->sibling_of);
+       if (! sib)
+         clib_error ("sibling `%s' not found for node `%v'", n->sibling_of, n->name);
+
+       clib_bitmap_foreach (si, sib->sibling_bitmap, ({
+             vlib_node_t * m = vec_elt (nm->nodes, si);
+
+             /* Connect all of sibling's siblings to us. */
+             m->sibling_bitmap = clib_bitmap_ori (m->sibling_bitmap, n->index);
+
+             /* Connect us to all of sibling's siblings. */
+             n->sibling_bitmap = clib_bitmap_ori (n->sibling_bitmap, si);
+           }));
+
+       /* Connect sibling to us. */
+       sib->sibling_bitmap = clib_bitmap_ori (sib->sibling_bitmap, n->index);
+
+       /* Connect us to sibling. */
+       n->sibling_bitmap = clib_bitmap_ori (n->sibling_bitmap, sib->index);
+      }
+  }
+
   /* Resolve next names into next indices. */
   for (ni = 0; ni < vec_len (nm->nodes); ni++)
     {
@@ -545,40 +572,6 @@ vlib_node_main_init (vlib_main_t * vm)
       }
   }
 
-  /* Generate node sibling relationships. */
-  {
-    vlib_node_t * n, * sib;
-    uword si;
-
-    for (ni = 0; ni < vec_len (nm->nodes); ni++)
-      {
-       n = vec_elt (nm->nodes, ni);
-
-       if (! n->sibling_of)
-         continue;
-
-       sib = vlib_get_node_by_name (vm, (u8 *) n->sibling_of);
-       if (! sib)
-         clib_error ("sibling `%s' not found for node `%v'", n->sibling_of, n->name);
-
-       clib_bitmap_foreach (si, sib->sibling_bitmap, ({
-         vlib_node_t * m = vec_elt (nm->nodes, si);
-
-         /* Connect all of sibling's siblings to us. */
-         m->sibling_bitmap = clib_bitmap_ori (m->sibling_bitmap, n->index);
-
-         /* Connect us to all of sibling's siblings. */
-         n->sibling_bitmap = clib_bitmap_ori (n->sibling_bitmap, si);
-       }));
-
-       /* Connect sibling to us. */
-       sib->sibling_bitmap = clib_bitmap_ori (sib->sibling_bitmap, n->index);
-
-       /* Connect us to sibling. */
-       n->sibling_bitmap = clib_bitmap_ori (n->sibling_bitmap, sib->index);
-      }
-  }
-
  done:
   return error;
 }
index 46b3a97..c088709 100644 (file)
@@ -2810,11 +2810,7 @@ VLIB_REGISTER_NODE (ip4_rewrite_local_node) = {
 
   .format_trace = format_ip4_rewrite_trace,
 
-  .n_next_nodes = 2,
-  .next_nodes = {
-    [IP4_REWRITE_NEXT_DROP] = "error-drop",
-    [IP4_REWRITE_NEXT_ARP] = "ip4-arp",
-  },
+  .n_next_nodes = 0,
 };
 
 VLIB_NODE_FUNCTION_MULTIARCH (ip4_rewrite_local_node, ip4_rewrite_local)
index 398d092..cedc5cd 100644 (file)
@@ -2492,10 +2492,7 @@ VLIB_REGISTER_NODE (ip6_rewrite_local_node) = {
 
   .format_trace = format_ip6_rewrite_trace,
 
-  .n_next_nodes = 1,
-  .next_nodes = {
-    [IP6_REWRITE_NEXT_DROP] = "error-drop",
-  },
+  .n_next_nodes = 0,
 };
 
 VLIB_NODE_FUNCTION_MULTIARCH (ip6_rewrite_local_node, ip6_rewrite_local)
@@ -2711,13 +2708,13 @@ ip6_hop_by_hop (vlib_main_t * vm,
 VLIB_REGISTER_NODE (ip6_hop_by_hop_node) = {
   .function = ip6_hop_by_hop,
   .name = "ip6-hop-by-hop",
+  .sibling_of = "ip6-lookup",
   .vector_size = sizeof (u32),
   .format_trace = format_ip6_hop_by_hop_trace,
   .type = VLIB_NODE_TYPE_INTERNAL,
   .n_errors = ARRAY_LEN(ip6_hop_by_hop_error_strings),
   .error_strings = ip6_hop_by_hop_error_strings,
-  .n_next_nodes = IP_LOOKUP_N_NEXT,
-  .next_nodes = IP6_LOOKUP_NEXT_NODES,
+  .n_next_nodes = 0,
 };
 
 VLIB_NODE_FUNCTION_MULTIARCH (ip6_hop_by_hop_node, ip6_hop_by_hop)
index e7992ad..845bf95 100644 (file)
@@ -1953,8 +1953,6 @@ static clib_error_t * sr_init (vlib_main_t * vm)
   ip6_sr_main_t * sm = &sr_main;
   clib_error_t * error = 0;
   vlib_node_t * ip6_lookup_node, * ip6_rewrite_node;
-  vlib_node_t * ip6_rewrite_local_node;
-  u32 verify_next_index;
 
   if ((error = vlib_call_init_function (vm, ip_main_init)))
     return error;
@@ -1989,10 +1987,6 @@ static clib_error_t * sr_init (vlib_main_t * vm)
 
   ip6_rewrite_node = vlib_get_node_by_name (vm, (u8 *)"ip6-rewrite");
   ASSERT(ip6_rewrite_node);
-
-  ip6_rewrite_local_node = vlib_get_node_by_name (vm, 
-                                                  (u8 *)"ip6-rewrite-local");
-  ASSERT(ip6_rewrite_local_node);
   
   /* Add a disposition to ip6_lookup for the sr rewrite node */
   sm->ip6_lookup_sr_next_index = 
@@ -2008,15 +2002,6 @@ static clib_error_t * sr_init (vlib_main_t * vm)
   sm->ip6_rewrite_sr_next_index = 
     vlib_node_add_next (vm, ip6_rewrite_node->index, 
                         sr_fix_dst_addr_node.index);
-  /* 
-   * Fix ip6-rewrite-local, sibling of the above. The sibling bitmap
-   * isn't set up at this point, so we have to do it manually
-   */
-  verify_next_index = vlib_node_add_next 
-      (vm, ip6_rewrite_local_node->index, 
-       sr_fix_dst_addr_node.index);
-
-  ASSERT(sm->ip6_rewrite_sr_next_index == verify_next_index);
 
   OpenSSL_add_all_digests();