All of lore.kernel.org
 help / color / mirror / Atom feed
From: Geliang Tang <geliangtang@gmail.com>
To: mptcp@lists.linux.dev
Cc: Geliang Tang <geliangtang@gmail.com>, Paolo Abeni <pabeni@redhat.com>
Subject: [PATCH mptcp-next v6 3/9] mptcp: track and update contiguous data status
Date: Wed, 29 Sep 2021 15:35:01 +0800	[thread overview]
Message-ID: <9bed3d49d6b462cebc714587fc48d14402269349.1632900306.git.geliangtang@gmail.com> (raw)
In-Reply-To: <cover.1632900306.git.geliangtang@gmail.com>

This patch added a new member allow_infinite_fallback in mptcp_sock,
which gets initialized to 'true' when the connection begins and is set
to 'false' on any retransmit or successful MP_JOIN.

Rename the helper function mptcp_is_data_contiguous() to
mptcp_allow_infinite_fallback(). In it, only do infinite mapping fallback
if there is a single subflow AND there have been no retransmissions AND
there have never been any MP_JOINs.

Suggested-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Geliang Tang <geliangtang@gmail.com>
---
 net/mptcp/protocol.c |  2 ++
 net/mptcp/protocol.h | 10 +++++++---
 net/mptcp/subflow.c  |  2 +-
 3 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index f8ad049d6941..48979cb82126 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -2464,6 +2464,7 @@ static void __mptcp_retrans(struct sock *sk)
 		dfrag->already_sent = max(dfrag->already_sent, info.sent);
 		tcp_push(ssk, 0, info.mss_now, tcp_sk(ssk)->nonagle,
 			 info.size_goal);
+		WRITE_ONCE(msk->allow_infinite_fallback, false);
 	}
 
 	release_sock(ssk);
@@ -2542,6 +2543,7 @@ static int __mptcp_init_sock(struct sock *sk)
 	msk->first = NULL;
 	inet_csk(sk)->icsk_sync_mss = mptcp_sync_mss;
 	WRITE_ONCE(msk->csum_enabled, mptcp_is_checksum_enabled(sock_net(sk)));
+	WRITE_ONCE(msk->allow_infinite_fallback, true);
 	msk->recovery = false;
 
 	mptcp_pm_data_init(msk);
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 7379ab580a7e..4807e486e762 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -249,6 +249,7 @@ struct mptcp_sock {
 	bool		rcv_fastclose;
 	bool		use_64bit_ack; /* Set when we received a 64-bit DSN */
 	bool		csum_enabled;
+	bool		allow_infinite_fallback;
 	spinlock_t	join_list_lock;
 	struct work_struct work;
 	struct sk_buff  *ooo_last_skb;
@@ -612,17 +613,20 @@ static inline void mptcp_subflow_tcp_fallback(struct sock *sk,
 	inet_csk(sk)->icsk_af_ops = ctx->icsk_af_ops;
 }
 
-static inline bool mptcp_has_another_subflow(struct sock *ssk)
+static inline bool mptcp_allow_infinite_fallback(struct sock *ssk)
 {
 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk), *tmp;
 	struct mptcp_sock *msk = mptcp_sk(subflow->conn);
 
 	mptcp_for_each_subflow(msk, tmp) {
+		if (tmp->mp_join)
+			return false;
+
 		if (tmp != subflow)
-			return true;
+			return false;
 	}
 
-	return false;
+	return READ_ONCE(msk->allow_infinite_fallback);
 }
 
 void __init mptcp_proto_init(void);
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index 87a9ffebcc42..28ed7dc6e170 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -1167,7 +1167,7 @@ static bool subflow_check_data_avail(struct sock *ssk)
 	if (!__mptcp_check_fallback(msk)) {
 		/* RFC 8684 section 3.7. */
 		if (subflow->send_mp_fail) {
-			if (mptcp_has_another_subflow(ssk)) {
+			if (!mptcp_allow_infinite_fallback(ssk)) {
 				ssk->sk_err = EBADMSG;
 				tcp_set_state(ssk, TCP_CLOSE);
 				subflow->reset_transient = 0;
-- 
2.31.1


  parent reply	other threads:[~2021-09-29  7:35 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-29  7:34 [PATCH mptcp-next v6 0/9] The infinite mapping support Geliang Tang
2021-09-29  7:34 ` [PATCH mptcp-next v6 1/9] mptcp: don't send RST for single subflow Geliang Tang
2021-09-29  7:35 ` [PATCH mptcp-next v6 2/9] mptcp: add the fallback check Geliang Tang
2021-09-29  7:35 ` Geliang Tang [this message]
2021-09-29 22:12   ` [PATCH mptcp-next v6 3/9] mptcp: track and update contiguous data status Mat Martineau
2021-09-29  7:35 ` [PATCH mptcp-next v6 4/9] mptcp: add last_ack_dss_start in the msk Geliang Tang
2021-09-29 22:13   ` Mat Martineau
2021-09-29  7:35 ` [PATCH mptcp-next v6 5/9] mptcp: infinite mapping sending Geliang Tang
2021-09-29 22:16   ` Mat Martineau
2021-09-29  7:35 ` [PATCH mptcp-next v6 6/9] mptcp: infinite mapping receiving Geliang Tang
2021-09-29  7:35 ` [PATCH mptcp-next v6 7/9] mptcp: add mib for infinite map sending Geliang Tang
2021-09-29  7:35 ` [PATCH mptcp-next v6 8/9] selftests: mptcp: add infinite map mibs check Geliang Tang
2021-09-29  7:35 ` [PATCH mptcp-next v6 9/9] DO-NOT-MERGE: mptcp: mp_fail test Geliang Tang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9bed3d49d6b462cebc714587fc48d14402269349.1632900306.git.geliangtang@gmail.com \
    --to=geliangtang@gmail.com \
    --cc=mptcp@lists.linux.dev \
    --cc=pabeni@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.