- {
- if (mif->flags & MEMIF_IF_FLAG_ZERO_COPY)
- {
- memif_ring_t *ring = mq->ring;
- u16 cur_slot,last_slot, start;
- u16 ring_size = 1 << mq->log2_ring_size;
- u16 mask = ring_size - 1;
- u16 n_slots = ring->tail - mq->last_tail;
- cur_slot = mq->last_tail;
- last_slot = mq->ring->head;
- start = (mq->last_tail & mask);
- if(last_slot > cur_slot)
- n_slots = n_slots + ((last_slot - cur_slot)) ;
- else if (last_slot < cur_slot)
- n_slots = n_slots + (cur_slot - last_slot);
- vlib_buffer_free_from_ring_no_next (vm, mq->buffers,
- start,
- ring_size, n_slots);
- }
- memif_queue_intfd_close (mq);
- }
-