X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fmemif%2Fsocket.c;h=553a17576c849609844f43663235072b4422c903;hb=12b517b3ffe3ca4b447263548cfa2bcac857c836;hp=39ff99e3d8d1551c0f6d7ede25df5f6f11192cd3;hpb=cef1db9c13f57a1fc49c9e500adffafa0b9ca728;p=vpp.git diff --git a/src/plugins/memif/socket.c b/src/plugins/memif/socket.c index 39ff99e3d8d..553a17576c8 100644 --- a/src/plugins/memif/socket.c +++ b/src/plugins/memif/socket.c @@ -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,9 +442,9 @@ 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); /* *INDENT-OFF* */ vec_foreach_index (i, mif->regions) @@ -450,7 +459,7 @@ memif_msg_receive (memif_if_t ** mifp, clib_socket_t * sock, clib_file_t * uf) 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", @@ -460,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 * @@ -633,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; } @@ -650,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; @@ -676,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; }