From patchwork Mon Nov 24 23:52:28 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 414178 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 97CEC140145 for ; Tue, 25 Nov 2014 10:53:06 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751481AbaKXXxA (ORCPT ); Mon, 24 Nov 2014 18:53:00 -0500 Received: from mail-ie0-f171.google.com ([209.85.223.171]:60579 "EHLO mail-ie0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751305AbaKXXw7 (ORCPT ); Mon, 24 Nov 2014 18:52:59 -0500 Received: by mail-ie0-f171.google.com with SMTP id rl12so9968802iec.30 for ; Mon, 24 Nov 2014 15:52:59 -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=XjZWNB+Coypdv+qjd2QajnciOMn90Wg3+uYJojeSs0tN+Peu1EtCFs63sRWCDi5zqZ 1nzSpoRi65NAlAEpa0pk60cL7et9Wuwv0uNTFatFh4xXquSp18tMGTVTOKgeTFzkl+w3 819Fd7tnNrNvh5d8HoPc1ehcZIFusZfvXlX9glJXczLYQuwuidoHRaCupat1+qgbJPsc nXDVMkprAwA7V1SSZN9AZYyOl9FkEL+aEx18Ey/EUp+SnrSyCR9WVfqoewwgJKfYIPs2 fiVZEq4+aTUHTAeUaUntTzVVx+V6mbO+aL2+0Q+YHo8WFw5yp7ICtuVV/GDaXkwJSEoe 0TFw== 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=ZOv9P6QVnNUAkRMEyMqrH0zTru2uNJ7PTQV8sgwiysKO1jjmmYudTgyLUYGDpsNjbJ 3QdlLEDI3mZ2gnn9Hu6uTflq3ubDRvu8KISNvmSCCDy53Jq2pbpCd8eRvxQasVpZKU9g VzXfX+MpNbF1Ap/2okV5PJurl4tZuSv/k6BnH6K9Ejpl0zOowMD1BCom/MRogpwd1k3c /SVp2vStMCc+XflDvBMds94pXa+pvVNIcYK6398HsAE1ZEecPjnuEwH7x0Kz/pUyS8gY d3RaskBvXEzQwKCfFRGNieeonN5zoh41Fb8zwYqTGf5dx+lEQ+rnYOrUBXedkUkG6mDs 5NXA== X-Gm-Message-State: ALoCoQmjmCWBt9zI2d4UOGFXOyze8doYof7e2JDIx/RNY1JCYRiFHHqsAnYSiDPNsYyD2rlWIrl+ X-Received: by 10.50.114.199 with SMTP id ji7mr14264064igb.49.1416873179255; Mon, 24 Nov 2014 15:52:59 -0800 (PST) Received: from tomh.mtv.corp.google.com ([172.18.117.126]) by mx.google.com with ESMTPSA id d7sm8285311iod.34.2014.11.24.15.52.58 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 24 Nov 2014 15:52:58 -0800 (PST) From: Tom Herbert To: davem@davemloft.net, netdev@vger.kernel.org Subject: [PATCH net-next 1/3] net: Add remcsum_adjust as common function for remote checksum offload Date: Mon, 24 Nov 2014 15:52:28 -0800 Message-Id: <1416873150-12260-2-git-send-email-therbert@google.com> X-Mailer: git-send-email 2.1.0.rc2.206.gedb03e5 In-Reply-To: <1416873150-12260-1-git-send-email-therbert@google.com> References: <1416873150-12260-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