Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp1780462imm; Thu, 27 Sep 2018 02:21:07 -0700 (PDT) X-Google-Smtp-Source: ACcGV60hGlwiviCUCJW5xI/vN4vK4AwTRWAjARmX5Cj6rBnpnOUA4Vtc9NaCvUp3WFZhl8defxt8 X-Received: by 2002:a62:411a:: with SMTP id o26-v6mr10478407pfa.111.1538040066972; Thu, 27 Sep 2018 02:21:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538040066; cv=none; d=google.com; s=arc-20160816; b=PA+Rnmq/kVmyY+fJEPgA8nkBnlumf4pVTkG1PdStPXRtW+H3u2vP1hQdy9qp953b5n TlCczRqvSHXSRe9MhdwVfG5IkHT3gKtLOW54XUeuIHoUF3Ik2hvKaWlm1qTz0BOIV2UC 4JElUTZQUYcYbGqLpVTdDwEsb4YZVpcNB8hIbf0VZWWr9TQRl2j6/quPg1kIUe6283IW DTGAa6WfLXu0+AA93mbYftPz1Do7JbL+tjAlzJpuP2cxKhx6jb6C5sMqxyP87xJ3+HPA kcIWvzV6KrB9vZPSWfokJjWtaL5X6uMdt5mbCQb5uMwrt030yb0qdzlbNzRCQnJPQcLW pwVQ== 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; bh=OmcuDjD57WJSFYaYToPp7Tr1X4PTsEfDADibc0Qrsbg=; b=vzh0IwsbVFDd8lBvn0pCn78u2bA40wVt9wxaq7QRdZP7A0JG8+5rNKmrecboQA6fIT zoEnsUsw/fdglYKgC33GXvp8I08cJ8ogwQtic+YyqA2AwesqU6WXgFRAmEoNfiQAv7AS XafTPQ1rskAb4wR8r8BWTYwk678E0h31Q0mRLjXG3nnouKQqTJk3KyIGZGh5IpewJPjs x2Poe+EYipFrRUFD7AWvBxerK9hpmXZ1OPAtMtpMuJzgtTXmIj6HWssC7kBDHyf0jo0E u7DXnsyOnNgYWe6Qf8RGhvX9s6HohNL4uFRJTNIeVi+LsZhDchfTqij2Sy1Iq6dWOB20 DWyg== ARC-Authentication-Results: i=1; mx.google.com; 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 bg10-v6si1436279plb.47.2018.09.27.02.20.52; Thu, 27 Sep 2018 02:21:06 -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; 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 S1729000AbeI0PgN (ORCPT + 99 others); Thu, 27 Sep 2018 11:36:13 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:56172 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727216AbeI0PgN (ORCPT ); Thu, 27 Sep 2018 11:36:13 -0400 Received: from localhost (ip-213-127-77-73.ip.prioritytelecom.net [213.127.77.73]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id B764A1117; Thu, 27 Sep 2018 09:18:54 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Paolo Abeni , "David S. Miller" Subject: [PATCH 4.14 07/64] udp4: fix IP_CMSG_CHECKSUM for connected sockets Date: Thu, 27 Sep 2018 11:03:24 +0200 Message-Id: <20180927090250.745213921@linuxfoundation.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180927090249.801943776@linuxfoundation.org> References: <20180927090249.801943776@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review 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 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ From: Paolo Abeni [ Upstream commit 2b5a921740a55c00223a797d075b9c77c42cb171 ] commit 2abb7cdc0dc8 ("udp: Add support for doing checksum unnecessary conversion") left out the early demux path for connected sockets. As a result IP_CMSG_CHECKSUM gives wrong values for such socket when GRO is not enabled/available. This change addresses the issue by moving the csum conversion to a common helper and using such helper in both the default and the early demux rx path. Fixes: 2abb7cdc0dc8 ("udp: Add support for doing checksum unnecessary conversion") Signed-off-by: Paolo Abeni Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- net/ipv4/udp.c | 49 ++++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 23 deletions(-) --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -2049,6 +2049,28 @@ static inline int udp4_csum_init(struct inet_compute_pseudo); } +/* wrapper for udp_queue_rcv_skb tacking care of csum conversion and + * return code conversion for ip layer consumption + */ +static int udp_unicast_rcv_skb(struct sock *sk, struct sk_buff *skb, + struct udphdr *uh) +{ + int ret; + + if (inet_get_convert_csum(sk) && uh->check && !IS_UDPLITE(sk)) + skb_checksum_try_convert(skb, IPPROTO_UDP, uh->check, + inet_compute_pseudo); + + ret = udp_queue_rcv_skb(sk, skb); + + /* a return value > 0 means to resubmit the input, but + * it wants the return to be -protocol, or 0 + */ + if (ret > 0) + return -ret; + return 0; +} + /* * All we need to do is get the socket, and then do a checksum. */ @@ -2095,14 +2117,9 @@ int __udp4_lib_rcv(struct sk_buff *skb, if (unlikely(sk->sk_rx_dst != dst)) udp_sk_rx_dst_set(sk, dst); - ret = udp_queue_rcv_skb(sk, skb); + ret = udp_unicast_rcv_skb(sk, skb, uh); sock_put(sk); - /* a return value > 0 means to resubmit the input, but - * it wants the return to be -protocol, or 0 - */ - if (ret > 0) - return -ret; - return 0; + return ret; } if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST)) @@ -2110,22 +2127,8 @@ int __udp4_lib_rcv(struct sk_buff *skb, saddr, daddr, udptable, proto); sk = __udp4_lib_lookup_skb(skb, uh->source, uh->dest, udptable); - if (sk) { - int ret; - - if (inet_get_convert_csum(sk) && uh->check && !IS_UDPLITE(sk)) - skb_checksum_try_convert(skb, IPPROTO_UDP, uh->check, - inet_compute_pseudo); - - ret = udp_queue_rcv_skb(sk, skb); - - /* a return value > 0 means to resubmit the input, but - * it wants the return to be -protocol, or 0 - */ - if (ret > 0) - return -ret; - return 0; - } + if (sk) + return udp_unicast_rcv_skb(sk, skb, uh); if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) goto drop;