New LISP API map-request itr-rloc
[vpp.git] / vpp / vnet / main.c
index 9d89ce7..a1c5427 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>
+
+/*
+ * Called by the dpdk driver's rte_delay_us() function. 
+ * Return 0 to have the dpdk do a regular delay loop.
+ * Return 1 if to skip the delay loop because we are suspending
+ * the calling vlib process instead.
  */
+int rte_delay_us_override (unsigned us) {
+  vlib_main_t * vm;
+
+  /* Don't bother intercepting for short delays */
+  if (us < 10) return 0;
+
+  /* 
+   * Only intercept if we are in a vlib process. 
+   * If we are called from a vlib worker thread or the vlib main
+   * thread then do not intercept. (Must not be called from an 
+   * independent pthread).
+   */
+  if (os_get_cpu_number() == 0)
+    {
+      /* 
+       * We're in the vlib main thread or a vlib process. Make sure
+       * the process is running and we're not still initializing.
+       */
+      vm = vlib_get_main();
+      if (vlib_in_process_context(vm))
+        {
+          /* Only suspend for the admin_down_process */
+          vlib_process_t * proc = vlib_get_current_process(vm);
+          if (!(proc->flags & VLIB_PROCESS_IS_RUNNING) ||
+              (proc->node_runtime.function != admin_up_down_process))
+                return 0;
+
+          f64 delay = 1e-6 * us;
+          vlib_process_suspend(vm, delay);
+          return 1;
+        }
+    }
+  return 0; // no override
+}
+#endif
 
 static void
 vpe_main_init (vlib_main_t * vm)
@@ -64,33 +103,33 @@ int main (int argc, char * argv[])
     void vlib_set_get_handoff_structure_cb (void *cb);
 
 #if __x86_64__
-    __builtin_cpu_init ();
     const char * msg = "ERROR: This binary requires CPU with %s extensions.\n";
 #define _(a,b) \
-    if (!__builtin_cpu_supports(a))    \
+    if (!clib_cpu_supports_ ## a ())   \
       {                                        \
        fprintf(stderr, msg, b);        \
        exit(1);                        \
       }
 
 #if __AVX2__
-      _("avx2", "AVX2")
+      _(avx2, "AVX2")
 #endif
 #if __AVX__
-      _("avx", "AVX")
+      _(avx, "AVX")
 #endif
 #if __SSE4_2__
-      _("sse4.2", "SSE4.2")
+      _(sse42, "SSE4.2")
 #endif
 #if __SSE4_1__
-      _("sse4.1", "SSE4.1")
+      _(sse41, "SSE4.1")
 #endif
 #if __SSSE3__
-      _("ssse3", "SSSE3")
+      _(ssse3, "SSSE3")
 #endif
 #if __SSE3__
-      _("sse3", "SSE3")
+      _(sse3, "SSE3")
 #endif
+#undef _
 #endif
 
     /*
@@ -196,6 +235,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 {