From patchwork Tue Nov 25 19:21:19 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 414833 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 8689D140140 for ; Wed, 26 Nov 2014 06:21:54 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751506AbaKYTVu (ORCPT ); Tue, 25 Nov 2014 14:21:50 -0500 Received: from mail-ie0-f182.google.com ([209.85.223.182]:54712 "EHLO mail-ie0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751160AbaKYTVt (ORCPT ); Tue, 25 Nov 2014 14:21:49 -0500 Received: by mail-ie0-f182.google.com with SMTP id x19so1193625ier.41 for ; Tue, 25 Nov 2014 11:21:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:subject:date:message-id:in-reply-to:references; bh=z9nHrvNIgEBqDcduD/gNBncjFR5amN1ViRUBL0ENMEw=; b=X+x4bJsUpP10u4lD76Q8VhhsIW6h026v/uaGA3h0gcsL3ENnwSLEznBV/Bu4aYE4kz QIKwPsfGjM8VdoxBrV3cmtzEjaS0NPt/oMCKpw3ndLvhe7I9HkXbj5t4AronvxY2CG39 PKDXYBLiq6WegLd0jGpV+3yMwjYXsecBRFeYTpvHiLIn1AwB4ww4J5XXnbh1S4ynbEHH wAWbUI4/madG0V5W4uDUmQ9I4TLFbNLthWB11moc/GXVPGEgqXuH7UZucJwrAqL2llJv gUkQ57U0rOeIvXDO6xG98RdaVQUtL4ALhWKj0nE0KwjdzLMqGtMSQahnAuI/9AKMVnig Qnww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=z9nHrvNIgEBqDcduD/gNBncjFR5amN1ViRUBL0ENMEw=; b=LGdSbYhqn3uqT73OyO3c9QMQxHBKV2JI4xyAkiZ+2Bri0J6oyCmB2d7Z55UA0D0ijB BXavbnMOsgwZgV+gBu7EqwRyKnJTXTsHRMpzvJtKdgIriJgWkXxd77oXeWctTgaBWs7f uAzed6IQ+hY/c4jTYMv/uN8gVQSVYYWQd0W2lk5vaAtmghpTAX7McLqtzV7yLHKyCD+8 2Y+3j33+i/c6Jf5PixQ6YOnflhvS+t7t10b2cEBRKakqtHed1sBWFE7XVXi3suyYzuWA x3P2Y1+8dyjvUFDgUoJtIdkJDGvFYPKO4sn1ASMyK5QgwlBOpLMbyjKJS6V/aoc4g1ij A5cQ== X-Gm-Message-State: ALoCoQkot2L1ZUOaKgZNv5Bri/qmwmlohGp+G40RloD7XDIETbaZ+UtPmKSedpqH3nZS2zZsH46x X-Received: by 10.43.75.138 with SMTP id za10mr27064413icb.23.1416943309141; Tue, 25 Nov 2014 11:21:49 -0800 (PST) Received: from tomh.mtv.corp.google.com ([172.18.117.126]) by mx.google.com with ESMTPSA id r12sm980058ioe.43.2014.11.25.11.21.48 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 25 Nov 2014 11:21:48 -0800 (PST) From: Tom Herbert To: davem@davemloft.net, netdev@vger.kernel.org Subject: [PATCH net-next 1/2] net: Add remcsum_adjust as common function for remote checksum offload Date: Tue, 25 Nov 2014 11:21:19 -0800 Message-Id: <1416943280-28473-2-git-send-email-therbert@google.com> X-Mailer: git-send-email 2.1.0.rc2.206.gedb03e5 In-Reply-To: <1416943280-28473-1-git-send-email-therbert@google.com> References: <1416943280-28473-1-git-send-email-therbert@google.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This function does the work to update a checksum field as part of remote checksum offload. remcsum_adjust does the following: 1) Subtract out the calculated checksum from the beginning of the packet (ptr arg) to the start offset. 2) Adjust the checksum field indicated by offset based on the modified checksum value from above step. 3) Return the difference in the old checksum field value and the new one. The caller will use this to update skb->csum and NAPI csum. Signed-off-by: Tom Herbert --- include/net/checksum.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/include/net/checksum.h b/include/net/checksum.h index 6465bae..e339a95 100644 --- a/include/net/checksum.h +++ b/include/net/checksum.h @@ -151,4 +151,20 @@ static inline void inet_proto_csum_replace2(__sum16 *sum, struct sk_buff *skb, (__force __be32)to, pseudohdr); } +static inline __wsum remcsum_adjust(void *ptr, __wsum csum, + int start, int offset) +{ + __sum16 *psum = (__sum16 *)(ptr + offset); + __wsum delta; + + /* Subtract out checksum up to start */ + csum = csum_sub(csum, csum_partial(ptr, start, 0)); + + /* Set derived checksum in packet */ + delta = csum_sub(csum_fold(csum), *psum); + *psum = csum_fold(csum); + + return delta; +} + #endif