> -----Original Message----- > From: Ma, WenwuX <[email protected]> > Sent: Thursday, May 12, 2022 9:08 AM > To: Li, Xiaoyun <[email protected]>; Singh, Aman Deep > <[email protected]>; Zhang, Yuying <[email protected]>; > [email protected] > Cc: Hu, Jiayu <[email protected]>; Wang, Yinan <[email protected]>; > He, Xingguang <[email protected]>; Ma, WenwuX > <[email protected]>; [email protected] > 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: [email protected] > > Signed-off-by: Wenwu Ma <[email protected]> > --- > 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 <[email protected]> Thanks, Jiayu

