40 #ifndef included_vlib_buffer_h 41 #define included_vlib_buffer_h 50 #include <vlib/config.h> 51 #define VLIB_BUFFER_PRE_DATA_SIZE __PRE_DATA_SIZE 53 #define VLIB_BUFFER_DEFAULT_DATA_SIZE (2048) 58 #define VLIB_BUFFER_MIN_CHAIN_SEG_SIZE (128) 61 #define VLIB_BUFFER_CLONE_HEAD_SIZE (256) 73 #define foreach_vlib_buffer_flag \ 75 _( 1, NEXT_PRESENT, 0) \ 76 _( 2, TOTAL_LENGTH_VALID, 0) \ 77 _( 3, EXT_HDR_VALID, "ext-hdr-valid") 84 #define _(bit, name, v) VLIB_BUFFER_##name = (1 << (bit)), 91 #define _(bit, name, v) VLIB_BUFFER_LOG2_##name = (bit), 97 #define LOG2_VLIB_BUFFER_FLAG_USER(n) (32 - (n)) 98 #define VLIB_BUFFER_FLAG_USER(n) (1 << LOG2_VLIB_BUFFER_FLAG_USER(n)) 99 #define VLIB_BUFFER_FLAGS_ALL (0x0f) 183 #ifdef CLIB_HAVE_VEC128 186 #ifdef CLIB_HAVE_VEC256 189 #ifdef CLIB_HAVE_VEC512 194 #define VLIB_BUFFER_HDR_SIZE (sizeof(vlib_buffer_t) - VLIB_BUFFER_PRE_DATA_SIZE) 203 #define vlib_prefetch_buffer_header(b,type) CLIB_PREFETCH (b, 64, type) 204 #define vlib_prefetch_buffer_data(b,type) \ 205 CLIB_PREFETCH (vlib_buffer_get_current(b), CLIB_CACHE_LINE_BYTES, type) 210 ASSERT (
sizeof (b[0]) % 64 == 0);
254 ASSERT ((b->
flags & VLIB_BUFFER_NEXT_PRESENT) == 0 ||
291 return (
void *) b->
opaque;
404 #define VLIB_BUFFER_MAX_NUMA_NODES 32 442 #define VLIB_BUFFER_TRACE_TRAJECTORY 0 444 #if VLIB_BUFFER_TRACE_TRAJECTORY > 0 445 extern void (*vlib_buffer_trace_trajectory_cb) (
vlib_buffer_t * b,
u32 index);
446 extern void (*vlib_buffer_trace_trajectory_init_cb) (
vlib_buffer_t * b);
447 extern void vlib_buffer_trace_trajectory_init (
vlib_buffer_t * b);
448 #define VLIB_BUFFER_TRACE_TRAJECTORY_INIT(b) \ 449 vlib_buffer_trace_trajectory_init (b); 451 #define VLIB_BUFFER_TRACE_TRAJECTORY_INIT(b) 454 extern u16 __vlib_buffer_external_hdr_size;
455 #define VLIB_BUFFER_SET_EXT_HDR_SIZE(x) \ 456 static void __clib_constructor \ 457 vnet_buffer_set_ext_hdr_size() \ 459 if (__vlib_buffer_external_hdr_size) \ 460 clib_error ("buffer external header space already set"); \ 461 __vlib_buffer_external_hdr_size = CLIB_CACHE_LINE_ROUND (x); \
u32 flags
buffer flags: VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index, VLIB_BUFFER_IS_TRACED: trace this buffer.
#define CLIB_CACHE_LINE_ALIGN_MARK(mark)
static u8 * vlib_buffer_get_tail(vlib_buffer_t *b)
Get pointer to the end of buffer's data.
static uword vlib_buffer_get_current_va(vlib_buffer_t *b)
static void vlib_buffer_reset(vlib_buffer_t *b)
Reset current header & length to state they were in when packet was received.
i16 current_data
signed offset in data[], pre_data[] that we are currently processing.
#define VLIB_BUFFER_PRE_DATA_SIZE
u16 current_length
Nbytes between current data and the end of this buffer.
#define STRUCT_MARK(mark)
u8 buffer_pool_index
index of buffer pool this buffer belongs.
vlib_buffer_pool_thread_t * threads
vlib_error_t error
Error code for buffers to be enqueued to error handler.
static void * vlib_buffer_make_headroom(vlib_buffer_t *b, u8 size)
Make head room, typically for packet headers.
vlib_buffer_t buffer_template
static void * vlib_buffer_get_current(vlib_buffer_t *b)
Get pointer to current data to process.
vlib_buffer_pool_t * buffer_pools
vlib_log_class_t log_default
clib_spinlock_t buffer_known_hash_lockp
u32 flow_id
Generic flow identifier.
#define VLIB_BUFFER_MAX_NUMA_NODES
u32 trace_index
Specifies index into trace buffer if VLIB_PACKET_IS_TRACED flag is set.
static void * vlib_get_buffer_opaque2(vlib_buffer_t *b)
Get pointer to buffer's opaque2 data array.
u32 current_config_index
Used by feature subgraph arcs to visit enabled feature nodes.
u8 pre_data[VLIB_BUFFER_PRE_DATA_SIZE]
Space for inserting data before buffer start.
static void vlib_buffer_advance(vlib_buffer_t *b, word l)
Advance current data pointer by the supplied (signed!) amount.
static uword pointer_to_uword(const void *p)
static void * vlib_buffer_push_uninit(vlib_buffer_t *b, u8 size)
Prepend uninitialized data to buffer.
static u8 vlib_buffer_has_space(vlib_buffer_t *b, word l)
Check if there is enough space in buffer to advance.
static void * vlib_get_buffer_opaque(vlib_buffer_t *b)
Get pointer to buffer's opaque data array.
u32 next_buffer
Next buffer for this linked-list of buffers.
VLIB buffer representation.
uword * buffer_known_hash
#define VLIB_BUFFER_MIN_CHAIN_SEG_SIZE
clib_error_t * vlib_buffer_main_init(struct vlib_main_t *vm)
static uword vlib_buffer_get_va(vlib_buffer_t *b)
static void * vlib_buffer_pull(vlib_buffer_t *b, u8 size)
Retrieve bytes from buffer head.
#define foreach_vlib_buffer_flag
Buffer Flags.
static void * vlib_buffer_put_uninit(vlib_buffer_t *b, u16 size)
Append uninitialized data to buffer.
u32 total_length_not_including_first_buffer
Only valid for first buffer in chain.
static void vlib_buffer_struct_is_sane(vlib_buffer_t *b)
volatile u8 ref_count
Reference count for this buffer.
u32 opaque[10]
Opaque data used by sub-graphs for their own purposes.