From nobody Thu Mar 28 17:19:20 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp221870jap; Wed, 10 Nov 2021 04:32:36 -0800 (PST) X-Google-Smtp-Source: ABdhPJws5JLiMS+7giOsnRrmJm5D1AD695/+XjpCFj9ZpqyCQoBm1TBeAQsOihQmnT/3poSISY9g X-Received: by 2002:aca:1a05:: with SMTP id a5mr140498oia.146.1636547556246; Wed, 10 Nov 2021 04:32:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1636547556; cv=none; d=google.com; s=arc-20160816; b=QUVoitTVjo49mZ0Qyr83mCcNAKhIclQ1dFfh2OO2kEcbY8crBpkHJrPPhuLF3Sdhyk HwnIvN3fT2wJQ7y+qZ7pPRmOetILsQ5oQYk7TIDS9Out24AuvYahMReUSrvHT6rQ4mZU uBaLXcUmcj9q7nXv3f0+kiTc/gM7/HPv1dY7UPHON2QTlX+5kk4XjNJfYqCyr98dXJsB imkbFla9bMy7/ck4aUSvHWXTMxD8dVrCjqcSZJKqYcuQKFViHjE76jaW8Ac5pck4B5z6 JwoDHCM4TwRIsKdvETIHFToHWeeE6YVytBwscQmCwcIlGD8W4neKbtCRN0DzgoT6nV08 uvbg== 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=I4a/qbwOJYGo2JNdZdSHQulKDUGsFZfQ8BnGelwBCrE=; b=JIdKfiW4IQvm+JijihnGJ6b8/TjsQKmZLJfmRN/xIYZD+Pzmk/3RvU+tCXXlRCmAAW Bn1tbDHBYE7t2aClGpP+l0Z10Z0uvJzBQ8hrC0SrFdeCrb8RTmNtEFdgZVGKiubSZIP0 dFwuUgdpYs8/mLV1aNMiWZud6Ep6vkAiMb1yRqmv+meFlCAq75I6wpr5NOGnQgJpXxUS J5n67sr8g4wXtAFqO1OZbCbV+KFm7Ch4kl6NBTOQpzQmyor0nnOSOq9Eu8CLng4w5QDr J22Uh0Pn3DOsofODIRHh/+KxgMpbvGmoFaOzgyDtqUZbggk8lQowzGbQjjs7Hio+CBVi fPLQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=AcOdUPbv; spf=pass (google.com: domain of mptcp+bounces-2401-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2401-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [2604:1380:1:3600::1]) by mx.google.com with ESMTPS id 2si32455874otg.134.2021.11.10.04.32.36 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 Nov 2021 04:32:36 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2401-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) client-ip=2604:1380:1:3600::1; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=AcOdUPbv; spf=pass (google.com: domain of mptcp+bounces-2401-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2401-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 ewr.edge.kernel.org (Postfix) with ESMTPS id AD8841C0F3D for ; Wed, 10 Nov 2021 12:32:35 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A6A272C87; Wed, 10 Nov 2021 12:32:33 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.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 697C529CA for ; Wed, 10 Nov 2021 12:32:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1636547550; 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=I4a/qbwOJYGo2JNdZdSHQulKDUGsFZfQ8BnGelwBCrE=; b=AcOdUPbvXcU49LZ/1yKwT7Y4tP20RN7xvvaV88QpSrUgbo8AD3b1Qx4zdc0qQSF1rycdH0 8h3fLMArGhIxbP4PXOIJw2xIf9aldYxp93dkZpNmmjIpMqxqp86q5eByVl9LwIBDgxnU2l X3eh6cdkS15SICmahIQ0oNXamWmqCqY= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-415-yCxyzpEGNi2dg2V2HazmSA-1; Wed, 10 Nov 2021 07:32:29 -0500 X-MC-Unique: yCxyzpEGNi2dg2V2HazmSA-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 6ACC21006AA3 for ; Wed, 10 Nov 2021 12:32:28 +0000 (UTC) Received: from gerbillo.fritz.box (unknown [10.39.194.200]) by smtp.corp.redhat.com (Postfix) with ESMTP id CBD8560843 for ; Wed, 10 Nov 2021 12:32:27 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH net-next 1/7] mptcp: keep snd_una updated for fallback socket Date: Wed, 10 Nov 2021 13:31:34 +0100 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.79 on 10.5.11.13 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" After shutdown, for fallback MPTCP sockets, we always have write_seq =3D=3D snd_una+1 The above will foul OUTQ ioctl(). Keep snd_una in sync with write_seq even after shutdown. Signed-off-by: Paolo Abeni --- net/mptcp/protocol.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 29b6f57b917e..3fef1b4e7780 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2690,6 +2690,7 @@ static void __mptcp_check_send_data_fin(struct sock *= sk) * state now */ if (__mptcp_check_fallback(msk)) { + WRITE_ONCE(msk->snd_una, msk->write_seq); if ((1 << sk->sk_state) & (TCPF_CLOSING | TCPF_LAST_ACK)) { inet_sk_state_store(sk, TCP_CLOSE); mptcp_close_wake_up(sk); --=20 2.33.1 From nobody Thu Mar 28 17:19:20 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp221840jap; Wed, 10 Nov 2021 04:32:34 -0800 (PST) X-Google-Smtp-Source: ABdhPJyG8IuLb3m0dwVghvKe6s4RkmeevDcUEVlGcn3jkO1Hz/gzzh8cXvyoaEuiSfoRuOytjoT1 X-Received: by 2002:a17:902:bd98:b0:13f:9ae7:54d1 with SMTP id q24-20020a170902bd9800b0013f9ae754d1mr15636792pls.15.1636547554723; Wed, 10 Nov 2021 04:32:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1636547554; cv=none; d=google.com; s=arc-20160816; b=KzN7V9Rc5M+UdGvfDqzVQe53qagK7m0OB0zdmJVV0de2nyFVjc00gWafd5y4XLEymM CPe2ZAqmvP3VGqsWUE1hefQT57y4VqFAMXw/AJsEYKyuGSaakfSvLOLm9iQIKXaoHIs1 YVxFxyapgK7zgphkjYVqdJUx4uYIs4nV9Z1tGqRuJUtYI39K3JS+YA+xIYVZ6RUpBeDk 7mdAj9uoOZ06UQ/2hSDtC/0LxcufvpW1jXZoXeD091ms1f9X13PEU85XWFDx8SaQCgfX mmzrVvyIlHj/wKheStPcN1T8mV0/ofMTA2sv/XxR0ztv7P6dtO6u+beYnLHoJ/vrRrh5 ff6A== 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=whhtw1wtO2TwCb5lOlSeMmrnWekTycE0TPNqmlGOwCo=; b=AFU9Iie9f32Bmk6DasL/2pNJGT6ZvIJKLXrb7M6A1q+VP5HzZoY91EPO3Fg0giZLJE znRkRlX2jfkZowOJOaPjIK8kAm6rbOZaaTiY4n0Zb90haMG65QT7mDfXLpTtzlqIaW+k ZvVHAX1vjlkM0bFlK5xI4sC+pOP3h9amgH5KDBXv4+4Zq3znxZeBz/krLXBJKQjKhcPK B8yJOwkk/GJ0yKCu3b96SMZ454p8stbQWS0/0zuQ8pQoZ4aCt6wqTbHtLuKA5pOcdjyg E78numoBCDKfr0jB9ORGfFo5v3rQOKnCY1LVGw4ilTEoD53a/Ut0gpZC/EuJnFDlJcjx bFXA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=jJ6NygjC; spf=pass (google.com: domain of mptcp+bounces-2400-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2400-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 u33si36650782pfg.30.2021.11.10.04.32.34 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 Nov 2021 04:32:34 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2400-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=jJ6NygjC; spf=pass (google.com: domain of mptcp+bounces-2400-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2400-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 4CBE33E0F76 for ; Wed, 10 Nov 2021 12:32:34 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 37F4F2C93; Wed, 10 Nov 2021 12:32:33 +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 23C7C2C87 for ; Wed, 10 Nov 2021 12:32:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1636547551; 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=whhtw1wtO2TwCb5lOlSeMmrnWekTycE0TPNqmlGOwCo=; b=jJ6NygjC7eyW7SI3gDdY4U0SSXkniW1PwReyBqLkFsUPu+e8AFbtvQC2wrnamg3YIt/ehx S1J2FXgB85OT3/TsXN2GXcDZ8kZ2tWKltWiJL6JxSKbWA5vjFoXDcmF9CRCWaR0SnybYEC SuTsoSFjaPRqt267qilmDA7EMELvkTQ= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-52-o3BVDU5xPKW4VlKyIA_7Ow-1; Wed, 10 Nov 2021 07:32:30 -0500 X-MC-Unique: o3BVDU5xPKW4VlKyIA_7Ow-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 74AB81006AA0 for ; Wed, 10 Nov 2021 12:32:29 +0000 (UTC) Received: from gerbillo.fritz.box (unknown [10.39.194.200]) by smtp.corp.redhat.com (Postfix) with ESMTP id C4C0660843 for ; Wed, 10 Nov 2021 12:32:28 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH net-next 2/7] mptcp: never allow the PM to close a listener subflow Date: Wed, 10 Nov 2021 13:31:35 +0100 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.79 on 10.5.11.13 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" Currently, when deleting an endpoint the netlink PM treverses all the local MPTCP sockets, regardless of their status. If an MPTCP listener socket is bound to the IP matching the delete endpoint, the listener TCP socket will be closed. That is unexpected, the PM should only affect data subflows. Fix the issue explicitly skipping MPTCP socket in TCP_LISTEN status. Signed-off-by: Paolo Abeni --- net/mptcp/pm_netlink.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 7b96be1e9f14..f523051f5aef 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -700,6 +700,9 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp= _sock *msk, =20 msk_owned_by_me(msk); =20 + if (sk->sk_state =3D=3D TCP_LISTEN) + return; + if (!rm_list->nr) return; =20 --=20 2.33.1 From nobody Thu Mar 28 17:19:20 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp221884jap; Wed, 10 Nov 2021 04:32:37 -0800 (PST) X-Google-Smtp-Source: ABdhPJy7yfVuCCrC85wIGCT8eqdrXW19wGf6zJx0LudCw1afzz1s4QtCF6E9Ki6XEUI4wM/cB5Ir X-Received: by 2002:a17:902:780f:b0:13a:3919:e365 with SMTP id p15-20020a170902780f00b0013a3919e365mr15314172pll.63.1636547556890; Wed, 10 Nov 2021 04:32:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1636547556; cv=none; d=google.com; s=arc-20160816; b=D0qprHDKqHDPPjWKp+STCpwLsB588nWRw9sc3mvP8z1axfIU7uPtCs/+gzWDyFQmAq I8WRP3+lrQ6dCIfe4wD60sXV0FdQTdm3xmDckmkB/jsMTrCtce9RF0cVejlo2fMNsMrq 7TJxbk0chzmnGeFq/dDkPCSXAcrqwPIA9x+ONyH5ywAJfe6TwNEjLTnEuRTOEgN+HVsw fJFbjucSXzfWiWL6/zzLZnqW+A28XFsQFWiBdmKav1gTAxpQbmc+5tYf9ybW226JVWst ZbXnBzDdtBu16Y03kDv/O8Rr3QvpoJG/Ts30TvJKoYgC1qLJlpaSI72icTkzQKB55VfM mWCg== 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=2vrRq51JyO0I8j9iK839of93i0SLamlXsDgfHfpob7Q=; b=ywabPscvFft1nBh9NlhiNblI6LNRj/oYcs/IWww4tOCfVVaViT/AITq3d/OiBj2DaT pSUY/dLCEJ6NFpmMLI0clfcP1L/+6r3u0KQnMRsrfzWMAwLbt6u/jkUWwn1dqxHb/Opx 3syBBhMF6N+to5UHvxgvJmo9mROYEUvZKZhsWeAF4wAM3SjwIL0C7lKOQWLyJNg1Wz03 oE5lQzKhRHMN6iQA4fzk4EPQXeCZNoaebHuWZT2frJFfXHEu6eHuzqTgh+YcA4zncGYr +Z+/blAib7kbLyKWOAPP82Ok0gqkbytJqmseFo0D2Ga+BQFP5rTyOEduF3dHM7SiG2/t ogEA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=dAFWTY3P; spf=pass (google.com: domain of mptcp+bounces-2402-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2402-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 a38si21628032pfx.309.2021.11.10.04.32.36 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 Nov 2021 04:32:36 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2402-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=dAFWTY3P; spf=pass (google.com: domain of mptcp+bounces-2402-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2402-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 6386C3E1065 for ; Wed, 10 Nov 2021 12:32:36 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 407FC2C94; Wed, 10 Nov 2021 12:32:34 +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 323592C8B for ; Wed, 10 Nov 2021 12:32:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1636547552; 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=2vrRq51JyO0I8j9iK839of93i0SLamlXsDgfHfpob7Q=; b=dAFWTY3PqrYafKAakjSKq/yEsFzmmDgWLOpUKXJu4AZbjIBdmNWsPTZe0qRf1h3UQY2ib5 +naul5o6l1VDQqXNxQOyl9aefc+TgekqHZZWPZDDqO8rfL1yufwEonseTQh/kBarOOxl9f dr3jaPiknPklIWXDZdAFYk2lw+zB4BA= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-226-A53M_wnxNluRHU55ORI9sw-1; Wed, 10 Nov 2021 07:32:31 -0500 X-MC-Unique: A53M_wnxNluRHU55ORI9sw-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 50D7A1006AA1 for ; Wed, 10 Nov 2021 12:32:30 +0000 (UTC) Received: from gerbillo.fritz.box (unknown [10.39.194.200]) by smtp.corp.redhat.com (Postfix) with ESMTP id B790060854 for ; Wed, 10 Nov 2021 12:32:29 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH net-next 3/7] mptcp: implement fastclose xmit path Date: Wed, 10 Nov 2021 13:31:36 +0100 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.79 on 10.5.11.13 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" Allow the MPTCP xmit path to add MP_FASTCLOSE suboption on RST egress packets. Additionally reorder related options writing to reduce the number of conditionals required in the fast path. Signed-off-by: Paolo Abeni --- net/mptcp/options.c | 57 +++++++++++++++++++++++++++++++------------- net/mptcp/protocol.h | 1 + 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 68a9a1c79200..8a1020e4285c 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -768,6 +768,28 @@ static noinline bool mptcp_established_options_rst(str= uct sock *sk, struct sk_bu return true; } =20 +static bool mptcp_established_options_fastclose(struct sock *sk, + unsigned int *size, + unsigned int remaining, + struct mptcp_out_options *opts) +{ + struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(sk); + struct mptcp_sock *msk =3D mptcp_sk(subflow->conn); + + if (likely(!subflow->send_fastclose)) + return false; + + if (remaining < TCPOLEN_MPTCP_FASTCLOSE) + return false; + + *size =3D TCPOLEN_MPTCP_FASTCLOSE; + opts->suboptions |=3D OPTION_MPTCP_FASTCLOSE; + opts->rcvr_key =3D msk->remote_key; + + pr_debug("FASTCLOSE key=3D%llu", opts->rcvr_key); + return true; +} + static bool mptcp_established_options_mp_fail(struct sock *sk, unsigned int *size, unsigned int remaining, @@ -806,11 +828,9 @@ bool mptcp_established_options(struct sock *sk, struct= sk_buff *skb, return false; =20 if (unlikely(skb && TCP_SKB_CB(skb)->tcp_flags & TCPHDR_RST)) { - if (mptcp_established_options_mp_fail(sk, &opt_size, remaining, opts)) { - *size +=3D opt_size; - remaining -=3D opt_size; - } - if (mptcp_established_options_rst(sk, skb, &opt_size, remaining, opts)) { + if (mptcp_established_options_fastclose(sk, &opt_size, remaining, opts) = || + mptcp_established_options_mp_fail(sk, &opt_size, remaining, opts) || + mptcp_established_options_rst(sk, skb, &opt_size, remaining, opts)) { *size +=3D opt_size; remaining -=3D opt_size; } @@ -1251,17 +1271,8 @@ void mptcp_write_options(__be32 *ptr, const struct t= cp_sock *tp, ptr +=3D 2; } =20 - /* RST is mutually exclusive with everything else */ - if (unlikely(OPTION_MPTCP_RST & opts->suboptions)) { - *ptr++ =3D mptcp_option(MPTCPOPT_RST, - TCPOLEN_MPTCP_RST, - opts->reset_transient, - opts->reset_reason); - return; - } - - /* DSS, MPC, MPJ and ADD_ADDR are mutually exclusive, see - * mptcp_established_options*() + /* DSS, MPC, MPJ, ADD_ADDR, FASTCLOSE and RST are mutually exclusive, + * see mptcp_established_options*() */ if (likely(OPTION_MPTCP_DSS & opts->suboptions)) { struct mptcp_ext *mpext =3D &opts->ext_copy; @@ -1447,6 +1458,20 @@ void mptcp_write_options(__be32 *ptr, const struct t= cp_sock *tp, ptr +=3D 1; } } + } else if (unlikely(OPTION_MPTCP_RST & opts->suboptions)) { + /* RST is mutually exclusive with everything else */ + *ptr++ =3D mptcp_option(MPTCPOPT_RST, + TCPOLEN_MPTCP_RST, + opts->reset_transient, + opts->reset_reason); + return; + } else if (unlikely(OPTION_MPTCP_FASTCLOSE & opts->suboptions)) { + /* FASTCLOSE is mutually exclusive with everything else */ + *ptr++ =3D mptcp_option(MPTCPOPT_MP_FASTCLOSE, + TCPOLEN_MPTCP_FASTCLOSE, + 0, 0); + put_unaligned_be64(opts->rcvr_key, ptr); + return; } =20 if (OPTION_MPTCP_PRIO & opts->suboptions) { diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index e77de7662df0..cee323de1a1c 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -422,6 +422,7 @@ struct mptcp_subflow_context { backup : 1, send_mp_prio : 1, send_mp_fail : 1, + send_fastclose : 1, send_infinite_map : 1, rx_eof : 1, can_ack : 1, /* only after processing the remote a key */ --=20 2.33.1 From nobody Thu Mar 28 17:19:20 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp221921jap; Wed, 10 Nov 2021 04:32:38 -0800 (PST) X-Google-Smtp-Source: ABdhPJxwRacpCRgWYxoU7geTRRW6uCaUgRyUE/t9GaZxT42tH6JkuKfB9I/lK3G0+FxrPtU02FCI X-Received: by 2002:a17:90a:be13:: with SMTP id a19mr16411812pjs.43.1636547558159; Wed, 10 Nov 2021 04:32:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1636547558; cv=none; d=google.com; s=arc-20160816; b=nTZGm6tVSwp4qeEzMi+iWv+STT1IApm14BL/jAdA1Tx5l2YP0eYEt5ouEno8hhOYue kKyv9bO4b8TeKFTCuxi7PFQm5Pv2n2EnCpDIkz+QQoF0zRquNH6JX+qHPaOqPkaJ7BBg StBkyw3+KJoxTthOjYmGiChLGOU5LDA+DFQQTPbP5Q9ey8AI5eKblJtZlFm59mWXQExS cHhypToZl6Hxooxw588sB8UPz1PSI+LcM6BnTNso1ZUmgswu1BVSmnX/C6uIJ2yecZqZ wTqkJpQbU5nR1V2AXs6QwZiaze/yltxPjsK2iW1ArQqVimslFG8vxuHfTFE85h3ts443 Ndig== 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=f0oMTytNnpjGVPn6sIMjvirU1X39jV9Pq17avPHWWMk=; b=Ig1ex+rqQaK/AEZnF2BOzeV+T3CpTH4/PUjD01VBH5N+9BEt6VVsiyGjym8PW0Lb5U wlrRcV6jq5UiwG5p1SM/GzvKu9v6/9DBjZi0Tpn1lwjM26Iw6TsIQnXS3fVVjhpJ7adS d4a4UKs7c5NAbVX7M6xO7v525AKC6nFx+ZCHjS+Jn99IwyhxUvrU2DP3z/fit15i/L6o Q1BC4i2/eWrtE8mRg+opSJk2+egO0BdZzNvQDA/zEpIcoVpLoBaRdMq/I3rIZR5bDDHD sG3YAuECP0Vwe9h0m6f8zbUmCiG8wxHfkfDRuXjpKbG9OFRMSwzmptxRYH7ITELmNHJR Sb2w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=VVqotgRt; spf=pass (google.com: domain of mptcp+bounces-2403-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2403-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 p2si43746640pfo.45.2021.11.10.04.32.38 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 Nov 2021 04:32:38 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2403-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=VVqotgRt; spf=pass (google.com: domain of mptcp+bounces-2403-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2403-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 AD35C3E1065 for ; Wed, 10 Nov 2021 12:32:37 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9EE9B2C93; Wed, 10 Nov 2021 12:32:35 +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 5B7B12C88 for ; Wed, 10 Nov 2021 12:32:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1636547553; 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=f0oMTytNnpjGVPn6sIMjvirU1X39jV9Pq17avPHWWMk=; b=VVqotgRtyaHjs6u61gCx9vask8Pt4/v9oTOYxSkv8aL0bgITx9f1ehaqRhbi1zkAg1wxzh 9q8o587ZAXtk9SrpjXJZIH5hVR7LenzKxVGYcMgJRlWRd6gAb4v3ThE3MH+UKb+nMBAGXM AvxTagBHmQs6Y16VYjOedARNQo2Ng6c= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-191-UAZqqBZ-NGer-80e8v68wA-1; Wed, 10 Nov 2021 07:32:32 -0500 X-MC-Unique: UAZqqBZ-NGer-80e8v68wA-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 422451006AA0 for ; Wed, 10 Nov 2021 12:32:31 +0000 (UTC) Received: from gerbillo.fritz.box (unknown [10.39.194.200]) by smtp.corp.redhat.com (Postfix) with ESMTP id A571160854 for ; Wed, 10 Nov 2021 12:32:30 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH net-next 4/7] mptcp: full disconnect implementation Date: Wed, 10 Nov 2021 13:31:37 +0100 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.79 on 10.5.11.13 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" The current mptcp_disconnect() implementation lacks several steps, we additionally need to reset the msk socket state and flush the subflow list. Factor out the needed helper to avoid code duplication. Additionally ensure that the initial subflow is disposed only after mptcp_close(), just reset it at disconnect time. Signed-off-by: Paolo Abeni --- v1 -> v2: - fix compile warning (CI) - reset first subflow socket state on disconnect - use fast-close on disconnect --- net/mptcp/pm.c | 10 +++-- net/mptcp/protocol.c | 101 ++++++++++++++++++++++++++++++++----------- net/mptcp/protocol.h | 14 ++++++ net/mptcp/token.c | 1 + 4 files changed, 98 insertions(+), 28 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 86b38a830b4c..761995a34124 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -362,7 +362,7 @@ void mptcp_pm_subflow_chk_stale(const struct mptcp_sock= *msk, struct sock *ssk) } } =20 -void mptcp_pm_data_init(struct mptcp_sock *msk) +void mptcp_pm_data_reset(struct mptcp_sock *msk) { msk->pm.add_addr_signaled =3D 0; msk->pm.add_addr_accepted =3D 0; @@ -377,10 +377,14 @@ void mptcp_pm_data_init(struct mptcp_sock *msk) WRITE_ONCE(msk->pm.remote_deny_join_id0, false); msk->pm.status =3D 0; =20 + mptcp_pm_nl_data_init(msk); +} + +void mptcp_pm_data_init(struct mptcp_sock *msk) +{ spin_lock_init(&msk->pm.lock); INIT_LIST_HEAD(&msk->pm.anno_list); - - mptcp_pm_nl_data_init(msk); + mptcp_pm_data_reset(msk); } =20 void __init mptcp_pm_init(void) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 3fef1b4e7780..84a3df43a38d 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2271,6 +2271,10 @@ bool __mptcp_retransmit_pending_data(struct sock *sk) return true; } =20 +/* flags for __mptcp_close_ssk() */ +#define MPTCP_CF_PUSH BIT(1) +#define MPTCP_CF_FASTCLOSE BIT(2) + /* subflow sockets can be either outgoing (connect) or incoming * (accept). * @@ -2280,22 +2284,37 @@ bool __mptcp_retransmit_pending_data(struct sock *s= k) * parent socket. */ static void __mptcp_close_ssk(struct sock *sk, struct sock *ssk, - struct mptcp_subflow_context *subflow) + struct mptcp_subflow_context *subflow, + unsigned int flags) { struct mptcp_sock *msk =3D mptcp_sk(sk); - bool need_push; + bool need_push, dispose_it; =20 - list_del(&subflow->node); + dispose_it =3D !msk->subflow || ssk !=3D msk->subflow->sk; + if (dispose_it) + list_del(&subflow->node); =20 lock_sock_nested(ssk, SINGLE_DEPTH_NESTING); =20 + if (flags & MPTCP_CF_FASTCLOSE) + subflow->send_fastclose =3D 1; + + need_push =3D (flags & MPTCP_CF_PUSH) && __mptcp_retransmit_pending_data(= sk); + if (!dispose_it) { + tcp_disconnect(ssk, 0); + msk->subflow->state =3D SS_UNCONNECTED; + mptcp_subflow_ctx_reset(subflow); + release_sock(ssk); + + goto out; + } + /* if we are invoked by the msk cleanup code, the subflow is * already orphaned */ if (ssk->sk_socket) sock_orphan(ssk); =20 - need_push =3D __mptcp_retransmit_pending_data(sk); subflow->disposable =3D 1; =20 /* if ssk hit tcp_done(), tcp_cleanup_ulp() cleared the related ops @@ -2315,14 +2334,12 @@ static void __mptcp_close_ssk(struct sock *sk, stru= ct sock *ssk, =20 sock_put(ssk); =20 - if (ssk =3D=3D msk->last_snd) - msk->last_snd =3D NULL; - if (ssk =3D=3D msk->first) msk->first =3D NULL; =20 - if (msk->subflow && ssk =3D=3D msk->subflow->sk) - mptcp_dispose_initial_subflow(msk); +out: + if (ssk =3D=3D msk->last_snd) + msk->last_snd =3D NULL; =20 if (need_push) __mptcp_push_pending(sk, 0); @@ -2333,7 +2350,7 @@ void mptcp_close_ssk(struct sock *sk, struct sock *ss= k, { if (sk->sk_state =3D=3D TCP_ESTABLISHED) mptcp_event(MPTCP_EVENT_SUB_CLOSED, mptcp_sk(sk), ssk, GFP_KERNEL); - __mptcp_close_ssk(sk, ssk, subflow); + __mptcp_close_ssk(sk, ssk, subflow, MPTCP_CF_PUSH); } =20 static unsigned int mptcp_sync_mss(struct sock *sk, u32 pmtu) @@ -2557,9 +2574,20 @@ static int __mptcp_init_sock(struct sock *sk) return 0; } =20 -static int mptcp_init_sock(struct sock *sk) +static void mptcp_ca_reset(struct sock *sk) { struct inet_connection_sock *icsk =3D inet_csk(sk); + + tcp_assign_congestion_control(sk); + strcpy(mptcp_sk(sk)->ca_name, icsk->icsk_ca_ops->name); + + /* no need to keep a reference to the ops, the name will suffice */ + tcp_cleanup_congestion_control(sk); + icsk->icsk_ca_ops =3D NULL; +} + +static int mptcp_init_sock(struct sock *sk) +{ struct net *net =3D sock_net(sk); int ret; =20 @@ -2580,12 +2608,7 @@ static int mptcp_init_sock(struct sock *sk) /* fetch the ca name; do it outside __mptcp_init_sock(), so that clone wi= ll * propagate the correct value */ - tcp_assign_congestion_control(sk); - strcpy(mptcp_sk(sk)->ca_name, icsk->icsk_ca_ops->name); - - /* no need to keep a reference to the ops, the name will suffice */ - tcp_cleanup_congestion_control(sk); - icsk->icsk_ca_ops =3D NULL; + mptcp_ca_reset(sk); =20 sk_sockets_allocated_inc(sk); sk->sk_rcvbuf =3D sock_net(sk)->ipv4.sysctl_tcp_rmem[1]; @@ -2744,9 +2767,13 @@ static void __mptcp_destroy_sock(struct sock *sk) sk_stop_timer(sk, &sk->sk_timer); msk->pm.status =3D 0; =20 + /* clears msk->subflow, allowing the following loop to close + * even the initial subflow + */ + mptcp_dispose_initial_subflow(msk); list_for_each_entry_safe(subflow, tmp, &conn_list, node) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); - __mptcp_close_ssk(sk, ssk, subflow); + __mptcp_close_ssk(sk, ssk, subflow, 0); } =20 sk->sk_prot->destroy(sk); @@ -2757,7 +2784,6 @@ static void __mptcp_destroy_sock(struct sock *sk) xfrm_sk_free_policy(sk); =20 sk_refcnt_debug_release(sk); - mptcp_dispose_initial_subflow(msk); sock_put(sk); } =20 @@ -2793,6 +2819,9 @@ static void mptcp_close(struct sock *sk, long timeout) =20 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); + if (sk->sk_state =3D=3D TCP_CLOSE) { __mptcp_destroy_sock(sk); do_cancel_work =3D true; @@ -2803,9 +2832,6 @@ static void mptcp_close(struct sock *sk, long timeout) if (do_cancel_work) mptcp_cancel_work(sk); =20 - if (mptcp_sk(sk)->token) - mptcp_event(MPTCP_EVENT_CLOSED, mptcp_sk(sk), NULL, GFP_KERNEL); - sock_put(sk); } =20 @@ -2839,13 +2865,36 @@ static int mptcp_disconnect(struct sock *sk, int fl= ags) =20 mptcp_do_flush_join_list(msk); =20 + inet_sk_state_store(sk, TCP_CLOSE); + mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); =20 - lock_sock(ssk); - tcp_disconnect(ssk, flags); - release_sock(ssk); + __mptcp_close_ssk(sk, ssk, subflow, MPTCP_CF_FASTCLOSE); } + + sk_stop_timer(sk, &msk->sk.icsk_retransmit_timer); + sk_stop_timer(sk, &sk->sk_timer); + + if (mptcp_sk(sk)->token) + mptcp_event(MPTCP_EVENT_CLOSED, mptcp_sk(sk), NULL, GFP_KERNEL); + + mptcp_destroy_common(msk); + msk->last_snd =3D NULL; + msk->flags =3D 0; + msk->recovery =3D false; + msk->can_ack =3D false; + msk->fully_established =3D false; + msk->rcv_data_fin =3D false; + msk->snd_data_fin_enable =3D false; + msk->rcv_fastclose =3D false; + msk->use_64bit_ack =3D false; + WRITE_ONCE(msk->csum_enabled, mptcp_is_checksum_enabled(sock_net(sk))); + mptcp_pm_data_reset(msk); + mptcp_ca_reset(sk); + + sk->sk_shutdown =3D 0; + sk_error_report(sk); return 0; } =20 @@ -2985,9 +3034,11 @@ void mptcp_destroy_common(struct mptcp_sock *msk) __mptcp_clear_xmit(sk); =20 /* move to sk_receive_queue, sk_stream_kill_queues will purge it */ + mptcp_data_lock(sk); skb_queue_splice_tail_init(&msk->receive_queue, &sk->sk_receive_queue); __skb_queue_purge(&sk->sk_receive_queue); skb_rbtree_purge(&msk->out_of_order_queue); + mptcp_data_unlock(sk); =20 /* move all the rx fwd alloc into the sk_mem_reclaim_final in * inet_sock_destruct() will dispose it diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index cee323de1a1c..f8ed68c5ef9d 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -394,6 +394,9 @@ DECLARE_PER_CPU(struct mptcp_delegated_action, mptcp_de= legated_actions); /* MPTCP subflow context */ struct mptcp_subflow_context { struct list_head node;/* conn_list of subflows */ + + char reset_start[0]; + unsigned long avg_pacing_rate; /* protected by msk socket lock */ u64 local_key; u64 remote_key; @@ -442,6 +445,9 @@ struct mptcp_subflow_context { u8 stale_count; =20 long delegated_status; + + char reset_end[0]; + struct list_head delegated_node; /* link into delegated_action, protect= ed by local BH */ =20 u32 setsockopt_seq; @@ -473,6 +479,13 @@ mptcp_subflow_tcp_sock(const struct mptcp_subflow_cont= ext *subflow) return subflow->tcp_sock; } =20 +static inline void +mptcp_subflow_ctx_reset(struct mptcp_subflow_context *subflow) +{ + memset(subflow->reset_start, 0, subflow->reset_end - subflow->reset_start= ); + subflow->request_mptcp =3D 1; +} + static inline u64 mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow) { @@ -712,6 +725,7 @@ void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg,= int len, void *hmac); =20 void __init mptcp_pm_init(void); void mptcp_pm_data_init(struct mptcp_sock *msk); +void mptcp_pm_data_reset(struct mptcp_sock *msk); void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock = *ssk); void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct so= ck *ssk); void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ss= k, int server_side); diff --git a/net/mptcp/token.c b/net/mptcp/token.c index e581b341c5be..f52ee7b26aed 100644 --- a/net/mptcp/token.c +++ b/net/mptcp/token.c @@ -384,6 +384,7 @@ void mptcp_token_destroy(struct mptcp_sock *msk) bucket->chain_len--; } spin_unlock_bh(&bucket->lock); + WRITE_ONCE(msk->token, 0); } =20 void __init mptcp_token_init(void) --=20 2.33.1 From nobody Thu Mar 28 17:19:20 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp221953jap; Wed, 10 Nov 2021 04:32:40 -0800 (PST) X-Google-Smtp-Source: ABdhPJwmH5akxU+SIW/O89PKujr9zicE5eZGjxlRG3ObqT60lF634WKo0TyI9p+t8WkbEMVErFPY X-Received: by 2002:a17:90a:c287:: with SMTP id f7mr9258133pjt.114.1636547559843; Wed, 10 Nov 2021 04:32:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1636547559; cv=none; d=google.com; s=arc-20160816; b=tfWla+lJqjpQ0SakZVqlO0etTMTaRDkQBjCoEbStWAzaNE9C3gn2yRUcyA+ADdUM3x Whj31HHGk5YzwflfwqkIh+2ie9r4vr8cjlbpDyhS7bPsROYbX8q3bOrUUK0jGdBLrgKc ABrNCBHmLTqUl8wsq2jYzyVVqIqARbZ60jeHOTAl3E8pK8IagiEJ65ravRmB0RLNQbYf YzsonKc0uSBt9i8q/N7JTg3BuvpeNy34tyHNynDsiiYiaPnVtKgPjs4x3E9qmP6YCjM3 Xgbpdo9V3yIMk83IowvcfdKZwBiYnK0AOkzeWOTTIkzAnB27M6RJB2drxZ+i3LDMuRaR lwfA== 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=W50QpIb8FFp5BdkNVsVte2qDaRpQrfS5Es27d7tAdwA=; b=O3g1U9x1CynBytBURCcU00yRnNFTOjEyOiUwXyWV5Er1UlPOT4U0CdrSB7+3muOkSu SLf9vhYJsb3XD3rteq8UwXC1BTXciheq3noV43KkEosrtLvMOY2umYizfMOFnJ/aPmJd DFtsKM0RGF+CCSAjFkdoUwSsM2a4IqqcxQWnDGFAUv3QM0kBFT6ccO5nZvaxQcEYvbIK JgQUVyfNlnxhMkak3/9P1c4x+DPj1x6zSfU7cbKtKtAeUnD40/emTdonzUuBPmixW7EM K3Cvvk8skIs+Gaz94lMg9YlnQEG+9MZggsVqDQTS9mBi5B2MzTDEKsuMy4oTmx2OSTXm mRtQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=UTDwbyzw; spf=pass (google.com: domain of mptcp+bounces-2404-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2404-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 g2si1203138plp.56.2021.11.10.04.32.39 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 Nov 2021 04:32:39 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2404-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=UTDwbyzw; spf=pass (google.com: domain of mptcp+bounces-2404-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2404-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 D97153E1080 for ; Wed, 10 Nov 2021 12:32:38 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 357612C95; Wed, 10 Nov 2021 12:32:36 +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 38FFC2C8B for ; Wed, 10 Nov 2021 12:32:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1636547554; 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=W50QpIb8FFp5BdkNVsVte2qDaRpQrfS5Es27d7tAdwA=; b=UTDwbyzwmuSylnUs+t9UsJ5IqZhPp9leyfqLf8+moU93/Am73YVpkS8KRlOE5HaN2ORa5n f61DZRlQIq2Hcon3oBwPiAD+xtuKniWoqf5cR14w3PUQ3lNOsyVoyMNYhxAPLBY0Q+X3I0 dh6K19KzuYSgBINzTNR0xWx4eqRksPE= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-101-N3lZeSMLNH2dFRSa5lXBkg-1; Wed, 10 Nov 2021 07:32:33 -0500 X-MC-Unique: N3lZeSMLNH2dFRSa5lXBkg-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 32201102CB29 for ; Wed, 10 Nov 2021 12:32:32 +0000 (UTC) Received: from gerbillo.fritz.box (unknown [10.39.194.200]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9850460854 for ; Wed, 10 Nov 2021 12:32:31 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH net-next 5/7] mptcp: cleanup accept and poll Date: Wed, 10 Nov 2021 13:31:38 +0100 Message-Id: <043a38f611a1388f6c2bda3325fc239d2f01b568.1636545174.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.79 on 10.5.11.13 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" After the previous patch, msk->subflow will never be deleted during the whole msk lifetime. We don't need anymore to acquire references to it in mptcp_stream_accept() and we can use the listener subflow accept queue to simplify mptcp_poll() for listener socket. Overall this removes a lock pair and 4 more atomic operations per accept(). Signed-off-by: Paolo Abeni --- net/mptcp/protocol.c | 25 +++++++------------------ net/mptcp/protocol.h | 1 - net/mptcp/subflow.c | 1 - 3 files changed, 7 insertions(+), 20 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 84a3df43a38d..ee2a5169c13a 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3517,17 +3517,9 @@ static int mptcp_stream_accept(struct socket *sock, = struct socket *newsock, =20 pr_debug("msk=3D%p", msk); =20 - lock_sock(sock->sk); - if (sock->sk->sk_state !=3D TCP_LISTEN) - goto unlock_fail; - ssock =3D __mptcp_nmpc_socket(msk); if (!ssock) - goto unlock_fail; - - clear_bit(MPTCP_DATA_READY, &msk->flags); - sock_hold(ssock->sk); - release_sock(sock->sk); + return -EINVAL; =20 err =3D ssock->ops->accept(sock, newsock, flags, kern); if (err =3D=3D 0 && !mptcp_is_tcpsk(newsock->sk)) { @@ -3567,14 +3559,7 @@ static int mptcp_stream_accept(struct socket *sock, = struct socket *newsock, release_sock(newsk); } =20 - if (inet_csk_listen_poll(ssock->sk)) - set_bit(MPTCP_DATA_READY, &msk->flags); - sock_put(ssock->sk); return err; - -unlock_fail: - release_sock(sock->sk); - return -EINVAL; } =20 static __poll_t mptcp_check_readable(struct mptcp_sock *msk) @@ -3620,8 +3605,12 @@ static __poll_t mptcp_poll(struct file *file, struct= socket *sock, =20 state =3D inet_sk_state_load(sk); pr_debug("msk=3D%p state=3D%d flags=3D%lx", msk, state, msk->flags); - if (state =3D=3D TCP_LISTEN) - return test_bit(MPTCP_DATA_READY, &msk->flags) ? EPOLLIN | EPOLLRDNORM := 0; + if (state =3D=3D TCP_LISTEN) { + if (WARN_ON_ONCE(!msk->subflow || !msk->subflow->sk)) + return 0; + + return inet_csk_listen_poll(msk->subflow->sk); + } =20 if (state !=3D TCP_SYN_SENT && state !=3D TCP_SYN_RECV) { mask |=3D mptcp_check_readable(msk); diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index f8ed68c5ef9d..a6a4bd7de5b4 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -111,7 +111,6 @@ #define MPTCP_RST_TRANSIENT BIT(0) =20 /* MPTCP socket flags */ -#define MPTCP_DATA_READY 0 #define MPTCP_NOSPACE 1 #define MPTCP_WORK_RTX 2 #define MPTCP_WORK_EOF 3 diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 12c49f898e28..2aea7935019e 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1298,7 +1298,6 @@ static void subflow_data_ready(struct sock *sk) if (reqsk_queue_empty(&inet_csk(sk)->icsk_accept_queue)) return; =20 - set_bit(MPTCP_DATA_READY, &msk->flags); parent->sk_data_ready(parent); return; } --=20 2.33.1 From nobody Thu Mar 28 17:19:20 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp221974jap; Wed, 10 Nov 2021 04:32:40 -0800 (PST) X-Google-Smtp-Source: ABdhPJzMJDyl+59gQ/BABPRdxC4/pmT/S7dadjt51wrTN2FYWsxZ6IT+UIgg9teHNoGVeUUZNy5H X-Received: by 2002:a17:90a:3009:: with SMTP id g9mr16633869pjb.205.1636547560555; Wed, 10 Nov 2021 04:32:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1636547560; cv=none; d=google.com; s=arc-20160816; b=U/aBZ142lE2hlnjeqhmjXxbCdjtz9IhQ12wqPwxszKhYMf810fDjQ+UBMnxBzuIRzT 3jxoUeS2EvbtmK76RpR8RODkmMR59YoO8HCCxcmm8JqKWUKfYHPGLtpNOi7O9dnIYVAI 6PoMSK9fFGhS00a52mdMC51ACQJc9vT9/Hq/8MBQtim5B+oXinFKzPKn/2VJ8O+vWunt oQ8od+7c0pDPDkPNLhvEAo0C8mLgP5WdrJ7Nnb1bp+LA7KuKT/oGXccJUyH30EjmLq2b Prun9gUUx14npneC8WkaVxoXhxwwtpGNRlbLR3eEYvbSnZU7n/iUXSVfks0PMLVu4eeR tHag== 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=44DfOAC6I6ruJeti5Ujr/kwA8RUOK+Jd1rYbql/5lMM=; b=DMWJ0y8ylzCnTjXQMmLDl+uz0702CZ0ff1tUWhyRxXqTyIMvkd2gfR7H1Y71mZMIhR S+PUoC+vC0h4E0cQuk/WNmLJKmDq+RtYsf7eDsjk05394xoQAZjTYWAy9ldpcBoRnGGN b7HPOyorfqsib4ASO8OgzNMMYEhFRAgm/g0o308orb9CISyyb1EksCMzWvzokndkR99z ugZEDNfwrOq2VJQDTbESg4hRbJJe1VJHP9i0cInbb7zL3Gnx/Uwia11OSIRPbibmImKG LT1fsLyTb+1QASWBVxXBToqliFmERHcXSLshHzi61UvcTsLncKbaLQw4358WBLKJUFPN MJqw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=gxWr9DW6; spf=pass (google.com: domain of mptcp+bounces-2405-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2405-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. [147.75.69.165]) by mx.google.com with ESMTPS id n2si10317814pjp.152.2021.11.10.04.32.40 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 Nov 2021 04:32:40 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2405-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) client-ip=147.75.69.165; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=gxWr9DW6; spf=pass (google.com: domain of mptcp+bounces-2405-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2405-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 235AA3E0F68 for ; Wed, 10 Nov 2021 12:32:40 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 1B8BA2C87; Wed, 10 Nov 2021 12:32:37 +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 0C29E2C88 for ; Wed, 10 Nov 2021 12:32:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1636547555; 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=44DfOAC6I6ruJeti5Ujr/kwA8RUOK+Jd1rYbql/5lMM=; b=gxWr9DW6iZ22PSLzGFh/wxAZC4gXZQeLFS/HfIebboSxH9f6CduPI41NkAR9rvaGW7YutD T9wUJkZjw4mougciir3AW/DjCXMtBkEehEDNCtCcmAcZqwNbgeEKrBIYq2bS2xFwihoIAM odwh7CUJGo/wvJrrFRGCFn50Pqz2r3c= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-77-8THHIaTgNdyKi-VIw2b7uw-1; Wed, 10 Nov 2021 07:32:34 -0500 X-MC-Unique: 8THHIaTgNdyKi-VIw2b7uw-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 24C21804141 for ; Wed, 10 Nov 2021 12:32:33 +0000 (UTC) Received: from gerbillo.fritz.box (unknown [10.39.194.200]) by smtp.corp.redhat.com (Postfix) with ESMTP id 891D760854 for ; Wed, 10 Nov 2021 12:32:32 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH net-next 6/7] mptcp: implement support for user-space disconnect Date: Wed, 10 Nov 2021 13:31:39 +0100 Message-Id: <043b4da7d9e09d9eb822571d481cce731dc5bf68.1636545174.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.79 on 10.5.11.13 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" Handle explicitly AF_UNSPEC in mptcp_stream_connnect() to allow user-space to disconnect established MPTCP connections Signed-off-by: Paolo Abeni --- net/mptcp/protocol.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index ee2a5169c13a..8319db8ae3ed 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3428,9 +3428,20 @@ static int mptcp_stream_connect(struct socket *sock,= struct sockaddr *uaddr, struct mptcp_sock *msk =3D mptcp_sk(sock->sk); struct mptcp_subflow_context *subflow; struct socket *ssock; - int err; + int err =3D -EINVAL; =20 lock_sock(sock->sk); + if (uaddr) { + if (addr_len < sizeof(uaddr->sa_family)) + goto unlock; + + if (uaddr->sa_family =3D=3D AF_UNSPEC) { + err =3D mptcp_disconnect(sock->sk, flags); + sock->state =3D err ? SS_DISCONNECTING : SS_UNCONNECTED; + goto unlock; + } + } + if (sock->state !=3D SS_UNCONNECTED && msk->subflow) { /* pending connection or invalid state, let existing subflow * cope with that @@ -3440,10 +3451,8 @@ static int mptcp_stream_connect(struct socket *sock,= struct sockaddr *uaddr, } =20 ssock =3D __mptcp_nmpc_socket(msk); - if (!ssock) { - err =3D -EINVAL; + if (!ssock) goto unlock; - } =20 mptcp_token_destroy(msk); inet_sk_state_store(sock->sk, TCP_SYN_SENT); --=20 2.33.1 From nobody Thu Mar 28 17:19:20 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp222011jap; Wed, 10 Nov 2021 04:32:42 -0800 (PST) X-Google-Smtp-Source: ABdhPJzEMxDpy3NTS61zY6JMPhS7CaFz5SDrvtPqvbyfzGReK6al3enKui8o8c4OBmoaHaiRThG5 X-Received: by 2002:a17:90a:8a82:: with SMTP id x2mr15991619pjn.187.1636547561986; Wed, 10 Nov 2021 04:32:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1636547561; cv=none; d=google.com; s=arc-20160816; b=iUvdMEZb22O7MXnKgSPJT9fGDiVOvvWf9usxG0ZFQLwCbRxPx/PYrKy9g3F7IxGy6m gwRClrV42omsmaMcdpltpT0OpL/Rx1dQ26IR9WE71pNM5+s5kTcBIDaS6NfoPZDbNpvk DVkZjBeIHOrd72UKdsrKE0C8BNq6SW7wdeLSITsVdyw8IV6msNYOw3+aRVrKvRooZ4PW 1vqVMmCUsrcYPccZ//LAtpdHmCdSIkOagI2/X/b7BKiCuhJKzwwacKgrUmlSI57FT7EZ RLLFghKGzf31KsqW1DkjKFdPv0T6pBti4b5MlAUDy35GpbpJUvDZbJ+cxeb29U7tAIWw KXhg== 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=ScJYSNpmQwJA3Fv8pM9B1JvJEC83TvWc2ZMuarAv30c=; b=mMI69G3xaps1XanUsocpn3w2z3iwiYLJlAOdwvpdNaASPJnU8gTXTAgFcPWW6aN3hj 0eGvChwqsnPVNf0dSP+wgDyb6Fj4EmJwxH1tpF7c413HW5j4+8/77yFag9Sr59aqGW7t gE3fAhV8GnMyjK6DnR1fwCbNhdaXqvBgzax26Nge0NBzkzmN2xlSjpcRJtsWULbkGkYK mRNotsKh0+CAiUcwzlcqnz6bfdsN1yPmE7mCmXvHuo/ms78/oqbHo2ZTVGHN8x66Mx/H jEVU1jONNVNXFHxWWcimm95nNGabqi8KWBdVacfu7vdbzOHC3j5n9ewbfKH7kdIXlSBN VK0Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=OXCBCKap; spf=pass (google.com: domain of mptcp+bounces-2406-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2406-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 x16si37712668pll.9.2021.11.10.04.32.41 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 Nov 2021 04:32:41 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2406-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=OXCBCKap; spf=pass (google.com: domain of mptcp+bounces-2406-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2406-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 6ABB83E1068 for ; Wed, 10 Nov 2021 12:32:41 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6BB572C8B; Wed, 10 Nov 2021 12:32:39 +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 0836E2C88 for ; Wed, 10 Nov 2021 12:32:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1636547557; 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=ScJYSNpmQwJA3Fv8pM9B1JvJEC83TvWc2ZMuarAv30c=; b=OXCBCKapIpm3jvNSOGs2W1yChO1BgzsjTGBCHNW7uSvvlULO2dEWVE+vXFFAljVHC4Nurf Woj8P2fFfOZsV/bgMkL3LPrKDW2HXe8fsYBlkc/RlzAPYngHalTUt+0X12tbYZCQoU0Hgm SoyjZajxjaatm44XA/QhYnvh2YQiZY8= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-568-emYlOCp1NBGtQiKqLkY9Hw-1; Wed, 10 Nov 2021 07:32:34 -0500 X-MC-Unique: emYlOCp1NBGtQiKqLkY9Hw-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 18E8D804143 for ; Wed, 10 Nov 2021 12:32:34 +0000 (UTC) Received: from gerbillo.fritz.box (unknown [10.39.194.200]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7BF1C60843 for ; Wed, 10 Nov 2021 12:32:33 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH net-next 7/7] mptcp: add disconnect selftests Date: Wed, 10 Nov 2021 13:31:40 +0100 Message-Id: <992a16d382afe5932897687bb6b5f383af6e887e.1636545174.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.79 on 10.5.11.13 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" Performs several disconnect/reconnect on the same socket, ensuring the overall transfer is succesful. Additionally leverages ioctl(SIOCOUTQ) to ensure all the pending data is acked before disconnecting. Signed-off-by: Paolo Abeni --- notes: - this is on top of Florian's patches - yep, I just contradicted myself leveraging again mptcp_connect for self-tests, despite I proposed otherwise. I admit is tempting. The downside is that the program is growing as uncontrolled blob. Suggestion for better solution more then welcome! --- .../selftests/net/mptcp/mptcp_connect.c | 119 +++++++++++++++--- .../selftests/net/mptcp/mptcp_connect.sh | 38 +++++- 2 files changed, 140 insertions(+), 17 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.c b/tools/test= ing/selftests/net/mptcp/mptcp_connect.c index e3e4338d610f..8a545e196f1d 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_connect.c +++ b/tools/testing/selftests/net/mptcp/mptcp_connect.c @@ -16,6 +16,7 @@ #include #include =20 +#include #include #include #include @@ -28,6 +29,7 @@ =20 #include #include +#include =20 extern int optind; =20 @@ -69,6 +71,8 @@ static unsigned int cfg_time; static unsigned int cfg_do_w; static int cfg_wait; static uint32_t cfg_mark; +static char *cfg_input =3D NULL; +static int cfg_repeat =3D 1; =20 struct cfg_cmsg_types { unsigned int cmsg_enabled:1; @@ -307,7 +311,8 @@ static bool sock_test_tcpulp(const char * const remotea= ddr, } =20 static int sock_connect_mptcp(const char * const remoteaddr, - const char * const port, int proto) + const char * const port, int proto, + struct addrinfo **peer) { struct addrinfo hints =3D { .ai_protocol =3D IPPROTO_TCP, @@ -329,8 +334,10 @@ static int sock_connect_mptcp(const char * const remot= eaddr, if (cfg_mark) set_mark(sock, cfg_mark); =20 - if (connect(sock, a->ai_addr, a->ai_addrlen) =3D=3D 0) + if (connect(sock, a->ai_addr, a->ai_addrlen) =3D=3D 0) { + *peer =3D a; break; /* success */ + } =20 perror("connect()"); close(sock); @@ -513,14 +520,17 @@ static ssize_t do_rnd_read(const int fd, char *buf, c= onst size_t len) return ret; } =20 -static void set_nonblock(int fd) +static void set_nonblock(int fd, bool nonblock) { int flags =3D fcntl(fd, F_GETFL); =20 if (flags =3D=3D -1) return; =20 - fcntl(fd, F_SETFL, flags | O_NONBLOCK); + if (nonblock) + fcntl(fd, F_SETFL, flags | O_NONBLOCK); + else + fcntl(fd, F_SETFL, flags & ~O_NONBLOCK); } =20 static int copyfd_io_poll(int infd, int peerfd, int outfd, bool *in_closed= _after_out) @@ -532,7 +542,7 @@ static int copyfd_io_poll(int infd, int peerfd, int out= fd, bool *in_closed_after unsigned int woff =3D 0, wlen =3D 0; char wbuf[8192]; =20 - set_nonblock(peerfd); + set_nonblock(peerfd, true); =20 for (;;) { char rbuf[8192]; @@ -627,7 +637,6 @@ static int copyfd_io_poll(int infd, int peerfd, int out= fd, bool *in_closed_after if (cfg_remove) usleep(cfg_wait); =20 - close(peerfd); return 0; } =20 @@ -769,7 +778,7 @@ static int copyfd_io_sendfile(int infd, int peerfd, int= outfd, return err; } =20 -static int copyfd_io(int infd, int peerfd, int outfd) +static int copyfd_io(int infd, int peerfd, int outfd, bool close_peerfd) { bool in_closed_after_out =3D false; struct timespec start, end; @@ -808,6 +817,9 @@ static int copyfd_io(int infd, int peerfd, int outfd) if (ret) return ret; =20 + if (close_peerfd) + close(peerfd); + if (cfg_time) { unsigned int delta_ms; =20 @@ -919,7 +931,7 @@ static void maybe_close(int fd) { unsigned int r =3D rand(); =20 - if (!(cfg_join || cfg_remove) && (r & 1)) + if (!(cfg_join || cfg_remove || (cfg_repeat > 1)) && (r & 1)) close(fd); } =20 @@ -929,7 +941,9 @@ int main_loop_s(int listensock) struct pollfd polls; socklen_t salen; int remotesock; + int fd =3D 0; =20 +again: polls.fd =3D listensock; polls.events =3D POLLIN; =20 @@ -950,12 +964,25 @@ int main_loop_s(int listensock) check_sockaddr(pf, &ss, salen); check_getpeername(remotesock, &ss, salen); =20 - return copyfd_io(0, remotesock, 1); + if (cfg_input) { + fd =3D open(cfg_input, O_RDONLY); + if (fd < 0) + xerror("can't open %s: %d", cfg_input, errno); + } + + copyfd_io(fd, remotesock, 1, true); + } else { + perror("accept"); + return 1; } =20 - perror("accept"); + if (--cfg_repeat > 0) { + if (cfg_input) + close(fd); + goto again; + } =20 - return 1; + return 0; } =20 static void init_rng(void) @@ -1044,15 +1071,47 @@ static void parse_setsock_options(const char *name) exit(1); } =20 +void xdisconnect(int fd, int addrlen) +{ + struct sockaddr_storage empty; + int msec_sleep =3D 10; + int queued =3D 1; + int i; + + shutdown(fd, SHUT_WR); + + /* while until the pending data is completely flushed, the later + * disconnect will bypass/ingore/drop any pending data. + */ + for (i =3D 0; ; i +=3D msec_sleep) { + if (ioctl(fd, SIOCOUTQ, &queued) < 0) + xerror("can't query out socket queue: %d", errno); + + if (!queued) + break; + + if (i > poll_timeout) + xerror("timeout while wating for spool to complete"); + usleep(msec_sleep * 1000); + } + + memset(&empty, 0, sizeof(empty)); + empty.ss_family =3D AF_UNSPEC; + if (connect(fd, (struct sockaddr *)&empty, addrlen) < 0) + xerror("can't disconnect: %d", errno); +} + int main_loop(void) { - int fd; + int fd, ret, fd_in =3D 0; + struct addrinfo *peer; =20 /* listener is ready. */ - fd =3D sock_connect_mptcp(cfg_host, cfg_port, cfg_sock_proto); + fd =3D sock_connect_mptcp(cfg_host, cfg_port, cfg_sock_proto, &peer); if (fd < 0) return 2; =20 +again: check_getpeername_connect(fd); =20 if (cfg_rcvbuf) @@ -1062,7 +1121,31 @@ int main_loop(void) if (cfg_cmsg_types.cmsg_enabled) apply_cmsg_types(fd, &cfg_cmsg_types); =20 - return copyfd_io(0, fd, 1); + if (cfg_input) { + fd_in =3D open(cfg_input, O_RDONLY); + if (fd < 0) + xerror("can't open %s:%d", cfg_input, errno); + } + + /* close the client socket open only if we are not going to reconnect */ + ret =3D copyfd_io(fd_in, fd, 1, cfg_repeat =3D=3D 1); + if (ret) + return ret; + + if (--cfg_repeat > 0) { + xdisconnect(fd, peer->ai_addrlen); + + /* the socket could be unblocking at this point, we need the + * connect to be blocking + */ + set_nonblock(fd, false); + if (connect(fd, peer->ai_addr, peer->ai_addrlen)) + xerror("can't reconnect: %d", errno); + if (cfg_input) + close(fd_in); + goto again; + } + return 0; } =20 int parse_proto(const char *proto) @@ -1147,7 +1230,7 @@ static void parse_opts(int argc, char **argv) { int c; =20 - while ((c =3D getopt(argc, argv, "6jr:lp:s:hut:T:m:S:R:w:M:P:c:o:")) !=3D= -1) { + while ((c =3D getopt(argc, argv, "6jr:lp:s:hi:I:ut:T:m:S:R:w:M:P:c:o:")) = !=3D -1) { switch (c) { case 'j': cfg_join =3D true; @@ -1161,6 +1244,12 @@ static void parse_opts(int argc, char **argv) if (cfg_do_w <=3D 0) cfg_do_w =3D 50; break; + case 'i': + cfg_input =3D optarg; + break; + case 'I': + cfg_repeat =3D atoi(optarg); + break; case 'l': listen_mode =3D true; break; diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.sh b/tools/tes= ting/selftests/net/mptcp/mptcp_connect.sh index a4226b608c68..6553fa3dceec 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_connect.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_connect.sh @@ -7,6 +7,7 @@ optstring=3D"S:R:d:e:l:r:h4cm:f:tC" ret=3D0 sin=3D"" sout=3D"" +cin_disconnect=3D"" cin=3D"" cout=3D"" ksft_skip=3D4 @@ -24,6 +25,7 @@ options_log=3Dtrue do_tcp=3D0 checksum=3Dfalse filesize=3D0 +connect_per_transfer=3D1 =20 if [ $tc_loss -eq 100 ];then tc_loss=3D1% @@ -127,6 +129,7 @@ TEST_COUNT=3D0 =20 cleanup() { + rm -f "$cin_disconnect" "$cout_disconnect" rm -f "$cin" "$cout" rm -f "$sin" "$sout" rm -f "$capout" @@ -149,6 +152,8 @@ sout=3D$(mktemp) cin=3D$(mktemp) cout=3D$(mktemp) capout=3D$(mktemp) +cin_disconnect=3D"$cin".disconnect +cout_disconnect=3D"$cout".disconnect trap cleanup EXIT =20 for i in "$ns1" "$ns2" "$ns3" "$ns4";do @@ -518,8 +523,8 @@ do_transfer() cookies=3D${cookies##*=3D} =20 if [ ${cl_proto} =3D "MPTCP" ] && [ ${srv_proto} =3D "MPTCP" ]; then - expect_synrx=3D$((stat_synrx_last_l+1)) - expect_ackrx=3D$((stat_ackrx_last_l+1)) + expect_synrx=3D$((stat_synrx_last_l+$connect_per_transfer)) + expect_ackrx=3D$((stat_ackrx_last_l+$connect_per_transfer)) fi =20 if [ ${stat_synrx_now_l} -lt ${expect_synrx} ]; then @@ -756,6 +761,33 @@ run_tests_peekmode() run_tests_lo "$ns1" "$ns1" dead:beef:1::1 1 "-P ${peekmode}" } =20 +run_tests_disconnect() +{ + local peekmode=3D"$1" + local old_cin=3D$cin + local old_sin=3D$sin + + cat $cin $cin $cin > "$cin".disconnect + + # force do_transfer to cope with the multiple tranmissions + sin=3D"$cin.disconnect" + sin_disconnect=3D$old_sin + cin=3D"$cin.disconnect" + cin_disconnect=3D"$old_cin" + connect_per_transfer=3D3 + + echo "INFO: disconnect" + run_tests_lo "$ns1" "$ns1" 10.0.1.1 1 "-I 3 -i $old_cin" + run_tests_lo "$ns1" "$ns1" dead:beef:1::1 1 "-I 3 -i $old_cin" + + # restore previous status + cout=3D$old_cout + cout_disconnect=3D"$cout".disconnect + cin=3D$old_cin + cin_disconnect=3D"$cin".disconnect + connect_per_transfer=3D1 +} + display_time() { time_end=3D$(date +%s) @@ -874,5 +906,7 @@ stop_if_error "Tests with peek mode have failed" run_test_transparent 10.0.3.1 "tproxy ipv4" run_test_transparent dead:beef:3::1 "tproxy ipv6" =20 +run_tests_disconnect + display_time exit $ret --=20 2.33.1