From patchwork Fri Sep 15 22:04:49 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anand Kumar X-Patchwork-Id: 814412 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xv8b50Dvzz9ryT for ; Sat, 16 Sep 2017 08:05:04 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 42706B6E; Fri, 15 Sep 2017 22:05:01 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 8DB9FB66 for ; Fri, 15 Sep 2017 22:04:59 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from EX13-EDG-OU-002.vmware.com (ex13-edg-ou-002.vmware.com [208.91.0.190]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id E652C442 for ; Fri, 15 Sep 2017 22:04:58 +0000 (UTC) Received: from sc9-mailhost3.vmware.com (10.113.161.73) by EX13-EDG-OU-002.vmware.com (10.113.208.156) with Microsoft SMTP Server id 15.0.1156.6; Fri, 15 Sep 2017 15:04:46 -0700 Received: from localhost.localdomain (htb-1s-eng-dhcp106.eng.vmware.com [10.33.78.106]) by sc9-mailhost3.vmware.com (Postfix) with ESMTP id 0CA9840517; Fri, 15 Sep 2017 15:04:58 -0700 (PDT) From: Anand Kumar To: Date: Fri, 15 Sep 2017 15:04:49 -0700 Message-ID: <20170915220449.2648-1-kumaranand@vmware.com> X-Mailer: git-send-email 2.9.3.windows.1 MIME-Version: 1.0 Received-SPF: None (EX13-EDG-OU-002.vmware.com: kumaranand@vmware.com does not designate permitted sender hosts) X-Spam-Status: No, score=-2.3 required=5.0 tests=RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD autolearn=disabled version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH] datapath-windows: Remove the workaround in NAT for TCP checksum X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org When checksum offload is enabled, compute checksum using the TCP pseudo header. Signed-off-by: Anand Kumar Acked-by: Alin Gabriel Serdean --- datapath-windows/ovsext/Actions.c | 60 +++++++-------------------------------- 1 file changed, 11 insertions(+), 49 deletions(-) diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c index 41d1c7b..0af4a66 100644 --- a/datapath-windows/ovsext/Actions.c +++ b/datapath-windows/ovsext/Actions.c @@ -1528,6 +1528,11 @@ OvsUpdateAddressAndPort(OvsForwardingContext *ovsFwdCtx, ((BOOLEAN)csumInfo.Receive.UdpChecksumSucceeded || (BOOLEAN)csumInfo.Receive.UdpChecksumFailed); } + if (l4Offload) { + *checkField = IPPseudoChecksum(&newAddr, &ipHdr->daddr, + tcpHdr ? IPPROTO_TCP : IPPROTO_UDP, + ntohs(ipHdr->tot_len) - ipHdr->ihl * 4); + } } else { addrField = &ipHdr->daddr; if (tcpHdr) { @@ -1538,19 +1543,13 @@ OvsUpdateAddressAndPort(OvsForwardingContext *ovsFwdCtx, checkField = &udpHdr->check; } } + if (*addrField != newAddr) { UINT32 oldAddr = *addrField; - if (checkField && *checkField != 0) { - if (l4Offload) { - /* Recompute IP pseudo checksum */ - *checkField = ~(*checkField); - *checkField = ChecksumUpdate32(*checkField, oldAddr, - newAddr); - *checkField = ~(*checkField); - } else { - *checkField = ChecksumUpdate32(*checkField, oldAddr, - newAddr); - } + if (checkField && *checkField != 0 && !l4Offload) { + /* Recompute total checksum. */ + *checkField = ChecksumUpdate32(*checkField, oldAddr, + newAddr); } if (ipHdr->check != 0) { ipHdr->check = ChecksumUpdate32(ipHdr->check, oldAddr, @@ -1561,49 +1560,12 @@ OvsUpdateAddressAndPort(OvsForwardingContext *ovsFwdCtx, if (portField && *portField != newPort) { if (checkField && !l4Offload) { + /* Recompute total checksum. */ *checkField = ChecksumUpdate16(*checkField, *portField, newPort); } *portField = newPort; } - PNET_BUFFER_LIST curNbl = ovsFwdCtx->curNbl; - PNET_BUFFER_LIST newNbl = NULL; - if (layers->isTcp) { - UINT32 mss = OVSGetTcpMSS(curNbl); - if (mss) { - OVS_LOG_TRACE("l4Offset %d", layers->l4Offset); - newNbl = OvsTcpSegmentNBL(ovsFwdCtx->switchContext, curNbl, layers, - mss, 0, FALSE); - if (newNbl == NULL) { - OVS_LOG_ERROR("Unable to segment NBL"); - return NDIS_STATUS_FAILURE; - } - /* Clear out LSO flags after this point */ - NET_BUFFER_LIST_INFO(newNbl, TcpLargeSendNetBufferListInfo) = 0; - } - } - /* If we didn't split the packet above, make a copy now */ - if (newNbl == NULL) { - csumInfo.Value = NET_BUFFER_LIST_INFO(curNbl, - TcpIpChecksumNetBufferListInfo); - OvsApplySWChecksumOnNB(layers, curNbl, &csumInfo); - } - - if (newNbl) { - curNbl = newNbl; - OvsCompleteNBLForwardingCtx(ovsFwdCtx, - L"Complete after cloning NBL for encapsulation"); - OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, - newNbl, ovsFwdCtx->srcVportNo, 0, - NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), - ovsFwdCtx->completionList, - &ovsFwdCtx->layers, FALSE); - ovsFwdCtx->curNbl = newNbl; - } - - NET_BUFFER_LIST_INFO(curNbl, - TcpIpChecksumNetBufferListInfo) = 0; - return NDIS_STATUS_SUCCESS; }