ICMP46 error: Clone first buffer instead of "truncating" original buffer
[vpp.git] / src / vlib / buffer_funcs.h
index 04f775d..483a990 100644 (file)
@@ -126,8 +126,8 @@ vlib_buffer_copy_template (vlib_buffer_t * b, vlib_buffer_t * bt)
 always_inline u8
 vlib_buffer_pool_get_default_for_numa (vlib_main_t * vm, u32 numa_node)
 {
-  ASSERT (numa_node < vm->buffer_main->n_numa_nodes);
-  return numa_node;
+  ASSERT (numa_node < VLIB_BUFFER_MAX_NUMA_NODES);
+  return vm->buffer_main->default_buffer_pool_index_for_numa[numa_node];
 }
 
 /** \brief Translate array of buffer indices into buffer pointers with offset
@@ -976,6 +976,27 @@ vlib_buffer_copy (vlib_main_t * vm, vlib_buffer_t * b)
   return fd;
 }
 
+/* duplicate first buffer in chain */
+always_inline vlib_buffer_t *
+vlib_buffer_copy_no_chain (vlib_main_t * vm, vlib_buffer_t * b, u32 * di)
+{
+  vlib_buffer_t *d;
+
+  if ((vlib_buffer_alloc (vm, di, 1)) != 1)
+    return 0;
+
+  d = vlib_get_buffer (vm, *di);
+  /* 1st segment */
+  d->current_data = b->current_data;
+  d->current_length = b->current_length;
+  clib_memcpy_fast (d->opaque, b->opaque, sizeof (b->opaque));
+  clib_memcpy_fast (d->opaque2, b->opaque2, sizeof (b->opaque2));
+  clib_memcpy_fast (vlib_buffer_get_current (d),
+                   vlib_buffer_get_current (b), b->current_length);
+
+  return d;
+}
+
 /** \brief Create a maximum of 256 clones of buffer and store them
     in the supplied array