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, "next-present") \ 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;
367 ASSERT (pool_index < 0x00FFFFFF);
368 rv = (thread << 24) | (pool_index & 0x00FFFFFF);
381 return trace_handle >> 24;
392 return trace_handle & 0x00FFFFFF;
442 #define VLIB_BUFFER_MAX_NUMA_NODES 32 480 #define VLIB_BUFFER_TRACE_TRAJECTORY 0 482 #if VLIB_BUFFER_TRACE_TRAJECTORY > 0 483 extern void (*vlib_buffer_trace_trajectory_cb) (
vlib_buffer_t * b,
u32 index);
484 extern void (*vlib_buffer_trace_trajectory_init_cb) (
vlib_buffer_t * b);
485 extern void vlib_buffer_trace_trajectory_init (
vlib_buffer_t * b);
486 #define VLIB_BUFFER_TRACE_TRAJECTORY_INIT(b) \ 487 vlib_buffer_trace_trajectory_init (b); 489 #define VLIB_BUFFER_TRACE_TRAJECTORY_INIT(b) 492 extern u16 __vlib_buffer_external_hdr_size;
493 #define VLIB_BUFFER_SET_EXT_HDR_SIZE(x) \ 494 static void __clib_constructor \ 495 vnet_buffer_set_ext_hdr_size() \ 497 if (__vlib_buffer_external_hdr_size) \ 498 clib_error ("buffer external header space already set"); \ 499 __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 u32 vlib_buffer_make_trace_handle(u32 thread, u32 pool_index)
Construct a trace handle from thread and pool index.
static void vlib_buffer_reset(vlib_buffer_t *b)
Reset current header & length to state they were in when packet was received.
static u32 vlib_buffer_get_trace_index(vlib_buffer_t *b)
Extract the trace (pool) index from a trace handle.
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
pthread_t thread[MAX_CONNS]
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
u32 trace_handle
Specifies trace buffer handle if VLIB_PACKET_IS_TRACED flag is set.
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
static u32 vlib_buffer_get_trace_thread(vlib_buffer_t *b)
Extract the thread id from a trace handle.
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.