clib_memset (f, 0, sizeof (f[0]));
f->index = f - vm->buffer_free_list_pool;
+ vec_validate (f->buffers, 0);
+ vec_reset_length (f->buffers);
f->n_data_bytes = vlib_buffer_round_size (n_data_bytes);
f->min_n_buffers_each_alloc = VLIB_FRAME_SIZE;
f->buffer_pool_index = 0;
wf - wvm->buffer_free_list_pool);
wf[0] = f[0];
wf->buffers = 0;
+ vec_validate (wf->buffers, 0);
+ vec_reset_length (wf->buffers);
wf->n_alloc = 0;
}
0);
}
-/* Copy template packet data into buffers as they are allocated. */
-static void __attribute__ ((unused))
-vlib_packet_template_buffer_init (vlib_main_t * vm,
- vlib_buffer_free_list_t * fl,
- u32 * buffers, u32 n_buffers)
-{
- vlib_packet_template_t *t =
- uword_to_pointer (fl->buffer_init_function_opaque,
- vlib_packet_template_t *);
- uword i;
-
- for (i = 0; i < n_buffers; i++)
- {
- vlib_buffer_t *b = vlib_get_buffer (vm, buffers[i]);
- ASSERT (b->current_length == vec_len (t->packet_data));
- clib_memcpy (vlib_buffer_get_current (b), t->packet_data,
- b->current_length);
- }
-}
-
void
vlib_packet_template_init (vlib_main_t * vm,
vlib_packet_template_t * t,
uword n_packet_data_bytes,
uword min_n_buffers_each_alloc, char *fmt, ...)
{
- vlib_buffer_main_t *bm = &buffer_main;
va_list va;
- u8 *name;
- vlib_buffer_free_list_t *fl;
va_start (va, fmt);
- name = va_format (0, fmt, &va);
+ t->name = va_format (0, fmt, &va);
va_end (va);
- if (bm->cb.vlib_packet_template_init_cb)
- bm->cb.vlib_packet_template_init_cb (vm, (void *) t, packet_data,
- n_packet_data_bytes,
- min_n_buffers_each_alloc, name);
-
vlib_worker_thread_barrier_sync (vm);
clib_memset (t, 0, sizeof (t[0]));
vec_add (t->packet_data, packet_data, n_packet_data_bytes);
t->min_n_buffers_each_alloc = min_n_buffers_each_alloc;
- t->free_list_index = vlib_buffer_create_free_list_helper
- (vm, n_packet_data_bytes,
- /* is_public */ 1,
- /* is_default */ 0,
- name);
-
- ASSERT (t->free_list_index != 0);
- fl = vlib_buffer_get_free_list (vm, t->free_list_index);
- fl->min_n_buffers_each_alloc = t->min_n_buffers_each_alloc;
-
- fl->buffer_init_function = vlib_packet_template_buffer_init;
- fl->buffer_init_function_opaque = pointer_to_uword (t);
-
- fl->buffer_init_template.current_data = 0;
- fl->buffer_init_template.current_length = n_packet_data_bytes;
- fl->buffer_init_template.flags = 0;
- fl->buffer_init_template.n_add_refs = 0;
vlib_worker_thread_barrier_release (vm);
}
*bi_result = bi;
b = vlib_get_buffer (vm, bi);
- clib_memcpy (vlib_buffer_get_current (b),
- t->packet_data, vec_len (t->packet_data));
+ clib_memcpy_fast (vlib_buffer_get_current (b),
+ t->packet_data, vec_len (t->packet_data));
b->current_length = vec_len (t->packet_data);
return b->data;
}
-void
-vlib_packet_template_get_packet_helper (vlib_main_t * vm,
- vlib_packet_template_t * t)
-{
- word n = t->min_n_buffers_each_alloc;
- word l = vec_len (t->packet_data);
- word n_alloc;
-
- ASSERT (l > 0);
- ASSERT (vec_len (t->free_buffers) == 0);
-
- vec_validate (t->free_buffers, n - 1);
- n_alloc = vlib_buffer_alloc_from_free_list (vm, t->free_buffers,
- n, t->free_list_index);
- _vec_len (t->free_buffers) = n_alloc;
-}
-
/* Append given data to end of buffer, possibly allocating new buffers. */
-u32
+int
vlib_buffer_add_data (vlib_main_t * vm,
vlib_buffer_free_list_index_t free_list_index,
- u32 buffer_index, void *data, u32 n_data_bytes)
+ u32 * buffer_index, void *data, u32 n_data_bytes)
{
u32 n_buffer_bytes, n_left, n_left_this_buffer, bi;
vlib_buffer_t *b;
void *d;
- bi = buffer_index;
+ bi = *buffer_index;
if (bi == ~0
&& 1 != vlib_buffer_alloc_from_free_list (vm, &bi, 1, free_list_index))
goto out_of_buffers;
n_left_this_buffer =
n_buffer_bytes - (b->current_data + b->current_length);
n = clib_min (n_left_this_buffer, n_left);
- clib_memcpy (vlib_buffer_get_current (b) + b->current_length, d, n);
+ clib_memcpy_fast (vlib_buffer_get_current (b) + b->current_length, d,
+ n);
b->current_length += n;
n_left -= n;
if (n_left == 0)
b = vlib_get_buffer (vm, b->next_buffer);
}
- return bi;
+ *buffer_index = bi;
+ return 0;
out_of_buffers:
- clib_error ("out of buffers");
- return bi;
+ clib_warning ("out of buffers");
+ return 1;
}
u16
}
u16 len = (data_len > max) ? max : data_len;
- clib_memcpy (vlib_buffer_get_current (l) + l->current_length,
- data + copied, len);
+ clib_memcpy_fast (vlib_buffer_get_current (l) + l->current_length,
+ data + copied, len);
vlib_buffer_chain_increase_length (first, l, len);
data_len -= len;
copied += len;
{
/* external plugin has registered own buffer callbacks
so we just copy them and quit */
- clib_memcpy (&bm->cb, vlib_buffer_callbacks,
- sizeof (vlib_buffer_callbacks_t));
+ clib_memcpy_fast (&bm->cb, vlib_buffer_callbacks,
+ sizeof (vlib_buffer_callbacks_t));
bm->callbacks_registered = 1;
return 0;
}