Received: by 2002:a05:7412:e794:b0:fa:551:50a7 with SMTP id o20csp2933281rdd; Sat, 13 Jan 2024 07:46:50 -0800 (PST) X-Google-Smtp-Source: AGHT+IH5ICCmB7UpGl90T7L9txvIWyf8LsI876O+w98KUXg0yznlYT5B3d7YyjltX60noiecfCGR X-Received: by 2002:a05:6e02:20c7:b0:360:a3f4:f0de with SMTP id 7-20020a056e0220c700b00360a3f4f0demr4327457ilq.29.1705160810380; Sat, 13 Jan 2024 07:46:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1705160810; cv=none; d=google.com; s=arc-20160816; b=e53f/V+67iZ/qyXMYxi346sGc7ceG8bScEP2MY/EarNrJFAg8aSWY+l+r+c33rUlBn qG2Cex302ZEB/LnIICMrhFNGYOxB5t4czOOOxtj8UpJC6a0mBY81J2PJlHqASf646VGv tr3I3z0gcI2+GfQMzK8q4MogdG4VBJFPBbK8vAW4qQcd0b8FT+slWmeWf/jUyThhwlDv Y+4shb1hKh+Jwcz/etio0WkxbdN1KrK0iWDycpHdmZQsXnyPDjJZW/6QYPm0gRSniI9j 6Un5Qfp/oEEWMxi7//OfXuVdmkYTTds42FZeyhWjicnivnuQ9pKuvwNx8rTbVa33cgCv 3HBw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=in-reply-to:content-disposition:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:message-id:subject:cc :to:from:date:dkim-signature; bh=sv0Qp7sp1FBb/sEqgGXqAH3T8dxfhTALd3r3nR4bz4M=; fh=dPMErVY7v5RhNk2pYar1YKMeEq80N6yc9p/4//RJSLc=; b=szo3ggmnENeY4jRoETOUh1FICMeF2WeeUtuBK0O/Pxydz7JDmpGXoKKf6VGjHZ5I1d 8MX5bXOFbtQByD7Sq7XCz+MMdk7F8d1CtGaKcCgG86JVCIPAoah3oGFHX8789EUOwPY7 z4r+Wd+DvGv+QQo6zm+7l4ijfbQYiqgPirLFJ85f1TcD8Z55ifjtvYeASVs2+DPqgAUY tkg0nopaM2QvZC0gyIWheRcTY+PA3RkmjgO6esN+gNthUaCJ902ACDoV4l5+k/sbwXxN 24XW4AQYXYAW9awwgOQXHdzmI3nEx8GSytojp+0V9GW929WUS4ScbBG260r33dHMI/hQ sZAg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="nB/qdP6B"; spf=pass (google.com: domain of linux-kernel+bounces-25327-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-25327-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id cm5-20020a056a020a0500b005ced534e1e7si5820879pgb.237.2024.01.13.07.46.49 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Jan 2024 07:46:50 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-25327-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="nB/qdP6B"; spf=pass (google.com: domain of linux-kernel+bounces-25327-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-25327-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id D2528B21E1A for ; Sat, 13 Jan 2024 15:46:46 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 050122586; Sat, 13 Jan 2024 15:46:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nB/qdP6B" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3719B23A3; Sat, 13 Jan 2024 15:46:36 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id F0987C433F1; Sat, 13 Jan 2024 15:46:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1705160796; bh=EwpXUO2qQlx0+NhiF121g0hPSk+y48HTkprp0ywhANc=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=nB/qdP6BYQwTS+d/rR+LT5AYHEGK7Iy9SSMILJtCusm9O4CQ+qaHAtm3VJzcnRMIf 2C6ilutl9SfTMbRvE7gEzi7MpaeMAIYMVbCIhG4jfwukLw6uvAegKMNtNldBtqrPje x4eh0aA1RCtbneTEzoEjzgU16rD1tcw8GG+CHpK2PMVqWKdmyQJKedXe0cHAPNiwTa Kco51N0FkwbuJgUH3AXlMOO5yADhUTR8uV5EV7jjFLyJeQ67I0QmmCFMAdgsjCFuBD lk41c/BurIKLYYI95mHRrp9kVJXr0ZcPylCYTts44HQ8cWxDeCOwf4oFmJQzAeTKrM +8ZXyW2wfS+hA== Date: Sat, 13 Jan 2024 15:46:32 +0000 From: Simon Horman To: Menglong Dong Cc: edumazet@google.com, davem@davemloft.net, dsahern@kernel.org, kuba@kernel.org, pabeni@redhat.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [RFC PATCH net-next v2] net: tcp: accept old ack during closing Message-ID: <20240113154632.GI392144@kernel.org> References: <20240112094603.23706-1-menglong8.dong@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20240112094603.23706-1-menglong8.dong@gmail.com> On Fri, Jan 12, 2024 at 05:46:03PM +0800, Menglong Dong wrote: > For now, the packet with an old ack is not accepted if we are in > FIN_WAIT1 state, which can cause retransmission. Taking the following > case as an example: > > Client Server > | | > FIN_WAIT1(Send FIN, seq=10) FIN_WAIT1(Send FIN, seq=20, ack=10) > | | > | Send ACK(seq=21, ack=11) > Recv ACK(seq=21, ack=11) > | > Recv FIN(seq=20, ack=10) > > In the case above, simultaneous close is happening, and the FIN and ACK > packet that send from the server is out of order. Then, the FIN will be > dropped by the client, as it has an old ack. Then, the server has to > retransmit the FIN, which can cause delay if the server has set the > SO_LINGER on the socket. > > Old ack is accepted in the ESTABLISHED and TIME_WAIT state, and I think > it should be better to keep the same logic. > > In this commit, we accept old ack in FIN_WAIT1/FIN_WAIT2/CLOSING/LAST_ACK > states. Maybe we should limit it to FIN_WAIT1 for now? > > Signed-off-by: Menglong Dong > --- > v2: > - fix the compiling error > --- > net/ipv4/tcp_input.c | 18 +++++++++++------- > 1 file changed, 11 insertions(+), 7 deletions(-) > > diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c > index df7b13f0e5e0..70642bb08f3a 100644 > --- a/net/ipv4/tcp_input.c > +++ b/net/ipv4/tcp_input.c > @@ -6699,17 +6699,21 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) > return 0; > > /* step 5: check the ACK field */ > - acceptable = tcp_ack(sk, skb, FLAG_SLOWPATH | > - FLAG_UPDATE_TS_RECENT | > - FLAG_NO_CHALLENGE_ACK) > 0; > + reason = tcp_ack(sk, skb, FLAG_SLOWPATH | > + FLAG_UPDATE_TS_RECENT | > + FLAG_NO_CHALLENGE_ACK); Hi Menglong Dong, Probably I am missing something terribly obvious, but I am confused about the types used here. The type of reason is enum skb_drop_reason. For which, which on my system, the compiler uses an unsigned entity. i.e. it is an unsigned integer. But tcp_ack returns a (signed) int. And below reason is checked for values less than zero, and negated. This doesn't seem right. > > - if (!acceptable) { > + if (reason <= 0) { > if (sk->sk_state == TCP_SYN_RECV) > return 1; /* send one RST */ > - tcp_send_challenge_ack(sk); > - SKB_DR_SET(reason, TCP_OLD_ACK); > - goto discard; > + /* accept old ack during closing */ > + if (reason < 0) { > + tcp_send_challenge_ack(sk); > + reason = -reason; > + goto discard; > + } > } > + SKB_DR_SET(reason, NOT_SPECIFIED); > switch (sk->sk_state) { > case TCP_SYN_RECV: > tp->delivered++; /* SYN-ACK delivery isn't tracked in tcp_ack */ > -- > 2.39.2 >