crypto crypto-openssl: support hashing operations
[vpp.git] / extras / libmemif / src / main.c
index 0c52169..e70334a 100644 (file)
@@ -158,14 +158,11 @@ memif_strerror (int err_code)
 {
   if (err_code >= ERRLIST_LEN)
     {
-      strncpy (memif_buf, MEMIF_ERR_UNDEFINED, strlen (MEMIF_ERR_UNDEFINED));
-      memif_buf[strlen (MEMIF_ERR_UNDEFINED)] = '\0';
+      strlcpy (memif_buf, MEMIF_ERR_UNDEFINED, sizeof (memif_buf));
     }
   else
     {
-      strncpy (memif_buf, memif_errlist[err_code],
-              strlen (memif_errlist[err_code]));
-      memif_buf[strlen (memif_errlist[err_code])] = '\0';
+      strlcpy (memif_buf, memif_errlist[err_code], sizeof (memif_buf));
     }
   return memif_buf;
 }
@@ -532,14 +529,12 @@ memif_init (memif_control_fd_update_t * on_control_fd_update, char *app_name,
 
   if (app_name != NULL)
     {
-      uint8_t len = (strlen (app_name) > MEMIF_NAME_LEN)
-       ? strlen (app_name) : MEMIF_NAME_LEN;
-      strncpy ((char *) lm->app_name, app_name, len);
+      strlcpy ((char *) lm->app_name, app_name, sizeof (lm->app_name));
     }
   else
     {
-      strncpy ((char *) lm->app_name, MEMIF_DEFAULT_APP_NAME,
-              strlen (MEMIF_DEFAULT_APP_NAME));
+      strlcpy ((char *) lm->app_name, MEMIF_DEFAULT_APP_NAME,
+              sizeof (lm->app_name));
     }
 
   lm->poll_cancel_fd = -1;
@@ -699,14 +694,12 @@ memif_per_thread_init (memif_per_thread_main_handle_t * pt_main,
   /* set app name */
   if (app_name != NULL)
     {
-      uint8_t len = (strlen (app_name) > MEMIF_NAME_LEN)
-       ? strlen (app_name) : MEMIF_NAME_LEN;
-      strncpy ((char *) lm->app_name, app_name, len);
+      strlcpy ((char *) lm->app_name, app_name, MEMIF_NAME_LEN);
     }
   else
     {
-      strncpy ((char *) lm->app_name, MEMIF_DEFAULT_APP_NAME,
-              strlen (MEMIF_DEFAULT_APP_NAME));
+      strlcpy ((char *) lm->app_name, MEMIF_DEFAULT_APP_NAME,
+              sizeof (lm->app_name));
     }
 
   lm->poll_cancel_fd = -1;
@@ -885,8 +878,7 @@ memif_socket_start_listening (memif_socket_t * ms)
 
   DBG ("socket %d created", ms->fd);
   un.sun_family = AF_UNIX;
-  strncpy ((char *) un.sun_path, (char *) ms->filename,
-          sizeof (un.sun_path) - 1);
+  strlcpy ((char *) un.sun_path, (char *) ms->filename, sizeof (un.sun_path));
   if (setsockopt (ms->fd, SOL_SOCKET, SO_PASSCRED, &on, sizeof (on)) < 0)
     {
       err = memif_syscall_error_handler (errno);
@@ -956,14 +948,8 @@ memif_create_socket (memif_socket_handle_t * sock, const char *filename,
     }
   memset (ms, 0, sizeof (memif_socket_t));
   /* set filename */
-  ms->filename = lm->alloc (strlen (filename) + sizeof (char));
-  if (ms->filename == NULL)
-    {
-      err = MEMIF_ERR_NOMEM;
-      goto error;
-    }
-  memset (ms->filename, 0, strlen (filename) + sizeof (char));
-  strncpy ((char *) ms->filename, filename, strlen (filename));
+  memset (ms->filename, 0, sizeof (ms->filename));
+  strlcpy ((char *) ms->filename, filename, sizeof (ms->filename));
 
   ms->type = MEMIF_SOCKET_TYPE_NONE;
 
@@ -985,11 +971,6 @@ memif_create_socket (memif_socket_handle_t * sock, const char *filename,
 error:
   if (ms != NULL)
     {
-      if (ms->filename != NULL)
-       {
-         lm->free (ms->filename);
-         ms->filename = NULL;
-       }
       if (ms->fd > 0)
        {
          close (ms->fd);
@@ -1040,14 +1021,8 @@ memif_per_thread_create_socket (memif_per_thread_main_handle_t pt_main,
   memset (ms, 0, sizeof (memif_socket_t));
   ms->lm = lm;
   /* set filename */
-  ms->filename = lm->alloc (strlen (filename) + sizeof (char));
-  if (ms->filename == NULL)
-    {
-      err = MEMIF_ERR_NOMEM;
-      goto error;
-    }
-  memset (ms->filename, 0, strlen (filename) + sizeof (char));
-  strncpy ((char *) ms->filename, filename, strlen (filename));
+  memset (ms->filename, 0, sizeof (ms->filename));
+  strlcpy ((char *) ms->filename, filename, sizeof (ms->filename));
 
   ms->type = MEMIF_SOCKET_TYPE_NONE;
 
@@ -1069,11 +1044,6 @@ memif_per_thread_create_socket (memif_per_thread_main_handle_t pt_main,
 error:
   if (ms != NULL)
     {
-      if (ms->filename != NULL)
-       {
-         lm->free (ms->filename);
-         ms->filename = NULL;
-       }
       if (ms->fd > 0)
        {
          close (ms->fd);
@@ -1150,12 +1120,12 @@ memif_create (memif_conn_handle_t * c, memif_conn_args_t * args,
   conn->private_ctx = private_ctx;
   memset (&conn->run_args, 0, sizeof (memif_conn_run_args_t));
 
-  uint8_t l = strlen ((char *) args->interface_name);
-  strncpy ((char *) conn->args.interface_name, (char *) args->interface_name,
-          l);
+  strlcpy ((char *) conn->args.interface_name, (char *) args->interface_name,
+          sizeof (conn->args.interface_name));
 
-  if ((l = strlen ((char *) args->secret)) > 0)
-    strncpy ((char *) conn->args.secret, (char *) args->secret, l);
+  if ((strlen ((char *) args->secret)) > 0)
+    strlcpy ((char *) conn->args.secret, (char *) args->secret,
+            sizeof (conn->args.secret));
 
   if (args->socket != NULL)
     conn->args.socket = args->socket;
@@ -1260,7 +1230,7 @@ memif_request_connection (memif_conn_handle_t c)
 
   sun.sun_family = AF_UNIX;
 
-  strncpy (sun.sun_path, (char *) ms->filename, sizeof (sun.sun_path) - 1);
+  strlcpy (sun.sun_path, (char *) ms->filename, sizeof (sun.sun_path));
 
   if (connect (sockfd, (struct sockaddr *) &sun,
               sizeof (struct sockaddr_un)) == 0)
@@ -1804,8 +1774,6 @@ memif_delete_socket (memif_socket_handle_t * sock)
 
   lm->free (ms->interface_list);
   ms->interface_list = NULL;
-  lm->free (ms->filename);
-  ms->filename = NULL;
   lm->free (ms);
   *sock = ms = NULL;
 
@@ -2492,7 +2460,10 @@ memif_tx_burst (memif_conn_handle_t conn, uint16_t qid,
   memif_queue_t *mq = &c->tx_queues[qid];
   memif_ring_t *ring = mq->ring;
   uint16_t mask = (1 << mq->log2_ring_size) - 1;
+  uint32_t offset_mask = c->run_args.buffer_size - 1;
   memif_buffer_t *b0;
+  memif_desc_t *d;
+  int64_t data_offset;
   *tx = 0;
   int err = MEMIF_ERR_SUCCESS;
 
@@ -2515,7 +2486,28 @@ memif_tx_burst (memif_conn_handle_t conn, uint16_t qid,
          err = MEMIF_ERR_INVAL_ARG;
          goto done;
        }
-      ring->desc[b0->desc_index & mask].length = b0->len;
+      d = &ring->desc[b0->desc_index & mask];
+      d->length = b0->len;
+      if (!c->args.is_master)
+       {
+         // reset headroom
+         d->offset = d->offset - (d->offset & offset_mask);
+         // calculate offset from user data
+         data_offset = b0->data - (d->offset + c->regions[d->region].addr);
+         if (data_offset != 0)
+           {
+             /* verify data offset and buffer length */
+             if ((data_offset < 0) ||
+                 ((data_offset + b0->len) > c->run_args.buffer_size))
+               {
+                 DBG ("slot: %d, data_offset: %d, length: %d",
+                      b0->desc_index & mask, data_offset, b0->len);
+                 err = MEMIF_ERR_INVAL_ARG;
+                 goto done;
+               }
+             d->offset += data_offset;
+           }
+       }
 
 #ifdef MEMIF_DBG_SHM
       printf ("offset: %-6d\n", ring->desc[b0->desc_index & mask].offset);
@@ -2608,7 +2600,7 @@ memif_rx_burst (memif_conn_handle_t conn, uint16_t qid,
          b0->flags |= MEMIF_BUFFER_FLAG_NEXT;
          ring->desc[cur_slot & mask].flags &= ~MEMIF_DESC_FLAG_NEXT;
        }
-/*      b0->offset = ring->desc[cur_slot & mask].offset;*/
+
       b0->queue = mq;
 #ifdef MEMIF_DBG_SHM
       printf ("data: %p\n", b0->data);