The GRO library doesn't re-calculate checksums for merged packets. If users want the merged packets to have correct IP checksums, they should select HW IP checksum calculation for the port which the merged packets are transmitted to. But if the port doesn't support HW IP checksum, users may perform a SW IP checksum. This patch add the code about it.
Signed-off-by: Wenwu Ma <wenwux...@intel.com> --- app/test-pmd/csumonly.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c index 8b6665d6f3..76ce58f6d0 100644 --- a/app/test-pmd/csumonly.c +++ b/app/test-pmd/csumonly.c @@ -824,6 +824,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) void **gro_ctx; uint16_t gro_pkts_num; uint8_t gro_enable; + struct rte_ipv4_hdr *ipv4_hdr; #endif uint16_t nb_rx; uint16_t nb_tx; @@ -1098,6 +1099,17 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) fs->gro_times = 0; } } + + for (i = 0; i < nb_rx; i++) { + if ((pkts_burst[i]->ol_flags & RTE_MBUF_F_TX_IPV4) && + (tx_offloads & RTE_ETH_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 -- 2.25.1