session: use session error type instead of vnet error
[vpp.git] / extras / libmemif / src / main.c
index c1ab3b8..e735ee3 100644 (file)
@@ -409,6 +409,16 @@ memif_connect_handler (memif_fd_event_type_t type, void *private_ctx)
   memif_socket_t *ms = (memif_socket_t *) private_ctx;
   memif_connection_t *c;
 
+  if (ms->timer_fd >= 0)
+    {
+      uint64_t u64;
+      /*
+       Have to read the timer fd else it stays read-ready
+       and makes epoll_pwait() return without sleeping
+      */
+      read (ms->timer_fd, &u64, sizeof (u64));
+    }
+
   /* loop ms->slave_interfaces and request connection for disconnected ones */
   TAILQ_FOREACH (c, &ms->slave_interfaces, next)
   {
@@ -1535,7 +1545,6 @@ memif_buffer_alloc (memif_conn_handle_t conn, uint16_t qid,
   memif_ring_t *ring = mq->ring;
   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 ns;
   int err = MEMIF_ERR_SUCCESS; /* 0 */
@@ -1563,6 +1572,7 @@ memif_buffer_alloc (memif_conn_handle_t conn, uint16_t qid,
 
       b0->desc_index = mq->next_buf;
       ring->desc[mq->next_buf & mask].flags = 0;
+      b0->flags = 0;
 
       /* slave can produce buffer with original length */
       dst_left = (c->args.is_master) ? ring->desc[mq->next_buf & mask].length :
@@ -1609,7 +1619,7 @@ memif_buffer_alloc (memif_conn_handle_t conn, uint16_t qid,
              if (ms->get_external_buffer_offset)
                d->offset = ms->get_external_buffer_offset (c->private_ctx);
              else
-               d->offset = d->offset - (d->offset & offset_mask);
+               d->offset = d->offset - (d->offset % c->run_args.buffer_size);
            }
          b0->data = memif_get_buffer (c, ring, mq->next_buf & mask);
 
@@ -1655,7 +1665,6 @@ memif_refill_queue (memif_conn_handle_t conn, uint16_t qid, uint16_t count,
   memif_queue_t *mq = &c->rx_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;
   uint16_t slot, counter = 0;
 
   if (c->args.is_master)
@@ -1681,7 +1690,8 @@ memif_refill_queue (memif_conn_handle_t conn, uint16_t qid, uint16_t count,
       if (ms->get_external_buffer_offset)
        d->offset = ms->get_external_buffer_offset (c->private_ctx);
       else
-       d->offset = d->offset - (d->offset & offset_mask) + headroom;
+       d->offset =
+         d->offset - (d->offset % c->run_args.buffer_size) + headroom;
       slot++;
       counter++;
     }
@@ -1712,7 +1722,6 @@ memif_tx_burst (memif_conn_handle_t conn, uint16_t qid,
   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;
@@ -1740,10 +1749,12 @@ memif_tx_burst (memif_conn_handle_t conn, uint16_t qid,
        }
       d = &ring->desc[b0->desc_index & mask];
       d->length = b0->len;
+      d->flags =
+       ((b0->flags & MEMIF_BUFFER_FLAG_NEXT) == 1) ? MEMIF_DESC_FLAG_NEXT : 0;
       if (!c->args.is_master)
        {
          // reset headroom
-         d->offset = d->offset - (d->offset & offset_mask);
+         d->offset = d->offset - (d->offset % c->run_args.buffer_size);
          // calculate offset from user data
          data_offset = b0->data - (d->offset + c->regions[d->region].addr);
          if (data_offset != 0)
@@ -1841,6 +1852,7 @@ memif_rx_burst (memif_conn_handle_t conn, uint16_t qid,
       b0->desc_index = cur_slot;
       b0->data = memif_get_buffer (c, ring, cur_slot & mask);
       b0->len = ring->desc[cur_slot & mask].length;
+      b0->flags = 0;
       /* slave resets buffer length */
       if (c->args.is_master == 0)
        {