## Development performance test {#libmemif_devperftest_doc}
-Simle test cases using ICMP. icmpr-epoll example app generates and transmits packets over memif interface.
+Simple test cases using ICMP. icmpr-epoll example app generates and transmits packets over memif interface.
#### TC1: LIB-VPP
```
this command will create new thread which will generate icmp packets and transmit them over memif connection with specified index. Once the sequence is finished status will be printed.
-###### Example results (owerview of test data)
+###### Example results (overview of test data)
-(This test was run with modofication in VPP-memif plugin. The modification disallows memif tx node to allocate last ring buffer)
+(This test was run with modification in VPP-memif plugin. The modification disallows memif tx node to allocate last ring buffer)
lib-tx: 200M (if ring full don't drop packets)
vpp-rx: 200M
vpp-tx: 200M - 50K (if ring full drop packets)
```
> icmpr-epoll example app doesn't check ip or mac address so as long as the format is correct you can type anything as ip_daddr and hw_daddr arguments.
-###### Example results (owerview of test data)
+###### Example results (overview of test data)
lib1-tx: 200M (if ring full don't drop packets)
lib2-rx: 200M
drop: obsolete
pps: 4.5M
multiple interfaces:
-not tested (excpected same as TC1)
+not tested (expected same as TC1)
#### TC3: LIB-LIB
send 0 5 192.168.1.1 aa:aa:aa:aa:aa:aa
```
-###### Example results (owerview of test data)
+###### Example results (overview of test data)
lib1-tx: 200M (if ring full don't drop packets)
lib2-rx: 200M
drop: ~15%
pps: ~6M
multiple interfaces:
-not tested (excpected same as TC1)
+not tested (expected same as TC1)
DBG ("epoll_ctl: %s fd %d", strerror (errno), fd);
return -1;
}
- DBG ("fd %d moddified on epoll", fd);
+ DBG ("fd %d modified on epoll", fd);
return 0;
}
c->tx_buf_num = 0;
int err;
- /* disconenct then delete memif connection */
+ /* disconnect then delete memif connection */
err = memif_delete (&c->conn);
if (err != MEMIF_ERR_SUCCESS)
INFO ("memif_delete: %s", memif_strerror (err));
if (evt.data.fd > 2)
{
/* event of memif control fd */
- /* convert epolle events to memif events */
+ /* convert epoll events to memif events */
if (evt.events & EPOLLIN)
events |= MEMIF_FD_EVENT_READ;
if (evt.events & EPOLLOUT)
typedef struct
{
uint16_t index;
- /* memif conenction handle */
+ /* memif connection handle */
memif_conn_handle_t conn;
/* tx buffers */
memif_buffer_t *tx_bufs;
uint16_t tx_buf_num;
/* rx buffers */
memif_buffer_t *rx_bufs;
- /* allcoated rx buffers counter */
+ /* allocated rx buffers counter */
/* number of rx buffers pointing to shared memory */
uint16_t rx_buf_num;
/* interface ip address */
DBG ("epoll_ctl: %s fd %d", strerror (errno), fd);
return -1;
}
- DBG ("fd %d moddified on epoll", fd);
+ DBG ("fd %d modified on epoll", fd);
return 0;
}
{
memif_connection_t *c = &memif_connection[index];
int err;
- /* set data pointer to shared memory and set buffer_len to shared mmeory buffer len */
+ /* set data pointer to shared memory and set buffer_len to shared memory buffer len */
err = memif_buffer_alloc (c->conn, qid, c->tx_bufs + i, n, r, 128);
if ((err != MEMIF_ERR_SUCCESS) && (err != MEMIF_ERR_NOBUF_RING))
{
int err = MEMIF_ERR_SUCCESS, ret_val;
uint16_t rx = 0, tx = 0;
int i = 0; /* rx buffer iterator */
- int j = 0; /* tx bufferiterator */
+ int j = 0; /* tx buffer iterator */
/* loop while there are packets in shm */
do
}
j = 0;
- /* process bufers */
+ /* process buffers */
while (tx)
{
while (tx > 2)
c->tx_buf_num = 0;
int err;
- /* disconenct then delete memif connection */
+ /* disconnect then delete memif connection */
err = memif_delete (&c->conn);
if (err != MEMIF_ERR_SUCCESS)
INFO ("memif_delete: %s", memif_strerror (err));
}
timespec_get (&end, TIME_UTC);
printf ("\n\n");
- INFO ("Pakcet sequence finished!");
+ INFO ("Packet sequence finished!");
INFO ("Seq len: %u", seq);
uint64_t t1 = end.tv_sec - start.tv_sec;
uint64_t t2;
if (evt.data.fd > 2)
{
/* event of memif control fd */
- /* convert epolle events to memif events */
+ /* convert epoll events to memif events */
if (evt.events & EPOLLIN)
events |= MEMIF_FD_EVENT_READ;
if (evt.events & EPOLLOUT)
typedef struct
{
uint16_t index;
- /* memif conenction handle */
+ /* memif connection handle */
memif_conn_handle_t conn;
/* interface ip address */
uint8_t ip_addr[4];
DBG ("epoll_ctl: %s fd %d", strerror (errno), fd);
return -1;
}
- DBG ("fd %d moddified on epoll", fd);
+ DBG ("fd %d modified on epoll", fd);
return 0;
}
memif_connection_t *c = &memif_connection[index];
int i, ti;
INFO ("memif disconnected!");
- /* inform thread in polling mode about memif disconenction */
+ /* inform thread in polling mode about memif disconnection */
c->pending_del = 1;
for (i = 0; i < MAX_QUEUES; i++)
{
memif_connection_t *c = &memif_connection[index];
int err;
- /* disconenct then delete memif connection */
+ /* disconnect then delete memif connection */
err = memif_delete (&c->conn);
if (err != MEMIF_ERR_SUCCESS)
INFO ("memif_delete: %s", memif_strerror (err));
if (evt.data.fd > 2)
{
/* event of memif control fd */
- /* convert epolle events to memif events */
+ /* convert epoll events to memif events */
if (evt.events & EPOLLIN)
events |= MEMIF_FD_EVENT_READ;
if (evt.events & EPOLLOUT)
DBG ("epoll_ctl: %s fd %d", strerror (errno), fd);
return -1;
}
- DBG ("fd %d moddified on epoll", fd);
+ DBG ("fd %d modified on epoll", fd);
return 0;
}
return NULL;
}
- /* Create unique socket. Each thread requires uniqueue socket. Interfaces created
+ /* Create unique socket. Each thread requires a unique socket. Interfaces created
* on the same thread can share one socket.
*/
socket_filename[strlen (socket_filename)] = '0' + ptd->index;
typedef struct
{
uint16_t index;
- /* memif conenction handle */
+ /* memif connection handle */
memif_conn_handle_t conn;
/* buffers */
memif_buffer_t *bufs;
/* allocated tx buffers counter */
/* number of tx buffers pointing to shared memory */
uint16_t tx_buf_num;
- /* allcoated rx buffers counter */
+ /* allocated rx buffers counter */
/* number of rx buffers pointing to shared memory */
uint16_t rx_buf_num;
/* interface ip address */
DBG ("epoll_ctl: %s fd %d", strerror (errno), fd);
return -1;
}
- DBG ("fd %d moddified on epoll", fd);
+ DBG ("fd %d modified on epoll", fd);
return 0;
}
goto error;
}
- /* process bufers in place */
+ /* process buffers in place */
for (i = 0; i < rx; i++)
{
resolve_packet2 ((void *) (c->bufs + i)->data,
&(c->bufs + i)->len, c->ip_addr);
}
- /* enque processed buffers to tx ring */
+ /* enqueue processed buffers to tx ring */
err = memif_buffer_enq_tx (c->conn, qid, c->bufs, i, &tx);
if ((err != MEMIF_ERR_SUCCESS) && (err != MEMIF_ERR_NOBUF_RING))
{
return 0;
}
-/* add ethernet encap to packet in rx buffer then enqueue this buffer to tx and tranmit */
+/* add ethernet encap to packet in rx buffer then enqueue this buffer to tx and transmit */
int
on_interrupt0 (memif_conn_handle_t conn, void *private_ctx, uint16_t qid)
{
c->rx_buf_num = 0;
int err;
- /* disconenct then delete memif connection */
+ /* disconnect then delete memif connection */
err = memif_delete (&c->conn);
if (err != MEMIF_ERR_SUCCESS)
INFO ("memif_delete: %s", memif_strerror (err));
if (evt.data.fd > 2)
{
/* event of memif control fd */
- /* convert epolle events to memif events */
+ /* convert epoll events to memif events */
if (evt.events & EPOLLIN)
events |= MEMIF_FD_EVENT_READ;
if (evt.events & EPOLLOUT)
icmpr_memif_delete ()
{
int err;
- /* disconenct then delete memif connection */
+ /* disconnect then delete memif connection */
err = memif_delete (&(&memif_connection)->conn);
if (err != MEMIF_ERR_SUCCESS)
INFO ("memif_delete: %s", memif_strerror (err));
memif_connection_t *c = &memif_connection;
int err;
uint16_t r;
- /* set data pointer to shared memory and set buffer_len to shared mmeory buffer len */
+ /* set data pointer to shared memory and set buffer_len to shared memory buffer len */
err = memif_buffer_alloc (c->conn, qid, c->tx_bufs, n, &r, 0);
if (err != MEMIF_ERR_SUCCESS)
{
* @{
*/
-/** user needs to set events that occured on fd and pass them to memif_control_fd_handler */
+/** user needs to set events that occurred on fd and pass them to memif_control_fd_handler */
#define MEMIF_FD_EVENT_READ (1 << 0)
#define MEMIF_FD_EVENT_WRITE (1 << 1)
-/** inform libmemif that error occured on fd */
+/** inform libmemif that error occurred on fd */
#define MEMIF_FD_EVENT_ERROR (1 << 2)
/** if set, informs that fd is going to be closed (user may want to stop watching for events on this fd) */
#define MEMIF_FD_EVENT_DEL (1 << 3)
typedef int (memif_connection_update_t) (memif_conn_handle_t conn,
void *private_ctx);
-/** \brief Memif interrupt occured (callback function)
+/** \brief Memif interrupt occurred (callback function)
@param conn - memif connection handle
@param private_ctx - private context
- @param qid - queue id on which interrupt occured
+ @param qid - queue id on which interrupt occurred
Called when event is received on interrupt fd.
*/
@param gr - get external region addr callback
@param dr - delete external region callback
@param go - get external buffer offset callback (optional)
-*/
+
void memif_per_thread_register_external_region (memif_per_thread_main_handle_t
pt_main,
memif_add_external_region_t *
memif_get_external_buffer_offset_t
* go);
-/** @} */
+ @} */
/**
* @defgroup ARGS_N_BUFS Connection arguments and buffers
*/
int memif_poll_event (int timeout);
-/** \brief Memif poll event
+/** \brief Memif per thread poll event
@param pt_main - per thread main handle
@param timeout - timeout in seconds
/* MEMIF_ERR_CONNREFUSED */
"Connection refused",
/* MEMIF_ERR_ACCES */
- "Permission to resoure denied.",
+ "Permission to resource denied.",
/* MEMIF_ERR_NO_FILE */
"Socket file does not exist",
/* MEMIF_ERR_FILE_LIMIT */
/* MEMIF_ERR_INVAL_ARG */
"Invalid argument.",
/* MEMIF_ERR_NOCONN */
- "Memif connection handle does not point to existing conenction",
+ "Memif connection handle does not point to existing connection",
/* MEMIF_ERR_CONN */
"Memif connection handle points to existing connection",
/* MEMIF_ERR_CB_FDUPDATE */
/* if region doesn't contain shared memory, mmap region, check ring cookie */
int memif_connect1 (memif_connection_t * c);
-/* memory map region, initalize rings and queues */
+/* memory map region, initialize rings and queues */
int memif_init_regions_and_queues (memif_connection_t * c);
int memif_disconnect_internal (memif_connection_t * c);
/** \brief Memory interface details structure
@param context - sender context, to match reply w/ request
@param socket_id - u32 used to identify the given socket filename
- @param socket_filename - correpsonding NUL terminated socket filename
+ @param socket_filename - corresponding NUL terminated socket filename
*/
define memif_socket_filename_details
{
size = read (uf->file_descriptor, &b, sizeof (b));
if (size < 0)
{
- memif_log_debug (mif, "Failed to read form socket");
+ memif_log_debug (mif, "Failed to read from socket");
return 0;
}
ring_size = 1 << mq->log2_ring_size;
mask = ring_size - 1;
- /* asume that somebody will want to add ethernet header on the packet
+ /* assume that somebody will want to add ethernet header on the packet
so start with IP header at offset 14 */
start_offset = (mode == MEMIF_INTERFACE_MODE_IP) ? 14 : 0;
mif->run.num_m2s_rings = vec_len (mif->tx_queues);
}
- // clear previous cache data if interface reconncected
+ // clear previous cache data if interface reconnected
clib_memset (mq, 0, sizeof (memif_queue_t));
mq->int_fd = fd;
mq->int_clib_file_index = ~0;