On Tue, Aug 22, 2023 at 10:55 AM Olivier Matz <olivier.m...@6wind.com> wrote: > > 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.
And tap_tx_l3_cksum is wrong too: if (ol_flags & (RTE_MBUF_F_TX_IP_CKSUM | RTE_MBUF_F_TX_IPV4)) { This is a separate issue, I'll send another patch. > > > + 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). I agree such a rework would make the code easier to read, and may solve other issues. But I prefer to keep my original fix as is, and do what you propose as a followup patch. -- David Marchand