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

Reply via email to