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;
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
ar->offset = mq->offset;
ar->log2_ring_size = mq->log2_ring_size;
ar->flags = (direction == MEMIF_RING_S2M) ? MEMIF_MSG_ADD_RING_FLAG_S2M : 0;
+ ar->private_hdr_size = 0;
}
static void
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
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 *
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);
}
return 0;
error:
+ tmp.sock = sock;
memif_msg_send_disconnect (&tmp, err);
+ memif_socket_close (&sock);
return err;
}
if (fd < 0)
return clib_error_return (0, "missing ring interrupt fd");
+ if (ar->private_hdr_size != 0)
+ return clib_error_return (0, "private headers not supported");
+
if (ar->flags & MEMIF_MSG_ADD_RING_FLAG_S2M)
{
if (ar->index != vec_len (mif->rx_queues))
mif->run.num_m2s_rings = vec_len (mif->tx_queues);
}
+ // clear previous cache data if interface reconncected
+ 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;
mq->region = ar->region;
mq->offset = ar->offset;
+ mq->type =
+ (ar->flags & MEMIF_MSG_ADD_RING_FLAG_S2M) ? MEMIF_RING_S2M :
+ MEMIF_RING_M2S;
return 0;
}
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)
{
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",
+ format_memif_device_name, mif->dev_instance);
memif_msg_enq_ack (mif);
break;
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 *
}
}
- 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;
}
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;
template.error_function = memif_master_conn_fd_error;
template.file_descriptor = client->fd;
template.private_data = uf->private_data;
+ template.description = format (0, "memif in conn on %s", msf->filename);
memif_file_add (&client->private_data, &template);
return 0;
error:
- clib_error_report (err);
+ memif_log_err (0, "%U", format_clib_error, err);
clib_mem_free (client);
return err;
}