ip: Replace Sematics for Interface IP addresses
[vpp.git] / src / plugins / memif / socket.c
index 34bff16..553a175 100644 (file)
@@ -77,29 +77,44 @@ memif_msg_enq_ack (memif_if_t * mif)
   e->fd = -1;
 }
 
+static void
+memif_msg_strlcpy (u8 * dest, u32 len, const u8 * src)
+{
+  len = clib_min (len - 1, vec_len (src));
+  memcpy (dest, src, len);
+  dest[len] = '\0';
+}
+
+static void
+memif_msg_snprintf (u8 * dest, u32 len, const char *fmt, ...)
+{
+  va_list va;
+  va_start (va, fmt);
+  u8 *s = va_format (0, fmt, &va);
+  va_end (va);
+  memif_msg_strlcpy (dest, len, s);
+  vec_free (s);
+}
+
 static clib_error_t *
 memif_msg_enq_hello (clib_socket_t * sock)
 {
-  u8 *s;
   memif_msg_t msg = { 0 };
   memif_msg_hello_t *h = &msg.hello;
   msg.type = MEMIF_MSG_TYPE_HELLO;
   h->min_version = MEMIF_VERSION;
   h->max_version = MEMIF_VERSION;
   h->max_m2s_ring = MEMIF_MAX_M2S_RING;
-  h->max_s2m_ring = MEMIF_MAX_M2S_RING;
+  h->max_s2m_ring = MEMIF_MAX_S2M_RING;
   h->max_region = MEMIF_MAX_REGION;
   h->max_log2_ring_size = MEMIF_MAX_LOG2_RING_SIZE;
-  s = format (0, "VPP %s%c", VPP_BUILD_VER, 0);
-  strncpy ((char *) h->name, (char *) s, sizeof (h->name) - 1);
-  vec_free (s);
+  memif_msg_snprintf (h->name, sizeof (h->name), "VPP %s", VPP_BUILD_VER);
   return clib_socket_sendmsg (sock, &msg, sizeof (memif_msg_t), 0, 0);
 }
 
 static void
 memif_msg_enq_init (memif_if_t * mif)
 {
-  u8 *s;
   memif_msg_fifo_elt_t *e;
   clib_fifo_add2 (mif->msg_queue, e);
   memif_msg_init_t *i = &e->msg.init;
@@ -109,12 +124,9 @@ memif_msg_enq_init (memif_if_t * mif)
   i->version = MEMIF_VERSION;
   i->id = mif->id;
   i->mode = mif->mode;
-  s = format (0, "VPP %s%c", VPP_BUILD_VER, 0);
-  strncpy ((char *) i->name, (char *) s, sizeof (i->name) - 1);
+  memif_msg_snprintf (i->name, sizeof (i->name), "VPP %s", VPP_BUILD_VER);
   if (mif->secret)
-    strncpy ((char *) i->secret, (char *) mif->secret,
-            sizeof (i->secret) - 1);
-  vec_free (s);
+    memif_msg_strlcpy (i->secret, sizeof (i->secret), mif->secret);
 }
 
 static void
@@ -162,13 +174,11 @@ memif_msg_enq_connect (memif_if_t * mif)
   memif_msg_fifo_elt_t *e;
   clib_fifo_add2 (mif->msg_queue, e);
   memif_msg_connect_t *c = &e->msg.connect;
-  u8 *s;
 
   e->msg.type = MEMIF_MSG_TYPE_CONNECT;
   e->fd = -1;
-  s = format (0, "%U%c", format_memif_device_name, mif->dev_instance, 0);
-  strncpy ((char *) c->if_name, (char *) s, sizeof (c->if_name) - 1);
-  vec_free (s);
+  memif_msg_snprintf (c->if_name, sizeof (c->if_name), "%U",
+                     format_memif_device_name, mif->dev_instance);
 }
 
 static void
@@ -177,13 +187,11 @@ memif_msg_enq_connected (memif_if_t * mif)
   memif_msg_fifo_elt_t *e;
   clib_fifo_add2 (mif->msg_queue, e);
   memif_msg_connected_t *c = &e->msg.connected;
-  u8 *s;
 
   e->msg.type = MEMIF_MSG_TYPE_CONNECTED;
   e->fd = -1;
-  s = format (0, "%U%c", format_memif_device_name, mif->dev_instance, 0);
-  strncpy ((char *) c->if_name, (char *) s, sizeof (c->if_name) - 1);
-  vec_free (s);
+  memif_msg_snprintf (c->if_name, sizeof (c->if_name), "%U",
+                     format_memif_device_name, mif->dev_instance);
 }
 
 clib_error_t *
@@ -194,7 +202,7 @@ memif_msg_send_disconnect (memif_if_t * mif, clib_error_t * err)
   memif_msg_disconnect_t *d = &msg.disconnect;
 
   d->code = err->code;
-  strncpy ((char *) d->string, (char *) err->what, sizeof (d->string) - 1);
+  memif_msg_strlcpy (d->string, sizeof (d->string), err->what);
 
   return clib_socket_sendmsg (mif->sock, &msg, sizeof (memif_msg_t), 0, 0);
 }
@@ -356,7 +364,7 @@ memif_msg_receive_add_ring (memif_if_t * mif, memif_msg_t * msg, int fd)
     }
 
   // clear previous cache data if interface reconncected
-  memset (mq, 0, sizeof (memif_queue_t));
+  clib_memset (mq, 0, sizeof (memif_queue_t));
   mq->int_fd = fd;
   mq->int_clib_file_index = ~0;
   mq->log2_ring_size = ar->log2_ring_size;
@@ -416,15 +424,16 @@ memif_msg_receive (memif_if_t ** mifp, clib_socket_t * sock, clib_file_t * uf)
 
   err = clib_socket_recvmsg (sock, &msg, sizeof (memif_msg_t), &fd, 1);
   if (err)
-    return err;
+    goto error;
 
   if (mif == 0 && msg.type != MEMIF_MSG_TYPE_INIT)
     {
       memif_socket_close (&sock);
-      return clib_error_return (0, "unexpected message received");
+      err = clib_error_return (0, "unexpected message received");
+      goto error;
     }
 
-  DBG ("Message type %u received", msg.type);
+  memif_log_debug (mif, "Message type %u received", msg.type);
   /* process the message based on its type */
   switch (msg.type)
     {
@@ -433,21 +442,24 @@ memif_msg_receive (memif_if_t ** mifp, clib_socket_t * sock, clib_file_t * uf)
 
     case MEMIF_MSG_TYPE_HELLO:
       if ((err = memif_msg_receive_hello (mif, &msg)))
-       return err;
+       goto error;
       if ((err = memif_init_regions_and_queues (mif)))
-       return err;
+       goto error;
       memif_msg_enq_init (mif);
-      memif_msg_enq_add_region (mif, 0);
+      /* *INDENT-OFF* */
+      vec_foreach_index (i, mif->regions)
+       memif_msg_enq_add_region (mif, i);
       vec_foreach_index (i, mif->tx_queues)
        memif_msg_enq_add_ring (mif, i, MEMIF_RING_S2M);
       vec_foreach_index (i, mif->rx_queues)
        memif_msg_enq_add_ring (mif, i, MEMIF_RING_M2S);
+      /* *INDENT-ON* */
       memif_msg_enq_connect (mif);
       break;
 
     case MEMIF_MSG_TYPE_INIT:
       if ((err = memif_msg_receive_init (mifp, &msg, sock, uf->private_data)))
-       return err;
+       goto error;
       mif = *mifp;
       vec_reset_length (uf->description);
       uf->description = format (uf->description, "%U ctl",
@@ -457,41 +469,45 @@ memif_msg_receive (memif_if_t ** mifp, clib_socket_t * sock, clib_file_t * uf)
 
     case MEMIF_MSG_TYPE_ADD_REGION:
       if ((err = memif_msg_receive_add_region (mif, &msg, fd)))
-       return err;
+       goto error;
       memif_msg_enq_ack (mif);
       break;
 
     case MEMIF_MSG_TYPE_ADD_RING:
       if ((err = memif_msg_receive_add_ring (mif, &msg, fd)))
-       return err;
+       goto error;
       memif_msg_enq_ack (mif);
       break;
 
     case MEMIF_MSG_TYPE_CONNECT:
       if ((err = memif_msg_receive_connect (mif, &msg)))
-       return err;
+       goto error;
       memif_msg_enq_connected (mif);
       break;
 
     case MEMIF_MSG_TYPE_CONNECTED:
       if ((err = memif_msg_receive_connected (mif, &msg)))
-       return err;
+       goto error;
       break;
 
     case MEMIF_MSG_TYPE_DISCONNECT:
       if ((err = memif_msg_receive_disconnect (mif, &msg)))
-       return err;
+       goto error;
       break;
 
     default:
       err = clib_error_return (0, "unknown message type (0x%x)", msg.type);
-      return err;
+      goto error;
     }
 
   if (clib_fifo_elts (mif->msg_queue))
     clib_file_set_data_available_to_write (&file_main,
                                           mif->sock->private_data, 1);
   return 0;
+
+error:
+  memif_log_err (mif, "%U", format_clib_error, err);
+  return err;
 }
 
 clib_error_t *
@@ -630,7 +646,8 @@ memif_master_conn_fd_error (clib_file_t * uf)
        }
     }
 
-  clib_warning ("Error on unknown file descriptor %d", uf->file_descriptor);
+  memif_log_warn (0, "Error on unknown file descriptor %d",
+                 uf->file_descriptor);
   memif_file_del (uf);
   return 0;
 }
@@ -647,7 +664,7 @@ memif_conn_fd_accept_ready (clib_file_t * uf)
   clib_socket_t *client;
 
   client = clib_mem_alloc (sizeof (clib_socket_t));
-  memset (client, 0, sizeof (clib_socket_t));
+  clib_memset (client, 0, sizeof (clib_socket_t));
   err = clib_socket_accept (msf->sock, client);
   if (err)
     goto error;
@@ -673,7 +690,7 @@ memif_conn_fd_accept_ready (clib_file_t * uf)
   return 0;
 
 error:
-  clib_error_report (err);
+  memif_log_err (0, "%U", format_clib_error, err);
   clib_mem_free (client);
   return err;
 }