From aa609dfe9072323483c8c0a95460b1be4ca05383 Mon Sep 17 00:00:00 2001
From: Hongjun Ni <hongjun.ni@intel.com>
Date: Thu, 16 Mar 2017 00:07:36 +0800
Subject: Hc2vpp failed to load libjvpp_nsh.so

Modify code to adapt new API registration mechanism

Change-Id: I968199e86278a01ff01267e55468099886689d12
Signed-off-by: Hongjun Ni <hongjun.ni@intel.com>
---
 nsh-plugin/java/Makefile.am     | 25 +++++++++------------
 nsh-plugin/java/jvpp/jvpp_nsh.c | 50 +++++++++++++++--------------------------
 nsh-plugin/java/jvpp/jvpp_nsh.h |  5 +----
 nsh-plugin/nsh/nsh.c            | 18 ++++++++++++++-
 4 files changed, 46 insertions(+), 52 deletions(-)

diff --git a/nsh-plugin/java/Makefile.am b/nsh-plugin/java/Makefile.am
index 3a30bdd..416a0e4 100644
--- a/nsh-plugin/java/Makefile.am
+++ b/nsh-plugin/java/Makefile.am
@@ -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 $@
diff --git a/nsh-plugin/java/jvpp/jvpp_nsh.c b/nsh-plugin/java/jvpp/jvpp_nsh.c
index 9dd5bf7..bea330b 100644
--- a/nsh-plugin/java/jvpp/jvpp_nsh.c
+++ b/nsh-plugin/java/jvpp/jvpp_nsh.c
@@ -29,11 +29,6 @@
 #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>
@@ -53,38 +48,29 @@
 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
diff --git a/nsh-plugin/java/jvpp/jvpp_nsh.h b/nsh-plugin/java/jvpp/jvpp_nsh.h
index 1f9ab58..8cd6a44 100644
--- a/nsh-plugin/java/jvpp/jvpp_nsh.h
+++ b/nsh-plugin/java/jvpp/jvpp_nsh.h
@@ -23,10 +23,7 @@
 #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 */
diff --git a/nsh-plugin/nsh/nsh.c b/nsh-plugin/nsh/nsh.c
index 67ddaba..6ff60c8 100644
--- a/nsh-plugin/nsh/nsh.c
+++ b/nsh-plugin/nsh/nsh.c
@@ -51,6 +51,10 @@
 #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);
-- 
cgit