Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp3087115ybt; Mon, 29 Jun 2020 15:01:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwKtnAA2wfM40uQBmfq2nepOeq+USLBFpd+cl9gBe28jIiqTmM6uV3imLHr0R9s4yUlwWEA X-Received: by 2002:aa7:c3d8:: with SMTP id l24mr13319040edr.97.1593468118402; Mon, 29 Jun 2020 15:01:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593468118; cv=none; d=google.com; s=arc-20160816; b=RI4v+4MBYcf1B1D98e+jVHi+du7Qrt+hQRbADn9hBzbWEHZsOWbp7IRqAkMUaCUlSG jRt74q7hWDITW0oTgtR/0QjJN9D+K74RBFI1ECXpnquZheQBySHSPex5mj/9BwmxtVJf 7w5zLb2/f1690PmGu2Hf+T57T6OMpD4LvHxRa2+cyydY5+aeOXPGbRnMGHy7TzuvUQjp Q/2Bw3Sef1xCuZ/Dt9PFuLkvG4bhrYTBt4K+Zz5+D/HVpXMpJGhIDQGMIvS8z7wNdLh6 UgUUEDozPDPZ18UybvBcjgfIlvCPm0SYUETzmJseXNm8cBzlt0Q2G6lLRozJzEDhJfW4 OVyw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=q8V0qWaGWbZ//P26tq74taJZgceUcPcX1D1/ObiADFk=; b=UNmq+OxvimNoAwfiWJThAueri9XVNYeR3FHwoD/FDj1O6ZZftyIFGqfjxl//5DAs38 YRV1d3sfgd35feEqMXaU94N0eHaco/56mqHDHWRgH6t5yCZOFU8DO9ZyX6HhTzZRmYPZ 0/U5aqCbt9JqkJMDUyt6tP0xya9hzDw26QlXClnYaGOnvgjnMbV48sOGy9FtT9Vgre+r ZSzLjI/mO0caosVeyuKX6OSTtPhOUo/vfQRPc9ueg+7BeR4cQqDHoLK0YPdgCcVUrGjy 9Tn9lB3FHWLf9/6/aLUBfWdAlvz6PaOzVUZ3EoOHqeM2t0MJ61NAtSyM3s4T9/Bbd9Y6 yZwg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=guJVhnIl; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id nk6si538856ejb.171.2020.06.29.15.01.35; Mon, 29 Jun 2020 15:01:58 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=guJVhnIl; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391743AbgF2WAX (ORCPT + 99 others); Mon, 29 Jun 2020 18:00:23 -0400 Received: from mail.kernel.org ([198.145.29.99]:56762 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726356AbgF2SfY (ORCPT ); Mon, 29 Jun 2020 14:35:24 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id D2C872404F; Mon, 29 Jun 2020 15:18:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1593443921; bh=5jJ5tsc2fYzVzsrCetlSI32efB4LRDq2ryQWZ5SkKLc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=guJVhnIlOFpZZT6xzFwpFxjzVdx7ZkfZ4syPumOcy95dbgIfHv3HGUsBfcMuIxUsN fyM/7GWf1sYtXWXuoeO5TYuZrKKlpVPzo88Rd2GXGPC3ebkiNkZfoFo5JzlehLgsar vZ6TYdGOiug5pOsWZRX1oz2WJhorch6KP7g2UB40= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Denis Kirjanov , Denis Kirjanov , Neal Cardwell , Eric Dumazet , "David S . Miller" , Greg Kroah-Hartman Subject: [PATCH 5.7 022/265] tcp: don't ignore ECN CWR on pure ACK Date: Mon, 29 Jun 2020 11:14:15 -0400 Message-Id: <20200629151818.2493727-23-sashal@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200629151818.2493727-1-sashal@kernel.org> References: <20200629151818.2493727-1-sashal@kernel.org> MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.7.7-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.7.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.7.7-rc1 X-KernelTest-Deadline: 2020-07-01T15:14+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Denis Kirjanov [ Upstream commit 2570284060b48f3f79d8f1a2698792f36c385e9a ] there is a problem with the CWR flag set in an incoming ACK segment and it leads to the situation when the ECE flag is latched forever the following packetdrill script shows what happens: // Stack receives incoming segments with CE set +0.1 <[ect0] . 11001:12001(1000) ack 1001 win 65535 +0.0 <[ce] . 12001:13001(1000) ack 1001 win 65535 +0.0 <[ect0] P. 13001:14001(1000) ack 1001 win 65535 // Stack repsonds with ECN ECHO +0.0 >[noecn] . 1001:1001(0) ack 12001 +0.0 >[noecn] E. 1001:1001(0) ack 13001 +0.0 >[noecn] E. 1001:1001(0) ack 14001 // Write a packet +0.1 write(3, ..., 1000) = 1000 +0.0 >[ect0] PE. 1001:2001(1000) ack 14001 // Pure ACK received +0.01 <[noecn] W. 14001:14001(0) ack 2001 win 65535 // Since CWR was sent, this packet should NOT have ECE set +0.1 write(3, ..., 1000) = 1000 +0.0 >[ect0] P. 2001:3001(1000) ack 14001 // but Linux will still keep ECE latched here, with packetdrill // flagging a missing ECE flag, expecting // >[ect0] PE. 2001:3001(1000) ack 14001 // in the script In the situation above we will continue to send ECN ECHO packets and trigger the peer to reduce the congestion window. To avoid that we can check CWR on pure ACKs received. v3: - Add a sequence check to avoid sending an ACK to an ACK v2: - Adjusted the comment - move CWR check before checking for unacknowledged packets Signed-off-by: Denis Kirjanov Acked-by: Neal Cardwell Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- net/ipv4/tcp_input.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 29c6fc8c77168..ccab8bc29e2b1 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -261,7 +261,8 @@ static void tcp_ecn_accept_cwr(struct sock *sk, const struct sk_buff *skb) * cwnd may be very low (even just 1 packet), so we should ACK * immediately. */ - inet_csk(sk)->icsk_ack.pending |= ICSK_ACK_NOW; + if (TCP_SKB_CB(skb)->seq != TCP_SKB_CB(skb)->end_seq) + inet_csk(sk)->icsk_ack.pending |= ICSK_ACK_NOW; } } @@ -3683,6 +3684,15 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) tcp_in_ack_event(sk, ack_ev_flags); } + /* This is a deviation from RFC3168 since it states that: + * "When the TCP data sender is ready to set the CWR bit after reducing + * the congestion window, it SHOULD set the CWR bit only on the first + * new data packet that it transmits." + * We accept CWR on pure ACKs to be more robust + * with widely-deployed TCP implementations that do this. + */ + tcp_ecn_accept_cwr(sk, skb); + /* We passed data and got it acked, remove any soft error * log. Something worked... */ @@ -4780,8 +4790,6 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) skb_dst_drop(skb); __skb_pull(skb, tcp_hdr(skb)->doff * 4); - tcp_ecn_accept_cwr(sk, skb); - tp->rx_opt.dsack = 0; /* Queue data for delivery to the user. -- 2.25.1