> -----Original Message----- > From: Ma, WenwuX <wenwux...@intel.com> > Sent: Thursday, May 12, 2022 9:08 AM > To: Li, Xiaoyun <xiaoyun...@intel.com>; Singh, Aman Deep > <aman.deep.si...@intel.com>; Zhang, Yuying <yuying.zh...@intel.com>; > dev@dpdk.org > Cc: Hu, Jiayu <jiayu...@intel.com>; Wang, Yinan <yinan.w...@intel.com>; > He, Xingguang <xingguang...@intel.com>; Ma, WenwuX > <wenwux...@intel.com>; sta...@dpdk.org > Subject: [PATCH v3] app/testpmd: perform SW IP checksum for GRO/GSO > packets > > 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. This patch add the code about it. > > Fixes: b7091f1dcfbc ("app/testpmd: enable the heavyweight mode TCP/IPv4 > GRO") > Fixes: 52f38a2055ed ("app/testpmd: enable TCP/IPv4 VxLAN and GRE GSO") > Cc: sta...@dpdk.org > > Signed-off-by: Wenwu Ma <wenwux...@intel.com> > --- > app/test-pmd/csumonly.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c index > 8b6665d6f3..2498ee88a2 100644 > --- a/app/test-pmd/csumonly.c > +++ b/app/test-pmd/csumonly.c > @@ -778,6 +778,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 & 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 > + > /* > * Receive a burst of packets, and for each packet: > * - parse packet, and try to recognize a supported packet type (1) @@ - > 1098,6 +1120,8 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) > fs->gro_times = 0; > } > } > + > + pkts_ip_csum_recalc(pkts_burst, nb_rx, tx_offloads); > } > #endif > > @@ -1131,6 +1155,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); > } else > #endif > tx_pkts_burst = pkts_burst; > -- > 2.25.1
Reviewed-by: Jiayu Hu <jiayu...@intel.com> Thanks, Jiayu