Hi David, On Tue, Aug 22, 2023 at 09:32:44AM +0200, David Marchand wrote: > The L4 checksum offloading API does not require l4_len to be set. > Make the driver discover the L4 headers size by itself. > > Fixes: 6546e76056e3 ("net/tap: calculate checksums of multi segs packets") > Cc: sta...@dpdk.org > > Signed-off-by: David Marchand <david.march...@redhat.com> > Tested-by: Ales Musil <amu...@redhat.com> > --- > .mailmap | 1 + > drivers/net/tap/rte_eth_tap.c | 13 +++++++++++-- > 2 files changed, 12 insertions(+), 2 deletions(-) > > diff --git a/.mailmap b/.mailmap > index 864d33ee46..b6a21b35cb 100644 > --- a/.mailmap > +++ b/.mailmap > @@ -40,6 +40,7 @@ Aleksandr Loktionov <aleksandr.loktio...@intel.com> > Aleksandr Miloshenko <a.miloshe...@f5.com> > Aleksey Baulin <aleksey.bau...@gmail.com> > Aleksey Katargin <gure...@gmail.com> > +Ales Musil <amu...@redhat.com> > Alexander Bechikov <asb.t...@gmail.com> > Alexander Belyakov <abely...@gmail.com> > Alexander Chernavin <acherna...@netgate.com> > diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c > index bf98f75559..0ab214847a 100644 > --- a/drivers/net/tap/rte_eth_tap.c > +++ b/drivers/net/tap/rte_eth_tap.c > @@ -645,13 +645,22 @@ tap_write_mbufs(struct tx_queue *txq, uint16_t > num_mbufs, > ((mbuf->ol_flags & (RTE_MBUF_F_TX_IP_CKSUM | > RTE_MBUF_F_TX_IPV4) || > (mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) == > RTE_MBUF_F_TX_UDP_CKSUM || > (mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) == > RTE_MBUF_F_TX_TCP_CKSUM))) {
While looking at the patch, I noticed this line: mbuf->ol_flags & (RTE_MBUF_F_TX_IP_CKSUM | RTE_MBUF_F_TX_IPV4) I think only RTE_MBUF_F_TX_IP_CKSUM should be checked. > + unsigned int l4_len = 0; > + > is_cksum = 1; > > + if ((mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) == > + RTE_MBUF_F_TX_UDP_CKSUM) > + l4_len = sizeof(struct rte_udp_hdr); > + else if ((mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) == > + RTE_MBUF_F_TX_TCP_CKSUM) > + l4_len = sizeof(struct rte_tcp_hdr); > + > /* Support only packets with at least layer 4 > * header included in the first segment > */ > seg_len = rte_pktmbuf_data_len(mbuf); > - l234_hlen = mbuf->l2_len + mbuf->l3_len + mbuf->l4_len; > + l234_hlen = mbuf->l2_len + mbuf->l3_len + l4_len; > if (seg_len < l234_hlen) > return -1; > > @@ -661,7 +670,7 @@ tap_write_mbufs(struct tx_queue *txq, uint16_t num_mbufs, > rte_memcpy(m_copy, rte_pktmbuf_mtod(mbuf, void *), > l234_hlen); > tap_tx_l3_cksum(m_copy, mbuf->ol_flags, > - mbuf->l2_len, mbuf->l3_len, mbuf->l4_len, > + mbuf->l2_len, mbuf->l3_len, l4_len, > &l4_cksum, &l4_phdr_cksum, > &l4_raw_cksum); > iovecs[k].iov_base = m_copy; > -- > 2.41.0 > Using rte_ipv4_udptcp_cksum() in this code would probably simplify it, and may solve other issues (for instance the 0 checksum for UDP which has a special meaning).