VPP97: Flooding of pkts with multiple buffers in BD with BVI crashes VPP 35/1335/1
authorJohn Lo <loj@cisco.com>
Tue, 31 May 2016 20:25:13 +0000 (16:25 -0400)
committerJohn Lo <loj@cisco.com>
Tue, 31 May 2016 20:25:13 +0000 (16:25 -0400)
The loopback interface should use vnet_interface_output_no_flatten so
follow-on buffers of a jumbo packet do not get put on the output frame
and be sent back to ethernet-input or l2-input node.

The replication_recycle_callback() function should not assume follow-on
buffers of a jumbo packet are on the buffer free list.

Change-Id: Ide646a6d9b43e82782c0581ea3022a9e70f82582
Signed-off-by: John Lo <loj@cisco.com>
vnet/vnet/ethernet/interface.c
vnet/vnet/replication.c

index 833ee30..76b8a9c 100644 (file)
@@ -343,6 +343,7 @@ VNET_DEVICE_CLASS (ethernet_simulated_device_class) = {
   .format_device_name = format_simulated_ethernet_name,
   .tx_function = simulated_ethernet_interface_tx,
   .admin_up_down_function = simulated_ethernet_admin_up_down,
+  .no_flatten_output_chains = 1,
 };
 
 int vnet_create_loopback_interface (u32 * sw_if_indexp, u8 *mac_address)
index 9e614ad..4e12f0b 100644 (file)
@@ -148,7 +148,6 @@ static void replication_recycle_callback (vlib_main_t *vm,
   u32 * to_next = 0;
   u32 bi0, pi0;
   vlib_buffer_t *b0;
-  vlib_buffer_t *bnext0;
   int i;
   replication_main_t * rm = &replication_main;
   replication_context_t * ctx;
@@ -208,8 +207,8 @@ static void replication_recycle_callback (vlib_main_t *vm,
               pi0 = from[1];
               vlib_prefetch_buffer_with_index(vm,pi0,LOAD);
             }
-        
-          bnext0 = b0 = vlib_get_buffer (vm, bi0);
+
+         b0 = vlib_get_buffer (vm, bi0);
 
           // Mark that this buffer was just recycled
           b0->flags |= VLIB_BUFFER_IS_RECYCLED;
@@ -218,12 +217,6 @@ static void replication_recycle_callback (vlib_main_t *vm,
           if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED))
               f->flags |= VLIB_FRAME_TRACE;
 
-          while (bnext0->flags & VLIB_BUFFER_NEXT_PRESENT)
-            {
-              from += 1;
-              n_left_from -= 1;
-              bnext0 = vlib_get_buffer (vm, bnext0->next_buffer);
-            }
           to_next[0] = bi0;
 
           from++;