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>
---
 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

Reply via email to