Add support for multiple microarchitectures in single binary
[vpp.git] / vpp / vnet / main.c
index 08e8813..2540083 100644 (file)
@@ -12,6 +12,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+#include <vppinfra/cpu.h>
 #include <vlib/vlib.h>
 #include <vlib/unix/unix.h>
 #include <vnet/plugin/plugin.h>
 
 #include <api/vpe_msg_enum.h>
 
-/** \mainpage Virtual Packet Edge Documentation
- * \section intro_sec Introduction
- * 
- * VPE is a specific vector packet processing application,
- * designed to steer packets to/from tenant virtual machines.
- *
- */
+#if DPDK
+#include <vnet/devices/dpdk/dpdk.h>
+#endif
 
 static void
 vpe_main_init (vlib_main_t * vm)
@@ -63,6 +61,36 @@ int main (int argc, char * argv[])
     u32 size;
     void vlib_set_get_handoff_structure_cb (void *cb);
 
+#if __x86_64__
+    const char * msg = "ERROR: This binary requires CPU with %s extensions.\n";
+#define _(a,b) \
+    if (!clib_cpu_supports_ ## a ())   \
+      {                                        \
+       fprintf(stderr, msg, b);        \
+       exit(1);                        \
+      }
+
+#if __AVX2__
+      _(avx2, "AVX2")
+#endif
+#if __AVX__
+      _(avx, "AVX")
+#endif
+#if __SSE4_2__
+      _(sse42, "SSE4.2")
+#endif
+#if __SSE4_1__
+      _(sse41, "SSE4.1")
+#endif
+#if __SSSE3__
+      _(ssse3, "SSSE3")
+#endif
+#if __SSE3__
+      _(sse3, "SSE3")
+#endif
+#undef _
+#endif
+
     /*
      * Load startup config from file.
      * usage: vpp -c /etc/vpp/startup.conf
@@ -166,6 +194,13 @@ defaulted:
     if (clib_mem_init (0, main_heap_size)) {
         vm->init_functions_called = hash_create (0, /* value bytes */ 0);
         vpe_main_init(vm);
+#if DPDK
+#if !DPDK_SHARED_LIB
+       dpdk_pmd_constructor_init();
+#endif
+#else
+        unix_physmem_init(vm, 0 /* fail_if_physical_memory_not_present */);
+#endif
         vlib_set_get_handoff_structure_cb (&vnet_get_handoff_structure);
         return vlib_unix_main (argc, argv);
     } else {
@@ -268,32 +303,6 @@ u32 vlib_app_num_thread_stacks_needed (void)
  * messages!
  */
 
-#if IPV6SR == 0
-#define foreach_ipv6_sr_stub_node \
-_(ipsec-output, ipsec_output)
-#else
-#define foreach_ipv6_sr_stub_node
-#endif
-
-#define _(n,m)                                          \
-static uword                                            \
-m##_node_fn (vlib_main_t *vm,                           \
-           vlib_node_runtime_t *node,                   \
-           vlib_frame_t *frame)                         \
-{                                                       \
-  clib_warning("unimplemented, leaking buffers...");    \
-  return 0;                                             \
-}                                                       \
-                                                        \
-VLIB_REGISTER_NODE(m##_node) = {                        \
-  .function = m##_node_fn,                              \
-  .name = #n,                                           \
-  .vector_size = sizeof(u32),                           \
-  .type = VLIB_NODE_TYPE_INTERNAL,                      \
-};
-foreach_ipv6_sr_stub_node;
-#undef _
-
 #if CLIB_DEBUG > 0
 
 static clib_error_t *