jvpp: provide more detailed exception logs (VPP-436) 81/7681/11
authorMatej Perina <mperina@cisco.com>
Thu, 20 Jul 2017 13:35:19 +0000 (15:35 +0200)
committerDave Wallace <dwallacelf@gmail.com>
Fri, 4 Aug 2017 20:00:47 +0000 (20:00 +0000)
Error descriptions provided in api_errno.h are never used,
only error tag/name and number make it to enum vnet_api_error_t
so new macro is introduced in jvpp_common.c to extract message
according to error number and passed to VppCallbackException
constuctor.

Change-Id: If2a687752807d7250d9226987583df00f151e87f
Signed-off-by: Matej Perina <mperina@cisco.com>
Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
src/vpp-api/java/jvpp-common/jvpp_common.c
src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppBaseCallException.java
src/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppCallbackException.java

index b88c0ea..c00298b 100644 (file)
@@ -14,6 +14,7 @@
  */
 #define _GNU_SOURCE /* for strcasestr(3) */
 
+#include <vnet/api_errno.h>
 #include "jvpp_common.h"
 
 #ifndef JVPP_DEBUG
 #define DEBUG_LOG(...)
 #endif
 
+#define _(error,errorCode,msg)  \
+if (errorCode == code)          \
+    message = msg;              \
+else
+
+#define get_error_message(errno)    \
+int code = errno;                   \
+foreach_vnet_api_error              \
+    message = "Reason unknown";
+
 /* shared jvpp main structure */
 jvpp_main_t jvpp_main __attribute__((aligned (64)));
 
@@ -40,7 +51,7 @@ void call_on_error(const char* callName, int contextId, int retval,
         return;
     }
     jmethodID excConstructor = (*env)->GetMethodID(env, callbackExceptionClass,
-            "<init>", "(Ljava/lang/String;II)V");
+            "<init>", "(Ljava/lang/String;Ljava/lang/String;II)V");
     if (!excConstructor) {
         DEBUG_LOG("CallOnError : excConstructor is null!\n");
         return;
@@ -52,8 +63,11 @@ void call_on_error(const char* callName, int contextId, int retval,
         return;
     }
 
+    char *message;
+    get_error_message(clib_net_to_host_u32(retval));
     jobject excObject = (*env)->NewObject(env, callbackExceptionClass,
             excConstructor, (*env)->NewStringUTF(env, callName),
+            (*env)->NewStringUTF(env, message),
             clib_net_to_host_u32(contextId), clib_net_to_host_u32(retval));
     if (!excObject) {
         DEBUG_LOG("CallOnError : excObject is null!\n");
@@ -63,6 +77,7 @@ void call_on_error(const char* callName, int contextId, int retval,
     (*env)->CallVoidMethod(env, callbackObject, callbackExcMethod, excObject);
     DEBUG_LOG("CallOnError : Response sent\n");
 }
+#undef _
 
 u32 get_message_id(JNIEnv *env, const char *key) {
     uword *p = hash_get(jvpp_main.messages_hash, key);
index d71e305..7fc1682 100644 (file)
@@ -16,6 +16,7 @@
 
 package io.fd.vpp.jvpp;
 
+
 /**
  * Base exception representing failed operation of JVpp request call
  */
@@ -40,6 +41,24 @@ public abstract class VppBaseCallException extends Exception {
         }
     }
 
+    /**
+     * Constructs an VppCallbackException with the specified api method name, error description and error code.
+     *
+     * @param methodName name of a method, which invocation or execution failed
+     * @param message    description of error reason
+     * @param errorCode  negative error code value associated with this failure
+     * @throws NullPointerException     if apiMethodName is null
+     */
+    public VppBaseCallException(final String methodName, final String message, final int errorCode) {
+        super(String.format("vppApi.%s failed: %s (error code: %d)", methodName,message, errorCode));
+        this.methodName = java.util.Objects.requireNonNull(methodName, "apiMethodName is null!");
+        this.errorCode = errorCode;
+        if(errorCode >= 0) {
+            throw new IllegalArgumentException("Error code must be < 0. Was " + errorCode +
+                    " for " + methodName );
+        }
+    }
+
     /**
      * Returns  name of a method, which invocation failed.
      *
index ccfcbd3..adcc5d2 100644 (file)
@@ -26,12 +26,13 @@ public class VppCallbackException extends VppBaseCallException {
      * Constructs an VppCallbackException with the specified api method name and error code.
      *
      * @param methodName  name of a method, which invocation failed.
+     * @param message    description of error reason
      * @param ctxId      api request context identifier
      * @param errorCode  negative error code value associated with this failure
      * @throws NullPointerException     if apiMethodName is null
      */
-    public VppCallbackException(final String methodName, final int ctxId, final int errorCode ){
-        super(methodName, errorCode);
+    public VppCallbackException(final String methodName, final String message, final int ctxId, final int errorCode ){
+        super(methodName, message, errorCode);
         this.ctxId = ctxId;
     }