tcp: avoid fr segments less than mss if possible
[vpp.git] / src / vnet / interface_output.c
index 659273b..47844dc 100644 (file)
@@ -85,9 +85,8 @@ format_vnet_interface_output_trace (u8 * s, va_list * va)
       else
        {
          si = vnet_get_sw_interface (vnm, t->sw_if_index);
-         s =
-           format (s, "%U ", format_vnet_sw_interface_name, vnm, si,
-                   t->flags);
+         s = format (s, "%U flags 0x%08x", format_vnet_sw_interface_name, vnm,
+                     si, t->flags);
        }
       s =
        format (s, "\n%U%U", format_white_space, indent,
@@ -170,6 +169,8 @@ vnet_interface_output_trace (vlib_main_t * vm,
 static_always_inline void
 vnet_interface_output_handle_offload (vlib_main_t *vm, vlib_buffer_t *b)
 {
+  if (b->flags & VNET_BUFFER_F_GSO)
+    return;
   vnet_calc_checksums_inline (vm, b, b->flags & VNET_BUFFER_F_IS_IP4,
                              b->flags & VNET_BUFFER_F_IS_IP6);
   vnet_calc_outer_checksums_inline (vm, b);
@@ -405,7 +406,7 @@ enqueue_one_to_tx_node (vlib_main_t *vm, vlib_node_runtime_t *node, u32 *ppqi,
                        u32 n_vectors, u32 n_left, u32 next_index)
 {
   u32 tmp[VLIB_FRAME_SIZE];
-  u64 mask[VLIB_FRAME_SIZE / 64] = {};
+  vlib_frame_bitmap_t mask = {};
   vlib_frame_t *f;
   vnet_hw_if_tx_frame_t *tf;
   u32 *to;
@@ -640,8 +641,7 @@ VLIB_NODE_FN (vnet_interface_output_node)
 
   /* if not all three flags IP4_,TCP_,UDP_CKSUM set, do compute them
    * here before sending to the interface */
-  if ((hi->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TX_CKSUM) !=
-      VNET_HW_INTERFACE_CAP_SUPPORTS_TX_CKSUM)
+  if ((hi->caps & VNET_HW_IF_CAP_TX_CKSUM) != VNET_HW_IF_CAP_TX_CKSUM)
     do_tx_offloads = 1;
 
   // basic processing
@@ -1221,7 +1221,6 @@ VLIB_NODE_FN (interface_punt) (vlib_main_t * vm,
   return interface_drop_punt (vm, node, frame, VNET_ERROR_DISPOSITION_PUNT);
 }
 
-/* *INDENT-OFF* */
 VLIB_REGISTER_NODE (interface_drop) = {
   .name = "error-drop",
   .vector_size = sizeof (u32),
@@ -1232,9 +1231,7 @@ VLIB_REGISTER_NODE (interface_drop) = {
     [0] = "drop",
   },
 };
-/* *INDENT-ON* */
 
-/* *INDENT-OFF* */
 VLIB_REGISTER_NODE (interface_punt) = {
   .name = "error-punt",
   .vector_size = sizeof (u32),
@@ -1245,7 +1242,6 @@ VLIB_REGISTER_NODE (interface_punt) = {
     [0] = "punt",
   },
 };
-/* *INDENT-ON* */
 
 VLIB_REGISTER_NODE (vnet_per_buffer_interface_output_node) = {
   .name = "interface-output",
@@ -1260,8 +1256,7 @@ VLIB_NODE_FN (vnet_interface_output_arc_end_node)
   vnet_hw_interface_t *hi;
   vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **b = bufs;
   u32 sw_if_indices[VLIB_FRAME_SIZE], *sw_if_index = sw_if_indices;
-  u64 used_elts[VLIB_FRAME_SIZE / 64] = {};
-  u64 mask[VLIB_FRAME_SIZE / 64] = {};
+  vlib_frame_bitmap_t used_elts = {}, mask = {};
   u32 *tmp, *from, n_left, n_comp, n_p_comp, swif, off;
   u16 next_index;
   void *ptr[VLIB_FRAME_SIZE], **p = ptr;
@@ -1351,8 +1346,7 @@ drop:
   if (n_left)
     {
       /* store comparison mask so we can find next unused element */
-      for (int i = 0; i < ARRAY_LEN (used_elts); i++)
-       used_elts[i] |= mask[i];
+      vlib_frame_bitmap_or (used_elts, mask);
 
       /* fine first unused sw_if_index by scanning trough used_elts bitmap */
       while (PREDICT_FALSE (used_elts[off] == ~0))