X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=extras%2Flibmemif%2Fsrc%2Fmain.c;h=b2da9fa8513b85358c2b02a8adce961a5af134c2;hb=33331edd3ab8c2c2109203be7568587664f08abc;hp=5d8f03a9417284a149319e02e4565a29dbe9b0b8;hpb=93a5dd17232e42bea2fc9dcf59c652a9da31b2b3;p=vpp.git diff --git a/extras/libmemif/src/main.c b/extras/libmemif/src/main.c index 5d8f03a9417..b2da9fa8513 100644 --- a/extras/libmemif/src/main.c +++ b/extras/libmemif/src/main.c @@ -56,7 +56,7 @@ /* private structs and functions */ #include -#define ERRLIST_LEN 39 +#define ERRLIST_LEN 40 #define MAX_ERRBUF_LEN 256 #if __x86_x64__ @@ -75,6 +75,8 @@ const char *memif_errlist[ERRLIST_LEN] = { /* MEMIF_ERR_SUCCESS */ "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 */ @@ -215,8 +217,12 @@ memif_syscall_error_handler (int err_code) 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) @@ -609,8 +615,8 @@ memif_set_rx_mode (memif_conn_handle_t c, memif_rx_mode_t rx_mode, 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; @@ -626,7 +632,7 @@ memif_create (memif_conn_handle_t * c, memif_conn_args_t * args, 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) @@ -886,7 +892,7 @@ error: 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; @@ -896,6 +902,10 @@ memif_control_fd_handler (int fd, uint8_t events) 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) @@ -945,8 +955,9 @@ memif_control_fd_handler (int fd, uint8_t events) } else { - err = memif_syscall_error_handler (errno); - goto error; + strcpy ((char *) conn->remote_disconnect_string, + memif_strerror (memif_syscall_error_handler + (errno))); } } } @@ -959,21 +970,20 @@ memif_control_fd_handler (int fd, uint8_t events) 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; } } @@ -1000,24 +1010,24 @@ memif_control_fd_handler (int fd, uint8_t events) 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; } @@ -1036,11 +1046,8 @@ error: 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; @@ -1060,6 +1067,9 @@ memif_poll_event (int timeout) 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) @@ -1134,8 +1144,8 @@ memif_disconnect_internal (memif_connection_t * c) 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]; @@ -1155,8 +1165,8 @@ memif_disconnect_internal (memif_connection_t * c) 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]; @@ -1179,6 +1189,8 @@ memif_disconnect_internal (memif_connection_t * c) 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, @@ -1300,7 +1312,6 @@ memif_connect1 (memif_connection_t * c) memif_region_t *mr; memif_queue_t *mq; int i; - uint16_t num; for (i = 0; i < c->regions_num; i++) { @@ -1312,7 +1323,7 @@ memif_connect1 (memif_connection_t * c) 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); @@ -1396,8 +1407,8 @@ memif_add_region (libmemif_main_t * lm, memif_connection_t * conn, (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 + @@ -1522,11 +1533,8 @@ memif_init_queues (libmemif_main_t * lm, memif_connection_t * conn) 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); @@ -1572,8 +1580,8 @@ memif_buffer_enq_tx (memif_conn_handle_t conn, uint16_t qid, 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)) @@ -1587,7 +1595,7 @@ memif_buffer_enq_tx (memif_conn_handle_t conn, uint16_t qid, 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); @@ -1637,7 +1645,6 @@ memif_buffer_enq_tx (memif_conn_handle_t conn, uint16_t qid, err = MEMIF_ERR_NOBUF_RING; } -error: return err; } @@ -1652,8 +1659,8 @@ memif_buffer_alloc (memif_conn_handle_t conn, uint16_t qid, 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)) @@ -1662,12 +1669,12 @@ memif_buffer_alloc (memif_conn_handle_t conn, uint16_t qid, 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; @@ -1715,8 +1722,8 @@ memif_buffer_alloc (memif_conn_handle_t conn, uint16_t qid, 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 @@ -1764,7 +1771,6 @@ no_ns: err = MEMIF_ERR_NOBUF_RING; } -error: return err; } @@ -1778,8 +1784,8 @@ memif_refill_queue (memif_conn_handle_t conn, uint16_t qid, uint16_t count, 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; @@ -1832,8 +1838,8 @@ memif_tx_burst (memif_conn_handle_t conn, uint16_t qid, 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)) @@ -1899,8 +1905,8 @@ memif_rx_burst (memif_conn_handle_t conn, uint16_t qid, 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)) @@ -1911,7 +1917,7 @@ memif_rx_burst (memif_conn_handle_t conn, uint16_t qid, 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; @@ -1984,7 +1990,7 @@ memif_get_details (memif_conn_handle_t conn, memif_details_t * md, 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); @@ -2053,73 +2059,80 @@ memif_get_details (memif_conn_handle_t conn, memif_details_t * md, 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 */ @@ -2135,8 +2148,8 @@ memif_get_queue_efd (memif_conn_handle_t conn, uint16_t qid, int *efd) 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;