feature: Add packet trace API

Also spiffed up the vpp_api_test plugin loader so it executes
VLIB_INIT_FUNCTIONs and VLIB_API_INIT_FUNCTIONs.

Type: feature

Change-Id: Id9a4f455d73738c41bcfea220df2112bb9679681
Signed-off-by: Jon Loeliger <jdl@netgate.com>
Signed-off-by: Ole Troan <ot@cisco.com>
Signed-off-by: Dave Barach <dave@barachs.net>
diff --git a/src/vlibapi/api_helper_macros.h b/src/vlibapi/api_helper_macros.h
index 8fc0bd5..983b688 100644
--- a/src/vlibapi/api_helper_macros.h
+++ b/src/vlibapi/api_helper_macros.h
@@ -229,6 +229,35 @@
   }));								\
 } while(0);
 
+#define REPLY_AND_DETAILS_VEC_MACRO(t, v, mp, rmp, rv, body)	\
+do {								\
+  vl_api_registration_t *rp;					\
+  rp = vl_api_client_index_to_registration (mp->client_index);	\
+  if (rp == 0)							\
+    return;							\
+  u32 cursor = clib_net_to_host_u32 (mp->cursor);		\
+  vlib_main_t *vm = vlib_get_main ();				\
+  f64 start = vlib_time_now (vm);				\
+  if (!v || vec_len (v) == 0) {					\
+    cursor = ~0;						\
+    rv = VNET_API_ERROR_INVALID_VALUE;				\
+  } else if (cursor == ~0)					\
+      cursor = 0;						\
+  while (cursor != ~0 && cursor < vec_len (v)) {		\
+    do {body;} while (0);					\
+    ++cursor;							\
+    if (vl_api_process_may_suspend (vm, rp, start)) {   	\
+      if (cursor < vec_len (v))					\
+	rv = VNET_API_ERROR_EAGAIN;				\
+      break;							\
+    }								\
+  }								\
+  REPLY_MACRO2 (t, ({						\
+    rmp->cursor = clib_host_to_net_u32 (cursor);		\
+  }));								\
+} while(0);
+
+
 /* "trust, but verify" */
 
 static inline uword