#include <vnet/ethernet/ethernet.h>
#include <vnet/devices/devices.h>
#include <vnet/feature/feature.h>
+#include <vnet/ip/ip4_packet.h>
+#include <vnet/ip/ip6_packet.h>
#include <vnet/devices/virtio/virtio.h>
virtio_refill_vring (vlib_main_t * vm, virtio_vring_t * vring)
{
const int hdr_sz = sizeof (struct virtio_net_hdr_v1);
- u16 used, next, avail, n_slots, n_alloc;
+ u16 used, next, avail, n_slots;
u16 sz = vring->size;
u16 mask = sz - 1;
- int i;
used = vring->desc_in_use;
n_slots = sz - used;
next = vring->desc_next;
avail = vring->avail->idx;
- n_alloc = vlib_buffer_alloc (vm, &vring->buffers[next], n_slots);
-
- if (PREDICT_FALSE (n_alloc < n_slots))
- n_slots = n_alloc;
-
- i = next + n_slots - sz;
- if (PREDICT_FALSE (i > 0))
- clib_memcpy (vring->buffers, &vring->buffers[sz], i * sizeof (u32));
+ n_slots = vlib_buffer_alloc_to_ring (vm, vring->buffers, next, vring->size,
+ n_slots);
while (n_slots)
{
vlib_frame_t * frame, virtio_if_t * vif, u16 qid)
{
vnet_main_t *vnm = vnet_get_main ();
- u32 thread_index = vlib_get_thread_index ();
+ u32 thread_index = vm->thread_index;
uword n_trace = vlib_get_trace_count (vm, node);
virtio_vring_t *vring = vec_elt_at_index (vif->vrings, 0);
u32 next_index = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT;
tr->next_index = next0;
tr->hw_if_index = vif->hw_if_index;
tr->len = len;
- clib_memcpy (&tr->hdr, hdr, hdr_sz);
+ clib_memcpy_fast (&tr->hdr, hdr, hdr_sz);
}
/* enqueue buffer */