From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from proxy.6wind.com (host.76.145.23.62.rev.coltfrance.com [62.23.145.76]) by dpdk.org (Postfix) with ESMTP id 0262B530C for ; Thu, 13 Oct 2016 15:40:48 +0200 (CEST) Received: from glumotte.dev.6wind.com (unknown [10.16.0.195]) by proxy.6wind.com (Postfix) with ESMTP id 5F0E924F90; Thu, 13 Oct 2016 15:40:45 +0200 (CEST) From: Olivier Matz To: dev@dpdk.org, pablo.de.lara.guarch@intel.com Cc: thomas.monjalon@6wind.com Date: Thu, 13 Oct 2016 15:40:30 +0200 Message-Id: <1476366030-28321-1-git-send-email-olivier.matz@6wind.com> X-Mailer: git-send-email 2.8.1 Subject: [dpdk-dev] [PATCH] testpmd: fix tso with csum engine X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 13 Oct 2016 13:40:48 -0000 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 --- app/test-pmd/csumonly.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c index f9e65b6..27d0f08 100644 --- a/app/test-pmd/csumonly.c +++ b/app/test-pmd/csumonly.c @@ -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) -- 2.8.1