vcl svm: provide apps access to fifo chunks
[vpp.git] / src / plugins / hs_apps / vcl / vcl_test_server.c
index af5b914..d55fef3 100644 (file)
@@ -38,7 +38,7 @@ typedef struct
   vcl_test_stats_t stats;
   vppcom_endpt_t endpt;
   uint8_t ip[16];
-  vppcom_data_segments_t ds;
+  vppcom_data_segment_t ds[2];
 } vcl_test_server_conn_t;
 
 typedef struct
@@ -246,12 +246,25 @@ vts_server_rx (vcl_test_server_conn_t * conn, int rx_bytes)
     }
 
   if (vsm->use_ds)
-    vppcom_session_free_segments (conn->fd, conn->ds);
+    vppcom_session_free_segments (conn->fd, rx_bytes);
 
   if (conn->stats.rx_bytes >= conn->cfg.total_bytes)
     clock_gettime (CLOCK_REALTIME, &conn->stats.stop);
 }
 
+static void
+vts_copy_ds (void *buf, vppcom_data_segment_t * ds, u32 max_bytes)
+{
+  uint32_t n_bytes = 0, ds_idx = 0;
+
+  while (n_bytes < max_bytes)
+    {
+      clib_memcpy_fast (buf + n_bytes, ds[ds_idx].data,
+                       clib_min (ds[ds_idx].len, max_bytes - n_bytes));
+      ds_idx += 1;
+    }
+}
+
 static void
 vts_server_echo (vcl_test_server_conn_t * conn, int rx_bytes)
 {
@@ -259,7 +272,7 @@ vts_server_echo (vcl_test_server_conn_t * conn, int rx_bytes)
   int tx_bytes, nbytes, pos;
 
   if (vsm->use_ds)
-    vppcom_data_segment_copy (conn->buf, conn->ds, rx_bytes);
+    vts_copy_ds (conn->buf, conn->ds, rx_bytes);
 
   /* If it looks vaguely like a string, make sure it's terminated */
   pos = rx_bytes < conn->buf_size ? rx_bytes : conn->buf_size - 1;
@@ -590,7 +603,7 @@ vts_conn_read_config (vcl_test_server_conn_t * conn)
     {
       /* We could avoid the copy if the first segment is big enough but this
        * just simplifies things */
-      vppcom_data_segment_copy (conn->buf, conn->ds, sizeof (vcl_test_cfg_t));
+      vts_copy_ds (conn->buf, conn->ds, sizeof (vcl_test_cfg_t));
     }
   return (vcl_test_cfg_t *) conn->buf;
 }
@@ -692,7 +705,7 @@ vts_worker_loop (void *arg)
                  if (rx_cfg->magic == VCL_TEST_CFG_CTRL_MAGIC)
                    {
                      if (vsm->use_ds)
-                       vppcom_session_free_segments (conn->fd, conn->ds);
+                       vppcom_session_free_segments (conn->fd, rx_bytes);
                      vts_handle_cfg (wrk, rx_cfg, conn, rx_bytes);
                      if (!wrk->nfds)
                        {