Skip to content

Commit

Permalink
app/testpmd: perform SW IP checksum for GRO/GSO packets
Browse files Browse the repository at this point in the history
[ upstream commit 1945c64 ]

The GRO/GSO library doesn't re-calculate checksums for
merged/fragmented packets. If users want the packets to
have correct IP checksums, they should select HW IP
checksum calculation for the port which the packets are
transmitted to. But if the port doesn't support HW IP
checksum, users may perform a SW IP checksum.

Fixes: b7091f1 ("app/testpmd: enable the heavyweight mode TCP/IPv4 GRO")
Fixes: 52f38a2 ("app/testpmd: enable TCP/IPv4 VxLAN and GRE GSO")

Signed-off-by: Wenwu Ma <wenwux.ma@intel.com>
Reviewed-by: Jiayu Hu <jiayu.hu@intel.com>
Tested-by: Wei Ling <weix.ling@intel.com>
Acked-by: Yuying Zhang <yuying.zhang@intel.com>
  • Loading branch information
wenwumax authored and steevenlee committed Jun 20, 2022
1 parent 3b918bc commit 9463f69
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions app/test-pmd/csumonly.c
Expand Up @@ -760,6 +760,28 @@ pkt_copy_split(const struct rte_mbuf *pkt)
return md[0];
}

#if defined(RTE_LIB_GRO) || defined(RTE_LIB_GSO)
/*
* Re-calculate IP checksum for merged/fragmented packets.
*/
static void
pkts_ip_csum_recalc(struct rte_mbuf **pkts_burst, const uint16_t nb_pkts, uint64_t tx_offloads)
{
int i;
struct rte_ipv4_hdr *ipv4_hdr;
for (i = 0; i < nb_pkts; i++) {
if ((pkts_burst[i]->ol_flags & PKT_TX_IPV4) &&
(tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) {
ipv4_hdr = rte_pktmbuf_mtod_offset(pkts_burst[i],
struct rte_ipv4_hdr *,
pkts_burst[i]->l2_len);
ipv4_hdr->hdr_checksum = 0;
ipv4_hdr->hdr_checksum = rte_ipv4_cksum(ipv4_hdr);
}
}
}
#endif

/*
* Receive a burst of packets, and for each packet:
* - parse packet, and try to recognize a supported packet type (1)
Expand Down Expand Up @@ -1072,6 +1094,8 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
fs->gro_times = 0;
}
}

pkts_ip_csum_recalc(pkts_burst, nb_rx, tx_offloads);
}

if (gso_ports[fs->tx_port].enable == 0)
Expand Down Expand Up @@ -1101,6 +1125,8 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)

tx_pkts_burst = gso_segments;
nb_rx = nb_segments;

pkts_ip_csum_recalc(tx_pkts_burst, nb_rx, tx_offloads);
}

nb_prep = rte_eth_tx_prepare(fs->tx_port, fs->tx_queue,
Expand Down

0 comments on commit 9463f69

Please sign in to comment.