On Thu, Apr 01, 2021 at 11:52:40AM +0200, David Marchand wrote: > Tx offload flags are of the application responsibility. > Leave the mbuf alone and check for TSO where needed. > > Signed-off-by: David Marchand <david.march...@redhat.com>
Maybe the problem being solved should be better described in the commit log. Is it a problem (other than cosmetic) to touch a mbuf in the Tx function of a driver, where we could expect that the mbuf is owned by the driver? The only problem I can think about is in case we transmit a direct mbuf whose refcnt is increased, but I wonder how much this is really supported: for instance, several drivers add vlans using rte_vlan_insert() in their Tx path. > --- > drivers/net/tap/rte_eth_tap.c | 17 ++++++++++------- > 1 file changed, 10 insertions(+), 7 deletions(-) > > diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c > index c36d4bf76e..285fe395c5 100644 > --- a/drivers/net/tap/rte_eth_tap.c > +++ b/drivers/net/tap/rte_eth_tap.c > @@ -562,6 +562,7 @@ tap_tx_l3_cksum(char *packet, uint64_t ol_flags, unsigned > int l2_len, > uint16_t *l4_phdr_cksum, uint32_t *l4_raw_cksum) > { > void *l3_hdr = packet + l2_len; > + uint64_t csum_l4; > > if (ol_flags & (PKT_TX_IP_CKSUM | PKT_TX_IPV4)) { > struct rte_ipv4_hdr *iph = l3_hdr; > @@ -571,13 +572,17 @@ tap_tx_l3_cksum(char *packet, uint64_t ol_flags, > unsigned int l2_len, > cksum = rte_raw_cksum(iph, l3_len); > iph->hdr_checksum = (cksum == 0xffff) ? cksum : ~cksum; > } > - if (ol_flags & PKT_TX_L4_MASK) { > + > + csum_l4 = ol_flags & PKT_TX_L4_MASK; > + if (ol_flags & PKT_TX_TCP_SEG) > + csum_l4 |= PKT_TX_TCP_CKSUM; > + if (csum_l4) { > void *l4_hdr; > > l4_hdr = packet + l2_len + l3_len; > - if ((ol_flags & PKT_TX_L4_MASK) == PKT_TX_UDP_CKSUM) > + if (csum_l4 == PKT_TX_UDP_CKSUM) > *l4_cksum = &((struct rte_udp_hdr > *)l4_hdr)->dgram_cksum; > - else if ((ol_flags & PKT_TX_L4_MASK) == PKT_TX_TCP_CKSUM) > + else if (csum_l4 == PKT_TX_TCP_CKSUM) > *l4_cksum = &((struct rte_tcp_hdr *)l4_hdr)->cksum; > else > return; > @@ -648,7 +653,8 @@ tap_write_mbufs(struct tx_queue *txq, uint16_t num_mbufs, > if (txq->csum && > ((mbuf->ol_flags & (PKT_TX_IP_CKSUM | PKT_TX_IPV4) || > (mbuf->ol_flags & PKT_TX_L4_MASK) == PKT_TX_UDP_CKSUM || > - (mbuf->ol_flags & PKT_TX_L4_MASK) == PKT_TX_TCP_CKSUM))) { > + (mbuf->ol_flags & PKT_TX_L4_MASK) == PKT_TX_TCP_CKSUM) || > + (mbuf->ol_flags & PKT_TX_TCP_SEG))) { > is_cksum = 1; > > /* Support only packets with at least layer 4 > @@ -742,9 +748,6 @@ pmd_tx_burst(void *queue, struct rte_mbuf **bufs, > uint16_t nb_pkts) > if (tso) { > struct rte_gso_ctx *gso_ctx = &txq->gso_ctx; > > - /* TCP segmentation implies TCP checksum offload */ > - mbuf_in->ol_flags |= PKT_TX_TCP_CKSUM; > - > /* gso size is calculated without RTE_ETHER_CRC_LEN */ > hdrs_len = mbuf_in->l2_len + mbuf_in->l3_len + > mbuf_in->l4_len; > -- > 2.23.0 >