+
+static_always_inline uword
+avf_rx_attach_tail (vlib_main_t * vm, vlib_buffer_t * bt, vlib_buffer_t * b,
+ u64 qw1, avf_rx_tail_t * t)
+{
+ vlib_buffer_t *hb = b;
+ u32 tlnifb = 0, i = 0;
+
+ if (qw1 & AVF_RXD_STATUS_EOP)
+ return 0;
+
+ while ((qw1 & AVF_RXD_STATUS_EOP) == 0)
+ {
+ ASSERT (i < AVF_RX_MAX_DESC_IN_CHAIN - 1);
+ ASSERT (qw1 & AVF_RXD_STATUS_DD);
+ qw1 = t->qw1s[i];
+ b->next_buffer = t->buffers[i];
+ b->flags |= VLIB_BUFFER_NEXT_PRESENT;
+ b = vlib_get_buffer (vm, b->next_buffer);
+ clib_memcpy_fast (b, bt, sizeof (vlib_buffer_t));
+ tlnifb += b->current_length = qw1 >> AVF_RXD_LEN_SHIFT;
+ i++;
+ }
+
+ hb->total_length_not_including_first_buffer = tlnifb;
+ hb->flags |= VLIB_BUFFER_TOTAL_LENGTH_VALID;
+ return tlnifb;
+}
+