Received: by 2002:a05:6a10:c7c6:0:0:0:0 with SMTP id h6csp1658118pxy; Mon, 2 Aug 2021 07:14:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx1AVWdmMAEAtc6MkrMOUHHge95w5/Cb5PeFYulcVb+XrSAZMC0pRumH4bFFx6GswQxbStB X-Received: by 2002:a05:6402:796:: with SMTP id d22mr19811150edy.57.1627913661721; Mon, 02 Aug 2021 07:14:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627913661; cv=none; d=google.com; s=arc-20160816; b=NOcqwvg4EvaBfVoAmM+uYouTtgNoBC53guPHZkZ34G2OSD+O02jjDQ4/9By3KcVJWS QVK6oPs0RGrZS9bPHLSVz6hzxsUJa4VwAqedXvvFYzbcGkHaxEQvpFfRNT4FDnff9xQr E+ChFpOWtsQSLV36gVkVN8dv7kjdt6P3cHiK57ogySuOhoJ9LcgNVqJh2E0A/UASlKPT vmfpFXxbZXcffYzErwRuKW/YTmM1QKlhrHkiybYuXzbboABoK639Tzh5yrCEQt6gcaWh HA/9Fzo6Vlh8NOxV07qiVAKBJw8o/QW2GvdV4HyqzwYwBCRvReEtpCIFyxiU+lHYpioc xfgA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ViI7rQS0RvMWpqiE0jN0/fD6K8RPeJePDy2tJ/0SGS4=; b=sL+SUFndA50TfYavOnrlUSFeR+2Kynjtk0XPX6twRlg1KctIx2EmfsuoscW5KlsJ1V U2PqPltIEfyMP8kEUGhSBtxk+OYVxxF2BaAdAMJ3bbukdLfF4O1nDZIGgCpzXUZ5btZu XPyxoTxB6kULGgKIKkCzSu1/7WQ6tCWq0TMlqKzARlssMBU78TZQI+BXr9bMxByrxK1+ hWdZf1MyYnJsHNXouSw02hPulY77SZoHoFj1rOx/tEDLdda2n7UK7EDkvPFXiBl/hZ9Y fPfejUxo0IYp3pOEj24ZM6oT76zx/7HbS2Lo0hiqp+bTew5NQjHyL6emYvWViD8kxjDS lXqg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=wx1o14Xt; 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=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l33si13090424ede.457.2021.08.02.07.13.58; Mon, 02 Aug 2021 07:14:21 -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=@linuxfoundation.org header.s=korg header.b=wx1o14Xt; 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=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237380AbhHBOJW (ORCPT + 99 others); Mon, 2 Aug 2021 10:09:22 -0400 Received: from mail.kernel.org ([198.145.29.99]:44056 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236907AbhHBOAE (ORCPT ); Mon, 2 Aug 2021 10:00:04 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id D0D4F611C0; Mon, 2 Aug 2021 13:56:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1627912566; bh=JVRvvpINC5kk+0QNBhD3y5xoeFxtrVrWwGd2uzlosz0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=wx1o14XtRs3GJIJx+RKj1COad66xcxvnp2C8GvaPeWWHUkXqJYOm8ioNgJ8j+NLFq b3zlj1JEJyFurPo6/d/jfJ+51/N7l45fX1+Av81z4bit0bJy70oWEesV2JXUEIyG4F 0MGaZxJPE0pp0T0qvVCO0oBU3riqgEn0sFfdYfCo= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Xin Long , Jon Maloy , "David S. Miller" , Sasha Levin Subject: [PATCH 5.13 049/104] tipc: fix implicit-connect for SYN+ Date: Mon, 2 Aug 2021 15:44:46 +0200 Message-Id: <20210802134345.646497104@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210802134344.028226640@linuxfoundation.org> References: <20210802134344.028226640@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Xin Long [ Upstream commit f8dd60de194817c86bf812700980762bb5a8d9a4 ] For implicit-connect, when it's either SYN- or SYN+, an ACK should be sent back to the client immediately. It's not appropriate for the client to enter established state only after receiving data from the server. On client side, after the SYN is sent out, tipc_wait_for_connect() should be called to wait for the ACK if timeout is set. This patch also restricts __tipc_sendstream() to call __sendmsg() only when it's in TIPC_OPEN state, so that the client can program in a single loop doing both connecting and data sending like: for (...) sendmsg(dest, buf); This makes the implicit-connect more implicit. Fixes: b97bf3fd8f6a ("[TIPC] Initial merge") Signed-off-by: Xin Long Acked-by: Jon Maloy Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- net/tipc/socket.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 53af72824c9c..c52b0d00887b 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -160,6 +160,7 @@ static void tipc_sk_remove(struct tipc_sock *tsk); static int __tipc_sendstream(struct socket *sock, struct msghdr *m, size_t dsz); static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz); static void tipc_sk_push_backlog(struct tipc_sock *tsk, bool nagle_ack); +static int tipc_wait_for_connect(struct socket *sock, long *timeo_p); static const struct proto_ops packet_ops; static const struct proto_ops stream_ops; @@ -1525,8 +1526,13 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dlen) rc = 0; } - if (unlikely(syn && !rc)) + if (unlikely(syn && !rc)) { tipc_set_sk_state(sk, TIPC_CONNECTING); + if (timeout) { + timeout = msecs_to_jiffies(timeout); + tipc_wait_for_connect(sock, &timeout); + } + } return rc ? rc : dlen; } @@ -1574,7 +1580,7 @@ static int __tipc_sendstream(struct socket *sock, struct msghdr *m, size_t dlen) return -EMSGSIZE; /* Handle implicit connection setup */ - if (unlikely(dest)) { + if (unlikely(dest && sk->sk_state == TIPC_OPEN)) { rc = __tipc_sendmsg(sock, m, dlen); if (dlen && dlen == rc) { tsk->peer_caps = tipc_node_get_capabilities(net, dnode); @@ -2708,9 +2714,10 @@ static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags, bool kern) { struct sock *new_sk, *sk = sock->sk; - struct sk_buff *buf; struct tipc_sock *new_tsock; + struct msghdr m = {NULL,}; struct tipc_msg *msg; + struct sk_buff *buf; long timeo; int res; @@ -2755,19 +2762,17 @@ static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags, } /* - * Respond to 'SYN-' by discarding it & returning 'ACK'-. - * Respond to 'SYN+' by queuing it on new socket. + * Respond to 'SYN-' by discarding it & returning 'ACK'. + * Respond to 'SYN+' by queuing it on new socket & returning 'ACK'. */ if (!msg_data_sz(msg)) { - struct msghdr m = {NULL,}; - tsk_advance_rx_queue(sk); - __tipc_sendstream(new_sock, &m, 0); } else { __skb_dequeue(&sk->sk_receive_queue); __skb_queue_head(&new_sk->sk_receive_queue, buf); skb_set_owner_r(buf, new_sk); } + __tipc_sendstream(new_sock, &m, 0); release_sock(new_sk); exit: release_sock(sk); -- 2.30.2