make test: detect early vpp crash
[vpp.git] / vnet / vnet / pg / input.c
index c3a54ad..77b56f5 100644 (file)
 #include <vlib/vlib.h>
 #include <vnet/pg/pg.h>
 #include <vnet/vnet.h>
-
-#if DPDK==1
-#include <vnet/devices/dpdk/dpdk.h>
-#endif
-
-static inline void
-pg_set_mbuf_metadata (pg_main_t * pg, u32 * buffers, u32 n_alloc)
-{
-#if DPDK == 1
-  vlib_main_t *vm = vlib_get_main ();
-  vlib_buffer_t *b;
-  struct rte_mbuf *mb;
-  i16 delta;
-  u16 new_data_len;
-  u16 new_pkt_len;
-
-  int i;
-
-  for (i = 0; i < n_alloc; i++)
-    {
-      b = vlib_get_buffer (vm, buffers[i]);
-      mb = rte_mbuf_from_vlib_buffer (b);
-
-      delta = vlib_buffer_length_in_chain (vm, b) - (i16) mb->pkt_len;
-      new_data_len = (u16) ((i16) mb->data_len + delta);
-      new_pkt_len = (u16) ((i16) mb->pkt_len + delta);
-
-      mb->data_len = new_data_len;
-      mb->pkt_len = new_pkt_len;
-      mb->data_off = (u16) ((RTE_PKTMBUF_HEADROOM) + b->current_data);
-    }
-#endif
-}
+#include <vnet/feature/feature.h>
+#include <vnet/devices/devices.h>
 
 static int
 validate_buffer_data2 (vlib_buffer_t * b, pg_stream_t * s,
@@ -192,7 +161,7 @@ do_set_fixed (pg_main_t * pg,
              u32 n_bits,
              u32 byte_offset, u32 is_net_byte_order, u64 v_min, u64 v_max)
 {
-  vlib_main_t *vm = pg->vlib_main;
+  vlib_main_t *vm = vlib_get_main ();
 
   while (n_buffers >= 4)
     {
@@ -245,7 +214,7 @@ do_set_increment (pg_main_t * pg,
                  u32 is_net_byte_order,
                  u32 want_sum, u64 * sum_result, u64 v_min, u64 v_max, u64 v)
 {
-  vlib_main_t *vm = pg->vlib_main;
+  vlib_main_t *vm = vlib_get_main ();
   u64 sum = 0;
 
   ASSERT (v >= v_min && v <= v_max);
@@ -340,7 +309,7 @@ do_set_random (pg_main_t * pg,
               u32 is_net_byte_order,
               u32 want_sum, u64 * sum_result, u64 v_min, u64 v_max)
 {
-  vlib_main_t *vm = pg->vlib_main;
+  vlib_main_t *vm = vlib_get_main ();
   u64 v_diff = v_max - v_min + 1;
   u64 r_mask = max_pow2 (v_diff) - 1;
   u64 v0, v1;
@@ -531,7 +500,7 @@ do_setbits_fixed (pg_main_t * pg,
                  u32 n_bits,
                  u32 byte_offset, u64 v_min, u64 v_max, u64 mask, u32 shift)
 {
-  vlib_main_t *vm = pg->vlib_main;
+  vlib_main_t *vm = vlib_get_main ();
 
   while (n_buffers >= 4)
     {
@@ -584,7 +553,7 @@ do_setbits_increment (pg_main_t * pg,
                      u32 byte_offset,
                      u64 v_min, u64 v_max, u64 v, u64 mask, u32 shift)
 {
-  vlib_main_t *vm = pg->vlib_main;
+  vlib_main_t *vm = vlib_get_main ();
 
   ASSERT (v >= v_min && v <= v_max);
 
@@ -662,7 +631,7 @@ do_setbits_random (pg_main_t * pg,
                   u32 n_bits,
                   u32 byte_offset, u64 v_min, u64 v_max, u64 mask, u32 shift)
 {
-  vlib_main_t *vm = pg->vlib_main;
+  vlib_main_t *vm = vlib_get_main ();
   u64 v_diff = v_max - v_min + 1;
   u64 r_mask = max_pow2 (v_diff) - 1;
   u64 v0, v1;
@@ -928,7 +897,6 @@ pg_generate_set_lengths (pg_main_t * pg,
                                     si->sw_if_index, n_buffers, length_sum);
   }
 
-  pg_set_mbuf_metadata (pg, buffers, n_buffers);
 }
 
 static void
@@ -936,7 +904,7 @@ pg_generate_fix_multi_buffer_lengths (pg_main_t * pg,
                                      pg_stream_t * s,
                                      u32 * buffers, u32 n_buffers)
 {
-  vlib_main_t *vm = pg->vlib_main;
+  vlib_main_t *vm = vlib_get_main ();
   pg_buffer_index_t *pbi;
   uword n_bytes_left;
   static u32 *unused_buffers = 0;
@@ -1044,7 +1012,7 @@ pg_set_next_buffer_pointers (pg_main_t * pg,
                             pg_stream_t * s,
                             u32 * buffers, u32 * next_buffers, u32 n_buffers)
 {
-  vlib_main_t *vm = pg->vlib_main;
+  vlib_main_t *vm = vlib_get_main ();
 
   while (n_buffers >= 4)
     {
@@ -1235,7 +1203,7 @@ pg_stream_fill_helper (pg_main_t * pg,
                       pg_buffer_index_t * bi,
                       u32 * buffers, u32 * next_buffers, u32 n_alloc)
 {
-  vlib_main_t *vm = pg->vlib_main;
+  vlib_main_t *vm = vlib_get_main ();
   vlib_buffer_free_list_t *f;
   uword is_start_of_packet = bi == s->buffer_indices;
   u32 n_allocated;
@@ -1396,24 +1364,6 @@ pg_stream_fill (pg_main_t * pg, pg_stream_t * s, u32 n_buffers)
       last_start = start;
 
       /* Verify that pkts in the fifo are properly allocated */
-#if DPDK == 1
-      if (CLIB_DEBUG > 0)
-       {
-         u32 *bi0;
-         vlib_main_t *vm = vlib_get_main ();
-         /* *INDENT-OFF* */
-          clib_fifo_foreach (bi0, bi->buffer_fifo,
-          ({
-            vlib_buffer_t * b;
-            struct rte_mbuf *mb;
-
-            b = vlib_get_buffer(vm, bi0[0]);
-            mb = rte_mbuf_from_vlib_buffer(b);
-            ASSERT(rte_mbuf_refcnt_read(mb) == 1);
-          }));
-         /* *INDENT-ON* */
-       }
-#endif
     }
 
   return n_in_fifo + n_added;
@@ -1475,7 +1425,7 @@ pg_input_trace (pg_main_t * pg,
                vlib_node_runtime_t * node,
                pg_stream_t * s, u32 * buffers, u32 n_buffers)
 {
-  vlib_main_t *vm = pg->vlib_main;
+  vlib_main_t *vm = vlib_get_main ();
   u32 *b, n_left, stream_index, next_index;
 
   n_left = n_buffers;
@@ -1546,10 +1496,17 @@ pg_generate_packets (vlib_node_runtime_t * node,
                     pg_main_t * pg,
                     pg_stream_t * s, uword n_packets_to_generate)
 {
-  vlib_main_t *vm = pg->vlib_main;
+  vlib_main_t *vm = vlib_get_main ();
   u32 *to_next, n_this_frame, n_left, n_trace, n_packets_in_fifo;
   uword n_packets_generated;
   pg_buffer_index_t *bi, *bi0;
+  u32 next_index = s->next_index;
+  vnet_feature_main_t *fm = &feature_main;
+  vnet_feature_config_main_t *cm;
+  u8 feature_arc_index = fm->device_input_feature_arc_index;
+  cm = &fm->feature_config_mains[feature_arc_index];
+  u32 current_config_index = ~(u32) 0;
+  int i;
 
   bi0 = s->buffer_indices;
 
@@ -1557,11 +1514,20 @@ pg_generate_packets (vlib_node_runtime_t * node,
   n_packets_to_generate = clib_min (n_packets_in_fifo, n_packets_to_generate);
   n_packets_generated = 0;
 
+  if (PREDICT_FALSE
+      (vnet_have_features (feature_arc_index, s->sw_if_index[VLIB_RX])))
+    {
+      current_config_index =
+       vec_elt (cm->config_index_by_sw_if_index, s->sw_if_index[VLIB_RX]);
+      vnet_get_config_data (&cm->config_main, &current_config_index,
+                           &next_index, 0);
+    }
+
   while (n_packets_to_generate > 0)
     {
       u32 *head, *start, *end;
 
-      vlib_get_next_frame (vm, node, s->next_index, to_next, n_left);
+      vlib_get_next_frame (vm, node, next_index, to_next, n_left);
 
       n_this_frame = n_packets_to_generate;
       if (n_this_frame > n_left)
@@ -1583,6 +1549,18 @@ pg_generate_packets (vlib_node_runtime_t * node,
       vec_foreach (bi, s->buffer_indices)
        clib_fifo_advance_head (bi->buffer_fifo, n_this_frame);
 
+      if (current_config_index != ~(u32) 0)
+       for (i = 0; i < n_this_frame; i++)
+         {
+           vlib_buffer_t *b;
+           b = vlib_get_buffer (vm, to_next[i]);
+           vnet_buffer (b)->device_input_feat.saved_next_index =
+             s->next_index;
+           vnet_buffer (b)->device_input_feat.buffer_advance = 0;
+           b->current_config_index = current_config_index;
+           b->feature_arc_index = feature_arc_index;
+         }
+
       n_trace = vlib_get_trace_count (vm, node);
       if (n_trace > 0)
        {
@@ -1593,7 +1571,7 @@ pg_generate_packets (vlib_node_runtime_t * node,
       n_packets_to_generate -= n_this_frame;
       n_packets_generated += n_this_frame;
       n_left -= n_this_frame;
-      vlib_put_next_frame (vm, node, s->next_index, n_left);
+      vlib_put_next_frame (vm, node, next_index, n_left);
     }
 
   return n_packets_generated;
@@ -1602,7 +1580,7 @@ pg_generate_packets (vlib_node_runtime_t * node,
 static uword
 pg_input_stream (vlib_node_runtime_t * node, pg_main_t * pg, pg_stream_t * s)
 {
-  vlib_main_t *vm = pg->vlib_main;
+  vlib_main_t *vm = vlib_get_main ();
   uword n_packets;
   f64 time_now, dt;
 
@@ -1653,10 +1631,15 @@ pg_input (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
   uword i;
   pg_main_t *pg = &pg_main;
   uword n_packets = 0;
+  u32 worker_index = 0;
+
+  if (vlib_num_workers ())
+    worker_index = vlib_get_current_worker_index ();
 
   /* *INDENT-OFF* */
-  clib_bitmap_foreach (i, pg->enabled_streams, ({
-    n_packets += pg_input_stream (node, pg, vec_elt_at_index (pg->streams, i));
+  clib_bitmap_foreach (i, pg->enabled_streams[worker_index], ({
+    pg_stream_t *s = vec_elt_at_index (pg->streams, i);
+    n_packets += pg_input_stream (node, pg, s);
   }));
   /* *INDENT-ON* */
 
@@ -1667,6 +1650,7 @@ pg_input (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
 VLIB_REGISTER_NODE (pg_input_node) = {
   .function = pg_input,
   .name = "pg-input",
+  .sibling_of = "device-input",
   .type = VLIB_NODE_TYPE_INPUT,
 
   .format_trace = format_pg_input_trace,