/* private structs and functions */
#include <memif_private.h>
-#define ERRLIST_LEN 39
+#define ERRLIST_LEN 40
#define MAX_ERRBUF_LEN 256
#if __x86_x64__
"Success.",
/* MEMIF_ERR_SYSCALL */
"Unspecified syscall error (build with -DMEMIF_DBG or make debug).",
+ /* MEMIF_ERR_CONNREFUSED */
+ "Connection refused",
/* MEMIF_ERR_ACCES */
"Permission to resoure denied.",
/* MEMIF_ERR_NO_FILE */
return MEMIF_ERR_NOMEM;
/* connection refused if master does not exist
this error would spam the user until master was created */
+/*
if (err_code == ECONNREFUSED)
return MEMIF_ERR_SUCCESS;
+*/
+ if (err_code == ECONNREFUSED)
+ return MEMIF_ERR_CONNREFUSED;
if (err_code == EALREADY)
return MEMIF_ERR_ALREADY;
if (err_code == EAGAIN)
if (conn == NULL)
return MEMIF_ERR_NOCONN;
uint8_t num =
- (conn->args.is_master) ? conn->run_args.num_s2m_rings : conn->run_args.
- num_m2s_rings;
+ (conn->args.is_master) ? conn->run_args.num_s2m_rings : conn->
+ run_args.num_m2s_rings;
if (qid >= num)
return MEMIF_ERR_QID;
memif_interrupt_t * on_interrupt, void *private_ctx)
{
libmemif_main_t *lm = &libmemif_main;
- int err, i, index, sockfd = -1;
+ int err, i, index = 0, sockfd = -1;
memif_list_elt_t list_elt;
memif_connection_t *conn = (memif_connection_t *) * c;
if (conn != NULL)
int
memif_control_fd_handler (int fd, uint8_t events)
{
- int i, rv, sockfd = -1, err = MEMIF_ERR_SUCCESS; /* 0 */
+ int i, sockfd = -1, err = MEMIF_ERR_SUCCESS; /* 0 */
uint16_t num;
memif_list_elt_t *e = NULL;
memif_connection_t *conn;
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)
}
else
{
- err = memif_syscall_error_handler (errno);
- goto error;
+ strcpy ((char *) conn->remote_disconnect_string,
+ memif_strerror (memif_syscall_error_handler
+ (errno)));
}
}
}
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;
+ (((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)
+ 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);
+ ((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;
}
}
if (events & MEMIF_FD_EVENT_READ)
{
err =
- ((memif_connection_t *) e->data_struct)->read_fn (e->
- data_struct);
+ ((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);
+ ((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);
+ ((memif_connection_t *) e->data_struct)->
+ error_fn (e->data_struct);
if (err != MEMIF_ERR_SUCCESS)
return err;
}
int
memif_poll_event (int timeout)
{
- libmemif_main_t *lm = &libmemif_main;
- memif_list_elt_t *elt;
- struct epoll_event evt, *e;
- int en = 0, err = MEMIF_ERR_SUCCESS, i = 0; /* 0 */
- uint16_t num;
+ struct epoll_event evt;
+ int en = 0, err = MEMIF_ERR_SUCCESS; /* 0 */
uint32_t events = 0;
uint64_t counter = 0;
ssize_t r = 0;
if (evt.data.fd == 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)
if (c->tx_queues != NULL)
{
num =
- (c->args.is_master) ? c->run_args.num_m2s_rings : c->run_args.
- num_s2m_rings;
+ (c->args.is_master) ? c->run_args.num_m2s_rings : c->
+ run_args.num_s2m_rings;
for (i = 0; i < num; i++)
{
mq = &c->tx_queues[i];
if (c->rx_queues != NULL)
{
num =
- (c->args.is_master) ? c->run_args.num_s2m_rings : c->run_args.
- num_m2s_rings;
+ (c->args.is_master) ? c->run_args.num_s2m_rings : c->
+ run_args.num_m2s_rings;
for (i = 0; i < num; i++)
{
mq = &c->rx_queues[i];
for (i = 0; i < c->regions_num; i++)
{
+ if (&c->regions[i] == NULL)
+ continue;
if (c->regions[i].is_external != 0)
{
lm->del_external_region (c->regions[i].addr,
memif_region_t *mr;
memif_queue_t *mq;
int i;
- uint16_t num;
for (i = 0; i < c->regions_num; i++)
{
if (mr->is_external)
{
if (lm->get_external_region_addr == NULL)
- return 99; /* FIXME: propper error report */
+ return 99; /* FIXME: proper error report */
mr->addr =
lm->get_external_region_addr (mr->region_size, mr->fd,
c->private_ctx);
(conn->run_args.num_s2m_rings +
conn->run_args.num_m2s_rings) * (sizeof (memif_ring_t) +
sizeof (memif_desc_t) *
- (1 << conn->run_args.
- log2_ring_size));
+ (1 << conn->
+ run_args.log2_ring_size));
}
r->region_size = (has_buffers == 0) ? r->buffer_offset : r->buffer_offset +
int
memif_init_regions_and_queues (memif_connection_t * conn)
{
- memif_ring_t *ring = NULL;
memif_region_t *r;
- int i, j;
libmemif_main_t *lm = &libmemif_main;
- memif_list_elt_t e;
/* region 0. rings */
memif_add_region (lm, conn, /* has_buffers */ 0);
if (EXPECT_FALSE (c->fd < 0))
return MEMIF_ERR_DISCONNECTED;
uint8_t num =
- (c->args.is_master) ? c->run_args.num_m2s_rings : c->run_args.
- num_s2m_rings;
+ (c->args.is_master) ? c->run_args.num_m2s_rings : c->
+ run_args.num_s2m_rings;
if (EXPECT_FALSE (qid >= num))
return MEMIF_ERR_QID;
if (EXPECT_FALSE (!count_out))
uint16_t mask = (1 << mq->log2_ring_size) - 1;
uint16_t ring_size;
uint16_t slot, ns;
- int i, err = MEMIF_ERR_SUCCESS; /* 0 */
+ int err = MEMIF_ERR_SUCCESS; /* 0 */
*count_out = 0;
ring_size = (1 << mq->log2_ring_size);
err = MEMIF_ERR_NOBUF_RING;
}
-error:
return err;
}
if (EXPECT_FALSE (c->fd < 0))
return MEMIF_ERR_DISCONNECTED;
uint8_t num =
- (c->args.is_master) ? c->run_args.num_m2s_rings : c->run_args.
- num_s2m_rings;
+ (c->args.is_master) ? c->run_args.num_m2s_rings : c->
+ run_args.num_s2m_rings;
if (EXPECT_FALSE (qid >= num))
return MEMIF_ERR_QID;
if (EXPECT_FALSE (!count_out))
libmemif_main_t *lm = &libmemif_main;
memif_queue_t *mq = &c->tx_queues[qid];
memif_ring_t *ring = mq->ring;
- memif_buffer_t *b0, *b1;
+ memif_buffer_t *b0;
uint16_t mask = (1 << mq->log2_ring_size) - 1;
uint32_t offset_mask = c->run_args.buffer_size - 1;
uint16_t ring_size;
uint16_t slot, ns;
- int i, err = MEMIF_ERR_SUCCESS; /* 0 */
+ int err = MEMIF_ERR_SUCCESS; /* 0 */
uint16_t dst_left, src_left;
uint16_t saved_count;
memif_buffer_t *saved_b;
b0 = (bufs + *count_out);
b0->desc_index = slot;
dst_left =
- (c->args.is_master) ? ring->desc[slot & mask].length : c->
- run_args.buffer_size;
+ (c->args.is_master) ? ring->desc[slot & mask].
+ length : c->run_args.buffer_size;
ring->desc[slot & mask].flags = 0;
}
else
err = MEMIF_ERR_NOBUF_RING;
}
-error:
return err;
}
if (EXPECT_FALSE (c->fd < 0))
return MEMIF_ERR_DISCONNECTED;
uint8_t num =
- (c->args.is_master) ? c->run_args.num_s2m_rings : c->run_args.
- num_m2s_rings;
+ (c->args.is_master) ? c->run_args.num_s2m_rings : c->
+ run_args.num_m2s_rings;
if (EXPECT_FALSE (qid >= num))
return MEMIF_ERR_QID;
libmemif_main_t *lm = &libmemif_main;
if (EXPECT_FALSE (c->fd < 0))
return MEMIF_ERR_DISCONNECTED;
uint8_t num =
- (c->args.is_master) ? c->run_args.num_m2s_rings : c->run_args.
- num_s2m_rings;
+ (c->args.is_master) ? c->run_args.num_m2s_rings : c->
+ run_args.num_s2m_rings;
if (EXPECT_FALSE (qid >= num))
return MEMIF_ERR_QID;
if (EXPECT_FALSE (!tx))
if (EXPECT_FALSE (c->fd < 0))
return MEMIF_ERR_DISCONNECTED;
uint8_t num =
- (c->args.is_master) ? c->run_args.num_s2m_rings : c->run_args.
- num_m2s_rings;
+ (c->args.is_master) ? c->run_args.num_s2m_rings : c->
+ run_args.num_m2s_rings;
if (EXPECT_FALSE (qid >= num))
return MEMIF_ERR_QID;
if (EXPECT_FALSE (!rx))
uint16_t cur_slot, last_slot;
uint16_t ns;
uint16_t mask = (1 << mq->log2_ring_size) - 1;
- memif_buffer_t *b0, *b1;
+ memif_buffer_t *b0;
*rx = 0;
uint64_t b;
return MEMIF_ERR_NOCONN;
int err = MEMIF_ERR_SUCCESS, i;
- ssize_t l0, l1, total_l;
+ ssize_t l0, l1;
l0 = 0;
l1 = strlen ((char *) c->args.interface_name);
else
err = MEMIF_ERR_NOBUF_DET;
+ l1 = strlen ((char *) c->remote_disconnect_string);
+ if (l0 + l1 < buflen)
+ {
+ md->error =
+ (uint8_t *) strcpy (buf + l0, (char *) c->remote_disconnect_string);
+ l0 += l1 + 1;
+ }
+ else
+ err = MEMIF_ERR_NOBUF_DET;
+
md->regions_num = c->regions_num;
l1 = sizeof (memif_region_details_t) * md->regions_num;
if (l0 + l1 <= buflen)
{
- md->regions = (memif_region_details_t *) buf + l0;
+ md->regions = (memif_region_details_t *) (buf + l0);
+ for (i = 0; i < md->regions_num; i++)
+ {
+ md->regions[i].index = i;
+ md->regions[i].addr = c->regions[i].addr;
+ md->regions[i].size = c->regions[i].region_size;
+ md->regions[i].fd = c->regions[i].fd;
+ md->regions[i].is_external = c->regions[i].is_external;
+ }
l0 += l1;
}
else
err = MEMIF_ERR_NOBUF_DET;
- for (i = 0; i < md->regions_num; i++)
- {
- md->regions[i].index = i;
- md->regions[i].addr = c->regions[i].addr;
- md->regions[i].size = c->regions[i].region_size;
- md->regions[i].fd = c->regions[i].fd;
- md->regions[i].is_external = c->regions[i].is_external;
- }
-
md->rx_queues_num =
- (c->args.is_master) ? c->run_args.num_s2m_rings : c->run_args.
- num_m2s_rings;
+ (c->args.is_master) ? c->run_args.num_s2m_rings : c->
+ run_args.num_m2s_rings;
l1 = sizeof (memif_queue_details_t) * md->rx_queues_num;
if (l0 + l1 <= buflen)
{
- md->rx_queues = (memif_queue_details_t *) buf + l0;
+ md->rx_queues = (memif_queue_details_t *) (buf + l0);
+ for (i = 0; i < md->rx_queues_num; i++)
+ {
+ md->rx_queues[i].region = c->rx_queues[i].region;
+ md->rx_queues[i].qid = i;
+ md->rx_queues[i].ring_size = (1 << c->rx_queues[i].log2_ring_size);
+ md->rx_queues[i].flags = c->rx_queues[i].ring->flags;
+ md->rx_queues[i].head = c->rx_queues[i].ring->head;
+ md->rx_queues[i].tail = c->rx_queues[i].ring->tail;
+ md->rx_queues[i].buffer_size = c->run_args.buffer_size;
+ }
l0 += l1;
}
else
err = MEMIF_ERR_NOBUF_DET;
- for (i = 0; i < md->rx_queues_num; i++)
- {
- md->rx_queues[i].region = c->rx_queues[i].region;
- md->rx_queues[i].qid = i;
- md->rx_queues[i].ring_size = (1 << c->rx_queues[i].log2_ring_size);
- md->rx_queues[i].flags = c->rx_queues[i].ring->flags;
- md->rx_queues[i].head = c->rx_queues[i].ring->head;
- md->rx_queues[i].tail = c->rx_queues[i].ring->tail;
- md->rx_queues[i].buffer_size = c->run_args.buffer_size;
- }
-
md->tx_queues_num =
- (c->args.is_master) ? c->run_args.num_m2s_rings : c->run_args.
- num_s2m_rings;
+ (c->args.is_master) ? c->run_args.num_m2s_rings : c->
+ run_args.num_s2m_rings;
l1 = sizeof (memif_queue_details_t) * md->tx_queues_num;
if (l0 + l1 <= buflen)
{
- md->tx_queues = (memif_queue_details_t *) buf + l0;
+ md->tx_queues = (memif_queue_details_t *) (buf + l0);
+ for (i = 0; i < md->tx_queues_num; i++)
+ {
+ md->tx_queues[i].region = c->tx_queues[i].region;
+ md->tx_queues[i].qid = i;
+ md->tx_queues[i].ring_size = (1 << c->tx_queues[i].log2_ring_size);
+ md->tx_queues[i].flags = c->tx_queues[i].ring->flags;
+ md->tx_queues[i].head = c->tx_queues[i].ring->head;
+ md->tx_queues[i].tail = c->tx_queues[i].ring->tail;
+ md->tx_queues[i].buffer_size = c->run_args.buffer_size;
+ }
l0 += l1;
}
else
err = MEMIF_ERR_NOBUF_DET;
- for (i = 0; i < md->tx_queues_num; i++)
- {
- md->tx_queues[i].region = c->tx_queues[i].region;
- md->tx_queues[i].qid = i;
- md->tx_queues[i].ring_size = (1 << c->tx_queues[i].log2_ring_size);
- md->tx_queues[i].flags = c->tx_queues[i].ring->flags;
- md->tx_queues[i].head = c->tx_queues[i].ring->head;
- md->tx_queues[i].tail = c->tx_queues[i].ring->tail;
- md->tx_queues[i].buffer_size = c->run_args.buffer_size;
- }
-
md->link_up_down = (c->fd > 0) ? 1 : 0;
return err; /* 0 */
if (c->fd < 0)
return MEMIF_ERR_DISCONNECTED;
uint8_t num =
- (c->args.is_master) ? c->run_args.num_s2m_rings : c->run_args.
- num_m2s_rings;
+ (c->args.is_master) ? c->run_args.num_s2m_rings : c->
+ run_args.num_m2s_rings;
if (qid >= num)
return MEMIF_ERR_QID;