> -----Original Message----- > From: dev <dev-boun...@dpdk.org> On Behalf Of Li, Xiaoyun > Sent: Monday, October 18, 2021 11:17 > To: Stephen Hemminger <step...@networkplumber.org> > Cc: Yigit, Ferruh <ferruh.yi...@intel.com>; dev@dpdk.org; sta...@dpdk.org > Subject: Re: [dpdk-dev] [PATCH] app/testpmd: fix l4 sw csum over multi > segments > > Hi > > > -----Original Message----- > > From: Stephen Hemminger <step...@networkplumber.org> > > Sent: Monday, October 18, 2021 11:00 > > To: Li, Xiaoyun <xiaoyun...@intel.com> > > Cc: Yigit, Ferruh <ferruh.yi...@intel.com>; dev@dpdk.org; > > sta...@dpdk.org > > Subject: Re: [dpdk-dev] [PATCH] app/testpmd: fix l4 sw csum over multi > > segments > > > > On Fri, 15 Oct 2021 13:13:06 +0800 > > Xiaoyun Li <xiaoyun...@intel.com> wrote: > > > > > + /* When sw csum is needed, multi-segs needs a buf to contain > > > + * the whole packet for later UDP/TCP csum calculation. > > > + */ > > > + if (m->nb_segs > 1 && !(tx_ol_flags & PKT_TX_TCP_SEG) && > > > + !(tx_offloads & UDP_TCP_CSUM)) { > > > + l3_buf = rte_zmalloc("csum l3_buf", > > > + info.pkt_len - info.l2_len, > > > + RTE_CACHE_LINE_SIZE); > > > + rte_pktmbuf_read(m, info.l2_len, > > > + info.pkt_len - info.l2_len, l3_buf); > > > + l3_hdr = l3_buf; > > > + } else > > > + l3_hdr = (char *)eth_hdr + info.l2_len; > > > > > > > Rather than copying whole packet, make the code handle checksum streaming. > > Copying is the easiest way to do this. > > The problem of handling checksum streaming is that in the first segment, l2 > and > l3 hdr len is 14 bytes when checksum takes 4 bytes each time. > If the datalen of the first segment is 4 bytes aligned (usual case), for the > second > segment and the following segments, they may need to add a special 2 bytes > 0x0 at the start. > Also, mbuf is not passed down to process_inner/outer_chksum so the change > will be a lot.
Also, rte_ipv4/6_udptcp_cksum can't be directly called. Because it only takes ip_hdr and whole packet buffer as input.