- id->flags = VRING_DESC_F_NEXT;
- id->next = vec_len (descs);
- vec_add2_aligned (descs, id, 1, CLIB_CACHE_LINE_BYTES);
- b = vlib_get_buffer (vm, b->next_buffer);
- id->addr = pointer_to_uword (vlib_buffer_get_current (b));
- id->len = b->current_length;
+ d->addr = vlib_physmem_get_pa (vm, id);
+ id->addr = vlib_buffer_get_current_pa (vm, b) - hdr_sz;
+
+ /*
+ * If VIRTIO_F_ANY_LAYOUT is not negotiated, then virtio_net_hdr
+ * should be presented in separate descriptor and data will start
+ * from next descriptor.
+ */
+ if (PREDICT_TRUE
+ (vif->features & VIRTIO_FEATURE (VIRTIO_F_ANY_LAYOUT)))
+ id->len = b->current_length + hdr_sz;
+ else
+ {
+ id->len = hdr_sz;
+ id->flags = VRING_DESC_F_NEXT;
+ id->next = count;
+ count++;
+ id++;
+ id->addr = vlib_buffer_get_current_pa (vm, b);
+ id->len = b->current_length;
+ }
+ while (b->flags & VLIB_BUFFER_NEXT_PRESENT)
+ {
+ id->flags = VRING_DESC_F_NEXT;
+ id->next = count;
+ count++;
+ id++;
+ b = vlib_get_buffer (vm, b->next_buffer);
+ id->addr = vlib_buffer_get_current_pa (vm, b);
+ id->len = b->current_length;
+ }