16 #ifndef __HICN_DATA_FWD_H__
17 #define __HICN_DATA_FWD_H__
19 #include <vlib/buffer.h>
57 HICN_DATA_FWD_NEXT_V4_LOOKUP,
58 HICN_DATA_FWD_NEXT_V6_LOOKUP,
59 HICN_DATA_FWD_NEXT_IFACE4_OUT,
60 HICN_DATA_FWD_NEXT_IFACE6_OUT,
61 HICN_DATA_FWD_NEXT_ERROR_DROP,
63 } hicn_data_fwd_next_t;
82 u16 n_buffers, u16 head_end_offset)
85 vlib_buffer_t *s = vlib_get_buffer (vm, src_buffer);
88 ASSERT (n_buffers <= 256);
90 if (s->current_length <= head_end_offset + CLIB_CACHE_LINE_BYTES * 2)
92 for (i = 0; i < n_buffers; i++)
95 d = vlib_buffer_copy (vm, s);
98 buffers[i] = vlib_get_buffer_index (vm, d);
103 vlib_buffer_alloc_from_pool (vm, buffers, n_buffers, s->buffer_pool_index);
105 for (i = 0; i < n_buffers; i++)
107 vlib_buffer_t *d = vlib_get_buffer (vm, buffers[i]);
108 d->current_data = s->current_data;
109 d->current_length = head_end_offset;
110 d->trace_handle = s->trace_handle;
112 d->total_length_not_including_first_buffer =
113 s->current_length - head_end_offset;
114 if (PREDICT_FALSE (s->flags & VLIB_BUFFER_NEXT_PRESENT))
116 d->total_length_not_including_first_buffer +=
117 s->total_length_not_including_first_buffer;
119 d->flags = s->flags | VLIB_BUFFER_NEXT_PRESENT;
120 d->flags &= ~VLIB_BUFFER_EXT_HDR_VALID;
121 d->trace_handle = s->trace_handle;
122 clib_memcpy_fast (d->opaque, s->opaque, sizeof (s->opaque));
123 clib_memcpy_fast (d->opaque2, s->opaque2, sizeof (s->opaque2));
124 clib_memcpy_fast (vlib_buffer_get_current (d),
125 vlib_buffer_get_current (s), head_end_offset);
126 d->next_buffer = src_buffer;
128 vlib_buffer_advance (s, head_end_offset);
129 s->ref_count = n_buffers;
130 while (s->flags & VLIB_BUFFER_NEXT_PRESENT)
132 s = vlib_get_buffer (vm, s->next_buffer);
133 s->ref_count = n_buffers;
155 u16 n_buffers, u16 head_end_offset)
157 vlib_buffer_t *s = vlib_get_buffer (vm, src_buffer);
163 if (PREDICT_TRUE (s->next_buffer == 0))
164 s->total_length_not_including_first_buffer = 0;
167 u8 n_clone_src = 255 - s->ref_count;
174 if (n_buffers > n_clone_src)
178 copy = vlib_buffer_copy (vm, s);
180 vlib_buffer_clone (vm, vlib_get_buffer_index (vm, copy), buffers,
181 n_buffers - n_clone_src, head_end_offset);
182 n_buffers -= n_cloned;
189 u8 tmp_ref_count = s->ref_count;
199 n_buffers, head_end_offset);
201 s->ref_count += (tmp_ref_count - 1);