#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
return (DPO_PROTO_MPLS);
case VNET_LINK_ETHERNET:
return (DPO_PROTO_ETHERNET);
+ case VNET_LINK_NSH:
+ return (DPO_PROTO_NSH);
case VNET_LINK_ARP:
break;
}
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)
{
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;
}
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]);
}
cc++;
}
+
+ vlib_worker_thread_barrier_release(vm);
}
return (dpo_edges[child_type][child_proto][parent_type][parent_proto]);
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);
}
lookup_dpo_module_init();
ip_null_dpo_module_init();
replicate_module_init();
+ interface_dpo_module_init();
+ mpls_disp_dpo_module_init();
return (NULL);
}