Autodetect plugin path 27/11527/9
authorDamjan Marion <damarion@cisco.com>
Wed, 4 Apr 2018 20:43:54 +0000 (22:43 +0200)
committerDave Barach <openvpp@barachs.net>
Mon, 9 Apr 2018 13:33:06 +0000 (13:33 +0000)
dpdk plugin self-disables if there are no hugepages available

Change-Id: Ib286e1a370deeb21248e6e961573ef9c68759b4c
Signed-off-by: Damjan Marion <damarion@cisco.com>
Signed-off-by: Dave Barach <dave@barachs.net>
Makefile
src/vat/plugin.h
src/vpp/api/plugin.c
src/vpp/vnet/main.c

index 5cc5849..c893e02 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -410,14 +410,12 @@ define run
        @echo "WARNING: STARTUP_CONF not defined or file doesn't exist."
        @echo "         Running with minimal startup config: $(MINIMAL_STARTUP_CONF)\n"
        @cd $(STARTUP_DIR) && \
-         sudo $(2) $(1)/vpp/bin/vpp $(MINIMAL_STARTUP_CONF) \
-           plugin_path $(subst $(subst ,, ),:,$(wildcard $(1)/*/lib*/vpp_plugins))
+         sudo $(2) $(1)/vpp/bin/vpp $(MINIMAL_STARTUP_CONF)
 endef
 else
 define run
        @cd $(STARTUP_DIR) && \
-         sudo $(2) $(1)/vpp/bin/vpp $(shell cat $(STARTUP_CONF) | sed -e 's/#.*//') \
-           plugin_path $(subst $(subst ,, ),:,$(wildcard $(1)/*/lib*/vpp_plugins))
+         sudo $(2) $(1)/vpp/bin/vpp $(shell cat $(STARTUP_CONF) | sed -e 's/#.*//')
 endef
 endif
 
index c691862..8dab168 100644 (file)
@@ -26,6 +26,7 @@
 typedef struct
 {
   u8 *name;
+  u8 *filename;
   struct stat file_info;
   void *handle;
 } plugin_info_t;
index 95bdbe6..1506a82 100644 (file)
 plugin_main_t vat_plugin_main;
 
 static int
-load_one_plugin (plugin_main_t * pm, plugin_info_t * pi)
+load_one_vat_plugin (plugin_main_t * pm, plugin_info_t * pi)
 {
   void *handle, *register_handle;
   clib_error_t *(*fp) (vat_main_t *);
   clib_error_t *error;
 
-  handle = dlopen ((char *) pi->name, RTLD_LAZY);
+  handle = dlopen ((char *) pi->filename, RTLD_LAZY);
 
   /*
    * Note: this can happen if the plugin has an undefined symbol reference,
@@ -119,6 +119,7 @@ vat_load_new_plugins (plugin_main_t * pm)
       while ((entry = readdir (dp)))
        {
          u8 *plugin_name;
+         u8 *file_name;
 
          if (pm->plugin_name_filter)
            {
@@ -128,13 +129,14 @@ vat_load_new_plugins (plugin_main_t * pm)
                  goto next;
            }
 
-         plugin_name = format (0, "%s/%s%c", plugin_path[i],
-                               entry->d_name, 0);
+         file_name = format (0, "%s/%s%c", plugin_path[i], entry->d_name, 0);
+         plugin_name = format (0, "%s%c", entry->d_name, 0);
 
          /* unreadable */
-         if (stat ((char *) plugin_name, &statb) < 0)
+         if (stat ((char *) file_name, &statb) < 0)
            {
            ignore:
+             vec_free (file_name);
              vec_free (plugin_name);
              continue;
            }
@@ -148,10 +150,12 @@ vat_load_new_plugins (plugin_main_t * pm)
            {
              vec_add2 (pm->plugin_info, pi, 1);
              pi->name = plugin_name;
+             pi->filename = file_name;
              pi->file_info = statb;
 
-             if (load_one_plugin (pm, pi))
+             if (load_one_vat_plugin (pm, pi))
                {
+                 vec_free (file_name);
                  vec_free (plugin_name);
                  _vec_len (pm->plugin_info) = vec_len (pm->plugin_info) - 1;
                  continue;
index b330f60..6e136e1 100644 (file)
 #include <vnet/ethernet/ethernet.h>
 #include <vpp/app/version.h>
 #include <vpp/api/vpe_msg_enum.h>
+#include <limits.h>
 
+/*
+ * Load plugins from /usr/lib/vpp_plugins by default
+ */
+char *vlib_plugin_path = "/usr/lib/vpp_plugins";
+char *vlib_plugin_app_version = VPP_BUILD_VER;
+
+static void
+vpp_find_plugin_path ()
+{
+  extern char *vat_plugin_path;
+  char *p, path[PATH_MAX];
+  int rv;
+  u8 *s;
+
+  /* find executable path */
+  if ((rv = readlink ("/proc/self/exe", path, PATH_MAX - 1)) == -1)
+    return;
+
+  /* readlink doesn't provide null termination */
+  path[rv] = 0;
+
+  /* strip filename */
+  if ((p = strrchr (path, '/')) == 0)
+    return;
+  *p = 0;
+
+  /* strip bin/ */
+  if ((p = strrchr (path, '/')) == 0)
+    return;
+  *p = 0;
+
+  s = format (0, "%s/lib/vpp_plugins", path);
+#if uword_bits == 64
+  s = format (s, ":%s/lib64/vpp_plugins", path);
+#endif
+  vec_add1 (s, 0);
+  vlib_plugin_path = (char *) s;
+
+  s = format (0, "%s/lib/vpp_api_test_plugins", path);
+#if uword_bits == 64
+  s = format (s, ":%s/lib64/vpp_api_test_plugins", path);
+#endif
+  vec_add1 (s, 0);
+  vat_plugin_path = (char *) s;
+}
 
 static void
 vpe_main_init (vlib_main_t * vm)
@@ -39,6 +85,8 @@ vpe_main_init (vlib_main_t * vm)
    * Create the binary api plugin hashes before loading plugins
    */
   vat_plugin_hash_create ();
+
+  vpp_find_plugin_path ();
 }
 
 /*
@@ -46,12 +94,6 @@ vpe_main_init (vlib_main_t * vm)
  */
 char *vlib_default_runtime_dir = "vpp";
 
-/*
- * Load plugins from /usr/lib/vpp_plugins by default
- */
-char *vlib_plugin_path = "/usr/lib/vpp_plugins";
-char *vlib_plugin_app_version = VPP_BUILD_VER;
-
 int
 main (int argc, char *argv[])
 {