Hc2vpp failed to load libjvpp_nsh.so 50/5750/8
authorHongjun Ni <[email protected]>
Wed, 15 Mar 2017 16:07:36 +0000 (00:07 +0800)
committerHongjun Ni <[email protected]>
Thu, 23 Mar 2017 14:45:52 +0000 (22:45 +0800)
Modify code to adapt new API registration mechanism

Change-Id: I968199e86278a01ff01267e55468099886689d12
Signed-off-by: Hongjun Ni <[email protected]>
nsh-plugin/java/Makefile.am
nsh-plugin/java/jvpp/jvpp_nsh.c
nsh-plugin/java/jvpp/jvpp_nsh.h
nsh-plugin/nsh/nsh.c

index 3a30bdd..416a0e4 100644 (file)
@@ -16,15 +16,15 @@ ACLOCAL_AMFLAGS = -I m4
 AM_CFLAGS = -Wall 
 
 
-noinst_PROGRAMS = 
+noinst_PROGRAMS =
 BUILT_SOURCES =
-bin_PROGRAMS = 
-CLEANFILES = 
+bin_PROGRAMS =
+CLEANFILES =
 
 nobase_include_HEADERS = jvpp/io_fd_vpp_jvpp_nsh_JVppNshImpl.h
 
 jarfile_jnsh_sfc = jnsh_sfc-$(PACKAGE_VERSION).jar
-java_packagedir = io/fd/nsh_sfc/jvpp
+java_packagedir = io/fd/vpp/jvpp/nsh
 java_gendir = jvpp/src/main/java
 resourcesdir = jvpp/src/main/resources
 api_file=$(srcdir)/../nsh/nsh.api
@@ -36,23 +36,18 @@ lib_LTLIBRARIES = libjvpp_nsh.la
 libjvpp_nsh_la_SOURCES = $(srcdir)/../java/nsh.api.h jvpp/jvpp_nsh.c jvpp/io_fd_vpp_jvpp_nsh_JVppNshImpl.h
 
 libjvpp_nsh_la_LIBADD = -lvlibmemoryclient -lvlibapi -lsvm -lvppinfra \
-                     -lpthread -lm -lrt
-libjvpp_nsh_la_LIBAD = libjvpp_common.la
+                     -lpthread -lm -lrt -ljvpp_common
 libjvpp_nsh_la_LDFLAGS = -module
 libjvpp_nsh_la_CPPFLAGS = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -I../ -I$(srcdir)/../
 
 BUILT_SOURCES = jvpp/io_fd_vpp_jvpp_nsh_JVppNshImpl.h
 
 jvpp/io_fd_vpp_jvpp_nsh_JVppNshImpl.h: nsh.api.json
-       dir=`pwd`;                                              \
-       mkdir -p $(java_gendir)/$(java_packagedir);             \
-       cd $(java_gendir)/$(java_packagedir);                   \
-       mkdir -p dto future callfacade callback notification test;      \
-       cd -;                                                   \
        $(jvpp_gen) -i nsh.api.json --plugin_name nsh --root_dir $(java_gendir)/$(java_packagedir)  > /dev/null;  \
-       mv -f $(java_gendir)/$(java_packagedir)/target/io/fd/vpp/jvpp/nsh/ $(java_gendir)/$(java_packagedir)/;    \
-       mv -f $(java_gendir)/$(java_packagedir)/jvpp_nsh_gen.h jvpp/jvpp_nsh_gen.h;                     \
+       mv -f $(java_gendir)/$(java_packagedir)/target/io/fd/vpp/jvpp/nsh/* $(java_gendir)/$(java_packagedir)/;  \
+       mv -f $(java_gendir)/$(java_packagedir)/jvpp_nsh_gen.h jvpp/jvpp_nsh_gen.h;                                                     \
        cp $(srcdir)/pom.xml jvpp/;                             \
+       mkdir -p $(java_gendir)/$(java_packagedir)/test;
        cp $(srcdir)/jvpp/test/*.java $(java_gendir)/$(java_packagedir)/test/;                          \
        cd jvpp;                                \
        mvn $${MAVEN_SETTINGS_OPTIONS} -v;      \
@@ -60,12 +55,12 @@ jvpp/io_fd_vpp_jvpp_nsh_JVppNshImpl.h: nsh.api.json
 
 $(jarfile_jnsh_sfc): libjvpp_nsh.la
        mkdir -p $(resourcesdir);                               \
-       cp .libs/libjvpp_nsh.so.0.0.0 $(resourcesdir);                          \
+       cp .libs/libjvpp_nsh.so $(resourcesdir)/libjvpp_nsh.so; \
        cd jvpp;                                \
        mvn $${MAVEN_SETTINGS_OPTIONS} -v;      \
        mvn $${MAVEN_SETTINGS_OPTIONS} package;
 
-nsh.api.json:
+nsh.api.json: $(api_file)
        @echo "  jNsh_sfc API"; \
        $(CC) $(CPPFLAGS) -E -P -C -x c $^ \
        | vppapigen --input $(api_file) --json $@
index 9dd5bf7..bea330b 100644 (file)
 #include <vpp-api/nsh_all_api_h.h>
 #undef vl_printfun
 
-/* Get the API version number */
-#define vl_api_version(n,v) static u32 api_version=(v);
-#include <vpp-api/nsh_all_api_h.h>
-#undef vl_api_version
-
 #include <vnet/api_errno.h>
 #include <vlibapi/api.h>
 #include <vlibmemory/api.h>
 JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_nsh_JVppNshImpl_init0
   (JNIEnv *env, jclass clazz, jobject callback, jlong queue_address, jint my_client_index) {
     nsh_main_t * plugin_main = &nsh_main;
-    u8 * name;
     clib_warning ("Java_io_fd_vpp_jvpp_nsh_JVppNshImpl_init0");
 
     plugin_main->my_client_index = my_client_index;
     plugin_main->vl_input_queue = (unix_shared_memory_queue_t *)queue_address;
 
-    name = format (0, "nsh_%08x%c", api_version, 0);
-    plugin_main->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
-
-    if (plugin_main->msg_id_base == (u16) ~0) {
-        jclass exClass = (*env)->FindClass(env, "java/lang/IllegalStateException");
-        (*env)->ThrowNew(env, exClass, "nsh plugin is not loaded in VPP");
-    } else {
-        plugin_main->callbackObject = (*env)->NewGlobalRef(env, callback);
-        plugin_main->callbackClass = (jclass)(*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, callback));
-
-        // verify API has not changed since jar generation
-        #define _(N)             \
-            get_message_id(env, #N);
-            foreach_supported_api_message;
-        #undef _
-
-        #define _(N,n)                                  \
-            vl_msg_api_set_handlers(get_message_id(env, #N), #n,     \
-                   vl_api_##n##_t_handler,             \
-                   vl_noop_handler,                    \
-                   vl_api_##n##_t_endian,              \
-                   vl_api_##n##_t_print,               \
-                   sizeof(vl_api_##n##_t), 1);
-            foreach_api_reply_handler;
-        #undef _
-    }
+    plugin_main->callbackObject = (*env)->NewGlobalRef(env, callback);
+    plugin_main->callbackClass = (jclass)(*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, callback));
+
+    // verify API has not changed since jar generation
+    #define _(N)             \
+        get_message_id(env, #N);
+        foreach_supported_api_message;
+    #undef _
+
+    #define _(N,n)                                  \
+        vl_msg_api_set_handlers(get_message_id(env, #N), #n,     \
+               vl_api_##n##_t_handler,             \
+               vl_noop_handler,                    \
+               vl_api_##n##_t_endian,              \
+               vl_api_##n##_t_print,               \
+               sizeof(vl_api_##n##_t), 1);
+        foreach_api_reply_handler;
+    #undef _
 }
 
 JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_nsh_JVppNshImpl_close0
index 1f9ab58..8cd6a44 100644 (file)
 #include <jni.h>
 
 typedef struct {
-    /* Base message index for the nsh plugin */
-       u16 msg_id_base;
-
-    /* Pointer to shared memory queue */
+  /* Pointer to shared memory queue */
     unix_shared_memory_queue_t * vl_input_queue;
 
     /* VPP api client index */
index 67ddaba..6ff60c8 100644 (file)
 #include <vpp-api/nsh_all_api_h.h>
 #undef vl_api_version
 
+#define vl_msg_name_crc_list
+#include <vpp-api/nsh_all_api_h.h>
+#undef vl_msg_name_crc_list
+
 /*
  * A handy macro to set up a message reply.
  * Assumes that the following variables are available:
@@ -1378,7 +1382,7 @@ VLIB_CLI_COMMAND (show_nsh_entry_command, static) = {
 static clib_error_t *
 nsh_plugin_api_hookup (vlib_main_t *vm)
 {
-  nsh_main_t * nm = &nsh_main;
+  nsh_main_t * nm __attribute__ ((unused)) = &nsh_main;
 #define _(N,n)                                                  \
   vl_msg_api_set_handlers((VL_API_##N + nm->msg_id_base),      \
                          #n,                                   \
@@ -1393,6 +1397,15 @@ nsh_plugin_api_hookup (vlib_main_t *vm)
   return 0;
 }
 
+static void
+setup_message_id_table (nsh_main_t * nm, api_main_t * am)
+{
+#define _(id,n,crc) \
+  vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id + nm->msg_id_base);
+  foreach_vl_msg_name_crc_nsh;
+#undef _
+}
+
 always_inline void
 nsh_md2_encap (vlib_buffer_t * b, nsh_base_header_t *hdr,
               nsh_entry_t * nsh_entry)
@@ -2304,6 +2317,9 @@ clib_error_t *nsh_init (vlib_main_t *vm)
 
   error = nsh_plugin_api_hookup (vm);
 
+  /* Add our API messages to the global name_crc hash table */
+  setup_message_id_table (nm, &api_main);
+
   /* Add dispositions to nodes that feed nsh-input */
   //alagalah - validate we don't really need to use the node value
   next_node = vlib_node_add_next (vm, vxlan4_gpe_input_node.index, nsh_input_node.index);