app/testpmd: fix TSO with checksum engine
authorOlivier Matz <olivier.matz@6wind.com>
Thu, 13 Oct 2016 13:40:30 +0000 (15:40 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Thu, 13 Oct 2016 13:59:38 +0000 (15:59 +0200)
The commit that disabled TSO for small packets was broken during the
rebase. The problem is the IP checksum is not calculated in software if:
- TX IP checksum is disabled
- TSO is enabled
- the current packet is smaller than tso segment size

When checking if the PKT_TX_IP_CKSUM flag should be set (in case
of tso), use the local tso_segsz variable, which is set to 0 when the
packet is too small to require tso. Therefore the IP checksum will be
correctly calculated in software.

Moreover, we should not use tunnel segment size for non-tunnel tso, else
TSO will stay disabled for all packets.

Fixes: 97c21329d42b ("app/testpmd: do not use TSO for small packets")

Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
app/test-pmd/csumonly.c

index f9e65b6..27d0f08 100644 (file)
@@ -336,7 +336,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
        if (!info->is_tunnel) {
                max_pkt_len = info->l2_len + info->l3_len + info->l4_len +
                        info->tso_segsz;
-               if (info->tunnel_tso_segsz != 0 && info->pkt_len > max_pkt_len)
+               if (info->tso_segsz != 0 && info->pkt_len > max_pkt_len)
                        tso_segsz = info->tso_segsz;
        } else {
                max_pkt_len = info->outer_l2_len + info->outer_l3_len +
@@ -351,9 +351,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
                ipv4_hdr->hdr_checksum = 0;
 
                ol_flags |= PKT_TX_IPV4;
-               if (info->l4_proto == IPPROTO_TCP &&
-                   ((info->is_tunnel && info->tunnel_tso_segsz != 0) ||
-                    (!info->is_tunnel && info->tso_segsz != 0))) {
+               if (info->l4_proto == IPPROTO_TCP && tso_segsz) {
                        ol_flags |= PKT_TX_IP_CKSUM;
                } else {
                        if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM)