Add support for multiple microarchitectures in single binary
[vpp.git] / vnet / vnet / ip / ip6_forward.c
index e57269a..7093c57 100644 (file)
@@ -189,6 +189,14 @@ find_ip6_fib_by_table_index_or_id (ip6_main_t * im, u32 table_index_or_id, u32 f
   fib_index = table_index_or_id;
   if (! (flags & IP6_ROUTE_FLAG_FIB_INDEX))
     {
+      if (table_index_or_id == ~0) {
+        table_index_or_id = 0;
+        while (hash_get (im->fib_index_by_table_id, table_index_or_id)) {
+          table_index_or_id++;
+        }
+        return create_fib_with_table_id (im, table_index_or_id);
+      }
+
       p = hash_get (im->fib_index_by_table_id, table_index_or_id);
       if (! p)
        return create_fib_with_table_id (im, table_index_or_id);
@@ -271,7 +279,9 @@ void ip6_add_del_route (ip6_main_t * im, ip6_add_del_route_args_t * a)
     }
 
   /* Avoid spurious reference count increments */
-  if (old_adj_index == adj_index && !(a->flags & IP6_ROUTE_FLAG_KEEP_OLD_ADJACENCY))
+  if (old_adj_index == adj_index 
+      && adj_index != ~0
+      && !(a->flags & IP6_ROUTE_FLAG_KEEP_OLD_ADJACENCY))
     {
       ip_adjacency_t * adj = ip_get_adjacency (lm, adj_index);
       if (adj->share_count > 0)
@@ -1250,6 +1260,8 @@ VLIB_REGISTER_NODE (ip6_lookup_node) = {
   .next_nodes = IP6_LOOKUP_NEXT_NODES,
 };
 
+VLIB_NODE_FUNCTION_MULTIARCH (ip6_lookup_node, ip6_lookup)
+
 static uword
 ip6_indirect (vlib_main_t * vm,
              vlib_node_runtime_t * node,
@@ -1268,6 +1280,8 @@ VLIB_REGISTER_NODE (ip6_indirect_node) = {
   .next_nodes = IP6_LOOKUP_NEXT_NODES,
 };
 
+VLIB_NODE_FUNCTION_MULTIARCH (ip6_indirect_node, ip6_indirect)
+
 typedef struct {
   /* Adjacency taken. */
   u32 adj_index;
@@ -1444,6 +1458,8 @@ VLIB_REGISTER_NODE (ip6_drop_node,static) = {
   },
 };
 
+VLIB_NODE_FUNCTION_MULTIARCH (ip6_drop_node, ip6_drop)
+
 VLIB_REGISTER_NODE (ip6_punt_node,static) = {
   .function = ip6_punt,
   .name = "ip6-punt",
@@ -1457,6 +1473,8 @@ VLIB_REGISTER_NODE (ip6_punt_node,static) = {
   },
 };
 
+VLIB_NODE_FUNCTION_MULTIARCH (ip6_punt_node, ip6_punt)
+
 VLIB_REGISTER_NODE (ip6_miss_node,static) = {
   .function = ip6_miss,
   .name = "ip6-miss",
@@ -1470,6 +1488,8 @@ VLIB_REGISTER_NODE (ip6_miss_node,static) = {
   },
 };
 
+VLIB_NODE_FUNCTION_MULTIARCH (ip6_miss_node, ip6_miss)
+
 VLIB_REGISTER_NODE (ip6_multicast_node,static) = {
   .function = ip6_drop,
   .name = "ip6-multicast",
@@ -1848,6 +1868,8 @@ VLIB_REGISTER_NODE (ip6_local_node,static) = {
   },
 };
 
+VLIB_NODE_FUNCTION_MULTIARCH (ip6_local_node, ip6_local)
+
 void ip6_register_protocol (u32 protocol, u32 node_index)
 {
   vlib_main_t * vm = vlib_get_main();
@@ -2414,6 +2436,8 @@ VLIB_REGISTER_NODE (ip6_rewrite_node) = {
   },
 };
 
+VLIB_NODE_FUNCTION_MULTIARCH (ip6_rewrite_node, ip6_rewrite_transit)
+
 VLIB_REGISTER_NODE (ip6_rewrite_local_node,static) = {
   .function = ip6_rewrite_local,
   .name = "ip6-rewrite-local",
@@ -2429,6 +2453,8 @@ VLIB_REGISTER_NODE (ip6_rewrite_local_node,static) = {
   },
 };
 
+VLIB_NODE_FUNCTION_MULTIARCH (ip6_rewrite_local_node, ip6_rewrite_local)
+
 /* Global IP6 main. */
 ip6_main_t ip6_main;