[dpdk-dev] testpmd: fix tso with csum engine
Commit Message
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 | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
Comments
2016-10-13 15:40, Olivier Matz:
> 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>
Applied, thanks
@@ -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)