From nobody Thu Sep 18 06:43:01 2025 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ab0:35eb:0:0:0:0:0 with SMTP id w11csp62508uau; Fri, 17 Jun 2022 03:06:46 -0700 (PDT) X-Google-Smtp-Source: AGRyM1s5NheL7JZuGzoKshKF27YnRpOTWkeD2fv/xW2ved3yRIEE++nExvck7erXCoLCuiNoXav4 X-Received: by 2002:a17:90b:48cf:b0:1e8:789c:4a9c with SMTP id li15-20020a17090b48cf00b001e8789c4a9cmr21047115pjb.98.1655460406295; Fri, 17 Jun 2022 03:06:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655460406; cv=none; d=google.com; s=arc-20160816; b=QF60/xIZcfkDWqlPPAyMgt7mETdKlJ/+X6wRfQqQYnXetVH8SAtNvxqMYK978ODyBR U3+YS57u+6+/csrZDjpneIOWUkCBnnHT2F5mxtsGc7tH3/WSkyIo1DIpwr5zCSY/dn1d KztS3v0+5weH4Eegx1vycr4ydHuhJ4ezp46WkBMCChIybMYCmdcb3MmdA+sEb/+5Pjx0 AbcP86jV/TtKcy6snGgdN7OSIEWas+hXm48g3Q71hjoUmQA5d9q4/0Rgqd96RGvRtmzl AwZtxgC33G7pOr1vOcT/VB7AH1Qg/JyCmykop2eLA2m8ky365/e7/pGqi5S1831hcCx7 fO6g== 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:to:from:dkim-signature; bh=zduH8uaZcAHo2NbiT8xUZB5EHlogKwIN6MiufFddsms=; b=IfUUGs3h3yGssuzoqz+7k1nmXRXUzTgGxKwuojgIEkR2z1jR95z34KL5lgogsRU8Lv uEiggXFSAU2AnayldGUul4nf0c3HKD0TbUC1StVtvsTdHUhN/iNRqzMBoKUKr1Wb2yAM Myoii4IM8U68kZ+MGGVnJR9ClaJGkhkHhl6cdMV7z+zcLM2NL0vIRfNq21Ug1d9Cw/XS aqvbexgYh4PCkHUbzc64Hb6EAaPHeEpcskIKAtjF9uPhNITCRn+jbx+6HsVaTVLy4GkE Kf4vBktf7KoZqSF2DUKUeE110k5i9/LezkVjRTjq6BpkA6wHGLoSIb2CRPOxl0ULENF8 IYhg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=GI8ZCLnv; spf=pass (google.com: domain of mptcp+bounces-5685-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5685-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id t63-20020a638142000000b00408af01cb44si5477632pgd.124.2022.06.17.03.06.46 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Jun 2022 03:06:46 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5685-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=GI8ZCLnv; spf=pass (google.com: domain of mptcp+bounces-5685-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5685-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.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 sv.mirrors.kernel.org (Postfix) with ESMTPS id C772A280A87 for ; Fri, 17 Jun 2022 10:06:45 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8354F2F34; Fri, 17 Jun 2022 10:06:43 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 287AB2F2F for ; Fri, 17 Jun 2022 10:06:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655460401; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zduH8uaZcAHo2NbiT8xUZB5EHlogKwIN6MiufFddsms=; b=GI8ZCLnvX253NxPb1Hy0a0vJtKGa+f65/j6lttXBBm8s4njS4lC1j9kvwiVfzOzx/vv8tU zvQ1gBTbE8JCmuelVU6igZLzjnQw2sba6nrJldg2pfrLoxf9OvmKjVM3koEYuhBMZcmo5X KvInyGZjXlShUJ2OUu0rscrJiWI+3Ag= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-57-lEnw1gHXMTSWxi2etIHTIg-1; Fri, 17 Jun 2022 06:06:39 -0400 X-MC-Unique: lEnw1gHXMTSWxi2etIHTIg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id AAC03833967 for ; Fri, 17 Jun 2022 10:06:39 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.194]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3AB6B40C1288 for ; Fri, 17 Jun 2022 10:06:39 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-net v3 1/6] mptcp: fix error mibs accounting Date: Fri, 17 Jun 2022 12:05:15 +0200 Message-Id: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pabeni@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8"; x-default="true" The current accounting for MP_FAIL and FASTCLOSE is not very accurate: both can be increased even when the related option is not really sent. Move the accounting into the correct place. Fixes: eb7f33654dc1 ("mptcp: add the mibs for MP_FAIL") Fixes: 1e75629cb964 ("mptcp: add the mibs for MP_FASTCLOSE") Signed-off-by: Paolo Abeni Reviewed-by: Mat Martineau --- net/mptcp/options.c | 6 +++--- net/mptcp/pm.c | 1 - net/mptcp/subflow.c | 4 +--- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/net/mptcp/options.c b/net/mptcp/options.c index be3b918a6d15..0bfa6662447c 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -765,6 +765,7 @@ static noinline bool mptcp_established_options_rst(stru= ct sock *sk, struct sk_bu opts->suboptions |=3D OPTION_MPTCP_RST; opts->reset_transient =3D subflow->reset_transient; opts->reset_reason =3D subflow->reset_reason; + MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPRSTTX); =20 return true; } @@ -788,6 +789,7 @@ static bool mptcp_established_options_fastclose(struct = sock *sk, opts->rcvr_key =3D msk->remote_key; =20 pr_debug("FASTCLOSE key=3D%llu", opts->rcvr_key); + MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFASTCLOSETX); return true; } =20 @@ -807,7 +809,7 @@ static bool mptcp_established_options_mp_fail(struct so= ck *sk, *size =3D TCPOLEN_MPTCP_FAIL; opts->suboptions |=3D OPTION_MPTCP_FAIL; opts->fail_seq =3D subflow->map_seq; - + MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFAILTX); pr_debug("MP_FAIL fail_seq=3D%llu", opts->fail_seq); =20 return true; @@ -833,13 +835,11 @@ bool mptcp_established_options(struct sock *sk, struc= t sk_buff *skb, mptcp_established_options_mp_fail(sk, &opt_size, remaining, opts)) { *size +=3D opt_size; remaining -=3D opt_size; - MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFASTCLOSETX); } /* MP_RST can be used with MP_FASTCLOSE and MP_FAIL if there is room */ if (mptcp_established_options_rst(sk, skb, &opt_size, remaining, opts)) { *size +=3D opt_size; remaining -=3D opt_size; - MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPRSTTX); } return true; } diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 2a57d95d5492..3c7f07bb124e 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -309,7 +309,6 @@ void mptcp_pm_mp_fail_received(struct sock *sk, u64 fai= l_seq) pr_debug("send MP_FAIL response and infinite map"); =20 subflow->send_mp_fail =3D 1; - MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFAILTX); subflow->send_infinite_map =3D 1; } else { pr_debug("MP_FAIL response received"); diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 5351d54e514a..57d2d8d933d0 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -958,10 +958,8 @@ static enum mapping_status validate_data_csum(struct s= ock *ssk, struct sk_buff * subflow->map_data_csum); if (unlikely(csum)) { MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DATACSUMERR); - if (subflow->mp_join || subflow->valid_csum_seen) { + if (subflow->mp_join || subflow->valid_csum_seen) subflow->send_mp_fail =3D 1; - MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_MPFAILTX); - } return subflow->mp_join ? MAPPING_INVALID : MAPPING_DUMMY; } =20 --=20 2.35.3 From nobody Thu Sep 18 06:43:01 2025 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ab0:35eb:0:0:0:0:0 with SMTP id w11csp62522uau; Fri, 17 Jun 2022 03:06:47 -0700 (PDT) X-Google-Smtp-Source: AGRyM1s8Ch4zctkdwefKJdn651KxBdwNO5QbPVnDFYWejZbXgFTpS3WD6aTCpX66cBsremNolW5k X-Received: by 2002:aa7:814c:0:b0:51b:b3ee:6be2 with SMTP id d12-20020aa7814c000000b0051bb3ee6be2mr9099948pfn.3.1655460407199; Fri, 17 Jun 2022 03:06:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655460407; cv=none; d=google.com; s=arc-20160816; b=U0pTBSHl1GOTK5s3bk0W/glD4nRjIW4j056+iRxvmknrQWZm7fBhul1c1nprCs5Go1 vsuVw1yBw/0ai4l7WMdRWq0vRuHtK1uhvHiG86c8OAroR21azWjx8Ol8HgQtNYMUcFMo +YQ+hYvfvNDbcX1HJZoEzFFwpJOD8hVoBJ28IgrWPUi3vVR/V56FwWCeVNyFmb5hZeYw zEXs0FtRxTPf7MvmlUn7NSkxu2MHLVyJ+kXSFUXRn+AAQ/kx+3rXftX0XHUwgjcI2Nhl wTn0tI607/jqpo17qMNpjjtHR9Ca78bBPyL2x0tXOgYr1Wg9JwOUd3fq9Xf1InPLpkH1 OKQA== 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:to:from:dkim-signature; bh=QyEw0Hxej3KhuemgaxQYg9IJahwM7VHtKclJqGNymzw=; b=hk77KEfgHgKPw3EfQ3pSge5zLhlB8DXLkhFlpV5cufnemDs1qOYB+AHrbNMATgI5Hc FXM+WynzkHOl+C0x5+nv+lLPo57PXT0CPMDFqxBaDfvo9+9PVGxhNpU5ZwOsOPlOK756 VXkx6+nHdioN+jLqvbnKNCLjB75goMA7K26OOaENAuMwQs5bhydKyRNISNmEriaUb+AE DXbg3utD8iH4hLPiVChz4/feHmOtk8WSroFRA3TQBjali2Ph1awa2ShTrQssnxMV4YvM gBM3uCzesTaj/xiU9qFhJujSFpz3XYVomWpJMTPHaG3dPu6mRP9Fnmi7OpEbNNUa4mHx nLbQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=MNWbxLPA; spf=pass (google.com: domain of mptcp+bounces-5686-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5686-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id m9-20020a170902f64900b001620394865asi4680860plg.370.2022.06.17.03.06.47 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Jun 2022 03:06:47 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5686-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=MNWbxLPA; spf=pass (google.com: domain of mptcp+bounces-5686-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5686-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.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 sv.mirrors.kernel.org (Postfix) with ESMTPS id E58EB280ABA for ; Fri, 17 Jun 2022 10:06:46 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9FC942F35; Fri, 17 Jun 2022 10:06:44 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 046902F31 for ; Fri, 17 Jun 2022 10:06:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655460401; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QyEw0Hxej3KhuemgaxQYg9IJahwM7VHtKclJqGNymzw=; b=MNWbxLPANTC4wVffvyeoN8MWL8U4Dloz82wZfsHWh4ya5ZeUp3/6Q7nmPXrybHLcke9Db9 xGN/AVxq/ttfORuIXb9Stxl/3pjmH/3pp4UHir7OsF7ElxgApGzw5xSwkH098OZnHfyYX8 /Ow1CXS13LPJwosYhRocnSMhTxLRWKY= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-548-5rHy4HkCOsiCyPG6i7Wp2w-1; Fri, 17 Jun 2022 06:06:40 -0400 X-MC-Unique: 5rHy4HkCOsiCyPG6i7Wp2w-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6D52B800882 for ; Fri, 17 Jun 2022 10:06:40 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.194]) by smtp.corp.redhat.com (Postfix) with ESMTP id F28584010E4D for ; Fri, 17 Jun 2022 10:06:39 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-net v3 2/6] mptcp: introduce MAPPING_BAD_CSUM Date: Fri, 17 Jun 2022 12:05:16 +0200 Message-Id: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pabeni@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8"; x-default="true" This allow moving a couple of conditional out of the fast path, making the code more easy to follow and will simplify the next patch. Signed-off-by: Paolo Abeni Reviewed-by: Mat Martineau --- net/mptcp/subflow.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 57d2d8d933d0..98b12a9c4eb5 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -843,7 +843,8 @@ enum mapping_status { MAPPING_INVALID, MAPPING_EMPTY, MAPPING_DATA_FIN, - MAPPING_DUMMY + MAPPING_DUMMY, + MAPPING_BAD_CSUM }; =20 static void dbg_bad_map(struct mptcp_subflow_context *subflow, u32 ssn) @@ -958,9 +959,7 @@ static enum mapping_status validate_data_csum(struct so= ck *ssk, struct sk_buff * subflow->map_data_csum); if (unlikely(csum)) { MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DATACSUMERR); - if (subflow->mp_join || subflow->valid_csum_seen) - subflow->send_mp_fail =3D 1; - return subflow->mp_join ? MAPPING_INVALID : MAPPING_DUMMY; + return MAPPING_BAD_CSUM; } =20 subflow->valid_csum_seen =3D 1; @@ -1178,10 +1177,8 @@ static bool subflow_check_data_avail(struct sock *ss= k) =20 status =3D get_mapping_status(ssk, msk); trace_subflow_check_data_avail(status, skb_peek(&ssk->sk_receive_queue)); - if (unlikely(status =3D=3D MAPPING_INVALID)) - goto fallback; - - if (unlikely(status =3D=3D MAPPING_DUMMY)) + if (unlikely(status =3D=3D MAPPING_INVALID || status =3D=3D MAPPING_DUMM= Y || + status =3D=3D MAPPING_BAD_CSUM)) goto fallback; =20 if (status !=3D MAPPING_OK) @@ -1223,7 +1220,10 @@ static bool subflow_check_data_avail(struct sock *ss= k) fallback: if (!__mptcp_check_fallback(msk)) { /* RFC 8684 section 3.7. */ - if (subflow->send_mp_fail) { + if (status =3D=3D MAPPING_BAD_CSUM && + ((subflow->mp_join || subflow->valid_csum_seen))) { + subflow->send_mp_fail =3D 1; + if (!READ_ONCE(msk->allow_infinite_fallback)) { ssk->sk_err =3D EBADMSG; tcp_set_state(ssk, TCP_CLOSE); --=20 2.35.3 From nobody Thu Sep 18 06:43:01 2025 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ab0:35eb:0:0:0:0:0 with SMTP id w11csp62530uau; Fri, 17 Jun 2022 03:06:48 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vPkSj26AF0a87U9CQV36rcqUJXYeiBEXquVEOhxWx9I6lSL8ujif1+hTSMUn+u0Orr3Sia X-Received: by 2002:a65:6d0f:0:b0:3fd:8437:c35b with SMTP id bf15-20020a656d0f000000b003fd8437c35bmr8184512pgb.24.1655460408457; Fri, 17 Jun 2022 03:06:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655460408; cv=none; d=google.com; s=arc-20160816; b=RplWu9uCVyriidEJchZUpb1u6FZ0Phr62Dthvv9jBbYi6Mo88IQMVF7VwA+lJLP5FD 3+wq49gPCc94VjSd7l4nWai8abDU2ds3K7Y9h3Lgn6s7BaI3IVStXX+GvT+ca4cwZ7JS wfBeloOY95rpzNqYTrGHtX+4MMDryXlaF71FdpgvJp/DwP3Q7Hy+SaxnThTfo4yFDFIb AD/IeJZaArGyeDKObuYn3Ybvo+9Vp2Yhie3fHXoiSI7BNRrk/1cH1VJP1YQn6UtSdtvq tJ5gCbQt/g6E9TXb9phaJKwdxxFkRbRrs2me7ayb6HbLHIBAm+4qQ6GQANf2q4prH2Ty J6FQ== 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:to:from:dkim-signature; bh=YmU/yxfeHU/uksPfsBeBHauvCPPZv5RRrELFCMk9554=; b=XlZOWzHLcXL9vgj52gaX4xWckxrxoWQO1CwHFVRXxmaPb8hvRUc5jv8CmB3I76J8iB VXo8xTij+To+jEF8pKjXOX96SB0ht0dsx/DBVWNPSfR4ECKzHIMfkPX1dd3QyaqR8MI/ fBC8KLlzIYPRZIVIUKR/yYW1Qx2XDZ0RVqRIMHIaKw6ZSn9yP/IE4kxYPsph6BEhJG3R 8IAqOnLjhyQbNFBFR4kC3OxxgWYKASmhLgiyWLfIHQBO17k5MPQyD3fTtPEmRJkqhDI8 PuXvWhSILOjhOuwED4nCbzoQXqRNFgtJ2PBbAgPj0QsuDIWu9YPTDLQkI8jQ7E6yIihO okmg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=EcuQ4R7u; spf=pass (google.com: domain of mptcp+bounces-5687-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5687-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id o10-20020a655bca000000b004050e3faf97si5840755pgr.442.2022.06.17.03.06.48 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Jun 2022 03:06:48 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5687-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=EcuQ4R7u; spf=pass (google.com: domain of mptcp+bounces-5687-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5687-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.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 sv.mirrors.kernel.org (Postfix) with ESMTPS id 40F75280BD7 for ; Fri, 17 Jun 2022 10:06:48 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 21B182F31; Fri, 17 Jun 2022 10:06:45 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 7B60E2F25 for ; Fri, 17 Jun 2022 10:06:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655460402; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YmU/yxfeHU/uksPfsBeBHauvCPPZv5RRrELFCMk9554=; b=EcuQ4R7udL7tXXJIpBtGwHrB4ZpO+QrbRWESTnUACeY1nAYFX+ft5jNGIP61s7Zkb+q3zB zNFm8wUllYaYME8YnztFB4KdJp8nfTclDLduutp9jWcfSN7RBsNH7b4Ys2TLdLazh2zEhE YhB5McyJWvmgvbDLTJ0rGda3id63cDw= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-638-r3FasmE3NlG3c2ZwtuK1BQ-1; Fri, 17 Jun 2022 06:06:41 -0400 X-MC-Unique: r3FasmE3NlG3c2ZwtuK1BQ-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 31BDC296A600 for ; Fri, 17 Jun 2022 10:06:41 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.194]) by smtp.corp.redhat.com (Postfix) with ESMTP id B6C0640C1288 for ; Fri, 17 Jun 2022 10:06:40 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-net v3 3/6] Squash-to: "mptcp: invoke MP_FAIL response when needed" Date: Fri, 17 Jun 2022 12:05:17 +0200 Message-Id: <7b8fcd495f785d51cf87149826b0ce07cbdd1da0.1655460262.git.pabeni@redhat.com> In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pabeni@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8"; x-default="true" This tries to address a few issues outstanding in the mentioned patch: - we explicitly need to reset the timeout timer for mp_fail's sake - we need to explicitly generate a tcp ack for mp_fail, otherwise there are no guarantees for suck option being sent out - the timeout timer needs handling need some caring, as it's still shared between mp_fail and msk socket timeout. - we can re-use msk->first for msk->fail_ssk, as only the first/mpc subflow can fail without reset. That additionally avoid the need to clear fail_ssk on the relevant subflow close. - fail_tout would need some additional annotation. Just to be on the safe side move its manipulaiton under the ssk socket lock. Last 2 paragraph of the squash to commit should be replaced with: """ It leverages the fact that only the MPC/first subflow can gracefully fail to avoid unneeded subflows traversal: the failing subflow can be only msk->first. A new 'fail_tout' field is added to the subflow context to record the MP_FAIL response timeout and use such field to reliably share the timeout timer between the MP_FAIL event and the MPTCP socket close timeout. Finally, a new ack is generated to send out MP_FAIL notification as soon as we hit the relevant condition, instead of waiting a possibly unbound time for the next data packet. """ Signed-off-by: Paolo Abeni Reviewed-by: Mat Martineau --- net/mptcp/pm.c | 4 +++- net/mptcp/protocol.c | 50 ++++++++++++++++++++++++++++++++++++-------- net/mptcp/protocol.h | 4 ++-- net/mptcp/subflow.c | 30 ++++++++++++++++++++++++-- 4 files changed, 74 insertions(+), 14 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 3c7f07bb124e..45e2a48397b9 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -305,13 +305,15 @@ void mptcp_pm_mp_fail_received(struct sock *sk, u64 f= ail_seq) if (!READ_ONCE(msk->allow_infinite_fallback)) return; =20 - if (!msk->fail_ssk) { + if (!subflow->fail_tout) { pr_debug("send MP_FAIL response and infinite map"); =20 subflow->send_mp_fail =3D 1; subflow->send_infinite_map =3D 1; + tcp_send_ack(sk); } else { pr_debug("MP_FAIL response received"); + WRITE_ONCE(subflow->fail_tout, 0); } } =20 diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index a0f9f3831509..725fd417ebb1 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -500,7 +500,7 @@ static void mptcp_set_timeout(struct sock *sk) __mptcp_set_timeout(sk, tout); } =20 -static bool tcp_can_send_ack(const struct sock *ssk) +static inline bool tcp_can_send_ack(const struct sock *ssk) { return !((1 << inet_sk_state_load(ssk)) & (TCPF_SYN_SENT | TCPF_SYN_RECV | TCPF_TIME_WAIT | TCPF_CLOSE | TCP= F_LISTEN)); @@ -2490,24 +2490,50 @@ static void __mptcp_retrans(struct sock *sk) mptcp_reset_timer(sk); } =20 +/* schedule the timeout timer for the relevant event: either close timeout + * or mp_fail timeout. The close timeout takes precedence on the mp_fail o= ne + */ +void mptcp_reset_timeout(struct mptcp_sock *msk, unsigned long fail_tout) +{ + struct sock *sk =3D (struct sock *)msk; + unsigned long timeout, close_timeout; + + if (!fail_tout && !sock_flag(sk, SOCK_DEAD)) + return; + + close_timeout =3D inet_csk(sk)->icsk_mtup.probe_timestamp - tcp_jiffies32= + jiffies + TCP_TIMEWAIT_LEN; + + /* the close timeout takes precedence on the fail one, and here at least = one of + * them is active + */ + timeout =3D sock_flag(sk, SOCK_DEAD) ? close_timeout : fail_tout; + + sk_reset_timer(sk, &sk->sk_timer, timeout); +} + static void mptcp_mp_fail_no_response(struct mptcp_sock *msk) { - struct sock *ssk =3D msk->fail_ssk; + struct sock *ssk =3D msk->first; bool slow; =20 + if (!ssk) + return; + pr_debug("MP_FAIL doesn't respond, reset the subflow"); =20 slow =3D lock_sock_fast(ssk); mptcp_subflow_reset(ssk); + WRITE_ONCE(mptcp_subflow_ctx(ssk)->fail_tout, 0); unlock_sock_fast(ssk, slow); =20 - msk->fail_ssk =3D NULL; + mptcp_reset_timeout(msk, 0); } =20 static void mptcp_worker(struct work_struct *work) { struct mptcp_sock *msk =3D container_of(work, struct mptcp_sock, work); struct sock *sk =3D &msk->sk.icsk_inet.sk; + unsigned long fail_tout; int state; =20 lock_sock(sk); @@ -2544,7 +2570,8 @@ static void mptcp_worker(struct work_struct *work) if (test_and_clear_bit(MPTCP_WORK_RTX, &msk->flags)) __mptcp_retrans(sk); =20 - if (msk->fail_ssk && time_after(jiffies, msk->fail_tout)) + fail_tout =3D msk->first ? READ_ONCE(mptcp_subflow_ctx(msk->first)->fail_= tout) : 0; + if (fail_tout && time_after(jiffies, fail_tout)) mptcp_mp_fail_no_response(msk); =20 unlock: @@ -2572,8 +2599,6 @@ static int __mptcp_init_sock(struct sock *sk) WRITE_ONCE(msk->csum_enabled, mptcp_is_checksum_enabled(sock_net(sk))); WRITE_ONCE(msk->allow_infinite_fallback, true); msk->recovery =3D false; - msk->fail_ssk =3D NULL; - msk->fail_tout =3D 0; =20 mptcp_pm_data_init(msk); =20 @@ -2804,6 +2829,7 @@ static void __mptcp_destroy_sock(struct sock *sk) static void mptcp_close(struct sock *sk, long timeout) { struct mptcp_subflow_context *subflow; + struct mptcp_sock *msk =3D mptcp_sk(sk); bool do_cancel_work =3D false; =20 lock_sock(sk); @@ -2822,10 +2848,16 @@ static void mptcp_close(struct sock *sk, long timeo= ut) cleanup: /* orphan all the subflows */ inet_csk(sk)->icsk_mtup.probe_timestamp =3D tcp_jiffies32; - mptcp_for_each_subflow(mptcp_sk(sk), subflow) { + mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); bool slow =3D lock_sock_fast_nested(ssk); =20 + /* since the close timeout takes precedence on the fail one, + * cancel the latter + */ + if (ssk =3D=3D msk->first) + subflow->fail_tout =3D 0; + sock_orphan(ssk); unlock_sock_fast(ssk, slow); } @@ -2834,13 +2866,13 @@ static void mptcp_close(struct sock *sk, long timeo= ut) sock_hold(sk); pr_debug("msk=3D%p state=3D%d", sk, sk->sk_state); if (mptcp_sk(sk)->token) - mptcp_event(MPTCP_EVENT_CLOSED, mptcp_sk(sk), NULL, GFP_KERNEL); + mptcp_event(MPTCP_EVENT_CLOSED, msk, NULL, GFP_KERNEL); =20 if (sk->sk_state =3D=3D TCP_CLOSE) { __mptcp_destroy_sock(sk); do_cancel_work =3D true; } else { - sk_reset_timer(sk, &sk->sk_timer, jiffies + TCP_TIMEWAIT_LEN); + mptcp_reset_timeout(msk, 0); } release_sock(sk); if (do_cancel_work) diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index bef7dea9f358..077a717799a0 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -306,8 +306,6 @@ struct mptcp_sock { =20 u32 setsockopt_seq; char ca_name[TCP_CA_NAME_MAX]; - struct sock *fail_ssk; - unsigned long fail_tout; }; =20 #define mptcp_data_lock(sk) spin_lock_bh(&(sk)->sk_lock.slock) @@ -484,6 +482,7 @@ struct mptcp_subflow_context { u8 stale_count; =20 long delegated_status; + unsigned long fail_tout; =20 ); =20 @@ -677,6 +676,7 @@ void mptcp_get_options(const struct sk_buff *skb, =20 void mptcp_finish_connect(struct sock *sk); void __mptcp_set_connected(struct sock *sk); +void mptcp_reset_timeout(struct mptcp_sock *msk, unsigned long fail_tout); static inline bool mptcp_is_fully_established(struct sock *sk) { return inet_sk_state_load(sk) =3D=3D TCP_ESTABLISHED && diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 98b12a9c4eb5..c82a9a6e0267 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1158,6 +1158,33 @@ static bool subflow_can_fallback(struct mptcp_subflo= w_context *subflow) return !subflow->fully_established; } =20 +static void mptcp_subflow_fail(struct mptcp_sock *msk, struct sock *ssk) +{ + struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk); + unsigned long fail_tout; + + /* grecefull failure can happen only on the MPC subflow */ + if (WARN_ON_ONCE(ssk !=3D READ_ONCE(msk->first))) + return; + + /* since the close timeout take precedence on the fail one, + * no need to starte the latter when the first is already set + */ + if (sock_flag((struct sock *)msk, SOCK_DEAD)) + return; + + /* we don't need extreme accuracy here, use a zero fail_tout as special + * value meaning no fail timeout at all; + */ + fail_tout =3D jiffies + TCP_RTO_MAX; + if (!fail_tout) + fail_tout =3D 1; + WRITE_ONCE(subflow->fail_tout, fail_tout); + tcp_send_ack(ssk); + + mptcp_reset_timeout(msk, subflow->fail_tout); +} + static bool subflow_check_data_avail(struct sock *ssk) { struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk); @@ -1233,8 +1260,7 @@ static bool subflow_check_data_avail(struct sock *ssk) while ((skb =3D skb_peek(&ssk->sk_receive_queue))) sk_eat_skb(ssk, skb); } else { - msk->fail_ssk =3D ssk; - msk->fail_tout =3D jiffies + TCP_RTO_MAX; + mptcp_subflow_fail(msk, ssk); } WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA); return true; --=20 2.35.3 From nobody Thu Sep 18 06:43:01 2025 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ab0:35eb:0:0:0:0:0 with SMTP id w11csp62539uau; Fri, 17 Jun 2022 03:06:49 -0700 (PDT) X-Google-Smtp-Source: AGRyM1s1zk/FO/S7t9/NUmWaBDjOTMr4ShJ6muTeyWjRVsLTuaGVVp/5RW2ly/jO48nGwL5LBbEn X-Received: by 2002:a9d:2c5:0:b0:60c:2bf9:1dbd with SMTP id 63-20020a9d02c5000000b0060c2bf91dbdmr3696030otl.254.1655460409844; Fri, 17 Jun 2022 03:06:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655460409; cv=none; d=google.com; s=arc-20160816; b=WY5XkxFiAevxbZ4s0BZ1ZNwFNPaZzE6hRbkYoqTesffWw6gnznrbS/MHgH3GSbcd/t w7UzwRfyH81qYcv/CWX7FwRqJWOwYG95mNASOduTmzvWgymUYyLkSyv/ErOEBQNeN2ei HUdxfZmHhFfQVjqaEVhe8LxIpXEHjh1m5M0TDP1bnTowchd6VqrMPbHZLrkT2vuzzTW0 BlnV1g7FGNo4teTXbVZ1MDqjexRe0KPJlWHjKKhKIFffgcNdzAEaH6pvVm5vt2n8RwTl pC4VCEghnL9kI7JlFwZEtiUQQMstdq/w3VwtfX2e2NXaLdu2uSkrG0KwEGhQTC0mg3B5 ozwg== 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:to:from:dkim-signature; bh=xYQus3YQknyusLBNs7uB0crJL6zFcmSaszgzANWh19k=; b=l59W6C6bOkWOZZrPMCLUUOuqhqctI9ROpQ8V/FHMydC5zAM0rUqUvFm2HwbazcD7Tn 539wt02C6uKgpObasrQHmVJEmtYrOPZlKGSF6tuTZ3Vi0rWcQOFQASBFQr/mdLvNAo0H XIfuWTlp9N/veRWYyrbqnGCNaO2/tTa7nZyqQCwI75xu8Ok9HigYfb444W2Yq6uY1waP FxaQ0q4GtoDR4ULV1wqYUlD2w5joSJLNZZZyr7UAD9UE5FJi761Aor4jGHTOpBgrRnMN Cfw7ykdrcu8OmdN0/QJJ9woKwyultJU6xV2/HUuY5vgqTxl9YQBD5NrW4s3Xn4vF3GSu 55OA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=BJCcriSJ; spf=pass (google.com: domain of mptcp+bounces-5688-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5688-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [139.178.84.19]) by mx.google.com with ESMTPS id m188-20020aca58c5000000b0032e879825ecsi3473557oib.116.2022.06.17.03.06.49 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Jun 2022 03:06:49 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5688-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) client-ip=139.178.84.19; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=BJCcriSJ; spf=pass (google.com: domain of mptcp+bounces-5688-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5688-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.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 AB28E2E0A1C for ; Fri, 17 Jun 2022 10:06:49 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id CAA652F32; Fri, 17 Jun 2022 10:06:45 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 972F22F2F for ; Fri, 17 Jun 2022 10:06:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655460403; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xYQus3YQknyusLBNs7uB0crJL6zFcmSaszgzANWh19k=; b=BJCcriSJY2QkSFl2HJaAVdgtecjVG8+oyxevGMFqnp0l5pHtB3ECyJiQ4f4HGTK13C9Abq z3xG924AFVm0ZbeFh7uqEBba0MvnFbnYhorHNOoWGg5njLBA0AYkpbxabJDACkzMuGRk1H nLj23snPMobUuJuJ/R7GXOGy5z/Q4yw= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-139-uC00SaTBPI6BJ2KCqETvuw-1; Fri, 17 Jun 2022 06:06:42 -0400 X-MC-Unique: uC00SaTBPI6BJ2KCqETvuw-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id EBD03802C17 for ; Fri, 17 Jun 2022 10:06:41 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.194]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7AAFE4010E4D for ; Fri, 17 Jun 2022 10:06:41 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-net v3 4/6] mptcp: fix shutdown vs fallback race Date: Fri, 17 Jun 2022 12:05:18 +0200 Message-Id: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pabeni@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8"; x-default="true" If the MPTCP socket shutdown happens before a fallback to TCP, and all the pending data have been already spooled, we never close the TCP connection. Address the issue explicitly checking for critical condition at fallback time. Signed-off-by: Paolo Abeni Reviewed-by: Mat Martineau --- net/mptcp/options.c | 2 +- net/mptcp/protocol.c | 2 +- net/mptcp/protocol.h | 19 ++++++++++++++++--- net/mptcp/subflow.c | 2 +- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 0bfa6662447c..57eab237c837 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -966,7 +966,7 @@ static bool check_fully_established(struct mptcp_sock *= msk, struct sock *ssk, goto reset; subflow->mp_capable =3D 0; pr_fallback(msk); - __mptcp_do_fallback(msk); + mptcp_do_fallback(ssk); return false; } =20 diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 725fd417ebb1..00ba9c44933a 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1245,7 +1245,7 @@ static void mptcp_update_infinite_map(struct mptcp_so= ck *msk, MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_INFINITEMAPTX); mptcp_subflow_ctx(ssk)->send_infinite_map =3D 0; pr_fallback(msk); - __mptcp_do_fallback(msk); + mptcp_do_fallback(ssk); } =20 static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk, diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 077a717799a0..ad9b02b1b3e6 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -941,12 +941,25 @@ static inline void __mptcp_do_fallback(struct mptcp_s= ock *msk) set_bit(MPTCP_FALLBACK_DONE, &msk->flags); } =20 -static inline void mptcp_do_fallback(struct sock *sk) +static inline void mptcp_do_fallback(struct sock *ssk) { - struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(sk); - struct mptcp_sock *msk =3D mptcp_sk(subflow->conn); + struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk); + struct sock *sk =3D subflow->conn; + struct mptcp_sock *msk; =20 + msk =3D mptcp_sk(sk); __mptcp_do_fallback(msk); + if (READ_ONCE(msk->snd_data_fin_enable) && !(ssk->sk_shutdown & SEND_SHUT= DOWN)) { + gfp_t saved_allocation =3D ssk->sk_allocation; + + /* we are in a atomic (BH) scope, override ssk default for data + * fin allocation + */ + ssk->sk_allocation =3D GFP_ATOMIC; + ssk->sk_shutdown |=3D SEND_SHUTDOWN; + tcp_shutdown(ssk, SEND_SHUTDOWN); + ssk->sk_allocation =3D saved_allocation; + } } =20 #define pr_fallback(a) pr_debug("%s:fallback to TCP (msk=3D%p)", __func__,= a) diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index c82a9a6e0267..b157e275315e 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1279,7 +1279,7 @@ static bool subflow_check_data_avail(struct sock *ssk) return false; } =20 - __mptcp_do_fallback(msk); + mptcp_do_fallback(ssk); } =20 skb =3D skb_peek(&ssk->sk_receive_queue); --=20 2.35.3 From nobody Thu Sep 18 06:43:01 2025 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ab0:35eb:0:0:0:0:0 with SMTP id w11csp62550uau; Fri, 17 Jun 2022 03:06:51 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vYp92PPYIl0js8kJATrzYxzDGLKJppx5Er7P2AyeMNfabzarxYh+c5Jg06P8ra/1Z8n+1b X-Received: by 2002:a05:6870:c181:b0:f1:ea2f:f7f7 with SMTP id h1-20020a056870c18100b000f1ea2ff7f7mr10701415oad.18.1655460411025; Fri, 17 Jun 2022 03:06:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655460411; cv=none; d=google.com; s=arc-20160816; b=XTulnQ3doYmBCywfRkMp/n+maGfc6B1izCBvR/sMwq+zWjc5d29ESUvrKA/wBUj5Cs JnPHbQLZ+q6UHaYyVBgfzGqwmOh4ThgvXiMVFbY58/CsBdxgn/aPCCakUzfI1K5smTF6 CVYJrqBWBmWVe4KEvQwagAf5boAfiJ0wL+THQnrmFn/3zSFWWnNUAbf6X8lUlzi3GI8Z 4bGYNsLUkk5h5GjUm3pVun8xw4EQhxaqBmPEW+NpY1mxEhPKRRcJlA7IDOaeaU1wbAKZ ysaIAEkB/IkLxKG10lyPVRPSy/TvSOdndwa59ycAIjVAWvda40eDquqFDs52gU4VBio9 KJbA== 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:to:from:dkim-signature; bh=9idqIOEQPfFgt+AW6bj48dhUJzMqwGEZ9BnPT1+Jl8I=; b=Pc5KhILWnoIDmBCCHgd4ajBhlF4Xb/UqO+FCNHStxyNAgyJPS00HfNJs5Ukid6bxau +Id7WrsakKrWISw9nOden4K2e3pNYOPNcMtRoGnhuoSwwJihO/LlhBAYu9F5Xr0zE4lk Z1jYzi+OF11jLwdqHhyJxMpYfQCmJLuhAxoBVh7uBDboRcZ5dQDEljK7HGrCKoQiFlqz rJpeGlrhwq+zyk7kY4NXtIuakqH3XU9FMYqcMnXTieK+zC1pGHUaz5mq4JlqQfE32Xof mP9s0CK/oWog+jn+pfCM8tgNLYN6dFbZMvtBrUtgR2gk2bt82hYpEHgOh5DWHiYSlFdo Aaag== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=fyWTXwU6; spf=pass (google.com: domain of mptcp+bounces-5689-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5689-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [139.178.84.19]) by mx.google.com with ESMTPS id m188-20020aca58c5000000b0032e879825ecsi3473557oib.116.2022.06.17.03.06.50 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Jun 2022 03:06:51 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5689-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) client-ip=139.178.84.19; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=fyWTXwU6; spf=pass (google.com: domain of mptcp+bounces-5689-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5689-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.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 D89EF2E0A25 for ; Fri, 17 Jun 2022 10:06:50 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A61D22F36; Fri, 17 Jun 2022 10:06:46 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 46A1A2F25 for ; Fri, 17 Jun 2022 10:06:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655460404; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9idqIOEQPfFgt+AW6bj48dhUJzMqwGEZ9BnPT1+Jl8I=; b=fyWTXwU6DHdPwsra0mKcvJzn5sBixCBMkdknc9SUFGz3eSco2KXA4y2qBWDbZSH/ddQ/CN emuAX1DduIqEEHuKPf3yWzJiZkaRL0lLR3n+BQhLqfA3lWEb8sDp+GdlFC6vXY/xOBGU/4 1k2ZFZh4HjC0IcMmL//mlB7XZvHKegc= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-114-grHrKqZZONmB79uMCDzElg-1; Fri, 17 Jun 2022 06:06:43 -0400 X-MC-Unique: grHrKqZZONmB79uMCDzElg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id C215385A580 for ; Fri, 17 Jun 2022 10:06:42 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.194]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4C23740C1288 for ; Fri, 17 Jun 2022 10:06:42 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-net v3 5/6] mptcp: consistent map handling on failure Date: Fri, 17 Jun 2022 12:05:19 +0200 Message-Id: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pabeni@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8"; x-default="true" When the MPTCP receive path reach a non fatal fall-back condition, e.g. when the MPC sockets must fall-back to TCP, the existing code is a little self-inconsistent: it reports that new data is available - return true - but sets the MPC flag to the opposite value. As the consequence read operations in some exceptional scenario may block unexpectedly. Address the issue setting the correct MPC read status. Additionally avoid some code duplication in the fatal fall-back scenario. Fixes: 9c81be0dbc89 ("mptcp: add MP_FAIL response support") Signed-off-by: Paolo Abeni Reviewed-by: Mat Martineau --- net/mptcp/subflow.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index b157e275315e..1e182301e58b 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1252,17 +1252,12 @@ static bool subflow_check_data_avail(struct sock *s= sk) subflow->send_mp_fail =3D 1; =20 if (!READ_ONCE(msk->allow_infinite_fallback)) { - ssk->sk_err =3D EBADMSG; - tcp_set_state(ssk, TCP_CLOSE); subflow->reset_transient =3D 0; subflow->reset_reason =3D MPTCP_RST_EMIDDLEBOX; - tcp_send_active_reset(ssk, GFP_ATOMIC); - while ((skb =3D skb_peek(&ssk->sk_receive_queue))) - sk_eat_skb(ssk, skb); - } else { - mptcp_subflow_fail(msk, ssk); + goto reset; } - WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA); + mptcp_subflow_fail(msk, ssk); + WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_DATA_AVAIL); return true; } =20 @@ -1270,10 +1265,14 @@ static bool subflow_check_data_avail(struct sock *s= sk) /* fatal protocol error, close the socket. * subflow_error_report() will introduce the appropriate barriers */ - ssk->sk_err =3D EBADMSG; - tcp_set_state(ssk, TCP_CLOSE); subflow->reset_transient =3D 0; subflow->reset_reason =3D MPTCP_RST_EMPTCP; + +reset: + ssk->sk_err =3D EBADMSG; + tcp_set_state(ssk, TCP_CLOSE); + while ((skb =3D skb_peek(&ssk->sk_receive_queue))) + sk_eat_skb(ssk, skb); tcp_send_active_reset(ssk, GFP_ATOMIC); WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA); return false; --=20 2.35.3 From nobody Thu Sep 18 06:43:01 2025 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ab0:35eb:0:0:0:0:0 with SMTP id w11csp62563uau; Fri, 17 Jun 2022 03:06:52 -0700 (PDT) X-Google-Smtp-Source: AGRyM1tcL8cOw4A0DcnqQVfr6Bwh4pbMYizidIa1pYRXVRYrxaofboVHdi29LKhZV5s4fvGuieS9 X-Received: by 2002:a05:6871:442:b0:f5:cfbe:2615 with SMTP id e2-20020a056871044200b000f5cfbe2615mr5148303oag.80.1655460412265; Fri, 17 Jun 2022 03:06:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655460412; cv=none; d=google.com; s=arc-20160816; b=kAxdcbf8piGVlKcBlw49XIxAv82tH4rXBTp6xZSNZQtSRY1aDlCOOrJDZ0i01ME/Oc 67Dp++4rgQQuk1qmfxZ75yJ59MdNogNh/3nPvN8T08xT8PZH+PWKsAvmnAiG7sYAy4+f OSd+j2NA4oLXqKoPJJCAqP8xNuTXQZgZlxAi7Ke9TRzov6WFA6gErIcGGAubMOmsuunm fCZ2z4a0YApWBsM6ifRlC11z7Y4K2Zk2o6rOUjPgVGFJo9d7B+UHtlMlyJgtVWxF/OB3 d0WMih0QndVOLbY0pjXzECdi6AWrUp2FNC/4x2Xubet6cyBx3Ti18hXFnACfj7eUsHeM +ATg== 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:to:from:dkim-signature; bh=J3qRcbAri1MgfFh4L8o4L3pIfAMElaDX39SvxyaCi4g=; b=XL4ICtt71CcWB//B6Y3JZlEmC75g04Xsloo8Loh0P49MaSpWNyMbyT5K1oYSHnZN6S ctsfnsydquyVEtIKx5+gSnAGakkxigV5CyhYkGoNvpno1+sxxDxaP5iIM5BAUYZbpAfH l7OLlCmWk0TmismtH8blI7VFvfcwqQdhTvfCpq5OnqAr+LaXGU9DT8q6Qx10i7Q29gyO lja0EzWaqt4sasFYBpwIcWLoNlRfAmqctr2LAf6aboJ6fwASuttHBaaXcIOT6xrGgD3e c+q0cZg8Q18U31mDV6h9I9VPbZZKJof/63jaPJnKj8YzvTxUWgD1267UWryLrIYMrDcB nUUA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=N7j51bxJ; spf=pass (google.com: domain of mptcp+bounces-5690-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5690-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [139.178.84.19]) by mx.google.com with ESMTPS id m188-20020aca58c5000000b0032e879825ecsi3473557oib.116.2022.06.17.03.06.52 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Jun 2022 03:06:52 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5690-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) client-ip=139.178.84.19; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=N7j51bxJ; spf=pass (google.com: domain of mptcp+bounces-5690-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5690-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.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 203732E0A1D for ; Fri, 17 Jun 2022 10:06:52 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DF35F2F25; Fri, 17 Jun 2022 10:06:47 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 310C92F2F for ; Fri, 17 Jun 2022 10:06:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655460404; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=J3qRcbAri1MgfFh4L8o4L3pIfAMElaDX39SvxyaCi4g=; b=N7j51bxJs9J4xJXxlGVViknwFaxovZ7vE1Vlf0RBucTPgdJP9NqAPyARU7s2gEjy6HqAqR ISq0x/a0lDRMcuScDFuu/Y8JW/b8l0ugt11526Oq6XB1Ln/dMyGG6FmNobZ6uVuZ1e3Okg X4qrR13fouP5hTfRcJPf/nzynBbwIvc= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-118-HBn6m1MyPnWEJCaKGTgkhw-1; Fri, 17 Jun 2022 06:06:43 -0400 X-MC-Unique: HBn6m1MyPnWEJCaKGTgkhw-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 85C5F3831C4E for ; Fri, 17 Jun 2022 10:06:43 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.194.194]) by smtp.corp.redhat.com (Postfix) with ESMTP id 167EA404E4C3 for ; Fri, 17 Jun 2022 10:06:42 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-net v3 6/6] mptcp: fix race on unaccepted mptcp sockets Date: Fri, 17 Jun 2022 12:05:20 +0200 Message-Id: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pabeni@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8"; x-default="true" When the listener socket owning the relevant request is closed, it frees the unaccepted subflows and that causes later deletion of the paired MPTCP sockets. The mptcp socket's worker can run in the time interval between such delete operations. When that happens, any access to msk->first will cause an UaF access, as the subflow cleanup did not cleared such field in the mptcp socket. Address the issue explictly traversing the listener socket accept queue at close time and performing the needed cleanup on the pending msk. Note that the locking is a bit tricky, as we need to acquire the msk socket lock, while still owning the subflow socket one. Fixes: 86e39e04482b ("mptcp: keep track of local endpoint still available f= or each msk") Signed-off-by: Paolo Abeni Reviewed-by: Mat Martineau --- net/mptcp/protocol.c | 5 +++++ net/mptcp/protocol.h | 2 ++ net/mptcp/subflow.c | 50 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 00ba9c44933a..6d2aa41390e7 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2318,6 +2318,11 @@ static void __mptcp_close_ssk(struct sock *sk, struc= t sock *ssk, kfree_rcu(subflow, rcu); } else { /* otherwise tcp will dispose of the ssk and subflow ctx */ + if (ssk->sk_state =3D=3D TCP_LISTEN) { + tcp_set_state(ssk, TCP_CLOSE); + mptcp_subflow_queue_clean(ssk); + inet_csk_listen_stop(ssk); + } __tcp_close(ssk, 0); =20 /* close acquired an extra ref */ diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index ad9b02b1b3e6..95c9ace1437b 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -306,6 +306,7 @@ struct mptcp_sock { =20 u32 setsockopt_seq; char ca_name[TCP_CA_NAME_MAX]; + struct mptcp_sock *dl_next; }; =20 #define mptcp_data_lock(sk) spin_lock_bh(&(sk)->sk_lock.slock) @@ -610,6 +611,7 @@ void mptcp_close_ssk(struct sock *sk, struct sock *ssk, struct mptcp_subflow_context *subflow); void mptcp_subflow_send_ack(struct sock *ssk); void mptcp_subflow_reset(struct sock *ssk); +void mptcp_subflow_queue_clean(struct sock *ssk); void mptcp_sock_graft(struct sock *sk, struct socket *parent); struct socket *__mptcp_nmpc_socket(const struct mptcp_sock *msk); =20 diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 1e182301e58b..db83db1b3c4c 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1723,6 +1723,56 @@ static void subflow_state_change(struct sock *sk) } } =20 +void mptcp_subflow_queue_clean(struct sock *listener_ssk) +{ + struct request_sock_queue *queue =3D &inet_csk(listener_ssk)->icsk_accept= _queue; + struct mptcp_sock *msk, *next, *head =3D NULL; + struct request_sock *req; + + /* build a list of all unaccepted mptcp sockets */ + spin_lock_bh(&queue->rskq_lock); + for (req =3D queue->rskq_accept_head; req; req =3D req->dl_next) { + struct mptcp_subflow_context *subflow; + struct sock *ssk =3D req->sk; + struct mptcp_sock *msk; + + if (!sk_is_mptcp(ssk)) + continue; + + subflow =3D mptcp_subflow_ctx(ssk); + if (!subflow || !subflow->conn) + continue; + + /* skip if already in list */ + msk =3D mptcp_sk(subflow->conn); + if (msk->dl_next || msk =3D=3D head) + continue; + + msk->dl_next =3D head; + head =3D msk; + } + spin_unlock_bh(&queue->rskq_lock); + if (!head) + return; + + /* can't acquire the msk socket lock under the subflow one, + * or will cause ABBA deadlock + */ + release_sock(listener_ssk); + + for (msk =3D head; msk; msk =3D next) { + struct sock *sk =3D (struct sock *)msk; + bool slow; + + slow =3D lock_sock_fast_nested(sk); + next =3D msk->dl_next; + msk->first =3D NULL; + msk->dl_next =3D NULL; + unlock_sock_fast(sk, slow); + } + lock_sock(listener_ssk); +} + static int subflow_ulp_init(struct sock *sk) { struct inet_connection_sock *icsk =3D inet_csk(sk); --=20 2.35.3