dpdk: do not use TSO for small packets
[vpp.git] / src / plugins / dpdk / device / device.c
index 532987c..ec33f6a 100644 (file)
@@ -222,7 +222,7 @@ dpdk_buffer_tx_offload (dpdk_device_t * xd, vlib_buffer_t * b,
   u32 tcp_cksum = b->flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM;
   u32 udp_cksum = b->flags & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM;
   int is_ip4 = b->flags & VNET_BUFFER_F_IS_IP4;
-  u32 tso = b->flags & VNET_BUFFER_F_GSO;
+  u32 tso = b->flags & VNET_BUFFER_F_GSO, max_pkt_len;
   u64 ol_flags;
 
   /* Is there any work for us? */
@@ -238,12 +238,15 @@ dpdk_buffer_tx_offload (dpdk_device_t * xd, vlib_buffer_t * b,
   ol_flags |= ip_cksum ? PKT_TX_IP_CKSUM : 0;
   ol_flags |= tcp_cksum ? PKT_TX_TCP_CKSUM : 0;
   ol_flags |= udp_cksum ? PKT_TX_UDP_CKSUM : 0;
-  ol_flags |= tso ? (tcp_cksum ? PKT_TX_TCP_SEG : PKT_TX_UDP_SEG) : 0;
 
   if (tso)
     {
       mb->l4_len = vnet_buffer2 (b)->gso_l4_hdr_sz;
       mb->tso_segsz = vnet_buffer2 (b)->gso_size;
+      /* ensure packet is large enough to require tso */
+      max_pkt_len = mb->l2_len + mb->l3_len + mb->l4_len + mb->tso_segsz;
+      if (mb->tso_segsz != 0 && mb->pkt_len > max_pkt_len)
+       ol_flags |= (tcp_cksum ? PKT_TX_TCP_SEG : PKT_TX_UDP_SEG);
     }
 
   mb->ol_flags |= ol_flags;
@@ -539,8 +542,8 @@ dpdk_subif_add_del_function (vnet_main_t * vnm,
   if ((xd->flags & DPDK_DEVICE_FLAG_PMD) == 0)
     goto done;
 
-  /* currently we program VLANS only for IXGBE VF and I40E VF */
-  if ((xd->pmd != VNET_DPDK_PMD_IXGBEVF) && (xd->pmd != VNET_DPDK_PMD_I40EVF))
+  /* currently we program VLANS only for IXGBE VF */
+  if (xd->pmd != VNET_DPDK_PMD_IXGBEVF)
     goto done;
 
   if (t->sub.eth.flags.no_tags == 1)
@@ -629,14 +632,14 @@ dpdk_interface_set_rss_queues (struct vnet_main_t *vnm,
 
   valid_queue_count = 0;
   /* *INDENT-OFF* */
-  clib_bitmap_foreach (i, bitmap, ({
+  clib_bitmap_foreach (i, bitmap)  {
     if (i >= dev_info.nb_rx_queues)
       {
         err = clib_error_return (0, "illegal queue number");
         goto done;
       }
     reta[valid_queue_count++] = i;
-  }));
+  }
   /* *INDENT-ON* */
 
   /* check valid_queue_count not zero, make coverity happy */