From patchwork Mon Apr 10 14:28:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcin Wojtas X-Patchwork-Id: 23429 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id BA42658EC; Mon, 10 Apr 2017 16:20:22 +0200 (CEST) Received: from mail-lf0-f48.google.com (mail-lf0-f48.google.com [209.85.215.48]) by dpdk.org (Postfix) with ESMTP id 28F185598 for ; Mon, 10 Apr 2017 16:20:17 +0200 (CEST) Received: by mail-lf0-f48.google.com with SMTP id h125so71503860lfe.0 for ; Mon, 10 Apr 2017 07:20:17 -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=5QLpry5FHfE3R9Lc59q/i+dNJ8roa0e5KhLbVKY9mK0=; b=TTKHOy8lkCD/w3VF5PKWyVJbk+F1j/1I09L/bbGtfp0Nhhg7p9JDF6D4HLxjX2evK+ B/aqQWLvS+Id0X8xhDj8vFIVA/Zj6ef9qyNcpV2sS45TlWwcI2u5842ZLgC6lrtbojxV orH/G7WXmsxtDFshVuQ6w818Vb9Ir2rto7xQD8qX7hReHNUeZyOymqNmlAD09of7k0/J QrSaQx/UjFy0JQT+99WIuvTxTKN5WGvP5CT4m8J2w7QmTolWI4mKYtKIYmj9rK1K5XtI 5ltkQH3RmZdITzKD3fl2ZeKMCAGEPYuiIGRHXVp4ZL/3a3Y7XprAyPn2rV6KxfDMD1sy 3ahw== 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=5QLpry5FHfE3R9Lc59q/i+dNJ8roa0e5KhLbVKY9mK0=; b=OKO9DdNb3uBbkFFJlIXXrX9wK16FKcDwwDMeZeqEFb+OFuQRHLDnmaqRY2LV23+p4Z nP6OoVr4FhiivD6lyYVHziPlx7z+550uM/1THni5565YgASar1u1PN7r4QNB0lnMmpD6 M1pxo7c4WnvEKz84AtZvivv7N7PhFciDYANbcdn+75bETubtAt2zaXprm4e3y0aQK2Nh +iw/oQSuAArwBUrpCiqmvyes94OJF5hIfuTMBbJafOIyEitOjxaY0hmjeXFzZiA7AB9k 4BpYQtzeORM7HVchyfOns02iMSFGLdt3aExb+zYH2PkXMfQbqeHOjREidY+78vBsLhYy SpsA== X-Gm-Message-State: AFeK/H259gA9O5K7UIhsoXwB79nZQhLogoNbTs+MpLkRO8w+xuUFAuHrjaYliePkV6RJSA== X-Received: by 10.25.37.15 with SMTP id l15mr18455161lfl.90.1491834016781; Mon, 10 Apr 2017 07:20:16 -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 n82sm2918528lje.12.2017.04.10.07.20.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 10 Apr 2017 07:20:16 -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, igorch@amazon.com, mw@semihalf.com, mk@semihalf.com Date: Mon, 10 Apr 2017 16:28:11 +0200 Message-Id: <1491834491-13944-5-git-send-email-mw@semihalf.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1491834491-13944-1-git-send-email-mw@semihalf.com> References: <1491834491-13944-1-git-send-email-mw@semihalf.com> Subject: [dpdk-dev] [PATCH v2 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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. First of all, we must make sure that we are dealing with IPV4 packet. If not, we will just skip further checking of this packet and move to the next one. 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 | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c index e6e889b..3ba9901 100644 --- a/drivers/net/ena/ena_ethdev.c +++ b/drivers/net/ena/ena_ethdev.c @@ -1599,14 +1599,33 @@ 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 (!(ol_flags & PKT_TX_IPV4)) + continue; + + /* 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) { @@ -1622,15 +1641,6 @@ static uint16_t eth_ena_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, } #endif - 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.