+ pg_generate_set_lengths (pg, s, buffers, n_alloc);
+ if (vec_len (s->buffer_indices) > 1)
+ pg_generate_fix_multi_buffer_lengths (pg, s, buffers, n_alloc);
+
+ pg_generate_edit (pg, s, buffers, n_alloc);
+ }
+
+ return n_alloc;
+}
+
+static u32
+pg_stream_fill_replay (pg_main_t * pg, pg_stream_t * s, u32 n_alloc)
+{
+ pg_buffer_index_t *bi;
+ u32 n_left, i, l;
+ u32 buffer_alloc_request = 0;
+ u32 buffer_alloc_result;
+ u32 current_buffer_index;
+ u32 *buffers;
+ vlib_main_t *vm = vlib_get_main ();
+ vnet_main_t *vnm = vnet_get_main ();
+ vnet_interface_main_t *im = &vnm->interface_main;
+ vnet_sw_interface_t *si;
+
+ buffers = pg->replay_buffers_by_thread[vm->thread_index];
+ vec_reset_length (buffers);
+ bi = s->buffer_indices;
+
+ n_left = n_alloc;
+ i = s->current_replay_packet_index;
+ l = vec_len (s->replay_packet_templates);
+
+ /* Figure out how many buffers we need */
+ while (n_left > 0)
+ {
+ u8 *d0;
+
+ d0 = vec_elt (s->replay_packet_templates, i);
+ buffer_alloc_request += (vec_len (d0) + (VLIB_BUFFER_DATA_SIZE - 1))
+ / VLIB_BUFFER_DATA_SIZE;
+
+ i = ((i + 1) == l) ? 0 : i + 1;
+ n_left--;
+ }
+
+ ASSERT (buffer_alloc_request > 0);
+ vec_validate (buffers, buffer_alloc_request - 1);
+
+ /* Allocate that many buffers */
+ buffer_alloc_result = vlib_buffer_alloc (vm, buffers, buffer_alloc_request);
+ if (buffer_alloc_result < buffer_alloc_request)
+ {
+ clib_warning ("alloc failure, got %d not %d", buffer_alloc_result,
+ buffer_alloc_request);
+ vlib_buffer_free_no_next (vm, buffers, buffer_alloc_result);
+ pg->replay_buffers_by_thread[vm->thread_index] = buffers;
+ return 0;
+ }
+
+ /* Now go generate the buffers, and add them to the FIFO */
+ n_left = n_alloc;
+
+ current_buffer_index = 0;
+ i = s->current_replay_packet_index;
+ l = vec_len (s->replay_packet_templates);
+ while (n_left > 0)
+ {
+ u8 *d0;
+ int not_last;
+ u32 data_offset;
+ u32 bytes_to_copy, bytes_this_chunk;
+ vlib_buffer_t *b;
+
+ d0 = vec_elt (s->replay_packet_templates, i);
+ data_offset = 0;
+ bytes_to_copy = vec_len (d0);
+
+ /* Add head chunk to pg fifo */
+ clib_fifo_add1 (bi->buffer_fifo, buffers[current_buffer_index]);
+
+ /* Copy the data */
+ while (bytes_to_copy)