From nobody Thu Sep 18 08:15:35 2025 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp696955pis; Tue, 26 Apr 2022 14:57:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwAS9O46pb6BB9vg7mgR5/q629S4bSaFld3FhrL4WYPIArjrnBc6Ez1pTbsBBxbxx6qNwNI X-Received: by 2002:a17:907:c01a:b0:6f3:b313:2fd1 with SMTP id ss26-20020a170907c01a00b006f3b3132fd1mr4771363ejc.680.1651010252001; Tue, 26 Apr 2022 14:57:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651010251; cv=none; d=google.com; s=arc-20160816; b=SK4Gy0HJiuaUxSVE+bka0MsO+e76QC3lFsuXK5K9vWXQEEiaExPxgKyaswm+uPE5Hu AtiIixxvjnMx8CVn15SYeXHVuSOm2/le5J0GXRUgx+NmV/4s8nuObduz9/sejkUH1HMZ XEuKMsAMircNDJOvFfCC+oEtSqlJ6QKhet6WqCpRP/6HAkXddvshIT8aJZ4htB0Mj9Wo U8N0hwxbwJDeKr5g36293TAGFFbUAWghOYCsB4fdDe01z2O4GNrOctLJ+kDn6/v8EEeU aQ3D2RjB8NVhe2IehOOXtQwNhK2I+vR/HFwUr1kmzz8ub/DTv8Nzk5RNNPB9b7/WJGTE UfTg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=c0cQpUac484zEqdj5UfvjUhztkNQLFdmvt1QpH9AUDU=; b=Ivr7L36qXJOGqUUKUhc6tzvLRocJ9suQL1tKuqQabH4dkgzubNiVWJ6ySZ7Q2sGJb6 ugYBvYkM4i2zeJsinfTuu96D4mPQyHBuiZxSar4ca9QVYBtHKkYgtyi25sMyCio5+JCu U/Lew0lJfbqtgq7ubmmG+TVo9TOynjKQFEHPvULqHTY8QYuJ1umdZpTzOOm+DmtvPtCQ 9+OR+AaKqWf7fsXN0jJpEH5KKvx6Pz0MtWEtwzFfPWZvdiBOZ8Pd32sa5djmD0Ub4vp3 X/wQGPmlBVOMoDoz/5WWHp57QQIgpmIzFmSUWSqSFyeNP/9DTmz6Gn5ZV+JZDTqN6fBN 5h5w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=HgIFNFQr; spf=pass (google.com: domain of mptcp+bounces-4903-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4903-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [2604:1380:4040:4f00::1]) by mx.google.com with ESMTPS id g13-20020a170906538d00b006f3a418346csi4546981ejo.113.2022.04.26.14.57.31 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 26 Apr 2022 14:57:31 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4903-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) client-ip=2604:1380:4040:4f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=HgIFNFQr; spf=pass (google.com: domain of mptcp+bounces-4903-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4903-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com 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 da.mirrors.kernel.org (Postfix) with ESMTPS id 5A2572E0A06 for ; Tue, 26 Apr 2022 21:57:31 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id AB81533DE; Tue, 26 Apr 2022 21:57:28 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06b.intel.com [134.134.136.31]) (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 678AB33E7 for ; Tue, 26 Apr 2022 21:57:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651010247; x=1682546247; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=YVHyLHCsb3hF5WWwDRxMNM4YLf+lLPKzKCx6qIJuhX8=; b=HgIFNFQrVpzmSOKg+8mFiGHyCCP7dwlCuEtNZAPYftlc1lpRFyTFwkCC uR/TKXtrFQuoFFNQLaQQ7iTS4GNf1taRhhITWcgKoKRCNxzAAh6X25xLo ClW/JQrhv/rWRbP9qYLua+vo/ytaLpIZrS5wF+nv80/pVqCOkaGuy5ssZ /ifwaWrxETszExBJHN+UiixgU7TG57OpCbUSlCs+X3/BAxIcoUr+SHRgY GXH3lss3Kc8swNX84QzoVAus1hEIctqGdx6w3vYzcqde11f0gXHUybUrM SyE+rdUFM9FIg1q+WfgIj/3SqYHQgduPk8dcLF31UYtjyd6bg9dPxTUw5 Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10329"; a="326222719" X-IronPort-AV: E=Sophos;i="5.90,292,1643702400"; d="scan'208";a="326222719" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Apr 2022 14:57:23 -0700 X-IronPort-AV: E=Sophos;i="5.90,292,1643702400"; d="scan'208";a="532878098" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.209.10.176]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Apr 2022 14:57:23 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Geliang Tang , davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH net-next 5/7] mptcp: reset subflow when MP_FAIL doesn't respond Date: Tue, 26 Apr 2022 14:57:15 -0700 Message-Id: <20220426215717.129506-6-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220426215717.129506-1-mathew.j.martineau@linux.intel.com> References: <20220426215717.129506-1-mathew.j.martineau@linux.intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang This patch adds a new msk->flags bit MPTCP_FAIL_NO_RESPONSE, then reuses sk_timer to trigger a check if we have not received a response from the peer after sending MP_FAIL. If the peer doesn't respond properly, reset the subflow. Signed-off-by: Geliang Tang Signed-off-by: Mat Martineau --- net/mptcp/pm.c | 8 ++++++++ net/mptcp/protocol.c | 48 ++++++++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 1 + net/mptcp/subflow.c | 11 ++++++++++ 4 files changed, 68 insertions(+) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 971e843a304c..14f448d82bb2 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -287,6 +287,7 @@ void mptcp_pm_mp_fail_received(struct sock *sk, u64 fai= l_seq) { struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(sk); struct mptcp_sock *msk =3D mptcp_sk(subflow->conn); + struct sock *s =3D (struct sock *)msk; =20 pr_debug("fail_seq=3D%llu", fail_seq); =20 @@ -299,6 +300,13 @@ void mptcp_pm_mp_fail_received(struct sock *sk, u64 fa= il_seq) subflow->send_mp_fail =3D 1; MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFAILTX); subflow->send_infinite_map =3D 1; + } else if (s && inet_sk_state_load(s) !=3D TCP_CLOSE) { + pr_debug("MP_FAIL response received"); + + mptcp_data_lock(s); + if (inet_sk_state_load(s) !=3D TCP_CLOSE) + sk_stop_timer(s, &s->sk_timer); + mptcp_data_unlock(s); } } =20 diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index ea74122065f1..a5d466e6b538 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2169,10 +2169,38 @@ static void mptcp_retransmit_timer(struct timer_lis= t *t) sock_put(sk); } =20 +static struct mptcp_subflow_context * +mp_fail_response_expect_subflow(struct mptcp_sock *msk) +{ + struct mptcp_subflow_context *subflow, *ret =3D NULL; + + mptcp_for_each_subflow(msk, subflow) { + if (READ_ONCE(subflow->mp_fail_response_expect)) { + ret =3D subflow; + break; + } + } + + return ret; +} + +static void mptcp_check_mp_fail_response(struct mptcp_sock *msk) +{ + struct mptcp_subflow_context *subflow; + struct sock *sk =3D (struct sock *)msk; + + bh_lock_sock(sk); + subflow =3D mp_fail_response_expect_subflow(msk); + if (subflow) + __set_bit(MPTCP_FAIL_NO_RESPONSE, &msk->flags); + bh_unlock_sock(sk); +} + static void mptcp_timeout_timer(struct timer_list *t) { struct sock *sk =3D from_timer(sk, t, sk_timer); =20 + mptcp_check_mp_fail_response(mptcp_sk(sk)); mptcp_schedule_work(sk); sock_put(sk); } @@ -2499,6 +2527,23 @@ static void __mptcp_retrans(struct sock *sk) mptcp_data_unlock(sk); } =20 +static void mptcp_mp_fail_no_response(struct mptcp_sock *msk) +{ + struct mptcp_subflow_context *subflow; + struct sock *ssk; + bool slow; + + subflow =3D mp_fail_response_expect_subflow(msk); + if (subflow) { + pr_debug("MP_FAIL doesn't respond, reset the subflow"); + + ssk =3D mptcp_subflow_tcp_sock(subflow); + slow =3D lock_sock_fast(ssk); + mptcp_subflow_reset(ssk); + unlock_sock_fast(ssk, slow); + } +} + static void mptcp_worker(struct work_struct *work) { struct mptcp_sock *msk =3D container_of(work, struct mptcp_sock, work); @@ -2539,6 +2584,9 @@ static void mptcp_worker(struct work_struct *work) if (test_and_clear_bit(MPTCP_WORK_RTX, &msk->flags)) __mptcp_retrans(sk); =20 + if (test_and_clear_bit(MPTCP_FAIL_NO_RESPONSE, &msk->flags)) + mptcp_mp_fail_no_response(msk); + unlock: release_sock(sk); sock_put(sk); diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index cc66c81a8fab..3a8740fef918 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -116,6 +116,7 @@ #define MPTCP_WORK_EOF 3 #define MPTCP_FALLBACK_DONE 4 #define MPTCP_WORK_CLOSE_SUBFLOW 5 +#define MPTCP_FAIL_NO_RESPONSE 6 =20 /* MPTCP socket release cb flags */ #define MPTCP_PUSH_PENDING 1 diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index ca2352ad20d4..75c824b67ca9 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -968,6 +968,7 @@ static enum mapping_status get_mapping_status(struct so= ck *ssk, { struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk); bool csum_reqd =3D READ_ONCE(msk->csum_enabled); + struct sock *sk =3D (struct sock *)msk; struct mptcp_ext *mpext; struct sk_buff *skb; u16 data_len; @@ -1009,6 +1010,12 @@ static enum mapping_status get_mapping_status(struct= sock *ssk, pr_debug("infinite mapping received"); MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_INFINITEMAPRX); subflow->map_data_len =3D 0; + if (sk && inet_sk_state_load(sk) !=3D TCP_CLOSE) { + mptcp_data_lock(sk); + if (inet_sk_state_load(sk) !=3D TCP_CLOSE) + sk_stop_timer(sk, &sk->sk_timer); + mptcp_data_unlock(sk); + } return MAPPING_INVALID; } =20 @@ -1219,6 +1226,10 @@ static bool subflow_check_data_avail(struct sock *ss= k) sk_eat_skb(ssk, skb); } else { WRITE_ONCE(subflow->mp_fail_response_expect, true); + /* The data lock is acquired in __mptcp_move_skbs() */ + sk_reset_timer((struct sock *)msk, + &((struct sock *)msk)->sk_timer, + jiffies + TCP_RTO_MAX); } WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA); return true; --=20 2.36.0