From nobody Sun Feb 8 23:05:28 2026 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:ac4:a898:0:b0:4b1:af33:c52d with SMTP id z24csp151225pid; Fri, 15 Apr 2022 07:49:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxAOJbKyRtlh/kN2p6dGMQLVfp1pBVc8b4J5rhsbQvVVKwovbnuE/NH2ooCpKhSX+nBlFZv X-Received: by 2002:a17:902:f652:b0:156:701b:9a2a with SMTP id m18-20020a170902f65200b00156701b9a2amr52325324plg.14.1650034142499; Fri, 15 Apr 2022 07:49:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650034142; cv=none; d=google.com; s=arc-20160816; b=AJa3Np3ZeiC1S/XBcv+JpXv+gq+gfSQWFq2XdXTUJdgMSrkfaSzhfFk1BpgyU2thjI nFuoW51MKZxAuwvr7ukLH/rY9jJ2KcZQpKIx2edKbGPttbgrm8SqQYQyiYVCrHJCCQQQ TLi7Gsn04RzKSzFoeCJF4JQk91v3Zql0XkdLlkAft9djBiq+jbzc/VbqaXrcgfNgMXuh AcfqTw7Dqf8eqkKYpjQrNddFvD89vrPw5SAdvtGW+PwhwZUjcSAj2aqStozs4WccdZp+ bXMrJo5FbxKx6WEao5g6T9hFJoKR26vHlEwjYAUoV+pN5m92aSPs8A83njrUw5WRroME L+pQ== 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=4q6a8Ba/GBB79FFNp0RO7VsjOTxSqLP9r8njkXrQUSY=; b=BzEfIsnTlyGrG14S7yWIxrBtlvKlMCohXMPQG6Hpj4u5W+ZFytbOXCxfrTvBYHVfd2 CLq9HfCjrE0uWzNHIbD8TAaU3GVB76HRpDJmh7tWaj/V//oXynbRf3KbrlgqSbJZzDjj 1qdXscRbrMx/8I/9xPHVUX0sdqQ8d6LzYsbB9ZFUYHHanOBj8Vc6BztKCBH0ttmRFkrd J/Sj0ScuPxWVDwtEXvLXPOtLVit0UocW+BW4jHZJrnu+sNiMZBtBH+hIHh4qhUtTN/Ag pAyaf6sAXnKqd6o4z/A1dp/LjK+8T9e+5GK/NN1Zj0hWWBEuZMwOCEzQWKETA+3M9XGU JZ7g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=RgUbkklv; spf=pass (google.com: domain of mptcp+bounces-4757-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4757-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [2604:1380:1000:8100::1]) by mx.google.com with ESMTPS id b1-20020a056a00114100b004fa3a8e005dsi1667219pfm.276.2022.04.15.07.49.02 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 15 Apr 2022 07:49:02 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4757-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) client-ip=2604:1380:1000:8100::1; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=RgUbkklv; spf=pass (google.com: domain of mptcp+bounces-4757-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4757-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 sjc.edge.kernel.org (Postfix) with ESMTPS id DEBAF3E108A for ; Fri, 15 Apr 2022 14:49:01 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id F18A833C4; Fri, 15 Apr 2022 14:48:58 +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 813513219 for ; Fri, 15 Apr 2022 14:48:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1650034136; 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=4q6a8Ba/GBB79FFNp0RO7VsjOTxSqLP9r8njkXrQUSY=; b=RgUbkklviqzJTUHOc5gkRK/SJXUYhkr6zYPOda8oHvjMYCZE7UJOri0iWTE/DviY/lsatL dKK1KkJNkRWDw91+j/LTfEqvD89zmxCFosfH64tM4ARn6TjjWROZscS+CECirU/gVsbKN8 FuI5GFkFAhp3oc35JbvdnzebdNK2ol0= 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-578-VNUdmJgWNXCVCN9lKPcG1g-1; Fri, 15 Apr 2022 10:48:55 -0400 X-MC-Unique: VNUdmJgWNXCVCN9lKPcG1g-1 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E98951C05158 for ; Fri, 15 Apr 2022 14:48:54 +0000 (UTC) Received: from gerbillo.redhat.com (unknown [10.39.192.179]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7F3C5440AAA for ; Fri, 15 Apr 2022 14:48:54 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH net-next 4/5] mptcp: never shrink offered window Date: Fri, 15 Apr 2022 16:48:47 +0200 Message-Id: <1f9262fde4d50db2d9d5c46254b823fd3e451465.1650034062.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.85 on 10.11.54.9 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" As per RFC, the offered MPTCP-level window should never shrink. While we currently track the right edge, we don't enforce the above constraint on the wire. Additionally, concurrent xmit on different subflows can end-up in erroneous right edge update. Address the above explicitly updating the announced window and protecting the update with an additional atomic operation (sic) Signed-off-by: Paolo Abeni --- RFC -> v1: - rebased on previous patch --- net/mptcp/options.c | 52 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 2570911735ab..9c76a171af1e 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -1224,20 +1224,58 @@ bool mptcp_incoming_options(struct sock *sk, struct= sk_buff *skb) return true; } =20 -static void mptcp_set_rwin(const struct tcp_sock *tp) +static void mptcp_set_rwin(struct tcp_sock *tp, struct tcphdr *th) { const struct sock *ssk =3D (const struct sock *)tp; - const struct mptcp_subflow_context *subflow; + struct mptcp_subflow_context *subflow; + u64 ack_seq, rcv_wnd_old, rcv_wnd_new; struct mptcp_sock *msk; - u64 ack_seq; + u32 new_win; + u64 win; =20 subflow =3D mptcp_subflow_ctx(ssk); msk =3D mptcp_sk(subflow->conn); =20 - ack_seq =3D READ_ONCE(msk->ack_seq) + tp->rcv_wnd; + ack_seq =3D READ_ONCE(msk->ack_seq); + rcv_wnd_new =3D ack_seq + tp->rcv_wnd; + + rcv_wnd_old =3D READ_ONCE(msk->rcv_wnd_sent); + if (after64(rcv_wnd_new, rcv_wnd_old)) { + u64 rcv_wnd; + + for (;;) { + rcv_wnd =3D cmpxchg64(&msk->rcv_wnd_sent, rcv_wnd_old, rcv_wnd_new); + + if (rcv_wnd =3D=3D rcv_wnd_old) + break; + if (before64(rcv_wnd_new, rcv_wnd)) + goto raise_win; + rcv_wnd_old =3D rcv_wnd; + }; + return; + } + + if (rcv_wnd_new !=3D rcv_wnd_old) { +raise_win: + win =3D rcv_wnd_old - ack_seq; + tp->rcv_wnd =3D min_t(u64, win, U32_MAX); + new_win =3D tp->rcv_wnd; =20 - if (after64(ack_seq, READ_ONCE(msk->rcv_wnd_sent))) - WRITE_ONCE(msk->rcv_wnd_sent, ack_seq); + /* Make sure we do not exceed the maximum possible + * scaled window. + */ + if (unlikely(th->syn)) + new_win =3D min(new_win, 65535U) << tp->rx_opt.rcv_wscale; + if (!tp->rx_opt.rcv_wscale && + sock_net(ssk)->ipv4.sysctl_tcp_workaround_signed_windows) + new_win =3D min(new_win, MAX_TCP_WINDOW); + else + new_win =3D min(new_win, (65535U << tp->rx_opt.rcv_wscale)); + + /* RFC1323 scaling applied */ + new_win >>=3D tp->rx_opt.rcv_wscale; + th->window =3D htons(new_win); + } } =20 u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __wsum = sum) @@ -1554,7 +1592,7 @@ void mptcp_write_options(struct tcphdr *th, __be32 *p= tr, struct tcp_sock *tp, } =20 if (tp) - mptcp_set_rwin(tp); + mptcp_set_rwin(tp, th); } =20 __be32 mptcp_get_reset_option(const struct sk_buff *skb) --=20 2.35.1