{
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;
}
return err;
}
-int
-memif_per_thread_set_connection_request_timer (memif_per_thread_main_handle_t
- pt_main,
- struct itimerspec timer)
-{
- libmemif_main_t *lm = (libmemif_main_t *) pt_main;
- int err = MEMIF_ERR_SUCCESS;
-
- lm->arm = timer;
-
- /* overwrite timer, if already armed */
- if (lm->disconn_slaves != 0)
- {
- if (timerfd_settime (lm->timerfd, 0, &lm->arm, NULL) < 0)
- {
- err = memif_syscall_error_handler (errno);
- }
- }
- return err;
-}
-
int
memif_init (memif_control_fd_update_t * on_control_fd_update, char *app_name,
memif_alloc_t * memif_alloc, memif_realloc_t * memif_realloc,
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;
return err;
}
-int
-memif_per_thread_init (memif_per_thread_main_handle_t * pt_main,
- void *private_ctx,
- memif_control_fd_update_t * on_control_fd_update,
- char *app_name, memif_alloc_t * memif_alloc,
- memif_realloc_t * memif_realloc,
- memif_free_t * memif_free)
-{
- memif_err_t err = MEMIF_ERR_SUCCESS;
- int i;
- libmemif_main_t *lm;
-
- /* Allocate unique libmemif main */
- if (memif_alloc != NULL)
- lm = memif_alloc (sizeof (libmemif_main_t));
- else
- lm = malloc (sizeof (libmemif_main_t));
-
- if (lm == NULL)
- return MEMIF_ERR_NOMEM;
-
- memset (lm, 0, sizeof (libmemif_main_t));
-
- /* register custom memory management */
- if (memif_alloc != NULL)
- {
- memif_alloc_register (lm, memif_alloc);
- }
- else
- memif_alloc_register (lm, malloc);
-
- if (memif_realloc != NULL)
- {
- memif_realloc_register (lm, memif_realloc);
- }
- else
- memif_realloc_register (lm, realloc);
-
- if (memif_free != NULL)
- memif_free_register (lm, memif_free);
- else
- memif_free_register (lm, free);
-
- lm->private_ctx = private_ctx;
-
- /* 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);
- }
- else
- {
- strncpy ((char *) lm->app_name, MEMIF_DEFAULT_APP_NAME,
- strlen (MEMIF_DEFAULT_APP_NAME));
- }
-
- lm->poll_cancel_fd = -1;
- /* register control fd update callback */
- if (on_control_fd_update != NULL)
- memif_control_fd_update_register (lm, on_control_fd_update);
- else
- {
- /* private_ctx only used internally by memif_control_fd_update
- * pointer to this libmemif main
- */
- lm->private_ctx = lm;
- lm->epfd = epoll_create (1);
- memif_control_fd_update_register (lm, memif_control_fd_update);
- if ((lm->poll_cancel_fd = eventfd (0, EFD_NONBLOCK)) < 0)
- {
- err = errno;
- DBG ("eventfd: %s", strerror (err));
- return memif_syscall_error_handler (err);
- }
- lm->control_fd_update (lm->poll_cancel_fd, MEMIF_FD_EVENT_READ,
- lm->private_ctx);
- DBG ("libmemif event polling initialized");
- }
-
- /* Initialize lists */
- lm->control_list_len = 2;
- lm->interrupt_list_len = 2;
- lm->socket_list_len = 1;
- lm->pending_list_len = 1;
-
- lm->control_list =
- lm->alloc (sizeof (memif_list_elt_t) * lm->control_list_len);
- if (lm->control_list == NULL)
- {
- err = MEMIF_ERR_NOMEM;
- goto error;
- }
- lm->interrupt_list =
- lm->alloc (sizeof (memif_list_elt_t) * lm->interrupt_list_len);
- if (lm->interrupt_list == NULL)
- {
- err = MEMIF_ERR_NOMEM;
- goto error;
- }
- lm->socket_list =
- lm->alloc (sizeof (memif_list_elt_t) * lm->socket_list_len);
- if (lm->socket_list == NULL)
- {
- err = MEMIF_ERR_NOMEM;
- goto error;
- }
- lm->pending_list =
- lm->alloc (sizeof (memif_list_elt_t) * lm->pending_list_len);
- if (lm->pending_list == NULL)
- {
- err = MEMIF_ERR_NOMEM;
- goto error;
- }
-
- for (i = 0; i < lm->control_list_len; i++)
- {
- lm->control_list[i].key = -1;
- lm->control_list[i].data_struct = NULL;
- }
- for (i = 0; i < lm->interrupt_list_len; i++)
- {
- lm->interrupt_list[i].key = -1;
- lm->interrupt_list[i].data_struct = NULL;
- }
- for (i = 0; i < lm->socket_list_len; i++)
- {
- lm->socket_list[i].key = -1;
- lm->socket_list[i].data_struct = NULL;
- }
- for (i = 0; i < lm->pending_list_len; i++)
- {
- lm->pending_list[i].key = -1;
- lm->pending_list[i].data_struct = NULL;
- }
-
- /* Initialize autoconnect */
- lm->disconn_slaves = 0;
-
- lm->timerfd = timerfd_create (CLOCK_REALTIME, TFD_NONBLOCK);
- if (lm->timerfd < 0)
- {
- err = memif_syscall_error_handler (errno);
- goto error;
- }
-
- lm->arm.it_value.tv_sec = MEMIF_DEFAULT_RECONNECT_PERIOD_SEC;
- lm->arm.it_value.tv_nsec = MEMIF_DEFAULT_RECONNECT_PERIOD_NSEC;
- lm->arm.it_interval.tv_sec = MEMIF_DEFAULT_RECONNECT_PERIOD_SEC;
- lm->arm.it_interval.tv_nsec = MEMIF_DEFAULT_RECONNECT_PERIOD_NSEC;
-
- if (lm->control_fd_update (lm->timerfd, MEMIF_FD_EVENT_READ,
- lm->private_ctx) < 0)
- {
- DBG ("callback type memif_control_fd_update_t error!");
- err = MEMIF_ERR_CB_FDUPDATE;
- goto error;
- }
-
- *pt_main = lm;
-
- return err;
-
-error:
- *pt_main = lm;
- memif_per_thread_cleanup (pt_main);
- return err;
-}
-
static inline memif_ring_t *
memif_get_ring (memif_connection_t * conn, memif_ring_type_t type,
uint16_t ring_num)
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);
}
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;
error:
if (ms != NULL)
{
- if (ms->filename != NULL)
- {
- lm->free (ms->filename);
- ms->filename = NULL;
- }
if (ms->fd > 0)
{
close (ms->fd);
return err;
}
-int
-memif_per_thread_create_socket (memif_per_thread_main_handle_t pt_main,
- memif_socket_handle_t * sock,
- const char *filename, void *private_ctx)
-{
- libmemif_main_t *lm = (libmemif_main_t *) pt_main;
- memif_socket_t *ms = (memif_socket_t *) * sock;
- int i, err = MEMIF_ERR_SUCCESS;
-
- if (lm == NULL)
- return MEMIF_ERR_INVAL_ARG;
-
- for (i = 0; i < lm->socket_list_len; i++)
- {
- if ((ms = (memif_socket_t *) lm->socket_list[i].data_struct) != NULL)
- {
- if (strncmp ((char *) ms->filename, filename,
- strlen ((char *) ms->filename)) == 0)
- return MEMIF_ERR_INVAL_ARG;
- }
- }
-
- /* allocate memif_socket_t */
- ms = NULL;
- ms = lm->alloc (sizeof (memif_socket_t));
- if (ms == NULL)
- {
- err = MEMIF_ERR_NOMEM;
- goto error;
- }
- 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));
-
- ms->type = MEMIF_SOCKET_TYPE_NONE;
-
- ms->interface_list_len = 1;
- ms->interface_list =
- lm->alloc (sizeof (memif_list_elt_t) * ms->interface_list_len);
- if (ms->interface_list == NULL)
- {
- err = MEMIF_ERR_NOMEM;
- goto error;
- }
- ms->interface_list[0].key = -1;
- ms->interface_list[0].data_struct = NULL;
-
- *sock = ms;
-
- return err;
-
-error:
- if (ms != NULL)
- {
- if (ms->filename != NULL)
- {
- lm->free (ms->filename);
- ms->filename = NULL;
- }
- if (ms->fd > 0)
- {
- close (ms->fd);
- ms->fd = -1;
- }
- if (ms->interface_list != NULL)
- {
- lm->free (ms->interface_list);
- ms->interface_list = NULL;
- ms->interface_list_len = 0;
- }
- lm->free (ms);
- *sock = ms = NULL;
- }
- return err;
-}
int
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;
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)
return err;
}
-int
-memif_per_thread_control_fd_handler (memif_per_thread_main_handle_t pt_main,
- int fd, uint8_t events)
-{
- int i, err = MEMIF_ERR_SUCCESS; /* 0 */
- uint16_t num;
- memif_list_elt_t *e = NULL;
- memif_connection_t *conn;
- libmemif_main_t *lm = (libmemif_main_t *) pt_main;
-
- if (fd == lm->timerfd)
- {
- uint64_t b;
- ssize_t size;
- size = read (fd, &b, sizeof (b));
-
- if (size == -1)
- goto error;
-
- for (i = 0; i < lm->control_list_len; i++)
- {
- if ((lm->control_list[i].key < 0)
- && (lm->control_list[i].data_struct != NULL))
- {
- conn = lm->control_list[i].data_struct;
- if (conn->args.is_master)
- continue;
- err = memif_request_connection (conn);
- if (err != MEMIF_ERR_SUCCESS)
- DBG ("memif_request_connection: %s", memif_strerror (err));
- }
- }
- }
- else
- {
- get_list_elt (&e, lm->interrupt_list, lm->interrupt_list_len, fd);
- if (e != NULL)
- {
- if (((memif_connection_t *) e->data_struct)->on_interrupt != NULL)
- {
- num =
- (((memif_connection_t *) e->data_struct)->
- args.is_master) ? ((memif_connection_t *) e->
- data_struct)->run_args.
- num_s2m_rings : ((memif_connection_t *) e->data_struct)->
- run_args.num_m2s_rings;
- for (i = 0; i < num; i++)
- {
- if (((memif_connection_t *) e->data_struct)->
- rx_queues[i].int_fd == fd)
- {
- ((memif_connection_t *) e->data_struct)->
- on_interrupt ((void *) e->data_struct,
- ((memif_connection_t *) e->
- data_struct)->private_ctx, i);
- return MEMIF_ERR_SUCCESS;
- }
- }
- }
- return MEMIF_ERR_SUCCESS;
- }
- get_list_elt (&e, lm->socket_list, lm->socket_list_len, fd);
- if (e != NULL
- && ((memif_socket_t *) e->data_struct)->type ==
- MEMIF_SOCKET_TYPE_LISTENER)
- {
- err =
- memif_conn_fd_accept_ready ((memif_socket_t *) e->data_struct);
- return err;
- }
-
- get_list_elt (&e, lm->pending_list, lm->pending_list_len, fd);
- if (e != NULL)
- {
- err = memif_read_ready (lm, fd);
- return err;
- }
-
- get_list_elt (&e, lm->control_list, lm->control_list_len, fd);
- if (e != NULL)
- {
- if (events & MEMIF_FD_EVENT_READ)
- {
- err =
- ((memif_connection_t *) e->data_struct)->
- read_fn (e->data_struct);
- if (err != MEMIF_ERR_SUCCESS)
- return err;
- }
- if (events & MEMIF_FD_EVENT_WRITE)
- {
- err =
- ((memif_connection_t *) e->data_struct)->
- write_fn (e->data_struct);
- if (err != MEMIF_ERR_SUCCESS)
- return err;
- }
- if (events & MEMIF_FD_EVENT_ERROR)
- {
- err =
- ((memif_connection_t *) e->data_struct)->
- error_fn (e->data_struct);
- if (err != MEMIF_ERR_SUCCESS)
- return err;
- }
- }
- }
-
- return MEMIF_ERR_SUCCESS; /* 0 */
-
-error:
- return err;
-}
int
memif_poll_event (int timeout)
return 0;
}
-int
-memif_per_thread_poll_event (memif_per_thread_main_handle_t pt_main,
- int timeout)
-{
- libmemif_main_t *lm = (libmemif_main_t *) pt_main;
- struct epoll_event evt;
- int en = 0, err = MEMIF_ERR_SUCCESS; /* 0 */
- uint32_t events = 0;
- uint64_t counter = 0;
- ssize_t r = 0;
- memset (&evt, 0, sizeof (evt));
- evt.events = EPOLLIN | EPOLLOUT;
- sigset_t sigset;
- sigemptyset (&sigset);
- en = epoll_pwait (lm->epfd, &evt, 1, timeout, &sigset);
- if (en < 0)
- {
- err = errno;
- DBG ("epoll_pwait: %s", strerror (err));
- return memif_syscall_error_handler (err);
- }
- if (en > 0)
- {
- if (evt.data.fd == lm->poll_cancel_fd)
- {
- r = read (evt.data.fd, &counter, sizeof (counter));
- if (r == -1)
- return MEMIF_ERR_DISCONNECTED;
-
- return MEMIF_ERR_POLL_CANCEL;
- }
- if (evt.events & EPOLLIN)
- events |= MEMIF_FD_EVENT_READ;
- if (evt.events & EPOLLOUT)
- events |= MEMIF_FD_EVENT_WRITE;
- if (evt.events & EPOLLERR)
- events |= MEMIF_FD_EVENT_ERROR;
- err = memif_control_fd_handler (evt.data.fd, events);
- return err;
- }
- return 0;
-}
-
int
memif_cancel_poll_event ()
{
return 0;
}
-int
-memif_per_thread_cancel_poll_event (memif_per_thread_main_handle_t pt_main)
-{
- libmemif_main_t *lm = (libmemif_main_t *) pt_main;
- uint64_t counter = 1;
- ssize_t w = 0;
-
- if (lm == NULL)
- return MEMIF_ERR_INVAL_ARG;
-
- if (lm->poll_cancel_fd == -1)
- return 0;
- w = write (lm->poll_cancel_fd, &counter, sizeof (counter));
- if (w < sizeof (counter))
- return MEMIF_ERR_INT_WRITE;
-
- return 0;
-}
-
static void
memif_msg_queue_free (libmemif_main_t * lm, memif_msg_queue_elt_t ** e)
{
lm->free (ms->interface_list);
ms->interface_list = NULL;
- lm->free (ms->filename);
- ms->filename = NULL;
lm->free (ms);
*sock = ms = NULL;
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;
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);
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);
return MEMIF_ERR_SUCCESS; /* 0 */
}
-
-int
-memif_per_thread_cleanup (memif_per_thread_main_handle_t * pt_main)
-{
- libmemif_main_t *lm = (libmemif_main_t *) * pt_main;
-
- if (lm == NULL)
- return MEMIF_ERR_INVAL_ARG;
-
- /* No default socket in case of per thread */
-
- if (lm->control_list)
- lm->free (lm->control_list);
- lm->control_list = NULL;
- if (lm->interrupt_list)
- lm->free (lm->interrupt_list);
- lm->interrupt_list = NULL;
- if (lm->socket_list)
- lm->free (lm->socket_list);
- lm->socket_list = NULL;
- if (lm->pending_list)
- lm->free (lm->pending_list);
- lm->pending_list = NULL;
- if (lm->poll_cancel_fd != -1)
- close (lm->poll_cancel_fd);
-
- lm->free (lm);
-
- *pt_main = NULL;
-
- return MEMIF_ERR_SUCCESS; /* 0 */
-}