X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlib%2Fbuffer.h;h=2c8d5a046a73f8b8bf0ec42a83e584a8d8b61f0a;hb=671e60e65635b8d030bf303c88411192c747b59e;hp=f9750ecf3e1cdba5dd4c7ab02736b073f95eb4a2;hpb=68b4da67deb2e8ca224bb5abaeb9dbc7ae8e378c;p=vpp.git diff --git a/src/vlib/buffer.h b/src/vlib/buffer.h index f9750ecf3e1..2c8d5a046a7 100644 --- a/src/vlib/buffer.h +++ b/src/vlib/buffer.h @@ -51,6 +51,14 @@ #define VLIB_BUFFER_DATA_SIZE (2048) #define VLIB_BUFFER_PRE_DATA_SIZE __PRE_DATA_SIZE +/* Minimum buffer chain segment size. Does not apply to last buffer in chain. + Dataplane code can safely asume that specified amount of data is not split + into 2 chained buffers */ +#define VLIB_BUFFER_MIN_CHAIN_SEG_SIZE (128) + +/* Amount of head buffer data copied to each replica head buffer */ +#define VLIB_BUFFER_CLONE_HEAD_SIZE (256) + typedef u8 vlib_buffer_free_list_index_t; /** \file @@ -90,6 +98,7 @@ enum /* User defined buffer flags. */ #define LOG2_VLIB_BUFFER_FLAG_USER(n) (32 - (n)) #define VLIB_BUFFER_FLAG_USER(n) (1 << LOG2_VLIB_BUFFER_FLAG_USER(n)) +#define VLIB_BUFFER_FLAGS_ALL (0x1f) /* VLIB buffer representation. */ typedef struct @@ -177,6 +186,8 @@ typedef struct */ #define vlib_prefetch_buffer_header(b,type) CLIB_PREFETCH (b, 64, type) +#define vlib_prefetch_buffer_data(b,type) \ + CLIB_PREFETCH (vlib_buffer_get_current(b), CLIB_CACHE_LINE_BYTES, type) always_inline void vlib_buffer_struct_is_sane (vlib_buffer_t * b) @@ -224,6 +235,9 @@ vlib_buffer_advance (vlib_buffer_t * b, word l) ASSERT (b->current_length >= l); b->current_data += l; b->current_length -= l; + + ASSERT ((b->flags & VLIB_BUFFER_NEXT_PRESENT) == 0 || + b->current_length >= VLIB_BUFFER_MIN_CHAIN_SEG_SIZE); } /** \brief Check if there is enough space in buffer to advance @@ -289,7 +303,7 @@ vlib_buffer_get_tail (vlib_buffer_t * b) * @return pointer to beginning of uninitialized data */ always_inline void * -vlib_buffer_put_uninit (vlib_buffer_t * b, u8 size) +vlib_buffer_put_uninit (vlib_buffer_t * b, u16 size) { void *p = vlib_buffer_get_tail (b); /* XXX make sure there's enough space */ @@ -393,12 +407,6 @@ typedef struct vlib_buffer_fill_free_list_cb_t *vlib_buffer_fill_free_list_cb; vlib_buffer_free_cb_t *vlib_buffer_free_cb; vlib_buffer_free_no_next_cb_t *vlib_buffer_free_no_next_cb; - void (*vlib_packet_template_init_cb) (struct vlib_main_t * vm, void *t, - void *packet_data, - uword n_packet_data_bytes, - uword - min_n_buffers_each_physmem_alloc, - u8 * name); void (*vlib_buffer_delete_free_list_cb) (struct vlib_main_t * vm, vlib_buffer_free_list_index_t free_list_index); @@ -464,61 +472,8 @@ u8 vlib_buffer_register_physmem_map (struct vlib_main_t * vm, clib_error_t *vlib_buffer_main_init (struct vlib_main_t *vm); -typedef struct -{ - struct vlib_main_t *vlib_main; - - u32 first_buffer, last_buffer; - - union - { - struct - { - /* Total accumulated bytes in chain starting with first_buffer. */ - u32 n_total_data_bytes; - - /* Max number of bytes to accumulate in chain starting with first_buffer. - As this limit is reached buffers are enqueued to next node. */ - u32 max_n_data_bytes_per_chain; - - /* Next node to enqueue buffers to relative to current process node. */ - u32 next_index; - - /* Free list to use to allocate new buffers. */ - vlib_buffer_free_list_index_t free_list_index; - } tx; - - struct - { - /* CLIB fifo of buffer indices waiting to be unserialized. */ - u32 *buffer_fifo; - - /* Event type used to signal that RX buffers have been added to fifo. */ - uword ready_one_time_event; - } rx; - }; -} vlib_serialize_buffer_main_t; - -void serialize_open_vlib_buffer (serialize_main_t * m, struct vlib_main_t *vm, - vlib_serialize_buffer_main_t * sm); -void unserialize_open_vlib_buffer (serialize_main_t * m, - struct vlib_main_t *vm, - vlib_serialize_buffer_main_t * sm); - -u32 serialize_close_vlib_buffer (serialize_main_t * m); -void unserialize_close_vlib_buffer (serialize_main_t * m); -void *vlib_set_buffer_free_callback (struct vlib_main_t *vm, void *fp); -always_inline u32 -serialize_vlib_buffer_n_bytes (serialize_main_t * m) -{ - serialize_stream_t *s = &m->stream; - vlib_serialize_buffer_main_t *sm - = uword_to_pointer (m->stream.data_function_opaque, - vlib_serialize_buffer_main_t *); - return sm->tx.n_total_data_bytes + s->current_buffer_index + - vec_len (s->overflow_buffer); -} +void *vlib_set_buffer_free_callback (struct vlib_main_t *vm, void *fp); /* */