From patchwork Fri May 4 00:39:17 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander H Duyck X-Patchwork-Id: 908395 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ddt6IFKY"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40cY6y59bvz9s3D for ; Fri, 4 May 2018 10:39:22 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751216AbeEDAjU (ORCPT ); Thu, 3 May 2018 20:39:20 -0400 Received: from mail-it0-f66.google.com ([209.85.214.66]:53641 "EHLO mail-it0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751132AbeEDAjT (ORCPT ); Thu, 3 May 2018 20:39:19 -0400 Received: by mail-it0-f66.google.com with SMTP id f65-v6so1451556itd.3 for ; Thu, 03 May 2018 17:39:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:from:to:date:message-id:in-reply-to:references:user-agent :mime-version:content-transfer-encoding; bh=+WyKFkpzP92jL0AKj55mU9sJa7DfkHMXlJNC0b1dnjY=; b=ddt6IFKYm2QVR4YZF+eU5ux+jjiA66OFt/N6wPvGNOAz0Fh1L2d/iIdcQK4OqUg3Bd lTZI46AKVQXACr2i1OBNpklV5HgIlHidDpbiJq29pkvF7dJU6YwNjhTS16POtweMhKgI aJAT1ag22+Rrv3WK3f7NxXSuPALn4SbOp2/6kxK7cUxqGjDLcsCWuVycjvqNoevxrJWK SHnUcCugnjuZIs5F7iRvYZLeVvQGxM1eT+y8yYgaUhNNYt/QIlCaKvBKlOS3cXzEUnJs OcXjmUre8mZkIAJqEDc57JNKaGHXYLubMi6CgU+t8d7cm+ohpsu4UbGd5kNZkExElRMp 8E6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:date:message-id:in-reply-to :references:user-agent:mime-version:content-transfer-encoding; bh=+WyKFkpzP92jL0AKj55mU9sJa7DfkHMXlJNC0b1dnjY=; b=EPXPzT236pcEv91aMm24DyFftjPQ8UmK1tVmfmoN0XZjjNhjh/Ua2cweSOE0/G/x2e /d/Adj3G7/DTTqdSJY0fGpmupY93slVw2SqQJ66fx5JXLt5AUPGc0aENV9T0m90So5XB NFBYj7IsJCpJUD7E0dt6E44y9qXk8ta8ObPjcHfGQWLNpB9h4bjdzGpfSfUfvROK5kIf xPaVcq8CJnRKfxarPV82fdJH3qn9zYHuqs9CSAcsmI3DvdctSrEM6JogihABJqaEcLsR CBYTnwktb1vNUKEE+sf4O24ebuuz/04SNE6foe77zjIs49/RUhmjnwCBzjhjDRUWT9hS n/EQ== X-Gm-Message-State: ALQs6tA9AvUjMIKcoy94W7yOK7zUabCKc9Yz/7Zg24XqiMlY4B8KFbku Mc/cpQeo4+qV2zBxr6NvATNo5dp5 X-Google-Smtp-Source: AB8JxZroYpS1VJ08E1WzId7USFWuLRCcrIuNtEQfAGfHop9erHpXYvMOyu6qSxLfXdI4LW+CvIBVdA== X-Received: by 2002:a24:4e8d:: with SMTP id r135-v6mr27463836ita.143.1525394358344; Thu, 03 May 2018 17:39:18 -0700 (PDT) Received: from localhost.localdomain (static-50-53-21-37.bvtn.or.frontiernet.net. [50.53.21.37]) by smtp.gmail.com with ESMTPSA id u206-v6sm413940itc.40.2018.05.03.17.39.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 May 2018 17:39:17 -0700 (PDT) Subject: [RFC PATCH 1/2] ixgbe: Add support for UDP segmentation offload From: Alexander Duyck To: netdev@vger.kernel.org, willemb@google.com, intel-wired-lan@lists.osuosl.org Date: Thu, 03 May 2018 17:39:17 -0700 Message-ID: <20180504003916.4769.66271.stgit@localhost.localdomain> In-Reply-To: <20180504003556.4769.11407.stgit@localhost.localdomain> References: <20180504003556.4769.11407.stgit@localhost.localdomain> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Alexander Duyck This patch adds support for UDP segmentation offload. Relatively few changes were needed to add this support as it functions much like the TCP segmentation offload. Signed-off-by: Alexander Duyck --- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index a52d92e182ee..0bed3350a795 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -7693,6 +7693,7 @@ static int ixgbe_tso(struct ixgbe_ring *tx_ring, } ip; union { struct tcphdr *tcp; + struct udphdr *udp; unsigned char *hdr; } l4; u32 paylen, l4_offset; @@ -7716,7 +7717,8 @@ static int ixgbe_tso(struct ixgbe_ring *tx_ring, l4.hdr = skb_checksum_start(skb); /* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */ - type_tucmd = IXGBE_ADVTXD_TUCMD_L4T_TCP; + type_tucmd = (skb->csum_offset == offsetof(struct tcphdr, check)) ? + IXGBE_ADVTXD_TUCMD_L4T_TCP : IXGBE_ADVTXD_TUCMD_L4T_UDP; /* initialize outer IP header fields */ if (ip.v4->version == 4) { @@ -7746,12 +7748,20 @@ static int ixgbe_tso(struct ixgbe_ring *tx_ring, /* determine offset of inner transport header */ l4_offset = l4.hdr - skb->data; - /* compute length of segmentation header */ - *hdr_len = (l4.tcp->doff * 4) + l4_offset; - /* remove payload length from inner checksum */ paylen = skb->len - l4_offset; - csum_replace_by_diff(&l4.tcp->check, (__force __wsum)htonl(paylen)); + + if (type_tucmd & IXGBE_ADVTXD_TUCMD_L4T_TCP) { + /* compute length of segmentation header */ + *hdr_len = (l4.tcp->doff * 4) + l4_offset; + csum_replace_by_diff(&l4.tcp->check, + (__force __wsum)htonl(paylen)); + } else { + /* compute length of segmentation header */ + *hdr_len = sizeof(*l4.udp) + l4_offset; + csum_replace_by_diff(&l4.udp->check, + (__force __wsum)htonl(paylen)); + } /* update gso size and bytecount with header size */ first->gso_segs = skb_shinfo(skb)->gso_segs; @@ -9931,6 +9941,7 @@ static void ixgbe_fwd_del(struct net_device *pdev, void *priv) if (unlikely(mac_hdr_len > IXGBE_MAX_MAC_HDR_LEN)) return features & ~(NETIF_F_HW_CSUM | NETIF_F_SCTP_CRC | + NETIF_F_GSO_UDP_L4 | NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_TSO | NETIF_F_TSO6); @@ -9939,6 +9950,7 @@ static void ixgbe_fwd_del(struct net_device *pdev, void *priv) if (unlikely(network_hdr_len > IXGBE_MAX_NETWORK_HDR_LEN)) return features & ~(NETIF_F_HW_CSUM | NETIF_F_SCTP_CRC | + NETIF_F_GSO_UDP_L4 | NETIF_F_TSO | NETIF_F_TSO6); @@ -10480,7 +10492,7 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent) IXGBE_GSO_PARTIAL_FEATURES; if (hw->mac.type >= ixgbe_mac_82599EB) - netdev->features |= NETIF_F_SCTP_CRC; + netdev->features |= NETIF_F_SCTP_CRC | NETIF_F_GSO_UDP_L4; /* copy netdev features into list of user selectable features */ netdev->hw_features |= netdev->features |