L2 over MPLS
[vpp.git] / src / vnet / dpo / dpo.c
index d8e075a..aa77083 100644 (file)
@@ -37,6 +37,8 @@
 #include <vnet/dpo/classify_dpo.h>
 #include <vnet/dpo/ip_null_dpo.h>
 #include <vnet/dpo/replicate_dpo.h>
+#include <vnet/dpo/interface_dpo.h>
+#include <vnet/dpo/mpls_disposition.h>
 
 /**
  * Array of char* names for the DPO types and protos
@@ -107,6 +109,25 @@ vnet_link_to_dpo_proto (vnet_link_t linkt)
     return (0);
 }
 
+vnet_link_t
+dpo_proto_to_link (dpo_proto_t dp)
+{
+    switch (dp)
+    {
+    case DPO_PROTO_IP6:
+        return (VNET_LINK_IP6);
+    case DPO_PROTO_IP4:
+        return (VNET_LINK_IP4);
+    case DPO_PROTO_MPLS:
+        return (VNET_LINK_MPLS);
+    case DPO_PROTO_ETHERNET:
+        return (VNET_LINK_ETHERNET);
+    case DPO_PROTO_NSH:
+        return (VNET_LINK_NSH);
+    }
+    return (~0);
+}
+
 u8 *
 format_dpo_type (u8 * s, va_list * args)
 {
@@ -182,6 +203,15 @@ dpo_set (dpo_id_t *dpo,
        case IP_LOOKUP_NEXT_MIDCHAIN:
            dpo->dpoi_type = DPO_ADJACENCY_MIDCHAIN;
            break;
+       case IP_LOOKUP_NEXT_MCAST_MIDCHAIN:
+           dpo->dpoi_type = DPO_ADJACENCY_MCAST_MIDCHAIN;
+           break;
+       case IP_LOOKUP_NEXT_MCAST:
+           dpo->dpoi_type = DPO_ADJACENCY_MCAST;
+            break;
+       case IP_LOOKUP_NEXT_GLEAN:
+           dpo->dpoi_type = DPO_ADJACENCY_GLEAN;
+           break;
        default:
            break;
        }
@@ -316,6 +346,8 @@ dpo_get_next_node (dpo_type_t child_type,
 
         vm = vlib_get_main();
 
+        vlib_worker_thread_barrier_sync(vm);
+
         ASSERT(NULL != dpo_nodes[child_type]);
         ASSERT(NULL != dpo_nodes[child_type][child_proto]);
         ASSERT(NULL != dpo_nodes[parent_type]);
@@ -357,6 +389,8 @@ dpo_get_next_node (dpo_type_t child_type,
             }
             cc++;
         }
+
+        vlib_worker_thread_barrier_release(vm);
     }
 
     return (dpo_edges[child_type][child_proto][parent_type][parent_proto]);
@@ -434,10 +468,21 @@ dpo_stack_from_node (u32 child_node_index,
     parent_node =
         vlib_get_node_by_name(vm, (u8*) dpo_nodes[parent_type][parent_proto][0]);
 
-    edge = vlib_node_add_next(vm,
+    edge = vlib_node_get_next(vm,
                               child_node_index,
                               parent_node->index);
 
+    if (~0 == edge)
+    {
+        vlib_worker_thread_barrier_sync(vm);
+
+        edge = vlib_node_add_next(vm,
+                                  child_node_index,
+                                  parent_node->index);
+
+        vlib_worker_thread_barrier_release(vm);
+    }
+
     dpo_stack_i(edge, dpo, parent);
 }
 
@@ -453,6 +498,8 @@ dpo_module_init (vlib_main_t * vm)
     lookup_dpo_module_init();
     ip_null_dpo_module_init();
     replicate_module_init();
+    interface_dpo_module_init();
+    mpls_disp_dpo_module_init();
 
     return (NULL);
 }