From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf0-f50.google.com (mail-lf0-f50.google.com [209.85.215.50]) by dpdk.org (Postfix) with ESMTP id B20483989 for ; Fri, 7 Apr 2017 12:41:18 +0200 (CEST) Received: by mail-lf0-f50.google.com with SMTP id q141so10095758lfe.2 for ; Fri, 07 Apr 2017 03:41:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Wud4gnQsTNGTT7DLYSJu2gUO9FO/bv2n8OaIdlbmjpI=; b=1GV0ZxqlrPzWIVk+IiXFU23U4H4KNpuVlO0yWPkUUzWeXBBXWIroUGNU9u7eSbWa5A qYJbqtlh5nCCS2y1dIHqI4N44u4vJsx7dzqOsjra83qsSRTX9P+RpzcszVPMdMQitPfF gJMUuHmehFBTKMtIl9PJLwVjWPNmdayd6F2O1lnzrgcmyZJMu0HJpUnqDEeJNl8cEE5q /THmU6uhtuuOv2vytdcDIVlEVdcCWDcwh4jV4vrMzBb6gtov+Ogh19ty4nwobx+e+e/1 UHB+pvTOUqUKpPJDkrb0i1Pmmop+wI8LcYvhkUsl47C/92L1IYWGjYyCzCFgj/sGApE2 45vw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Wud4gnQsTNGTT7DLYSJu2gUO9FO/bv2n8OaIdlbmjpI=; b=Oz8jC7R0P6HiUodgmFKvoYoDYJGcu8R/gh5lSM8kkrbamxQXBwas5QzozwGcEKKZwR fYExgnUdMLbYxh77g55htlBuVyjkF3GIYyywRyry4AwdunQcnawEOroY2cVQ4n2a8OLs +plPjGRgYSZvJXVIW1pgYSFbWJkvaNMCJyUTqP1sb9kXHCVW8+q55Nsm6rLxS3HIpW0Y cDxaI7dyP1AMD0O9tdH4rlZDChFTo5QH+1fql3eKY8jLU0Nha2vGMxyh/XYKALLUQ7Dw FAd1hYb5q4j5MfvkUA0eCb3jBkVIiHyQCSNaTvhDkaT52b4/jGN3nt4hjUMVATEYt7Ns zjPg== X-Gm-Message-State: AFeK/H1FH5qeRkRiJ6lioxwPSKltBzBsDC9eC2jrRrGdGKEa83n9zyxwMwpe0a8ziOZgOQ== X-Received: by 10.46.80.93 with SMTP id v29mr12242329ljd.94.1491561678292; Fri, 07 Apr 2017 03:41:18 -0700 (PDT) Received: from enkidu.local (31-172-191-173.noc.fibertech.net.pl. [31.172.191.173]) by smtp.gmail.com with ESMTPSA id g3sm873290lfe.34.2017.04.07.03.41.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 07 Apr 2017 03:41:17 -0700 (PDT) From: Marcin Wojtas To: dev@dpdk.org Cc: jan.medala@outlook.com, jpalider@gmail.com, netanel@amazon.com, evgenys@amazon.com, matua@amazon.com, gtzalik@amazon.com, mw@semihalf.com, mk@semihalf.com Date: Fri, 7 Apr 2017 12:48:58 +0200 Message-Id: <1491562138-2178-5-git-send-email-mw@semihalf.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1491562138-2178-1-git-send-email-mw@semihalf.com> References: <1491562138-2178-1-git-send-email-mw@semihalf.com> Subject: [dpdk-dev] [PATCH 4/4] net/ena: calculate partial checksum if DF bit is disabled X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 07 Apr 2017 10:41:19 -0000 From: Michal Krawczyk When TSO is disabled we still have to calculate partial checksum if DF bit if turned off. This is caused by firmware bug. If application will not set m2_len field, we assume we that it was Ethernet frame because we have to look inside the packet to check for the DF flag. To make it work properly, PMD is assuming that before sending packet application called function rte_eth_tx_prepare(). Signed-off-by: Michal Krawczyk --- drivers/net/ena/ena_ethdev.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c index 54ba5c1..bb2a8ba 100644 --- a/drivers/net/ena/ena_ethdev.c +++ b/drivers/net/ena/ena_ethdev.c @@ -1599,14 +1599,30 @@ static uint16_t eth_ena_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint64_t ol_flags; uint16_t frag_field; - /* ENA needs partial checksum for TSO packets only, skip early */ - if (!tx_ring->adapter->tso4_supported) - return nb_pkts; - for (i = 0; i != nb_pkts; i++) { m = tx_pkts[i]; ol_flags = m->ol_flags; + /* If there was not L2 header length specified, assume it is + * length of the ethernet header. + */ + if (unlikely(m->l2_len == 0)) + m->l2_len = sizeof(struct ether_hdr); + + ip_hdr = rte_pktmbuf_mtod_offset(m, struct ipv4_hdr *, + m->l2_len); + frag_field = rte_be_to_cpu_16(ip_hdr->fragment_offset); + + if ((frag_field & IPV4_HDR_DF_FLAG) != 0) { + m->packet_type |= RTE_PTYPE_L4_NONFRAG; + + /* If IPv4 header has DF flag enabled and TSO support is + * disabled, partial chcecksum should not be calculated. + */ + if (!tx_ring->adapter->tso4_supported) + continue; + } + if ((ol_flags & ENA_TX_OFFLOAD_NOTSUP_MASK) != 0 || (ol_flags & PKT_TX_L4_MASK) == PKT_TX_SCTP_CKSUM) { @@ -1625,12 +1641,6 @@ static uint16_t eth_ena_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, if (!(m->ol_flags & PKT_TX_IPV4)) continue; - ip_hdr = rte_pktmbuf_mtod_offset(m, struct ipv4_hdr *, - m->l2_len); - frag_field = rte_be_to_cpu_16(ip_hdr->fragment_offset); - if (frag_field & IPV4_HDR_DF_FLAG) - continue; - /* In case we are supposed to TSO and have DF not set (DF=0) * hardware must be provided with partial checksum, otherwise * it will take care of necessary calculations. -- 1.8.3.1