Change-Id: Idb95888ae6fc7a9df197a919e3d3283f915f4a4c
Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
import io.fd.vpp.jvpp.ioamtrace.dto.TraceProfileAdd;
import io.fd.vpp.jvpp.ioamtrace.dto.TraceProfileAddReply;
import io.fd.vpp.jvpp.ioamtrace.dto.TraceProfileAdd;
import io.fd.vpp.jvpp.ioamtrace.dto.TraceProfileAddReply;
-public class ioamTraceApiTest {
+public class IoamTraceApiTest {
-
- static class ioamTraceTestCallback implements TraceProfileAddCallback {
+ static class IoamTraceTestCallback implements TraceProfileAddCallback {
- public void onTraceProfileAddReply(final TraceProfileAddReply reply) {
+ public void onTraceProfileAddReply(final TraceProfileAddReply reply) {
System.out.printf("Received TraceProfileAddReply reply: context=%d%n",
reply.context);
}
System.out.printf("Received TraceProfileAddReply reply: context=%d%n",
reply.context);
}
}
private static void ioamTraceTestApi() throws Exception {
}
private static void ioamTraceTestApi() throws Exception {
System.out.println("Testing Java API for ioam trace plugin");
System.out.println("Testing Java API for ioam trace plugin");
- final JVppRegistry registry = new JVppRegistryImpl("ioamTraceApiTest");
- final JVpp jvpp = new JVppIoamtraceImpl();
+ try (final JVppRegistry registry = new JVppRegistryImpl("ioamTraceApiTest");
+ final JVpp jvpp = new JVppIoamtraceImpl()) {
+ registry.register(jvpp, new IoamTraceTestCallback());
- registry.register(jvpp, new ioamTraceTestCallback());
- try{
- System.out.println("Sending ioam trace profile add request...");
- TraceProfileAdd request = new TraceProfileAdd();
- request.traceType = 0x1f;
- request.numElts = 4;
- request.nodeId = 1;
- request.traceTsp = 2;
- request.appData = 1234;
- final int result = jvpp.send(request);
- System.out.printf("TraceProfileAdd send result = %d%n", result);
+ System.out.println("Sending ioam trace profile add request...");
+ TraceProfileAdd request = new TraceProfileAdd();
+ request.traceType = 0x1f;
+ request.numElts = 4;
+ request.nodeId = 1;
+ request.traceTsp = 2;
+ request.appData = 1234;
+ final int result = jvpp.send(request);
+ System.out.printf("TraceProfileAdd send result = %d%n", result);
- Thread.sleep(1000);
- }
- finally {
- System.out.println("Disconnecting...");
- registry.close();
+
+ System.out.println("Disconnecting...");
+ }
-sudo java -cp build-vpp_debug-native/vpp-api/java/jvpp-registry-16.12.jar:build-vpp_debug-native/vpp-api/java/jvpp-core-16.12.jar:build-vpp_debug-native/plugins/ioam-plugin/jvpp-ioam-trace-1.0.jar io.fd.vpp.jvpp.ioamtrace.test.ioamTraceApiTest
+sudo java -cp build-vpp_debug-native/vpp-api/java/jvpp-registry-16.12.jar:build-vpp_debug-native/plugins/ioam-plugin/jvpp-ioam-trace-1.0.jar io.fd.vpp.jvpp.ioamtrace.test.IoamTraceApiTest
plugin_main->my_client_index = my_client_index;
plugin_main->vl_input_queue = (unix_shared_memory_queue_t *)queue_address;
plugin_main->my_client_index = my_client_index;
plugin_main->vl_input_queue = (unix_shared_memory_queue_t *)queue_address;
- name = format (0, "ioam_trace_%08x%c", api_version, 0);
- plugin_main->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
+ name = format (0, "ioam_trace_%08x%c", api_version, 0);
+ plugin_main->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
- plugin_main->callbackObject = (*env)->NewGlobalRef(env, callback);
- plugin_main->callbackClass = (jclass)(*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, callback));
+ if (plugin_main->msg_id_base == (u16) ~0) {
+ jclass exClass = (*env)->FindClass(env, "java/lang/IllegalStateException");
+ (*env)->ThrowNew(env, exClass, "ioam_trace 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));
#define _(N,n) \
vl_msg_api_set_handlers(VL_API_##N + plugin_main->msg_id_base, #n, \
#define _(N,n) \
vl_msg_api_set_handlers(VL_API_##N + plugin_main->msg_id_base, #n, \
sizeof(vl_api_##n##_t), 1);
foreach_api_reply_handler;
#undef _
sizeof(vl_api_##n##_t), 1);
foreach_api_reply_handler;
#undef _
}
JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_ioamtrace_JVppIoamtraceImpl_close0
}
JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_ioamtrace_JVppIoamtraceImpl_close0
System.out.println("Disconnecting...");
}
System.out.println("Disconnecting...");
}
-sudo java -cp build-vpp-native/vpp-api/java/jvpp-registry-16.12.jar:build-vpp-native/vpp-api/java/jvpp-core-16.12.jar:build-vpp-native/plugins/snat-plugin/jvpp-snat-1.0.jar io.fd.vpp.jvpp.snat.test.CallbackApiTest
+sudo java -cp build-vpp-native/vpp-api/java/jvpp-registry-16.12.jar:build-vpp-native/plugins/snat-plugin/jvpp-snat-1.0.jar io.fd.vpp.jvpp.snat.test.CallbackApiTest
plugin_main->my_client_index = my_client_index;
plugin_main->vl_input_queue = (unix_shared_memory_queue_t *)queue_address;
plugin_main->my_client_index = my_client_index;
plugin_main->vl_input_queue = (unix_shared_memory_queue_t *)queue_address;
- name = format (0, "snat_%08x%c", api_version, 0);
- plugin_main->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
+ name = format (0, "snat_%08x%c", api_version, 0);
+ plugin_main->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
- plugin_main->callbackObject = (*env)->NewGlobalRef(env, callback);
- plugin_main->callbackClass = (jclass)(*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, callback));
+ if (plugin_main->msg_id_base == (u16) ~0) {
+ jclass exClass = (*env)->FindClass(env, "java/lang/IllegalStateException");
+ (*env)->ThrowNew(env, exClass, "snat 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));
#define _(N,n) \
vl_msg_api_set_handlers(VL_API_##N + plugin_main->msg_id_base, #n, \
#define _(N,n) \
vl_msg_api_set_handlers(VL_API_##N + plugin_main->msg_id_base, #n, \
sizeof(vl_api_##n##_t), 1);
foreach_api_reply_handler;
#undef _
sizeof(vl_api_##n##_t), 1);
foreach_api_reply_handler;
#undef _
}
JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_snat_JVppSnatImpl_close0
}
JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_snat_JVppSnatImpl_close0
import static java.util.Objects.requireNonNull;
import static java.util.Objects.requireNonNull;
+import io.fd.vpp.jvpp.callback.ControlPingCallback;
+import io.fd.vpp.jvpp.callback.JVppCallback;
+import io.fd.vpp.jvpp.dto.ControlPingReply;
import java.io.IOException;
import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.logging.Level;
import java.util.logging.Logger;
-import io.fd.vpp.jvpp.callback.ControlPingCallback;
-import io.fd.vpp.jvpp.callback.JVppCallback;
-import io.fd.vpp.jvpp.dto.ControlPingReply;
/**
* Default implementation of JVppRegistry.
/**
* Default implementation of JVppRegistry.
private static final Logger LOG = Logger.getLogger(JVppRegistryImpl.class.getName());
private final VppJNIConnection connection;
private static final Logger LOG = Logger.getLogger(JVppRegistryImpl.class.getName());
private final VppJNIConnection connection;
- private final ConcurrentMap<String, JVppCallback> pluginRegistry;
+ private final Map<String, JVppCallback> pluginRegistry;
private final ConcurrentMap<Integer, ControlPingCallback> pingCalls;
public JVppRegistryImpl(final String clientName) throws IOException {
connection = new VppJNIConnection(clientName);
connection.connect();
private final ConcurrentMap<Integer, ControlPingCallback> pingCalls;
public JVppRegistryImpl(final String clientName) throws IOException {
connection = new VppJNIConnection(clientName);
connection.connect();
- pluginRegistry = new ConcurrentHashMap<>();
+ pluginRegistry = new HashMap<>();
pingCalls = new ConcurrentHashMap<>();
}
pingCalls = new ConcurrentHashMap<>();
}
- public void register(final JVpp jvpp, final JVppCallback callback) {
+ public synchronized void register(final JVpp jvpp, final JVppCallback callback) {
requireNonNull(jvpp, "jvpp should not be null");
requireNonNull(callback, "Callback should not be null");
final String name = jvpp.getClass().getName();
requireNonNull(jvpp, "jvpp should not be null");
requireNonNull(callback, "Callback should not be null");
final String name = jvpp.getClass().getName();
- if (pluginRegistry.putIfAbsent(name, callback) != null) {
- throw new IllegalArgumentException(String.format("Callback for plugin %s was already registered", name));
+ if (pluginRegistry.containsKey(name)) {
+ throw new IllegalArgumentException(
+ String.format("Callback for plugin %s was already registered", name));
}
jvpp.init(this, callback, connection.getConnectionInfo().queueAddress,
connection.getConnectionInfo().clientIndex);
}
jvpp.init(this, callback, connection.getConnectionInfo().queueAddress,
connection.getConnectionInfo().clientIndex);
+ pluginRegistry.put(name, callback);
- public void unregister(final String name) {
+ public synchronized void unregister(final String name) {
requireNonNull(name, "Plugin name should not be null");
final JVppCallback previous = pluginRegistry.remove(name);
assertPluginWasRegistered(name, previous);
}
@Override
requireNonNull(name, "Plugin name should not be null");
final JVppCallback previous = pluginRegistry.remove(name);
assertPluginWasRegistered(name, previous);
}
@Override
- public JVppCallback get(final String name) {
+ public synchronized JVppCallback get(final String name) {
requireNonNull(name, "Plugin name should not be null");
JVppCallback value = pluginRegistry.get(name);
assertPluginWasRegistered(name, value);
requireNonNull(name, "Plugin name should not be null");
JVppCallback value = pluginRegistry.get(name);
assertPluginWasRegistered(name, value);
private native int controlPing0() throws VppInvocationException;
@Override
private native int controlPing0() throws VppInvocationException;
@Override
- public int controlPing(final Class<? extends JVpp> clazz) throws VppInvocationException {
+ public synchronized int controlPing(final Class<? extends JVpp> clazz) throws VppInvocationException {
connection.checkActive();
final String name = clazz.getName();
connection.checkActive();
final String name = clazz.getName();
@Override
public void onControlPingReply(final ControlPingReply reply) {
final ControlPingCallback callback = pingCalls.get(reply.context);
@Override
public void onControlPingReply(final ControlPingReply reply) {
final ControlPingCallback callback = pingCalls.get(reply.context);