Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp418987ybi; Fri, 26 Jul 2019 12:01:16 -0700 (PDT) X-Google-Smtp-Source: APXvYqwlDf9xdbhIWve4+W3aP9NLR8t6Lh6zo53EwMMs/LxzqT/WIHKqhxj2sw1RXGDRzOacubkL X-Received: by 2002:a62:3543:: with SMTP id c64mr23256241pfa.242.1564167676575; Fri, 26 Jul 2019 12:01:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1564167676; cv=none; d=google.com; s=arc-20160816; b=yPG4gb9pGl9PppTIlCol5o4eDGimYfybyfisXC9N0yCyWuOvtIl64X3w8Hqj7L/05K kxrK8HFmct8q+ghmPqNPxiVeBsjDVwWqYwVQMUDKSvoZLZ0Lq1EjexPo4Eau/a5UWGvZ oR02nCDOASVejYlXYcMKoiS+T4ayYFxKG/bZKM++sAJd0PbAaR+x2OHz4SbjMUbdiFMh 57h9ty7+hVhw4/2JKBRxVa8SPY/8ZIG1F0TqEQX2U6xBQ1sp+hJdRk4m7qdYdmZmFvsk 40U2UK4FOTm0XTi+bOWgk7BXXTkcaPvoEQVl/RYXr41gkbSFUJszRXFYMGMh2enMqOMr AvaQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=jaFX/TU8QeUQHqIdcFuhrc8rRjSovkAHrJdGCK7oJ7U=; b=077keJAiCkORTM+cfHVCk02JlgXEmkNBTjwxITi6dArYWs6koOnMWyGVSV9JHafe7j 1PAA3L4Y1sqjVhDigOrkQv/9IELV5UX2La3cGhqjegXmxBMR7J+XZzXRqjBDkSZeR7gx weliw+wzU6UeyU4IIhudyNHuVgbW6lqc4Lvflz4V9BAVmcpXW2IA0/JCsO/NJTPL8D1v EoF8I1kQJo6Bo5v/Q+HIAVbsHLx4KQmQC3o5wCVmBRmDNLI0IBbcS2aX0/Z5EZrbK7qI aQmvQFFJaeMGy1uJjtpb6NruCE2WHaRkm5KprazfO1OVkZpR01KRk4vAAixydBK38Qfp Unvw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Dj6Nbf6K; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i22si21937194pju.59.2019.07.26.12.01.01; Fri, 26 Jul 2019 12:01:16 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Dj6Nbf6K; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389005AbfGZPcM (ORCPT + 99 others); Fri, 26 Jul 2019 11:32:12 -0400 Received: from mail.kernel.org ([198.145.29.99]:47240 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389398AbfGZPcI (ORCPT ); Fri, 26 Jul 2019 11:32:08 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 8871722BF5; Fri, 26 Jul 2019 15:32:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1564155127; bh=p2jxfemamL9OThkkkhp5Ka0e+Tn3mOYTKn4IIiywrSo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Dj6Nbf6K/cYY9G7JVoLVYXmllR6Xtqx3qfz8iGVay0BNHJim0SzuZ8O2Tsflg5Nui k8jCdjNzj3w9/cQOr5k0jBQdp2nqdjYSKXxojFAJF1FzyZnWHCmUz3uwUEFq7OamkJ Jnx1qf9fiZZ8xva9KeKgdzxYxdcqn2AswlLNsMiM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, John Hurley , Jakub Kicinski , Simon Horman , Pravin B Shelar , "David S. Miller" Subject: [PATCH 4.19 12/50] net: openvswitch: fix csum updates for MPLS actions Date: Fri, 26 Jul 2019 17:24:47 +0200 Message-Id: <20190726152301.842133310@linuxfoundation.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190726152300.760439618@linuxfoundation.org> References: <20190726152300.760439618@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: John Hurley [ Upstream commit 0e3183cd2a64843a95b62f8bd4a83605a4cf0615 ] Skbs may have their checksum value populated by HW. If this is a checksum calculated over the entire packet then the CHECKSUM_COMPLETE field is marked. Changes to the data pointer on the skb throughout the network stack still try to maintain this complete csum value if it is required through functions such as skb_postpush_rcsum. The MPLS actions in Open vSwitch modify a CHECKSUM_COMPLETE value when changes are made to packet data without a push or a pull. This occurs when the ethertype of the MAC header is changed or when MPLS lse fields are modified. The modification is carried out using the csum_partial function to get the csum of a buffer and add it into the larger checksum. The buffer is an inversion of the data to be removed followed by the new data. Because the csum is calculated over 16 bits and these values align with 16 bits, the effect is the removal of the old value from the CHECKSUM_COMPLETE and addition of the new value. However, the csum fed into the function and the outcome of the calculation are also inverted. This would only make sense if it was the new value rather than the old that was inverted in the input buffer. Fix the issue by removing the bit inverts in the csum_partial calculation. The bug was verified and the fix tested by comparing the folded value of the updated CHECKSUM_COMPLETE value with the folded value of a full software checksum calculation (reset skb->csum to 0 and run skb_checksum_complete(skb)). Prior to the fix the outcomes differed but after they produce the same result. Fixes: 25cd9ba0abc0 ("openvswitch: Add basic MPLS support to kernel") Fixes: bc7cc5999fd3 ("openvswitch: update checksum in {push,pop}_mpls") Signed-off-by: John Hurley Reviewed-by: Jakub Kicinski Reviewed-by: Simon Horman Acked-by: Pravin B Shelar Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- net/openvswitch/actions.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) --- a/net/openvswitch/actions.c +++ b/net/openvswitch/actions.c @@ -175,8 +175,7 @@ static void update_ethertype(struct sk_b if (skb->ip_summed == CHECKSUM_COMPLETE) { __be16 diff[] = { ~(hdr->h_proto), ethertype }; - skb->csum = ~csum_partial((char *)diff, sizeof(diff), - ~skb->csum); + skb->csum = csum_partial((char *)diff, sizeof(diff), skb->csum); } hdr->h_proto = ethertype; @@ -268,8 +267,7 @@ static int set_mpls(struct sk_buff *skb, if (skb->ip_summed == CHECKSUM_COMPLETE) { __be32 diff[] = { ~(stack->label_stack_entry), lse }; - skb->csum = ~csum_partial((char *)diff, sizeof(diff), - ~skb->csum); + skb->csum = csum_partial((char *)diff, sizeof(diff), skb->csum); } stack->label_stack_entry = lse;