FD.io VPP  v18.04-17-g3a0d853
Vector Packet Processing
buffer.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 /*
16  * buffer.h: VLIB buffers
17  *
18  * Copyright (c) 2008 Eliot Dresselhaus
19  *
20  * Permission is hereby granted, free of charge, to any person obtaining
21  * a copy of this software and associated documentation files (the
22  * "Software"), to deal in the Software without restriction, including
23  * without limitation the rights to use, copy, modify, merge, publish,
24  * distribute, sublicense, and/or sell copies of the Software, and to
25  * permit persons to whom the Software is furnished to do so, subject to
26  * the following conditions:
27  *
28  * The above copyright notice and this permission notice shall be
29  * included in all copies or substantial portions of the Software.
30  *
31  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
32  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
33  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
34  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
35  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
36  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
37  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
38  */
39 
40 #ifndef included_vlib_buffer_h
41 #define included_vlib_buffer_h
42 
43 #include <vppinfra/types.h>
44 #include <vppinfra/cache.h>
45 #include <vppinfra/serialize.h>
46 #include <vppinfra/vector.h>
47 #include <vppinfra/lock.h>
48 #include <vlib/error.h> /* for vlib_error_t */
49 
50 #include <vlib/config.h> /* for __PRE_DATA_SIZE */
51 #define VLIB_BUFFER_DATA_SIZE (2048)
52 #define VLIB_BUFFER_PRE_DATA_SIZE __PRE_DATA_SIZE
53 
55 
56 /** \file
57  vlib buffer structure definition and a few select
58  access methods. This structure and the buffer allocation
59  mechanism should perhaps live in vnet, but it would take a lot
60  of typing to make it so.
61 */
62 
63 /**
64  * Buffer Flags
65  */
66 #define foreach_vlib_buffer_flag \
67  _( 0, NON_DEFAULT_FREELIST, "non-default-fl") \
68  _( 1, IS_TRACED, 0) \
69  _( 2, NEXT_PRESENT, 0) \
70  _( 3, IS_RECYCLED, "is-recycled") \
71  _( 4, TOTAL_LENGTH_VALID, 0) \
72  _( 5, REPL_FAIL, "repl-fail") \
73  _( 6, RECYCLE, "recycle") \
74  _( 7, EXT_HDR_VALID, "ext-hdr-valid")
75 
76 /* NOTE: only buffer generic flags should be defined here, please consider
77  using user flags. i.e. src/vnet/buffer.h */
78 
79 enum
80 {
81 #define _(bit, name, v) VLIB_BUFFER_##name = (1 << (bit)),
83 #undef _
84 };
85 
86 enum
87 {
88 #define _(bit, name, v) VLIB_BUFFER_LOG2_##name = (bit),
90 #undef _
91 };
92 
93  /* User defined buffer flags. */
94 #define LOG2_VLIB_BUFFER_FLAG_USER(n) (32 - (n))
95 #define VLIB_BUFFER_FLAG_USER(n) (1 << LOG2_VLIB_BUFFER_FLAG_USER(n))
96 
97 /* VLIB buffer representation. */
98 typedef struct
99 {
100  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
101  STRUCT_MARK (template_start);
102  /* Offset within data[] that we are currently processing.
103  If negative current header points into predata area. */
104  i16 current_data; /**< signed offset in data[], pre_data[]
105  that we are currently processing.
106  If negative current header points into predata area.
107  */
108  u16 current_length; /**< Nbytes between current data and
109  the end of this buffer.
110  */
111  u32 flags; /**< buffer flags:
112  <br> VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index,
113  <br> VLIB_BUFFER_IS_TRACED: trace this buffer.
114  <br> VLIB_BUFFER_NEXT_PRESENT: this is a multi-chunk buffer.
115  <br> VLIB_BUFFER_TOTAL_LENGTH_VALID: as it says
116  <br> VLIB_BUFFER_REPL_FAIL: packet replication failure
117  <br> VLIB_BUFFER_RECYCLE: as it says
118  <br> VLIB_BUFFER_EXT_HDR_VALID: buffer contains valid external buffer manager header,
119  set to avoid adding it to a flow report
120  <br> VLIB_BUFFER_FLAG_USER(n): user-defined bit N
121  */
122 
123 
124  STRUCT_MARK (template_end);
125 
126  u32 next_buffer; /**< Next buffer for this linked-list of buffers.
127  Only valid if VLIB_BUFFER_NEXT_PRESENT flag is set.
128  */
129 
130  vlib_error_t error; /**< Error code for buffers to be enqueued
131  to error handler.
132  */
133  u32 current_config_index; /**< Used by feature subgraph arcs to
134  visit enabled feature nodes
135  */
136 
137  u8 feature_arc_index; /**< Used to identify feature arcs by intermediate
138  feature node
139  */
140 
141  u8 n_add_refs; /**< Number of additional references to this buffer. */
142 
143  u8 buffer_pool_index; /**< index of buffer pool this buffer belongs. */
144  u8 dont_waste_me[1]; /**< Available space in the (precious)
145  first 32 octets of buffer metadata
146  Before allocating any of it, discussion required!
147  */
148 
149  u32 opaque[10]; /**< Opaque data used by sub-graphs for their own purposes.
150  See .../vnet/vnet/buffer.h
151  */
152  CLIB_CACHE_LINE_ALIGN_MARK (cacheline1);
153 
154  u32 trace_index; /**< Specifies index into trace buffer
155  if VLIB_PACKET_IS_TRACED flag is set.
156  */
157  u32 recycle_count; /**< Used by L2 path recycle code */
158 
160  /**< Only valid for first buffer in chain. Current length plus
161  total length given here give total number of bytes in buffer chain.
162  */
163  vlib_buffer_free_list_index_t free_list_index; /** < only used if
164  VLIB_BUFFER_NON_DEFAULT_FREELIST
165  flag is set */
166  u8 align_pad[3]; /**< available */
167  u32 opaque2[12]; /**< More opaque data, see ../vnet/vnet/buffer.h */
168 
169  /***** end of second cache line */
170  CLIB_CACHE_LINE_ALIGN_MARK (cacheline2);
171  u8 pre_data[VLIB_BUFFER_PRE_DATA_SIZE]; /**< Space for inserting data
172  before buffer start.
173  Packet rewrite string will be
174  rewritten backwards and may extend
175  back before buffer->data[0].
176  Must come directly before packet data.
177  */
178 
179  u8 data[0]; /**< Packet data. Hardware DMA here */
180 } vlib_buffer_t; /* Must be a multiple of 64B. */
181 
182 #define VLIB_BUFFER_HDR_SIZE (sizeof(vlib_buffer_t) - VLIB_BUFFER_PRE_DATA_SIZE)
183 
184 /** \brief Prefetch buffer metadata.
185  The first 64 bytes of buffer contains most header information
186 
187  @param b - (vlib_buffer_t *) pointer to the buffer
188  @param type - LOAD, STORE. In most cases, STORE is the right answer
189 */
190 
191 #define vlib_prefetch_buffer_header(b,type) CLIB_PREFETCH (b, 64, type)
192 
193 always_inline void
195 {
196  ASSERT (sizeof (b[0]) % 64 == 0);
197 
198  /* Rewrite data must be before and contiguous with packet data. */
200 }
201 
202 /** \brief Get pointer to current data to process
203 
204  @param b - (vlib_buffer_t *) pointer to the buffer
205  @return - (void *) (b->data + b->current_data)
206 */
207 
208 always_inline void *
210 {
211  /* Check bounds. */
212  ASSERT ((signed) b->current_data >= (signed) -VLIB_BUFFER_PRE_DATA_SIZE);
213  return b->data + b->current_data;
214 }
215 
216 /** \brief Advance current data pointer by the supplied (signed!) amount
217 
218  @param b - (vlib_buffer_t *) pointer to the buffer
219  @param l - (word) signed increment
220 */
221 always_inline void
223 {
224  ASSERT (b->current_length >= l);
225  b->current_data += l;
226  b->current_length -= l;
227 }
228 
229 /** \brief Check if there is enough space in buffer to advance
230 
231  @param b - (vlib_buffer_t *) pointer to the buffer
232  @param l - (word) size to check
233  @return - 0 if there is less space than 'l' in buffer
234 */
237 {
238  return b->current_length >= l;
239 }
240 
241 /** \brief Reset current header & length to state they were in when
242  packet was received.
243 
244  @param b - (vlib_buffer_t *) pointer to the buffer
245 */
246 
247 always_inline void
249 {
250  b->current_length += clib_max (b->current_data, 0);
251  b->current_data = 0;
252 }
253 
254 /** \brief Get pointer to buffer's opaque data array
255 
256  @param b - (vlib_buffer_t *) pointer to the buffer
257  @return - (void *) b->opaque
258 */
259 always_inline void *
261 {
262  return (void *) b->opaque;
263 }
264 
265 /** \brief Get pointer to buffer's opaque2 data array
266 
267  @param b - (vlib_buffer_t *) pointer to the buffer
268  @return - (void *) b->opaque2
269 */
270 always_inline void *
272 {
273  return (void *) b->opaque2;
274 }
275 
276 /** \brief Get pointer to the end of buffer's data
277  * @param b pointer to the buffer
278  * @return pointer to tail of packet's data
279  */
282 {
283  return b->data + b->current_data + b->current_length;
284 }
285 
286 /** \brief Append uninitialized data to buffer
287  * @param b pointer to the buffer
288  * @param size number of uninitialized bytes
289  * @return pointer to beginning of uninitialized data
290  */
291 always_inline void *
293 {
294  void *p = vlib_buffer_get_tail (b);
295  /* XXX make sure there's enough space */
296  b->current_length += size;
297  return p;
298 }
299 
300 /** \brief Prepend uninitialized data to buffer
301  * @param b pointer to the buffer
302  * @param size number of uninitialized bytes
303  * @return pointer to beginning of uninitialized data
304  */
305 always_inline void *
307 {
309  b->current_data -= size;
310  b->current_length += size;
311 
312  return vlib_buffer_get_current (b);
313 }
314 
315 /** \brief Make head room, typically for packet headers
316  * @param b pointer to the buffer
317  * @param size number of head room bytes
318  * @return pointer to start of buffer (current data)
319  */
320 always_inline void *
322 {
324  b->current_data += size;
325  return vlib_buffer_get_current (b);
326 }
327 
328 /** \brief Retrieve bytes from buffer head
329  * @param b pointer to the buffer
330  * @param size number of bytes to pull
331  * @return pointer to start of buffer (current data)
332  */
333 always_inline void *
335 {
337  return 0;
338 
339  void *data = vlib_buffer_get_current (b);
340  vlib_buffer_advance (b, size);
341  return data;
342 }
343 
344 /* Forward declaration. */
345 struct vlib_main_t;
346 
348 {
349  /* Template buffer used to initialize first 16 bytes of buffers
350  allocated on this free list. */
352 
353  /* Our index into vlib_main_t's buffer_free_list_pool. */
354  vlib_buffer_free_list_index_t index;
355 
356  /* Number of data bytes for buffers in this free list. */
358 
359  /* Number of buffers to allocate when we need to allocate new buffers */
361 
362  /* Total number of buffers allocated from this free list. */
364 
365  /* Vector of free buffers. Each element is a byte offset into I/O heap. */
367 
368  /* index of buffer pool used to get / put buffers */
370 
371  /* Free list name. */
373 
374  /* Callback functions to initialize newly allocated buffers.
375  If null buffers are zeroed. */
377  struct vlib_buffer_free_list_t * fl,
378  u32 * buffers, u32 n_buffers);
379 
380  /* Callback function to announce that buffers have been
381  added to the freelist */
383  (struct vlib_main_t * vm, struct vlib_buffer_free_list_t * fl);
384 
386 } __attribute__ ((aligned (16))) vlib_buffer_free_list_t;
387 
390  uword min_free_buffers);
391 typedef void (vlib_buffer_free_cb_t) (struct vlib_main_t * vm, u32 * buffers,
392  u32 n_buffers);
393 typedef void (vlib_buffer_free_no_next_cb_t) (struct vlib_main_t * vm,
394  u32 * buffers, u32 n_buffers);
395 
396 typedef struct
397 {
401  void (*vlib_packet_template_init_cb) (struct vlib_main_t * vm, void *t,
402  void *packet_data,
403  uword n_packet_data_bytes,
404  uword
405  min_n_buffers_each_physmem_alloc,
406  u8 * name);
407  void (*vlib_buffer_delete_free_list_cb) (struct vlib_main_t * vm,
408  vlib_buffer_free_list_index_t
409  free_list_index);
411 
413 
414 typedef struct
415 {
416  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
421 
423 
432 
433 typedef struct
434 {
435  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
436  /* Virtual memory address and size of buffer memory, used for calculating
437  buffer index */
441 
442  /* Buffer free callback, for subversive activities */
443  u32 (*buffer_free_callback) (struct vlib_main_t * vm,
444  u32 * buffers,
445  u32 n_buffers, u32 follow_buffer_next);
446 #define VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX (0)
447 #define VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES VLIB_BUFFER_DATA_SIZE
448 
449  /* Hash table mapping buffer size (rounded to next unit of
450  sizeof (vlib_buffer_t)) to free list index. */
452 
453  /* Hash table mapping buffer index into number
454  0 => allocated but free, 1 => allocated and not-free.
455  If buffer index is not in hash table then this buffer
456  has never been allocated. */
459 
460  /* Callbacks */
464 
466 
469 {
471  return vec_elt_at_index (bm->buffer_pools, buffer_pool_index);
472 }
473 
476  u16 buffer_size);
477 
479 
480 typedef struct
481 {
483 
484  u32 first_buffer, last_buffer;
485 
486  union
487  {
488  struct
489  {
490  /* Total accumulated bytes in chain starting with first_buffer. */
492 
493  /* Max number of bytes to accumulate in chain starting with first_buffer.
494  As this limit is reached buffers are enqueued to next node. */
496 
497  /* Next node to enqueue buffers to relative to current process node. */
499 
500  /* Free list to use to allocate new buffers. */
501  vlib_buffer_free_list_index_t free_list_index;
502  } tx;
503 
504  struct
505  {
506  /* CLIB fifo of buffer indices waiting to be unserialized. */
508 
509  /* Event type used to signal that RX buffers have been added to fifo. */
511  } rx;
512  };
514 
518  struct vlib_main_t *vm,
520 
523 void *vlib_set_buffer_free_callback (struct vlib_main_t *vm, void *fp);
524 
527 {
528  serialize_stream_t *s = &m->stream;
532  return sm->tx.n_total_data_bytes + s->current_buffer_index +
534 }
535 
536 /*
537  */
538 
539 /** \brief Compile time buffer trajectory tracing option
540  Turn this on if you run into "bad monkey" contexts,
541  and you want to know exactly which nodes they've visited...
542  See vlib/main.c...
543 */
544 #define VLIB_BUFFER_TRACE_TRAJECTORY 0
545 
546 #if VLIB_BUFFER_TRACE_TRAJECTORY > 0
547 extern void (*vlib_buffer_trace_trajectory_cb) (vlib_buffer_t * b, u32 index);
548 extern void (*vlib_buffer_trace_trajectory_init_cb) (vlib_buffer_t * b);
549 extern void vlib_buffer_trace_trajectory_init (vlib_buffer_t * b);
550 #define VLIB_BUFFER_TRACE_TRAJECTORY_INIT(b) \
551  vlib_buffer_trace_trajectory_init (b);
552 #else
553 #define VLIB_BUFFER_TRACE_TRAJECTORY_INIT(b)
554 #endif /* VLIB_BUFFER_TRACE_TRAJECTORY */
555 
556 #endif /* included_vlib_buffer_h */
557 
558 #define VLIB_BUFFER_REGISTER_CALLBACKS(x,...) \
559  __VA_ARGS__ vlib_buffer_callbacks_t __##x##_buffer_callbacks; \
560 static void __vlib_add_buffer_callbacks_t_##x (void) \
561  __attribute__((__constructor__)) ; \
562 static void __vlib_add_buffer_callbacks_t_##x (void) \
563 { \
564  if (vlib_buffer_callbacks) \
565  clib_panic ("vlib buffer callbacks already registered"); \
566  vlib_buffer_callbacks = &__##x##_buffer_callbacks; \
567 } \
568 __VA_ARGS__ vlib_buffer_callbacks_t __##x##_buffer_callbacks
569 
570 /*
571  * fd.io coding-style-patch-verification: ON
572  *
573  * Local Variables:
574  * eval: (c-set-style "gnu")
575  * End:
576  */
vlib_physmem_region_index_t physmem_region
Definition: buffer.h:420
#define CLIB_CACHE_LINE_ALIGN_MARK(mark)
Definition: cache.h:60
static u8 * vlib_buffer_get_tail(vlib_buffer_t *b)
Get pointer to the end of buffer&#39;s data.
Definition: buffer.h:281
static void vlib_buffer_reset(vlib_buffer_t *b)
Reset current header & length to state they were in when packet was received.
Definition: buffer.h:248
u32 current_config_index
Used by feature subgraph arcs to visit enabled feature nodes.
Definition: buffer.h:133
vlib_buffer_free_list_index_t free_list_index
Definition: buffer.h:501
u32 opaque[10]
Opaque data used by sub-graphs for their own purposes.
Definition: buffer.h:149
vlib_buffer_callbacks_t cb
Definition: buffer.h:461
vlib_buffer_t buffer_init_template
Definition: buffer.h:351
struct vlib_main_t * vlib_main
Definition: buffer.h:482
#define VLIB_BUFFER_PRE_DATA_SIZE
Definition: buffer.h:52
u8 buffer_pool_index
index of buffer pool this buffer belongs.
Definition: buffer.h:143
#define STRUCT_MARK(mark)
Definition: clib.h:67
u32 recycle_count
Used by L2 path recycle code.
Definition: buffer.h:157
void unserialize_open_vlib_buffer(serialize_main_t *m, struct vlib_main_t *vm, vlib_serialize_buffer_main_t *sm)
void unserialize_close_vlib_buffer(serialize_main_t *m)
void( vlib_buffer_free_cb_t)(struct vlib_main_t *vm, u32 *buffers, u32 n_buffers)
Definition: buffer.h:391
uword log2_page_size
Definition: buffer.h:419
vlib_buffer_free_list_index_t index
Definition: buffer.h:354
u32 serialize_close_vlib_buffer(serialize_main_t *m)
u8 vlib_buffer_pool_create(struct vlib_main_t *vm, vlib_physmem_region_index_t region, u16 buffer_size)
Definition: buffer.c:904
vlib_buffer_main_t buffer_main
Definition: buffer.c:52
i16 current_data
signed offset in data[], pre_data[] that we are currently processing.
Definition: buffer.h:104
#define static_always_inline
Definition: clib.h:93
void(* buffer_init_function)(struct vlib_main_t *vm, struct vlib_buffer_free_list_t *fl, u32 *buffers, u32 n_buffers)
Definition: buffer.h:376
#define always_inline
Definition: clib.h:92
void serialize_open_vlib_buffer(serialize_main_t *m, struct vlib_main_t *vm, vlib_serialize_buffer_main_t *sm)
void * vlib_set_buffer_free_callback(struct vlib_main_t *vm, void *fp)
Definition: buffer.c:561
uword buffer_mem_size
Definition: buffer.h:439
vlib_buffer_free_no_next_cb_t * vlib_buffer_free_no_next_cb
Definition: buffer.h:400
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
u8 feature_arc_index
Used to identify feature arcs by intermediate feature node.
Definition: buffer.h:137
u8 pre_data[VLIB_BUFFER_PRE_DATA_SIZE]
Space for inserting data before buffer start.
Definition: buffer.h:171
static u32 serialize_vlib_buffer_n_bytes(serialize_main_t *m)
Definition: buffer.h:526
#define fl(x, y)
int callbacks_registered
Definition: buffer.h:462
uword next_clear
Definition: buffer.h:428
u32 size
u16 current_length
Nbytes between current data and the end of this buffer.
Definition: buffer.h:108
static void * vlib_buffer_make_headroom(vlib_buffer_t *b, u8 size)
Make head room, typically for packet headers.
Definition: buffer.h:321
static void * vlib_buffer_put_uninit(vlib_buffer_t *b, u8 size)
Append uninitialized data to buffer.
Definition: buffer.h:292
static void * vlib_buffer_get_current(vlib_buffer_t *b)
Get pointer to current data to process.
Definition: buffer.h:209
vlib_buffer_pool_t * buffer_pools
Definition: buffer.h:440
u32 vlib_error_t
Definition: error.h:44
vlib_error_t error
Error code for buffers to be enqueued to error handler.
Definition: buffer.h:130
#define uword_to_pointer(u, type)
Definition: types.h:136
serialize_stream_t stream
Definition: serialize.h:147
clib_spinlock_t buffer_known_hash_lockp
Definition: buffer.h:458
vlib_buffer_fill_free_list_cb_t * vlib_buffer_fill_free_list_cb
Definition: buffer.h:398
u32 current_buffer_index
Definition: serialize.h:62
vlib_main_t * vm
Definition: buffer.c:294
clib_spinlock_t lock
Definition: buffer.h:430
static void * vlib_get_buffer_opaque2(vlib_buffer_t *b)
Get pointer to buffer&#39;s opaque2 data array.
Definition: buffer.h:271
void(* buffers_added_to_freelist_function)(struct vlib_main_t *vm, struct vlib_buffer_free_list_t *fl)
Definition: buffer.h:383
uword data_function_opaque
Definition: serialize.h:74
uword * bitmap
Definition: buffer.h:429
void( vlib_buffer_free_no_next_cb_t)(struct vlib_main_t *vm, u32 *buffers, u32 n_buffers)
Definition: buffer.h:393
#define ASSERT(truth)
unsigned int u32
Definition: types.h:88
vlib_buffer_free_cb_t * vlib_buffer_free_cb
Definition: buffer.h:399
uword buffers_per_page
Definition: buffer.h:425
u32 next_buffer
Next buffer for this linked-list of buffers.
Definition: buffer.h:126
static void vlib_buffer_advance(vlib_buffer_t *b, word l)
Advance current data pointer by the supplied (signed!) amount.
Definition: buffer.h:222
u8 n_add_refs
Number of additional references to this buffer.
Definition: buffer.h:141
#define clib_max(x, y)
Definition: clib.h:333
u64 uword
Definition: types.h:112
u32 total_length_not_including_first_buffer
Only valid for first buffer in chain.
Definition: buffer.h:159
static void * vlib_buffer_push_uninit(vlib_buffer_t *b, u8 size)
Prepend uninitialized data to buffer.
Definition: buffer.h:306
unsigned short u16
Definition: types.h:57
static u8 vlib_buffer_has_space(vlib_buffer_t *b, word l)
Check if there is enough space in buffer to advance.
Definition: buffer.h:236
i64 word
Definition: types.h:111
u32 opaque2[12]
More opaque data, see ../vnet/vnet/buffer.h.
Definition: buffer.h:167
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
unsigned char u8
Definition: types.h:56
static void * vlib_get_buffer_opaque(vlib_buffer_t *b)
Get pointer to buffer&#39;s opaque data array.
Definition: buffer.h:260
uword buffer_mem_start
Definition: buffer.h:438
uword * buffer_known_hash
Definition: buffer.h:457
clib_error_t * vlib_buffer_main_init(struct vlib_main_t *vm)
Definition: buffer.c:1018
short i16
Definition: types.h:46
struct vlib_serialize_buffer_main_t::@30::@32 tx
u8 data[0]
Packet data.
Definition: buffer.h:179
static void * vlib_buffer_pull(vlib_buffer_t *b, u8 size)
Retrieve bytes from buffer head.
Definition: buffer.h:334
static_always_inline vlib_buffer_pool_t * vlib_buffer_pool_get(u8 buffer_pool_index)
Definition: buffer.h:468
u8 vlib_buffer_free_list_index_t
Definition: buffer.h:54
#define foreach_vlib_buffer_flag
Buffer Flags.
Definition: buffer.h:66
uword buffer_init_function_opaque
Definition: buffer.h:385
uword( vlib_buffer_fill_free_list_cb_t)(struct vlib_main_t *vm, vlib_buffer_free_list_t *fl, uword min_free_buffers)
Definition: buffer.h:388
u32 flags
buffer flags: VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index, VLIB_BUFFER_IS_TRACED: trace this buffer.
Definition: buffer.h:111
u8 vlib_physmem_region_index_t
Definition: physmem.h:43
static void vlib_buffer_struct_is_sane(vlib_buffer_t *b)
Definition: buffer.h:194
u32 trace_index
Specifies index into trace buffer if VLIB_PACKET_IS_TRACED flag is set.
Definition: buffer.h:154
uword * free_list_by_size
Definition: buffer.h:451
vlib_buffer_callbacks_t * vlib_buffer_callbacks
Definition: buffer.c:49
vlib_buffer_free_list_index_t free_list_index
Definition: buffer.h:163