Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3718901pxv; Mon, 26 Jul 2021 10:10:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyjZb0x/FHJuHOpXw4mRSr0xg022CMVpkquGbtTwYNyjd5AnsyHciVbSdL3aJjKI3rdUcNw X-Received: by 2002:a17:907:76a3:: with SMTP id jw3mr508072ejc.345.1627319402671; Mon, 26 Jul 2021 10:10:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627319402; cv=none; d=google.com; s=arc-20160816; b=i46o5wfevLl2haZF+abpUTZvCZGkbIqS9H46sh8AQEYGoo+t7Skdl8zIty4bi6JKjI kebhKmfrWHbPr+sdUVKe7R/WHckAWiW9HNrP4b2KgpSGxctPHnLLan/oSWiXivhwkkxC HZt8acheSQ0cwKJljmns7QphpCZRt7ZpkhwUS6+kIvEDLQueAgyuzTzuhKDChf3ZX6Wp 52Cpx358Q/8cAsCULn5MDJrpHjhmgBKV5UdD5MTnIdNXPC1Mujsqzdj7OYRgZAPM5LCj O9FKsccd/DpJHbgZHZ3BIl2Nhv6tAAG9x2jU6FG6k2pGJ28ecUjiB59Iy+5zcbtX5GQd znOA== 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=6vRB8+A0bDHrKTAGXKAlDhLqOZASmzzF2G2BTwFL4TY=; b=0d3uODg/lcO7zXZ6+jTk+fUmv+jcDJn/t0fHXmBwIq3nVFPY/p2AdI1XvTwtg8MRNq hc5iRGykBmNf7JW4X+9Q6wsJr8N/Tzm9/YbU4t/fDq+S8ZLXEfhiaHEBIxDEk7MzxNdT Gl6R+Nn8f+rylZppHFsvswWwxYryXzh9mY8q/xFMKAfKHta3KF9SuQVWmPk9QA8Qqg/r eexwC3qo0Eyj3F3iyIsjTDT2U+ujUNfHQSKZ7HNDUW798jjxI9xFr34E+6AE9XTgQPYw qfBiJB2PVV//d7fkj9krEWQPCV/ES+02PJvbvWzTFXZXkmQWfL8kL3cvBKa45cPOm2Gn pAwg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Azh08xLY; 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 k7si477438edr.269.2021.07.26.10.09.36; Mon, 26 Jul 2021 10:10:02 -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=Azh08xLY; 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 S239224AbhGZPvS (ORCPT + 99 others); Mon, 26 Jul 2021 11:51:18 -0400 Received: from mail.kernel.org ([198.145.29.99]:40886 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237890AbhGZP32 (ORCPT ); Mon, 26 Jul 2021 11:29:28 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id AA773610A0; Mon, 26 Jul 2021 16:09:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1627315769; bh=B/W8a58DraerEqWvfxB4VTt7LN+Yqi+LHuu3f9dsR+E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Azh08xLYDvLHmx/yi2n11I5BVucJvBMCdLG4q6aqxpcXpgtjv60gFZ/e/4kLsu9zm DN3um8uCbMWkKqmU7w0PcOrF5Vm6vNcnBAqGB7B/b2YUhzGRcuo4U8wy9y4g2Mb/88 jeet63z4M4Vrwbi+C2tfeylk2au5DznzvYLVE1Jo= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jianguo Wu , Mat Martineau , "David S. Miller" , Sasha Levin Subject: [PATCH 5.13 032/223] mptcp: fix syncookie process if mptcp can not_accept new subflow Date: Mon, 26 Jul 2021 17:37:04 +0200 Message-Id: <20210726153847.305206867@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210726153846.245305071@linuxfoundation.org> References: <20210726153846.245305071@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: Jianguo Wu [ Upstream commit 8547ea5f52dd8ef19b69c25c41b1415481b3503b ] Lots of "TCP: tcp_fin: Impossible, sk->sk_state=7" in client side when doing stress testing using wrk and webfsd. There are at least two cases may trigger this warning: 1.mptcp is in syncookie, and server recv MP_JOIN SYN request, in subflow_check_req(), the mptcp_can_accept_new_subflow() return false, so subflow_init_req_cookie_join_save() isn't called, i.e. not store the data present in the MP_JOIN syn request and the random nonce in hash table - join_entries[], but still send synack. When recv 3rd-ack, mptcp_token_join_cookie_init_state() will return false, and 3rd-ack is dropped, then if mptcp conn is closed by client, client will send a DATA_FIN and a MPTCP FIN, the DATA_FIN doesn't have MP_CAPABLE or MP_JOIN, so mptcp_subflow_init_cookie_req() will return 0, and pass the cookie check, MP_JOIN request is fallback to normal TCP. Server will send a TCP FIN if closed, in client side, when process TCP FIN, it will do reset, the code path is: tcp_data_queue()->mptcp_incoming_options() ->check_fully_established()->mptcp_subflow_reset(). mptcp_subflow_reset() will set sock state to TCP_CLOSE, so tcp_fin will hit TCP_CLOSE, and print the warning. 2.mptcp is in syncookie, and server recv 3rd-ack, in mptcp_subflow_init_cookie_req(), mptcp_can_accept_new_subflow() return false, and subflow_req->mp_join is not set to 1, so in subflow_syn_recv_sock() will not reset the MP_JOIN subflow, but fallback to normal TCP, and then the same thing happens when server will send a TCP FIN if closed. For case1, subflow_check_req() return -EPERM, then tcp_conn_request() will drop MP_JOIN SYN. For case2, let subflow_syn_recv_sock() call mptcp_can_accept_new_subflow(), and do fatal fallback, send reset. Fixes: 9466a1ccebbe ("mptcp: enable JOIN requests even if cookies are in use") Signed-off-by: Jianguo Wu Signed-off-by: Mat Martineau Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- net/mptcp/subflow.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 5493c851ca6c..5221cfce5390 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -223,6 +223,8 @@ again: if (unlikely(req->syncookie)) { if (mptcp_can_accept_new_subflow(subflow_req->msk)) subflow_init_req_cookie_join_save(subflow_req, skb); + else + return -EPERM; } pr_debug("token=%u, remote_nonce=%u msk=%p", subflow_req->token, @@ -262,9 +264,7 @@ int mptcp_subflow_init_cookie_req(struct request_sock *req, if (!mptcp_token_join_cookie_init_state(subflow_req, skb)) return -EINVAL; - if (mptcp_can_accept_new_subflow(subflow_req->msk)) - subflow_req->mp_join = 1; - + subflow_req->mp_join = 1; subflow_req->ssn_offset = TCP_SKB_CB(skb)->seq - 1; } -- 2.30.2